[
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "> 感谢您支持certd，请按如下规范提交issue    \n> 如果有条件，请尽量在[github上提交](https://github.com/certd/certd/issues)\n\n\n## 一、问题描述\n`请在此处简要描述你所遇到的问题，必要时请贴出相关截图辅助理解和定位`\n\n### 复现步骤\n`请描述复现问题的详细步骤`\n`如果非示例页面的问题，最好能提供最小复现示例的代码、或者仓库链接`\n\n\n### 报错截图\n`请贴出报错日志截图`\n\n### 效果截图\n`请贴出效果截图`\n#### 1. 期望效果\n\n#### 2. 实际效果\n\n"
  },
  {
    "path": ".github/workflows/build-image-for-test.yml",
    "content": "name: build-image-for-test\non:\n  push:\n    branches: ['v2-dev']\n    paths:\n      - \"build-dev.trigger\"\n\n#  schedule:\n#    - # 国际时间 19:17 执行，北京时间3:17  ↙↙↙ 改成你想要每天自动执行的时间\n#    - cron: '17 19 * * *'\npermissions:\n  contents: read\n  packages: write\n\njobs:\n  build-certd-image:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout Code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          ref: v2-dev\n\n      - name: get_certd_version\n        id: get_certd_version\n        uses: actions/github-script@v6\n        with:\n          result-encoding: string\n          script: |\n            const fs = require('fs');\n            const path = require('path');\n            const pnpmWorkspace = \"./pnpm-workspace.yaml\";\n            fs.unlinkSync(pnpmWorkspace)\n            const jsonFilePath = \"./packages/ui/certd-server/package.json\";\n            const jsonContent = fs.readFileSync(jsonFilePath, 'utf-8');\n            const pkg = JSON.parse(jsonContent)\n            console.log(\"certd_version:\",pkg.version);\n            return pkg.version\n#      - name: Use Node.js\n#        uses: actions/setup-node@v4\n#        with:\n#          node-version: 18\n#          cache: 'npm'\n#        working-directory: ./packages/ui/certd-client\n      - run: |\n          npm install -g pnpm\n          pnpm install\n          npm run build\n        working-directory: ./packages/ui/certd-client\n\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v3\n\n      - name: Set up Docker Buildx\n        uses: docker/setup-buildx-action@v3\n\n      - name: Login to aliyun container Registry\n        uses: docker/login-action@v3\n        with:\n          registry: registry.cn-shenzhen.aliyuncs.com\n          username: ${{ secrets.aliyun_cs_username }}\n          password: ${{ secrets.aliyun_cs_password }}\n\n      - name: Login to GitHub Packages\n        uses: docker/login-action@v3\n        with:\n          registry: ghcr.io\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Login to Docker Hub\n        uses: docker/login-action@v3\n        with:\n          username: ${{ secrets.dockerhub_username }}\n          password: ${{ secrets.dockerhub_password }}\n\n#      - name: Build default platforms\n#        uses: docker/build-push-action@v6\n#        with:\n#          platforms: linux/amd64,linux/arm64\n#          push: true\n#          context: ./packages/ui/\n#          tags: |\n#            registry.cn-shenzhen.aliyuncs.com/handsfree/certd-dev:latest\n#            greper/certd-dev:latest\n#            ghcr.io/${{ github.repository }}:dev-latest\n\n      - name: Build armv7\n        uses: docker/build-push-action@v6\n        with:\n          platforms: linux/arm/v7\n          push: true\n          context: ./packages/ui/\n          tags: |\n            registry.cn-shenzhen.aliyuncs.com/handsfree/certd:armv7\n            registry.cn-shenzhen.aliyuncs.com/handsfree/certd:${{steps.get_certd_version.outputs.result}}-armv7\n            greper/certd:armv7\n            greper/certd:${{steps.get_certd_version.outputs.result}}-armv7"
  },
  {
    "path": ".github/workflows/build-image.yml",
    "content": "name: build-image\non:\n  push:\n    branches: ['v2-dev']\n    paths:\n      - \"build.trigger\"\n\n#  schedule:\n#    - # 国际时间 19:17 执行，北京时间3:17  ↙↙↙ 改成你想要每天自动执行的时间\n#    - cron: '17 19 * * *'\npermissions:\n  contents: read\n  packages: write\n\njobs:\n  build-certd-image:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout Code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          lfs: true\n\n      - name: get_certd_version\n        id: get_certd_version\n        uses: actions/github-script@v6\n        with:\n          result-encoding: string\n          script: |\n            const fs = require('fs');\n            const path = require('path');\n            const pnpmWorkspace = \"./pnpm-workspace.yaml\";\n            fs.unlinkSync(pnpmWorkspace)\n            const jsonFilePath = \"./packages/ui/certd-server/package.json\";\n            const jsonContent = fs.readFileSync(jsonFilePath, 'utf-8');\n            const pkg = JSON.parse(jsonContent)\n            console.log(\"certd_version:\",pkg.version);\n            return pkg.version\n#      - name: Use Node.js\n#        uses: actions/setup-node@v4\n#        with:\n#          node-version: 18\n#          cache: 'npm'\n#        working-directory: ./packages/ui/certd-client\n      - run: |\n          npm install -g pnpm\n          pnpm install\n          npm run build\n        working-directory: ./packages/ui/certd-client\n\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v3\n\n      - name: Set up Docker Buildx\n        uses: docker/setup-buildx-action@v3\n\n      - name: Login to aliyun container Registry\n        uses: docker/login-action@v3\n        with:\n          registry: registry.cn-shenzhen.aliyuncs.com\n          username: ${{ secrets.aliyun_cs_username }}\n          password: ${{ secrets.aliyun_cs_password }}\n\n      - name: Login to GitHub Packages\n        uses: docker/login-action@v3\n        with:\n          registry: ghcr.io\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n  \n      - name: Login to Docker Hub\n        uses: docker/login-action@v3\n        with:\n          username: ${{ secrets.dockerhub_username }}\n          password: ${{ secrets.dockerhub_password }}\n\n      - name: Build default platforms\n        uses: docker/build-push-action@v6\n        with:\n          platforms: linux/amd64,linux/arm64\n          push: true\n          context: ./packages/ui/\n          tags: |\n            registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest\n            registry.cn-shenzhen.aliyuncs.com/handsfree/certd:${{steps.get_certd_version.outputs.result}}\n            greper/certd:latest\n            greper/certd:${{steps.get_certd_version.outputs.result}}\n            ghcr.io/${{ github.repository }}:latest\n            ghcr.io/${{ github.repository }}:${{steps.get_certd_version.outputs.result}}\n      - name: Build armv7\n        uses: docker/build-push-action@v6\n        with:\n          platforms: linux/arm/v7\n          push: true\n          context: ./packages/ui/\n          tags: |\n            registry.cn-shenzhen.aliyuncs.com/handsfree/certd:armv7\n            registry.cn-shenzhen.aliyuncs.com/handsfree/certd:${{steps.get_certd_version.outputs.result}}-armv7\n            greper/certd:armv7\n            greper/certd:${{steps.get_certd_version.outputs.result}}-armv7\n            ghcr.io/${{ github.repository }}:armv7\n            ghcr.io/${{ github.repository }}:${{steps.get_certd_version.outputs.result}}-armv7\n\n#      - name: Build agent\n#        uses: docker/build-push-action@v6\n#        with:\n#          platforms: linux/amd64,linux/arm64\n#          push: true\n#          context: ./packages/ui/agent/\n#          tags: |\n#            registry.cn-shenzhen.aliyuncs.com/handsfree/certd-agent:latest\n#            registry.cn-shenzhen.aliyuncs.com/handsfree/certd-agent:${{steps.get_certd_version.outputs.result}}\n#            greper/certd-agent:latest\n#            greper/certd-agent:${{steps.get_certd_version.outputs.result}}\n"
  },
  {
    "path": ".github/workflows/deploy-demo.yml",
    "content": "name: deploy-demo\non:\n  push:\n    branches: ['v2-dev']\n    paths:\n      - \"deploy.trigger\"\n  workflow_run:\n    workflows: [ \"build-image\" ]\n    types:\n      - completed\n\n#  schedule:\n#    - # 国际时间 19:17 执行，北京时间3:17  ↙↙↙ 改成你想要每天自动执行的时间\n#    - cron: '17 19 * * *'\npermissions:\n  contents: read\n\njobs:\n  deploy-certd-demo:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout Code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          ref: v2-dev\n      - name: get_certd_version\n        id: get_certd_version\n        uses: actions/github-script@v6\n        with:\n          result-encoding: string\n          script: |\n            const fs = require('fs');\n            const path = require('path');\n            const jsonFilePath = \"./packages/ui/certd-server/package.json\";\n            const jsonContent = fs.readFileSync(jsonFilePath, 'utf-8');\n            const pkg = JSON.parse(jsonContent)\n            console.log(\"certd_version:\",pkg.version);\n            return pkg.version\n      - uses: GuillaumeFalourd/wait-sleep-action@v1\n        with:\n          time: '10' # for 60 seconds\n      - name: deploy-certd-demo\n        uses: tyrrrz/action-http-request@master\n        with:\n          url: http://flow-openapi.aliyun.com/pipeline/webhook/lzCzlGrLCOHQaTMMt0mG\n          method: POST\n          headers: |\n            Content-Type: application/json\n          body: |\n            {\n              \"CERTD_VERSION\": \"${{steps.get_certd_version.outputs.result}}\"\n            }\n          retry-count: 3\n          retry-delay: 5000\n\n      - name: deploy-certd-doc\n        uses: tyrrrz/action-http-request@master\n        with:\n          url: http://flow-openapi.aliyun.com/pipeline/webhook/IiSxLDp9aOhgDUxJPytv\n          method: POST\n          body: |\n            {}\n          headers: |\n            Content-Type: application/json\n          retry-count: 3\n          retry-delay: 5000\n"
  },
  {
    "path": ".github/workflows/sync-to-gitee-dev.yml",
    "content": "name: sync-to-gitee-dev\non:\n  push:\n    branches: ['v2-dev']\n#  schedule:\n#    - # 国际时间 19:17 执行，北京时间3:17  ↙↙↙ 改成你想要每天自动执行的时间\n#    - cron: '17 19 * * *'\npermissions:\n  contents: read\n\njobs:\n  sync:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout work repo            # 1. 检出当前仓库(certd-sync-work)\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          lfs: true\n      - name: Set git user                  # 2. 给git命令设置用户名和邮箱,↙↙↙ 改成你的name和email\n        run: |\n          git config --global user.name \"xiaojunnuo\"\n          git config --global user.email \"xiaojunnuo@qq.com\"\n\n      - name: Set git token                 # 3. 给git命令设置token，用于push到目标仓库\n        uses: de-vri-es/setup-git-credentials@v2\n        with:                              # token 格式为： username:password\n          credentials: https://${{secrets.PUSH_TOKEN_GITEE}}@gitee.com\n\n      - name: push to gitee               # 4. 执行同步\n        run: |\n          git remote add upstream https://gitee.com/certd/certd\n          git push --set-upstream upstream v2-dev\n\n"
  },
  {
    "path": ".github/workflows/sync-to-gitee.yml",
    "content": "name: sync-to-gitee\non:\n  push:\n    branches: ['v2']\n#  schedule:\n#    - # 国际时间 19:17 执行，北京时间3:17  ↙↙↙ 改成你想要每天自动执行的时间\n#    - cron: '17 19 * * *'\npermissions:\n  contents: read\n\njobs:\n  sync:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout work repo            # 1. 检出当前仓库(certd-sync-work)\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          lfs: true\n      - name: Set git user                  # 2. 给git命令设置用户名和邮箱,↙↙↙ 改成你的name和email\n        run: |\n          git config --global user.name \"xiaojunnuo\"\n          git config --global user.email \"xiaojunnuo@qq.com\"\n\n      - name: Set git token                 # 3. 给git命令设置token，用于push到目标仓库\n        uses: de-vri-es/setup-git-credentials@v2\n        with:                              # token 格式为： username:password\n          credentials: https://${{secrets.PUSH_TOKEN_GITEE}}@gitee.com\n\n      - name: push to gitee               # 4. 执行同步\n        run: |\n          git remote add upstream https://gitee.com/certd/certd\n          git push --set-upstream upstream v2\n\n"
  },
  {
    "path": ".gitignore",
    "content": "./packages/core/lego\n# IntelliJ project files\n.vscode/\nnode_modules/\nnpm-debug.log\nyarn-error.log\nyarn.lock\npackage-lock.json\n/.idea/\n*/**/dist\n*/**/pnpm-lock.yaml\n*/**/stats.html\n.idea\n*.iml\nout\ngen\n/test/*.private.*\n\n/*.log\nnohup.out\n\n/packages/ui/*/.idea\n/packages/ui/*/node_modules\n/packages/*/node_modules\n#/pnpm-lock.yaml\n\n\ntsconfig.tsbuildinfo\ntest/**/*.js\n/packages/ui/certd-server/data/db.sqlite\n/packages/ui/certd-server/data/keys.yaml\n/packages/pro/\n\ntest.js"
  },
  {
    "path": ".npmrc",
    "content": "link-workspace-packages=deep\nprefer-workspace-packages=true\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"printWidth\": 160,\n  \"bracketSpacing\": true,\n  \"singleQuote\": true,\n  \"trailingComma\": \"es5\",\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n### Bug Fixes\n\n* 企业微信通知改成text类型，因为markdown类型不支持@用户 ([747d266](https://github.com/certd/certd/commit/747d26674248082e678a3fd5ecc94712641a2716))\n* api接口获取不到证书的bug ([05a33a0](https://github.com/certd/certd/commit/05a33a0ec9999e2802f6c7b23cc1c61a2b9e963d))\n\n### Performance Improvements\n\n* 部署到阿里云oss插件支持选择上传到阿里云cas中的证书 ([2ea2c8c](https://github.com/certd/certd/commit/2ea2c8c05fc40f79595f1bbde67c1413558bf684))\n* 优化子域名托管的说明 ([b15f514](https://github.com/certd/certd/commit/b15f514018b728acb0922ee3f93c1f302eb5d471))\n* 账号即将过期通知 ([e403450](https://github.com/certd/certd/commit/e40345095f31e2fb8e2333a6647466659133fa0c))\n* 子域名托管重复域名不允许添加 ([ffc0c7b](https://github.com/certd/certd/commit/ffc0c7bb7b16d9904fd2d905d1c4e1d4854e92a9))\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n### Bug Fixes\n\n* 修复ssh无法执行命令的bug ([9763cb0](https://github.com/certd/certd/commit/9763cb00e5d95b2fa5d1c2d3d4a8eecac71600e6))\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n### Bug Fixes\n\n* 修复流水线列表页报length错误的bug ([9864792](https://github.com/certd/certd/commit/9864792bbfd149e770d6e1ffa809573694f99dd3))\n* 修复流水线页面状态没有刷新的bug ([93e9498](https://github.com/certd/certd/commit/93e9498b410353f504e11e264db62468895d7290))\n* 修复自定义证书检查时间重启之后不生效的bug ([38e867c](https://github.com/certd/certd/commit/38e867c917bbc68bd228bdd8064f3e7358d6413d))\n\n### Performance Improvements\n\n* 支持上传证书到各种对象存储，oss、cos、七牛、s3、minio等 ([1da8617](https://github.com/certd/certd/commit/1da8617a53a675776635bbc3bcb3c6d7dff83e27))\n* 支持邮箱发送证书 ([95332d5](https://github.com/certd/certd/commit/95332d5db96cd54ddab6ab737332417a09169b39))\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n### Bug Fixes\n\n* 修复某些页面翻译不全显示错误的bug ([0b3158f](https://github.com/certd/certd/commit/0b3158fdd5fe5bb0a98c4e65715dbc3de2c38047))\n* 修复运行流水线后会闪烁一下的bug ([dfc9362](https://github.com/certd/certd/commit/dfc9362084082ee535b898f23b2609c1d946a6fd))\n\n### Performance Improvements\n\n* 部署plesk证书，支持删除未使用的证书 ([902d246](https://github.com/certd/certd/commit/902d246d1a7473ad90f604028c4eb09c8c67d99c))\n* 通知和定时器的删除按钮显示为红色更显眼 ([61ba83c](https://github.com/certd/certd/commit/61ba83c77546c3d505d081e19a3d68c127662bf1))\n* 优化流水线列表页面、详情页面性能，精简返回数据 ([609ac9c](https://github.com/certd/certd/commit/609ac9c9a2dde605eb09834ae59693c1cb238765))\n* 支持自动选择校验方式申请证书 ([3f99432](https://github.com/certd/certd/commit/3f9943270cfb12946e38e6272bc5e8d95ad6ab9e))\n* OpenAPI支持autoApply参数 ([42f4d14](https://github.com/certd/certd/commit/42f4d1477dc791520a874aed56035abcbc8c433b))\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n### Bug Fixes\n\n* 某些插件找不到的bug ([4b3f4a8](https://github.com/certd/certd/commit/4b3f4a868a8b0800c5c59de9d0f47bddc079e7b3))\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n### Bug Fixes\n\n* 修复查看证书对话框翻译错误的bug ([8626b6d](https://github.com/certd/certd/commit/8626b6d9f235c511766f2ae98e0a37f6cebb621c))\n* 修复translation后分组编辑打不开的bug ([46a1b74](https://github.com/certd/certd/commit/46a1b7479923d2feb2dece202a5932b99981b2cd))\n* 执行windows nginx命令时，改为return code判断是否执行成功 ([b37cffd](https://github.com/certd/certd/commit/b37cffd704cd08b8bdd68a6e284706eabe59e78d))\n\n### Performance Improvements\n\n* 优化证书进度条颜色 ([2af91db](https://github.com/certd/certd/commit/2af91dbf2ae36a4ed17c6788bc2a2a79a3bb29f8))\n* 站点证书即将过期通知标题颜色优化为红色 ([80c5331](https://github.com/certd/certd/commit/80c5331a5d4c320323d9b9b800e4ea3b72577b33))\n* 支持部署到阿里云vod ([98da4e1](https://github.com/certd/certd/commit/98da4e1791ed8bb21daf2a9914fda875d14633c9))\n* 支持部署证书到网宿CDN ([c3da026](https://github.com/certd/certd/commit/c3da026b33106f5195959825a68cadbe49efef00))\n* 重置管理员密码同时可以清除管理员的2FA设置 ([1ece091](https://github.com/certd/certd/commit/1ece0915f172d5f8b8adb866434e7efcc5c8c46d))\n* output-selector from参数支持更丰富的过滤规则 ([87853a2](https://github.com/certd/certd/commit/87853a201535f3bfe8505c40f8f5229d82ffcc73))\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n### Bug Fixes\n\n* 修复开放接口添加按钮文本显示问题 ([f93ba99](https://github.com/certd/certd/commit/f93ba9970c12680f38eba2a7abd4b72cf3f5b6a6))\n\n### Performance Improvements\n\n* 优化部署到腾讯TKE插件，支持Opaque类型选择，优化填写说明 ([1445325](https://github.com/certd/certd/commit/144532530a865b634e68539e4888e26f52f73492))\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n### Bug Fixes\n\n* 修复notification编辑按钮无法打开对话框的bug ([0cea26c](https://github.com/certd/certd/commit/0cea26c6287f52adf273b4a525c37bea8555c68c))\n* 优化更新飞牛os证书有效期，修复某些情况下部署证书后飞牛无法访问https的bug ([610c919](https://github.com/certd/certd/commit/610c919c72037becc0ed326f5d5b18c963dfcb3a))\n\n### Performance Improvements\n\n* 证书检查支持自定义dns服务器 ([c53bb7c](https://github.com/certd/certd/commit/c53bb7cf677faa32729709ae0c10359db5194d7a))\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n### Bug Fixes\n\n* 修复通知和触发器无法编辑的bug ([a2e0951](https://github.com/certd/certd/commit/a2e09510426680eb425c0d7ad337f39d3f052054))\n\n### Performance Improvements\n\n* 支持部署到七牛云DCDN ([bde601b](https://github.com/certd/certd/commit/bde601bfffb4f7345d97e1e3b064520816d31555))\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n### Bug Fixes\n\n* 支持自定义证书生成插件 ([481cc02](https://github.com/certd/certd/commit/481cc029fafaf280aa844cd3ca30f4653ec35d55))\n\n### Features\n\n* 支持模版创建流水线 ([2559f0e](https://github.com/certd/certd/commit/2559f0e822db095d1d26a7f1d517622dce22a5c2))\n\n### Performance Improvements\n\n* 阿里云waf cname站点选择支持翻页及域名查询 ([4cf9858](https://github.com/certd/certd/commit/4cf98584dacc5999752732f136246647a2f1f07d))\n* 部署到ssh主机命令支持前置命令 ([991b741](https://github.com/certd/certd/commit/991b741cbe223b342f534157da63b71e81661f8e))\n* 模版导入流水线 ([dcc8c56](https://github.com/certd/certd/commit/dcc8c569693432579709ce63656665a76bcf9a44))\n* 添加用户资料编辑功能 ([7c0f43c](https://github.com/certd/certd/commit/7c0f43c8a3052f73afee3e93c9fcbc43c44ab690))\n* 优化阿里云waf的日志信息 ([821c6d8](https://github.com/certd/certd/commit/821c6d807d4b3cc5092d09a6282b8cbafb9e7c9f))\n* 优化中英文翻译与切换 ([acaa8b1](https://github.com/certd/certd/commit/acaa8b173183b4423584ee070e6e332e0ac0eb2d))\n* 站点IP监控前先同步一下IP ([a080b60](https://github.com/certd/certd/commit/a080b606ab6e289d96b17ef7d2879b4603f889ba))\n* 支持选择运行策略设置 ([60f055f](https://github.com/certd/certd/commit/60f055f293ce237c21cd9050333dad9609eceac1))\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n### Bug Fixes\n\n* 腾讯云授权支持设置是否国际站，部署到EO插件支持国际站 ([5cd3968](https://github.com/certd/certd/commit/5cd3968929acef333cf30d3b20cf21cea6c82c5f))\n* 修复邮箱包含.号校验失败的bug ([65dcae7](https://github.com/certd/certd/commit/65dcae79f8faa7a6cb425e10a0fdb6758b0719f3))\n\n### Performance Improvements\n\n* 首次打开任务日志查看页面，自动滚动到底部 ([43fee42](https://github.com/certd/certd/commit/43fee42198e8697185b427b1fa3eb79409603393))\n* 支持批量修改通知和定时 ([e11b3be](https://github.com/certd/certd/commit/e11b3becfd4abe6547e84d09adc38ebd6e1c4b87))\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n### Performance Improvements\n\n* 支持s3 access做测试 ([f00aeac](https://github.com/certd/certd/commit/f00aeacb8b5c81f0bafa4c1b76723dec2b6b7784))\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n### Bug Fixes\n\n* 修复消息内容存在()<>等括号情况下无法发送tg通知的bug ([c937583](https://github.com/certd/certd/commit/c937583a50d8513d76adead3648f83eee2fcc6f9))\n* 修复重试次数设置无效的bug ([e2099ac](https://github.com/certd/certd/commit/e2099ac9ca344bc70bfa4219002e9138708973ae))\n\n### Performance Improvements\n\n* 授权列表类型颜色优化 ([1e86338](https://github.com/certd/certd/commit/1e863382d3d1a8cc95a1abf51e75bf6eaea3244f))\n* 支持雨云dns解析 ([8354348](https://github.com/certd/certd/commit/83543487e7418683bd79cfe3b9e0d792bdb977f7))\n* 支持雨云dns解析以及雨云证书更新 ([43c7a19](https://github.com/certd/certd/commit/43c7a1984926f5d4647760cc134bb0aede3a7b7a))\n* github 版本检查支持执行脚本 ([bad3504](https://github.com/certd/certd/commit/bad3504d4a15e6989b967b66aa9da8c6981f25bf))\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n### Bug Fixes\n\n* 修复阿里云新加坡clb无法部署证书的bug ([c1fbc8c](https://github.com/certd/certd/commit/c1fbc8cd68ae020ef342e4e92f4d9b4869ca1ead))\n* 修复阿里云新加坡clb无法部署证书的bug ([3e84e11](https://github.com/certd/certd/commit/3e84e116e863b54c6b4d7db160af372dacc5857f))\n* 修复检查github release 插件无法保存最后版本的bug ([a92107c](https://github.com/certd/certd/commit/a92107cc47133883b099d5228b06373e84c8bb50))\n* 修复站点监控定时器多次添加的bug ([9361679](https://github.com/certd/certd/commit/936167972fe83e519bc01a0dd961d9c0635d24ab))\n\n### Performance Improvements\n\n* 阿里云dns操作增加重试机制 ([424fd96](https://github.com/certd/certd/commit/424fd96615c05e949af8c837c261c1400bdffba2))\n* 优化阿里云nlb支持部署扩展证书 ([9cbdfda](https://github.com/certd/certd/commit/9cbdfda829b231733d54c66c5024d46e6fc11af3))\n* 子域名托管帮助链接优化为打开新窗口 ([7c0cdd1](https://github.com/certd/certd/commit/7c0cdd169e2f943e703e433677f2f437d4aa02ee))\n* history增加触发类型显示 ([7f6070c](https://github.com/certd/certd/commit/7f6070c960ed7bf02add5ab36436de6573f2f1fa))\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n### Bug Fixes\n\n* 某些证书提供商的证书确实commonName导致无法转换证书的问题 ([ac87bc5](https://github.com/certd/certd/commit/ac87bc57e957ea4679707bfd38d6840e26319bed))\n* 修复站点监控通知渠道设置无效的bug ([a00453c](https://github.com/certd/certd/commit/a00453c83a58114ce2873dd6e6aaf313f1ce0f87))\n\n### Performance Improvements\n\n* 修改 HTTPS 服务器监听地址 ([e1cf64a](https://github.com/certd/certd/commit/e1cf64ae16d4abfe4299ff16d5088c30cf3c6365))\n* 优化流水线页面，增加下次执行时间、查看证书显示 ([c820315](https://github.com/certd/certd/commit/c8203154094fae3d17198747f49f5f41ddf29a4e))\n* 站点证书监控支持定时设置，重试次数设置 ([d3c2f8e](https://github.com/certd/certd/commit/d3c2f8eb436e670772d14a54acd6b541c5aa3978))\n* 证书申请支持letencrypt profile选项 ([2eb0e54](https://github.com/certd/certd/commit/2eb0e54909d8ad36708e07c12fd598998159bc43))\n* aliyun alb支持部署扩展证书 ([2a19b61](https://github.com/certd/certd/commit/2a19b61b7a78620c06396c2cc37cc77d738b6d12))\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n### Features\n\n* 完善注释 ([6702ca1](https://github.com/certd/certd/commit/6702ca10a17f5d7dbff789b039f7269496f66b97))\n* AWS 中国区 CloudFront 证书部署（IAM 证书） ([8a55bed](https://github.com/certd/certd/commit/8a55beda924b3be2a53b9ba80d9487cefa8bf887))\n* **lego:** support for command options ([b84159f](https://github.com/certd/certd/commit/b84159f2f11531f058837c2e82d66499f3740f20))\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n### Bug Fixes\n\n* 修复用户最大流水线数量校验的问题 ([919f70a](https://github.com/certd/certd/commit/919f70a5fd2842ca69f96f1659bb5a7ba3f73776))\n* 修复中文域名使用cname方式校验无法通过的问题 ([f7d5baa](https://github.com/certd/certd/commit/f7d5baa6d04cb83c572b06e62f885890cfa0143a))\n* 修复cv4pve sdk (proxmox插件连接失败时无法正常结束任务的bug) ([49f26b4](https://github.com/certd/certd/commit/49f26b4049a0549b0270395157e96e8f04a68bc4))\n* 修复flexcdn部署证书的顶级CA名称显示 ([6467edb](https://github.com/certd/certd/commit/6467edb84324d7c80a85212675dbacedc459df83))\n* 修复flexcdn证书commonNames错误的问题 ([ace363f](https://github.com/certd/certd/commit/ace363fa355436e769b27f71cc487d30d6441780))\n\n### Performance Improvements\n\n* 分组选择支持清空选项 ([03e2e99](https://github.com/certd/certd/commit/03e2e9949837b34eb3ea56d14a9e8a5dabc96063))\n* 优化cname检查，当有冲突的cname记录时，给出提示 ([e639a8f](https://github.com/certd/certd/commit/e639a8f9f12640ffcca69f1a6a0324459924afbd))\n* 增加下载日志按钮 ([6ff509d](https://github.com/certd/certd/commit/6ff509d263c0182645b4692c10b5fedb192db964))\n* 站点监控支持批量导入域名和ip ([2d7729d](https://github.com/certd/certd/commit/2d7729dbe98f29088f5f317db2b52cc1ede223a6))\n* 支持设置用户有效期 ([6ac3bc5](https://github.com/certd/certd/commit/6ac3bc564f407dad2cd0b0b0744e887387aa5da3))\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n### Bug Fixes\n\n* **flexcdn:** fix cert upload and skipSslVerify required ([c48da5d](https://github.com/certd/certd/commit/c48da5dea7f0f0cdeae643b106b4a678acc3b14b))\n\n### Performance Improvements\n\n* 阿里云CLB支持部署到扩展域名 ([0e8339c](https://github.com/certd/certd/commit/0e8339c70190890d449099e1d26e5ed06ff135fb))\n* 优化流水线名称过长时的显示 ([6a0cc1b](https://github.com/certd/certd/commit/6a0cc1b1f3ad508f9e4093b3b682b163f12389eb))\n* 支持部署到飞牛OS ([ddfd0fb](https://github.com/certd/certd/commit/ddfd0fb81d6638352920261065f1ab8e27bdd564))\n* 支持日志写入文件 ([37edbf5](https://github.com/certd/certd/commit/37edbf5824d6aaae68ea1ef7259c6f739d418d2c))\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n### Bug Fixes\n\n* 修复Farcdn证书有效期错误的问题 ([1fe4c36](https://github.com/certd/certd/commit/1fe4c367f7128de9ba5e3395ae06bc81e63a7d5a))\n\n### Performance Improvements\n\n* 不止证书自动化，插件解锁无限可能 ([a9b302e](https://github.com/certd/certd/commit/a9b302e38d3328d75df8b2da3d8b914851e55e9c))\n* 邮箱支持保存和选择 ([f7b0b44](https://github.com/certd/certd/commit/f7b0b44ef6044bec36510a6f0b06d8dca5bfce49))\n* 支持github 新版本检查并发布通知 ([356703c](https://github.com/certd/certd/commit/356703c83ea18c6efb8931402e181280d7b7e696))\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n### Bug Fixes\n\n* 更新 1panel API 版本支持v1/v2设置 ([e6195ad](https://github.com/certd/certd/commit/e6195ade3ec54b138825b8d6738f86eb8afdd720))\n* 同步更新namesilo接口，修复无法创建和删除dns记录的问题 ([36b02c2](https://github.com/certd/certd/commit/36b02c2cec145c13d4ef29d49aba5b6b4f697df2))\n* 修复阿里云 esa 证书获取站点列表错误的问题 ([0c2ea5d](https://github.com/certd/certd/commit/0c2ea5da4c836f8a0df132a3f22d399bd9ee1de9))\n* 修复部署到华为cdn，子账号ak查询不到域名的bug ([ebb292a](https://github.com/certd/certd/commit/ebb292a2f7a425c1bc810f59468beb3f1d5bc3f0))\n* 修复证书申请任务无法修改dns提供商类型的bug ([8802274](https://github.com/certd/certd/commit/88022747bebe2054223e0241d68d410771405e68))\n\n### Performance Improvements\n\n* 关闭腾讯云证书通知提醒 ([231a875](https://github.com/certd/certd/commit/231a875bb481420c39bf76ec9ff4e50954ab9fe4))\n* 优化站点选择组件，切换选择时不刷新列表 ([3a14714](https://github.com/certd/certd/commit/3a147141b1a5d67c92a5ce88a5313eaa62859e03))\n* 优化站点ip检查 ([a463711](https://github.com/certd/certd/commit/a463711b03a20120f2a298be15d71ca152d27f21))\n* 站点监控支持监控IP ([9cc4c01](https://github.com/certd/certd/commit/9cc4c017ae646a18284e732769b82636feda01d3))\n* 支持批量重新运行 ([8189982](https://github.com/certd/certd/commit/818998259ddc75e722196ac5c365038818539b9b))\n* farcdn优化 ([a06ef07](https://github.com/certd/certd/commit/a06ef07178ed73c537e21c7d57e5e5144d2c056d))\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n### Performance Improvements\n\n* 优化阿里云DCDN插件，支持多选 ([b091657](https://github.com/certd/certd/commit/b091657b5c537acf2442a2bfc345d0a77f5e2c50))\n* 支持部署到farcdn ([e08cf57](https://github.com/certd/certd/commit/e08cf57b72128998f487ab6469868052fbce0dba))\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n### Bug Fixes\n\n* 修复公共插件配置修改不生效的bug，优化系统设置参数注入时机 ([e1e510c](https://github.com/certd/certd/commit/e1e510ce1e37a5ae82478226b6987a83f22d1ecb))\n* 修复又拍云 CDN 设置证书参数和强制 HTTPS 配置报错的bug ([7984b62](https://github.com/certd/certd/commit/7984b625ba6727132f205db8e25f790bce27b2f7))\n* 修复lego模式下每次都重新申请证书的bug ([f807b8c](https://github.com/certd/certd/commit/f807b8cb465cc329fa034ecbef94e18ef394f870))\n* 优化 RunnableError错误信息展示 ([36bc3ff](https://github.com/certd/certd/commit/36bc3ff22da93ba342c3c1103d7ee2bbcecf44f2))\n* **cert:** 修正证书过期时间计算逻辑 ([a3086e6](https://github.com/certd/certd/commit/a3086e6a5bec8b07f5e1d21a2ca8bd969c75bd5c))\n\n### Performance Improvements\n\n* 二次认证页面中，添加动态验证码输入框的焦点控制，提升用户体验 ([bb22f06](https://github.com/certd/certd/commit/bb22f062ed4ab4b5b71938270fe4cc666af6b8e7))\n* 添加阿里云 ESA证书部署插件 ([1db1ffd](https://github.com/certd/certd/commit/1db1ffde99ac7e4684fa606ebc4c327f829b3a26))\n* 站点证书监控增加通知设置 ([3422a1a](https://github.com/certd/certd/commit/3422a1a59fd0d2c0f17fa9c7e8988ac527ecfdd9))\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n### Performance Improvements\n\n* 1panel增加授权测试按钮 ([566b12f](https://github.com/certd/certd/commit/566b12f5d14ce10e8f5cf1807c58f7bf27f0d199))\n* 优化钉钉通知标题颜色 ([a560999](https://github.com/certd/certd/commit/a560999d13eed18d08dd32ee530166569e3f8746))\n* 优化飞书通知为卡片模式 ([a818a3d](https://github.com/certd/certd/commit/a818a3d293e22fb46979bc77055c05621a6fed81))\n* 支持部署到宝塔aaWAF ([094565c](https://github.com/certd/certd/commit/094565ccd619ef671c6c11ce5fb7fd54a7a21d1c))\n* aaWaf、cdnfly站点选择支持查询 ([8af3463](https://github.com/certd/certd/commit/8af3463668a40b9b99febb02e3b4e0d9d8d719b4))\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n### Bug Fixes\n\n* 修复部署flexcdn问题 ([76b19a4](https://github.com/certd/certd/commit/76b19a4980f8edba5238543b82a7811e1003746c))\n* 修复插件导入的bug ([677fec0](https://github.com/certd/certd/commit/677fec0a0b6fceb4966705e471bbfeeda91610c7))\n* 修复导入在线插件不生效的bug ([fcf8309](https://github.com/certd/certd/commit/fcf8309c238208281ecb4575b2c3cfe50c11d783))\n* 修复自建插件保存丢失部署策略的bug ([863e74d](https://github.com/certd/certd/commit/863e74dd2e3912f950ff5025b5ed0070aeb37035))\n\n### Performance Improvements\n\n* 调整小助手，仅在登录之后显示 ([aebb07c](https://github.com/certd/certd/commit/aebb07c5cc8b1f233b9d203ff017ac60e6971a85))\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n### Performance Improvements\n\n* 宝塔插件、1panel 改成完全免费版 ([a53b6cd](https://github.com/certd/certd/commit/a53b6cd28ff2ce5662ada82379ea44a06b179b81))\n* 添加 FlexCDN 更新证书插件 ([bf040d4](https://github.com/certd/certd/commit/bf040d4c428d29c06fbaca5e29100e0c583b2b0b))\n* 小助手可以关闭 ([3e2101a](https://github.com/certd/certd/commit/3e2101aa5b56548614102e900d59819ce8c7e97c))\n* 支持部署到maoyun cdn ([68f333f](https://github.com/certd/certd/commit/68f333fb87ce85eed27436ecb0f76351c0ccb0d1))\n* 支持AI分析报错 ([aa96859](https://github.com/certd/certd/commit/aa96859798166426e485947a6590464de189de05))\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n### Bug Fixes\n\n* 修复部署到又拍云强制https无效的bug ([2397097](https://github.com/certd/certd/commit/2397097e4ddcb6f593210598e8779ffd44ac3f8f))\n* 修复刷新流水线页面后，日志不自动更新的bug ([0b2e28b](https://github.com/certd/certd/commit/0b2e28b62dd5eb6804c602083e65c87a9d1d72d2))\n\n### Performance Improvements\n\n* 集成智能问答机器人 ([9dd4905](https://github.com/certd/certd/commit/9dd49054d18ec436a5029444ca55a38adc682933))\n* 支持设置网安备案号 ([d18e431](https://github.com/certd/certd/commit/d18e431e2f08e6b37704032c4ea6fbdd8e971442))\n* http方式支持校验443端口 ([d75fcb7](https://github.com/certd/certd/commit/d75fcb7fec421a9a638eaa27fe9378c84b5e0f19))\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n### Bug Fixes\n\n* 根据SOA记录判断子域名托管有缺陷，改回手动配置子域名托管记录的方式 ([1b280a2](https://github.com/certd/certd/commit/1b280a2940f9e2d919b0bf23b89cc185be1fa498))\n* 修复宝塔授权测试按钮显示错误的bug ([048696e](https://github.com/certd/certd/commit/048696ee9386491bb68592fb3a47d1c900bb68bf))\n\n### Performance Improvements\n\n* 支持部署证书到火山dcdn ([5f85219](https://github.com/certd/certd/commit/5f852194953dc1b4e6336770f417507b8f5a33ad))\n* 支持部署证书到unicloud ([a63d687](https://github.com/certd/certd/commit/a63d687f1c573159f0857693f37602b0e1e44072))\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n### Bug Fixes\n\n* 修复二次认证登录进入错误账号的bug ([e3930e0](https://github.com/certd/certd/commit/e3930e07172dd7903cb0f6ff26e0e3e828ba3e77))\n\n### Features\n\n* 从yaml文件注册插件 ([deb3893](https://github.com/certd/certd/commit/deb38938204b29543f36d3266249958faaaa6b66))\n\n### Performance Improvements\n\n* 优化cdnfly插件，支持自动匹配域名部署 ([afd59e9](https://github.com/certd/certd/commit/afd59e9933b2650f41c5d47684c171b93b962065))\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n### Bug Fixes\n\n* 服务器时间获取不准确的bug ([5d10cbf](https://github.com/certd/certd/commit/5d10cbf18daf94a90a7551641a3b13e3c5fec611))\n* 修复复制流水线无效的bug ([3df20a9](https://github.com/certd/certd/commit/3df20a924f32970b052e2588ea20de095f0ea693))\n* 修复http上传方式无法清除记录文件的bug ([72a7b51](https://github.com/certd/certd/commit/72a7b51d479602b2c54c6c3ac8d8a0dcb9664e73))\n* 修复token过期后，疯狂打印token过期信息的bug ([50a5fa1](https://github.com/certd/certd/commit/50a5fa15bb240a125bbc91d2ce1ff3c835888a77))\n\n### Performance Improvements\n\n* 从域名的soa获取主域名，子域名托管无需额外配置 ([a586a92](https://github.com/certd/certd/commit/a586a92d5e32ea846ac37be52a7ad8c328d89966))\n* 七牛oss支持删除过期备份 ([b7113bd](https://github.com/certd/certd/commit/b7113bda2378116d6c116dc583f563cce7cf9f00))\n* 数据库备份支持oss ([308d460](https://github.com/certd/certd/commit/308d4600efe2002f199c33b4594d3071784e58ea))\n* 支持阿里云中文域名申请 ([b3468cf](https://github.com/certd/certd/commit/b3468cf7f28228d7c9cf68de6b5a9bbeb67f2c6d))\n* 支持反向代理增加contextPath路径 ([0088929](https://github.com/certd/certd/commit/0088929622160cc922995de9a563e8061686ff34))\n* 支持中文域名 ([162ebfd](https://github.com/certd/certd/commit/162ebfd4e0c25727efb33952d3bbf7420a02e2c3))\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n### Performance Improvements\n\n* 添加部署证书至火山 Live ([abea80e](https://github.com/certd/certd/commit/abea80e3ab9b1672aebe1c5d5e856693b29931a8))\n* 优化首页插件列表展示 ([9b8f60b](https://github.com/certd/certd/commit/9b8f60b64b5f9a3db7dfa9b3dcbd9201984358d0))\n* 证书申请支持51dns ([8638fc9](https://github.com/certd/certd/commit/8638fc91ff34fccaf12ff9874fd3fa9d2a8c18b7))\n* 支持51dns ([96a0900](https://github.com/certd/certd/commit/96a0900edc95dcfd9acccf9d13592f12f5a09b3d))\n* ssh PTY模式登录设置 ([8385bcc](https://github.com/certd/certd/commit/8385bcc2d7f2411a07748bb5c53f9eaf4d38d7cc))\n* ssh伪终端模式优化，windows下不开启 ([42dfe93](https://github.com/certd/certd/commit/42dfe936b773b7bdd82ca3378363252ffffd7b71))\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n### Bug Fixes\n\n* 上传商用证书，直接粘贴文本报错的问题；修复无法上传ec加密证书的bug ([5750bb7](https://github.com/certd/certd/commit/5750bb706779da274d8e7a87e71416cb64d2df79))\n* 修复下载证书时提示token已过期的问题 ([0e07ae6](https://github.com/certd/certd/commit/0e07ae6ce84dcb9279d3c44060d621566afa593c))\n\n### Performance Improvements\n\n* 更新license时同时绑定url ([78367af](https://github.com/certd/certd/commit/78367af8307f801e778c76d49f0918c21ffe032f))\n* 切换到不同的分组后再打开创建对话框，会自动选择分组 ([893dcd4](https://github.com/certd/certd/commit/893dcd4f2487891199ed3e5a3d47a79a75efc942))\n* 新增部署到火山引擎ALB/CLB、上传到证书中心 ([c9a3e3d](https://github.com/certd/certd/commit/c9a3e3d9d26f964c7af7b56667936f1414fbf42a))\n* 优化/api缓存为0 ([dc05cd4](https://github.com/certd/certd/commit/dc05cd481f186b13375192be965000e6b4b429a5))\n* 优化华为cdn插件引用ccm证书 ([b565b4b](https://github.com/certd/certd/commit/b565b4b3b919b71b98ea2517670bc1ef00e00dc9))\n* 优化证书流水线创建，支持选择分组 ([d613aa8](https://github.com/certd/certd/commit/d613aa8f3e85d8dc475ef1b62d49394ce7fd7d24))\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n### Performance Improvements\n\n* 登录支持双重认证 ([48aef25](https://github.com/certd/certd/commit/48aef25b3f6499d674ca4e4ef16f4c62399fb735))\n* 多重认证登录 ([0f82cf4](https://github.com/certd/certd/commit/0f82cf409bc60706ab07e4ca4f272b9a1ca7eecb))\n* 优化部署到华为云CDN，支持先上传到ccm，再使用证书id部署，修复offline状态下导致部署报错的bug ([79df39a](https://github.com/certd/certd/commit/79df39acabab10ae7e1864dadcdc186bb007a3c5))\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n### Bug Fixes\n\n* 补充类型断言 ([2143dff](https://github.com/certd/certd/commit/2143dff2ae96e6a78bef9f0498e36f8cd9e6941f))\n* 修复腾讯云部署到任意资源插件，无法使用之前已上传的腾讯云证书问题 ([32c714d](https://github.com/certd/certd/commit/32c714d1b6e68c71a74a7452115040c87ac4bfdc))\n\n### Performance Improvements\n\n* 插件支持导入导出 ([cf8abb4](https://github.com/certd/certd/commit/cf8abb45282070c8ba91469f93fd379fabf1f74a))\n* 支持上传证书到华为云CCM ([cfd3b66](https://github.com/certd/certd/commit/cfd3b66be9ebf53a26693057e70ed60c3f116be9))\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n### Bug Fixes\n\n* 修复登录错误次数过多阻止再次登录逻辑 ([bf4d191](https://github.com/certd/certd/commit/bf4d191c8bd2f9209eb6768f662b9c77de99e998))\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n### Bug Fixes\n\n* 修复某些情况下无法输出日志的bug ([70101bf](https://github.com/certd/certd/commit/70101bfa7ade65678d9202c804bbae2cb808b594))\n\n### Performance Improvements\n\n* 修复内置插件分页查询逻辑 ([a2710dd](https://github.com/certd/certd/commit/a2710ddc2525e4e637fd157f0180e6d3b801c8be))\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n### Bug Fixes\n\n* 修复阿里云cdn证书部署失败问题，增加certname参数传入 ([965dc2c](https://github.com/certd/certd/commit/965dc2cb476f690af716f291c6b20ba98be0c8f0))\n* 修复ssh插件报length空指针的bug ([9c4cbe1](https://github.com/certd/certd/commit/9c4cbe17a22b548611cf1fbefecc83a421788e42))\n\n### Performance Improvements\n\n* 镜像支持armv7 ([f78cbed](https://github.com/certd/certd/commit/f78cbed4d817859721fdafe7d348864848d0dfbf))\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n### Bug Fixes\n\n* 升级mysql驱动，支持mysql8最新版本的认证 ([2f5ed3a](https://github.com/certd/certd/commit/2f5ed3aead97641f2c80d692a50226839016df0b))\n* 修复eab授权，没有email绑定的bug ([2f1683b](https://github.com/certd/certd/commit/2f1683b26acebbfb7d6e2d751435be04a4e7cab4))\n\n### Features\n\n* 支持在线自定义插件，无需源码开发 ([d0d9d68](https://github.com/certd/certd/commit/d0d9d68fe6740f6ff49fe40b7c9917c5a2e4b442))\n* **lego:** support set key type ([f3bf4fa](https://github.com/certd/certd/commit/f3bf4faee0be5bdbfdbcf70a502849ed4c8ed4c4))\n* release image to ghcr ([9b536af](https://github.com/certd/certd/commit/9b536af9e656dc89e2a87078c129cad6f591e467))\n\n### Performance Improvements\n\n* 修复tab页缓存问题 ([64e5449](https://github.com/certd/certd/commit/64e5449ab3c6b219b0e89eddad14bfb6b71a0650))\n* 隐藏运行策略选项 ([2951df0](https://github.com/certd/certd/commit/2951df0cd94c23e2efee84ff1b843055aac56cae))\n* 增加手动上传证书功能说明 ([5d083a1](https://github.com/certd/certd/commit/5d083a153637caddbc6f44e915d9fb2d1ae87b33))\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n### Bug Fixes\n\n* 创建cname记录移除域名两端的空格 ([903a413](https://github.com/certd/certd/commit/903a4131ab5f42c8286cd2150ed1032d486fda2f))\n* 修复从本地dns获取记录报错的bug ([c39b1bf](https://github.com/certd/certd/commit/c39b1bf823ddc6216bed2049e4c87e6107def08a))\n\n### Features\n\n* 优化证书申请速度，修复某些情况下letsencrypt 校验失败的问题 ([857589b](https://github.com/certd/certd/commit/857589b365c6f709e0ae67914d2f50ce182e6dd6))\n\n### Performance Improvements\n\n* 优化华为dns解析记录创建和删除问题 ([0948c5b](https://github.com/certd/certd/commit/0948c5bc691d2ee6eb47c72a85da1b7453361878))\n* 又拍云支持云存储 ([9339b78](https://github.com/certd/certd/commit/9339b78f801d193472c0af25749e8e7a27ffb7af))\n* 又拍云支持云存储 ([8449f85](https://github.com/certd/certd/commit/8449f8580da90c1f6b5d02d07c3236ebaf6cf161))\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n### Bug Fixes\n\n* 修复ssh支持键盘事件登录 ([8145808](https://github.com/certd/certd/commit/8145808c4370364377b4ffe3ae88ff465b49f20b))\n\n### Performance Improvements\n\n* 支持部署到京东云cdn ([6f17c70](https://github.com/certd/certd/commit/6f17c700b84965baa01b40fe2abaa0a91bcbaffd))\n* 支持京东云dns申请证书 ([04d79f9](https://github.com/certd/certd/commit/04d79f9117670be504960b018fd49ae3bf7c1c11))\n\n## [1.31.10](https://github.com/certd/certd/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n### Performance Improvements\n\n*  tab增加图标显示 ([a03ae5a](https://github.com/certd/certd/commit/a03ae5a216a1df2c1d3da12ae18dcd0f089a92d3))\n* 升级lego版本到4.22.2 ([4e15556](https://github.com/certd/certd/commit/4e15556e5e8100719497edb1729570d5a29668e1))\n* 优化华为dns接口报错信息输出 ([bf30b7a](https://github.com/certd/certd/commit/bf30b7afaef623dd8126570344f1fcc2c06f1215))\n\n## [1.31.9](https://github.com/certd/certd/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n### Bug Fixes\n\n* 修复华为云dns接口请求出错的bug ([caa15b4](https://github.com/certd/certd/commit/caa15b47355363cbb8847f415ff12363cd53eeda))\n* 修复某些情况下站点证书监控报undefined.includes的错误 ([0b6618f](https://github.com/certd/certd/commit/0b6618ff709322a0eeba78953c8c6e9d073d083a))\n* 修复网站证书监控https port设置无效的bug ([cc8da0c](https://github.com/certd/certd/commit/cc8da0cf130f0c469371b59ac5bd04567f4a4414))\n\n### Performance Improvements\n\n* 站点监控保存时异步检查 ([993bc74](https://github.com/certd/certd/commit/993bc7432fce2d954e9897ed85b54f22150bfc7e))\n* dns支持火山引擎 ([99ff879](https://github.com/certd/certd/commit/99ff879d93658c29ea493a4bde7e9e3f85996d64))\n\n## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n### Bug Fixes\n\n* 修复编辑通知勾选默认，导致出现多个默认通知的bug ([6cd7bdd](https://github.com/certd/certd/commit/6cd7bddc37da8b0d7b9860fd9a26ddfe84c869a7))\n* 修复网站监控无法设置端口的bug ([27a8a57](https://github.com/certd/certd/commit/27a8a57cf52b4bf83d628aa3049be1efaa74f29c))\n* 修复lego模式无法创建流水线的bug ([687bb8a](https://github.com/certd/certd/commit/687bb8a2376d0de7b72739a174e4a9560581f866))\n\n### Performance Improvements\n\n* 优化通知格式 ([c3c5006](https://github.com/certd/certd/commit/c3c5006daa39c20624cb58864f2b92b230a38a7a))\n* 优化scp上传 ([e51123a](https://github.com/certd/certd/commit/e51123a95131cc76d655937488caf08956a67020))\n* 优化txt本地校验效率 ([fd507f2](https://github.com/certd/certd/commit/fd507f269253607e68c5c099c99e0de11636f229))\n* 支持又拍云cdn ([fd0536b](https://github.com/certd/certd/commit/fd0536bd4b41f15b6b5d42e0b447f0dcbf73b8a8))\n* 支持又拍云cdn ([57389a7](https://github.com/certd/certd/commit/57389a79a1a61c45d081712562f8b33c9633158e))\n\n## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n### Performance Improvements\n\n* 增加服务器时间警告 ([d66ade4](https://github.com/certd/certd/commit/d66ade4e4783850b6c7625c6f164a5a0fc0aa509))\n* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))\n\n## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n### Bug Fixes\n\n* 修复dns.la无法申请证书的bug ([90b045a](https://github.com/certd/certd/commit/90b045af6d1a4f46986e4b118885c1f050df067c))\n\n### Performance Improvements\n\n* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))\n* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))\n\n## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n### Bug Fixes\n\n* 修复通知选择器无法选择的bug ([f7b88f9](https://github.com/certd/certd/commit/f7b88f9e3b7d9d9122e4fd2003a20c555bd50c7d))\n* 修复证书流水线创建失败的bug ([736fe03](https://github.com/certd/certd/commit/736fe038ebda56648bcc4c12884a700341d2c049))\n\n## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n### Bug Fixes\n\n* 修复站点监控通知通过webhook发送失败的bug ([9be1ecc](https://github.com/certd/certd/commit/9be1ecc8aab3ea23dd0dc2dab3688f4edb90ef2c))\n* 修复dns.la域名申请失败的bug ([1de8eee](https://github.com/certd/certd/commit/1de8eee6ea8307f3c11626af75303d3cc104bb95))\n\n### Performance Improvements\n\n* 宝塔支持doker站点证书部署 ([589a373](https://github.com/certd/certd/commit/589a373142ef7f50d64d3aa767a90b1f4b64da93))\n* 保存调整后的列宽 ([873f2b6](https://github.com/certd/certd/commit/873f2b618b9d7320045baf69d6da83afe48a780f))\n* 创建证书流水线时，支持更多参数展开 ([36aa7f8](https://github.com/certd/certd/commit/36aa7f82b078a053a102331b3c6f132fb9d492f9))\n* 流水线页面可以鼠标按住左右拖动 ([d85a02f](https://github.com/certd/certd/commit/d85a02feeb3183c5abd6c1ea790d5923a32d7271))\n* 流水线增加上传证书快捷方式 ([425bba6](https://github.com/certd/certd/commit/425bba67c539b734e2a85a83a4f9ecc9b2434fb4))\n* 手动上传证书部署流水线 ([fbb66f3](https://github.com/certd/certd/commit/fbb66f3c4389489aa8a43b194d82bc8cf391607b))\n* 优化选择任务时手机版展示效果 ([d01004d](https://github.com/certd/certd/commit/d01004d53071a75ac91ee21cc96bde9369f77ff3))\n* 站点监控，手动测试也发通知 ([729b19c](https://github.com/certd/certd/commit/729b19c8da60d5efb5baef7cf8df0518e7f6b471))\n* 站点证书监控支持模糊查询 ([0069c0e](https://github.com/certd/certd/commit/0069c0e3992946a8dd6410f299d4fc974ef0e76b))\n* 支持飞书通知 ([b82e1dc](https://github.com/certd/certd/commit/b82e1dcd6217b09a7d7e21cd648bb31de320cadf))\n* 支持手动上传证书并部署 ([a9fffa5](https://github.com/certd/certd/commit/a9fffa5180c83da27b35886aa2e858a92a2c5f94))\n\n## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n### Bug Fixes\n\n* 修复阿里云fc获取不到列表的bug ([474b337](https://github.com/certd/certd/commit/474b3372d8ce98e6d45900bf8046bc0b3f220686))\n\n### Performance Improvements\n\n* 1panel支持 apikey方式授权 ([170b2af](https://github.com/certd/certd/commit/170b2afb0e3b125e4ed057f633fe895b5ac3ac22))\n* 套餐支持3天7天等选项 ([0d71a8e](https://github.com/certd/certd/commit/0d71a8ee501a0e5bb69decf07e8729026e9d85bf))\n* 证书仓库增加有效期显示 ([be87124](https://github.com/certd/certd/commit/be87124ada7a093f281ca29a45c86b4ea4644ead))\n* 支持部署到天翼云CDN ([82a72e0](https://github.com/certd/certd/commit/82a72e0b497efa043d342ad0e33c083a2de79a05))\n* 支持dns.la ([ee8af18](https://github.com/certd/certd/commit/ee8af18d0ac0af82544d6dda1e4b4c678b733041))\n* cf授权支持配置http代理 ([27386ea](https://github.com/certd/certd/commit/27386ea04d3c1a5aebe3cfdd7ac48185eaa76629))\n\n## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n### Bug Fixes\n\n* 修复cname记录查找bug ([95fb4e3](https://github.com/certd/certd/commit/95fb4e3e8be6ca13cc43b451f6141d62190ba453))\n\n## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n### Performance Improvements\n\n* 一些手机端适配优化 ([5b8d5dd](https://github.com/certd/certd/commit/5b8d5dd97536456a9d5d1384216eac1093b2dc3d))\n\n# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n### Bug Fixes\n\n* 修复CDN插件我爱云因更换接口导致部署失败的问题 ([5641c19](https://github.com/certd/certd/commit/5641c19502970f67af19709bddf8c781b1a25bdc))\n* 修复CDN插件我爱云因更换接口导致部署失败的问题 ([0110dfd](https://github.com/certd/certd/commit/0110dfdb70b12dfb0a7a067717f3773ed75aae7c))\n* 修复webhook headers value中带等号是解析错误的bug ([1fe3365](https://github.com/certd/certd/commit/1fe3365e10c464c4c60c82f424cf74fe35b883e0))\n* ProxmoxUploadCert 增加强制部署证书 ([441b15e](https://github.com/certd/certd/commit/441b15ed2fe5a143a5bd5508613b3816ddbff596))\n\n### Performance Improvements\n\n* 历史记录查看详情，可以切换到对应的历史记录日志上去 ([082802e](https://github.com/certd/certd/commit/082802e1197156837800f814728ee0f6b300b18c))\n* 流水线同一个阶段任务优化为并行执行 ([efa9c74](https://github.com/certd/certd/commit/efa9c748c5c07fc950af3db742ef9310f1ac9a4b))\n* 升级midwayjs版本 ([057b0b4](https://github.com/certd/certd/commit/057b0b4565e19bb93195633f767b2942e8e40e59))\n* 是否允许爬虫爬取增加ui设置选项 ([779db9d](https://github.com/certd/certd/commit/779db9da705d2dfef36fec21f52bd38af9fc5f2e))\n* 通知支持钉钉群聊机器人 ([fc8bef5](https://github.com/certd/certd/commit/fc8bef5aae522d75d408d8c3aa74543269da5398))\n* 易支付支持固定支付方式，适合没有收银台版本使用 ([81df96b](https://github.com/certd/certd/commit/81df96bf4542ce8d8ef4a428a4460dd554e4719a))\n* 支持易盾RCDN部署 ([065713c](https://github.com/certd/certd/commit/065713cdb6953d16df08585c316c1a7a8eaec437))\n\n## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n### Performance Improvements\n\n* 禁止爬虫爬取本网站 ([5164116](https://github.com/certd/certd/commit/5164116bde60dabac774cdf94f5317ff386e95ca))\n* 上传到阿里云证书名称后缀增加毫秒时间戳 ([9f0ee21](https://github.com/certd/certd/commit/9f0ee219d02907ffe128a5cf10173397d934ccd7))\n* 支持部署到阿里云FC3.0 ([bcaf54d](https://github.com/certd/certd/commit/bcaf54d4cb7bc469486aae6cdb127ae017eb3abb))\n* 支持新版本LeCDN ([44d43f4](https://github.com/certd/certd/commit/44d43f45cb9094619df7494c2a64a51ba77ad116))\n\n## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package root\n\n## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n### Bug Fixes\n\n* 适配最新版1panel密码编码方式 ([78044c0](https://github.com/certd/certd/commit/78044c062e20cdd04f08baef9fb6745bf25eddcf))\n\n## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n### Bug Fixes\n\n* 修复腾讯云CLB多域名同证书部署报错的bug ([c3a5542](https://github.com/certd/certd/commit/c3a55429357e78f4b78c9592d3e5897db2d4d549))\n* 修复新版本1panel密码需要加密，无法登录的问题 ([ada0b71](https://github.com/certd/certd/commit/ada0b7106e97e551783829e4e719f76793a7123d))\n\n## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n### Bug Fixes\n\n* 当前置任务被删除时进行校验 ([c89686a](https://github.com/certd/certd/commit/c89686a2fda251484930f0ae715417b618c21690))\n* 修复cloudflare删除解析记录报错的bug ([00c2da4](https://github.com/certd/certd/commit/00c2da444f84adb89f3f1226d03294d7c6e3e4f1))\n\n### Performance Improvements\n\n* 上传自定义证书 ([75a38d9](https://github.com/certd/certd/commit/75a38d95f305b4271d9106babe7cffc1c89ae8f3))\n\n## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n### Bug Fixes\n\n* 修复部署到阿里云ALB、NLB插件加载混乱的bug ([6ab83b6](https://github.com/certd/certd/commit/6ab83b662a2c5e715b9cb7eb1244de2ebb7f47b0))\n* 修复腾讯clb重复执行会报错的bug ([e95d29f](https://github.com/certd/certd/commit/e95d29f446d06eced315a3087fc9e105a30b20bd))\n* 修复tg消息内容中存在.和*就会发送失败的bug ([ae5dfc3](https://github.com/certd/certd/commit/ae5dfc3bee950267123ae2fbd1c11e7ce36626ea))\n\n### Performance Improvements\n\n* 创建流水线时，默认成功时也发送通知 ([52ae690](https://github.com/certd/certd/commit/52ae6902d203ca56e0312692b50c55cb6ddd3e39))\n* http方式校验，选择sftp时，支持修改文件访问权限比如777 ([15d6eaf](https://github.com/certd/certd/commit/15d6eaf5532ed25acd4f8d58c429353a2f44206c))\n\n# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n### Bug Fixes\n\n* 修复查看任务日志偶发性无法自动滚动底部的bug ([7e482f7](https://github.com/certd/certd/commit/7e482f798c0142bce1866f84676cb40210f9638a))\n* 修复namesilo ttl太短的问题 ([865f26d](https://github.com/certd/certd/commit/865f26d75c0d3dd4dc8b41448f8830068e45957c))\n\n### Features\n\n* 支持open api接口，根据域名获取证书 ([52a4fd3](https://github.com/certd/certd/commit/52a4fd33180e9b3f71b8dc9f7671d7cd8e448c3b))\n\n### Performance Improvements\n\n* 证书仓库 ([91e7f45](https://github.com/certd/certd/commit/91e7f45a1c5ea1e0ec0aa3236b80028f03a6d0aa))\n* 支持部署到阿里云ALB ([653940a](https://github.com/certd/certd/commit/653940a0ca64fc380178c1b0b58ae0af64dfaf07))\n* 支持部署到阿里云NLB、SLB ([c085bac](https://github.com/certd/certd/commit/c085bac5d877c4250a8a79e17eb8673b8e4fc89c))\n* 支持部署到腾讯云直播 ([417d37b](https://github.com/certd/certd/commit/417d37b199b79a42f790f9edab8f178eedf8fbf7))\n* 支持部署证书到proxmox ([d10795e](https://github.com/certd/certd/commit/d10795ecd97eb8cf2ffa46aabfdbfc6812636396))\n\n## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n### Bug Fixes\n\n* 修复复制到本机插件，pfx格式复制时报错的bug ([f57116d](https://github.com/certd/certd/commit/f57116d2bebf33e47ad93e0b39c4efe8e4aea25c))\n* 修复授权管理，点击了查看原文按钮后，无法修改值的bug ([85c99f7](https://github.com/certd/certd/commit/85c99f7f80761ac6efaf3255c03b933442db1686))\n\n## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n### Bug Fixes\n\n* 修复站点监控域名校验无法通过的bug ([1cb4a53](https://github.com/certd/certd/commit/1cb4a539cc523721ffd4b22d40d0e3d2d68cd915))\n\n### Performance Improvements\n\n* 优化腾讯云CLB插件，支持非sni情况，sni情况支持填写多个域名 ([635b042](https://github.com/certd/certd/commit/635b042690637bff85e97e07c7aac4b87a8a124b))\n\n## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n### Bug Fixes\n\n* 修复系统级授权无法查看密钥的bug ([8644348](https://github.com/certd/certd/commit/8644348fc41ae2e1672f946ca37e5d3a674e0218))\n\n### Performance Improvements\n\n* 优化站点证书检查页面，检查增加3次重试 ([e6dd7cd](https://github.com/certd/certd/commit/e6dd7cd54a3e23897031b5df6e0c3cdc0545d35a))\n* 优化acme sdk ([54db744](https://github.com/certd/certd/commit/54db74428259de64d12230c2ab7353ae11197bbc))\n* 支持http校验方式申请证书 ([405591c](https://github.com/certd/certd/commit/405591c5d08fa1a3b228ee3980199e7731cfec4a))\n* http校验方式，支持七牛云oss、阿里云oss、腾讯云cos ([3f74d4d](https://github.com/certd/certd/commit/3f74d4d9e5f5d0e629b44cff1895b3f7a8fbcafc))\n\n## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n### Bug Fixes\n\n* 修复套餐关闭状态下，仍然限制用户流水线数量的bug ([66fb9e5](https://github.com/certd/certd/commit/66fb9e5f49491f9c159363b48af14720a37673b1))\n\n## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n### Bug Fixes\n\n* 免费套餐支持购买 ([f5ec987](https://github.com/certd/certd/commit/f5ec9870fd6af1f0c9099852bbdb4d07813ccce8))\n* 修复某处金额转换丢失精度的bug ([d2d6f12](https://github.com/certd/certd/commit/d2d6f12218cbe7bd55f4ae082b93084be85f0a7b))\n* 修复新版本小红点显示错误问题 ([fe4786e](https://github.com/certd/certd/commit/fe4786e168afe03a5243dd67971476c348339809))\n\n### Performance Improvements\n\n* 用户创建证书流水线没有购买套餐或者超限时提前报错 ([472f06c](https://github.com/certd/certd/commit/472f06c2d190d0ae48e8b53c18bc278437656a1c))\n* 优化插件名称显示 ([26adf7d](https://github.com/certd/certd/commit/26adf7d437e674385f26a8f92fded6521a620671))\n\n# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n### Bug Fixes\n\n* 修复手机模式下，查询框被文字遮盖的bug ([040788c](https://github.com/certd/certd/commit/040788c793642c3bb2a3ede87fe30fcf3be471bd))\n* 修复左侧菜单收起时无法展开子菜单的bug ([0056223](https://github.com/certd/certd/commit/005622307e612717a5408aa1484717ef03003a22))\n\n### Features\n\n* 基础版不再限制流水线数量 ([cb27d4b](https://github.com/certd/certd/commit/cb27d4b4906b2782eaceb0a95bbdc5d0534370d2))\n* 套餐购买支持易支付、支付宝支付 ([faa28f8](https://github.com/certd/certd/commit/faa28f88f954cba4c1dd29125562e5acd2fd99af))\n* 用户套餐，用户支付功能 ([a019956](https://github.com/certd/certd/commit/a019956698acaf2c4beb620b5ad8c18918ead6a1))\n* 站点证书监控 ([9c8c7a7](https://github.com/certd/certd/commit/9c8c7a781223f4217f45510db1e89495600e3cd5))\n* 支持微信支付 ([45d6347](https://github.com/certd/certd/commit/45d6347f5b6199493b11aabdd74177f6dca2cea4))\n\n### Performance Improvements\n\n* 调整创建证书表单字段的顺序 ([d393521](https://github.com/certd/certd/commit/d3935219f2aa50d6662c5b5ebf7ee25ad696ab2b))\n* 同一时间只允许一个套餐生效 ([8ebf95a](https://github.com/certd/certd/commit/8ebf95a222a900d1707716c7b1f3b39f8a6d8f94))\n* 用户名支持修改 ([89c7f07](https://github.com/certd/certd/commit/89c7f070343e86453c84677ebe1669f9b266d871))\n* 优化证书申请跳过的状态显示，成功通知现在在跳过时不会发送 ([67d762b](https://github.com/certd/certd/commit/67d762b6a520f1fa24719a124e5ae975a81f5f82))\n* 站点证书监控通知发送，每天定时检查 ([bb4910f](https://github.com/certd/certd/commit/bb4910f4e57234e42b44505f4620ae7af66025c5))\n* 支持一体证书 ([53c38cf](https://github.com/certd/certd/commit/53c38cf714a6f7486abbf1d71c9f48f56a790100))\n* 支持plesk网站证书部署 ([eda45c1](https://github.com/certd/certd/commit/eda45c1528199648b3970505e87f492d398226cd))\n\n## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n### Bug Fixes\n\n* 修复证书成功通知发送失败的bug ([0f5c690](https://github.com/certd/certd/commit/0f5c69040ba77340c909813220a26bc7ddada3ea))\n\n### Performance Improvements\n\n* 群晖支持6.x ([79f7ec4](https://github.com/certd/certd/commit/79f7ec4672f4fd5744cc45e4a6f104da943f4026))\n\n## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n### Bug Fixes\n\n* 修复没有配置eab时，报order无法读取的问题 ([657a2ae](https://github.com/certd/certd/commit/657a2ae032e6f61ac27fbdd26c7bf169c041219e))\n* 修复授权被删除后，无法清空的bug ([b45977c](https://github.com/certd/certd/commit/b45977c29a29084c11e496bec3415eaaebafdd74))\n* mysql下access.setting字段改成text ([b7f5740](https://github.com/certd/certd/commit/b7f5740c57743914f754f3b4fdd94b59a2e8338c))\n\n### Performance Improvements\n\n* 点击版本红点按钮，跳转到升级帮助页面 ([454fbda](https://github.com/certd/certd/commit/454fbda581bbe22abca5b91e5086ea9d9d58a020))\n* 通知标题优化 ([ff083ce](https://github.com/certd/certd/commit/ff083ce6848a8bee3c8248e4b881086ae1517c28))\n* 支持腾讯虚拟机开关机([@wujingke](https://github.com/wujingke)) ([8039e8b](https://github.com/certd/certd/commit/8039e8baf83c82d03f1a6198cf61c372026b962b))\n* 支持aws cloudfront ([0ae39f1](https://github.com/certd/certd/commit/0ae39f160a7c6b6696b3bf513d68aa28905810ad))\n\n## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n### Bug Fixes\n\n* 修复创建流水线通知设置无效的bug ([498cf34](https://github.com/certd/certd/commit/498cf34999fddfa24ce088e2e678469fa669abb8))\n* 修复流水线分组可以被所有人看见的bug ([a0e838d](https://github.com/certd/certd/commit/a0e838d1eec918e5dc92fe95dc72ac14facb930e))\n\n### Performance Improvements\n\n* 优化数据表索引 ([228fdf0](https://github.com/certd/certd/commit/228fdf0a0d28013f5dd156a97bbde80537e8e97e))\n* 支持mysql ([7cde1fd](https://github.com/certd/certd/commit/7cde1fdc4a9ed851900d231a5460c8dbfbcd148e))\n\n## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n### Bug Fixes\n\n* 修复cname排查方法 nslookup命令显示黑色的问题 ([3dfeeec](https://github.com/certd/certd/commit/3dfeeec899d7d0d7292695ce410f78548e076c03))\n\n### Performance Improvements\n\n* 通知选择器优化 ([2c0cbdd](https://github.com/certd/certd/commit/2c0cbdd29ecb74cc939b2ae7ee86b8d40f70ba31))\n* 新增七牛云插件分组 ([49e7dc5](https://github.com/certd/certd/commit/49e7dc56e1a95fbdea3e30cdeb945b48415b69e3))\n* 新增server酱3通知 ([6aa4872](https://github.com/certd/certd/commit/6aa487269c9f6862e188b37a0d6c73f79c937d94))\n* 支持邀请奖励 ([618ec93](https://github.com/certd/certd/commit/618ec937866b24ebcf8164db43acb1ed66a5b329))\n* 支持易发云短信 ([94fa77f](https://github.com/certd/certd/commit/94fa77fcd2b9bea294fb05736c0d8cdc81f56103))\n* cname value优化 ([e8c9c2a](https://github.com/certd/certd/commit/e8c9c2a47d47048ae743b16f7bc932dbe18a89e9))\n* favicon支持自定义 ([8b9c47d](https://github.com/certd/certd/commit/8b9c47daf194515006689a212ae9cf586bdf5993))\n\n# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n### Bug Fixes\n\n* 修复自定义webhook contextType的bug ([7e5ea0c](https://github.com/certd/certd/commit/7e5ea0cee003acda952d922ca70592f1e8a2ed80))\n\n### Features\n\n* 手机号登录、邮箱验证码注册 ([7b55337](https://github.com/certd/certd/commit/7b55337c5edb470cca7aa62201eda8d274784004))\n\n### Performance Improvements\n\n* 部署到IIS插件 ([1534f45](https://github.com/certd/certd/commit/1534f4523633265d219d7b3a249a9ea1af99c512))\n* 登录失败增加重试次数限制及冷却时间 ([954b6df](https://github.com/certd/certd/commit/954b6df3608695fe074130f8149a33e311d80cc4))\n* 流水线支持批量修改分组，批量删除 ([a847e66](https://github.com/certd/certd/commit/a847e66c4fc843b98f1520b2b8072d3586ce8b81))\n* 取消docker-compose的dns配置 ([87bbf6f](https://github.com/certd/certd/commit/87bbf6f14080b9fa287c250d7fc4d33279c83ff7))\n* 首页新增修改密码提示 ([0772d3b](https://github.com/certd/certd/commit/0772d3b3fd24afdde4086d9f09ef19d037b431b4))\n* 选项显示图标 ([aedc462](https://github.com/certd/certd/commit/aedc46213571a3bd93809b7af7fa17a08d546237))\n* 优化七牛云cdn，获取域名列表可以选择 ([5a20242](https://github.com/certd/certd/commit/5a20242111d6bd255b25dac86fe1f062c8543096))\n* 优化七牛云cdn部署，保持http2和forceHttp设置，当未开启https时，主动开启https ([196f7d9](https://github.com/certd/certd/commit/196f7d9dc23d7dd96b663c686542e85270b81aef))\n* 优化证书申请成功通知发送方式 ([8002a56](https://github.com/certd/certd/commit/8002a56efc5998aa03db5711ae87f9eb4bc9e160))\n* 支持短信验证码登录 ([387bcc5](https://github.com/certd/certd/commit/387bcc5fa418cdeea81a06da5e3f8cd6b43cd082))\n* 支持威联通证书部署 ([0d8913e](https://github.com/certd/certd/commit/0d8913ea2f56fdebbcc9bb207eae59e8ddbb8cad))\n* 自定义webhook显示详细的错误信息 ([3254afc](https://github.com/certd/certd/commit/3254afc75640eed3729d0fc02a818fefbe5c7fc3))\n\n## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n### Performance Improvements\n\n* 通知支持自定义webhook、anpush、iyuu、server酱 ([cbccd9e](https://github.com/certd/certd/commit/cbccd9e3d0a4c24aba772af62734666d40b22c57))\n* 通知支持vocechat、bark、telegram、discord、slack ([642f57f](https://github.com/certd/certd/commit/642f57ff6d7152a9e14f59c7fc0e32a6b1751fb7))\n\n## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package root\n\n## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n### Bug Fixes\n\n* 修复关键字查询bug ([fab6660](https://github.com/certd/certd/commit/fab66606b35a540fac31fee902331ba1ffdebc16))\n* 修复CNAME时子域名级数超出限制的问题 ([3af6d96](https://github.com/certd/certd/commit/3af6d96e6e353c9b2111cff81679b79c55195a0a))\n\n### Performance Improvements\n\n* 谷歌EAB绑定邮箱改成必填 ([81a8123](https://github.com/certd/certd/commit/81a8123725d7bf4bd6a32a64a066bd760b7b6a7f))\n* 华为云密钥获取提示及访问链接 ([de43391](https://github.com/certd/certd/commit/de43391e4c12dc3ad976f8fa8787f4eb70a41e75))\n* 通知管理 ([d9a00ee](https://github.com/certd/certd/commit/d9a00eeaf72735ced67c59d7983d84e3c730064a))\n* 通知渠道支持测试按钮 ([b54ae27](https://github.com/certd/certd/commit/b54ae272ebc2d31b32b049d44e2299a6be7f153c))\n* 优化插件开发，dnsProvider无需写http logger 变量 ([fcbb5e4](https://github.com/certd/certd/commit/fcbb5e46a112174150a62648319b8224fce3b7ed))\n* 支持部署到阿里云WAF ([c96fcb7](https://github.com/certd/certd/commit/c96fcb7afced979435cffa73591275008033c90d))\n* 支持企业微信群聊机器人通知 ([b805a29](https://github.com/certd/certd/commit/b805a2925984144a31575b8aaa622f0c30d41b56))\n\n## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n### Bug Fixes\n\n* .env 读取 \\r 问题 ([0e33dfa](https://github.com/certd/certd/commit/0e33dfa019a55ea76193c428ec756af386adeb9d))\n* 修复vip试用secret报错的bug ([018dee6](https://github.com/certd/certd/commit/018dee6c383233560f078dfd30f6c2857a7e15ee))\n\n### Performance Improvements\n\n* 当步骤全部都禁用时，任务本身显示删除线 ([9ab9a6e](https://github.com/certd/certd/commit/9ab9a6e8b083e19793894f23e59f29c604ec98e5))\n\n## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n### Bug Fixes\n\n* 修复1Panel面板本身证书更新导致判定执行失败的问题 ([2689e6d](https://github.com/certd/certd/commit/2689e6d6c03aba21da90d5d45232c6ba08696be1))\n* 修复角色无法删除的bug ([66629a5](https://github.com/certd/certd/commit/66629a591aecc2d8364ea415c7afc3f9d0406562))\n* 修复Cname情况下，无法使用DNS类型的bug ([26dad39](https://github.com/certd/certd/commit/26dad399d5768b3205da099ddc11809aef7d6224))\n\n### Performance Improvements\n\n* 日志查看自动滚动到底部 ([4a2f7eb](https://github.com/certd/certd/commit/4a2f7ebf87b7c027cebff7cb763f8f35f6d2aa36))\n* 系统设置中的代理设置优化为可全局生效，环境变量中的https_proxy设置将无效 ([381a37f](https://github.com/certd/certd/commit/381a37fbaa6b61c887eda743897ae00afb825bdf))\n* 新手导航在非编辑模式下不显示 ([18bfcc2](https://github.com/certd/certd/commit/18bfcc24ad0bde57bb04db8a4209861ec6b8ff1d))\n* 优化腾讯云 cloudflare 重复解析记录时的返回值 ([90d1b68](https://github.com/certd/certd/commit/90d1b68bd6cf232fbe085234efe07d29b7690044))\n* 支持namesilo ([80159ec](https://github.com/certd/certd/commit/80159ecca895103d0495f3217311199e66056572))\n* 专业版试用，无需绑定账号 ([c7c4318](https://github.com/certd/certd/commit/c7c4318c11b65a76089787aa58939832d338a232))\n\n## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n### Bug Fixes\n\n* 修复未设置pfx密码，导致jks转换报错的bug ([c3cfbd8](https://github.com/certd/certd/commit/c3cfbd8474155aed4379f91075de37d5d8c73ef0))\n\n### Performance Improvements\n\n* 公共cname服务支持关闭 ([f4ae512](https://github.com/certd/certd/commit/f4ae5125dc4cd97816976779cb3586b5ee78947e))\n\n## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n### Bug Fixes\n\n* 修复偶发性cname一直验证超时的bug ([d2ce72e](https://github.com/certd/certd/commit/d2ce72e4aaacdf726ba8b91fcd71db40a27714ba))\n* 修复邮件配置，忽略证书校验设置不生效的bug ([66a9690](https://github.com/certd/certd/commit/66a9690dc958732e1b3c672d965db502296446f9))\n* 修复ipv6未开启情况下，请求带有ipv6地址域名报ETIMEDOUT的bug ([a9a0967](https://github.com/certd/certd/commit/a9a0967a6f1d0bd27e69f3ec52c31d90d470bc23))\n\n### Performance Improvements\n\n* 修复站点个性化，浏览器标题没有生效的bug ([bcfac02](https://github.com/certd/certd/commit/bcfac02c96ceaf23d1a0b05b48d8047da933beaf))\n* 优化上传到主机插 路径选择，根据证书格式显示 ([8c3f86c](https://github.com/certd/certd/commit/8c3f86c6909ed91f48bb2880e78834e22f6f6a29))\n* 支持jks ([889eaae](https://github.com/certd/certd/commit/889eaaea92818f628b922dae540c026630611707))\n* ipv6支持 ([da6ac16](https://github.com/certd/certd/commit/da6ac1626b3574be2fabeeb18a1f10d60bdcbe49))\n\n## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n### Bug Fixes\n\n* 修复某些容器管理ui无法识别端口列表的bug ([576e60a](https://github.com/certd/certd/commit/576e60a2b52315909e659d2a58cf98b130e69e6f))\n* 修复删除腾讯云过期证书时间判断上的bug，导致已过期仍然没有删除证书 ([1ba1007](https://github.com/certd/certd/commit/1ba10072615015d91b81fc56a3b01dae6a2ae9d1))\n\n### Performance Improvements\n\n* 优化部署到阿里云CDN插件，支持多域名，更易用 ([80c500f](https://github.com/certd/certd/commit/80c500f618b169a1f64c57fe442242a4d0d9d833))\n* 优化流水线页面切换回来不丢失查询条件 ([4dcf6e8](https://github.com/certd/certd/commit/4dcf6e87bc5f7657ce8a56c5331e8723a0fee8ee))\n* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941))\n* 执行历史支持点击查看流水线详情 ([8968639](https://github.com/certd/certd/commit/89686399f90058835435b92872fc236fac990148))\n* 专业版7天试用 ([c58250e](https://github.com/certd/certd/commit/c58250e1f065a9bd8b4e82acc1df754504c0010c))\n\n## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n### Bug Fixes\n\n* 修复头像没有更新的bug ([9b4a31f](https://github.com/certd/certd/commit/9b4a31fa6a32b9cab2e22bd141cf96ca29120445))\n\n### Performance Improvements\n\n* 禁止页面缓存，点击tab页签可以刷新数据 ([7ad4b55](https://github.com/certd/certd/commit/7ad4b55ee000c1dd0747832b11107f32b0ffb889))\n* 优化时间选择器，自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211))\n* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9))\n\n# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n### Bug Fixes\n\n* 修复历史记录不能按名称查询的bug ([6113c38](https://github.com/certd/certd/commit/6113c388b7fc58b11ca19ff05cc1286d096c8d28))\n* pfx兼容windows server 2016 ([e5e468a](https://github.com/certd/certd/commit/e5e468a463f66d02f235de54b7c1e09ace5f1cb1))\n\n### Features\n\n* 首页全新改版 ([63ec5b5](https://github.com/certd/certd/commit/63ec5b5519c760a3330569c0da6dac157302a330))\n\n### Performance Improvements\n\n* 管理控制台数据统计 ([babd589](https://github.com/certd/certd/commit/babd5897ae013ff7c04ebfcbfac8a00d84dd627c))\n* 增加向导 ([6d9ef26](https://github.com/certd/certd/commit/6d9ef26ecab71d752c2c55d75aed4fb5f6c05a39))\n* lego 升级到 4.19.2 ([129bf53](https://github.com/certd/certd/commit/129bf53edc9bbb001fe49fbd7e239bd1d09cc128))\n\n## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n### Bug Fixes\n\n* 修复lego No help topic for 错误 ([aaaf8d7](https://github.com/certd/certd/commit/aaaf8d7db34896cf8f2ff8f12eec1ab0cae58f0f))\n\n### Performance Improvements\n\n* 支持白山云cdn部署 ([b1b2cd0](https://github.com/certd/certd/commit/b1b2cd088b684eda764962abd61754c26a204d1c))\n* 支持华为云cdn ([81a3fdb](https://github.com/certd/certd/commit/81a3fdbc29b71f380762008cc151493ec97458f9))\n\n## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n### Bug Fixes\n\n* 顶部菜单变...的bug ([6dabad7](https://github.com/certd/certd/commit/6dabad76baba96be0f8af36a3fbfb9f5182aecf1))\n\n### Performance Improvements\n\n* 默认证书更新时间设置为35天，增加腾讯云删除过期证书插件，可以避免腾讯云过期证书邮件 ([51b6fed](https://github.com/certd/certd/commit/51b6fed468eaa6f28ce4497ce303ace1a52abb96))\n* 授权加密支持解密查看 ([5575c83](https://github.com/certd/certd/commit/5575c839705f6987ad2bdcd33256b0962c6a9c6a))\n* 重置管理员密码同时启用管理员账户，避免之前禁用了，重置密码还是登录不进去 ([f92d918](https://github.com/certd/certd/commit/f92d918a1e28e29b794ad4754661ea760c18af46))\n\n## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n### Bug Fixes\n\n* 修复阿里云部署大杀器报插件_还未注册错误的bug ([abd2dcf](https://github.com/certd/certd/commit/abd2dcf2e85a545321bae6451406d081f773b132))\n* 修复启动时自签证书无法保存的bug ([526c484](https://github.com/certd/certd/commit/526c48450bcd37b3ccded9b448f17de8140bdc6e))\n\n### Performance Improvements\n\n* 顶部菜单自定义 ([54d136c](https://github.com/certd/certd/commit/54d136cc6ae122f7c891b7a5c7232fe5de8e5cb5))\n* 禁用readonly用户 ([d10d42e](https://github.com/certd/certd/commit/d10d42e20619bb55a50d636b8867ff33db4e3b4b))\n* 限制其他用户流水线数量 ([315e437](https://github.com/certd/certd/commit/315e43746baf01682737f82e41579237a48409af))\n* 用户管理优化头像上传 ([661293c](https://github.com/certd/certd/commit/661293c189a3abf3cdc953b5225192372f57930d))\n\n## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n### Bug Fixes\n\n* 修复对话框全屏按钮与关闭按钮重叠的bug ([95df56c](https://github.com/certd/certd/commit/95df56cc5ca5e3eb843cd17cb7078cde47729f1e))\n* deprecated的运行时不要报错，只报警告 ([bcbefaa](https://github.com/certd/certd/commit/bcbefaaa35cf6d0eec085b3a2c5bfc7c6a8de9e1))\n\n### Performance Improvements\n\n* 更新certd本身的证书文档说明 ([0c50ede](https://github.com/certd/certd/commit/0c50ede129337b82df54575cbd2f4c2a783a0732))\n* 支持同时监听https端口，7002 ([d5a17f9](https://github.com/certd/certd/commit/d5a17f9e6afd63fda2df0981118480f25a1fac2e))\n\n## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n### Performance Improvements\n\n* 部署到阿里云任意云资源，阿里云部署大杀器 ([4075be7](https://github.com/certd/certd/commit/4075be7849b140acb92bd8da8a9acbf4eef85180))\n* 文件名特殊字符限制输入 ([c4164c6](https://github.com/certd/certd/commit/c4164c66e29f3ec799f98108a344806ca61e94ff))\n* 新增部署到百度云CDN插件 ([f126f9f](https://github.com/certd/certd/commit/f126f9f932d37fa01fff1accc7bdd17d349f8db5))\n* 新增部署到腾讯云CDN-v2，推荐使用 ([d782655](https://github.com/certd/certd/commit/d782655cb4dfbb74138178afbffeee76fc755115))\n* 优化cron选择器，增加下次触发时间显示 ([5b148b7](https://github.com/certd/certd/commit/5b148b7ed960ca6f7f5b733b2eadd56eeecbd4c2))\n* 支持部署到腾讯云COS ([a8a45d7](https://github.com/certd/certd/commit/a8a45d7f757820990e278533277a3deda5ba48f3))\n* 支持配置公共ZeroSSL授权 ([a90d1e6](https://github.com/certd/certd/commit/a90d1e68ee9cbc3705223457b8a86f071b150968))\n\n## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n### Bug Fixes\n\n* 申请证书没有使用到系统设置的http代理的bug ([3db216f](https://github.com/certd/certd/commit/3db216f515ba404cb4330fdab452971b22a50f08))\n* 修复移动任务后出现空阶段的bug ([4ea3edd](https://github.com/certd/certd/commit/4ea3edd59e93ca4f5b2e43b20dd4ef33909caddb))\n* 修复google证书*.xx.com与xx.com同时申请时报错的bug ([f8b99b8](https://github.com/certd/certd/commit/f8b99b81a23e7e9fd5e05ebd5caf355c41d67a90))\n* 允许七牛云cdn插件输入.号开头的通配符域名 ([18ee87d](https://github.com/certd/certd/commit/18ee87daff6eafc2201b58e28d85aafd3cb7a5b9))\n\n### Performance Improvements\n\n* 申请证书启用新的反代地址 ([a705182](https://github.com/certd/certd/commit/a705182b85e51157883e48f23463263793bf3c12))\n* 优化日志颜色 ([1291e98](https://github.com/certd/certd/commit/1291e98e821c5b1810aab7f0aebe3f5f5cd44a20))\n* 优化证书申请速度和成功率，反代地址优化，google基本可以稳定请求。增加请求重试。 ([41d9c3a](https://github.com/certd/certd/commit/41d9c3ac8398def541e65351cbe920d4a927182d))\n* 优化pfx密码密码输入框，让浏览器不自动填写密码 ([ffeede3](https://github.com/certd/certd/commit/ffeede38afa70c5ff6f2015516bead23d2c4df87))\n\n## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n### Bug Fixes\n\n* 修复cname服务普通用户access访问权限问题 ([c1e3e2e](https://github.com/certd/certd/commit/c1e3e2ee1f923ee5806479dd5f178c3286a01ae0))\n\n## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n### Bug Fixes\n\n* 修复普通用户无法校验cname配置的bug ([6285497](https://github.com/certd/certd/commit/62854978bf0bdbe749b42f8e40ab227ab31ec92f))\n* 修复切换普通用户登录时，左侧菜单没有同步更新的bug ([12116a8](https://github.com/certd/certd/commit/12116a89f43cf8b98f16d2ea6073f6b72a643215))\n* 修正邮箱设置跳转路由 ([17d8890](https://github.com/certd/certd/commit/17d88900a1f0e3af609b74597f5b1978230db32d))\n\n### Performance Improvements\n\n* 触发证书重新申请input变化对比规则优化，减少升级版本后触发申请证书的情况 ([c46a2a9](https://github.com/certd/certd/commit/c46a2a9a399c2a9a8bb59a48b9fb6e93227cce9b))\n* 任务下所有步骤都跳过时，整个任务显示跳过 ([84fd3b2](https://github.com/certd/certd/commit/84fd3b250dd1161ea06c5582fdadece4b29c2e53))\n* 授权配置去除前后空格 ([57d8d48](https://github.com/certd/certd/commit/57d8d48046fbf51c52b041d2dec03d51fb018587))\n* 数据库备份插件，先压缩再备份 ([304ef49](https://github.com/certd/certd/commit/304ef494fd5787c996ad0dcb6edd2f517afce9e2))\n* 优化菜单 ([1f4f157](https://github.com/certd/certd/commit/1f4f15757de1015cf7563f7022599eef58cc93d7))\n* 增加文档站 https://certd.docmirror.cn ([6e2ac1c](https://github.com/certd/certd/commit/6e2ac1c089f6ddccb396f1f2738509c05333e1bb))\n\n## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n### Bug Fixes\n\n* 修复无法设置角色的bug ([02fe704](https://github.com/certd/certd/commit/02fe704769edb25fea5ffd85a51a5530864b37b3))\n\n### Performance Improvements\n\n* 角色删除安全 ([28bb485](https://github.com/certd/certd/commit/28bb4856bee03569153f6471527c9b9f28cb3d14))\n* 密钥备份 ([1c6028a](https://github.com/certd/certd/commit/1c6028abcf8849163462bb2f8441b6838357e09b))\n* 证书直接查看 ([5dde5bd](https://github.com/certd/certd/commit/5dde5bd3f76db3959d411619d29bfb8064e3b307))\n* sqlite数据库备份插件 ([77f1631](https://github.com/certd/certd/commit/77f163144f7dcfb0431475c55508fecfd6d969f8))\n\n## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n### Bug Fixes\n\n* 修复siteInfo每次都要重新设置的bug ([36b26ae](https://github.com/certd/certd/commit/36b26ae9f5c7a53c1c2546fb79b2ea451b854abf))\n\n## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n### Bug Fixes\n\n* 修复排序失效的bug ([1f0742e](https://github.com/certd/certd/commit/1f0742ef9f0caae0c7e713acf0fd3cebf5d63875))\n\n## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n### Bug Fixes\n\n* 修复版本号获取错误的bug ([8851870](https://github.com/certd/certd/commit/8851870400df86e496198ad509061b8989fcc44f))\n\n## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n### Performance Improvements\n\n* [comm] 支持插件管理 ([e8b617b](https://github.com/certd/certd/commit/e8b617b80ce882dd63006f0cfc719a80a1cc6acc))\n* 新增代理设置功能 ([273ab61](https://github.com/certd/certd/commit/273ab6139f5807f4d7fe865cc353b97f51b9a668))\n* EAB授权支持绑定邮箱，支持公共EAB设置 ([07043af](https://github.com/certd/certd/commit/07043aff0ca7fd29c56dd3c363002cb15d78b464))\n\n## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n### Performance Improvements\n\n* 优化系统设置加载时机 ([7396253](https://github.com/certd/certd/commit/73962536d5a4769902d760d005f3f879465addcc))\n\n## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n### Bug Fixes\n\n* 修复某些情况下bindUrl失败的bug ([91fc1cd](https://github.com/certd/certd/commit/91fc1cd7353be4a22be951239ed70b38baebc74e))\n\n### Performance Improvements\n\n* 邮箱设置改为系统设置，普通用户无需配置发件邮箱 ([4244569](https://github.com/certd/certd/commit/42445692117184a3293e63bef84a74cbb5984b0e))\n\n## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package root\n\n# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n### Bug Fixes\n\n* 修复管理员编辑其他用户流水线任务时归属userid也被修改的bug ([e85c477](https://github.com/certd/certd/commit/e85c47744cf740b4af3b93dca7c2f0ccc818ec2f))\n* 修复历史记录根据流水线名称查询报错的bug ([ce9a986](https://github.com/certd/certd/commit/ce9a9862f122fce2186e7727eaa4b251b59e6032))\n* 修复某些代理情况下 报 400 The plain HTTP request was sent to HTTPS port use proxy 的bug ([a13203f](https://github.com/certd/certd/commit/a13203fb3f48c427d0d81a504912248dcc07df1a))\n\n### Features\n\n* 域名验证方法支持CNAME间接方式，此方式支持所有域名注册商，且无需提供Access授权，但是需要手动添加cname解析 ([f3d3508](https://github.com/certd/certd/commit/f3d35084ed44f9f33845f7045e520be5c27eed93))\n* 站点个性化设置 ([11a9fe9](https://github.com/certd/certd/commit/11a9fe9014d96cba929e5a066e78f2af7ae59d14))\n\n### Performance Improvements\n\n* 并行任务名称改成添加任务，取消并行，可以在同一个阶段获取上一个task的输出 ([c5e5877](https://github.com/certd/certd/commit/c5e58770d1c5edc19c6f9ea1618f44b68e091f35))\n* 调整静态资源到static目录 ([0584b36](https://github.com/certd/certd/commit/0584b3672b40f9042a2ed87e5627022606d046cd))\n* 调整全部静态资源到static目录 ([a218890](https://github.com/certd/certd/commit/a21889080d6c7ffdf0af526a3a21f0b2d1c77288))\n* 检查cname是否正确配置 ([b5d8935](https://github.com/certd/certd/commit/b5d8935159374fbe7fc7d4c48ae0ed9396861bdd))\n* 七牛云cdn支持配置多个域名 ([88d745e](https://github.com/certd/certd/commit/88d745e29063a089864fb9c6705be7b8d4c2669a))\n* 上传到主机插件支持注入环境变量 ([81fac73](https://github.com/certd/certd/commit/81fac736f9ccc8d1cda7ef4178752239cec20849))\n* 优化宝塔网站部署插件远程获取数据的提示 ([2a3ca9f](https://github.com/certd/certd/commit/2a3ca9f552d96594ec6690a1c4c91f598451b9a1))\n* 优化缩短首页缓存时间 ([49395e8](https://github.com/certd/certd/commit/49395e8cb65f4b30c0145329ed5de48be4ef3842))\n* 域名输入增加校验提示，避免输入错误的域名 ([0c8e83e](https://github.com/certd/certd/commit/0c8e83e1254a9ce4d5a4e7888eb1710394a4b77c))\n* cname校验配置增加未校验通过提示 ([77cc3c4](https://github.com/certd/certd/commit/77cc3c4a5cbd81f8233a8e0bb33fab0621c0905f))\n* google eab授权支持自动获取，不过要配置代理 ([592791d](https://github.com/certd/certd/commit/592791d1356fc252fbb70d7f168567aee9585507))\n\n## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)\n\n### Bug Fixes\n\n* 修复西部数码账户级别apikey不可用的bug ([f8f3e8b](https://github.com/certd/certd/commit/f8f3e8b43fd5d815887bcb53b95f46dc96424b79))\n\n### Performance Improvements\n\n* 增加等待插件 ([3ef0541](https://github.com/certd/certd/commit/3ef0541cc85ab6abf698ead3b258ae1ac156ef98))\n\n## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)\n\n### Bug Fixes\n\n* 修复pfxPassword无效的bug ([251e450](https://github.com/certd/certd/commit/251e450fabfe62405bac13e39f2153736c081ef0))\n\n### Performance Improvements\n\n* 群晖获取deviceid优化 ([8d42273](https://github.com/certd/certd/commit/8d4227366548eb70f6bc04303829e6933168f906))\n\n## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)\n\n### Bug Fixes\n\n* 修复某些地区被屏蔽无法激活专业版的bug ([7532a96](https://github.com/certd/certd/commit/7532a960851b84d4f2cc3dba02353c5235e1a364))\n\n### Performance Improvements\n\n* 上传到主机，支持socks代理 ([d91026d](https://github.com/certd/certd/commit/d91026dc4fbfe5fedc4ee8e43dc0d08f1cf88356))\n* 支持上传到七牛云oss ([bf024bd](https://github.com/certd/certd/commit/bf024bdda8bc2a463475be5761acf0da7317a08a))\n\n## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)\n\n### Bug Fixes\n\n* 修复中间证书复制错误的bug ([76e86ea](https://github.com/certd/certd/commit/76e86ea283ecbe4ec76cdc92b98457d0fef544ac))\n\n### Performance Improvements\n\n* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))\n* 增加使用教程 ([9d9c021](https://github.com/certd/certd/commit/9d9c0218195af5b9896cce7109b26a433480571d))\n\n## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)\n\n**Note:** Version bump only for package root\n\n## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)\n\n### Bug Fixes\n\n* 修复启动报授权验证失败的bug ([3460d3d](https://github.com/certd/certd/commit/3460d3ddca222ea702816ab805909d489eff957f))\n\n## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)\n\n### Bug Fixes\n\n* 修复upload to host trim错误 ([0f0ddb9](https://github.com/certd/certd/commit/0f0ddb9c5963fd643d6d203334efac471c43ec3b))\n\n## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)\n\n**Note:** Version bump only for package root\n\n## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)\n\n**Note:** Version bump only for package root\n\n# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)\n\n### Bug Fixes\n\n* 修复首次创建任务运行时不自动设置当前运行情况的bug ([ecd83ee](https://github.com/certd/certd/commit/ecd83ee136abdd3df9ed2f21ec2ff0f24c0ed9d9))\n\n### Features\n\n* 账号绑定 ([e046640](https://github.com/certd/certd/commit/e0466409d0c021bb415abd94df448c8a0d4799e9))\n* 支持中间证书 ([e86756e](https://github.com/certd/certd/commit/e86756e4c65a53dd23106d7ecbfe2fa987cc13f3))\n* 支持vip转移 ([361e8fe](https://github.com/certd/certd/commit/361e8fe7ae5877e23fd5de31bc919bedd09c57f5))\n\n### Performance Improvements\n\n* 群晖支持OTP双重验证登录 ([8b8039f](https://github.com/certd/certd/commit/8b8039f42bbce10a4d0e737cdeeeef9bb17bee5a))\n* 任务支持禁用 ([8ed16b3](https://github.com/certd/certd/commit/8ed16b3ea2dfe847357863a0bfa614e4fa5fc041))\n* 优化收件邮箱输入 ([22ef28f](https://github.com/certd/certd/commit/22ef28f6338a78465bd52ccbad13e66e80263b2f))\n* 优化主机登录失败提示 ([9de77b3](https://github.com/certd/certd/commit/9de77b327d39cff5ed6660ec53b58ba0eea18e5a))\n* 增加重启certd插件 ([48238d9](https://github.com/certd/certd/commit/48238d929e6c4afa1d428e4d35b9159d37a47ae0))\n* 证书支持旧版RSA，pkcs1 ([3d9c3ec](https://github.com/certd/certd/commit/3d9c3ecb3eb604b2458154f608bde0f01915d116))\n* 支持阿里云ACK证书部署 ([d331fea](https://github.com/certd/certd/commit/d331fea47789122650e057ec7c9e85ee8e66f09b))\n* 支持七牛云 ([8ecc2f9](https://github.com/certd/certd/commit/8ecc2f9446a9ebd11b9bfbffbb6cf7812a043495))\n* 支持k8s ingress secret ([e5a5d0a](https://github.com/certd/certd/commit/e5a5d0a607bb6b4e1a1f7a1a419bada5f2dee59f))\n* http请求增加默认超时时间 ([664bd86](https://github.com/certd/certd/commit/664bd863e5b4895aabe2384277c0c65f5902fdb2))\n* plugins增加图标 ([a8da658](https://github.com/certd/certd/commit/a8da658a9723342b4f43a579f7805bfef0648efb))\n\n## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09)\n\n### Bug Fixes\n\n* 修复腾讯云cdn证书部署后会自动关闭hsts，http2.0等配置的bug ([7908ab7](https://github.com/certd/certd/commit/7908ab79da624c94fa05849925b15e480e3317c4))\n* 修复腾讯云tke证书部署报错的bug ([653f409](https://github.com/certd/certd/commit/653f409d91a441850d6381f89a8dd390831f0d5e))\n\n### Performance Improvements\n\n* 插件选择支持搜索 ([d1498a7](https://github.com/certd/certd/commit/d1498a71601b74d38343b1d070eadd03705dd9d5))\n* 前置任务步骤增加错误提示 ([ae3daa9](https://github.com/certd/certd/commit/ae3daa9bcf4fc363825aad9b77f5d3879aeeff70))\n* 群晖部署教程 ([0f0af2f](https://github.com/certd/certd/commit/0f0af2f309390f388e7a272cea3a1dd30c01977d))\n* 支持群晖 ([5c270b6](https://github.com/certd/certd/commit/5c270b6b9d45a2152f9fdb3c07bd98b7c803cb8e))\n\n## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06)\n\n### Performance Improvements\n\n* 支持多吉云cdn证书部署 ([65ef685](https://github.com/certd/certd/commit/65ef6857296784ca765926e09eafcb6fc8b6ecde))\n\n## [1.24.2](https://github.com/certd/certd/compare/v1.24.1...v1.24.2) (2024-09-06)\n\n### Bug Fixes\n\n* 修复复制流水线出现的各种问题 ([6314e8d](https://github.com/certd/certd/commit/6314e8d7eb58cd52e2a7bd3b5ffb9112b0b69577))\n* 修复windows下无法执行第二条命令的bug ([71ac8aa](https://github.com/certd/certd/commit/71ac8aae4aa694e1a23761e9761c9fba30b43a21))\n\n### Performance Improvements\n\n* 阶段、任务、步骤全面支持拖动排序 ([bd73a16](https://github.com/certd/certd/commit/bd73a163cd0497f062bd424ddc6bc9bbc95f81ea))\n* 任务配置不需要的字段可以自动隐藏 ([192d9dc](https://github.com/certd/certd/commit/192d9dc7e36737d684c769f255f407c28b1152ac))\n* 任务支持拖动排序 ([1e9b563](https://github.com/certd/certd/commit/1e9b5638aa36a8ce70019a9c750230ba41938327))\n* 西部数据支持用户级的apikey ([1c17b41](https://github.com/certd/certd/commit/1c17b41e160944b073e1849e6f9467c3659a4bfc))\n* 修复windows下无法执行第二条命令的bug ([d5bfcdb](https://github.com/certd/certd/commit/d5bfcdb6de1dcc1702155442e2e00237d0bbb6e5))\n* 优化跳过处理逻辑 ([b80210f](https://github.com/certd/certd/commit/b80210f24bf5db1c958d06ab27c9e5d3db452eda))\n* 支持阿里云oss ([87a2673](https://github.com/certd/certd/commit/87a2673e8c33dff6eda1b836d92ecc121564ed78))\n* 支持西部数码DNS ([c59cab1](https://github.com/certd/certd/commit/c59cab1aaeb19f86df8e3e0d8127cbd0a9ef77f3))\n* 支持pfx、der ([fbeaed2](https://github.com/certd/certd/commit/fbeaed203519f59b6d9396c4e8953353ccb5e723))\n* client 请求超时时间延长为10s ([ff46771](https://github.com/certd/certd/commit/ff46771d8dd43e71c1ca70e3ba783945750342cc))\n\n## [1.24.1](https://github.com/certd/certd/compare/v1.24.0...v1.24.1) (2024-09-02)\n\n### Bug Fixes\n\n* 激活仅限管理员 ([1c17970](https://github.com/certd/certd/commit/1c17970b981f0987c506744ee6b2283fd5e40493))\n* 修复在没有勾选使用代理的情况下，仍然会使用代理的bug ([0f66794](https://github.com/certd/certd/commit/0f6679425f6a736bb0128527dd99c085fac17d84))\n\n### Performance Improvements\n\n* 部署插件支持宝塔、易盾云等 ([ee61709](https://github.com/certd/certd/commit/ee617095efa1171548cf52fd45f0f98a368555a3))\n* 授权配置支持加密 ([42a56b5](https://github.com/certd/certd/commit/42a56b581d754c3e5f9838179d19ab0d004ef2eb))\n* 优化内存占用 ([db61033](https://github.com/certd/certd/commit/db6103363364440b650bc10bb334834e4a9470c7))\n* 支持阿里云 DCDN ([98b77f8](https://github.com/certd/certd/commit/98b77f80843834616fb26f83b4c42245326abd06))\n* 支持已跳过的步骤重新运行 ([ea775ad](https://github.com/certd/certd/commit/ea775adae18d57a04470cfba6b9460d761d74035))\n* 支持cdnfly ([724a850](https://github.com/certd/certd/commit/724a85028b4a7146c9e3b4df4497dcf2a7bf7c67))\n* 支持ftp上传 ([b9bddbf](https://github.com/certd/certd/commit/b9bddbfabb5664365f1232e9432532187c98006c))\n\n# [1.24.0](https://github.com/certd/certd/compare/v1.23.1...v1.24.0) (2024-08-25)\n\n### Bug Fixes\n\n* 部署到腾讯云cdn选择证书任务步骤限制只能选证书 ([3345c14](https://github.com/certd/certd/commit/3345c145b802170f75a098a35d0c4b8312efcd17))\n* 修复成功后跳过之后丢失腾讯云证书id的bug ([37eb762](https://github.com/certd/certd/commit/37eb762afe25c5896b75dee25f32809f8426e7b7))\n* 修复创建流水线后立即运行时报no id错误的bug ([17ead54](https://github.com/certd/certd/commit/17ead547aab25333603980304aa3aad3db1f73d5))\n* 修复使用代理的情况下申请证书失败的bug ([95122e2](https://github.com/certd/certd/commit/95122e28609333f4df55c266e5434897954c0fb3))\n* 修复执行日志没有清理的bug ([22a3363](https://github.com/certd/certd/commit/22a336370a88a7df2a23c967043bae153da71ed5))\n* 修复重置密码参数配置后无效的bug ([e358a88](https://github.com/certd/certd/commit/e358a8869696578687306e4cd0dcda53f898fe13))\n* 修复ssh无法连接成功，无法执行命令的bug ([41b9837](https://github.com/certd/certd/commit/41b9837582323fb400ef8525ce65e8b37ad4b36f))\n\n### Features\n\n* 支持ECC类型 ([a7424e0](https://github.com/certd/certd/commit/a7424e02f5c7e02ac1688791040785920ce67473))\n* 支持google证书申请（需要使用代理） ([a593056](https://github.com/certd/certd/commit/a593056e79e99dd6a74f75b5eab621af7248cfbe))\n\n### Performance Improvements\n\n* 更新k8s底层api库 ([746bb9d](https://github.com/certd/certd/commit/746bb9d385e2f397daef4976eca1d4782a2f5ebd))\n* 优化成功后跳过的提示 ([7b451bb](https://github.com/certd/certd/commit/7b451bbf6e6337507f4627b5a845f5bd96ab4f7b))\n* 优化证书申请成功率 ([968c469](https://github.com/certd/certd/commit/968c4690a07f69c08dcb3d3a494da4e319627345))\n* 优化dnspod的token id 说明 ([790bf11](https://github.com/certd/certd/commit/790bf11af06d6264ef74bc1bb919661f0354239a))\n* email proxy ([453f1ba](https://github.com/certd/certd/commit/453f1baa0b9eb0f648aa1b71ccf5a95b202ce13f))\n\n## [1.23.1](https://github.com/certd/certd/compare/v1.23.0...v1.23.1) (2024-08-06)\n\n### Bug Fixes\n\n* 修复模糊查询无效的bug ([9355917](https://github.com/certd/certd/commit/93559174c780173f0daec7cdbd1f72f8d5c504d5))\n\n### Performance Improvements\n\n* 优化插件字段的default value ([24c7be2](https://github.com/certd/certd/commit/24c7be2c9cb39c14f7a97b674127c88033280b02))\n* 优化默认值设置 ([1af19f0](https://github.com/certd/certd/commit/1af19f0ac053fe109782882964533636b5969d6b))\n\n# [1.23.0](https://github.com/certd/certd/compare/v1.22.9...v1.23.0) (2024-08-05)\n\n### Bug Fixes\n\n* 修复环境变量多个下划线不生效的bug ([7ec2218](https://github.com/certd/certd/commit/7ec2218c9fee5bee2bf0aa31f3e3a4301575f247))\n\n### Features\n\n* use node 20 ([e8ed972](https://github.com/certd/certd/commit/e8ed97206bf28e83f942db2ef4ea07fa76fd3567))\n\n## [1.22.9](https://github.com/certd/certd/compare/v1.22.8...v1.22.9) (2024-08-05)\n\n### Performance Improvements\n\n* 优化定时任务 ([87e440e](https://github.com/certd/certd/commit/87e440ee2a8b10dc571ce619f28bc83c1e5eb147))\n\n## [1.22.8](https://github.com/certd/certd/compare/v1.22.7...v1.22.8) (2024-08-05)\n\n### Performance Improvements\n\n* 修复删除历史记录没有删除log的bug，新增history管理页面，演示站点启动时不自动启动非管理员用户的定时任务 ([f78ae93](https://github.com/certd/certd/commit/f78ae93eedfe214008c3d071ca3d77c962137a64))\n* 优化pipeline删除时，删除其他history ([b425203](https://github.com/certd/certd/commit/b4252033d56a9ad950f3e204ff021497c3978015))\n\n## [1.22.7](https://github.com/certd/certd/compare/v1.22.6...v1.22.7) (2024-08-04)\n\n### Bug Fixes\n\n* 修复保存配置报id不能为空的bug ([367f807](https://github.com/certd/certd/commit/367f80731396003416665c22853dfbc09c2c03a0))\n\n## [1.22.6](https://github.com/certd/certd/compare/v1.22.5...v1.22.6) (2024-08-03)\n\n### Bug Fixes\n\n* 修复在相同的cron时偶尔无法触发定时任务的bug ([680941a](https://github.com/certd/certd/commit/680941af119619006b592e3ab6fb112cb5556a8b))\n* 修复pg下pipeline title 类型问题 ([a9717b9](https://github.com/certd/certd/commit/a9717b9a0df7b5a64d4fe03314fecad4f59774cc))\n\n### Performance Improvements\n\n* 流水线支持名称模糊查询 ([59897c4](https://github.com/certd/certd/commit/59897c4ceae992ebe2972ca9e8f9196616ffdfd7))\n* 腾讯云clb支持更多大区选择 ([e4f4570](https://github.com/certd/certd/commit/e4f4570b29f26c60f1ee9660a4c507cbeaba3d7e))\n* 优化前置任务输出为空的提示 ([6ed1e18](https://github.com/certd/certd/commit/6ed1e18c7d9c46d964ecc6abc90f3908297b7632))\n\n## [1.22.5](https://github.com/certd/certd/compare/v1.22.4...v1.22.5) (2024-07-26)\n\n### Bug Fixes\n\n* 修复用户管理无法添加用户的bug ([e7e89b8](https://github.com/certd/certd/commit/e7e89b8de7386e84c0d6b8e217e2034909657d68))\n\n## [1.22.4](https://github.com/certd/certd/compare/v1.22.3...v1.22.4) (2024-07-26)\n\n### Performance Improvements\n\n* 证书申请支持反向代理，letsencrypt无法访问时的备用方案 ([b7b5df0](https://github.com/certd/certd/commit/b7b5df0587e0f7ea288c1b2af6f87211f207395f))\n* 支持arm64 ([fa14f87](https://github.com/certd/certd/commit/fa14f87a8093ef3addc5e5f3315ce1bfc9982782))\n\n## [1.22.3](https://github.com/certd/certd/compare/v1.22.2...v1.22.3) (2024-07-25)\n\n### Bug Fixes\n\n* lege 无执行权限问题 ([338eb3b](https://github.com/certd/certd/commit/338eb3bdfeb461e9b3bc7eee97b97a59f5642ffe))\n\n## [1.22.2](https://github.com/certd/certd/compare/v1.22.1...v1.22.2) (2024-07-23)\n\n### Bug Fixes\n\n* 修复创建流水线时，无法根据dns类型默认正确的dns授权的bug ([a2c43b5](https://github.com/certd/certd/commit/a2c43b50a6069ed48958fd142844a8568c2af452))\n\n## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20)\n\n### Performance Improvements\n\n* 创建证书任务可以选择lege插件 ([affef13](https://github.com/certd/certd/commit/affef130378030c517250c58a4e787b0fc85d7d1))\n* 创建证书任务增加定时任务和邮件通知输入 ([427620d](https://github.com/certd/certd/commit/427620d34f3b8ad6933005faf1878908441a2453))\n* 支持配置启动后自动触发一次任务 ([a5a0c1f](https://github.com/certd/certd/commit/a5a0c1f6e7a3f05e581005e491d5b102ee854412))\n\n# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)\n\n### Features\n\n* 升级midway，支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))\n* 支持lego，海量DNS提供商 ([0bc6d0a](https://github.com/certd/certd/commit/0bc6d0a211920fb0084d705e1db67ee1e7262c44))\n* 支持postgresql ([3b19bfb](https://github.com/certd/certd/commit/3b19bfb4291e89064b3b407a80dae092d54747d5))\n\n### Performance Improvements\n\n* 优化一些小细节 ([b168852](https://github.com/certd/certd/commit/b1688525dbbbfd67e0ab1cf5b4ddfbe9d394f370))\n* 增加备案号设置 ([bd3d959](https://github.com/certd/certd/commit/bd3d959944db63a5690b55ee150e1007133868b9))\n* 自动生成jwtkey，无需手动配置 ([390e485](https://github.com/certd/certd/commit/390e4853a570390a97df6a3b3882579f9547eeb4))\n\n## [1.21.2](https://github.com/certd/certd/compare/v1.21.1...v1.21.2) (2024-07-08)\n\n### Performance Improvements\n\n* 申请证书时可以选择跳过本地dns校验 ([fe91d94](https://github.com/certd/certd/commit/fe91d94090d22ed0a3ea753ba74dfaa1bf057c17))\n\n## [1.21.1](https://github.com/certd/certd/compare/v1.21.0...v1.21.1) (2024-07-08)\n\n### Performance Improvements\n\n* 上传到主机，支持设置不mkdirs ([5ba9831](https://github.com/certd/certd/commit/5ba9831ed1aa6ec6057df246f1035b36b9c41d2e))\n* 说明优化，默认值优化 ([970c7fd](https://github.com/certd/certd/commit/970c7fd8a0f557770e973d8462ee5684ef742810))\n\n# [1.21.0](https://github.com/certd/certd/compare/v1.20.17...v1.21.0) (2024-07-03)\n\n### Features\n\n* 支持zero ssl ([eade2c2](https://github.com/certd/certd/commit/eade2c2b681569f03e9cd466e7d5bcd6703ed492))\n\n## [1.20.17](https://github.com/certd/certd/compare/v1.20.16...v1.20.17) (2024-07-03)\n\n### Performance Improvements\n\n* 创建dns解析后，强制等待60s ([f47b35f](https://github.com/certd/certd/commit/f47b35f6d5bd7d675005c3e286b7e9a029201f8b))\n* 文件上传提示由cert.crt改为cert.pem ([a09b0e4](https://github.com/certd/certd/commit/a09b0e48c176f3ed763791bd50322c29729f7c1c))\n* 优化cname verify ([eba333d](https://github.com/certd/certd/commit/eba333de7a5b5ef4b0b7eaa904f578720102fa61))\n\n## [1.20.16](https://github.com/certd/certd/compare/v1.20.15...v1.20.16) (2024-07-01)\n\n### Bug Fixes\n\n* 修复配置了cdn cname后申请失败的bug ([4a5fa76](https://github.com/certd/certd/commit/4a5fa767edc347d03d29a467e86c9a4d70b0220c))\n\n## [1.20.15](https://github.com/certd/certd/compare/v1.20.14...v1.20.15) (2024-06-28)\n\n### Bug Fixes\n\n* 修复无法强制取消任务的bug ([9cc01db](https://github.com/certd/certd/commit/9cc01db1d569a5c45bb3e731f35d85df324a8e62))\n\n### Performance Improvements\n\n* 腾讯云dns provider 支持腾讯云的accessId ([e0eb3a4](https://github.com/certd/certd/commit/e0eb3a441384d474fe2923c69b25318264bdc9df))\n* 支持windows文件上传 ([7f61cab](https://github.com/certd/certd/commit/7f61cab101fa13b4e88234e9ad47434e6130fed2))\n\n## [1.20.14](https://github.com/certd/certd/compare/v1.20.13...v1.20.14) (2024-06-23)\n\n### Bug Fixes\n\n* 修复修改密码功能异常问题 ([f740ff5](https://github.com/certd/certd/commit/f740ff517f521dce361284c2c54bccc68aee0ea2))\n\n## [1.20.13](https://github.com/certd/certd/compare/v1.20.12...v1.20.13) (2024-06-18)\n\n### Bug Fixes\n\n* 日志高度越界 ([c4c9adb](https://github.com/certd/certd/commit/c4c9adb8bfd513f57252e523794e3799a9b220f8))\n* 修复邮箱设置页面SMTP拼写错误的问题 ([b98f1c0](https://github.com/certd/certd/commit/b98f1c0dd0bc6c6b4f814c578692afdf6d90b88d))\n* 修复logo问题 ([7e483e6](https://github.com/certd/certd/commit/7e483e60913d509b113148c735fe13ba1d72dddf))\n\n### Performance Improvements\n\n* 增加警告，修复一些样式错乱问题 ([fd54c2f](https://github.com/certd/certd/commit/fd54c2ffac492222e85ff2f5f49a9ee5cfc73588))\n* ssh登录支持openssh格式私钥、支持私钥密码 ([5c2c508](https://github.com/certd/certd/commit/5c2c50839a9076004f9034d754ac6deb531acdfb))\n\n## [1.20.12](https://github.com/certd/certd/compare/v1.20.10...v1.20.12) (2024-06-17)\n\n### Bug Fixes\n\n* 修复aliyun域名超过100个找不到域名的bug ([5b1494b](https://github.com/certd/certd/commit/5b1494b3ce93d1026dc56ee741342fbb8bf7be24))\n\n### Performance Improvements\n\n* 增加系统设置，可以关闭自助注册功能 ([20feace](https://github.com/certd/certd/commit/20feacea12d43386540db6a600f391d786be4014))\n* 增加cloudflare access token说明 ([934e6e2](https://github.com/certd/certd/commit/934e6e2bd05387cd50ffab95f230933543954098))\n* 支持重置管理员密码，忘记密码的补救方案 ([732cbc5](https://github.com/certd/certd/commit/732cbc5e927b526850724594830392b2f10c6705))\n* 支持cloudflare域名 ([fbb9a47](https://github.com/certd/certd/commit/fbb9a47e8f7bb805289b9ee64bd46ffee0f01c06))\n\n## [1.20.10](https://github.com/certd/certd/compare/v1.20.9...v1.20.10) (2024-05-30)\n\n### Bug Fixes\n\n* 增加权限相关helper说明 ([83e4083](https://github.com/certd/certd/commit/83e40836ebff10bec60efe8933183e1ba1c22bf9))\n* 增加权限相关helper说明 ([4304c94](https://github.com/certd/certd/commit/4304c9443ad9248f63dd6d8c512d8d6f32f90d37))\n\n### Performance Improvements\n\n* 上传到主机插件支持复制到本机路径 ([92446c3](https://github.com/certd/certd/commit/92446c339936f98f08f654b8971a7393d8435224))\n* 优化文件下载包名 ([d9eb927](https://github.com/certd/certd/commit/d9eb927b0a1445feab08b1958aa9ea80637a5ae6))\n* 增加任务复制功能 ([39ad759](https://github.com/certd/certd/commit/39ad7597fa0e19cc1f7631bbd6fea0a9e05a62c9))\n\n## [1.20.9](https://github.com/certd/certd/compare/v1.20.8...v1.20.9) (2024-03-22)\n\n**Note:** Version bump only for package root\n\n## [1.20.8](https://github.com/certd/certd/compare/v1.20.7...v1.20.8) (2024-03-22)\n\n**Note:** Version bump only for package root\n\n## [1.20.7](https://github.com/certd/certd/compare/v1.20.6...v1.20.7) (2024-03-22)\n\n**Note:** Version bump only for package root\n\n## [1.20.6](https://github.com/certd/certd/compare/v1.20.5...v1.20.6) (2024-03-21)\n\n### Bug Fixes\n\n* 调整按钮图标到居中位置 ([836d18f](https://github.com/certd/certd/commit/836d18f07e22d00faf2f213bc3301a6672b5bafc))\n\n### Performance Improvements\n\n* 插件贡献文档及示例 ([72fb20a](https://github.com/certd/certd/commit/72fb20abf3ba5bdd862575d2907703a52fd7eb17))\n\n## [1.20.5](https://github.com/certd/certd/compare/v1.20.2...v1.20.5) (2024-03-11)\n\n### Bug Fixes\n\n* 修复腾讯云cdn部署无法选择端点的bug ([154409b](https://github.com/certd/certd/commit/154409b1dfee3ea1caae740ad9c1f99a6e7a9814))\n\n## [1.20.2](https://github.com/certd/certd/compare/v1.2.1...v1.20.2) (2024-02-28)\n\n### Bug Fixes\n\n* 临时修复阿里云domainlist接口返回域名列表不全的问题，后续还需要增加翻页查询 ([849c145](https://github.com/certd/certd/commit/849c145926984762bd9dbec87bd91cd047fc0855))\n\n## [1.2.1](https://github.com/certd/certd/compare/v1.2.0...v1.2.1) (2023-12-12)\n\n### Bug Fixes\n\n* 修复邮箱设置无效的bug ([aaa3224](https://github.com/certd/certd/commit/aaa322464d0f65e924d1850995540d396ee24d25))\n\n**Note:** Version bump only for package root\n\n# [1.2.0](https://github.com/certd/certd/compare/v1.1.6...v1.2.0) (2023-10-27)\n\n* 🔱: [client] sync upgrade with 2 commits [trident-sync] ([aa3207f](https://github.com/certd/certd/commit/aa3207fca5f15f7c3da789989d99c8ae7d1c4551))\n\n### BREAKING CHANGES\n\n* search支持自定义布局，search.layout、search.collapse转移到 search.container之下。如果想使用原来的search组件，请配置search.is=fs-search-v1\n\n## [1.1.6](https://github.com/certd/certd/compare/v1.1.5...v1.1.6) (2023-07-10)\n\n### Bug Fixes\n\n* 修复上传证书到腾讯云失败的bug ([e950322](https://github.com/certd/certd/commit/e950322232e19d1263b8552eefa5b0150fd7864e))\n\n## [1.1.5](https://github.com/certd/certd/compare/v1.1.4...v1.1.5) (2023-07-03)\n\n**Note:** Version bump only for package root\n\n## [1.1.4](https://github.com/certd/certd/compare/v1.1.3...v1.1.4) (2023-07-03)\n\n### Bug Fixes\n\n* 成功图标转动的问题 ([f87eee3](https://github.com/certd/certd/commit/f87eee3b9ff1ef9874e79a81fe0ed7104cb9ee8c))\n\n### Performance Improvements\n\n* cancel task ([bc65c0a](https://github.com/certd/certd/commit/bc65c0a786360c087fe95cad93ec6a87804cc5ee))\n* flush log ([891a43a](https://github.com/certd/certd/commit/891a43ae6716ff98ed06643f7da2e35199ee195c))\n* flush logger ([91be682](https://github.com/certd/certd/commit/91be6826b902e0f302b1a6cbdb1d24e15914c18d))\n* timeout ([3eeb1f7](https://github.com/certd/certd/commit/3eeb1f77aa2922f3545f3d2067f561d95621d54f))\n\n## [1.1.3](https://github.com/certd/certd/compare/v1.1.2...v1.1.3) (2023-07-03)\n\n**Note:** Version bump only for package root\n\n## [1.1.2](https://github.com/certd/certd/compare/v1.1.1...v1.1.2) (2023-07-03)\n\n**Note:** Version bump only for package root\n\n## [1.1.1](https://github.com/certd/certd/compare/v1.1.0...v1.1.1) (2023-06-28)\n\n**Note:** Version bump only for package root\n\n# [1.1.0](https://github.com/certd/certd/compare/v1.0.6...v1.1.0) (2023-06-28)\n\n### Bug Fixes\n\n* 修复access选择类型trigger ([2851a33](https://github.com/certd/certd/commit/2851a33eb2510f038fadb55da29512597a4ba512))\n\n### Features\n\n* 权限控制 ([27a4c81](https://github.com/certd/certd/commit/27a4c81c6d70e70abb3892c3ea58d4719988808a))\n* 邮件通知 ([937e3fa](https://github.com/certd/certd/commit/937e3fac19cd03b8aa91db8ba03fda7fcfbacea2))\n* cert download ([5a51c14](https://github.com/certd/certd/commit/5a51c14de521cb8075a80d2ae41a16e6d5281259))\n* config  merge ([fdc25dc](https://github.com/certd/certd/commit/fdc25dc0d795555cffacc4572648ec158988fbbb))\n* save files ([99522fb](https://github.com/certd/certd/commit/99522fb49adb42c1dfdf7bec3dd52d641158285b))\n* save files ([671d273](https://github.com/certd/certd/commit/671d273e2f9136d16896536b0ca127cf372f1619))\n\n## [1.0.6](https://github.com/certd/certd/compare/v1.0.5...v1.0.6) (2023-05-25)\n\n**Note:** Version bump only for package root\n\n## [1.0.5](https://github.com/certd/certd/compare/v1.0.4...v1.0.5) (2023-05-25)\n\n**Note:** Version bump only for package root\n\n## [1.0.4](https://github.com/certd/certd/compare/v1.0.3...v1.0.4) (2023-05-25)\n\n**Note:** Version bump only for package root\n\n## [1.0.3](https://github.com/certd/certd/compare/v1.0.2...v1.0.3) (2023-05-25)\n\n**Note:** Version bump only for package root\n\n## [1.0.2](https://github.com/certd/certd/compare/v1.0.1...v1.0.2) (2023-05-24)\n\n**Note:** Version bump only for package root\n\n## [1.0.1](https://github.com/certd/certd/compare/v1.0.0...v1.0.1) (2023-05-24)\n\n**Note:** Version bump only for package root\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "LICENSE.md",
    "content": "\n                    Certd Open Source License\n                  \n\n- This project is licensed under the **GNU Affero General Public License (AGPL)** with the following additional terms.  \n- 本项目遵循 GNU Affero General Public License（AGPL），并附加以下条款。\n\n## 1. License Terms ( 许可证条款 )\n\n1. **Freedom to Use** (自由使用)\n   - You are free to use, copy, modify, and distribute the source code of this project for personal or organizational use, provided that you comply with the terms of this license.\n   - 您可以自由使用、复制、修改和分发本项目的源代码，前提是您遵循本许可证的条款。\n\n2. **Modification for Personal Use** (个人使用的修改)\n   - Individuals and companies are allowed to modify the project according to their needs for non-commercial purposes. However, modifications to the logo, copyright information, or any code related to licensing are strictly prohibited.\n   - 个人和公司允许根据自身需求对本项目进行修改以供非商业用途。但任何对logo、版权信息或与许可相关代码的修改都是严格禁止的。\n\n3. **Commercial Authorization** (商业授权)\n   - If you wish to make any form of monetary gain from this project, you must first obtain commercial authorization from the original author. Users should contact the author directly to negotiate the relevant licensing terms.\n   - 如果您希望从本项目获得任何形式的经济收益，您必须首先从原作者处获得商业授权，用户应直接与作者联系，以协商相关许可条款。\n \n4. **Retention of Rights** (保留权利)\n   - All rights, title, and interest in the project remain with the original author.\n   - 本项目的所有权利、标题和利益仍归原作者所有。\n\n## 2. As a contributor ( 作为贡献者 )\n   - you should agree that your contributed code:\n   - 您应同意您贡献的代码：\n     1. - The original author can adjust the open-source agreement to be more strict or relaxed.\n        - 原作者可以调整开源协议以使其更严格或更宽松。\n     2. - Can be used for commercial purposes.\n        - 可用于商业用途。\n"
  },
  {
    "path": "README.md",
    "content": "# Certd\n\n[English](./README_en.md) | [中文](./README.md)\n\nCertd® 是一个免费的全自动证书管理系统，让你的网站证书永不过期。   \n后缀d取自linux守护进程的命名风格，意为证书守护进程\n   \n\n>首创流水线申请部署证书模式，已被多个项目“借鉴”，被抄也是一种成功。\n\n> 关于证书续期：\n>* 实际上没有办法不改变证书文件本身情况下直接续期或者续签。\n>* 我们所说的续期，其实就是按照全套流程重新申请一份新证书，然后重新部署上去。\n>* 免费证书过期时间90天，以后可能还会缩短，所以自动化部署必不可少\n\n\n> 流水线数量现已调整为无限制，欢迎大家使用\n\n\n## 一、特性\n本项目不仅支持证书申请过程自动化，还可以自动化部署更新证书，让你的证书永不过期。     \n\n* 全自动申请证书（支持所有注册商注册的域名，支持DNS-01、HTTP-01、CNAME代理等多种域名验证方式）\n* 全自动部署更新证书（目前支持部署到主机、阿里云、腾讯云等70+部署插件）\n* 支持通配符域名/泛域名，支持多个域名打到一个证书上，支持pem、pfx、der、jks等多种证书格式\n* 邮件通知、webhook通知、企微、钉钉、飞书、anpush等多种通知方式\n* 私有化部署，数据保存本地，安装简单快捷，镜像由Github Actions构建，过程公开透明\n* 授权加密，站点隐藏，2FA，密码防爆破等多重安全保障\n* 支持SQLite，PostgreSQL、MySQL多种数据库\n* 开放接口支持\n* 站点证书监控\n* 多用户管理\n* 多语言支持（中英双语切换）\n* 各版本向下兼容，一键无忧升级\n\n\n  ![](./docs/images/intro/intro.svg)\n\n\n## 二、在线体验\n\n官方Demo地址，自助注册后体验    \n\nhttps://certd.handfree.work/\n\n> 注意数据将不定期清理，不定期停止定时任务，生产使用请自行部署    \n> 包含敏感信息，务必自己本地部署进行生产使用\n\n![首页](./docs/images/start/home.png)\n\n## 三、使用教程\n\n仅需3步，让你的证书永不过期\n\n### 1. 创建证书流水线\n![演示](packages/ui/certd-client/public/static/doc/images/1-add.png)\n\n> 添加成功后，就可以直接运行流水线申请证书了\n\n### 2. 添加部署任务\n当然我们一般需要把证书部署到应用上，certd支持海量的部署插件，您可以根据自身实际情况进行选择，比如部署到Nginx、阿里云、腾讯云、K8S、CDN、宝塔、1Panel等等\n\n此处演示部署证书到主机的nginx上    \n![演示](packages/ui/certd-client/public/static/doc/images/5-1-add-host.png)\n\n如果目前的部署插件都无法满足，您也可以手动下载，然后自行部署   \n![演示](packages/ui/certd-client/public/static/doc/images/13-3-download.png)\n\n### 3. 定时运行\n![演示](packages/ui/certd-client/public/static/doc/images/12-1-log-success.png)\n\n\n↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓      \n-------> [点我查看详细使用步骤演示](./step.md)   <--------      \n↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑     \n\n更多教程请访问官方文档 [certd.docmirror.cn](https://certd.docmirror.cn/guide/)\n\n\n\n## 四、私有化部署\n\n由于证书、授权信息等属于高度敏感数据，请务必私有化部署，保障数据安全    \n\n您可以根据实际情况从如下方式中选择一种方式进行私有化部署：\n\n1. 【推荐】[Docker方式部署 ](https://certd.docmirror.cn/guide/install/docker/)\n2. 【推荐】[宝塔面板方式部署 ](https://certd.docmirror.cn/guide/install/docker/)\n3. 【推荐】[1Panel面板方式部署](https://certd.docmirror.cn/guide/install/1panel/)\n4. 【推荐】[雨云一键部署](https://app.rainyun.com/apps/rca/store/6646/?ref=NzExMDQ2_) ： 首充翻倍，每月仅需2.2元    \n[<img src=\"https://rainyun-apps.cn-nb1.rains3.com/materials/deploy-on-rainyun-cn.svg\">](https://app.rainyun.com/apps/rca/store/6646/?ref=NzExMDQ2_)\n5. 【不推荐】[源码方式部署 ](https://certd.docmirror.cn/guide/install/source/)\n\n#### Docker镜像说明：\n* 国内镜像地址:\n  * `registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest`\n  * `registry.cn-shenzhen.aliyuncs.com/handsfree/certd:armv7`、`[version]-armv7`\n* DockerHub地址：\n  * `https://hub.docker.com/r/greper/certd`\n  * `greper/certd:latest`\n  * `greper/certd:armv7`、`greper/certd:[version]-armv7`\n* GitHub Packages地址:\n  * `ghcr.io/certd/certd:latest`\n  * `ghcr.io/certd/certd:armv7`、`ghcr.io/certd/certd:[version]-armv7`\n\n* 镜像构建通过`Actions`自动执行，过程公开透明，请放心使用\n  * [点我查看镜像构建日志](https://github.com/certd/certd/actions/workflows/build-image.yml) \n\n![](./docs/images/action/action-build.jpg)\n\n> 注意：\n> * 本应用存储的证书、授权信息等属于高度敏感数据，请做好安全防护\n> * 请务必使用HTTPS协议访问本应用，避免被中间人攻击\n> * 请务必使用web应用防火墙防护本应用，防止XSS、SQL注入等攻击\n> * 请务必做好服务器本身的安全防护，防止数据库泄露\n> * 请务必做好数据备份，避免数据丢失\n> * [更多安全生产建议点我](https://certd.docmirror.cn/guide/feature/safe/)\n\n\n## 五、生态\n \n###  1.  客户端工具 SSL-Assistant\n`SSL Assistant` 是一个运行于主机上的证书部署管理助手客户端。    \n支持自动扫描主机`Nginx`配置，然后从`Certd`拉取证书并部署。     \n在不想暴露ssh主机密码情况下，该工具非常好用。\n\n开源地址： https://github.com/Youngxj/SSL-Assistant\n\n\n## 六、更多帮助\n请访问官方文档：[https://certd.docmirror.cn/](https://certd.docmirror.cn/guide/)\n\n* 升级方法：[升级方法](https://certd.docmirror.cn/guide/install/upgrade/)\n* 常见问题：[忘记密码](https://certd.docmirror.cn/guide/use/forgotpasswd/)\n* 多数据库：[多数据库配置](https://certd.docmirror.cn/guide/install/database/)\n* 站点安全：[站点安全特性](https://certd.docmirror.cn/guide/feature/safe/)\n* 更新日志：[CHANGELOG](./CHANGELOG.md)\n\n\n## 七、联系作者\n如有疑问，欢迎加入群聊（请备注certd）\n\n| 加群 | 微信群 | QQ群 |\n|---------|-------|-------|\n| 二维码 | <img height=\"230\" src=\"./docs/guide/contact/images/wx.png\"> | <img height=\"230\" src=\"./docs/guide/contact/images/qq.png\"> |\n\n也可以加作者好友\n\n| 加作者好友 | 微信 QQ                                                       |\n|---------|-------------------------------------------------------------|\n| 二维码 | <img height=\"230\" src=\"./docs/guide/contact/images/me.png\"> |\n\n\n## 八、捐赠\n************************\n支持开源，为爱发电，我已入驻爱发电   \nhttps://afdian.com/a/greper\n\n发电权益：\n1. 可加入发电专属群，可以获得作者一对一技术支持\n2. 您的需求我们将优先实现，并且将作为专业版功能提供\n3. 一年期专业版激活码\n\n专业版特权对比\n\n| 功能      | 免费版                                   | 专业版                            |\n|---------|---------------------------------------|--------------------------------|\n| 免费证书申请  | 免费无限制                                 | 免费无限制                          |\n| 域名数量 | 无限制                                   | 无限制                            |\n| 证书流水线条数 | 无限制                                   | 无限制                            |\n| 站点证书监控  | 限制1条                                  | 无限制                            |\n| 自动部署插件  | 阿里云CDN、腾讯云、七牛CDN、主机部署、宝塔、1Panel等大部分插件 | 群晖                             |\n| 通知      | 邮件通知、自定义webhook                       | 邮件免配置、企微、钉钉、飞书、anpush、server酱等 |\n\n\n************************\n\n## 九、贡献代码\n\n1. 本地开发请参考 [贡献插件向导](https://certd.docmirror.cn/guide/development/)\n2. 作为贡献者，代表您同意您贡献的代码如下许可：\n   1. 可以调整开源协议以使其更严格或更宽松。\n   2. 可以用于商业用途。\n\n感谢以下贡献者做出的贡献。\n\n<a href=\"https://github.com/certd/certd/graphs/contributors\">\n  <img src=\"https://contrib.rocks/image?repo=certd/certd\" />\n</a>\n\n## 十、 开源许可\n* 本项目遵循 GNU Affero General Public License（AGPL）开源协议。   \n* 允许个人和公司内部自由使用、复制、修改和分发本项目，未获得商业授权情况下禁止任何形式的商业用途 \n* 未获得商业授权情况下，禁止任何对logo、版权信息及授权许可相关代码的修改。\n* 如需商业授权，请联系作者。\n\n\n## 十一、我的其他项目（求Star）\n\n| 项目名称 | stars  | 项目描述  | \n| --------- |--------- |----------- |\n| [fast-crud](https://gitee.com/fast-crud/fast-crud/)     | <img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/fast-crud/fast-crud?logo=github\"/>   | 基于vue3的crud快速开发框架                 |  \n| [dev-sidecar](https://github.com/docmirror/dev-sidecar/) | <img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/docmirror/dev-sidecar?logo=github\"/> | 直连访问github工具，无需FQ，解决github无法访问的问题 |\n"
  },
  {
    "path": "README_en.md",
    "content": "# Certd\n\n[English](./README_en.md) | [中文](./README.md)\n\nCertd® is a free, fully automated certificate management system that ensures your website certificates never expire. The suffix 'd' is inspired by the naming convention of Linux daemons, representing a certificate daemon.\n\n> We pioneered the pipeline-based certificate application and deployment model, which has been \"referenced\" by multiple projects. Being copied is also a form of success.\n\n> Regarding certificate renewal:\n>* In fact, it's impossible to renew or reissue a certificate without modifying the certificate file itself.\n>* What we refer to as renewal is essentially applying for a new certificate following the full process and redeploying it.\n>* Free certificates expire in 90 days, which may be shortened in the future. Therefore, automated deployment is essential.\n\n> The number of pipelines is now unlimited. Welcome to use it.\n\n## 1. Features\nThis project not only supports automated certificate application but also automated certificate deployment and updates, ensuring your certificates never expire.\n\n* Fully automated certificate application (supports domains registered with all registrars and multiple domain verification methods such as DNS-01, HTTP-01, and CNAME proxy).\n* Fully automated certificate deployment and updates (currently supports deployment to over 70 plugins, including hosts, Alibaba Cloud, Tencent Cloud, etc.).\n* Supports wildcard domains/pan-domains, allows multiple domains in a single certificate, and supports various certificate formats such as pem, pfx, der, and jks.\n* Multiple notification methods, including email, webhook, WeChat Work, DingTalk, Lark, and anpush.\n* On-premises deployment, local data storage, simple and quick installation. Images are built by Github Actions, with a transparent process.\n* Multiple security measures, including authorization encryption, site hiding, 2FA, and password brute-force protection.\n* Supports multiple databases such as SQLite, PostgreSQL, and MySQL.\n* Open API support.\n* Site certificate monitoring.\n* Multi-user management.\n* Multi-language support (Chinese and English switching).\n* Downward compatibility across all versions, with one-click worry-free upgrades.\n\n  ![](./docs/images/intro/intro.svg)\n\n## 2. Online Experience\nVisit the official demo site and register to experience it.\n\nhttps://certd.handfree.work/\n\n> Note: Data will be cleaned up irregularly, and scheduled tasks may be stopped. For production use, please deploy it yourself.\n> The content contains sensitive information. Make sure to deploy it locally for production use.\n\n![Home Page](./docs/images/start/home.png)\n\n## 3. Usage Tutorial\nJust 3 steps to ensure your certificates never expire.\n\n### 1. Create a Certificate Pipeline\n![Demonstration](packages/ui/certd-client/public/static/doc/images/1-add.png)\n\n> After successful addition, you can directly run the pipeline to apply for a certificate.\n\n### 2. Add a Deployment Task\nNormally, we need to deploy certificates to applications. Certd supports a wide range of deployment plugins. You can choose based on your needs, such as deploying to Nginx, Alibaba Cloud, Tencent Cloud, K8S, CDN, Baota, 1Panel, etc.\n\nHere's a demonstration of deploying certificates to a host's Nginx:\n![Demonstration](packages/ui/certd-client/public/static/doc/images/5-1-add-host.png)\n\nIf the current deployment plugins don't meet your needs, you can also download them manually and deploy them yourself.\n![Demonstration](packages/ui/certd-client/public/static/doc/images/13-3-download.png)\n\n### 3. Run Scheduled Tasks\n![Demonstration](packages/ui/certd-client/public/static/doc/images/12-1-log-success.png)\n\n↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓\n-------> [Click here to view detailed usage steps](./step.md) <--------\n↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑\n\nFor more tutorials, please visit the official documentation [certd.docmirror.cn](https://certd.docmirror.cn/guide/).\n\n## 4. On-Premises Deployment\nSince certificates, authorization information, and other data are highly sensitive, please make sure to deploy them on-premises to ensure data security.\n\nYou can choose one of the following deployment methods based on your needs:\n\n1. 【Recommended】[Docker Deployment](https://certd.docmirror.cn/guide/install/docker/)\n2. 【Recommended】[BT Panel Deployment](https://certd.docmirror.cn/guide/install/docker/)\n3. 【Recommended】[1Panel Deployment](https://certd.docmirror.cn/guide/install/1panel/)\n4. 【Recommended】[Rainyun One-Click Deployment](https://app.rainyun.com/apps/rca/store/6646/?ref=NzExMDQ2_): Double your first recharge, only $2.2 per month.\n[<img src=\"https://rainyun-apps.cn-nb1.rains3.com/materials/deploy-on-rainyun-cn.svg\">](https://app.rainyun.com/apps/rca/store/6646/?ref=NzExMDQ2_)\n5. 【Not Recommended】[Source Code Deployment](https://certd.docmirror.cn/guide/install/source/)\n\n#### Docker Image Information:\n* Domestic Image Addresses:\n  * `registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest`\n  * `registry.cn-shenzhen.aliyuncs.com/handsfree/certd:armv7`, `[version]-armv7`\n* DockerHub Addresses:\n  * `https://hub.docker.com/r/greper/certd`\n  * `greper/certd:latest`\n  * `greper/certd:armv7`, `greper/certd:[version]-armv7`\n* GitHub Packages Addresses:\n  * `ghcr.io/certd/certd:latest`\n  * `ghcr.io/certd/certd:armv7`, `ghcr.io/certd/certd:[version]-armv7`\n\n* Images are built automatically by `Actions`, with a transparent process. Please use them with confidence.\n  * [Click here to view image build logs](https://github.com/certd/certd/actions/workflows/build-image.yml)\n\n![](./docs/images/action/action-build.jpg)\n\n> Note:\n> * The certificates, authorization information, and other data stored in this application are highly sensitive. Please take appropriate security measures.\n> * Make sure to use the HTTPS protocol to access this application to avoid man-in-the-middle attacks.\n> * Make sure to use a web application firewall to protect this application from attacks such as XSS and SQL injection.\n> * Make sure to secure the server itself to prevent database leakage.\n> * Make sure to back up your data to avoid data loss.\n> * [Click here for more production safety suggestions](https://certd.docmirror.cn/guide/feature/safe/)\n\n## 5. Ecosystem\n\n### 1. Client Tool: SSL-Assistant\n`SSL Assistant` is a certificate deployment and management assistant client that runs on hosts. It supports automatic scanning of the host's `Nginx` configuration and pulling certificates from `Certd` for deployment. This tool is very useful when you don't want to expose your SSH host password.\n\nOpen-source Address: https://github.com/Youngxj/SSL-Assistant\n\n## 6. More Help\nPlease visit the official documentation: [https://certd.docmirror.cn/](https://certd.docmirror.cn/guide/).\n\n* Upgrade Method: [Upgrade Guide](https://certd.docmirror.cn/guide/install/upgrade/)\n* Common Issues: [Forgot Password](https://certd.docmirror.cn/guide/use/forgotpasswd/)\n* Multi-Database: [Multi-Database Configuration](https://certd.docmirror.cn/guide/install/database/)\n* Site Security: [Site Security Features](https://certd.docmirror.cn/guide/feature/safe/)\n* Changelog: [CHANGELOG](./CHANGELOG.md)\n\n## 7. Contact the Author\nIf you have any questions, feel free to join the group chat (please mention 'certd' in your message).\n\n| Join Group | WeChat Group | QQ Group |\n|---------|-------|-------|\n| QR Code | <img height=\"230\" src=\"./docs/guide/contact/images/wx.png\"> | <img height=\"230\" src=\"./docs/guide/contact/images/qq.png\"> |\n\nYou can also add the author as a friend.\n\n| Add Author as Friend | WeChat QQ |\n|---------|-------|-------|\n| QR Code | <img height=\"230\" src=\"./docs/guide/contact/images/me.png\"> |\n\n## 8. Donation\n************************\nSupport open-source projects and contribute with love. I've joined Afdian.\nhttps://afdian.com/a/greper\n\nBenefits of Contribution:\n1. Join the exclusive contributor group and get one-on-one technical support from the author.\n2. Your requests will be prioritized and implemented as professional edition features.\n3. Receive a one-year professional edition activation code.\n\nComparison of Professional Edition Privileges:\n\n| Feature | Free Edition | Professional Edition |\n|---------|---------------------------------------|--------------------------------|\n| Free Certificate Application | Unlimited for free | Unlimited for free |\n| Number of Domains | Unlimited | Unlimited |\n| Number of Certificate Pipelines | Unlimited | Unlimited |\n| Site Certificate Monitoring | Limited to 1 | Unlimited |\n| Automatic Deployment Plugins | Most plugins such as Alibaba Cloud CDN, Tencent Cloud, QiNiu CDN, Host Deployment, Baota, 1Panel | Synology |\n| Notifications | Email, Custom Webhook | Email without configuration, WeChat Work, DingTalk, Lark, anpush, ServerChan, etc. |\n\n************************\n\n## 9. Contribute Code\n\n1. For local development, please refer to the [Plugin Contribution Guide](https://certd.docmirror.cn/guide/development/).\n2. As a contributor, you agree that your contributed code is subject to the following license:\n   1. The open-source license can be adjusted to be more or less restrictive.\n   2. It can be used for commercial purposes.\n\nThank you to the following contributors.\n\n<a href=\"https://github.com/certd/certd/graphs/contributors\">\n  <img src=\"https://contrib.rocks/image?repo=certd/certd\" />\n</a>\n\n## 10. Open-Source License\n* This project follows the GNU Affero General Public License (AGPL).\n* Individuals and companies are allowed to use, copy, modify, and distribute this project freely for internal use. Any form of commercial use is prohibited without obtaining commercial authorization.\n* Without commercial authorization, any modification of the logo, copyright information, and license-related code is prohibited.\n* For commercial authorization, please contact the author.\n\n## 11. My Other Projects (Please Star)\n\n| Project Name | Stars | Project Description |\n|----------------|---------------|--------------|\n| [fast-crud](https://gitee.com/fast-crud/fast-crud/) | <img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/fast-crud/fast-crud?logo=github\"/> | A fast CRUD development framework based on Vue3. |\n| [dev-sidecar](https://github.com/docmirror/dev-sidecar/) | <img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/docmirror/dev-sidecar?logo=github\"/> | A tool to access GitHub directly without a VPN, solving the problem of inaccessible GitHub. |\n"
  },
  {
    "path": "build-dev.trigger",
    "content": "2\n"
  },
  {
    "path": "build.trigger",
    "content": "23:09\n"
  },
  {
    "path": "deploy.js",
    "content": "import http from 'axios'\nimport fs from 'fs'\n//读取 packages/core/pipline/package.json的版本号\nimport {default as packageJson} from './packages/core/pipeline/package.json' assert { type: \"json\" };\n\nconst certdVersion = packageJson.version\nconsole.log(\"certdVersion\", certdVersion)\n\n// 同步npmmirror的包\nasync function getPackages(directoryPath) {\n    return new Promise((resolve, reject) => {\n        // 读取目录下的文件和目录列表\n        fs.readdir(directoryPath, {withFileTypes: true}, (err, files) => {\n            if (err) {\n                console.log('无法读取目录:', err);\n                reject(err)\n                return;\n            }\n\n            // 过滤仅保留目录\n            const directories = files\n                .filter(file => file.isDirectory())\n                .map(directory => directory.name);\n\n            console.log('目录列表:', directories);\n            resolve(directories)\n        });\n    })\n\n}\n\nasync function getAllPackages() {\n    const base = await getPackages(\"./packages/core\")\n    const plugins = await getPackages(\"./packages/plugins\")\n    const libs = await getPackages(\"./packages/libs\")\n\n    return base.concat(plugins).concat(libs)\n}\n\nasync function sync() {\n    const packages = await getAllPackages()\n    for (const pkg of packages) {\n        await http({\n            url: `http://registry-direct.npmmirror.com/@certd/${pkg}/sync?sync_upstream=true`,\n            method: 'PUT',\n            headers: {\n                \"Content-Type\": \"application/json\"\n            },\n            data: {}\n        })\n        console.log(`sync success:${pkg}`)\n        await sleep(30*1000)\n    }\n}\n\n// curl -X PUT https://registry-direct.npmmirror.com/@certd/plugin-cert/sync?sync_upstream=true\n\nconst certdImageBuild = \"http://flow-openapi.aliyun.com/pipeline/webhook/4zgFk3i4RZEMGuQzlOcI\"\nconst certdImageRun = \"http://flow-openapi.aliyun.com/pipeline/webhook/lzCzlGrLCOHQaTMMt0mG\"\nconst webhooks = [certdImageBuild,certdImageRun]\n\nasync function sleep(time) {\n    return new Promise(resolve => {\n        setTimeout(resolve, time)\n    })\n}\n\nasync function triggerBuild() {\n    await sleep(60000)\n    for (const webhook of webhooks) {\n        await http({\n            url: webhook,\n            method: 'POST',\n            headers: {\n                \"Content-Type\": \"application/json\"\n            },\n            data: {\n                'CERTD_VERSION': certdVersion\n            }\n        })\n        console.log(`webhook success:${webhook}`)\n        await sleep(30*60*1000)\n    }\n\n}\n\nasync function start() {\n    // await build()\n    console.log(\"等待60秒\")\n    await sleep(100* 1000)\n    await sync()\n    await sleep(100 * 1000)\n    await triggerBuild()\n}\n\nstart()\n\n\n/**\n * 打包前 修改 lerna\n * nodemodules里面搜索如下\n * return childProcess.exec(\"git\", [\"add\", \"--\", ...files], execOpts);\n *\n * ('git', ['add', '--', ...files]\n * ('git', ['add', '.']\n */\n"
  },
  {
    "path": "deploy.trigger",
    "content": "5\n"
  },
  {
    "path": "docker/run/docker-compose.yaml",
    "content": "version: '3.3' # 兼容旧版docker-compose\nservices:\n  certd:\n    # 镜像                                                  #  ↓↓↓↓↓ ---- 镜像版本号，建议改成固定版本号,例如：certd:1.29.0\n    image: registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest\n    # image: ghcr.io/certd/certd:latest                    #   --------- 如果 报镜像not found，可以尝试其他镜像源\n    # image: greper/certd:latest\n    container_name: certd # 容器名\n    restart: unless-stopped # 自动重启\n    volumes:\n      #   ↓↓↓↓↓ -------------------------------------------------------- 数据库以及证书存储路径,默认存在宿主机的/data/certd/目录下，【您需要定时备份此目录，以保障数据容灾】\n      #                                                                  只要修改冒号前面的，冒号后面的/app/data不要动\n      - /data/certd:/app/data\n    ports: # 端口映射\n      #  ↓↓↓↓ ---------------------------------------------------------- 如果端口有冲突，可以修改第一个7001为其他不冲突的端口号，第二个7001不要动\n      - \"7001:7001\"\n      #  ↓↓↓↓ ---------------------------------------------------------- https端口，可以根据实际情况，是否暴露该端口\n      - \"7002:7002\"\n    #↓↓↓↓ -------------------------------------------------------------- 如果出现getaddrinfo EAI_AGAIN 或 getaddrinfo ENOTFOUND 错误，可以尝试设置dns\n#    dns:\n#      - 223.5.5.5      # 阿里云公共dns\n#      - 223.6.6.6\n#       # ↓↓↓↓ --------------------------------------------------------- 如果你服务器在腾讯云，可以用这个替换上面阿里云的公共dns\n#      - 119.29.29.29  # 腾讯云公共dns\n#      - 182.254.116.116\n#       # ↓↓↓↓ --------------------------------------------------------- 如果你服务器部署在国外，可以用这个替换上面阿里云的公共dns\n#      - 8.8.8.8       # 谷歌公共dns\n#      - 8.8.4.4\n#    extra_hosts:\n#        # ↓↓↓↓ -------------------------------------------------------- 这里可以配置自定义hosts，外网域名可以指向本地局域网ip地址\n#      - \"localdomain.com:192.168.1.3\"\n#        #         ↓↓↓↓ ------------------------------------------------ 直接使用主机的网络，如果网络问题实在找不到原因，可以尝试打开此参数\n#    network_mode: host\n    labels:\n      com.centurylinklabs.watchtower.enable: \"true\"\n#    ↓↓↓↓ -------------------------------------------------------------- 启用ipv6网络，还需要把下面networks的注释放开\n#    networks:\n#      - ip6net\n    environment:\n#             ↓↓↓↓ ----------------------------------------------------- 使用上海东八时区\n#      - TZ=Asia/Shanghai\n#     设置环境变量即可自定义certd配置\n#     配置项见： packages/ui/certd-server/src/config/config.default.ts\n#     配置规则： certd_ + 配置项, 点号用_代替\n#                                    #↓↓↓↓ ----------------------------- 如果忘记管理员密码，可以设置为true，重启之后，管理员密码将改成123456，然后请及时修改回false\n      - certd_system_resetAdminPasswd=false\n\n#     默认使用sqlite文件数据库，如果需要使用其他数据库，请设置以下环境变量\n#     注意： 选定使用一种数据库之后，不支持更换数据库。\n#     数据库迁移方法：1、使用新数据库重新部署一套，然后将旧数据同步过去，注意flyway_history表的数据不要同步\n#                                    #↓↓↓↓ ----------------------------- 使用postgresql数据库，需要提前创建数据库\n#      - certd_flyway_scriptDir=./db/migration-pg                        # 升级脚本目录\n#      - certd_typeorm_dataSource_default_type=postgres                  # 数据库类型\n#      - certd_typeorm_dataSource_default_host=localhost                 # 数据库地址\n#      - certd_typeorm_dataSource_default_port=5433                      # 数据库端口\n#      - certd_typeorm_dataSource_default_username=postgres              # 用户名\n#      - certd_typeorm_dataSource_default_password=yourpasswd            # 密码\n#      - certd_typeorm_dataSource_default_database=certd                 # 数据库名\n\n#                                    #↓↓↓↓ ----------------------------- 使用mysql数据库，需要提前创建数据库 charset=utf8mb4, collation=utf8mb4_bin\n#      - certd_flyway_scriptDir=./db/migration-mysql                     # 升级脚本目录\n#      - certd_typeorm_dataSource_default_type=mysql                     # 数据库类型， 或者 mariadb\n#      - certd_typeorm_dataSource_default_host=localhost                 # 数据库地址\n#      - certd_typeorm_dataSource_default_port=3306                      # 数据库端口\n#      - certd_typeorm_dataSource_default_username=root                  # 用户名\n#      - certd_typeorm_dataSource_default_password=yourpasswd            # 密码\n#      - certd_typeorm_dataSource_default_database=certd                 # 数据库名\n\n#         ↓↓↓↓ ---------------------------------------------------------  自动升级，上面certd的版本号要保持为latest\n#  certd-updater:  # 添加 Watchtower 服务\n#    image: containrrr/watchtower:latest\n#    container_name: certd-updater\n#    restart: unless-stopped\n#    volumes:\n#      - /var/run/docker.sock:/var/run/docker.sock\n#    # 配置 自动更新\n#    environment:\n#      - WATCHTOWER_CLEANUP=true            # 自动清理旧版本容器\n#      - WATCHTOWER_INCLUDE_STOPPED=false   # 不更新已停止的容器\n#      - WATCHTOWER_LABEL_ENABLE=true       # 根据容器标签进行更新\n#      - WATCHTOWER_POLL_INTERVAL=600       # 每 10 分钟检查一次更新\n\n\n#    ↓↓↓↓ -------------------------------------------------------------- 启用ipv6网络，还需要把上面networks的注释放开\n#networks:\n#  ip6net:\n#    enable_ipv6: true\n#    ipam:\n#      config:\n#        - subnet: 2001:db8::/64\n"
  },
  {
    "path": "docs/.gitignore",
    "content": ".vitepress/cache\ndist"
  },
  {
    "path": "docs/.vitepress/config.ts",
    "content": "import {defineConfig} from \"vitepress\";\n// Import lightbox plugin\nimport lightbox from \"vitepress-plugin-lightbox\";\n\n// https://vitepress.dev/reference/site-config\nexport default defineConfig({\n    title: \"Certd\",\n    titleTemplate: \"开源SSL证书管理工具，证书自动化申请部署，让你的网站证书永不过期\",\n    description: \"Certd帮助文档,Certd是一款开源免费的全自动SSL证书管理工具；证书自动化申请部署流水线；自动证书申请、更新、续期；通配符证书，泛域名证书申请；证书自动化部署到阿里云、腾讯云、主机、群晖、宝塔。\",\n    markdown: {\n        config: (md) => {\n            // Use lightbox plugin\n            md.use(lightbox, {});\n        }\n    },\n    sitemap: {\n        hostname: 'https://certd.docmirror.cn'\n    },\n    head: [\n        // [\n        //     'meta',\n        //     {\n        //         name: 'viewport',\n        //         content:\n        //           'width=device-width,initial-scale=1,minimfast-cum-scale=1.0,maximum-scale=1.0,user-scalable=no',\n        //     },\n        // ],\n        [\"meta\", {\n            name: \"keywords\",\n            content: \"证书自动申请、证书自动更新、证书自动续期、证书自动续签、证书管理工具、Certd、SSL证书自动部署、证书自动化，https证书，pfx证书，der证书，TLS证书，nginx证书自动续签自动部署,SSL平台，证书管理平台，证书流水线\"\n        }],\n        // [\"meta\", { name: \"google-site-verification\",content: \"V5XLTSnXoT15uQotwpxJoQolUo2d5UbSL-TacsyOsC0\"}],\n        //<meta name=\"baidu-site-verification\" content=\"codeva-MiWN8Y07Ua\" />\n        // [\"meta\", {name: \"baidu-site-verification\",content: \"codeva-MiWN8Y07Ua\"}],\n        [\"link\", {rel: \"icon\", href: \"/static/logo/logo.svg\"}]\n    ],\n    themeConfig: {\n        logo: \"/static/logo/logo.svg\",\n        search: {\n            provider: \"local\",\n            options: {\n                detailedView: true,\n                translations: {\n                    button: {\n                        buttonText: \"搜索文档\",\n                        buttonAriaLabel: \"搜索文档\"\n                    },\n                    modal: {\n                        noResultsText: \"无法找到相关结果\",\n                        resetButtonTitle: \"清除查询条件\",\n                        footer: {\n                            selectText: \"选择\",\n                            closeText: \"关闭\",\n                            navigateText: \"切换\"\n                        }\n                    }\n                }\n            }\n        },\n        // https://vitepress.dev/reference/default-theme-config\n        nav: [\n            {text: \"首页\", link: \"/\"},\n            {text: \"指南\", link: \"/guide/\"},\n            {text: \"Demo体验\", link: \"https://certd.handfree.work\"}\n        ],\n        sidebar: {\n            \"/guide/\": [\n                {\n                    text: \"入门\",\n                    items: [\n                        {text: \"简介\", link: \"/guide/\"},\n                        {text: \"快速开始\", link: \"/guide/start.md\"},\n                        {\n                            text: \"私有化部署\",\n                            items: [\n                                {text: \"docker部署\", link: \"/guide/install/docker/\"},\n                                {text: \"宝塔面板部署\", link: \"/guide/install/baota/\"},\n                                {text: \"1Panel部署\", link: \"/guide/install/1panel/\"},\n                                {text: \"群晖部署\", link: \"/guide/use/synology/\"},\n                                {text: \"源码部署\", link: \"/guide/install/source/\"}\n                            ]\n                        },\n                        {text: \"演示教程\", link: \"/guide/tutorial.md\"},\n                        {text: \"版本升级\", link: \"/guide/install/upgrade.md\"}\n                    ]\n                },\n                {\n                    text: \"特性\",\n                    items: [\n                        {text: \"CNAME代理校验\", link: \"/guide/feature/cname/index.md\"},\n                        {text: \"多数据库支持\", link: \"/guide/install/database.md\"},\n                        {text: \"开放接口\", link: \"/guide/open/index.md\"},\n                        {\n                            text: \"站点安全\",  link: \"/guide/feature/safe/\"\n                        },\n                        {\n                            text: \"插件列表\", items: [\n                                {text: \"授权提供商\", link: \"/guide/plugins/access.md\"},\n                                {text: \"DNS提供商\", link: \"/guide/plugins/dns-provider.md\"},\n                                {text: \"任务插件\", link: \"/guide/plugins/deploy.md\"},\n                                {text: \"通知插件\", link: \"/guide/plugins/notification.md\"},\n                            ]\n                        },\n                    ]\n                },\n                {\n                    text: \"常见问题\",\n                    items: [\n                        {text: \"QA\", link: \"/guide/qa/use.md\"},\n                        {text: \"常见报错处理\", link: \"/guide/qa/\"},\n                        {text: \"群晖证书部署\", link: \"/guide/use/synology/\"},\n                        {text: \"腾讯云密钥获取\", link: \"/guide/use/tencent/\"},\n                        {text: \"连接windows主机\", link: \"/guide/use/host/windows.md\"},\n                        {text: \"Google EAB获取\", link: \"/guide/use/google/\"},\n                        {text: \"阿里云相关\", link: \"/guide/use/aliyun/\"},\n                        {text: \"忘记密码\", link: \"/guide/use/forgotpasswd/\"},\n                        {text: \"数据备份\", link: \"/guide/use/backup/\"},\n                        {text: \"Certd本身的证书更新\", link: \"/guide/use/https/index.md\"},\n                        {text: \"js脚本插件使用\", link: \"/guide/use/custom-script/index.md\"},\n                        {text: \"邮箱配置\", link: \"/guide/use/email/index.md\"},\n                        {text: \"IPv6支持\", link: \"/guide/use/setting/ipv6.md\"},\n                        {text: \"ESXi\", link: \"/guide/use/ESXi/index.md\"},\n                    ]\n                },\n                {\n                    text: \"商业版配置\", link: \"/guide/use/comm/\", items: [\n                        {text: \"支付宝配置\", link: \"/guide/use/comm/payments/alipay.md\"},\n                        {text: \"微信支付配置\", link: \"/guide/use/comm/payments/wxpay.md\"},\n                        {text: \"彩虹易支付配置\", link: \"/guide/use/comm/payments/yizhifu.md\"},\n                    ]\n                },\n                {\n                    text: \"其他\",\n                    items: [\n                        {text: \"贡献代码\", link: \"/guide/development/index.md\"},\n                        {text: \"更新日志\", link: \"/guide/changelogs/CHANGELOG.md\"},\n                        {text: \"镜像说明\", link: \"/guide/image.md\"},\n                        {text: \"联系我们\", link: \"/guide/contact/\"},\n                        {text: \"捐赠\", link: \"/guide/donate/\"},\n                        {text: \"开源协议\", link: \"/guide/license/\"},\n                        {text: \"我的其他开源项目\", link: \"/guide/link/\"},\n                    ]\n                }\n            ],\n        },\n\n        socialLinks: [\n            {icon: \"github\", link: \"https://github.com/certd/certd\"}\n        ],\n        footer: {\n            message: \"Certd帮助文档 |  <a href='https://beian.miit.gov.cn/' target='_blank'>粤ICP备14088435号</a> \",\n            copyright: \"Copyright © 2021-present <a href='https://handfree.work/' target='_blank'>handfree.work</a> \"\n        }\n    }\n});\n"
  },
  {
    "path": "docs/.vitepress/theme/Layout.vue",
    "content": "<script setup>\nimport DefaultTheme from \"vitepress/theme\";\nimport { onMounted } from \"vue\";\nimport { useRouter } from \"vitepress\";\nimport mediumZoom from \"medium-zoom\";\n\nconst { Layout } = DefaultTheme;\nconst router = useRouter();\n\n// Setup medium zoom with the desired options\nconst setupMediumZoom = () => {\n  mediumZoom(\"[data-zoomable]\", {\n    background: \"transparent\",\n  });\n};\n\n// Apply medium zoom on load\nonMounted(setupMediumZoom);\n\n// Subscribe to route changes to re-apply medium zoom effect\nrouter.onAfterRouteChanged = setupMediumZoom;\n</script>\n\n<template>\n  <Layout />\n</template>\n\n<style>\n.medium-zoom-overlay {\n  backdrop-filter: blur(5rem);\n}\n\n.medium-zoom-overlay,\n.medium-zoom-image--opened {\n  z-index: 999;\n}\n</style>"
  },
  {
    "path": "docs/.vitepress/theme/index.ts",
    "content": "// https://vitepress.dev/guide/custom-theme\n// import { h } from 'vue'\nimport type { Theme } from 'vitepress'\nimport DefaultTheme from 'vitepress/theme'\nimport './style.css'\nimport Layout from './Layout.vue'\n\nimport { registerAnalytics, siteIds, trackPageview } from './plugins/baidutongji'\nimport { inBrowser } from \"vitepress\";\n\n\nexport default {\n  extends: DefaultTheme,\n  Layout,\n  // Layout: () => {\n  //   return h(DefaultTheme.Layout, null, {\n  //     // https://vitepress.dev/guide/extending-default-theme#layout-slots\n  //   })\n  // },\n  enhanceApp({ app, router, siteData }) {\n    // ...\n    if (inBrowser) {\n      registerAnalytics(siteIds)\n\n      window.addEventListener('hashchange', () => {\n        const { href: url } = window.location\n        trackPageview(siteIds, url)\n      })\n\n      router.onAfterRouteChanged = (to) => {\n        trackPageview(siteIds, to)\n      }\n    }\n  }\n} satisfies Theme\n"
  },
  {
    "path": "docs/.vitepress/theme/plugins/baidutongji.ts",
    "content": "import { inBrowser } from 'vitepress'\n\n/**\n * 统计站点的 ID 列表\n */\nexport const siteIds = 'a6ce877a899ae44292e4f854a53d688e'\n\ndeclare global {\n  interface Window {\n    _hmt: any\n  }\n}\n\n/**\n * 注册统计\n */\nexport function registerAnalytics(siteId: string) {\n  if (!inBrowser)\n    return\n  if (document.querySelector(`#analytics-plugin-${siteId}`))\n    return\n  window._hmt = window._hmt ? window._hmt : []\n  const script = document.createElement('script')\n  script.id = `analytics-${siteId}`\n  script.async = true\n  script.src = `https://hm.baidu.com/hm.js?${siteId}`\n  document.querySelector('head')?.appendChild(script)\n}\n\n/**\n * 上报 PV 数据\n * @param siteId - 站点 ID\n * @param pageUrl - 页面 URL\n */\nexport function trackPageview(siteId: string, pageUrl: string) {\n  if (!inBrowser)\n    return\n  if (!pageUrl || typeof pageUrl !== 'string')\n    pageUrl = '/'\n\n  if (pageUrl.startsWith('http')) {\n    const urlFragment = pageUrl.split('/')\n    const origin = `${urlFragment[0]}//${urlFragment[2]}`\n    pageUrl = pageUrl.replace(origin, '')\n  }\n\n  window._hmt.push(['_setAccount', siteId])\n  window._hmt.push(['_trackPageview', pageUrl])\n}\n"
  },
  {
    "path": "docs/.vitepress/theme/style.css",
    "content": "/**\n * Customize default theme styling by overriding CSS variables:\n * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css\n */\n\n/**\n * Colors\n *\n * Each colors have exact same color scale system with 3 levels of solid\n * colors with different brightness, and 1 soft color.\n * \n * - `XXX-1`: The most solid color used mainly for colored text. It must\n *   satisfy the contrast ratio against when used on top of `XXX-soft`.\n *\n * - `XXX-2`: The color used mainly for hover state of the button.\n *\n * - `XXX-3`: The color for solid background, such as bg color of the button.\n *   It must satisfy the contrast ratio with pure white (#ffffff) text on\n *   top of it.\n *\n * - `XXX-soft`: The color used for subtle background such as custom container\n *   or badges. It must satisfy the contrast ratio when putting `XXX-1` colors\n *   on top of it.\n *\n *   The soft color must be semi transparent alpha channel. This is crucial\n *   because it allows adding multiple \"soft\" colors on top of each other\n *   to create a accent, such as when having inline code block inside\n *   custom containers.\n *\n * - `default`: The color used purely for subtle indication without any\n *   special meanings attached to it such as bg color for menu hover state.\n *\n * - `brand`: Used for primary brand colors, such as link text, button with\n *   brand theme, etc.\n *\n * - `tip`: Used to indicate useful information. The default theme uses the\n *   brand color for this by default.\n *\n * - `warning`: Used to indicate warning to the users. Used in custom\n *   container, badges, etc.\n *\n * - `danger`: Used to show error, or dangerous message to the users. Used\n *   in custom container, badges, etc.\n * -------------------------------------------------------------------------- */\n\n :root {\n  --vp-c-default-1: var(--vp-c-gray-1);\n  --vp-c-default-2: var(--vp-c-gray-2);\n  --vp-c-default-3: var(--vp-c-gray-3);\n  --vp-c-default-soft: var(--vp-c-gray-soft);\n\n  --vp-c-brand-1: var(--vp-c-indigo-1);\n  --vp-c-brand-2: var(--vp-c-indigo-2);\n  --vp-c-brand-3: var(--vp-c-indigo-3);\n  --vp-c-brand-soft: var(--vp-c-indigo-soft);\n\n  --vp-c-tip-1: var(--vp-c-brand-1);\n  --vp-c-tip-2: var(--vp-c-brand-2);\n  --vp-c-tip-3: var(--vp-c-brand-3);\n  --vp-c-tip-soft: var(--vp-c-brand-soft);\n\n  --vp-c-warning-1: var(--vp-c-yellow-1);\n  --vp-c-warning-2: var(--vp-c-yellow-2);\n  --vp-c-warning-3: var(--vp-c-yellow-3);\n  --vp-c-warning-soft: var(--vp-c-yellow-soft);\n\n  --vp-c-danger-1: var(--vp-c-red-1);\n  --vp-c-danger-2: var(--vp-c-red-2);\n  --vp-c-danger-3: var(--vp-c-red-3);\n  --vp-c-danger-soft: var(--vp-c-red-soft);\n}\n\n/**\n * Component: Button\n * -------------------------------------------------------------------------- */\n\n:root {\n  --vp-button-brand-border: transparent;\n  --vp-button-brand-text: var(--vp-c-white);\n  --vp-button-brand-bg: var(--vp-c-brand-3);\n  --vp-button-brand-hover-border: transparent;\n  --vp-button-brand-hover-text: var(--vp-c-white);\n  --vp-button-brand-hover-bg: var(--vp-c-brand-2);\n  --vp-button-brand-active-border: transparent;\n  --vp-button-brand-active-text: var(--vp-c-white);\n  --vp-button-brand-active-bg: var(--vp-c-brand-1);\n}\n\n/**\n * Component: Home\n * -------------------------------------------------------------------------- */\n\n:root {\n  --vp-home-hero-name-color: transparent;\n  --vp-home-hero-name-background: -webkit-linear-gradient(\n    120deg,\n    #bd34fe 30%,\n    #41d1ff\n  );\n\n  --vp-home-hero-image-background-image: linear-gradient(\n    -45deg,\n    #bd34fe 50%,\n    #47caff 50%\n  );\n  --vp-home-hero-image-filter: blur(44px);\n}\n\n@media (min-width: 640px) {\n  :root {\n    --vp-home-hero-image-filter: blur(56px);\n  }\n}\n\n@media (min-width: 960px) {\n  :root {\n    --vp-home-hero-image-filter: blur(68px);\n  }\n}\n\n/**\n * Component: Custom Block\n * -------------------------------------------------------------------------- */\n\n:root {\n  --vp-custom-block-tip-border: transparent;\n  --vp-custom-block-tip-text: var(--vp-c-text-1);\n  --vp-custom-block-tip-bg: var(--vp-c-brand-soft);\n  --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);\n}\n\n/**\n * Component: Algolia\n * -------------------------------------------------------------------------- */\n\n.DocSearch {\n  --docsearch-primary-color: var(--vp-c-brand-1) !important;\n}\n\n"
  },
  {
    "path": "docs/guide/changelogs/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n### Bug Fixes\n\n* 企业微信通知改成text类型，因为markdown类型不支持@用户 ([747d266](https://github.com/certd/certd/commit/747d26674248082e678a3fd5ecc94712641a2716))\n* api接口获取不到证书的bug ([05a33a0](https://github.com/certd/certd/commit/05a33a0ec9999e2802f6c7b23cc1c61a2b9e963d))\n\n### Performance Improvements\n\n* 部署到阿里云oss插件支持选择上传到阿里云cas中的证书 ([2ea2c8c](https://github.com/certd/certd/commit/2ea2c8c05fc40f79595f1bbde67c1413558bf684))\n* 优化子域名托管的说明 ([b15f514](https://github.com/certd/certd/commit/b15f514018b728acb0922ee3f93c1f302eb5d471))\n* 账号即将过期通知 ([e403450](https://github.com/certd/certd/commit/e40345095f31e2fb8e2333a6647466659133fa0c))\n* 子域名托管重复域名不允许添加 ([ffc0c7b](https://github.com/certd/certd/commit/ffc0c7bb7b16d9904fd2d905d1c4e1d4854e92a9))\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n### Bug Fixes\n\n* 修复ssh无法执行命令的bug ([9763cb0](https://github.com/certd/certd/commit/9763cb00e5d95b2fa5d1c2d3d4a8eecac71600e6))\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n### Bug Fixes\n\n* 修复流水线列表页报length错误的bug ([9864792](https://github.com/certd/certd/commit/9864792bbfd149e770d6e1ffa809573694f99dd3))\n* 修复流水线页面状态没有刷新的bug ([93e9498](https://github.com/certd/certd/commit/93e9498b410353f504e11e264db62468895d7290))\n* 修复自定义证书检查时间重启之后不生效的bug ([38e867c](https://github.com/certd/certd/commit/38e867c917bbc68bd228bdd8064f3e7358d6413d))\n\n### Performance Improvements\n\n* 支持上传证书到各种对象存储，oss、cos、七牛、s3、minio等 ([1da8617](https://github.com/certd/certd/commit/1da8617a53a675776635bbc3bcb3c6d7dff83e27))\n* 支持邮箱发送证书 ([95332d5](https://github.com/certd/certd/commit/95332d5db96cd54ddab6ab737332417a09169b39))\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n### Bug Fixes\n\n* 修复某些页面翻译不全显示错误的bug ([0b3158f](https://github.com/certd/certd/commit/0b3158fdd5fe5bb0a98c4e65715dbc3de2c38047))\n* 修复运行流水线后会闪烁一下的bug ([dfc9362](https://github.com/certd/certd/commit/dfc9362084082ee535b898f23b2609c1d946a6fd))\n\n### Performance Improvements\n\n* 部署plesk证书，支持删除未使用的证书 ([902d246](https://github.com/certd/certd/commit/902d246d1a7473ad90f604028c4eb09c8c67d99c))\n* 通知和定时器的删除按钮显示为红色更显眼 ([61ba83c](https://github.com/certd/certd/commit/61ba83c77546c3d505d081e19a3d68c127662bf1))\n* 优化流水线列表页面、详情页面性能，精简返回数据 ([609ac9c](https://github.com/certd/certd/commit/609ac9c9a2dde605eb09834ae59693c1cb238765))\n* 支持自动选择校验方式申请证书 ([3f99432](https://github.com/certd/certd/commit/3f9943270cfb12946e38e6272bc5e8d95ad6ab9e))\n* OpenAPI支持autoApply参数 ([42f4d14](https://github.com/certd/certd/commit/42f4d1477dc791520a874aed56035abcbc8c433b))\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n### Bug Fixes\n\n* 某些插件找不到的bug ([4b3f4a8](https://github.com/certd/certd/commit/4b3f4a868a8b0800c5c59de9d0f47bddc079e7b3))\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n### Bug Fixes\n\n* 修复查看证书对话框翻译错误的bug ([8626b6d](https://github.com/certd/certd/commit/8626b6d9f235c511766f2ae98e0a37f6cebb621c))\n* 修复translation后分组编辑打不开的bug ([46a1b74](https://github.com/certd/certd/commit/46a1b7479923d2feb2dece202a5932b99981b2cd))\n* 执行windows nginx命令时，改为return code判断是否执行成功 ([b37cffd](https://github.com/certd/certd/commit/b37cffd704cd08b8bdd68a6e284706eabe59e78d))\n\n### Performance Improvements\n\n* 优化证书进度条颜色 ([2af91db](https://github.com/certd/certd/commit/2af91dbf2ae36a4ed17c6788bc2a2a79a3bb29f8))\n* 站点证书即将过期通知标题颜色优化为红色 ([80c5331](https://github.com/certd/certd/commit/80c5331a5d4c320323d9b9b800e4ea3b72577b33))\n* 支持部署到阿里云vod ([98da4e1](https://github.com/certd/certd/commit/98da4e1791ed8bb21daf2a9914fda875d14633c9))\n* 支持部署证书到网宿CDN ([c3da026](https://github.com/certd/certd/commit/c3da026b33106f5195959825a68cadbe49efef00))\n* 重置管理员密码同时可以清除管理员的2FA设置 ([1ece091](https://github.com/certd/certd/commit/1ece0915f172d5f8b8adb866434e7efcc5c8c46d))\n* output-selector from参数支持更丰富的过滤规则 ([87853a2](https://github.com/certd/certd/commit/87853a201535f3bfe8505c40f8f5229d82ffcc73))\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n### Bug Fixes\n\n* 修复开放接口添加按钮文本显示问题 ([f93ba99](https://github.com/certd/certd/commit/f93ba9970c12680f38eba2a7abd4b72cf3f5b6a6))\n\n### Performance Improvements\n\n* 优化部署到腾讯TKE插件，支持Opaque类型选择，优化填写说明 ([1445325](https://github.com/certd/certd/commit/144532530a865b634e68539e4888e26f52f73492))\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n### Bug Fixes\n\n* 修复notification编辑按钮无法打开对话框的bug ([0cea26c](https://github.com/certd/certd/commit/0cea26c6287f52adf273b4a525c37bea8555c68c))\n* 优化更新飞牛os证书有效期，修复某些情况下部署证书后飞牛无法访问https的bug ([610c919](https://github.com/certd/certd/commit/610c919c72037becc0ed326f5d5b18c963dfcb3a))\n\n### Performance Improvements\n\n* 证书检查支持自定义dns服务器 ([c53bb7c](https://github.com/certd/certd/commit/c53bb7cf677faa32729709ae0c10359db5194d7a))\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n### Bug Fixes\n\n* 修复通知和触发器无法编辑的bug ([a2e0951](https://github.com/certd/certd/commit/a2e09510426680eb425c0d7ad337f39d3f052054))\n\n### Performance Improvements\n\n* 支持部署到七牛云DCDN ([bde601b](https://github.com/certd/certd/commit/bde601bfffb4f7345d97e1e3b064520816d31555))\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n### Bug Fixes\n\n* 支持自定义证书生成插件 ([481cc02](https://github.com/certd/certd/commit/481cc029fafaf280aa844cd3ca30f4653ec35d55))\n\n### Features\n\n* 支持模版创建流水线 ([2559f0e](https://github.com/certd/certd/commit/2559f0e822db095d1d26a7f1d517622dce22a5c2))\n\n### Performance Improvements\n\n* 阿里云waf cname站点选择支持翻页及域名查询 ([4cf9858](https://github.com/certd/certd/commit/4cf98584dacc5999752732f136246647a2f1f07d))\n* 部署到ssh主机命令支持前置命令 ([991b741](https://github.com/certd/certd/commit/991b741cbe223b342f534157da63b71e81661f8e))\n* 模版导入流水线 ([dcc8c56](https://github.com/certd/certd/commit/dcc8c569693432579709ce63656665a76bcf9a44))\n* 添加用户资料编辑功能 ([7c0f43c](https://github.com/certd/certd/commit/7c0f43c8a3052f73afee3e93c9fcbc43c44ab690))\n* 优化阿里云waf的日志信息 ([821c6d8](https://github.com/certd/certd/commit/821c6d807d4b3cc5092d09a6282b8cbafb9e7c9f))\n* 优化中英文翻译与切换 ([acaa8b1](https://github.com/certd/certd/commit/acaa8b173183b4423584ee070e6e332e0ac0eb2d))\n* 站点IP监控前先同步一下IP ([a080b60](https://github.com/certd/certd/commit/a080b606ab6e289d96b17ef7d2879b4603f889ba))\n* 支持选择运行策略设置 ([60f055f](https://github.com/certd/certd/commit/60f055f293ce237c21cd9050333dad9609eceac1))\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n### Bug Fixes\n\n* 腾讯云授权支持设置是否国际站，部署到EO插件支持国际站 ([5cd3968](https://github.com/certd/certd/commit/5cd3968929acef333cf30d3b20cf21cea6c82c5f))\n* 修复邮箱包含.号校验失败的bug ([65dcae7](https://github.com/certd/certd/commit/65dcae79f8faa7a6cb425e10a0fdb6758b0719f3))\n\n### Performance Improvements\n\n* 首次打开任务日志查看页面，自动滚动到底部 ([43fee42](https://github.com/certd/certd/commit/43fee42198e8697185b427b1fa3eb79409603393))\n* 支持批量修改通知和定时 ([e11b3be](https://github.com/certd/certd/commit/e11b3becfd4abe6547e84d09adc38ebd6e1c4b87))\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n### Performance Improvements\n\n* 支持s3 access做测试 ([f00aeac](https://github.com/certd/certd/commit/f00aeacb8b5c81f0bafa4c1b76723dec2b6b7784))\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n### Bug Fixes\n\n* 修复消息内容存在()<>等括号情况下无法发送tg通知的bug ([c937583](https://github.com/certd/certd/commit/c937583a50d8513d76adead3648f83eee2fcc6f9))\n* 修复重试次数设置无效的bug ([e2099ac](https://github.com/certd/certd/commit/e2099ac9ca344bc70bfa4219002e9138708973ae))\n\n### Performance Improvements\n\n* 授权列表类型颜色优化 ([1e86338](https://github.com/certd/certd/commit/1e863382d3d1a8cc95a1abf51e75bf6eaea3244f))\n* 支持雨云dns解析 ([8354348](https://github.com/certd/certd/commit/83543487e7418683bd79cfe3b9e0d792bdb977f7))\n* 支持雨云dns解析以及雨云证书更新 ([43c7a19](https://github.com/certd/certd/commit/43c7a1984926f5d4647760cc134bb0aede3a7b7a))\n* github 版本检查支持执行脚本 ([bad3504](https://github.com/certd/certd/commit/bad3504d4a15e6989b967b66aa9da8c6981f25bf))\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n### Bug Fixes\n\n* 修复阿里云新加坡clb无法部署证书的bug ([c1fbc8c](https://github.com/certd/certd/commit/c1fbc8cd68ae020ef342e4e92f4d9b4869ca1ead))\n* 修复阿里云新加坡clb无法部署证书的bug ([3e84e11](https://github.com/certd/certd/commit/3e84e116e863b54c6b4d7db160af372dacc5857f))\n* 修复检查github release 插件无法保存最后版本的bug ([a92107c](https://github.com/certd/certd/commit/a92107cc47133883b099d5228b06373e84c8bb50))\n* 修复站点监控定时器多次添加的bug ([9361679](https://github.com/certd/certd/commit/936167972fe83e519bc01a0dd961d9c0635d24ab))\n\n### Performance Improvements\n\n* 阿里云dns操作增加重试机制 ([424fd96](https://github.com/certd/certd/commit/424fd96615c05e949af8c837c261c1400bdffba2))\n* 优化阿里云nlb支持部署扩展证书 ([9cbdfda](https://github.com/certd/certd/commit/9cbdfda829b231733d54c66c5024d46e6fc11af3))\n* 子域名托管帮助链接优化为打开新窗口 ([7c0cdd1](https://github.com/certd/certd/commit/7c0cdd169e2f943e703e433677f2f437d4aa02ee))\n* history增加触发类型显示 ([7f6070c](https://github.com/certd/certd/commit/7f6070c960ed7bf02add5ab36436de6573f2f1fa))\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n### Bug Fixes\n\n* 某些证书提供商的证书确实commonName导致无法转换证书的问题 ([ac87bc5](https://github.com/certd/certd/commit/ac87bc57e957ea4679707bfd38d6840e26319bed))\n* 修复站点监控通知渠道设置无效的bug ([a00453c](https://github.com/certd/certd/commit/a00453c83a58114ce2873dd6e6aaf313f1ce0f87))\n\n### Performance Improvements\n\n* 修改 HTTPS 服务器监听地址 ([e1cf64a](https://github.com/certd/certd/commit/e1cf64ae16d4abfe4299ff16d5088c30cf3c6365))\n* 优化流水线页面，增加下次执行时间、查看证书显示 ([c820315](https://github.com/certd/certd/commit/c8203154094fae3d17198747f49f5f41ddf29a4e))\n* 站点证书监控支持定时设置，重试次数设置 ([d3c2f8e](https://github.com/certd/certd/commit/d3c2f8eb436e670772d14a54acd6b541c5aa3978))\n* 证书申请支持letencrypt profile选项 ([2eb0e54](https://github.com/certd/certd/commit/2eb0e54909d8ad36708e07c12fd598998159bc43))\n* aliyun alb支持部署扩展证书 ([2a19b61](https://github.com/certd/certd/commit/2a19b61b7a78620c06396c2cc37cc77d738b6d12))\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n### Features\n\n* 完善注释 ([6702ca1](https://github.com/certd/certd/commit/6702ca10a17f5d7dbff789b039f7269496f66b97))\n* AWS 中国区 CloudFront 证书部署（IAM 证书） ([8a55bed](https://github.com/certd/certd/commit/8a55beda924b3be2a53b9ba80d9487cefa8bf887))\n* **lego:** support for command options ([b84159f](https://github.com/certd/certd/commit/b84159f2f11531f058837c2e82d66499f3740f20))\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n### Bug Fixes\n\n* 修复用户最大流水线数量校验的问题 ([919f70a](https://github.com/certd/certd/commit/919f70a5fd2842ca69f96f1659bb5a7ba3f73776))\n* 修复中文域名使用cname方式校验无法通过的问题 ([f7d5baa](https://github.com/certd/certd/commit/f7d5baa6d04cb83c572b06e62f885890cfa0143a))\n* 修复cv4pve sdk (proxmox插件连接失败时无法正常结束任务的bug) ([49f26b4](https://github.com/certd/certd/commit/49f26b4049a0549b0270395157e96e8f04a68bc4))\n* 修复flexcdn部署证书的顶级CA名称显示 ([6467edb](https://github.com/certd/certd/commit/6467edb84324d7c80a85212675dbacedc459df83))\n* 修复flexcdn证书commonNames错误的问题 ([ace363f](https://github.com/certd/certd/commit/ace363fa355436e769b27f71cc487d30d6441780))\n\n### Performance Improvements\n\n* 分组选择支持清空选项 ([03e2e99](https://github.com/certd/certd/commit/03e2e9949837b34eb3ea56d14a9e8a5dabc96063))\n* 优化cname检查，当有冲突的cname记录时，给出提示 ([e639a8f](https://github.com/certd/certd/commit/e639a8f9f12640ffcca69f1a6a0324459924afbd))\n* 增加下载日志按钮 ([6ff509d](https://github.com/certd/certd/commit/6ff509d263c0182645b4692c10b5fedb192db964))\n* 站点监控支持批量导入域名和ip ([2d7729d](https://github.com/certd/certd/commit/2d7729dbe98f29088f5f317db2b52cc1ede223a6))\n* 支持设置用户有效期 ([6ac3bc5](https://github.com/certd/certd/commit/6ac3bc564f407dad2cd0b0b0744e887387aa5da3))\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n### Bug Fixes\n\n* **flexcdn:** fix cert upload and skipSslVerify required ([c48da5d](https://github.com/certd/certd/commit/c48da5dea7f0f0cdeae643b106b4a678acc3b14b))\n\n### Performance Improvements\n\n* 阿里云CLB支持部署到扩展域名 ([0e8339c](https://github.com/certd/certd/commit/0e8339c70190890d449099e1d26e5ed06ff135fb))\n* 优化流水线名称过长时的显示 ([6a0cc1b](https://github.com/certd/certd/commit/6a0cc1b1f3ad508f9e4093b3b682b163f12389eb))\n* 支持部署到飞牛OS ([ddfd0fb](https://github.com/certd/certd/commit/ddfd0fb81d6638352920261065f1ab8e27bdd564))\n* 支持日志写入文件 ([37edbf5](https://github.com/certd/certd/commit/37edbf5824d6aaae68ea1ef7259c6f739d418d2c))\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n### Bug Fixes\n\n* 修复Farcdn证书有效期错误的问题 ([1fe4c36](https://github.com/certd/certd/commit/1fe4c367f7128de9ba5e3395ae06bc81e63a7d5a))\n\n### Performance Improvements\n\n* 不止证书自动化，插件解锁无限可能 ([a9b302e](https://github.com/certd/certd/commit/a9b302e38d3328d75df8b2da3d8b914851e55e9c))\n* 邮箱支持保存和选择 ([f7b0b44](https://github.com/certd/certd/commit/f7b0b44ef6044bec36510a6f0b06d8dca5bfce49))\n* 支持github 新版本检查并发布通知 ([356703c](https://github.com/certd/certd/commit/356703c83ea18c6efb8931402e181280d7b7e696))\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n### Bug Fixes\n\n* 更新 1panel API 版本支持v1/v2设置 ([e6195ad](https://github.com/certd/certd/commit/e6195ade3ec54b138825b8d6738f86eb8afdd720))\n* 同步更新namesilo接口，修复无法创建和删除dns记录的问题 ([36b02c2](https://github.com/certd/certd/commit/36b02c2cec145c13d4ef29d49aba5b6b4f697df2))\n* 修复阿里云 esa 证书获取站点列表错误的问题 ([0c2ea5d](https://github.com/certd/certd/commit/0c2ea5da4c836f8a0df132a3f22d399bd9ee1de9))\n* 修复部署到华为cdn，子账号ak查询不到域名的bug ([ebb292a](https://github.com/certd/certd/commit/ebb292a2f7a425c1bc810f59468beb3f1d5bc3f0))\n* 修复证书申请任务无法修改dns提供商类型的bug ([8802274](https://github.com/certd/certd/commit/88022747bebe2054223e0241d68d410771405e68))\n\n### Performance Improvements\n\n* 关闭腾讯云证书通知提醒 ([231a875](https://github.com/certd/certd/commit/231a875bb481420c39bf76ec9ff4e50954ab9fe4))\n* 优化站点选择组件，切换选择时不刷新列表 ([3a14714](https://github.com/certd/certd/commit/3a147141b1a5d67c92a5ce88a5313eaa62859e03))\n* 优化站点ip检查 ([a463711](https://github.com/certd/certd/commit/a463711b03a20120f2a298be15d71ca152d27f21))\n* 站点监控支持监控IP ([9cc4c01](https://github.com/certd/certd/commit/9cc4c017ae646a18284e732769b82636feda01d3))\n* 支持批量重新运行 ([8189982](https://github.com/certd/certd/commit/818998259ddc75e722196ac5c365038818539b9b))\n* farcdn优化 ([a06ef07](https://github.com/certd/certd/commit/a06ef07178ed73c537e21c7d57e5e5144d2c056d))\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n### Performance Improvements\n\n* 优化阿里云DCDN插件，支持多选 ([b091657](https://github.com/certd/certd/commit/b091657b5c537acf2442a2bfc345d0a77f5e2c50))\n* 支持部署到farcdn ([e08cf57](https://github.com/certd/certd/commit/e08cf57b72128998f487ab6469868052fbce0dba))\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n### Bug Fixes\n\n* 修复公共插件配置修改不生效的bug，优化系统设置参数注入时机 ([e1e510c](https://github.com/certd/certd/commit/e1e510ce1e37a5ae82478226b6987a83f22d1ecb))\n* 修复又拍云 CDN 设置证书参数和强制 HTTPS 配置报错的bug ([7984b62](https://github.com/certd/certd/commit/7984b625ba6727132f205db8e25f790bce27b2f7))\n* 修复lego模式下每次都重新申请证书的bug ([f807b8c](https://github.com/certd/certd/commit/f807b8cb465cc329fa034ecbef94e18ef394f870))\n* 优化 RunnableError错误信息展示 ([36bc3ff](https://github.com/certd/certd/commit/36bc3ff22da93ba342c3c1103d7ee2bbcecf44f2))\n* **cert:** 修正证书过期时间计算逻辑 ([a3086e6](https://github.com/certd/certd/commit/a3086e6a5bec8b07f5e1d21a2ca8bd969c75bd5c))\n\n### Performance Improvements\n\n* 二次认证页面中，添加动态验证码输入框的焦点控制，提升用户体验 ([bb22f06](https://github.com/certd/certd/commit/bb22f062ed4ab4b5b71938270fe4cc666af6b8e7))\n* 添加阿里云 ESA证书部署插件 ([1db1ffd](https://github.com/certd/certd/commit/1db1ffde99ac7e4684fa606ebc4c327f829b3a26))\n* 站点证书监控增加通知设置 ([3422a1a](https://github.com/certd/certd/commit/3422a1a59fd0d2c0f17fa9c7e8988ac527ecfdd9))\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n### Performance Improvements\n\n* 1panel增加授权测试按钮 ([566b12f](https://github.com/certd/certd/commit/566b12f5d14ce10e8f5cf1807c58f7bf27f0d199))\n* 优化钉钉通知标题颜色 ([a560999](https://github.com/certd/certd/commit/a560999d13eed18d08dd32ee530166569e3f8746))\n* 优化飞书通知为卡片模式 ([a818a3d](https://github.com/certd/certd/commit/a818a3d293e22fb46979bc77055c05621a6fed81))\n* 支持部署到宝塔aaWAF ([094565c](https://github.com/certd/certd/commit/094565ccd619ef671c6c11ce5fb7fd54a7a21d1c))\n* aaWaf、cdnfly站点选择支持查询 ([8af3463](https://github.com/certd/certd/commit/8af3463668a40b9b99febb02e3b4e0d9d8d719b4))\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n### Bug Fixes\n\n* 修复部署flexcdn问题 ([76b19a4](https://github.com/certd/certd/commit/76b19a4980f8edba5238543b82a7811e1003746c))\n* 修复插件导入的bug ([677fec0](https://github.com/certd/certd/commit/677fec0a0b6fceb4966705e471bbfeeda91610c7))\n* 修复导入在线插件不生效的bug ([fcf8309](https://github.com/certd/certd/commit/fcf8309c238208281ecb4575b2c3cfe50c11d783))\n* 修复自建插件保存丢失部署策略的bug ([863e74d](https://github.com/certd/certd/commit/863e74dd2e3912f950ff5025b5ed0070aeb37035))\n\n### Performance Improvements\n\n* 调整小助手，仅在登录之后显示 ([aebb07c](https://github.com/certd/certd/commit/aebb07c5cc8b1f233b9d203ff017ac60e6971a85))\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n### Performance Improvements\n\n* 宝塔插件、1panel 改成完全免费版 ([a53b6cd](https://github.com/certd/certd/commit/a53b6cd28ff2ce5662ada82379ea44a06b179b81))\n* 添加 FlexCDN 更新证书插件 ([bf040d4](https://github.com/certd/certd/commit/bf040d4c428d29c06fbaca5e29100e0c583b2b0b))\n* 小助手可以关闭 ([3e2101a](https://github.com/certd/certd/commit/3e2101aa5b56548614102e900d59819ce8c7e97c))\n* 支持部署到maoyun cdn ([68f333f](https://github.com/certd/certd/commit/68f333fb87ce85eed27436ecb0f76351c0ccb0d1))\n* 支持AI分析报错 ([aa96859](https://github.com/certd/certd/commit/aa96859798166426e485947a6590464de189de05))\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n### Bug Fixes\n\n* 修复部署到又拍云强制https无效的bug ([2397097](https://github.com/certd/certd/commit/2397097e4ddcb6f593210598e8779ffd44ac3f8f))\n* 修复刷新流水线页面后，日志不自动更新的bug ([0b2e28b](https://github.com/certd/certd/commit/0b2e28b62dd5eb6804c602083e65c87a9d1d72d2))\n\n### Performance Improvements\n\n* 集成智能问答机器人 ([9dd4905](https://github.com/certd/certd/commit/9dd49054d18ec436a5029444ca55a38adc682933))\n* 支持设置网安备案号 ([d18e431](https://github.com/certd/certd/commit/d18e431e2f08e6b37704032c4ea6fbdd8e971442))\n* http方式支持校验443端口 ([d75fcb7](https://github.com/certd/certd/commit/d75fcb7fec421a9a638eaa27fe9378c84b5e0f19))\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n### Bug Fixes\n\n* 根据SOA记录判断子域名托管有缺陷，改回手动配置子域名托管记录的方式 ([1b280a2](https://github.com/certd/certd/commit/1b280a2940f9e2d919b0bf23b89cc185be1fa498))\n* 修复宝塔授权测试按钮显示错误的bug ([048696e](https://github.com/certd/certd/commit/048696ee9386491bb68592fb3a47d1c900bb68bf))\n\n### Performance Improvements\n\n* 支持部署证书到火山dcdn ([5f85219](https://github.com/certd/certd/commit/5f852194953dc1b4e6336770f417507b8f5a33ad))\n* 支持部署证书到unicloud ([a63d687](https://github.com/certd/certd/commit/a63d687f1c573159f0857693f37602b0e1e44072))\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n### Bug Fixes\n\n* 修复二次认证登录进入错误账号的bug ([e3930e0](https://github.com/certd/certd/commit/e3930e07172dd7903cb0f6ff26e0e3e828ba3e77))\n\n### Features\n\n* 从yaml文件注册插件 ([deb3893](https://github.com/certd/certd/commit/deb38938204b29543f36d3266249958faaaa6b66))\n\n### Performance Improvements\n\n* 优化cdnfly插件，支持自动匹配域名部署 ([afd59e9](https://github.com/certd/certd/commit/afd59e9933b2650f41c5d47684c171b93b962065))\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n### Bug Fixes\n\n* 服务器时间获取不准确的bug ([5d10cbf](https://github.com/certd/certd/commit/5d10cbf18daf94a90a7551641a3b13e3c5fec611))\n* 修复复制流水线无效的bug ([3df20a9](https://github.com/certd/certd/commit/3df20a924f32970b052e2588ea20de095f0ea693))\n* 修复http上传方式无法清除记录文件的bug ([72a7b51](https://github.com/certd/certd/commit/72a7b51d479602b2c54c6c3ac8d8a0dcb9664e73))\n* 修复token过期后，疯狂打印token过期信息的bug ([50a5fa1](https://github.com/certd/certd/commit/50a5fa15bb240a125bbc91d2ce1ff3c835888a77))\n\n### Performance Improvements\n\n* 从域名的soa获取主域名，子域名托管无需额外配置 ([a586a92](https://github.com/certd/certd/commit/a586a92d5e32ea846ac37be52a7ad8c328d89966))\n* 七牛oss支持删除过期备份 ([b7113bd](https://github.com/certd/certd/commit/b7113bda2378116d6c116dc583f563cce7cf9f00))\n* 数据库备份支持oss ([308d460](https://github.com/certd/certd/commit/308d4600efe2002f199c33b4594d3071784e58ea))\n* 支持阿里云中文域名申请 ([b3468cf](https://github.com/certd/certd/commit/b3468cf7f28228d7c9cf68de6b5a9bbeb67f2c6d))\n* 支持反向代理增加contextPath路径 ([0088929](https://github.com/certd/certd/commit/0088929622160cc922995de9a563e8061686ff34))\n* 支持中文域名 ([162ebfd](https://github.com/certd/certd/commit/162ebfd4e0c25727efb33952d3bbf7420a02e2c3))\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n### Performance Improvements\n\n* 添加部署证书至火山 Live ([abea80e](https://github.com/certd/certd/commit/abea80e3ab9b1672aebe1c5d5e856693b29931a8))\n* 优化首页插件列表展示 ([9b8f60b](https://github.com/certd/certd/commit/9b8f60b64b5f9a3db7dfa9b3dcbd9201984358d0))\n* 证书申请支持51dns ([8638fc9](https://github.com/certd/certd/commit/8638fc91ff34fccaf12ff9874fd3fa9d2a8c18b7))\n* 支持51dns ([96a0900](https://github.com/certd/certd/commit/96a0900edc95dcfd9acccf9d13592f12f5a09b3d))\n* ssh PTY模式登录设置 ([8385bcc](https://github.com/certd/certd/commit/8385bcc2d7f2411a07748bb5c53f9eaf4d38d7cc))\n* ssh伪终端模式优化，windows下不开启 ([42dfe93](https://github.com/certd/certd/commit/42dfe936b773b7bdd82ca3378363252ffffd7b71))\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n### Bug Fixes\n\n* 上传商用证书，直接粘贴文本报错的问题；修复无法上传ec加密证书的bug ([5750bb7](https://github.com/certd/certd/commit/5750bb706779da274d8e7a87e71416cb64d2df79))\n* 修复下载证书时提示token已过期的问题 ([0e07ae6](https://github.com/certd/certd/commit/0e07ae6ce84dcb9279d3c44060d621566afa593c))\n\n### Performance Improvements\n\n* 更新license时同时绑定url ([78367af](https://github.com/certd/certd/commit/78367af8307f801e778c76d49f0918c21ffe032f))\n* 切换到不同的分组后再打开创建对话框，会自动选择分组 ([893dcd4](https://github.com/certd/certd/commit/893dcd4f2487891199ed3e5a3d47a79a75efc942))\n* 新增部署到火山引擎ALB/CLB、上传到证书中心 ([c9a3e3d](https://github.com/certd/certd/commit/c9a3e3d9d26f964c7af7b56667936f1414fbf42a))\n* 优化/api缓存为0 ([dc05cd4](https://github.com/certd/certd/commit/dc05cd481f186b13375192be965000e6b4b429a5))\n* 优化华为cdn插件引用ccm证书 ([b565b4b](https://github.com/certd/certd/commit/b565b4b3b919b71b98ea2517670bc1ef00e00dc9))\n* 优化证书流水线创建，支持选择分组 ([d613aa8](https://github.com/certd/certd/commit/d613aa8f3e85d8dc475ef1b62d49394ce7fd7d24))\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n### Performance Improvements\n\n* 登录支持双重认证 ([48aef25](https://github.com/certd/certd/commit/48aef25b3f6499d674ca4e4ef16f4c62399fb735))\n* 多重认证登录 ([0f82cf4](https://github.com/certd/certd/commit/0f82cf409bc60706ab07e4ca4f272b9a1ca7eecb))\n* 优化部署到华为云CDN，支持先上传到ccm，再使用证书id部署，修复offline状态下导致部署报错的bug ([79df39a](https://github.com/certd/certd/commit/79df39acabab10ae7e1864dadcdc186bb007a3c5))\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n### Bug Fixes\n\n* 补充类型断言 ([2143dff](https://github.com/certd/certd/commit/2143dff2ae96e6a78bef9f0498e36f8cd9e6941f))\n* 修复腾讯云部署到任意资源插件，无法使用之前已上传的腾讯云证书问题 ([32c714d](https://github.com/certd/certd/commit/32c714d1b6e68c71a74a7452115040c87ac4bfdc))\n\n### Performance Improvements\n\n* 插件支持导入导出 ([cf8abb4](https://github.com/certd/certd/commit/cf8abb45282070c8ba91469f93fd379fabf1f74a))\n* 支持上传证书到华为云CCM ([cfd3b66](https://github.com/certd/certd/commit/cfd3b66be9ebf53a26693057e70ed60c3f116be9))\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n### Bug Fixes\n\n* 修复登录错误次数过多阻止再次登录逻辑 ([bf4d191](https://github.com/certd/certd/commit/bf4d191c8bd2f9209eb6768f662b9c77de99e998))\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n### Bug Fixes\n\n* 修复某些情况下无法输出日志的bug ([70101bf](https://github.com/certd/certd/commit/70101bfa7ade65678d9202c804bbae2cb808b594))\n\n### Performance Improvements\n\n* 修复内置插件分页查询逻辑 ([a2710dd](https://github.com/certd/certd/commit/a2710ddc2525e4e637fd157f0180e6d3b801c8be))\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n### Bug Fixes\n\n* 修复阿里云cdn证书部署失败问题，增加certname参数传入 ([965dc2c](https://github.com/certd/certd/commit/965dc2cb476f690af716f291c6b20ba98be0c8f0))\n* 修复ssh插件报length空指针的bug ([9c4cbe1](https://github.com/certd/certd/commit/9c4cbe17a22b548611cf1fbefecc83a421788e42))\n\n### Performance Improvements\n\n* 镜像支持armv7 ([f78cbed](https://github.com/certd/certd/commit/f78cbed4d817859721fdafe7d348864848d0dfbf))\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n### Bug Fixes\n\n* 升级mysql驱动，支持mysql8最新版本的认证 ([2f5ed3a](https://github.com/certd/certd/commit/2f5ed3aead97641f2c80d692a50226839016df0b))\n* 修复eab授权，没有email绑定的bug ([2f1683b](https://github.com/certd/certd/commit/2f1683b26acebbfb7d6e2d751435be04a4e7cab4))\n\n### Features\n\n* 支持在线自定义插件，无需源码开发 ([d0d9d68](https://github.com/certd/certd/commit/d0d9d68fe6740f6ff49fe40b7c9917c5a2e4b442))\n* **lego:** support set key type ([f3bf4fa](https://github.com/certd/certd/commit/f3bf4faee0be5bdbfdbcf70a502849ed4c8ed4c4))\n* release image to ghcr ([9b536af](https://github.com/certd/certd/commit/9b536af9e656dc89e2a87078c129cad6f591e467))\n\n### Performance Improvements\n\n* 修复tab页缓存问题 ([64e5449](https://github.com/certd/certd/commit/64e5449ab3c6b219b0e89eddad14bfb6b71a0650))\n* 隐藏运行策略选项 ([2951df0](https://github.com/certd/certd/commit/2951df0cd94c23e2efee84ff1b843055aac56cae))\n* 增加手动上传证书功能说明 ([5d083a1](https://github.com/certd/certd/commit/5d083a153637caddbc6f44e915d9fb2d1ae87b33))\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n### Bug Fixes\n\n* 创建cname记录移除域名两端的空格 ([903a413](https://github.com/certd/certd/commit/903a4131ab5f42c8286cd2150ed1032d486fda2f))\n* 修复从本地dns获取记录报错的bug ([c39b1bf](https://github.com/certd/certd/commit/c39b1bf823ddc6216bed2049e4c87e6107def08a))\n\n### Features\n\n* 优化证书申请速度，修复某些情况下letsencrypt 校验失败的问题 ([857589b](https://github.com/certd/certd/commit/857589b365c6f709e0ae67914d2f50ce182e6dd6))\n\n### Performance Improvements\n\n* 优化华为dns解析记录创建和删除问题 ([0948c5b](https://github.com/certd/certd/commit/0948c5bc691d2ee6eb47c72a85da1b7453361878))\n* 又拍云支持云存储 ([9339b78](https://github.com/certd/certd/commit/9339b78f801d193472c0af25749e8e7a27ffb7af))\n* 又拍云支持云存储 ([8449f85](https://github.com/certd/certd/commit/8449f8580da90c1f6b5d02d07c3236ebaf6cf161))\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n### Bug Fixes\n\n* 修复ssh支持键盘事件登录 ([8145808](https://github.com/certd/certd/commit/8145808c4370364377b4ffe3ae88ff465b49f20b))\n\n### Performance Improvements\n\n* 支持部署到京东云cdn ([6f17c70](https://github.com/certd/certd/commit/6f17c700b84965baa01b40fe2abaa0a91bcbaffd))\n* 支持京东云dns申请证书 ([04d79f9](https://github.com/certd/certd/commit/04d79f9117670be504960b018fd49ae3bf7c1c11))\n\n## [1.31.10](https://github.com/certd/certd/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n### Performance Improvements\n\n*  tab增加图标显示 ([a03ae5a](https://github.com/certd/certd/commit/a03ae5a216a1df2c1d3da12ae18dcd0f089a92d3))\n* 升级lego版本到4.22.2 ([4e15556](https://github.com/certd/certd/commit/4e15556e5e8100719497edb1729570d5a29668e1))\n* 优化华为dns接口报错信息输出 ([bf30b7a](https://github.com/certd/certd/commit/bf30b7afaef623dd8126570344f1fcc2c06f1215))\n\n## [1.31.9](https://github.com/certd/certd/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n### Bug Fixes\n\n* 修复华为云dns接口请求出错的bug ([caa15b4](https://github.com/certd/certd/commit/caa15b47355363cbb8847f415ff12363cd53eeda))\n* 修复某些情况下站点证书监控报undefined.includes的错误 ([0b6618f](https://github.com/certd/certd/commit/0b6618ff709322a0eeba78953c8c6e9d073d083a))\n* 修复网站证书监控https port设置无效的bug ([cc8da0c](https://github.com/certd/certd/commit/cc8da0cf130f0c469371b59ac5bd04567f4a4414))\n\n### Performance Improvements\n\n* 站点监控保存时异步检查 ([993bc74](https://github.com/certd/certd/commit/993bc7432fce2d954e9897ed85b54f22150bfc7e))\n* dns支持火山引擎 ([99ff879](https://github.com/certd/certd/commit/99ff879d93658c29ea493a4bde7e9e3f85996d64))\n\n## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n### Bug Fixes\n\n* 修复编辑通知勾选默认，导致出现多个默认通知的bug ([6cd7bdd](https://github.com/certd/certd/commit/6cd7bddc37da8b0d7b9860fd9a26ddfe84c869a7))\n* 修复网站监控无法设置端口的bug ([27a8a57](https://github.com/certd/certd/commit/27a8a57cf52b4bf83d628aa3049be1efaa74f29c))\n* 修复lego模式无法创建流水线的bug ([687bb8a](https://github.com/certd/certd/commit/687bb8a2376d0de7b72739a174e4a9560581f866))\n\n### Performance Improvements\n\n* 优化通知格式 ([c3c5006](https://github.com/certd/certd/commit/c3c5006daa39c20624cb58864f2b92b230a38a7a))\n* 优化scp上传 ([e51123a](https://github.com/certd/certd/commit/e51123a95131cc76d655937488caf08956a67020))\n* 优化txt本地校验效率 ([fd507f2](https://github.com/certd/certd/commit/fd507f269253607e68c5c099c99e0de11636f229))\n* 支持又拍云cdn ([fd0536b](https://github.com/certd/certd/commit/fd0536bd4b41f15b6b5d42e0b447f0dcbf73b8a8))\n* 支持又拍云cdn ([57389a7](https://github.com/certd/certd/commit/57389a79a1a61c45d081712562f8b33c9633158e))\n\n## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n### Performance Improvements\n\n* 增加服务器时间警告 ([d66ade4](https://github.com/certd/certd/commit/d66ade4e4783850b6c7625c6f164a5a0fc0aa509))\n* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))\n\n## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n### Bug Fixes\n\n* 修复dns.la无法申请证书的bug ([90b045a](https://github.com/certd/certd/commit/90b045af6d1a4f46986e4b118885c1f050df067c))\n\n### Performance Improvements\n\n* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))\n* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))\n\n## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n### Bug Fixes\n\n* 修复通知选择器无法选择的bug ([f7b88f9](https://github.com/certd/certd/commit/f7b88f9e3b7d9d9122e4fd2003a20c555bd50c7d))\n* 修复证书流水线创建失败的bug ([736fe03](https://github.com/certd/certd/commit/736fe038ebda56648bcc4c12884a700341d2c049))\n\n## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n### Bug Fixes\n\n* 修复站点监控通知通过webhook发送失败的bug ([9be1ecc](https://github.com/certd/certd/commit/9be1ecc8aab3ea23dd0dc2dab3688f4edb90ef2c))\n* 修复dns.la域名申请失败的bug ([1de8eee](https://github.com/certd/certd/commit/1de8eee6ea8307f3c11626af75303d3cc104bb95))\n\n### Performance Improvements\n\n* 宝塔支持doker站点证书部署 ([589a373](https://github.com/certd/certd/commit/589a373142ef7f50d64d3aa767a90b1f4b64da93))\n* 保存调整后的列宽 ([873f2b6](https://github.com/certd/certd/commit/873f2b618b9d7320045baf69d6da83afe48a780f))\n* 创建证书流水线时，支持更多参数展开 ([36aa7f8](https://github.com/certd/certd/commit/36aa7f82b078a053a102331b3c6f132fb9d492f9))\n* 流水线页面可以鼠标按住左右拖动 ([d85a02f](https://github.com/certd/certd/commit/d85a02feeb3183c5abd6c1ea790d5923a32d7271))\n* 流水线增加上传证书快捷方式 ([425bba6](https://github.com/certd/certd/commit/425bba67c539b734e2a85a83a4f9ecc9b2434fb4))\n* 手动上传证书部署流水线 ([fbb66f3](https://github.com/certd/certd/commit/fbb66f3c4389489aa8a43b194d82bc8cf391607b))\n* 优化选择任务时手机版展示效果 ([d01004d](https://github.com/certd/certd/commit/d01004d53071a75ac91ee21cc96bde9369f77ff3))\n* 站点监控，手动测试也发通知 ([729b19c](https://github.com/certd/certd/commit/729b19c8da60d5efb5baef7cf8df0518e7f6b471))\n* 站点证书监控支持模糊查询 ([0069c0e](https://github.com/certd/certd/commit/0069c0e3992946a8dd6410f299d4fc974ef0e76b))\n* 支持飞书通知 ([b82e1dc](https://github.com/certd/certd/commit/b82e1dcd6217b09a7d7e21cd648bb31de320cadf))\n* 支持手动上传证书并部署 ([a9fffa5](https://github.com/certd/certd/commit/a9fffa5180c83da27b35886aa2e858a92a2c5f94))\n\n## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n### Bug Fixes\n\n* 修复阿里云fc获取不到列表的bug ([474b337](https://github.com/certd/certd/commit/474b3372d8ce98e6d45900bf8046bc0b3f220686))\n\n### Performance Improvements\n\n* 1panel支持 apikey方式授权 ([170b2af](https://github.com/certd/certd/commit/170b2afb0e3b125e4ed057f633fe895b5ac3ac22))\n* 套餐支持3天7天等选项 ([0d71a8e](https://github.com/certd/certd/commit/0d71a8ee501a0e5bb69decf07e8729026e9d85bf))\n* 证书仓库增加有效期显示 ([be87124](https://github.com/certd/certd/commit/be87124ada7a093f281ca29a45c86b4ea4644ead))\n* 支持部署到天翼云CDN ([82a72e0](https://github.com/certd/certd/commit/82a72e0b497efa043d342ad0e33c083a2de79a05))\n* 支持dns.la ([ee8af18](https://github.com/certd/certd/commit/ee8af18d0ac0af82544d6dda1e4b4c678b733041))\n* cf授权支持配置http代理 ([27386ea](https://github.com/certd/certd/commit/27386ea04d3c1a5aebe3cfdd7ac48185eaa76629))\n\n## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n### Bug Fixes\n\n* 修复cname记录查找bug ([95fb4e3](https://github.com/certd/certd/commit/95fb4e3e8be6ca13cc43b451f6141d62190ba453))\n\n## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n### Performance Improvements\n\n* 一些手机端适配优化 ([5b8d5dd](https://github.com/certd/certd/commit/5b8d5dd97536456a9d5d1384216eac1093b2dc3d))\n\n# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n### Bug Fixes\n\n* 修复CDN插件我爱云因更换接口导致部署失败的问题 ([5641c19](https://github.com/certd/certd/commit/5641c19502970f67af19709bddf8c781b1a25bdc))\n* 修复CDN插件我爱云因更换接口导致部署失败的问题 ([0110dfd](https://github.com/certd/certd/commit/0110dfdb70b12dfb0a7a067717f3773ed75aae7c))\n* 修复webhook headers value中带等号是解析错误的bug ([1fe3365](https://github.com/certd/certd/commit/1fe3365e10c464c4c60c82f424cf74fe35b883e0))\n* ProxmoxUploadCert 增加强制部署证书 ([441b15e](https://github.com/certd/certd/commit/441b15ed2fe5a143a5bd5508613b3816ddbff596))\n\n### Performance Improvements\n\n* 历史记录查看详情，可以切换到对应的历史记录日志上去 ([082802e](https://github.com/certd/certd/commit/082802e1197156837800f814728ee0f6b300b18c))\n* 流水线同一个阶段任务优化为并行执行 ([efa9c74](https://github.com/certd/certd/commit/efa9c748c5c07fc950af3db742ef9310f1ac9a4b))\n* 升级midwayjs版本 ([057b0b4](https://github.com/certd/certd/commit/057b0b4565e19bb93195633f767b2942e8e40e59))\n* 是否允许爬虫爬取增加ui设置选项 ([779db9d](https://github.com/certd/certd/commit/779db9da705d2dfef36fec21f52bd38af9fc5f2e))\n* 通知支持钉钉群聊机器人 ([fc8bef5](https://github.com/certd/certd/commit/fc8bef5aae522d75d408d8c3aa74543269da5398))\n* 易支付支持固定支付方式，适合没有收银台版本使用 ([81df96b](https://github.com/certd/certd/commit/81df96bf4542ce8d8ef4a428a4460dd554e4719a))\n* 支持易盾RCDN部署 ([065713c](https://github.com/certd/certd/commit/065713cdb6953d16df08585c316c1a7a8eaec437))\n\n## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n### Performance Improvements\n\n* 禁止爬虫爬取本网站 ([5164116](https://github.com/certd/certd/commit/5164116bde60dabac774cdf94f5317ff386e95ca))\n* 上传到阿里云证书名称后缀增加毫秒时间戳 ([9f0ee21](https://github.com/certd/certd/commit/9f0ee219d02907ffe128a5cf10173397d934ccd7))\n* 支持部署到阿里云FC3.0 ([bcaf54d](https://github.com/certd/certd/commit/bcaf54d4cb7bc469486aae6cdb127ae017eb3abb))\n* 支持新版本LeCDN ([44d43f4](https://github.com/certd/certd/commit/44d43f45cb9094619df7494c2a64a51ba77ad116))\n\n## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package root\n\n## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n### Bug Fixes\n\n* 适配最新版1panel密码编码方式 ([78044c0](https://github.com/certd/certd/commit/78044c062e20cdd04f08baef9fb6745bf25eddcf))\n\n## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n### Bug Fixes\n\n* 修复腾讯云CLB多域名同证书部署报错的bug ([c3a5542](https://github.com/certd/certd/commit/c3a55429357e78f4b78c9592d3e5897db2d4d549))\n* 修复新版本1panel密码需要加密，无法登录的问题 ([ada0b71](https://github.com/certd/certd/commit/ada0b7106e97e551783829e4e719f76793a7123d))\n\n## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n### Bug Fixes\n\n* 当前置任务被删除时进行校验 ([c89686a](https://github.com/certd/certd/commit/c89686a2fda251484930f0ae715417b618c21690))\n* 修复cloudflare删除解析记录报错的bug ([00c2da4](https://github.com/certd/certd/commit/00c2da444f84adb89f3f1226d03294d7c6e3e4f1))\n\n### Performance Improvements\n\n* 上传自定义证书 ([75a38d9](https://github.com/certd/certd/commit/75a38d95f305b4271d9106babe7cffc1c89ae8f3))\n\n## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n### Bug Fixes\n\n* 修复部署到阿里云ALB、NLB插件加载混乱的bug ([6ab83b6](https://github.com/certd/certd/commit/6ab83b662a2c5e715b9cb7eb1244de2ebb7f47b0))\n* 修复腾讯clb重复执行会报错的bug ([e95d29f](https://github.com/certd/certd/commit/e95d29f446d06eced315a3087fc9e105a30b20bd))\n* 修复tg消息内容中存在.和*就会发送失败的bug ([ae5dfc3](https://github.com/certd/certd/commit/ae5dfc3bee950267123ae2fbd1c11e7ce36626ea))\n\n### Performance Improvements\n\n* 创建流水线时，默认成功时也发送通知 ([52ae690](https://github.com/certd/certd/commit/52ae6902d203ca56e0312692b50c55cb6ddd3e39))\n* http方式校验，选择sftp时，支持修改文件访问权限比如777 ([15d6eaf](https://github.com/certd/certd/commit/15d6eaf5532ed25acd4f8d58c429353a2f44206c))\n\n# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n### Bug Fixes\n\n* 修复查看任务日志偶发性无法自动滚动底部的bug ([7e482f7](https://github.com/certd/certd/commit/7e482f798c0142bce1866f84676cb40210f9638a))\n* 修复namesilo ttl太短的问题 ([865f26d](https://github.com/certd/certd/commit/865f26d75c0d3dd4dc8b41448f8830068e45957c))\n\n### Features\n\n* 支持open api接口，根据域名获取证书 ([52a4fd3](https://github.com/certd/certd/commit/52a4fd33180e9b3f71b8dc9f7671d7cd8e448c3b))\n\n### Performance Improvements\n\n* 证书仓库 ([91e7f45](https://github.com/certd/certd/commit/91e7f45a1c5ea1e0ec0aa3236b80028f03a6d0aa))\n* 支持部署到阿里云ALB ([653940a](https://github.com/certd/certd/commit/653940a0ca64fc380178c1b0b58ae0af64dfaf07))\n* 支持部署到阿里云NLB、SLB ([c085bac](https://github.com/certd/certd/commit/c085bac5d877c4250a8a79e17eb8673b8e4fc89c))\n* 支持部署到腾讯云直播 ([417d37b](https://github.com/certd/certd/commit/417d37b199b79a42f790f9edab8f178eedf8fbf7))\n* 支持部署证书到proxmox ([d10795e](https://github.com/certd/certd/commit/d10795ecd97eb8cf2ffa46aabfdbfc6812636396))\n\n## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n### Bug Fixes\n\n* 修复复制到本机插件，pfx格式复制时报错的bug ([f57116d](https://github.com/certd/certd/commit/f57116d2bebf33e47ad93e0b39c4efe8e4aea25c))\n* 修复授权管理，点击了查看原文按钮后，无法修改值的bug ([85c99f7](https://github.com/certd/certd/commit/85c99f7f80761ac6efaf3255c03b933442db1686))\n\n## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n### Bug Fixes\n\n* 修复站点监控域名校验无法通过的bug ([1cb4a53](https://github.com/certd/certd/commit/1cb4a539cc523721ffd4b22d40d0e3d2d68cd915))\n\n### Performance Improvements\n\n* 优化腾讯云CLB插件，支持非sni情况，sni情况支持填写多个域名 ([635b042](https://github.com/certd/certd/commit/635b042690637bff85e97e07c7aac4b87a8a124b))\n\n## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n### Bug Fixes\n\n* 修复系统级授权无法查看密钥的bug ([8644348](https://github.com/certd/certd/commit/8644348fc41ae2e1672f946ca37e5d3a674e0218))\n\n### Performance Improvements\n\n* 优化站点证书检查页面，检查增加3次重试 ([e6dd7cd](https://github.com/certd/certd/commit/e6dd7cd54a3e23897031b5df6e0c3cdc0545d35a))\n* 优化acme sdk ([54db744](https://github.com/certd/certd/commit/54db74428259de64d12230c2ab7353ae11197bbc))\n* 支持http校验方式申请证书 ([405591c](https://github.com/certd/certd/commit/405591c5d08fa1a3b228ee3980199e7731cfec4a))\n* http校验方式，支持七牛云oss、阿里云oss、腾讯云cos ([3f74d4d](https://github.com/certd/certd/commit/3f74d4d9e5f5d0e629b44cff1895b3f7a8fbcafc))\n\n## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n### Bug Fixes\n\n* 修复套餐关闭状态下，仍然限制用户流水线数量的bug ([66fb9e5](https://github.com/certd/certd/commit/66fb9e5f49491f9c159363b48af14720a37673b1))\n\n## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n### Bug Fixes\n\n* 免费套餐支持购买 ([f5ec987](https://github.com/certd/certd/commit/f5ec9870fd6af1f0c9099852bbdb4d07813ccce8))\n* 修复某处金额转换丢失精度的bug ([d2d6f12](https://github.com/certd/certd/commit/d2d6f12218cbe7bd55f4ae082b93084be85f0a7b))\n* 修复新版本小红点显示错误问题 ([fe4786e](https://github.com/certd/certd/commit/fe4786e168afe03a5243dd67971476c348339809))\n\n### Performance Improvements\n\n* 用户创建证书流水线没有购买套餐或者超限时提前报错 ([472f06c](https://github.com/certd/certd/commit/472f06c2d190d0ae48e8b53c18bc278437656a1c))\n* 优化插件名称显示 ([26adf7d](https://github.com/certd/certd/commit/26adf7d437e674385f26a8f92fded6521a620671))\n\n# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n### Bug Fixes\n\n* 修复手机模式下，查询框被文字遮盖的bug ([040788c](https://github.com/certd/certd/commit/040788c793642c3bb2a3ede87fe30fcf3be471bd))\n* 修复左侧菜单收起时无法展开子菜单的bug ([0056223](https://github.com/certd/certd/commit/005622307e612717a5408aa1484717ef03003a22))\n\n### Features\n\n* 基础版不再限制流水线数量 ([cb27d4b](https://github.com/certd/certd/commit/cb27d4b4906b2782eaceb0a95bbdc5d0534370d2))\n* 套餐购买支持易支付、支付宝支付 ([faa28f8](https://github.com/certd/certd/commit/faa28f88f954cba4c1dd29125562e5acd2fd99af))\n* 用户套餐，用户支付功能 ([a019956](https://github.com/certd/certd/commit/a019956698acaf2c4beb620b5ad8c18918ead6a1))\n* 站点证书监控 ([9c8c7a7](https://github.com/certd/certd/commit/9c8c7a781223f4217f45510db1e89495600e3cd5))\n* 支持微信支付 ([45d6347](https://github.com/certd/certd/commit/45d6347f5b6199493b11aabdd74177f6dca2cea4))\n\n### Performance Improvements\n\n* 调整创建证书表单字段的顺序 ([d393521](https://github.com/certd/certd/commit/d3935219f2aa50d6662c5b5ebf7ee25ad696ab2b))\n* 同一时间只允许一个套餐生效 ([8ebf95a](https://github.com/certd/certd/commit/8ebf95a222a900d1707716c7b1f3b39f8a6d8f94))\n* 用户名支持修改 ([89c7f07](https://github.com/certd/certd/commit/89c7f070343e86453c84677ebe1669f9b266d871))\n* 优化证书申请跳过的状态显示，成功通知现在在跳过时不会发送 ([67d762b](https://github.com/certd/certd/commit/67d762b6a520f1fa24719a124e5ae975a81f5f82))\n* 站点证书监控通知发送，每天定时检查 ([bb4910f](https://github.com/certd/certd/commit/bb4910f4e57234e42b44505f4620ae7af66025c5))\n* 支持一体证书 ([53c38cf](https://github.com/certd/certd/commit/53c38cf714a6f7486abbf1d71c9f48f56a790100))\n* 支持plesk网站证书部署 ([eda45c1](https://github.com/certd/certd/commit/eda45c1528199648b3970505e87f492d398226cd))\n\n## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n### Bug Fixes\n\n* 修复证书成功通知发送失败的bug ([0f5c690](https://github.com/certd/certd/commit/0f5c69040ba77340c909813220a26bc7ddada3ea))\n\n### Performance Improvements\n\n* 群晖支持6.x ([79f7ec4](https://github.com/certd/certd/commit/79f7ec4672f4fd5744cc45e4a6f104da943f4026))\n\n## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n### Bug Fixes\n\n* 修复没有配置eab时，报order无法读取的问题 ([657a2ae](https://github.com/certd/certd/commit/657a2ae032e6f61ac27fbdd26c7bf169c041219e))\n* 修复授权被删除后，无法清空的bug ([b45977c](https://github.com/certd/certd/commit/b45977c29a29084c11e496bec3415eaaebafdd74))\n* mysql下access.setting字段改成text ([b7f5740](https://github.com/certd/certd/commit/b7f5740c57743914f754f3b4fdd94b59a2e8338c))\n\n### Performance Improvements\n\n* 点击版本红点按钮，跳转到升级帮助页面 ([454fbda](https://github.com/certd/certd/commit/454fbda581bbe22abca5b91e5086ea9d9d58a020))\n* 通知标题优化 ([ff083ce](https://github.com/certd/certd/commit/ff083ce6848a8bee3c8248e4b881086ae1517c28))\n* 支持腾讯虚拟机开关机([@wujingke](https://github.com/wujingke)) ([8039e8b](https://github.com/certd/certd/commit/8039e8baf83c82d03f1a6198cf61c372026b962b))\n* 支持aws cloudfront ([0ae39f1](https://github.com/certd/certd/commit/0ae39f160a7c6b6696b3bf513d68aa28905810ad))\n\n## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n### Bug Fixes\n\n* 修复创建流水线通知设置无效的bug ([498cf34](https://github.com/certd/certd/commit/498cf34999fddfa24ce088e2e678469fa669abb8))\n* 修复流水线分组可以被所有人看见的bug ([a0e838d](https://github.com/certd/certd/commit/a0e838d1eec918e5dc92fe95dc72ac14facb930e))\n\n### Performance Improvements\n\n* 优化数据表索引 ([228fdf0](https://github.com/certd/certd/commit/228fdf0a0d28013f5dd156a97bbde80537e8e97e))\n* 支持mysql ([7cde1fd](https://github.com/certd/certd/commit/7cde1fdc4a9ed851900d231a5460c8dbfbcd148e))\n\n## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n### Bug Fixes\n\n* 修复cname排查方法 nslookup命令显示黑色的问题 ([3dfeeec](https://github.com/certd/certd/commit/3dfeeec899d7d0d7292695ce410f78548e076c03))\n\n### Performance Improvements\n\n* 通知选择器优化 ([2c0cbdd](https://github.com/certd/certd/commit/2c0cbdd29ecb74cc939b2ae7ee86b8d40f70ba31))\n* 新增七牛云插件分组 ([49e7dc5](https://github.com/certd/certd/commit/49e7dc56e1a95fbdea3e30cdeb945b48415b69e3))\n* 新增server酱3通知 ([6aa4872](https://github.com/certd/certd/commit/6aa487269c9f6862e188b37a0d6c73f79c937d94))\n* 支持邀请奖励 ([618ec93](https://github.com/certd/certd/commit/618ec937866b24ebcf8164db43acb1ed66a5b329))\n* 支持易发云短信 ([94fa77f](https://github.com/certd/certd/commit/94fa77fcd2b9bea294fb05736c0d8cdc81f56103))\n* cname value优化 ([e8c9c2a](https://github.com/certd/certd/commit/e8c9c2a47d47048ae743b16f7bc932dbe18a89e9))\n* favicon支持自定义 ([8b9c47d](https://github.com/certd/certd/commit/8b9c47daf194515006689a212ae9cf586bdf5993))\n\n# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n### Bug Fixes\n\n* 修复自定义webhook contextType的bug ([7e5ea0c](https://github.com/certd/certd/commit/7e5ea0cee003acda952d922ca70592f1e8a2ed80))\n\n### Features\n\n* 手机号登录、邮箱验证码注册 ([7b55337](https://github.com/certd/certd/commit/7b55337c5edb470cca7aa62201eda8d274784004))\n\n### Performance Improvements\n\n* 部署到IIS插件 ([1534f45](https://github.com/certd/certd/commit/1534f4523633265d219d7b3a249a9ea1af99c512))\n* 登录失败增加重试次数限制及冷却时间 ([954b6df](https://github.com/certd/certd/commit/954b6df3608695fe074130f8149a33e311d80cc4))\n* 流水线支持批量修改分组，批量删除 ([a847e66](https://github.com/certd/certd/commit/a847e66c4fc843b98f1520b2b8072d3586ce8b81))\n* 取消docker-compose的dns配置 ([87bbf6f](https://github.com/certd/certd/commit/87bbf6f14080b9fa287c250d7fc4d33279c83ff7))\n* 首页新增修改密码提示 ([0772d3b](https://github.com/certd/certd/commit/0772d3b3fd24afdde4086d9f09ef19d037b431b4))\n* 选项显示图标 ([aedc462](https://github.com/certd/certd/commit/aedc46213571a3bd93809b7af7fa17a08d546237))\n* 优化七牛云cdn，获取域名列表可以选择 ([5a20242](https://github.com/certd/certd/commit/5a20242111d6bd255b25dac86fe1f062c8543096))\n* 优化七牛云cdn部署，保持http2和forceHttp设置，当未开启https时，主动开启https ([196f7d9](https://github.com/certd/certd/commit/196f7d9dc23d7dd96b663c686542e85270b81aef))\n* 优化证书申请成功通知发送方式 ([8002a56](https://github.com/certd/certd/commit/8002a56efc5998aa03db5711ae87f9eb4bc9e160))\n* 支持短信验证码登录 ([387bcc5](https://github.com/certd/certd/commit/387bcc5fa418cdeea81a06da5e3f8cd6b43cd082))\n* 支持威联通证书部署 ([0d8913e](https://github.com/certd/certd/commit/0d8913ea2f56fdebbcc9bb207eae59e8ddbb8cad))\n* 自定义webhook显示详细的错误信息 ([3254afc](https://github.com/certd/certd/commit/3254afc75640eed3729d0fc02a818fefbe5c7fc3))\n\n## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n### Performance Improvements\n\n* 通知支持自定义webhook、anpush、iyuu、server酱 ([cbccd9e](https://github.com/certd/certd/commit/cbccd9e3d0a4c24aba772af62734666d40b22c57))\n* 通知支持vocechat、bark、telegram、discord、slack ([642f57f](https://github.com/certd/certd/commit/642f57ff6d7152a9e14f59c7fc0e32a6b1751fb7))\n\n## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package root\n\n## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n### Bug Fixes\n\n* 修复关键字查询bug ([fab6660](https://github.com/certd/certd/commit/fab66606b35a540fac31fee902331ba1ffdebc16))\n* 修复CNAME时子域名级数超出限制的问题 ([3af6d96](https://github.com/certd/certd/commit/3af6d96e6e353c9b2111cff81679b79c55195a0a))\n\n### Performance Improvements\n\n* 谷歌EAB绑定邮箱改成必填 ([81a8123](https://github.com/certd/certd/commit/81a8123725d7bf4bd6a32a64a066bd760b7b6a7f))\n* 华为云密钥获取提示及访问链接 ([de43391](https://github.com/certd/certd/commit/de43391e4c12dc3ad976f8fa8787f4eb70a41e75))\n* 通知管理 ([d9a00ee](https://github.com/certd/certd/commit/d9a00eeaf72735ced67c59d7983d84e3c730064a))\n* 通知渠道支持测试按钮 ([b54ae27](https://github.com/certd/certd/commit/b54ae272ebc2d31b32b049d44e2299a6be7f153c))\n* 优化插件开发，dnsProvider无需写http logger 变量 ([fcbb5e4](https://github.com/certd/certd/commit/fcbb5e46a112174150a62648319b8224fce3b7ed))\n* 支持部署到阿里云WAF ([c96fcb7](https://github.com/certd/certd/commit/c96fcb7afced979435cffa73591275008033c90d))\n* 支持企业微信群聊机器人通知 ([b805a29](https://github.com/certd/certd/commit/b805a2925984144a31575b8aaa622f0c30d41b56))\n\n## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n### Bug Fixes\n\n* .env 读取 \\r 问题 ([0e33dfa](https://github.com/certd/certd/commit/0e33dfa019a55ea76193c428ec756af386adeb9d))\n* 修复vip试用secret报错的bug ([018dee6](https://github.com/certd/certd/commit/018dee6c383233560f078dfd30f6c2857a7e15ee))\n\n### Performance Improvements\n\n* 当步骤全部都禁用时，任务本身显示删除线 ([9ab9a6e](https://github.com/certd/certd/commit/9ab9a6e8b083e19793894f23e59f29c604ec98e5))\n\n## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n### Bug Fixes\n\n* 修复1Panel面板本身证书更新导致判定执行失败的问题 ([2689e6d](https://github.com/certd/certd/commit/2689e6d6c03aba21da90d5d45232c6ba08696be1))\n* 修复角色无法删除的bug ([66629a5](https://github.com/certd/certd/commit/66629a591aecc2d8364ea415c7afc3f9d0406562))\n* 修复Cname情况下，无法使用DNS类型的bug ([26dad39](https://github.com/certd/certd/commit/26dad399d5768b3205da099ddc11809aef7d6224))\n\n### Performance Improvements\n\n* 日志查看自动滚动到底部 ([4a2f7eb](https://github.com/certd/certd/commit/4a2f7ebf87b7c027cebff7cb763f8f35f6d2aa36))\n* 系统设置中的代理设置优化为可全局生效，环境变量中的https_proxy设置将无效 ([381a37f](https://github.com/certd/certd/commit/381a37fbaa6b61c887eda743897ae00afb825bdf))\n* 新手导航在非编辑模式下不显示 ([18bfcc2](https://github.com/certd/certd/commit/18bfcc24ad0bde57bb04db8a4209861ec6b8ff1d))\n* 优化腾讯云 cloudflare 重复解析记录时的返回值 ([90d1b68](https://github.com/certd/certd/commit/90d1b68bd6cf232fbe085234efe07d29b7690044))\n* 支持namesilo ([80159ec](https://github.com/certd/certd/commit/80159ecca895103d0495f3217311199e66056572))\n* 专业版试用，无需绑定账号 ([c7c4318](https://github.com/certd/certd/commit/c7c4318c11b65a76089787aa58939832d338a232))\n\n## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n### Bug Fixes\n\n* 修复未设置pfx密码，导致jks转换报错的bug ([c3cfbd8](https://github.com/certd/certd/commit/c3cfbd8474155aed4379f91075de37d5d8c73ef0))\n\n### Performance Improvements\n\n* 公共cname服务支持关闭 ([f4ae512](https://github.com/certd/certd/commit/f4ae5125dc4cd97816976779cb3586b5ee78947e))\n\n## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n### Bug Fixes\n\n* 修复偶发性cname一直验证超时的bug ([d2ce72e](https://github.com/certd/certd/commit/d2ce72e4aaacdf726ba8b91fcd71db40a27714ba))\n* 修复邮件配置，忽略证书校验设置不生效的bug ([66a9690](https://github.com/certd/certd/commit/66a9690dc958732e1b3c672d965db502296446f9))\n* 修复ipv6未开启情况下，请求带有ipv6地址域名报ETIMEDOUT的bug ([a9a0967](https://github.com/certd/certd/commit/a9a0967a6f1d0bd27e69f3ec52c31d90d470bc23))\n\n### Performance Improvements\n\n* 修复站点个性化，浏览器标题没有生效的bug ([bcfac02](https://github.com/certd/certd/commit/bcfac02c96ceaf23d1a0b05b48d8047da933beaf))\n* 优化上传到主机插 路径选择，根据证书格式显示 ([8c3f86c](https://github.com/certd/certd/commit/8c3f86c6909ed91f48bb2880e78834e22f6f6a29))\n* 支持jks ([889eaae](https://github.com/certd/certd/commit/889eaaea92818f628b922dae540c026630611707))\n* ipv6支持 ([da6ac16](https://github.com/certd/certd/commit/da6ac1626b3574be2fabeeb18a1f10d60bdcbe49))\n\n## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n### Bug Fixes\n\n* 修复某些容器管理ui无法识别端口列表的bug ([576e60a](https://github.com/certd/certd/commit/576e60a2b52315909e659d2a58cf98b130e69e6f))\n* 修复删除腾讯云过期证书时间判断上的bug，导致已过期仍然没有删除证书 ([1ba1007](https://github.com/certd/certd/commit/1ba10072615015d91b81fc56a3b01dae6a2ae9d1))\n\n### Performance Improvements\n\n* 优化部署到阿里云CDN插件，支持多域名，更易用 ([80c500f](https://github.com/certd/certd/commit/80c500f618b169a1f64c57fe442242a4d0d9d833))\n* 优化流水线页面切换回来不丢失查询条件 ([4dcf6e8](https://github.com/certd/certd/commit/4dcf6e87bc5f7657ce8a56c5331e8723a0fee8ee))\n* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941))\n* 执行历史支持点击查看流水线详情 ([8968639](https://github.com/certd/certd/commit/89686399f90058835435b92872fc236fac990148))\n* 专业版7天试用 ([c58250e](https://github.com/certd/certd/commit/c58250e1f065a9bd8b4e82acc1df754504c0010c))\n\n## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n### Bug Fixes\n\n* 修复头像没有更新的bug ([9b4a31f](https://github.com/certd/certd/commit/9b4a31fa6a32b9cab2e22bd141cf96ca29120445))\n\n### Performance Improvements\n\n* 禁止页面缓存，点击tab页签可以刷新数据 ([7ad4b55](https://github.com/certd/certd/commit/7ad4b55ee000c1dd0747832b11107f32b0ffb889))\n* 优化时间选择器，自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211))\n* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9))\n\n# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n### Bug Fixes\n\n* 修复历史记录不能按名称查询的bug ([6113c38](https://github.com/certd/certd/commit/6113c388b7fc58b11ca19ff05cc1286d096c8d28))\n* pfx兼容windows server 2016 ([e5e468a](https://github.com/certd/certd/commit/e5e468a463f66d02f235de54b7c1e09ace5f1cb1))\n\n### Features\n\n* 首页全新改版 ([63ec5b5](https://github.com/certd/certd/commit/63ec5b5519c760a3330569c0da6dac157302a330))\n\n### Performance Improvements\n\n* 管理控制台数据统计 ([babd589](https://github.com/certd/certd/commit/babd5897ae013ff7c04ebfcbfac8a00d84dd627c))\n* 增加向导 ([6d9ef26](https://github.com/certd/certd/commit/6d9ef26ecab71d752c2c55d75aed4fb5f6c05a39))\n* lego 升级到 4.19.2 ([129bf53](https://github.com/certd/certd/commit/129bf53edc9bbb001fe49fbd7e239bd1d09cc128))\n\n## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n### Bug Fixes\n\n* 修复lego No help topic for 错误 ([aaaf8d7](https://github.com/certd/certd/commit/aaaf8d7db34896cf8f2ff8f12eec1ab0cae58f0f))\n\n### Performance Improvements\n\n* 支持白山云cdn部署 ([b1b2cd0](https://github.com/certd/certd/commit/b1b2cd088b684eda764962abd61754c26a204d1c))\n* 支持华为云cdn ([81a3fdb](https://github.com/certd/certd/commit/81a3fdbc29b71f380762008cc151493ec97458f9))\n\n## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n### Bug Fixes\n\n* 顶部菜单变...的bug ([6dabad7](https://github.com/certd/certd/commit/6dabad76baba96be0f8af36a3fbfb9f5182aecf1))\n\n### Performance Improvements\n\n* 默认证书更新时间设置为35天，增加腾讯云删除过期证书插件，可以避免腾讯云过期证书邮件 ([51b6fed](https://github.com/certd/certd/commit/51b6fed468eaa6f28ce4497ce303ace1a52abb96))\n* 授权加密支持解密查看 ([5575c83](https://github.com/certd/certd/commit/5575c839705f6987ad2bdcd33256b0962c6a9c6a))\n* 重置管理员密码同时启用管理员账户，避免之前禁用了，重置密码还是登录不进去 ([f92d918](https://github.com/certd/certd/commit/f92d918a1e28e29b794ad4754661ea760c18af46))\n\n## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n### Bug Fixes\n\n* 修复阿里云部署大杀器报插件_还未注册错误的bug ([abd2dcf](https://github.com/certd/certd/commit/abd2dcf2e85a545321bae6451406d081f773b132))\n* 修复启动时自签证书无法保存的bug ([526c484](https://github.com/certd/certd/commit/526c48450bcd37b3ccded9b448f17de8140bdc6e))\n\n### Performance Improvements\n\n* 顶部菜单自定义 ([54d136c](https://github.com/certd/certd/commit/54d136cc6ae122f7c891b7a5c7232fe5de8e5cb5))\n* 禁用readonly用户 ([d10d42e](https://github.com/certd/certd/commit/d10d42e20619bb55a50d636b8867ff33db4e3b4b))\n* 限制其他用户流水线数量 ([315e437](https://github.com/certd/certd/commit/315e43746baf01682737f82e41579237a48409af))\n* 用户管理优化头像上传 ([661293c](https://github.com/certd/certd/commit/661293c189a3abf3cdc953b5225192372f57930d))\n\n## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n### Bug Fixes\n\n* 修复对话框全屏按钮与关闭按钮重叠的bug ([95df56c](https://github.com/certd/certd/commit/95df56cc5ca5e3eb843cd17cb7078cde47729f1e))\n* deprecated的运行时不要报错，只报警告 ([bcbefaa](https://github.com/certd/certd/commit/bcbefaaa35cf6d0eec085b3a2c5bfc7c6a8de9e1))\n\n### Performance Improvements\n\n* 更新certd本身的证书文档说明 ([0c50ede](https://github.com/certd/certd/commit/0c50ede129337b82df54575cbd2f4c2a783a0732))\n* 支持同时监听https端口，7002 ([d5a17f9](https://github.com/certd/certd/commit/d5a17f9e6afd63fda2df0981118480f25a1fac2e))\n\n## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n### Performance Improvements\n\n* 部署到阿里云任意云资源，阿里云部署大杀器 ([4075be7](https://github.com/certd/certd/commit/4075be7849b140acb92bd8da8a9acbf4eef85180))\n* 文件名特殊字符限制输入 ([c4164c6](https://github.com/certd/certd/commit/c4164c66e29f3ec799f98108a344806ca61e94ff))\n* 新增部署到百度云CDN插件 ([f126f9f](https://github.com/certd/certd/commit/f126f9f932d37fa01fff1accc7bdd17d349f8db5))\n* 新增部署到腾讯云CDN-v2，推荐使用 ([d782655](https://github.com/certd/certd/commit/d782655cb4dfbb74138178afbffeee76fc755115))\n* 优化cron选择器，增加下次触发时间显示 ([5b148b7](https://github.com/certd/certd/commit/5b148b7ed960ca6f7f5b733b2eadd56eeecbd4c2))\n* 支持部署到腾讯云COS ([a8a45d7](https://github.com/certd/certd/commit/a8a45d7f757820990e278533277a3deda5ba48f3))\n* 支持配置公共ZeroSSL授权 ([a90d1e6](https://github.com/certd/certd/commit/a90d1e68ee9cbc3705223457b8a86f071b150968))\n\n## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n### Bug Fixes\n\n* 申请证书没有使用到系统设置的http代理的bug ([3db216f](https://github.com/certd/certd/commit/3db216f515ba404cb4330fdab452971b22a50f08))\n* 修复移动任务后出现空阶段的bug ([4ea3edd](https://github.com/certd/certd/commit/4ea3edd59e93ca4f5b2e43b20dd4ef33909caddb))\n* 修复google证书*.xx.com与xx.com同时申请时报错的bug ([f8b99b8](https://github.com/certd/certd/commit/f8b99b81a23e7e9fd5e05ebd5caf355c41d67a90))\n* 允许七牛云cdn插件输入.号开头的通配符域名 ([18ee87d](https://github.com/certd/certd/commit/18ee87daff6eafc2201b58e28d85aafd3cb7a5b9))\n\n### Performance Improvements\n\n* 申请证书启用新的反代地址 ([a705182](https://github.com/certd/certd/commit/a705182b85e51157883e48f23463263793bf3c12))\n* 优化日志颜色 ([1291e98](https://github.com/certd/certd/commit/1291e98e821c5b1810aab7f0aebe3f5f5cd44a20))\n* 优化证书申请速度和成功率，反代地址优化，google基本可以稳定请求。增加请求重试。 ([41d9c3a](https://github.com/certd/certd/commit/41d9c3ac8398def541e65351cbe920d4a927182d))\n* 优化pfx密码密码输入框，让浏览器不自动填写密码 ([ffeede3](https://github.com/certd/certd/commit/ffeede38afa70c5ff6f2015516bead23d2c4df87))\n\n## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n### Bug Fixes\n\n* 修复cname服务普通用户access访问权限问题 ([c1e3e2e](https://github.com/certd/certd/commit/c1e3e2ee1f923ee5806479dd5f178c3286a01ae0))\n\n## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n### Bug Fixes\n\n* 修复普通用户无法校验cname配置的bug ([6285497](https://github.com/certd/certd/commit/62854978bf0bdbe749b42f8e40ab227ab31ec92f))\n* 修复切换普通用户登录时，左侧菜单没有同步更新的bug ([12116a8](https://github.com/certd/certd/commit/12116a89f43cf8b98f16d2ea6073f6b72a643215))\n* 修正邮箱设置跳转路由 ([17d8890](https://github.com/certd/certd/commit/17d88900a1f0e3af609b74597f5b1978230db32d))\n\n### Performance Improvements\n\n* 触发证书重新申请input变化对比规则优化，减少升级版本后触发申请证书的情况 ([c46a2a9](https://github.com/certd/certd/commit/c46a2a9a399c2a9a8bb59a48b9fb6e93227cce9b))\n* 任务下所有步骤都跳过时，整个任务显示跳过 ([84fd3b2](https://github.com/certd/certd/commit/84fd3b250dd1161ea06c5582fdadece4b29c2e53))\n* 授权配置去除前后空格 ([57d8d48](https://github.com/certd/certd/commit/57d8d48046fbf51c52b041d2dec03d51fb018587))\n* 数据库备份插件，先压缩再备份 ([304ef49](https://github.com/certd/certd/commit/304ef494fd5787c996ad0dcb6edd2f517afce9e2))\n* 优化菜单 ([1f4f157](https://github.com/certd/certd/commit/1f4f15757de1015cf7563f7022599eef58cc93d7))\n* 增加文档站 https://certd.docmirror.cn ([6e2ac1c](https://github.com/certd/certd/commit/6e2ac1c089f6ddccb396f1f2738509c05333e1bb))\n\n## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n### Bug Fixes\n\n* 修复无法设置角色的bug ([02fe704](https://github.com/certd/certd/commit/02fe704769edb25fea5ffd85a51a5530864b37b3))\n\n### Performance Improvements\n\n* 角色删除安全 ([28bb485](https://github.com/certd/certd/commit/28bb4856bee03569153f6471527c9b9f28cb3d14))\n* 密钥备份 ([1c6028a](https://github.com/certd/certd/commit/1c6028abcf8849163462bb2f8441b6838357e09b))\n* 证书直接查看 ([5dde5bd](https://github.com/certd/certd/commit/5dde5bd3f76db3959d411619d29bfb8064e3b307))\n* sqlite数据库备份插件 ([77f1631](https://github.com/certd/certd/commit/77f163144f7dcfb0431475c55508fecfd6d969f8))\n\n## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n### Bug Fixes\n\n* 修复siteInfo每次都要重新设置的bug ([36b26ae](https://github.com/certd/certd/commit/36b26ae9f5c7a53c1c2546fb79b2ea451b854abf))\n\n## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n### Bug Fixes\n\n* 修复排序失效的bug ([1f0742e](https://github.com/certd/certd/commit/1f0742ef9f0caae0c7e713acf0fd3cebf5d63875))\n\n## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n### Bug Fixes\n\n* 修复版本号获取错误的bug ([8851870](https://github.com/certd/certd/commit/8851870400df86e496198ad509061b8989fcc44f))\n\n## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n### Performance Improvements\n\n* [comm] 支持插件管理 ([e8b617b](https://github.com/certd/certd/commit/e8b617b80ce882dd63006f0cfc719a80a1cc6acc))\n* 新增代理设置功能 ([273ab61](https://github.com/certd/certd/commit/273ab6139f5807f4d7fe865cc353b97f51b9a668))\n* EAB授权支持绑定邮箱，支持公共EAB设置 ([07043af](https://github.com/certd/certd/commit/07043aff0ca7fd29c56dd3c363002cb15d78b464))\n\n## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n### Performance Improvements\n\n* 优化系统设置加载时机 ([7396253](https://github.com/certd/certd/commit/73962536d5a4769902d760d005f3f879465addcc))\n\n## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n### Bug Fixes\n\n* 修复某些情况下bindUrl失败的bug ([91fc1cd](https://github.com/certd/certd/commit/91fc1cd7353be4a22be951239ed70b38baebc74e))\n\n### Performance Improvements\n\n* 邮箱设置改为系统设置，普通用户无需配置发件邮箱 ([4244569](https://github.com/certd/certd/commit/42445692117184a3293e63bef84a74cbb5984b0e))\n\n## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package root\n\n# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n### Bug Fixes\n\n* 修复管理员编辑其他用户流水线任务时归属userid也被修改的bug ([e85c477](https://github.com/certd/certd/commit/e85c47744cf740b4af3b93dca7c2f0ccc818ec2f))\n* 修复历史记录根据流水线名称查询报错的bug ([ce9a986](https://github.com/certd/certd/commit/ce9a9862f122fce2186e7727eaa4b251b59e6032))\n* 修复某些代理情况下 报 400 The plain HTTP request was sent to HTTPS port use proxy 的bug ([a13203f](https://github.com/certd/certd/commit/a13203fb3f48c427d0d81a504912248dcc07df1a))\n\n### Features\n\n* 域名验证方法支持CNAME间接方式，此方式支持所有域名注册商，且无需提供Access授权，但是需要手动添加cname解析 ([f3d3508](https://github.com/certd/certd/commit/f3d35084ed44f9f33845f7045e520be5c27eed93))\n* 站点个性化设置 ([11a9fe9](https://github.com/certd/certd/commit/11a9fe9014d96cba929e5a066e78f2af7ae59d14))\n\n### Performance Improvements\n\n* 并行任务名称改成添加任务，取消并行，可以在同一个阶段获取上一个task的输出 ([c5e5877](https://github.com/certd/certd/commit/c5e58770d1c5edc19c6f9ea1618f44b68e091f35))\n* 调整静态资源到static目录 ([0584b36](https://github.com/certd/certd/commit/0584b3672b40f9042a2ed87e5627022606d046cd))\n* 调整全部静态资源到static目录 ([a218890](https://github.com/certd/certd/commit/a21889080d6c7ffdf0af526a3a21f0b2d1c77288))\n* 检查cname是否正确配置 ([b5d8935](https://github.com/certd/certd/commit/b5d8935159374fbe7fc7d4c48ae0ed9396861bdd))\n* 七牛云cdn支持配置多个域名 ([88d745e](https://github.com/certd/certd/commit/88d745e29063a089864fb9c6705be7b8d4c2669a))\n* 上传到主机插件支持注入环境变量 ([81fac73](https://github.com/certd/certd/commit/81fac736f9ccc8d1cda7ef4178752239cec20849))\n* 优化宝塔网站部署插件远程获取数据的提示 ([2a3ca9f](https://github.com/certd/certd/commit/2a3ca9f552d96594ec6690a1c4c91f598451b9a1))\n* 优化缩短首页缓存时间 ([49395e8](https://github.com/certd/certd/commit/49395e8cb65f4b30c0145329ed5de48be4ef3842))\n* 域名输入增加校验提示，避免输入错误的域名 ([0c8e83e](https://github.com/certd/certd/commit/0c8e83e1254a9ce4d5a4e7888eb1710394a4b77c))\n* cname校验配置增加未校验通过提示 ([77cc3c4](https://github.com/certd/certd/commit/77cc3c4a5cbd81f8233a8e0bb33fab0621c0905f))\n* google eab授权支持自动获取，不过要配置代理 ([592791d](https://github.com/certd/certd/commit/592791d1356fc252fbb70d7f168567aee9585507))\n\n## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)\n\n### Bug Fixes\n\n* 修复西部数码账户级别apikey不可用的bug ([f8f3e8b](https://github.com/certd/certd/commit/f8f3e8b43fd5d815887bcb53b95f46dc96424b79))\n\n### Performance Improvements\n\n* 增加等待插件 ([3ef0541](https://github.com/certd/certd/commit/3ef0541cc85ab6abf698ead3b258ae1ac156ef98))\n\n## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)\n\n### Bug Fixes\n\n* 修复pfxPassword无效的bug ([251e450](https://github.com/certd/certd/commit/251e450fabfe62405bac13e39f2153736c081ef0))\n\n### Performance Improvements\n\n* 群晖获取deviceid优化 ([8d42273](https://github.com/certd/certd/commit/8d4227366548eb70f6bc04303829e6933168f906))\n\n## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)\n\n### Bug Fixes\n\n* 修复某些地区被屏蔽无法激活专业版的bug ([7532a96](https://github.com/certd/certd/commit/7532a960851b84d4f2cc3dba02353c5235e1a364))\n\n### Performance Improvements\n\n* 上传到主机，支持socks代理 ([d91026d](https://github.com/certd/certd/commit/d91026dc4fbfe5fedc4ee8e43dc0d08f1cf88356))\n* 支持上传到七牛云oss ([bf024bd](https://github.com/certd/certd/commit/bf024bdda8bc2a463475be5761acf0da7317a08a))\n\n## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)\n\n### Bug Fixes\n\n* 修复中间证书复制错误的bug ([76e86ea](https://github.com/certd/certd/commit/76e86ea283ecbe4ec76cdc92b98457d0fef544ac))\n\n### Performance Improvements\n\n* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))\n* 增加使用教程 ([9d9c021](https://github.com/certd/certd/commit/9d9c0218195af5b9896cce7109b26a433480571d))\n\n## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)\n\n**Note:** Version bump only for package root\n\n## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)\n\n### Bug Fixes\n\n* 修复启动报授权验证失败的bug ([3460d3d](https://github.com/certd/certd/commit/3460d3ddca222ea702816ab805909d489eff957f))\n\n## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)\n\n### Bug Fixes\n\n* 修复upload to host trim错误 ([0f0ddb9](https://github.com/certd/certd/commit/0f0ddb9c5963fd643d6d203334efac471c43ec3b))\n\n## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)\n\n**Note:** Version bump only for package root\n\n## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)\n\n**Note:** Version bump only for package root\n\n# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)\n\n### Bug Fixes\n\n* 修复首次创建任务运行时不自动设置当前运行情况的bug ([ecd83ee](https://github.com/certd/certd/commit/ecd83ee136abdd3df9ed2f21ec2ff0f24c0ed9d9))\n\n### Features\n\n* 账号绑定 ([e046640](https://github.com/certd/certd/commit/e0466409d0c021bb415abd94df448c8a0d4799e9))\n* 支持中间证书 ([e86756e](https://github.com/certd/certd/commit/e86756e4c65a53dd23106d7ecbfe2fa987cc13f3))\n* 支持vip转移 ([361e8fe](https://github.com/certd/certd/commit/361e8fe7ae5877e23fd5de31bc919bedd09c57f5))\n\n### Performance Improvements\n\n* 群晖支持OTP双重验证登录 ([8b8039f](https://github.com/certd/certd/commit/8b8039f42bbce10a4d0e737cdeeeef9bb17bee5a))\n* 任务支持禁用 ([8ed16b3](https://github.com/certd/certd/commit/8ed16b3ea2dfe847357863a0bfa614e4fa5fc041))\n* 优化收件邮箱输入 ([22ef28f](https://github.com/certd/certd/commit/22ef28f6338a78465bd52ccbad13e66e80263b2f))\n* 优化主机登录失败提示 ([9de77b3](https://github.com/certd/certd/commit/9de77b327d39cff5ed6660ec53b58ba0eea18e5a))\n* 增加重启certd插件 ([48238d9](https://github.com/certd/certd/commit/48238d929e6c4afa1d428e4d35b9159d37a47ae0))\n* 证书支持旧版RSA，pkcs1 ([3d9c3ec](https://github.com/certd/certd/commit/3d9c3ecb3eb604b2458154f608bde0f01915d116))\n* 支持阿里云ACK证书部署 ([d331fea](https://github.com/certd/certd/commit/d331fea47789122650e057ec7c9e85ee8e66f09b))\n* 支持七牛云 ([8ecc2f9](https://github.com/certd/certd/commit/8ecc2f9446a9ebd11b9bfbffbb6cf7812a043495))\n* 支持k8s ingress secret ([e5a5d0a](https://github.com/certd/certd/commit/e5a5d0a607bb6b4e1a1f7a1a419bada5f2dee59f))\n* http请求增加默认超时时间 ([664bd86](https://github.com/certd/certd/commit/664bd863e5b4895aabe2384277c0c65f5902fdb2))\n* plugins增加图标 ([a8da658](https://github.com/certd/certd/commit/a8da658a9723342b4f43a579f7805bfef0648efb))\n\n## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09)\n\n### Bug Fixes\n\n* 修复腾讯云cdn证书部署后会自动关闭hsts，http2.0等配置的bug ([7908ab7](https://github.com/certd/certd/commit/7908ab79da624c94fa05849925b15e480e3317c4))\n* 修复腾讯云tke证书部署报错的bug ([653f409](https://github.com/certd/certd/commit/653f409d91a441850d6381f89a8dd390831f0d5e))\n\n### Performance Improvements\n\n* 插件选择支持搜索 ([d1498a7](https://github.com/certd/certd/commit/d1498a71601b74d38343b1d070eadd03705dd9d5))\n* 前置任务步骤增加错误提示 ([ae3daa9](https://github.com/certd/certd/commit/ae3daa9bcf4fc363825aad9b77f5d3879aeeff70))\n* 群晖部署教程 ([0f0af2f](https://github.com/certd/certd/commit/0f0af2f309390f388e7a272cea3a1dd30c01977d))\n* 支持群晖 ([5c270b6](https://github.com/certd/certd/commit/5c270b6b9d45a2152f9fdb3c07bd98b7c803cb8e))\n\n## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06)\n\n### Performance Improvements\n\n* 支持多吉云cdn证书部署 ([65ef685](https://github.com/certd/certd/commit/65ef6857296784ca765926e09eafcb6fc8b6ecde))\n\n## [1.24.2](https://github.com/certd/certd/compare/v1.24.1...v1.24.2) (2024-09-06)\n\n### Bug Fixes\n\n* 修复复制流水线出现的各种问题 ([6314e8d](https://github.com/certd/certd/commit/6314e8d7eb58cd52e2a7bd3b5ffb9112b0b69577))\n* 修复windows下无法执行第二条命令的bug ([71ac8aa](https://github.com/certd/certd/commit/71ac8aae4aa694e1a23761e9761c9fba30b43a21))\n\n### Performance Improvements\n\n* 阶段、任务、步骤全面支持拖动排序 ([bd73a16](https://github.com/certd/certd/commit/bd73a163cd0497f062bd424ddc6bc9bbc95f81ea))\n* 任务配置不需要的字段可以自动隐藏 ([192d9dc](https://github.com/certd/certd/commit/192d9dc7e36737d684c769f255f407c28b1152ac))\n* 任务支持拖动排序 ([1e9b563](https://github.com/certd/certd/commit/1e9b5638aa36a8ce70019a9c750230ba41938327))\n* 西部数据支持用户级的apikey ([1c17b41](https://github.com/certd/certd/commit/1c17b41e160944b073e1849e6f9467c3659a4bfc))\n* 修复windows下无法执行第二条命令的bug ([d5bfcdb](https://github.com/certd/certd/commit/d5bfcdb6de1dcc1702155442e2e00237d0bbb6e5))\n* 优化跳过处理逻辑 ([b80210f](https://github.com/certd/certd/commit/b80210f24bf5db1c958d06ab27c9e5d3db452eda))\n* 支持阿里云oss ([87a2673](https://github.com/certd/certd/commit/87a2673e8c33dff6eda1b836d92ecc121564ed78))\n* 支持西部数码DNS ([c59cab1](https://github.com/certd/certd/commit/c59cab1aaeb19f86df8e3e0d8127cbd0a9ef77f3))\n* 支持pfx、der ([fbeaed2](https://github.com/certd/certd/commit/fbeaed203519f59b6d9396c4e8953353ccb5e723))\n* client 请求超时时间延长为10s ([ff46771](https://github.com/certd/certd/commit/ff46771d8dd43e71c1ca70e3ba783945750342cc))\n\n## [1.24.1](https://github.com/certd/certd/compare/v1.24.0...v1.24.1) (2024-09-02)\n\n### Bug Fixes\n\n* 激活仅限管理员 ([1c17970](https://github.com/certd/certd/commit/1c17970b981f0987c506744ee6b2283fd5e40493))\n* 修复在没有勾选使用代理的情况下，仍然会使用代理的bug ([0f66794](https://github.com/certd/certd/commit/0f6679425f6a736bb0128527dd99c085fac17d84))\n\n### Performance Improvements\n\n* 部署插件支持宝塔、易盾云等 ([ee61709](https://github.com/certd/certd/commit/ee617095efa1171548cf52fd45f0f98a368555a3))\n* 授权配置支持加密 ([42a56b5](https://github.com/certd/certd/commit/42a56b581d754c3e5f9838179d19ab0d004ef2eb))\n* 优化内存占用 ([db61033](https://github.com/certd/certd/commit/db6103363364440b650bc10bb334834e4a9470c7))\n* 支持阿里云 DCDN ([98b77f8](https://github.com/certd/certd/commit/98b77f80843834616fb26f83b4c42245326abd06))\n* 支持已跳过的步骤重新运行 ([ea775ad](https://github.com/certd/certd/commit/ea775adae18d57a04470cfba6b9460d761d74035))\n* 支持cdnfly ([724a850](https://github.com/certd/certd/commit/724a85028b4a7146c9e3b4df4497dcf2a7bf7c67))\n* 支持ftp上传 ([b9bddbf](https://github.com/certd/certd/commit/b9bddbfabb5664365f1232e9432532187c98006c))\n\n# [1.24.0](https://github.com/certd/certd/compare/v1.23.1...v1.24.0) (2024-08-25)\n\n### Bug Fixes\n\n* 部署到腾讯云cdn选择证书任务步骤限制只能选证书 ([3345c14](https://github.com/certd/certd/commit/3345c145b802170f75a098a35d0c4b8312efcd17))\n* 修复成功后跳过之后丢失腾讯云证书id的bug ([37eb762](https://github.com/certd/certd/commit/37eb762afe25c5896b75dee25f32809f8426e7b7))\n* 修复创建流水线后立即运行时报no id错误的bug ([17ead54](https://github.com/certd/certd/commit/17ead547aab25333603980304aa3aad3db1f73d5))\n* 修复使用代理的情况下申请证书失败的bug ([95122e2](https://github.com/certd/certd/commit/95122e28609333f4df55c266e5434897954c0fb3))\n* 修复执行日志没有清理的bug ([22a3363](https://github.com/certd/certd/commit/22a336370a88a7df2a23c967043bae153da71ed5))\n* 修复重置密码参数配置后无效的bug ([e358a88](https://github.com/certd/certd/commit/e358a8869696578687306e4cd0dcda53f898fe13))\n* 修复ssh无法连接成功，无法执行命令的bug ([41b9837](https://github.com/certd/certd/commit/41b9837582323fb400ef8525ce65e8b37ad4b36f))\n\n### Features\n\n* 支持ECC类型 ([a7424e0](https://github.com/certd/certd/commit/a7424e02f5c7e02ac1688791040785920ce67473))\n* 支持google证书申请（需要使用代理） ([a593056](https://github.com/certd/certd/commit/a593056e79e99dd6a74f75b5eab621af7248cfbe))\n\n### Performance Improvements\n\n* 更新k8s底层api库 ([746bb9d](https://github.com/certd/certd/commit/746bb9d385e2f397daef4976eca1d4782a2f5ebd))\n* 优化成功后跳过的提示 ([7b451bb](https://github.com/certd/certd/commit/7b451bbf6e6337507f4627b5a845f5bd96ab4f7b))\n* 优化证书申请成功率 ([968c469](https://github.com/certd/certd/commit/968c4690a07f69c08dcb3d3a494da4e319627345))\n* 优化dnspod的token id 说明 ([790bf11](https://github.com/certd/certd/commit/790bf11af06d6264ef74bc1bb919661f0354239a))\n* email proxy ([453f1ba](https://github.com/certd/certd/commit/453f1baa0b9eb0f648aa1b71ccf5a95b202ce13f))\n\n## [1.23.1](https://github.com/certd/certd/compare/v1.23.0...v1.23.1) (2024-08-06)\n\n### Bug Fixes\n\n* 修复模糊查询无效的bug ([9355917](https://github.com/certd/certd/commit/93559174c780173f0daec7cdbd1f72f8d5c504d5))\n\n### Performance Improvements\n\n* 优化插件字段的default value ([24c7be2](https://github.com/certd/certd/commit/24c7be2c9cb39c14f7a97b674127c88033280b02))\n* 优化默认值设置 ([1af19f0](https://github.com/certd/certd/commit/1af19f0ac053fe109782882964533636b5969d6b))\n\n# [1.23.0](https://github.com/certd/certd/compare/v1.22.9...v1.23.0) (2024-08-05)\n\n### Bug Fixes\n\n* 修复环境变量多个下划线不生效的bug ([7ec2218](https://github.com/certd/certd/commit/7ec2218c9fee5bee2bf0aa31f3e3a4301575f247))\n\n### Features\n\n* use node 20 ([e8ed972](https://github.com/certd/certd/commit/e8ed97206bf28e83f942db2ef4ea07fa76fd3567))\n\n## [1.22.9](https://github.com/certd/certd/compare/v1.22.8...v1.22.9) (2024-08-05)\n\n### Performance Improvements\n\n* 优化定时任务 ([87e440e](https://github.com/certd/certd/commit/87e440ee2a8b10dc571ce619f28bc83c1e5eb147))\n\n## [1.22.8](https://github.com/certd/certd/compare/v1.22.7...v1.22.8) (2024-08-05)\n\n### Performance Improvements\n\n* 修复删除历史记录没有删除log的bug，新增history管理页面，演示站点启动时不自动启动非管理员用户的定时任务 ([f78ae93](https://github.com/certd/certd/commit/f78ae93eedfe214008c3d071ca3d77c962137a64))\n* 优化pipeline删除时，删除其他history ([b425203](https://github.com/certd/certd/commit/b4252033d56a9ad950f3e204ff021497c3978015))\n\n## [1.22.7](https://github.com/certd/certd/compare/v1.22.6...v1.22.7) (2024-08-04)\n\n### Bug Fixes\n\n* 修复保存配置报id不能为空的bug ([367f807](https://github.com/certd/certd/commit/367f80731396003416665c22853dfbc09c2c03a0))\n\n## [1.22.6](https://github.com/certd/certd/compare/v1.22.5...v1.22.6) (2024-08-03)\n\n### Bug Fixes\n\n* 修复在相同的cron时偶尔无法触发定时任务的bug ([680941a](https://github.com/certd/certd/commit/680941af119619006b592e3ab6fb112cb5556a8b))\n* 修复pg下pipeline title 类型问题 ([a9717b9](https://github.com/certd/certd/commit/a9717b9a0df7b5a64d4fe03314fecad4f59774cc))\n\n### Performance Improvements\n\n* 流水线支持名称模糊查询 ([59897c4](https://github.com/certd/certd/commit/59897c4ceae992ebe2972ca9e8f9196616ffdfd7))\n* 腾讯云clb支持更多大区选择 ([e4f4570](https://github.com/certd/certd/commit/e4f4570b29f26c60f1ee9660a4c507cbeaba3d7e))\n* 优化前置任务输出为空的提示 ([6ed1e18](https://github.com/certd/certd/commit/6ed1e18c7d9c46d964ecc6abc90f3908297b7632))\n\n## [1.22.5](https://github.com/certd/certd/compare/v1.22.4...v1.22.5) (2024-07-26)\n\n### Bug Fixes\n\n* 修复用户管理无法添加用户的bug ([e7e89b8](https://github.com/certd/certd/commit/e7e89b8de7386e84c0d6b8e217e2034909657d68))\n\n## [1.22.4](https://github.com/certd/certd/compare/v1.22.3...v1.22.4) (2024-07-26)\n\n### Performance Improvements\n\n* 证书申请支持反向代理，letsencrypt无法访问时的备用方案 ([b7b5df0](https://github.com/certd/certd/commit/b7b5df0587e0f7ea288c1b2af6f87211f207395f))\n* 支持arm64 ([fa14f87](https://github.com/certd/certd/commit/fa14f87a8093ef3addc5e5f3315ce1bfc9982782))\n\n## [1.22.3](https://github.com/certd/certd/compare/v1.22.2...v1.22.3) (2024-07-25)\n\n### Bug Fixes\n\n* lege 无执行权限问题 ([338eb3b](https://github.com/certd/certd/commit/338eb3bdfeb461e9b3bc7eee97b97a59f5642ffe))\n\n## [1.22.2](https://github.com/certd/certd/compare/v1.22.1...v1.22.2) (2024-07-23)\n\n### Bug Fixes\n\n* 修复创建流水线时，无法根据dns类型默认正确的dns授权的bug ([a2c43b5](https://github.com/certd/certd/commit/a2c43b50a6069ed48958fd142844a8568c2af452))\n\n## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20)\n\n### Performance Improvements\n\n* 创建证书任务可以选择lege插件 ([affef13](https://github.com/certd/certd/commit/affef130378030c517250c58a4e787b0fc85d7d1))\n* 创建证书任务增加定时任务和邮件通知输入 ([427620d](https://github.com/certd/certd/commit/427620d34f3b8ad6933005faf1878908441a2453))\n* 支持配置启动后自动触发一次任务 ([a5a0c1f](https://github.com/certd/certd/commit/a5a0c1f6e7a3f05e581005e491d5b102ee854412))\n\n# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)\n\n### Features\n\n* 升级midway，支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))\n* 支持lego，海量DNS提供商 ([0bc6d0a](https://github.com/certd/certd/commit/0bc6d0a211920fb0084d705e1db67ee1e7262c44))\n* 支持postgresql ([3b19bfb](https://github.com/certd/certd/commit/3b19bfb4291e89064b3b407a80dae092d54747d5))\n\n### Performance Improvements\n\n* 优化一些小细节 ([b168852](https://github.com/certd/certd/commit/b1688525dbbbfd67e0ab1cf5b4ddfbe9d394f370))\n* 增加备案号设置 ([bd3d959](https://github.com/certd/certd/commit/bd3d959944db63a5690b55ee150e1007133868b9))\n* 自动生成jwtkey，无需手动配置 ([390e485](https://github.com/certd/certd/commit/390e4853a570390a97df6a3b3882579f9547eeb4))\n\n## [1.21.2](https://github.com/certd/certd/compare/v1.21.1...v1.21.2) (2024-07-08)\n\n### Performance Improvements\n\n* 申请证书时可以选择跳过本地dns校验 ([fe91d94](https://github.com/certd/certd/commit/fe91d94090d22ed0a3ea753ba74dfaa1bf057c17))\n\n## [1.21.1](https://github.com/certd/certd/compare/v1.21.0...v1.21.1) (2024-07-08)\n\n### Performance Improvements\n\n* 上传到主机，支持设置不mkdirs ([5ba9831](https://github.com/certd/certd/commit/5ba9831ed1aa6ec6057df246f1035b36b9c41d2e))\n* 说明优化，默认值优化 ([970c7fd](https://github.com/certd/certd/commit/970c7fd8a0f557770e973d8462ee5684ef742810))\n\n# [1.21.0](https://github.com/certd/certd/compare/v1.20.17...v1.21.0) (2024-07-03)\n\n### Features\n\n* 支持zero ssl ([eade2c2](https://github.com/certd/certd/commit/eade2c2b681569f03e9cd466e7d5bcd6703ed492))\n\n## [1.20.17](https://github.com/certd/certd/compare/v1.20.16...v1.20.17) (2024-07-03)\n\n### Performance Improvements\n\n* 创建dns解析后，强制等待60s ([f47b35f](https://github.com/certd/certd/commit/f47b35f6d5bd7d675005c3e286b7e9a029201f8b))\n* 文件上传提示由cert.crt改为cert.pem ([a09b0e4](https://github.com/certd/certd/commit/a09b0e48c176f3ed763791bd50322c29729f7c1c))\n* 优化cname verify ([eba333d](https://github.com/certd/certd/commit/eba333de7a5b5ef4b0b7eaa904f578720102fa61))\n\n## [1.20.16](https://github.com/certd/certd/compare/v1.20.15...v1.20.16) (2024-07-01)\n\n### Bug Fixes\n\n* 修复配置了cdn cname后申请失败的bug ([4a5fa76](https://github.com/certd/certd/commit/4a5fa767edc347d03d29a467e86c9a4d70b0220c))\n\n## [1.20.15](https://github.com/certd/certd/compare/v1.20.14...v1.20.15) (2024-06-28)\n\n### Bug Fixes\n\n* 修复无法强制取消任务的bug ([9cc01db](https://github.com/certd/certd/commit/9cc01db1d569a5c45bb3e731f35d85df324a8e62))\n\n### Performance Improvements\n\n* 腾讯云dns provider 支持腾讯云的accessId ([e0eb3a4](https://github.com/certd/certd/commit/e0eb3a441384d474fe2923c69b25318264bdc9df))\n* 支持windows文件上传 ([7f61cab](https://github.com/certd/certd/commit/7f61cab101fa13b4e88234e9ad47434e6130fed2))\n\n## [1.20.14](https://github.com/certd/certd/compare/v1.20.13...v1.20.14) (2024-06-23)\n\n### Bug Fixes\n\n* 修复修改密码功能异常问题 ([f740ff5](https://github.com/certd/certd/commit/f740ff517f521dce361284c2c54bccc68aee0ea2))\n\n## [1.20.13](https://github.com/certd/certd/compare/v1.20.12...v1.20.13) (2024-06-18)\n\n### Bug Fixes\n\n* 日志高度越界 ([c4c9adb](https://github.com/certd/certd/commit/c4c9adb8bfd513f57252e523794e3799a9b220f8))\n* 修复邮箱设置页面SMTP拼写错误的问题 ([b98f1c0](https://github.com/certd/certd/commit/b98f1c0dd0bc6c6b4f814c578692afdf6d90b88d))\n* 修复logo问题 ([7e483e6](https://github.com/certd/certd/commit/7e483e60913d509b113148c735fe13ba1d72dddf))\n\n### Performance Improvements\n\n* 增加警告，修复一些样式错乱问题 ([fd54c2f](https://github.com/certd/certd/commit/fd54c2ffac492222e85ff2f5f49a9ee5cfc73588))\n* ssh登录支持openssh格式私钥、支持私钥密码 ([5c2c508](https://github.com/certd/certd/commit/5c2c50839a9076004f9034d754ac6deb531acdfb))\n\n## [1.20.12](https://github.com/certd/certd/compare/v1.20.10...v1.20.12) (2024-06-17)\n\n### Bug Fixes\n\n* 修复aliyun域名超过100个找不到域名的bug ([5b1494b](https://github.com/certd/certd/commit/5b1494b3ce93d1026dc56ee741342fbb8bf7be24))\n\n### Performance Improvements\n\n* 增加系统设置，可以关闭自助注册功能 ([20feace](https://github.com/certd/certd/commit/20feacea12d43386540db6a600f391d786be4014))\n* 增加cloudflare access token说明 ([934e6e2](https://github.com/certd/certd/commit/934e6e2bd05387cd50ffab95f230933543954098))\n* 支持重置管理员密码，忘记密码的补救方案 ([732cbc5](https://github.com/certd/certd/commit/732cbc5e927b526850724594830392b2f10c6705))\n* 支持cloudflare域名 ([fbb9a47](https://github.com/certd/certd/commit/fbb9a47e8f7bb805289b9ee64bd46ffee0f01c06))\n\n## [1.20.10](https://github.com/certd/certd/compare/v1.20.9...v1.20.10) (2024-05-30)\n\n### Bug Fixes\n\n* 增加权限相关helper说明 ([83e4083](https://github.com/certd/certd/commit/83e40836ebff10bec60efe8933183e1ba1c22bf9))\n* 增加权限相关helper说明 ([4304c94](https://github.com/certd/certd/commit/4304c9443ad9248f63dd6d8c512d8d6f32f90d37))\n\n### Performance Improvements\n\n* 上传到主机插件支持复制到本机路径 ([92446c3](https://github.com/certd/certd/commit/92446c339936f98f08f654b8971a7393d8435224))\n* 优化文件下载包名 ([d9eb927](https://github.com/certd/certd/commit/d9eb927b0a1445feab08b1958aa9ea80637a5ae6))\n* 增加任务复制功能 ([39ad759](https://github.com/certd/certd/commit/39ad7597fa0e19cc1f7631bbd6fea0a9e05a62c9))\n\n## [1.20.9](https://github.com/certd/certd/compare/v1.20.8...v1.20.9) (2024-03-22)\n\n**Note:** Version bump only for package root\n\n## [1.20.8](https://github.com/certd/certd/compare/v1.20.7...v1.20.8) (2024-03-22)\n\n**Note:** Version bump only for package root\n\n## [1.20.7](https://github.com/certd/certd/compare/v1.20.6...v1.20.7) (2024-03-22)\n\n**Note:** Version bump only for package root\n\n## [1.20.6](https://github.com/certd/certd/compare/v1.20.5...v1.20.6) (2024-03-21)\n\n### Bug Fixes\n\n* 调整按钮图标到居中位置 ([836d18f](https://github.com/certd/certd/commit/836d18f07e22d00faf2f213bc3301a6672b5bafc))\n\n### Performance Improvements\n\n* 插件贡献文档及示例 ([72fb20a](https://github.com/certd/certd/commit/72fb20abf3ba5bdd862575d2907703a52fd7eb17))\n\n## [1.20.5](https://github.com/certd/certd/compare/v1.20.2...v1.20.5) (2024-03-11)\n\n### Bug Fixes\n\n* 修复腾讯云cdn部署无法选择端点的bug ([154409b](https://github.com/certd/certd/commit/154409b1dfee3ea1caae740ad9c1f99a6e7a9814))\n\n## [1.20.2](https://github.com/certd/certd/compare/v1.2.1...v1.20.2) (2024-02-28)\n\n### Bug Fixes\n\n* 临时修复阿里云domainlist接口返回域名列表不全的问题，后续还需要增加翻页查询 ([849c145](https://github.com/certd/certd/commit/849c145926984762bd9dbec87bd91cd047fc0855))\n\n## [1.2.1](https://github.com/certd/certd/compare/v1.2.0...v1.2.1) (2023-12-12)\n\n### Bug Fixes\n\n* 修复邮箱设置无效的bug ([aaa3224](https://github.com/certd/certd/commit/aaa322464d0f65e924d1850995540d396ee24d25))\n\n**Note:** Version bump only for package root\n\n# [1.2.0](https://github.com/certd/certd/compare/v1.1.6...v1.2.0) (2023-10-27)\n\n* 🔱: [client] sync upgrade with 2 commits [trident-sync] ([aa3207f](https://github.com/certd/certd/commit/aa3207fca5f15f7c3da789989d99c8ae7d1c4551))\n\n### BREAKING CHANGES\n\n* search支持自定义布局，search.layout、search.collapse转移到 search.container之下。如果想使用原来的search组件，请配置search.is=fs-search-v1\n\n## [1.1.6](https://github.com/certd/certd/compare/v1.1.5...v1.1.6) (2023-07-10)\n\n### Bug Fixes\n\n* 修复上传证书到腾讯云失败的bug ([e950322](https://github.com/certd/certd/commit/e950322232e19d1263b8552eefa5b0150fd7864e))\n\n## [1.1.5](https://github.com/certd/certd/compare/v1.1.4...v1.1.5) (2023-07-03)\n\n**Note:** Version bump only for package root\n\n## [1.1.4](https://github.com/certd/certd/compare/v1.1.3...v1.1.4) (2023-07-03)\n\n### Bug Fixes\n\n* 成功图标转动的问题 ([f87eee3](https://github.com/certd/certd/commit/f87eee3b9ff1ef9874e79a81fe0ed7104cb9ee8c))\n\n### Performance Improvements\n\n* cancel task ([bc65c0a](https://github.com/certd/certd/commit/bc65c0a786360c087fe95cad93ec6a87804cc5ee))\n* flush log ([891a43a](https://github.com/certd/certd/commit/891a43ae6716ff98ed06643f7da2e35199ee195c))\n* flush logger ([91be682](https://github.com/certd/certd/commit/91be6826b902e0f302b1a6cbdb1d24e15914c18d))\n* timeout ([3eeb1f7](https://github.com/certd/certd/commit/3eeb1f77aa2922f3545f3d2067f561d95621d54f))\n\n## [1.1.3](https://github.com/certd/certd/compare/v1.1.2...v1.1.3) (2023-07-03)\n\n**Note:** Version bump only for package root\n\n## [1.1.2](https://github.com/certd/certd/compare/v1.1.1...v1.1.2) (2023-07-03)\n\n**Note:** Version bump only for package root\n\n## [1.1.1](https://github.com/certd/certd/compare/v1.1.0...v1.1.1) (2023-06-28)\n\n**Note:** Version bump only for package root\n\n# [1.1.0](https://github.com/certd/certd/compare/v1.0.6...v1.1.0) (2023-06-28)\n\n### Bug Fixes\n\n* 修复access选择类型trigger ([2851a33](https://github.com/certd/certd/commit/2851a33eb2510f038fadb55da29512597a4ba512))\n\n### Features\n\n* 权限控制 ([27a4c81](https://github.com/certd/certd/commit/27a4c81c6d70e70abb3892c3ea58d4719988808a))\n* 邮件通知 ([937e3fa](https://github.com/certd/certd/commit/937e3fac19cd03b8aa91db8ba03fda7fcfbacea2))\n* cert download ([5a51c14](https://github.com/certd/certd/commit/5a51c14de521cb8075a80d2ae41a16e6d5281259))\n* config  merge ([fdc25dc](https://github.com/certd/certd/commit/fdc25dc0d795555cffacc4572648ec158988fbbb))\n* save files ([99522fb](https://github.com/certd/certd/commit/99522fb49adb42c1dfdf7bec3dd52d641158285b))\n* save files ([671d273](https://github.com/certd/certd/commit/671d273e2f9136d16896536b0ca127cf372f1619))\n\n## [1.0.6](https://github.com/certd/certd/compare/v1.0.5...v1.0.6) (2023-05-25)\n\n**Note:** Version bump only for package root\n\n## [1.0.5](https://github.com/certd/certd/compare/v1.0.4...v1.0.5) (2023-05-25)\n\n**Note:** Version bump only for package root\n\n## [1.0.4](https://github.com/certd/certd/compare/v1.0.3...v1.0.4) (2023-05-25)\n\n**Note:** Version bump only for package root\n\n## [1.0.3](https://github.com/certd/certd/compare/v1.0.2...v1.0.3) (2023-05-25)\n\n**Note:** Version bump only for package root\n\n## [1.0.2](https://github.com/certd/certd/compare/v1.0.1...v1.0.2) (2023-05-24)\n\n**Note:** Version bump only for package root\n\n## [1.0.1](https://github.com/certd/certd/compare/v1.0.0...v1.0.1) (2023-05-24)\n\n**Note:** Version bump only for package root\n"
  },
  {
    "path": "docs/guide/contact/index.md",
    "content": "# 联系我们\n\n## 1. 交流群\n如有疑问，欢迎加入群聊（请备注certd）\n如有疑问，欢迎加入群聊（请备注certd）\n\n| 加群 | 微信群 | QQ群 |\n|---------|-------|-------|\n| 二维码 | <img height=\"230\" src=\"./images/wx.png\"> | <img height=\"230\" src=\"./images/qq.png\"> |\n\n## 2. 加作者好友\n\n| 加作者好友 | 微信 QQ                                                       |\n|---------|-------------------------------------------------------------|\n| 二维码 | <img height=\"230\" src=\"./images/me.png\"> |\n"
  },
  {
    "path": "docs/guide/development/demo/access.md",
    "content": "\n# 授权插件Demo\n\n```ts\nimport { AccessInput, BaseAccess, IsAccess } from '@certd/pipeline';\nimport { isDev } from '../../utils/env.js';\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: 'demo',\n  title: '授权插件示例',\n  icon: 'clarity:plugin-line',\n  desc: '',\n})\nexport class DemoAccess extends BaseAccess {\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    title: '密钥Id',\n    component: {\n      placeholder: 'demoKeyId',\n    },\n    required: true,\n  })\n  demoKeyId = '';\n\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    //标题\n    title: '密钥串',\n    component: {\n      //input组件的placeholder\n      placeholder: 'demoKeySecret',\n    },\n    //是否必填\n    required: true,\n    //改属性是否需要加密\n    encrypt: true,\n  })\n  //属性名称\n  demoKeySecret = '';\n}\nnew DemoAccess();\n```\n\n\n# 阿里云授权\n```ts\n\nimport { IsAccess, AccessInput, BaseAccess } from \"@certd/pipeline\";\n\n@IsAccess({\n  name: \"aliyun\",\n  title: \"阿里云授权\",\n  desc: \"\",\n  icon: \"ant-design:aliyun-outlined\",\n  order: 0,\n})\nexport class AliyunAccess extends BaseAccess {\n  @AccessInput({\n    title: \"accessKeyId\",\n    component: {\n      placeholder: \"accessKeyId\",\n    },\n    helper: \"登录阿里云控制台->AccessKey管理页面获取。\",\n    required: true,\n  })\n  accessKeyId = \"\";\n  @AccessInput({\n    title: \"accessKeySecret\",\n    component: {\n      placeholder: \"accessKeySecret\",\n    },\n    required: true,\n    encrypt: true,\n    helper: \"注意：证书申请需要dns解析权限；其他阿里云插件，需要对应的权限，比如证书上传需要证书管理权限；嫌麻烦就用主账号的全量权限的accessKey\",\n  })\n  accessKeySecret = \"\";\n}\n\nnew AliyunAccess();\n```"
  },
  {
    "path": "docs/guide/development/index.md",
    "content": "# 本地开发\n欢迎贡献插件\n\n建议nodejs版本 `20.x` 及以上\n\n## 一、本地调试运行\n\n### 克隆代码\n```shell\n\n# 克隆代码\ngit clone https://github.com/certd/certd --depth=1\n\n#进入项目目录\ncd certd\n\n```\n\n### 修改pnpm-workspace.yaml文件\n重要：否则无法正确加载专业版的access和plugin\n```yaml\n# pnpm-workspace.yaml\npackages:\n   - 'packages/**'  # <--------------注释掉这一行，PR时不要提交此修改\n   - 'packages/ui/**'\n```\n\n### 安装依赖和初始化:\n```shell\n# 安装pnpm，如果提示npm命令不存在，就需要先安装nodejs\nnpm install -g pnpm--registry=https://registry.npmmirror.com\n\n# 使用国内镜像源，如果有代理，就不需要\npnpm config set registry https://registry.npmmirror.com\n# 安装依赖\npnpm install\n\n# 初始化构建\npnpm init\n```\n\n### 启动 server:\n```shell\ncd packages/ui/certd-server\npnpm dev\n```\n\n### 启动 client:\n```shell\ncd packages/ui/certd-client\npnpm dev\n\n# 会自动打开浏览器，确认正常运行\n\n```\n\n## 二、开发插件\n进入 `packages/ui/certd-server/src/plugins`\n\n### 1.复制`plugin-demo`目录作为你的插件目录\n比如你想做`cloudflare`的插件，那么你可以复制`plugin-demo`目录，将其命名成`plugin-cloudflare`。   \n以下均以`plugin-cloudflare`为例进行说明，你需要将其替换成你的插件名称\n\n### 2. access授权\n如果这是一个新的平台，它应该有授权方式，比如accessKey accessSecret之类的     \n参考`plugin-cloudflare/access.ts` 修改为你要做的平台的`access`\n这样用户就可以在`certd`后台中创建这种授权凭证了\n\n### 3. dns-provider\n如果域名是这个平台进行解析的，那么你需要实现dns-provider，（申请证书需要）    \n参考`plugin-cloudflare/dns-provider.ts` 修改为你要做的平台的`dns-provider`\n\n### 4. plugin-deploy\n如果这个平台有需要部署证书的地方     \n参考`plugin-cloudflare/plugins/plugin-deploy-to-xx.ts` 修改为你要做的平台的`plugin-deploy-to-xx`\n\n### 5. 增加导入\n在`plugin-cloudflare/index.ts`中增加你的插件的`import`\n```ts\nexport * from './dns-provider'\nexport * from './access'\nexport * from './plugins/plugin-deploy-to-xx'\n````\n\n在`./src/plugins/index.ts`中增加`import`\n\n```ts\nexport * from \"./plugin-cloudflare.js\"\n```\n\n### 6. 重启服务进行调试\n刷新浏览器，检查你的插件是否工作正常， 确保能够正常进行证书申请和部署\n\n## 三、提交PR\n我们将尽快审核PR\n\n## 四、 注意事项\n### 1.  如何让任务报错停止\n\n```js\n// 抛出异常即可使任务停止，否则会判定为成功\nthrow new Error(\"错误信息\")\n```\n\n\n## 五、贡献插件送激活码\n\n- PR要求，插件功能完整，代码规范\n- PR通过后，联系我们，送您一个半年期专业版激活码"
  },
  {
    "path": "docs/guide/donate/index.md",
    "content": "# 捐赠\n************************\n支持开源，为爱发电，我已入驻爱发电   \nhttps://afdian.com/a/greper\n\n## 发电权益：\n1. 可加入发电专属群，可以获得作者一对一技术支持\n2. 您的需求我们将优先实现，并且将作为专业版功能提供\n3. 一年期专业版激活码\n\n\n## 专业版特权对比\n\n| 功能      | 免费版                    | 专业版                         |\n|---------|------------------------|-----------------------------|\n| 免费证书申请  | 免费无限制                  | 免费无限制                       |\n| 自动部署插件  | 阿里云CDN、腾讯云、七牛CDN、主机部署等 | 支持群晖、宝塔、1Panel等，持续开发中       |\n| 证书流水线条数 | 无限制                    | 无限制                         |\n| 站点证书监控  | 限制1条                   | 无限制                         |\n| 通知      | 邮件通知、自定义webhook        | 邮件免配置、企微、飞书、anpush、server酱等 |\n\n\n## 专业版激活方式\n\n![](./images/plus.png)\n\n发电后，在私信中获取激活码\n************************\n"
  },
  {
    "path": "docs/guide/feature/cname/index.md",
    "content": "# CNAME代理校验方式\n\n通过CNAME代理校验方式，可以给`Certd`不支持的域名服务商的域名申请证书。\n\n## 1. 前言\n* 申请证书是需要`校验域名所有权`的。\n* `DNS校验方式`需要开发适配DNS服务商的接口\n* 目前`Certd`已实现`主流域名注册商`的接口（阿里云、腾讯云、华为云、Cloudflare、西数）\n* 如果域名不在这几家，`DNS校验方式`就行不通\n* 那么就只能通过`CNAME代理校验方式`来实现`证书自动申请`\n\n## 2. 原理\n* 假设你要申请证书的域名叫：`cert.com` ,它是在`Certd`不支持的服务商注册的\n* 假设我们还有另外一个域名叫：`proxy.com`，它是在`Certd`支持的服务商注册的。\n* 当我们按照如下进行配置时\n```\n                  CNAME记录（手动、固定）           TXT记录（自动、随机）\n_acme-challenge.cert.com ---> xxxxx.cname.proxy.com ----> txt-record-abcdefg\n   \n```\n* 证书颁发机构就可以从`_acme-challenge.cert.com`查到TXT记录 `txt-record-abcdefg`，从而完成域名所有权校验。\n* 以上可以看出 `xxxxx.cname.proxy.com ----> txt-record-abcdefg` 这一段`Certd` 是可以自动添加的。\n* 剩下的只需要在你的`cert.com`域名中手动添加一条固定的`CNAME解析`即可\n                         \n\n## 3. Certd CNAME使用步骤\n\n\n1. 创建证书流水线，输入你要申请证书的域名，假设就是`cert.com`，然后选择`CNAME`校验方式\n2. 此时需要配置验证计划，Certd会生成一个随机的CNAME记录模版，例如：`_acme-challenge`->`xxxxxx.cname.proxy.com`\n   ![](./images/cname2.png)\n3. 您需要手动在你的`cert.com`域名中添加CNAME解析，点击验证，校验成功后就可以开始申请证书了 (此操作每个域名只需要做一次，后续可以重复使用，注意不要删除添加的CNAME记录)\n   ![](./images/cname3.png)\n   ![](./images/cname4.png)\n4. 申请过程中，Certd会在`xxxxxx.cname.proxy.com`下自动添加TXT记录。 \n5. 到此即可自动化申请证书了\n\n\n\n\n\n"
  },
  {
    "path": "docs/guide/feature/safe/hidden/index.md",
    "content": "# 站点隐藏\n\n* 一般来说Certd设置好之后，很少需要访问。\n* 所以我们`平时`可以把`站点访问关闭`，需要的时候再打开，减少站点被攻击的风险    \n\n## 1、开启站点隐藏\n`系统管理->系统设置->安全设置->站点隐藏 `  \n\n\n![](./images/hidden1.png)\n\n:::warning  \n\n注意保存好`解除地址`和`解除密码`   \n\n::: \n\n## 2、临时关闭站点隐藏\n\n访问上面的`解除地址`，输入`解除密码`，`临时解除`站点隐藏\n\n![](./images/hidden2.png)\n\n## 3、忘记解除地址和解除密码怎么办\n登录服务器，在数据库平级的目录下创建`.unhidden`命名的空白文件，即可临时解除站点隐藏       \n临时解除后会自动删除`.unhidden`文件，请尽快设置好新的`解除地址`和`解除密码`，并记住    \n\n"
  },
  {
    "path": "docs/guide/feature/safe/index.md",
    "content": "# 安全特性\n\nCertd 存储了证书以及授权等敏感数据，所以需要严格保障安全。      \n我们提供了以下安全特性，以及安全生产建议（请遵照建议进行生产部署以保障数据安全）\n\n## 一、站点安全特性\n\n### 1、 授权数据加密存储【默认开启】\n* 所有的授权敏感字段会加密后存储\n* 每个用户独立维护授权数据，连管理员都无权查看\n\n![星号部分为加密数据](./images/access.png)\n星号部分为加密数据\n\n### 2、 密码防爆破【默认开启】\n* 登录失败次数过多，账号将被锁定，最高24小时(重启服务可解除锁定)\n* 用户登录密码加密hash后存储，无法计算出密码明文\n  ![](./images/login.png)\n\n### 3、站点隐藏【建议开启】\n* 一般来说Certd设置好之后，后续很少需要访问修改。\n* 所以我们平时可以把站点访问关闭，需要的时候再打开，减少站点被攻击的风险    \n* 请前往 `系统管理->系统设置->安全设置->开启站点隐藏`\n  ![](./images/hidden.png)\n\n点击查看 [站点隐藏功能详细使用说明](./hidden/)\n\n\n### 4、登录双重验证\n\n支持2FA双重认证\n\n![](./images/2fa.png)\n\n### 5、数据库自动备份【建议开启】\n* [自动备份设置说明](../../use/backup/)\n\n\n## 二、安全生产建议\n\n尽管`Cert`本身实现了很多安全特性，但`外部环境的安全`仍需要您来确保。    \n请`务必`遵循如下建议做好安全防护\n\n* 请`务必`使用`HTTPS协议`访问本应用，避免被中间人攻击\n* 请`务必`使用`web应用防火墙`防护本应用，防止XSS、SQL注入等攻击\n* 请`务必`做好`服务器本身`的安全防护，防止数据库泄露\n* 请`务必`做好[`数据备份`](../../use/backup/)，避免数据丢失\n* 请`务必`修改管理员账号用户名，且建议将admin注册为普通用户，且设置为禁用。\n* 建议开启[`站点隐藏`](./hidden/)功能\n"
  },
  {
    "path": "docs/guide/image.md",
    "content": "# 镜像说明\n## 国内镜像地址:\n\n* `registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest`  \n* `registry.cn-shenzhen.aliyuncs.com/handsfree/certd:armv7`、`[version]-armv7`\n\n## DockerHub地址：\n* `https://hub.docker.com/r/greper/certd`\n* `greper/certd:latest`\n* `greper/certd:armv7`、`greper/certd:[version]-armv7`\n\n## GitHub Packages地址:\n* `ghcr.io/certd/certd:latest`\n* `ghcr.io/certd/certd:armv7`、`ghcr.io/certd/certd:[version]-armv7`\n* \n## 镜像构建公开\n镜像构建通过`Actions`自动执行，过程公开透明，请放心使用   \n* [点我查看镜像构建日志](https://github.com/certd/certd/actions/workflows/build-image.yml)\n\n![](../images/action/action-build.jpg)"
  },
  {
    "path": "docs/guide/index.md",
    "content": "# Certd\n\nCertd 是一款开源、免费、全自动申请和部署更新SSL证书的工具。       \n后缀d取自linux守护进程的命名风格，意为证书守护进程。\n\n关键字：证书自动申请、证书自动更新、证书自动续期、证书自动续签、证书管理工具\n\n## 1、关于证书续期\n>* 实际上没有办法不改变证书文件本身情况下直接续期或者续签。\n>* 我们所说的续期，其实就是按照全套流程重新申请一份新证书，然后重新部署上去。\n>* 免费证书过期时间90天，以后可能还会缩短，所以自动化部署必不可少\n\n\n## 2、项目特性\n本项目不仅支持证书申请过程自动化，还可以自动化部署更新证书，让你的证书永不过期。\n\n* 全自动申请证书（支持所有注册商注册的域名，支持DNS-01、HTTP-01、CNAME代理等多种域名验证方式）\n* 全自动部署更新证书（目前支持部署到主机、阿里云、腾讯云等70+部署插件）\n* 支持通配符域名/泛域名，支持多个域名打到一个证书上，支持pem、pfx、der、jks等多种证书格式\n* 邮件通知、webhook通知、企微、钉钉、飞书、anpush等多种通知方式\n* 私有化部署，数据保存本地，安装升级非常简单快捷\n* 镜像由Github Actions构建，过程公开透明\n* 授权加密，站点隐藏，2FA，密码防爆破等多重安全保障\n* 支持SQLite，PostgreSQL、MySQL多种数据库\n* 开放接口支持\n* 站点证书监控\n* 多用户管理\n\n\n  ![](../images/intro/intro.svg)\n\n\n"
  },
  {
    "path": "docs/guide/install/1panel/index.md",
    "content": "# 部署到1Panel面板\n\n\n## 一、安装1Panel\n\nhttps://1panel.cn/docs/installation/online_installation/\n\n## 二、部署certd\n\n\n1. 打开`docker-compose.yaml`，整个内容复制下来    \n   https://gitee.com/certd/certd/raw/v2/docker/run/docker-compose.yaml\n\n\n2. 然后到 `1Panel->容器->编排->新建编排`\n   输入名称，粘贴`docker-compose.yaml`原文内容\n   ![](./images/1.png)\n\n3. 点击确定，启动容器   \n   ![](./images/2.png)\n\n> 默认使用sqlite数据库，数据保存在`/data/certd`目录下，您可以手动备份该目录   \n> certd还支持`mysql`和`postgresql`数据库，[点我了解如何切换其他数据库](../database)\n\n3. 访问测试\n\nhttp://ip:7001   \nhttps://ip:7002   \n默认账号密码      \nadmin/123456     \n登录后请及时修改密码  \n\n## 三、升级\n\n1. 找到容器，点击更多->升级\n   ![](./images/upgrade-1.png)\n\n2. 选择强制拉取镜像，点击确认即可\n![img.png](./images/upgrade-2.png)\n\n\n## 四、数据备份\n\n> 默认数据保存在`/data/certd`目录下，可以手动备份    \n> 建议配置一条 [数据库备份流水线](../../use/backup/)，自动备份\n\n## 五、备份恢复\n\n将备份的`db.sqlite`及同目录下的其他文件一起覆盖到原来的位置，重启certd即可\n"
  },
  {
    "path": "docs/guide/install/baota/index.md",
    "content": "# 部署到宝塔面板\n\n\n## 一、安装\n宝塔面板支持两种方式安装Certd，请选择其中一种方式\n\n### 1、安装宝塔面板\n\n* 安装宝塔面板，前往 [宝塔面板](https://www.bt.cn/u/CL3JHS) 官网，选择`9.2.0`以上正式版的脚本下载安装\n* 登录宝塔面板，在菜单栏中点击 Docker，首次进入会提示安装Docker服务，点击立即安装，按提示完成安装\n\n### 2、部署certd\n以下两种方式人选一种：\n#### 2.1 应用商店方式一键部署【推荐】\n\n* 在宝塔Docker应用商店中找到`certd`（要先点右上角更新应用）\n* 点击安装，配置域名等基本信息即可完成安装\n\n> 需要宝塔9.2.0及以上版本才支持\n\n#### 2.2 容器编排方式部署\n\n1. 打开`docker-compose.yaml`,整个内容复制下来    \n   https://gitee.com/certd/certd/raw/v2/docker/run/docker-compose.yaml\n\n\n然后到宝塔里面进到docker->容器编排->添加容器编排   \n![](./images/1.png)   \n点击确定，等待启动完成   \n![](./images/2.png)\n\n> certd默认使用sqlite数据库，另外支持`mysql`和`postgresql`数据库，[点我了解如何切换其他数据库](../database)\n\n\n## 二、访问应用\n\nhttp://ip:7001    \nhttps://ip:7002     \n默认账号密码    \nadmin/123456   \n登录后请及时修改密码\n\n## 三、如何升级\n宝塔升级certd非常简单\n\n打开容器页面： `docker`->`容器编排`->`左侧选择Certd`->`更新镜像`     \n\n![img.png](./images/upgrade.png)\n\n\n## 四、数据备份\n\n部署方式不同，数据保存位置不同\n\n### 4.1 应用商店部署方式\n点击进入安装路径，数据保存在`./data`目录下，可以手动备份\n\n\n![](./images/app.png)\n\n![](./images/db_path.png)\n\n### 4.2 容器编排部署方式\n\n数据默认保存在`/data/certd`目录下，可以手动备份\n\n\n### 4.3 自动备份\n\n> 建议配置一条 [数据库备份流水线](../../use/backup/)，自动备份\n\n## 五、备份恢复\n\n将备份的`db.sqlite`及同目录下的其他文件一起覆盖到原来的位置，重启certd即可\n\n\n## 六、宝塔部署相关问题排查\n\n### 1. 无法访问Certd\n1. 确认服务器的安全规则，是否放开了对应端口\n2. 确认宝塔防火墙是否放开对应端口\n3. 尝试将Certd容器加入宝塔的`bridge`网络 \n![](./images/network.png)"
  },
  {
    "path": "docs/guide/install/database.md",
    "content": "# 切换数据库\n\ncertd支持如下几种数据库：\n1. sqlite3 (默认)\n2. mysql \n3. postgresql\n   \n您可以按如下两种方式切换数据库\n\n\n## 一、全新安装\n::: tip   \n以下按照`docker-compose`安装方式介绍如何使用mysql或postgresql数据库    \n如果您使用其他方式部署，请自行修改对应的环境变量即可。   \n:::\n\n### 1.1、使用mysql数据库\n\n1. 安装mysql，创建数据库 `(注意：charset=utf8mb4, collation=utf8mb4_bin)`\n2. 下载最新的docker-compose.yaml\n3. 修改环境变量配置\n```yaml\nservices:\n  certd:\n    environment:\n      # 使用mysql数据库，需要提前创建数据库 charset=utf8mb4, collation=utf8mb4_bin\n      - certd_flyway_scriptDir=./db/migration-mysql                     # 升级脚本目录 【照抄】\n      - certd_typeorm_dataSource_default_type=mysql                     # 数据库类型， 或者 mariadb \n      - certd_typeorm_dataSource_default_host=localhost                 # 数据库地址\n      - certd_typeorm_dataSource_default_port=3306                      # 数据库端口\n      - certd_typeorm_dataSource_default_username=root                  # 用户名\n      - certd_typeorm_dataSource_default_password=yourpasswd            # 密码\n      - certd_typeorm_dataSource_default_database=certd                 # 数据库名\n\n```\n4. 启动certd\n```shell\ndocker-compose up -d\n```\n\n\n### 1.2、使用Postgresql数据库\n\n1. 安装postgresql，创建数据库\n2. 下载最新的docker-compose.yaml\n3. 修改环境变量配置\n```yaml\nservices:\n  certd:\n    environment:\n      # 使用postgresql数据库，需要提前创建数据库\n      - certd_flyway_scriptDir=./db/migration-pg                        # 升级脚本目录 【照抄】\n      - certd_typeorm_dataSource_default_type=postgres                  # 数据库类型 【照抄】\n      - certd_typeorm_dataSource_default_host=localhost                 # 数据库地址\n      - certd_typeorm_dataSource_default_port=5433                      # 数据库端口\n      - certd_typeorm_dataSource_default_username=postgres              # 用户名\n      - certd_typeorm_dataSource_default_password=yourpasswd            # 密码\n      - certd_typeorm_dataSource_default_database=certd                 # 数据库名\n\n```\n4. 启动certd\n```shell\ndocker-compose up -d\n```\n\n## 二、从旧版的sqlite切换数据库\n\n1. 先将`旧certd`升级到最新版 （`建议：备份sqlite数据库` ）\n2. 按照上面全新安装方式部署一套`新的certd` （`注意：新旧版本的certd要一致`）\n3. 使用数据库工具将数据从sqlite导入到mysql或postgresql （`注意：flyway_history数据表不要导入`）\n4. 重启新certd\n5. 确认没有问题之后，删除旧版certd\n\n"
  },
  {
    "path": "docs/guide/install/docker/index.md",
    "content": "# Docker方式部署\n\n## 一、安装\n\n### 1. 环境准备\n\n1.1  准备一台云服务器\n\n* 【阿里云】云服务器2核2G，新老用户同享，99元/年，续费同价！【 [立即购买](https://www.aliyun.com/benefit?scm=20140722.M_10244282._.V_1&source=5176.11533457&userCode=qya11txb )】\n* 【腾讯云】云服务器2核2G，新老用户同享，99元/年，续费同价！【 [立即购买](https://cloud.tencent.com/act/cps/redirect?redirect=6094&cps_key=b3ef73330335d7a6efa4a4bbeeb6b2c9&from=console)】\n\n1.2 安装docker、docker-compose \n\nhttps://docs.docker.com/engine/install/ \n\n选择对应的操作系统，按照官方文档执行命令即可\n\n### 2. 部署certd容器\n\n```bash\n# 随便创建一个目录\nmkdir certd\n# 进入目录\ncd certd\n# 下载docker-compose.yaml文件，或者手动下载放到certd目录下\nwget https://gitee.com/certd/certd/raw/v2/docker/run/docker-compose.yaml\n\n# 可以根据需要修改里面的配置\n# 1.修改镜像版本号【可选】\n# 2.配置数据保存路径【可选】\n# 3.修改端口号【可选】\nvi docker-compose.yaml # 【可选】\n\n# 启动certd\ndocker compose up -d\n\n```\n\n> [手动下载docker-compose.yaml ](https://gitee.com/certd/certd/raw/v2/docker/run/docker-compose.yaml)   \n> 当前版本号： ![](https://img.shields.io/npm/v/%40certd%2Fpipeline)  \n\n> 如果提示 没有docker compose命令,请安装docker-compose   \n> https://docs.docker.com/compose/install/linux/   \n\n> certd默认使用sqlite数据库，另外还支持`mysql`和`postgresql`数据库，[点我了解如何切换其他数据库](../database)\n\n\n### 3. 访问测试\n\nhttp://your_server_ip:7001   \nhttps://your_server_ip:7002   \n默认账号密码：admin/123456     \n记得修改密码  \n\n\n## 二、升级\n\n::: warning   \n如果您是第一次升级certd版本，切记切记先备份一下数据    \n:::\n\n\n### 如果使用固定版本号\n1. 修改`docker-compose.yaml`中的镜像版本号\n2. 运行`docker compose up -d` 即可\n\n### 如果使用`latest`版本\n```shell\n#重新拉取镜像\ndocker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest\n# 重新启动容器\ndocker compose down\ndocker compose up -d\n```\n## 三、数据备份\n> 数据默认存在`/data/certd`目录下，不用担心数据丢失   \n> 建议配置一条[数据库备份流水线](../../use/backup/) 自动备份\n\n## 四、备份恢复\n\n将备份的`db.sqlite`及同目录下的其他文件一起覆盖到原来的位置，重启certd即可"
  },
  {
    "path": "docs/guide/install/source/index.md",
    "content": "# 源码部署\n如果没有开发基础、没有运维基础、没有`git`和`nodejs`基础，强烈不推荐此方式\n\n## 一、源码安装\n\n### 环境要求\n- nodejs 20 及以上\n### 源码启动\n```shell\n# 克隆代码\ngit clone https://github.com/certd/certd --depth=1\n# git checkout v1.x.x  # 当v2主干分支代码无法正常启动时，可以尝试此命令，1.x.x换成最新版本号\ncd certd\n# 启动服务\n./start.sh  \n\n```\n>如果是windows，请先安装`git for windows` ，然后右键，选择`open git bash here`打开终端，再执行`./start.sh`命令\n\n> 数据默认保存在 `./packages/ui/certd-server/data` 目录下，注意数据备份\n\n### 访问测试\n\nhttp://your_server_ip:7001  \nhttps://your_server_ip:7002   \n默认账号密码：admin/123456    \n记得修改密码\n\n\n## 二、升级\n\n```shell\n\ncd certd\n# 确保数据安全，备份一下数据\ncp -rf ./packages/ui/certd-server/data ../certd-data-backup\n\ngit pull\n# 如果提示pull失败，可以尝试强制更新\n# git checkout v2 -f && git pull \n\n# 先停止旧的服务,7001是certd的默认端口\nkill -9 $(lsof -t -i:7001)\n# 重新编译启动\n./start.sh\n\n```\n::: warning   \n升级certd版本前，切记切记先备份一下数据    \n:::\n\n\n## 三、数据备份\n> 数据默认保存在 `./packages/ui/certd-server/data` 目录下    \n> 建议配置一条[数据库备份流水线](../../use/backup/)  自动备份\n\n\n## 四、备份恢复\n\n将备份的`db.sqlite`及同目录下的其他文件覆盖到原来的位置，重启certd即可\n"
  },
  {
    "path": "docs/guide/install/upgrade.md",
    "content": "# 版本升级\n\n## 升级方法\n根据不同部署方式查看升级方法\n\n1. [Docker方式部署升级](./docker/#二、升级)\n2. [宝塔面板方式部署升级](./baota/#三、如何升级)\n3. [1Panel面板方式部署升级](./1panel/#三、升级)\n4. [源码方式部署](./source/#二、升级)\n\n::: warning   \n如果您是第一次升级certd版本，切记切记先备份一下数据    \n:::\n\n## 升级日志\n可以查看最新版本号，以及所有版本的更新日志     \n[CHANGELOG](../changelogs/CHANGELOG.md)\n\n\n## 自动升级配置\n\n### 1. 方法一：使用watchtower监控\n\n修改docker-compose.yaml文件增加如下配置， 使用watchtower监控自动升级\n```yaml\nservices:\n  certd:\n    ...\n    labels:\n      com.centurylinklabs.watchtower.enable: \"true\"\n\n#         ↓↓↓↓ ---------------------------------------------------------  自动升级，上面certd的版本号要保持为latest\n  certd-updater:  # 添加 Watchtower 服务\n    image: containrrr/watchtower:latest\n    container_name: certd-updater\n    restart: unless-stopped\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n    # 配置 自动更新\n    environment:\n      - WATCHTOWER_CLEANUP=true            # 自动清理旧版本容器\n      - WATCHTOWER_INCLUDE_STOPPED=false   # 不更新已停止的容器\n      - WATCHTOWER_LABEL_ENABLE=true       # 根据容器标签进行更新\n      - WATCHTOWER_POLL_INTERVAL=600       # 每 10 分钟检查一次更新\n\n```\n\n\n### 2. 方法二：使用Certd版本监控功能\n\n选择Github-检查Release版本插件\n![](./images/github-release.png)\n按如下图填写配置\n![](./images/github-release-2.png)\n\n\n检测到新版本后执行宿主机升级命令：\n\n```shell\n# 拉取最新镜像\ndocker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest\n# 升级容器命令， 替换成你自己的certd更新命令\nexport RESTART_CERT='sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d'\n# 构造一个脚本10s后在后台执行，避免容器销毁时执行太快，导致流水线任务无法结束\nnohup sh -c '$RESTART_CERT' >/dev/null  2>&1 & echo '10秒后重启' && exit\n```"
  },
  {
    "path": "docs/guide/license/index.md",
    "content": "# 开源协议\n\n* 本项目遵循 GNU Affero General Public License（AGPL）开源协议。\n* 允许个人和公司使用、复制、修改和分发本项目，禁止任何形式的商业用途\n* 未获得商业授权情况下，禁止任何对logo、版权信息及授权许可相关代码的修改。\n* 如需商业授权，请联系作者。\n"
  },
  {
    "path": "docs/guide/link/index.md",
    "content": "# 我的其他项目\n\n| 项目名称                                                    | stars                                                                                                 | 项目描述                              | \n|---------------------------------------------------------|-------------------------------------------------------------------------------------------------------|-----------------------------------|\n| [袖手AI](https://ai.handsfree.work/)                    |                                                                                                       | 袖手GPT，国内可用，无需FQ，每日免费额度            | \n| [fast-crud](https://gitee.com/fast-crud/fast-crud/)     | <img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/fast-crud/fast-crud?logo=github\"/>   | 基于vue3的crud快速开发框架                 |  \n| [dev-sidecar](https://github.com/docmirror/dev-sidecar/) | <img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/docmirror/dev-sidecar?logo=github\"/> | 直连访问github工具，无需FQ，解决github无法访问的问题 |                       \n"
  },
  {
    "path": "docs/guide/open/index.md",
    "content": "# 开放接口\n被动方式对第三方提供证书， 支持根据域名或证书id获取证书。\n\n## 获取keyId和KeySecret\n\n![](./images/1.png)\n\n## 接口文档\n\nhttps://apifox.com/apidoc/shared-2e76f8c4-7c58-413b-a32d-a1316529af44/254949529e0\n\n## Token生成方法\n\nheader中传入x-certd-token即可调用开放接口   \n1、首先从OpenKey页面生成keyId，keySecret；    \n2、准备一个content( json字符串)： content={\"keyId\":keyId, t:时间戳秒数, encrypt:false, signType:\"md5\"} `// encrypt返回结果是否加密`   \n3、将content加上keySecret进行签名： sign = md5(content + keySecret)   \n4、然后将content和sign分别base64后用.号连接： x-certd-token = base64(content) +\".\"+base64(sign)   \n\n## SDK\n待开发\n\n## 客户端工具\n\n### SSL-Assistant\n`SSL Assistant` 是一个基于 Go 语言开发的跨平台证书部署管理助手。    \n支持自动扫描主机`Nginx`配置，然后从Certd拉取证书并部署。     \n在不想暴露ssh主机密码情况下，该工具非常好用。\n\n开源地址： https://github.com/Youngxj/SSL-Assistant"
  },
  {
    "path": "docs/guide/plugins/access.md",
    "content": "# 授权列表\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **阿里云授权** |  | \n| 2.| **EAB授权** | ZeroSSL证书申请需要EAB授权 | \n| 3.| **google cloud** | 谷歌云授权 | \n| 4.| **主机登录授权** |  | \n| 5.| **SFTP授权** |  | \n| 6.| **阿里云OSS授权** | 包含地域和Bucket | \n| 7.| **FTP授权** |  | \n| 8.| **腾讯云** |  | \n| 9.| **腾讯云COS授权** | 腾讯云对象存储授权，包含地域和存储桶 | \n| 10.| **七牛云授权** |  | \n| 11.| **七牛OSS授权** |  | \n| 12.| **天翼云授权** |  | \n| 13.| **s3/minio授权** | S3/minio oss授权 | \n| 14.| **baota授权** |  | \n| 15.| **易盾DCDN授权** | https://user.yiduncdn.com | \n| 16.| **易盾rcdn授权** | 易盾CDN，每月免费30G，[注册即领](https://rhcdn.yiduncdn.com/register?code=8mn536rrzfbf8) | \n| 17.| **易发云短信** | sms.yfyidc.cn/ | \n| 18.| **cdnfly授权** |  | \n| 19.| **群晖登录授权** |  | \n| 20.| **k8s授权** |  | \n| 21.| **1panel授权** | 账号和密码 | \n| 22.| **百度云授权** |  | \n| 23.| **LeCDN授权** |  | \n| 24.| **白山云授权** |  | \n| 25.| **plesk授权** |  | \n| 26.| **易支付** |  | \n| 27.| **支付宝** |  | \n| 28.| **微信支付** |  | \n| 29.| **长亭雷池授权** |  | \n| 30.| **lucky** |  | \n| 31.| **括彩云cdn授权** | 括彩云CDN，每月免费30G，[注册即领](https://kuocaicdn.com/register?code=8mn536rrzfbf8) | \n| 32.| **uniCloud** | unicloud授权 | \n| 33.| **华为云授权** |  | \n| 34.| **西部数码授权** |  | \n| 35.| **多吉云** |  | \n| 36.| **我爱云授权** | 我爱云CDN | \n| 37.| **CacheFly** | CacheFly | \n| 38.| **Gcore** | Gcore | \n| 39.| **亚马逊云aws授权** |  | \n| 40.| **dns.la授权** |  | \n| 41.| **又拍云** |  | \n| 42.| **火山引擎** |  | \n| 43.| **京东云** |  | \n| 44.| **51dns授权** |  | \n\n<style module>\ntable th:first-of-type {\n        width: 65px;\n    }\ntable th:nth-of-type(2) {\n        width: 240px;\n    }\n</style>\n    "
  },
  {
    "path": "docs/guide/plugins/deploy.md",
    "content": "# 任务插件\n共 `70` 款任务插件    \n## 1. 证书申请\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **证书申请（JS版）** | 免费通配符域名证书申请，支持多个域名打到同一个证书上 | \n| 2.| **证书申请（Lego）** | 支持海量DNS解析提供商，推荐使用，一样的免费通配符域名证书申请，支持多个域名打到同一个证书上 | \n| 3.| **商用证书托管** | 手动上传自定义证书后，自动部署（每次证书有更新，都需要手动上传一次） | \n## 2. 主机\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **FTP-上传证书到FTP** | 将证书上传到FTP服务器 | \n| 2.| **IIS-部署到IIS站点** |  | \n| 3.| **主机-执行远程主机脚本命令** | 可以执行重启nginx等操作让证书生效 | \n| 4.| **主机-部署证书到SSH主机** | SFTP上传证书到主机，然后SSH执行部署脚本命令 | \n## 3. CDN\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **易盾-部署到易盾DCDN** | 主要是防御，http://user.yiduncdn.com/ | \n| 2.| **易盾-部署到易盾RCDN** | 易盾CDN，每月免费30G，[注册即领](https://rhcdn.yiduncdn.com/register?code=8mn536rrzfbf8) | \n| 3.| **cdnfly-部署证书到cdnfly** | cdnfly | \n| 4.| **百度云-部署证书到CDN** | 部署到百度云CDN | \n| 5.| **LeCDN-更新证书** |  | \n| 6.| **LeCDN-更新证书V2** | 支持新版本LeCDN | \n| 7.| **白山云-更新证书** |  | \n| 8.| **天翼云-部署证书到CDN** | 部署证书到天翼云CDN和全站加速 | \n| 9.| **括彩云-部署到括彩云CDN** | 括彩云CDN，每月免费30G，[注册即领](https://kuocaicdn.com/register?code=8mn536rrzfbf8) | \n| 10.| **多吉云-部署到多吉云CDN** |  | \n| 11.| **我爱云-部署证书到我爱云CDN** | 部署证书到我爱云CDN | \n| 12.| **CacheFly-部署证书到CacheFly** | 部署证书到 CacheFly | \n| 13.| **Gcore-部署证书到Gcore** | 仅上传 并不会部署到cdn | \n| 14.| **Gcore-刷新Gcore证书** | 刷新现有的证书 | \n| 15.| **又拍云-部署证书到CDN/USS** | 支持又拍云CDN，又拍云云存储USS | \n## 4. 面板\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **宝塔-面板证书部署** | 部署宝塔面板本身的ssl证书 | \n| 2.| **宝塔-网站证书部署** | 部署宝塔管理的站点的ssl证书，目前支持网站站点、docker站点等 | \n| 3.| **群晖-部署证书到群晖面板** | Synology，支持6.x以上版本 | \n| 4.| **K8S-部署证书到Secret** | 部署证书到k8s的secret | \n| 5.| **K8S-Ingress 证书部署** | 部署证书到k8s的Ingress | \n| 6.| **1Panel-部署证书到1Panel** | 更新1Panel的证书 | \n| 7.| **Plesk-部署Plesk网站证书** |  | \n| 8.| **雷池-更新证书** | 更新长亭雷池WAF的证书 | \n| 9.| **lucky-更新Lucky证书** |  | \n| 10.| **uniCloud-部署到服务空间** | 部署到服务空间 | \n| 11.| **威联通-部署证书到威联通** | 部署证书到qnap | \n## 5. 阿里云\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **阿里云-部署到Ack** | 部署到阿里云Ack集群Ingress等通过Secret管理证书的应用 | \n| 2.| **阿里云-部署至任意云资源** | 【不建议使用】需要消耗阿里云自动部署次数，支持SLB、LIVE、webHosting、VOD、CR、DCDN、DDoS、CDN、ALB、APIGateway、FC、GA、MSE、NLB、OSS、SAE、WAF等云产品 | \n| 3.| **阿里云-部署证书至CDN** | 自动部署域名证书至阿里云CDN | \n| 4.| **阿里云-部署证书至DCDN** | 依赖证书申请前置任务，自动部署域名证书至阿里云DCDN | \n| 5.| **阿里云-部署证书至OSS** | 自动部署域名证书至阿里云OSS | \n| 6.| **阿里云-上传证书到阿里云** | 如果不想在阿里云上同一份证书上传多次，可以把此任务作为前置任务，其他阿里云任务证书那一项选择此任务的输出 | \n| 7.| **阿里云-部署至阿里云WAF** | 部署证书到阿里云WAF | \n| 8.| **阿里云-部署至ALB（应用负载均衡）** | ALB,更新监听器的默认证书 | \n| 9.| **阿里云-部署至NLB（网络负载均衡）** | NLB,网络负载均衡,更新监听器的默认证书 | \n| 10.| **阿里云-部署至SLB(传统负载均衡)** | 部署证书到阿里云SLB(传统负载均衡) | \n| 11.| **阿里云-部署至阿里云FC(3.0)** | 部署证书到阿里云函数计算（FC3.0）,【注意】证书的加密算法必须选择【pkcs1旧版】 | \n## 6. 华为云\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **华为云-部署证书至CDN** |  | \n## 7. 腾讯云\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **腾讯云-部署证书到任意云资源** | 支持负载均衡、CDN、DDoS、直播、点播、Web应用防火墙、API网关、TEO、容器服务、对象存储、轻应用服务器、云原生微服务、云开发 | \n| 2.| **腾讯云-部署到CLB** | 暂时只支持单向认证证书，暂时只支持通用负载均衡 | \n| 3.| **腾讯云-部署到CDN（废弃）** | 已废弃，请使用v2版 | \n| 4.| **腾讯云-部署到CDN-v2** | 推荐使用 | \n| 5.| **腾讯云-上传证书到腾讯云** | 上传成功后输出：tencentCertId | \n| 6.| **腾讯云-部署证书到COS** | 部署到腾讯云COS源站域名证书【注意：很不稳定，需要重试很多次偶尔才能成功一次】 | \n| 7.| **腾讯云-部署到腾讯云EO** | 腾讯云边缘安全加速平台EO，必须配置上传证书到腾讯云任务 | \n| 8.| **腾讯云-删除即将过期证书** | 仅删除未使用的证书 | \n| 9.| **腾讯云-部署到TKE-ingress** | serverless集群请使用K8S部署插件；Qcloud类型需要【上传到腾讯云】作为前置任务；ApiServer未开启外网访问则需要做域名的内网IP映射 | \n## 8. 火山引擎\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **火山引擎-部署证书至CDN** | 支持网页，文件下载，音视频点播 | \n| 2.| **火山引擎-部署证书至CLB** | 部署至火山引擎负载均衡 | \n| 3.| **火山引擎-上传证书至证书中心** | 上传证书至火山引擎证书中心 | \n| 4.| **火山引擎-部署证书至ALB** | 部署至火山引擎应用负载均衡 | \n| 5.| **火山引擎-部署证书至Live** | 部署至火山引擎视频直播 | \n## 9. 京东云\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **京东云-部署证书至CDN** | 京东云内容分发网络 | \n| 2.| **京东云-更新已有证书** | 更新SSL数字证书中的证书 | \n| 3.| **京东云-上传新证书** | 上传证书到SSL数字证书中心 | \n## 10. 七牛云\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **七牛云-部署证书至OSS** | 自动部署域名证书至七牛云KODO，注意是自定义源站域名，不是CDN域名 | \n| 2.| **七牛云-部署证书至CDN** | 自动部署域名证书至七牛云CDN | \n## 11. 亚马逊云\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **AWS-部署证书到CloudFront** | 部署证书到 AWS CloudFront | \n## 12. 其他\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **Demo-测试插件** |  | \n| 2.| **重启 Certd** | 【仅管理员可用】 重启 certd的https服务，用于更新 Certd 的 ssl 证书 | \n| 3.| **自定义js脚本** | 【仅管理员】运行自定义js脚本执行 | \n| 4.| **等待** | 等待一段时间 | \n| 5.| **数据库备份** | 仅支持备份SQLite数据库 | \n\n<style module>\ntable th:first-of-type {\n        width: 65px;\n    }\ntable th:nth-of-type(2) {\n        width: 240px;\n    }\n</style>\n    "
  },
  {
    "path": "docs/guide/plugins/dns-provider.md",
    "content": "# DNS提供商\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **阿里云** | 阿里云DNS解析提供商 | \n| 2.| **腾讯云** | 腾讯云域名DNS解析提供者 | \n| 3.| **华为云** | 华为云DNS解析提供商 | \n| 4.| **西部数码** | west dns provider | \n| 5.| **dns.la** | dns.la | \n| 6.| **火山引擎** | 火山引擎DNS解析提供商 | \n| 7.| **京东云** | 京东云DNS解析提供商 | \n| 8.| **51dns** | 51DNS | \n\n<style module>\ntable th:first-of-type {\n        width: 65px;\n    }\ntable th:nth-of-type(2) {\n        width: 240px;\n    }\n</style>\n    "
  },
  {
    "path": "docs/guide/plugins/notification.md",
    "content": "# 通知插件\n\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n| 1.| **企业微信通知** | 企业微信群聊机器人通知 | \n| 2.| **电子邮件** | 电子邮件通知 | \n| 3.| **爱语飞飞微信通知(iyuu)** | https://iyuu.cn/ | \n| 4.| **自定义webhook** | 根据模版自定义http请求 | \n| 5.| **Server酱ᵀ** | https://sct.ftqq.com/ | \n| 6.| **Server酱³** | https://doc.sc3.ft07.com/serverchan3 | \n| 7.| **AnPush** | https://anpush.com | \n| 8.| **Telegram通知** | Telegram Bot推送通知 | \n| 9.| **Discord 通知** | Discord 机器人通知 | \n| 10.| **Slack通知** | Slack消息推送通知 | \n| 11.| **Bark 通知** | Bark 推送通知插件 | \n| 12.| **飞书通知** | 飞书群聊webhook通知 | \n\n<style module>\ntable th:first-of-type {\n        width: 65px;\n    }\ntable th:nth-of-type(2) {\n        width: 240px;\n    }\n</style>\n    "
  },
  {
    "path": "docs/guide/qa/index.md",
    "content": "# 常见报错解决\n\n## 1. getaddrinfo ENOTFOUND错误\n如果出现`getaddrinfo ENOTFOUND`/`getaddrinfo EAI_AGAIN`错误，可以尝试在`docker-compose.yaml`中设置dns\n```yaml\nversion: '3.3' # 兼容旧版docker-compose\nservices:\n  certd:\n    #↓↓↓↓ ------------ # 如果出现getaddrinfo ENOTFOUND 或 EAI_AGAIN错误，可以尝试设置dns\n    dns:\n      - 223.5.5.5      # 阿里云公共dns\n      - 223.6.6.6\n#       # ↓↓↓↓ ------- # 如果你服务器在腾讯云，可以用这个替换上面阿里云的公共dns\n#      - 119.29.29.29  # 腾讯云公共dns\n#      - 182.254.116.116\n#       # ↓↓↓↓ ------- # 如果你服务器部署在国外，可以用这个替换上面阿里云的公共dns\n#      - 8.8.8.8       # 谷歌公共dns\n#      - 8.8.4.4\n```\n\n如果仍然有问题,按如下步骤检查是否能够ping通域名\n```shell\ndocker exec -it certd /bin/sh\nping www.baidu.com\nping gg.px.certd.handfree.work\nping app.handfree.work\n```\n\n如果您是宝塔部署的\n可以试试将容器网络加入brige网络，看是否解决问题\n![img.png](images/baota-net.png)\n\n如果还是不行，请联系我们\n\n\n## 2. 连接IPv6超时\ndocker-compose 需要放开IPv6网络的配置\n```yaml\nservices:\n  certd:\n    networks:\n      - ip6net\n#    ↓↓↓↓ -------------------------------------------------------------- 启用ipv6网络，还需要把上面networks的注释放开\nnetworks:\n  ip6net:\n    enable_ipv6: true\n    ipam:\n      config:\n        - subnet: 2001:db8::/64\n\n```\n\n## 3. SSL_CERT_NOT_MATCH_DOMAIN_ERROR\n部署证书任务报类似 `SSL_CERT_NOT_MATCH_DOMAIN_ERROR`错误\n这是由于当前流水线的证书域名与要部署的目标站点的域名不匹配导致的，在申请证书任务中，增加目标站点域名，重新运行流水线即可\n\n\n## 4. 没有服务器配置文件，请检查是否开启了外网映射！\n宝塔网站证书部署报错：`Error: 没有服务器配置文件，请检查是否开启了外网映射！`    \n解决方案：先手动在宝塔网站中设置一次证书    \n\n\n## 5. 如何查看容器日志\n```shell\ndocker logs -f --tail 200 certd\n```\n\n\n\n\n\n\n\n"
  },
  {
    "path": "docs/guide/qa/use.md",
    "content": "# 使用问题\n\n\n## 1. 是否支持IP证书\n\n因为ACME协议不支持IP证书，所以certd目前也不支持IP证书\n\n\n## 2. 建议设置多长时间运行一次流水线\n建议每天运行一次，检查证书过期时间    \n当证书没过期时，自动跳过部署\n当证书到期前35天（创建流水线时可以修改），将会自动重新申请证书，自动部署\n\n\n"
  },
  {
    "path": "docs/guide/start.md",
    "content": "# 快速开始\n本章节介绍如何快速开始使用`Certd`\n\n## 一、 demo在线体验\n\n官方DEMO地址，自助注册后体验\n\nhttps://certd.handsfree.work/\n\n> 注意数据将不定期清理，不定期停止定时任务，生产使用请自行部署    \n> 包含敏感信息，务必自己本地部署进行生产使用\n\n\n## 二、私有化部署\n\n由于证书、授权信息等属于高度敏感数据，请务必私有化部署，保障数据安全\n\n###  1. 部署方式\n\n1. [宝塔面板方式部署](./install/baota/)\n2. [1Panel面板方式部署](./install/1panel/)\n2. [Docker方式部署](./install/docker/)\n3. [源码方式部署](./install/source/)\n\n\n### 2. 访问测试\n\nhttp://your_server_ip:7001   \nhttps://your_server_ip:7002    \n默认账号密码：admin/123456    \n记得修改密码\n\n\n\n"
  },
  {
    "path": "docs/guide/tutorial.md",
    "content": "\n# 演示教程\n教程演示从创建证书申请任务到自动部署证书全流程\n\n`申请证书->部署证书->设置定时执行->设置邮件通知`\n\n可以从如下两处查看演示流程\n\n## 1. 系统顶部使用教程菜单\n点击`使用教程`可以学习如何自动申请和部署证书\n\n![img.png](../images/start/tt.png)\n\n\n## 2. 图文教程链接\n如果不方便登录系统，您还可以直接查看 [图文教程](https://gitee.com/certd/certd/blob/v2/step.md)\n\n"
  },
  {
    "path": "docs/guide/use/ESXi/index.md",
    "content": "# 部署证书到ESXi\n\n使用`部署证书到主机插件`即可\n\n\n## 开启ssh\n登陆ESXi Web后台，点击 主机 -> 操作 -> 服务 -> 启用 Secure Shell（SSH）打开SSH\n\n## 添加部署到主机任务\n\n![img.png](./images/ssh.png)\n\n## 配置重启脚本\n```bash\n/etc/init.d/hostd restart\n/etc/init.d/vpxa restart\n```\n"
  },
  {
    "path": "docs/guide/use/aliyun/index.md",
    "content": "# 阿里云相关\n\n\n## 阿里云客户端请求超时配置\n\n配置环境变量\n```shell\nALIYUN_CLIENT_CONNECT_TIMEOUT=10000 # 连接超时，单位毫秒\nALIYUN_CLIENT_READ_TIMEOUT=10000 #读取数据超时，单位毫秒\n\n```\n\n\n## 阿里云Access权限设置\n\n\n* 申请证书 ：`AliyunDNSFullAccess`\n* 上传证书到阿里云： `AliyunYundunCertFullAccess`\n* 部署证书到OSS: `AliyunYundunCertFullAccess`、`AliyunOSSFullAccess`\n* 部署证书到CDN: `AliyunYundunCertFullAccess`、`AliyunCDNFullAccess`\n* 部署证书到DCDN： `AliyunYundunCertFullAccess`、`AliyunDCDNFullAccess`"
  },
  {
    "path": "docs/guide/use/backup/index.md",
    "content": "# 数据库备份\n* 两种备份方法：  1、手动备份  2、自动备份\n* 本文仅限sqlite数据库。\n## 一、手动备份\n数据库文件根据不同的部署方式保存的位置不一样，您可以手动复制出来进行备份\n\n* docker： 默认保存在`/data/certd/db.sqlite`\n* 源码： 默认保存在 `./packages/ui/certd-server/data/db.sqlite`\n* 宝塔： [手动数据备份位置](https://certd.docmirror.cn/guide/install/baota/#%E5%9B%9B%E3%80%81%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD) \n* 1panel:  默认保存在`/data/certd/db.sqlite`\n\n\n## 二、自动备份\n通过配置数据库自动备份流水线实现数据备份\n\n## 1. 创建自动备份流水线\n![](./images/1.png)\n\n## 2. 添加备份任务\n![](./images/2.png)\n\n## 3. 选择备份方法\n![](./images/3.png)\n\n## 4. 配置定时和失败通知\n![](./images/4.png)\n\n\n## 三、备份恢复\n\n将备份的`db.sqlite`覆盖到原来的位置，重启certd即可"
  },
  {
    "path": "docs/guide/use/cert/index.md",
    "content": "# 证书申请失败情况\n\n\n## DNS记录问题\n\n1. DNS 不要设置CAA记录，删除即可\n\n2. DNSSEC相关报错，DNSSEC管理中删除即可\n\n3. DNS 有其他平台申请过的_acme-challenge记录，删除即可\n"
  },
  {
    "path": "docs/guide/use/cf/cf.md",
    "content": "# Cloudflare \n\n\n## CF Token申请\n\n### 申请地址：\nhttps://dash.cloudflare.com/profile/api-tokens\n\n### 权限设置：\n需要设置权限和资源范围  \n权限包括：Zone.Zone.edit, Zone.DNS.edit  \n资源范围：要包含对应域名，推荐直接设置为All Zones  \n最终效果如下，可以切换语言为英文对比如下图检查\n\n![](./cf_token.png)"
  },
  {
    "path": "docs/guide/use/comm/index.md",
    "content": "# 商业版文档\n\n![](./images/index.png)\n\n## 支付方式配置\n\n* [支付宝支付配置](./payments/alipay.md)\n* [微信支付配置](./payments/wxpay.md)\n* [彩虹易支付配置](./payments/yizhifu.md)"
  },
  {
    "path": "docs/guide/use/comm/payments/alipay.md",
    "content": "# 支付宝配置\n\n## 配置步骤\n\n1. 创建应用，获取APPID\n   * 登录支付宝开放平台，进入开发者中心，创建网页应用，获取应用的AppId（左上角复制）\n   * 开发者中心：https://open.alipay.com/develop/manage\n\n\n2. 进入应用详情，选择开发设置，配置接口加签方式 （选择密钥类型）\n\n   * 参考文档：https://opendocs.alipay.com/common/02kdnc?pathHash=fb0c752a\n   * 此步骤完成后，可以获取应用的私钥、支付宝公钥。     \n   * 注意：支付宝不会保存应用的私钥，你需要自己保管好私钥。\n\n\n3. 在Certd后台配置支付宝 \n\n   * 进入“系统”->\"设置\"->“支付设置”\n   * 启用支付宝，选择“支付宝配置”，点击添加\n   * 填写支付宝AppId、应用私钥、支付宝公钥等信息即可。"
  },
  {
    "path": "docs/guide/use/comm/payments/wxpay.md",
    "content": "# 微信支付配置\n\n## 配置步骤\n\n1. 开通Native支付\n   * 登录微信支付平台\n   * 进入产品中心： https://pay.weixin.qq.com/index.php/extend/product/lists?tid=3\n   * 选择开通Native支付\n\n2. 申请证书\n\n   * 进入“账户中心”->“API安全”->“商户API证书”->“管理证书”\n   * 根据指引生成证书\n   * 得到私钥和公钥\n\n\n3. 填写APIv3密钥\n\n   * 进入“账户中心”->“API安全”->“解密回调”\n   * 填写APIv3密钥 \n   * 参考文档 https://kf.qq.com/faq/180830E36vyQ180830AZFZvu.html\n\n\n4. 在Certd后台配置微信支付\n   * 进入“系统”->\"设置\"->“支付设置”\n   * 启用微信支付，选择“微信支付配置”，点击添加\n   * 填写微信支付商户号、证书私钥、证书公钥、APIv3密钥即可。"
  },
  {
    "path": "docs/guide/use/comm/payments/yizhifu.md",
    "content": "# 彩虹易支付配置\n\n彩虹易支付是一款非常流行的php聚合支付系统。\n\n## 配置步骤\n\n1. 获取商户ID、商户密钥\n\n   * 登录彩虹易支付平台\n   * 进入用户中心：https://xxxxxx.com/user/userinfo.php?mod=api\n   * 点击API信息\n   * 可以复制：接口地址、商户ID、商户密钥（key）\n   * 点击查看文档，了解支持的签名类型，一般为MD5\n\n2. 进入Certd后台配置彩虹易支付\n\n   * 进入“系统”->\"设置\"->“支付设置”\n   * 启用彩虹易支付，选择“彩虹易支付配置”，点击添加\n   * 填写接口地址、商户ID、商户密钥、签名方式等信息即可。"
  },
  {
    "path": "docs/guide/use/custom-script/index.md",
    "content": "# 自定义脚本插件\n\n## 1. 介绍\n\n自定义脚本插件是一个通用的插件，可以通过编写脚本来实现各种功能，例如：调用第三方API、执行系统命令、发送邮件等。\n\n## 2. 使用示例\n```js\n\n// 如果需要引用第三方库，必须使用import语法\n// const thirdSdk = await import(\"third-sdk-name\")\n\nconst certPem = ctx.self.cert.crt\nconst certKey = ctx.self.cert.key\n\n//axios发起http请求上传证书\nconst res = await ctx.http.request({\n  url:\"your_cert_deploy_url\",\n  method:\"post\",\n  data:{\n    crt : certPem,\n    key : certKey\n  }\n})\nif(!res || res.code !== 0){\n    //抛异常才能让任务失败\n    throw new Error(\"上传失败\")\n}\n//不能用console.log，需要用ctx.logger 才能把日志打印在ui上\nctx.logger.info(\"上传成功\",res.data)\n\n\n```\n## 3. API\n下面是`ctx`对象的`typescript`类型定义\n\n```ts\n\ntype ctx = {\n  CertReader: typeof CertReader;\n  self: CustomScriptPlugin;\n  //流水线定义\n  pipeline: Pipeline;\n  //步骤定义\n  step: Step;\n  //日志\n  logger: Logger;\n  //当前步骤输入参数跟上一次执行比较是否有变化\n  inputChanged: boolean;\n  //授权获取服务 \n  accessService: IAccessService;\n  //邮件服务\n  emailService: IEmailService;\n  //cname记录服务\n  cnameProxyService: ICnameProxyService;\n  //插件配置服务\n  pluginConfigService: IPluginConfigService;\n  //流水线上下文\n  pipelineContext: IContext;\n  //用户上下文\n  userContext: IContext;\n  //http请求客户端 \n  http: HttpClient; // http.request(AxiosConfig)\n  //文件存储\n  fileStore: FileStore;\n  //上一次执行结果状态\n  lastStatus?: Runnable;\n  //用户取消信号\n  signal: AbortSignal;\n  //工具类\n  utils: typeof utils;\n  //用户信息\n  user: UserInfo;\n}\n\ntype CertInfo = {\n  crt:string; //fullchain证书，即 cert.pem， cert.crt\n  key:string; // 私钥\n  ic: string; //中间证书\n  pfx: string;//PFX证书，base64编码\n  der: string;//DER证书，base64编码\n}\n\ntype CustomScriptPlugin = {\n  //可以获取证书\n  cert: CertInfo\n}\n\n```\n\n"
  },
  {
    "path": "docs/guide/use/email/index.md",
    "content": "# 邮箱配置\n\n\n## 腾讯企业邮箱配置\n1. 开启smtp\n![](./images/qq-3.png)\n2. 获取授权码作为密码\n![](./images/qq-1.png)\n![](./images/qq-2.png)\n3. 填写域名、端口和密码\n   ![](./images/qq-0.png)\n\n## QQ邮箱配置\n1. smtp配置\n```yaml\nsmtp域名: smtp.qq.com\nsmtp端口: 465\n密码: 授权码，获取方式见下方\n是否SSL: 是\n```\n\n2. 获取授权码\n   ![](./images/qq-11.png)\n"
  },
  {
    "path": "docs/guide/use/forgotpasswd/index.md",
    "content": "# 忘记管理员密码\n解决方法如下：\n\n## 1. 修改环境变量\n修改docker-compose.yaml文件，将环境变量`certd_system_resetAdminPasswd`改为`true`\n```yaml\nservices:\n  certd:\n    environment: # 环境变量\n      - certd_system_resetAdminPasswd=false\n```\n## 2. 重启容器\n```shell\ndocker compose up -d\ndocker logs -f --tail 500 certd\n# 观察日志，当日志中输出“重置1号管理员用户的密码完成”，即可操作下一步\n```\n## 3. 恢复环境变量\n修改docker-compose.yaml，将`certd_system_resetAdminPasswd`改回`false`\n\n## 4. 再次重启容器\n```shell\ndocker compose up -d\n```\n## 5. 默认密码登录\n使用`admin/123456`登录系统，请及时修改管理员密码\n"
  },
  {
    "path": "docs/guide/use/google/index.md",
    "content": "# google证书申请教程\n\n## 1、启用API\n打开如下链接，启用 API\n\nhttps://console.cloud.google.com/apis/library/publicca.googleapis.com\n\n打开该链接后点击“启用”，随后等待右侧出现“API已启用”则可以关闭该页。\n\n## 2、 获取授权\n以下两种方式任选其一\n### 2.1 直接获取EAB 【推荐】\n\n\n1. 打开“Google Cloud Shell”（在右上角点击激活CloudShell图标）。   \n等待分配完成后在 Shell 窗口内输入如下命令：\n    \n```shell\ngcloud beta publicca external-account-keys create\n```\n2. 此时会弹出“为 Cloud Shell 提供授权”，点击授权即可。    \n执行完成后会返回类似如下输出；注意不要在没有收到 Google 的邮件时执行该命令，会返回命令不存在。\n\n```shell\nCreated an external account key\n[b64MacKey: xxxxxxxxxxxxxxxx\nkeyId: xxxxxxxxxxxxx]\n```\n\n3. 到Certd中，创建一条EAB授权记录，填写keyId(=kid) 和 b64MacKey 信息    \n   注意：keyId没有`]`结尾，不要把`]`也复制了   \n\n注意：EAB授权使用过一次之后，会绑定邮箱，后续再次使用时，要使用相同的邮箱    \n否则会报错 `Unknown external account binding (EAB) key. This may be due to the EAB key expiring which occurs 7 days after creation`\n\n### 2.2 通过服务账号获取EAB\n\n此方式可以自动EAB，需要配置代理\n\n1. 创建服务账号    \nhttps://console.cloud.google.com/projectselector2/iam-admin/serviceaccounts/create?walkthrough_id=iam--create-service-account&hl=zh-cn#step_index=1\n\n2. 选择一个项目，进入创建服务账号页面\n3. 给服务账号起一个名字，点击`创建并继续`\n4. 向此服务账号授予对项目的访问权限： `选择角色`->`基本`->`Owner`\n5. 点击完成\n6. 点击服务账号，进入服务账号详情页面\n7. 点击`添加密钥`->`创建新密钥`->`JSON`，下载密钥文件\n8. 将json文件内容粘贴到 certd中 Google服务授权输入框中\n\n\n## 3、 创建证书流水线\n选择证书提供商为google， 选择EAB授权 或 服务账号授权\n\n## 4、 其他就跟正常申请证书一样了\n\n"
  },
  {
    "path": "docs/guide/use/host/windows.md",
    "content": "# 连接windows主机\n\n远程主机基于ssh协议，通过ssh连接远程主机，执行命令。\n\n## windows开启OpenSSH Server\n### 1. 安装OpenSSH Server    \n\n* 下载安装包安装： https://github.com/PowerShell/Win32-OpenSSH/releases  OpenSSH-Win64-vxx.xx.x.msi\n\n* 前往Microsoft官方文档查看如何开启openSSH，以及其他设置    \nhttps://learn.microsoft.com/zh-cn/windows-server/administration/openssh/openssh_install_firstuse?tabs=gui#install-openssh-for-windows\n\n### 2. 启动OpenSSH Server服务\n```\nwin+R  弹出运行对话框，输入 services.msc 打开服务管理器\n找到 OpenSSH SSH Server \n启动ssh server服务，并且设置为自动启动\n```\n\n### 3. 测试ssh登录\n使用你常用的ssh客户端，连接你的windows主机，进行测试 \n\n```cmd\n# 如何确定你用户名\nC:\\Users\\xxxxx>\n          ↑↑↑↑---------这个就是windows ssh的登录用户名\n```\n\n### 4. 切换默认shell终端\n安装openssh后，默认终端是cmd，建议切换成powershell\n```shell\n# powershell中执行如下命令切换\n# 设置默认shell为powershell 【推荐】\nNew-ItemProperty -Path \"HKLM:\\SOFTWARE\\OpenSSH\" -Name DefaultShell -Value \"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -PropertyType String -Force\n\n# 恢复默认shell为cmd 【不推荐】\nNew-ItemProperty -Path \"HKLM:\\SOFTWARE\\OpenSSH\" -Name DefaultShell -Value \"C:\\Windows\\System32\\cmd.exe\" -PropertyType String -Force\n\n```"
  },
  {
    "path": "docs/guide/use/https/index.md",
    "content": "# Certd本身的https证书配置\n\n## 一、启用https\n\n`Certd`默认启用https，监听7002端口    \n如果你想关闭https，或者修改端口，可以在环境变量中配置\n```shell\nCERTD_HTTPS_ENABLE=true\nCERTD_HTTPS_port=7002\n\n```\n\n## 二、自动更新Certd的https证书\n\n### 1、创建证书流水线\n\n参考Certd顶部的创建证书流水线教程\n\n### 2、配置复制到本机任务\n将证书复制到certd的证书安装位置   \n证书路径：`ssl/cert.crt`   \n私钥路径：`ssl/cert.key` \n\n![](./images/1.png)\n![](./images/2.png)\n\n### 3、配置重启Certd任务\n重启certd的https server，让证书生效\n![img.png](./images/3.png)\n\n\n\n### 4、配置定时任务\n每天定时执行，最终效果如下\n\n![](./images/ok.png)\n\n:::warning   \n建议将本流水线的触发时间与其他流水线时间错开，避免重启时影响其他流水线的执行   \n:::"
  },
  {
    "path": "docs/guide/use/pretask/index.md",
    "content": "# 带输出的前置任务\n\n前置任务输出可以在后续任务中使用\n\n比如上传证书到阿里云，会返回阿里云的CertId，之后其他阿里云的部署任务可以选择复用这个证书\n\n## 复用证书\n\n![img.png](images/pretask1.png)\n\n在后续任务中可以选择前置任务的输出\n\n![img.png](images/pretask2.png)"
  },
  {
    "path": "docs/guide/use/rerun/index.md",
    "content": "# 如何强制重新执行任务\n\n## 强制重新执行任务\n\n![](./images/rerun.png)"
  },
  {
    "path": "docs/guide/use/setting/ipv6.md",
    "content": "# IPv6支持\n\n## 启用IPv6\n在`docker-compose.yaml`中启用IPv6支持，放开如下注释：\n```yaml\n#    #↓↓↓↓ ------------------------------------------------------------- 启用ipv6网络\n    networks:\n      - ip6net\nnetworks:\n  ip6net:\n    enable_ipv6: true\n    ipam:\n      config:\n        - subnet: 2001:db8::/64\n\n```\n\n## 设置双栈网络优先级\n可根据实际情况设置\n\n![img.png](./images/ipv6.png)"
  },
  {
    "path": "docs/guide/use/synology/index.md",
    "content": "# 群晖部署和证书更新\n\n支持群晖`6.x`、`7.x`\n\n## 一、群晖部署Certd\n\n以下是群晖`7.x`的部署`certd`步骤。   \n群晖`6.x`请参考[docker部署](./../../install/docker/)\n\n### 1. 打开Container Manager\n\n![](./images/1.png)\n\n### 2. 新增项目\n\n![](./images/2.png)\n\n### 3. 配置Certd项目\n\n![](./images/3.png)\n\n### 4. 外网访问设置\n\n![](./images/4.png)\n\n### 5. 确认项目信息\n\n![](./images/5.png)\n\n点击完成安装，等待certd启动完成即可\n\n### 6. 门户配置向导【可选】\n\n![](./images/6.png)\n\n\n## 二、更新群晖证书\n\n证书部署插件支持群晖`6.x`、`7.x`\n\n## 1. 前提条件\n* 已经部署了certd\n* 群晖上已经设置好了证书(证书建议设置好描述，插件需要根据描述查找证书)\n\n## 2. 在certd上配置自动更新群晖证书插件\n![](./images/deploy.png)\n\n## 3. 配置任务参数\n![](./images/deploy1.png)\n\n## 4. 创建授权\n![](./images/deploy2.png)\n> 注意群晖上要做两个设置   \n\n![](./images/setting2.png)\n![](./images/setting1.png)\n\n## 5. 运行部署\n点击手动运行即可\n![](./images/deploy3.png)\n![](./images/deploy4.png)\n\n## 6. 配置通知和自动运行\n![](./images/notify.png)"
  },
  {
    "path": "docs/guide/use/tencent/index.md",
    "content": "# 腾讯云\n\n## 腾讯云API密钥设置\n\n腾讯云其他部署需要API密钥，需要在腾讯云控制台进行设置   \n打开 https://console.cloud.tencent.com/cam/capi   \n然后按如下方式获取腾讯云的API密钥    \n![](./tencent-access.png)\n\n\n\n## 如何避免收到腾讯云证书过期邮件\n\n> 新版本已经自动将证书设置为免提醒，certd上传的证书后续都不会再提醒了。\n\n腾讯云在证书有效期还剩28天时会发送过期通知邮件    \n您可以通过配置“腾讯云过期证书删除”任务来避免收到此类邮件。\n\n![](./images/delete.png)\n\n注意点：\n> 1. 选择腾讯云授权，需授权`服务角色SSL_QCSLinkedRoleInReplaceLoadCertificate`权限\n> 2. `1.26.14`版本之前Certd创建的证书流水线默认是到期前20天才更新证书，需要将之前创建的证书申请任务的更新天数修改为35天，保证删除之前就已经替换掉即将过期证书\n![](./images/delete2.png)\n\n\n\n\n## TKE service 的 TCP_SSL Opaque类型证书授权\n\n部署证书到腾讯云TKE，如果报以下错误：     \n`is forbidden: User \"xxxxxx-xxxxx\" cannot get resource \"secrets\" in API group \"\" in the namespace \"default\"'`     \n则需要单独从授权管理侧再授权子用户的权限\n\n![](./images/tcpssl.png)\n\n![](./images/opaque.png)\n"
  },
  {
    "path": "docs/index.md",
    "content": "---\n# https://vitepress.dev/reference/default-theme-home-page\nlayout: home\n\nhero:\n  name: \"Certd\"\n  text: \"开源、免费、全自动的证书管理工具\"\n  tagline: 让你的网站证书永不过期\n  image:\n    src: /static/logo/logo.svg\n    alt: Certd\n  actions:\n    - theme: brand\n      text: 快速开始\n      link: /guide/start.md\n    - theme: alt\n      text: 演示教程\n      link: /guide/tutorial.md\n    - theme: alt\n      text: demo体验\n      link: https://certd.handfree.work\n\nfeatures:\n  - title: 全自动申请证书\n    details: 支持所有注册商注册的域名\n  - title: 全自动部署证书\n    details: 支持部署到主机、阿里云、腾讯云等，目前已支持60+部署插件\n  - title: 多域名、泛域名打到一个证书上\n    details: 支持通配符域名/泛域名，支持多个域名打到一个证书上\n  - title: 多证书格式支持\n    details: 支持pem、pfx、der、jks等多种证书格式，支持Google、Letsencrypt、ZeroSSL证书颁发机构\n  - title: 支持私有化部署\n    details: 授权数据加密存储，保障数据安全\n  - title: 多数据库支持\n    details: 支持SQLite、Postgresql、MySQL数据库\n---\n"
  },
  {
    "path": "docs/public/robots.txt",
    "content": "User-agent: *\nAllow: /\n"
  },
  {
    "path": "index.ts",
    "content": ""
  },
  {
    "path": "init.sh",
    "content": "\ncurrent_pwd=$(pwd)\n\necho \"开始设置git配置\"\n\nread -p \"请输入username：\" username\ngit config  user.name $username\n\nread -p \"请输入email：\" email\ngit config  user.email $email\n\ngit config credential.helper \"store --file=$current_pwd/.git/credential.store\"\necho \"已设置记住git账号密码\"\n\ngit config  core.autocrlf input   \necho \"已设置auto crlf = input\"\n\ngit config core.filemode false\necho \"已设置忽略文件模式变化\"\n\necho \"git配置完成\"\n"
  },
  {
    "path": "lerna.json",
    "content": "{\n  \"$schema\": \"node_modules/lerna/schemas/lerna-schema.json\",\n  \"useWorkspaces\": true,\n  \"command\": {\n    \"bootstrap\": {\n      \"npmClientArgs\": [\n        \"--no-package-lock\"\n      ]\n    }\n  },\n  \"npmClient\": \"pnpm\",\n  \"version\": \"1.36.10\"\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"root\",\n  \"version\": \"1.20.4\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"devDependencies\": {\n    \"@lerna-lite/cli\": \"^3.9.3\",\n    \"@lerna-lite/publish\": \"^3.9.3\",\n    \"@lerna-lite/run\": \"^3.9.3\",\n    \"@lerna-lite/version\": \"^3.9.3\",\n    \"medium-zoom\": \"^1.1.0\",\n    \"vitepress\": \"^2.0.0-alpha.4\",\n    \"vitepress-plugin-lightbox\": \"^1.0.2\"\n  },\n  \"scripts\": {\n    \"start\": \"lerna bootstrap --hoist\",\n    \"devb\": \"lerna run dev-build\",\n    \"i-all\": \"lerna link && lerna exec npm install  \",\n    \"publish\": \"npm run prepublishOnly2  && lerna publish --force-publish=pro/plus-core --conventional-commits --create-release github && npm run afterpublishOnly && npm run commitAll\",\n    \"afterpublishOnly\": \"npm run copylogs && time /t >build.trigger && git add ./build.trigger && git commit -m \\\"build: trigger build image\\\" && TIMEOUT /T 10 && git push\",\n    \"transform-sql\": \"cd ./packages/ui/certd-server/db/ && node --experimental-json-modules transform.js\",\n    \"commitAll\": \"git add . && git commit -m \\\"build: publish\\\" && git push && npm run commitPro\",\n    \"commitPro\": \"cd ./packages/pro/ && git add . && git commit -m \\\"build: publish\\\" && git push\",\n    \"copylogs\": \"copyfiles \\\"CHANGELOG.md\\\"  ./docs/guide/changelogs/\",\n    \"prepublishOnly1\": \"npm run check && lerna run build \",\n    \"prepublishOnly2\": \"npm run check && npm run before-build && lerna run build \",\n    \"before-build\": \"npm run transform-sql && cd ./packages/core/basic && time /t >build.md && git add ./build.md && git commit -m \\\"build: prepare to build\\\"\",\n    \"deploy1\": \"node --experimental-json-modules deploy.js \",\n    \"check\": \"node --experimental-json-modules publish-check.js\",\n    \"init\": \"lerna run build\",\n    \"init:dev\": \"lerna run build\",\n    \"docs:dev\": \"vitepress dev docs\",\n    \"docs:build\": \"vitepress build docs\",\n    \"docs:preview\": \"vitepress preview docs\",\n    \"pub\": \"echo 1\"\n  },\n  \"license\": \"AGPL-3.0\",\n  \"dependencies\": {\n    \"@certd/ui-server\": \"link:packages/ui/certd-server\",\n    \"axios\": \"^1.7.7\",\n    \"copyfiles\": \"^2.4.1\",\n    \"lodash-es\": \"^4.17.21\",\n    \"typescript\": \"^5.4.2\"\n  },\n  \"workspaces\": [\n    \"packages/**\"\n  ],\n  \"pnpm\": {\n    \"neverBuiltDependencies\": []\n  }\n}\n"
  },
  {
    "path": "packages/core/acme-client/.editorconfig",
    "content": "#\n# http://editorconfig.org\n#\n\nroot = true\n\n[*]\nindent_style = space\nindent_size = 4\ntrim_trailing_whitespace = true\n\n[{*.yml,*.yaml}]\nindent_size = 2\n"
  },
  {
    "path": "packages/core/acme-client/.eslintrc",
    "content": "{\n  \"extends\": [\n    \"plugin:prettier/recommended\",\n    \"prettier\"\n  ],\n  \"plugins\": [\n    \"eslint-plugin-import\"\n  ],\n  \"env\": {\n    \"mocha\": true\n  },\n  \"rules\": {\n    \"@typescript-eslint/no-var-requires\": \"off\",\n    \"@typescript-eslint/ban-ts-comment\": \"off\",\n    \"@typescript-eslint/ban-ts-ignore\": \"off\",\n    \"@typescript-eslint/no-explicit-any\": \"off\",\n    \"@typescript-eslint/no-empty-function\": \"off\",\n    //    \"no-unused-expressions\": \"off\",\n    \"max-len\": [\n      0,\n      160,\n      2,\n      {\n        \"ignoreUrls\": true\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "packages/core/acme-client/.github/scripts/tests-install-coredns.sh",
    "content": "#!/bin/bash\n#\n# Install CoreDNS for testing.\n#\nset -euo pipefail\n\n# Download and install\nwget -nv \"https://github.com/coredns/coredns/releases/download/v${COREDNS_VERSION}/coredns_${COREDNS_VERSION}_linux_amd64.tgz\" -O /tmp/coredns.tgz\n\ntar zxvf /tmp/coredns.tgz -C /usr/local/bin\nchown root:root /usr/local/bin/coredns\nchmod 0755 /usr/local/bin/coredns\n\nmkdir -p /etc/coredns\n\n# Zones\ntee /etc/coredns/db.example.com << EOF\n\\$ORIGIN example.com.\n@       3600 IN SOA ns.coredns.invalid. master.coredns.invalid. (\n                                2017042745  ; serial\n                                7200        ; refresh\n                                3600        ; retry\n                                1209600     ; expire\n                                3600        ; minimum\n                                )\n\n        3600 IN NS ns1.example.com.\n        3600 IN NS ns2.example.com.\n\nns1     3600 IN A 127.0.0.1\nns2     3600 IN A 127.0.0.1\n\n@       3600 IN A 127.0.0.1\nwww     3600 IN CNAME example.com.\nEOF\n\n# Config\ntee /etc/coredns/Corefile << EOF\nexample.com {\n    errors\n    log\n    bind 127.53.53.53\n    file /etc/coredns/db.example.com\n}\n\ntest.example.com {\n    errors\n    log\n    bind 127.53.53.53\n    forward . 127.0.0.1:${PEBBLECTS_DNS_PORT}\n}\n\n. {\n    errors\n    log\n    bind 127.53.53.53\n    forward . 8.8.8.8\n}\nEOF\n\nexit 0\n"
  },
  {
    "path": "packages/core/acme-client/.github/scripts/tests-install-cts.sh",
    "content": "#!/bin/bash\n#\n# Install Pebble Challenge Test Server for testing.\n#\nset -euo pipefail\n\n# Download and install\nwget -nv \"https://github.com/letsencrypt/pebble/releases/download/v${PEBBLECTS_VERSION}/pebble-challtestsrv-linux-amd64.tar.gz\" -O /tmp/pebble-challtestsrv.tar.gz\ntar zxvf /tmp/pebble-challtestsrv.tar.gz -C /tmp\n\nmv /tmp/pebble-challtestsrv-linux-amd64/linux/amd64/pebble-challtestsrv /usr/local/bin/pebble-challtestsrv\nchown root:root /usr/local/bin/pebble-challtestsrv\nchmod 0755 /usr/local/bin/pebble-challtestsrv\n\nexit 0\n"
  },
  {
    "path": "packages/core/acme-client/.github/scripts/tests-install-pebble.sh",
    "content": "#!/bin/bash\n#\n# Install Pebble for testing.\n#\nset -euo pipefail\n\nCONFIG_NAME=\"pebble-config.json\"\n\n# Use Pebble EAB config if enabled\nset +u\nif [[ -n $ACME_CAP_EAB_ENABLED ]] && [[ $ACME_CAP_EAB_ENABLED -eq 1 ]]; then\n    CONFIG_NAME=\"pebble-config-external-account-bindings.json\"\nfi\nset -u\n\n# Download certs and config\nmkdir -p /etc/pebble\n\nwget -nv \"https://raw.githubusercontent.com/letsencrypt/pebble/v${PEBBLE_VERSION}/test/certs/pebble.minica.pem\" -O /etc/pebble/ca.cert.pem\nwget -nv \"https://raw.githubusercontent.com/letsencrypt/pebble/v${PEBBLE_VERSION}/test/certs/localhost/cert.pem\" -O /etc/pebble/cert.pem\nwget -nv \"https://raw.githubusercontent.com/letsencrypt/pebble/v${PEBBLE_VERSION}/test/certs/localhost/key.pem\" -O /etc/pebble/key.pem\nwget -nv \"https://raw.githubusercontent.com/letsencrypt/pebble/v${PEBBLE_VERSION}/test/config/${CONFIG_NAME}\" -O /etc/pebble/pebble.json\n\n# Download and install Pebble\nwget -nv \"https://github.com/letsencrypt/pebble/releases/download/v${PEBBLE_VERSION}/pebble-linux-amd64.tar.gz\" -O /tmp/pebble.tar.gz\ntar zxvf /tmp/pebble.tar.gz -C /tmp\n\nmv /tmp/pebble-linux-amd64/linux/amd64/pebble /usr/local/bin/pebble\nchown root:root /usr/local/bin/pebble\nchmod 0755 /usr/local/bin/pebble\n\n# Config\nsed -i 's#test/certs/localhost#/etc/pebble#' /etc/pebble/pebble.json\n\nexit 0\n"
  },
  {
    "path": "packages/core/acme-client/.github/scripts/tests-wait-for-ca.sh",
    "content": "#!/bin/bash\n#\n# Wait for ACME server to accept connections.\n#\nset -euo pipefail\n\nMAX_ATTEMPTS=15\nATTEMPT=0\n\n# Loop until ready\nwhile ! curl --cacert \"${ACME_CA_CERT_PATH}\" -s -D - \"${ACME_DIRECTORY_URL}\" | grep '^HTTP.*200' > /dev/null 2>&1; do\n    ATTEMPT=$((ATTEMPT + 1))\n\n    # Max attempts\n    if [[ $ATTEMPT -gt $MAX_ATTEMPTS ]]; then\n        echo \"[!] Waited ${ATTEMPT} attempts for server to become ready, exit 1\"\n        exit 1\n    fi\n\n    # Retry\n    echo \"[-] Waiting 1 second for server to become ready, attempt: ${ATTEMPT}/${MAX_ATTEMPTS}, check: ${ACME_DIRECTORY_URL}, cert: ${ACME_CA_CERT_PATH}\"\n    sleep 1\ndone\n\n# Ready\necho \"[+] Server ready!\"\nexit 0\n"
  },
  {
    "path": "packages/core/acme-client/.github/workflows/tests.yml",
    "content": "name: test\non: [push, pull_request]\n\njobs:\n  test:\n    name: node=${{matrix.node}} eab=${{matrix.eab}}\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node: [16, 18, 20]\n        eab: [0, 1]\n\n    #\n    # Environment\n    #\n\n    env:\n      FORCE_COLOR: 1\n      NPM_CONFIG_COLOR: always\n\n      PEBBLE_VERSION: 2.6.0\n      PEBBLE_ALTERNATE_ROOTS: 2\n      PEBBLECTS_VERSION: 2.6.0\n      PEBBLECTS_DNS_PORT: 8053\n      COREDNS_VERSION: 1.11.1\n\n      NODE_EXTRA_CA_CERTS: /etc/pebble/ca.cert.pem\n      ACME_CA_CERT_PATH: /etc/pebble/ca.cert.pem\n\n      ACME_DIRECTORY_URL: https://127.0.0.1:14000/dir\n      ACME_CHALLTESTSRV_URL: http://127.0.0.1:8055\n      ACME_PEBBLE_MANAGEMENT_URL: https://127.0.0.1:15000\n\n      ACME_DOMAIN_NAME: test.example.com\n      ACME_CAP_EAB_ENABLED: ${{matrix.eab}}\n\n      ACME_TLSALPN_PORT: 5001\n      ACME_HTTP_PORT: 5002\n      ACME_HTTPS_PORT: 5003\n\n    #\n    # Pipeline\n    #\n\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: ${{matrix.node}}\n\n      # Pebble Challenge Test Server\n      - name: Install Pebble Challenge Test Server\n        run: sudo -E /bin/bash ./.github/scripts/tests-install-cts.sh\n\n      - name: Start Pebble Challenge Test Server\n        run: |-\n          nohup bash -c \"pebble-challtestsrv \\\n            -dns01 :${PEBBLECTS_DNS_PORT} \\\n            -tlsalpn01 :${ACME_TLSALPN_PORT} \\\n            -http01 :${ACME_HTTP_PORT} \\\n            -https01 :${ACME_HTTPS_PORT} \\\n            -defaultIPv4 127.0.0.1 \\\n            -defaultIPv6 \\\"\\\" &\"\n\n      # Pebble\n      - name: Install Pebble\n        run: sudo -E /bin/bash ./.github/scripts/tests-install-pebble.sh\n\n      - name: Start Pebble\n        run: nohup bash -c \"pebble -strict -config /etc/pebble/pebble.json -dnsserver 127.53.53.53:53 &\"\n\n      - name: Wait for Pebble\n        run: /bin/bash ./.github/scripts/tests-wait-for-ca.sh\n\n      # CoreDNS\n      - name: Install CoreDNS\n        run: sudo -E /bin/bash ./.github/scripts/tests-install-coredns.sh\n\n      - name: Start CoreDNS\n        run: nohup bash -c \"sudo coredns -p 53 -conf /etc/coredns/Corefile &\"\n\n      - name: Use CoreDNS for DNS resolution\n        run: echo \"nameserver 127.53.53.53\" | sudo tee /etc/resolv.conf\n\n      # Run tests\n      - run: npm i\n      - run: npm run lint\n      - run: npm run lint-types\n      - run: npm run build-docs\n      - run: npm run test\n"
  },
  {
    "path": "packages/core/acme-client/.gitignore",
    "content": ".actrc\n.vscode/\nnode_modules/\nnpm-debug.log\npackage-lock.json\n/.idea/\n"
  },
  {
    "path": "packages/core/acme-client/.prettierrc",
    "content": "{\n  \"printWidth\": 220,\n  \"bracketSpacing\": true,\n  \"singleQuote\": false,\n  \"trailingComma\": \"es5\",\n  \"arrowParens\": \"avoid\"\n}"
  },
  {
    "path": "packages/core/acme-client/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/publishlab/node-acme-client/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.36.9](https://github.com/publishlab/node-acme-client/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.36.7](https://github.com/publishlab/node-acme-client/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.36.6](https://github.com/publishlab/node-acme-client/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.36.5](https://github.com/publishlab/node-acme-client/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.36.4](https://github.com/publishlab/node-acme-client/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.36.3](https://github.com/publishlab/node-acme-client/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.36.2](https://github.com/publishlab/node-acme-client/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.36.1](https://github.com/publishlab/node-acme-client/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n**Note:** Version bump only for package @certd/acme-client\n\n# [1.36.0](https://github.com/publishlab/node-acme-client/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.35.5](https://github.com/publishlab/node-acme-client/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.35.4](https://github.com/publishlab/node-acme-client/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.35.3](https://github.com/publishlab/node-acme-client/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.35.2](https://github.com/publishlab/node-acme-client/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.35.1](https://github.com/publishlab/node-acme-client/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n### Performance Improvements\n\n* 证书申请支持letencrypt profile选项 ([2eb0e54](https://github.com/publishlab/node-acme-client/commit/2eb0e54909d8ad36708e07c12fd598998159bc43))\n\n# [1.35.0](https://github.com/publishlab/node-acme-client/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.34.11](https://github.com/publishlab/node-acme-client/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n### Bug Fixes\n\n* 修复中文域名使用cname方式校验无法通过的问题 ([f7d5baa](https://github.com/publishlab/node-acme-client/commit/f7d5baa6d04cb83c572b06e62f885890cfa0143a))\n\n### Performance Improvements\n\n* 优化cname检查，当有冲突的cname记录时，给出提示 ([e639a8f](https://github.com/publishlab/node-acme-client/commit/e639a8f9f12640ffcca69f1a6a0324459924afbd))\n\n## [1.34.10](https://github.com/publishlab/node-acme-client/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.34.9](https://github.com/publishlab/node-acme-client/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.34.8](https://github.com/publishlab/node-acme-client/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.34.7](https://github.com/publishlab/node-acme-client/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.34.6](https://github.com/publishlab/node-acme-client/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.34.5](https://github.com/publishlab/node-acme-client/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.34.4](https://github.com/publishlab/node-acme-client/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.34.3](https://github.com/publishlab/node-acme-client/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.34.2](https://github.com/publishlab/node-acme-client/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n### Performance Improvements\n\n* http方式支持校验443端口 ([d75fcb7](https://github.com/publishlab/node-acme-client/commit/d75fcb7fec421a9a638eaa27fe9378c84b5e0f19))\n\n## [1.34.1](https://github.com/publishlab/node-acme-client/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n### Bug Fixes\n\n* 根据SOA记录判断子域名托管有缺陷，改回手动配置子域名托管记录的方式 ([1b280a2](https://github.com/publishlab/node-acme-client/commit/1b280a2940f9e2d919b0bf23b89cc185be1fa498))\n\n# [1.34.0](https://github.com/publishlab/node-acme-client/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.33.8](https://github.com/publishlab/node-acme-client/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n### Bug Fixes\n\n* 修复http上传方式无法清除记录文件的bug ([72a7b51](https://github.com/publishlab/node-acme-client/commit/72a7b51d479602b2c54c6c3ac8d8a0dcb9664e73))\n\n### Performance Improvements\n\n* 从域名的soa获取主域名，子域名托管无需额外配置 ([a586a92](https://github.com/publishlab/node-acme-client/commit/a586a92d5e32ea846ac37be52a7ad8c328d89966))\n* 七牛oss支持删除过期备份 ([b7113bd](https://github.com/publishlab/node-acme-client/commit/b7113bda2378116d6c116dc583f563cce7cf9f00))\n\n## [1.33.7](https://github.com/publishlab/node-acme-client/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.33.6](https://github.com/publishlab/node-acme-client/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.33.5](https://github.com/publishlab/node-acme-client/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.33.4](https://github.com/publishlab/node-acme-client/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.33.3](https://github.com/publishlab/node-acme-client/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.33.2](https://github.com/publishlab/node-acme-client/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.33.1](https://github.com/publishlab/node-acme-client/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n**Note:** Version bump only for package @certd/acme-client\n\n# [1.33.0](https://github.com/publishlab/node-acme-client/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n**Note:** Version bump only for package @certd/acme-client\n\n# [1.32.0](https://github.com/publishlab/node-acme-client/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n### Bug Fixes\n\n* 修复从本地dns获取记录报错的bug ([c39b1bf](https://github.com/publishlab/node-acme-client/commit/c39b1bf823ddc6216bed2049e4c87e6107def08a))\n\n### Features\n\n* 优化证书申请速度，修复某些情况下letsencrypt 校验失败的问题 ([857589b](https://github.com/publishlab/node-acme-client/commit/857589b365c6f709e0ae67914d2f50ce182e6dd6))\n\n### Performance Improvements\n\n* 优化华为dns解析记录创建和删除问题 ([0948c5b](https://github.com/publishlab/node-acme-client/commit/0948c5bc691d2ee6eb47c72a85da1b7453361878))\n\n## [1.31.11](https://github.com/publishlab/node-acme-client/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.31.10](https://github.com/publishlab/node-acme-client/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.31.9](https://github.com/publishlab/node-acme-client/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n### Performance Improvements\n\n* dns支持火山引擎 ([99ff879](https://github.com/publishlab/node-acme-client/commit/99ff879d93658c29ea493a4bde7e9e3f85996d64))\n\n## [1.31.8](https://github.com/publishlab/node-acme-client/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n### Performance Improvements\n\n* 优化txt本地校验效率 ([fd507f2](https://github.com/publishlab/node-acme-client/commit/fd507f269253607e68c5c099c99e0de11636f229))\n\n## [1.31.7](https://github.com/publishlab/node-acme-client/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.31.6](https://github.com/publishlab/node-acme-client/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.31.5](https://github.com/publishlab/node-acme-client/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.31.4](https://github.com/publishlab/node-acme-client/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.31.3](https://github.com/publishlab/node-acme-client/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.31.2](https://github.com/publishlab/node-acme-client/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.31.1](https://github.com/publishlab/node-acme-client/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n**Note:** Version bump only for package @certd/acme-client\n\n# [1.31.0](https://github.com/publishlab/node-acme-client/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.30.6](https://github.com/publishlab/node-acme-client/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.30.5](https://github.com/publishlab/node-acme-client/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.30.4](https://github.com/publishlab/node-acme-client/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.30.3](https://github.com/publishlab/node-acme-client/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.30.2](https://github.com/publishlab/node-acme-client/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.30.1](https://github.com/publishlab/node-acme-client/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n**Note:** Version bump only for package @certd/acme-client\n\n# [1.30.0](https://github.com/publishlab/node-acme-client/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n### Bug Fixes\n\n* 修复查看任务日志偶发性无法自动滚动底部的bug ([7e482f7](https://github.com/publishlab/node-acme-client/commit/7e482f798c0142bce1866f84676cb40210f9638a))\n\n## [1.29.5](https://github.com/publishlab/node-acme-client/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.29.4](https://github.com/publishlab/node-acme-client/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.29.3](https://github.com/publishlab/node-acme-client/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n### Performance Improvements\n\n* 优化acme sdk ([54db744](https://github.com/publishlab/node-acme-client/commit/54db74428259de64d12230c2ab7353ae11197bbc))\n\n## [1.29.2](https://github.com/publishlab/node-acme-client/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.29.1](https://github.com/publishlab/node-acme-client/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n**Note:** Version bump only for package @certd/acme-client\n\n# [1.29.0](https://github.com/publishlab/node-acme-client/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.28.4](https://github.com/publishlab/node-acme-client/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.28.3](https://github.com/publishlab/node-acme-client/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.28.2](https://github.com/publishlab/node-acme-client/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n### Performance Improvements\n\n* 支持mysql ([7cde1fd](https://github.com/publishlab/node-acme-client/commit/7cde1fdc4a9ed851900d231a5460c8dbfbcd148e))\n\n## [1.28.1](https://github.com/publishlab/node-acme-client/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n**Note:** Version bump only for package @certd/acme-client\n\n# [1.28.0](https://github.com/publishlab/node-acme-client/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.27.9](https://github.com/publishlab/node-acme-client/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.27.8](https://github.com/publishlab/node-acme-client/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.27.7](https://github.com/publishlab/node-acme-client/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.27.6](https://github.com/publishlab/node-acme-client/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.27.5](https://github.com/publishlab/node-acme-client/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.27.4](https://github.com/publishlab/node-acme-client/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.27.3](https://github.com/publishlab/node-acme-client/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.27.2](https://github.com/publishlab/node-acme-client/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.27.1](https://github.com/publishlab/node-acme-client/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n**Note:** Version bump only for package @certd/acme-client\n\n# [1.27.0](https://github.com/publishlab/node-acme-client/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.16](https://github.com/publishlab/node-acme-client/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.15](https://github.com/publishlab/node-acme-client/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.14](https://github.com/publishlab/node-acme-client/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n### Bug Fixes\n\n* 修复启动时自签证书无法保存的bug ([526c484](https://github.com/publishlab/node-acme-client/commit/526c48450bcd37b3ccded9b448f17de8140bdc6e))\n\n## [1.26.13](https://github.com/publishlab/node-acme-client/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.12](https://github.com/publishlab/node-acme-client/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.11](https://github.com/publishlab/node-acme-client/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n### Bug Fixes\n\n* 申请证书没有使用到系统设置的http代理的bug ([3db216f](https://github.com/publishlab/node-acme-client/commit/3db216f515ba404cb4330fdab452971b22a50f08))\n* 修复google证书*.xx.com与xx.com同时申请时报错的bug ([f8b99b8](https://github.com/publishlab/node-acme-client/commit/f8b99b81a23e7e9fd5e05ebd5caf355c41d67a90))\n\n### Performance Improvements\n\n* 优化证书申请速度和成功率，反代地址优化，google基本可以稳定请求。增加请求重试。 ([41d9c3a](https://github.com/publishlab/node-acme-client/commit/41d9c3ac8398def541e65351cbe920d4a927182d))\n\n## [1.26.10](https://github.com/publishlab/node-acme-client/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.9](https://github.com/publishlab/node-acme-client/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.8](https://github.com/publishlab/node-acme-client/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.7](https://github.com/publishlab/node-acme-client/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.6](https://github.com/publishlab/node-acme-client/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.5](https://github.com/publishlab/node-acme-client/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.4](https://github.com/publishlab/node-acme-client/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.3](https://github.com/publishlab/node-acme-client/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.2](https://github.com/publishlab/node-acme-client/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.26.1](https://github.com/publishlab/node-acme-client/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package @certd/acme-client\n\n# [1.26.0](https://github.com/publishlab/node-acme-client/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n### Features\n\n* 域名验证方法支持CNAME间接方式，此方式支持所有域名注册商，且无需提供Access授权，但是需要手动添加cname解析 ([f3d3508](https://github.com/publishlab/node-acme-client/commit/f3d35084ed44f9f33845f7045e520be5c27eed93))\n\n## [1.25.9](https://github.com/publishlab/node-acme-client/compare/v1.25.8...v1.25.9) (2024-10-01)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.25.8](https://github.com/publishlab/node-acme-client/compare/v1.25.7...v1.25.8) (2024-09-30)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.25.7](https://github.com/publishlab/node-acme-client/compare/v1.25.6...v1.25.7) (2024-09-29)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.25.6](https://github.com/publishlab/node-acme-client/compare/v1.25.5...v1.25.6) (2024-09-29)\n\n### Performance Improvements\n\n* 部署支持1Panel ([d047234](https://github.com/publishlab/node-acme-client/commit/d047234d98d31504f2e5a472b66e1b75806af26e))\n\n## [1.25.5](https://github.com/publishlab/node-acme-client/compare/v1.25.4...v1.25.5) (2024-09-26)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.25.4](https://github.com/publishlab/node-acme-client/compare/v1.25.3...v1.25.4) (2024-09-25)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.25.3](https://github.com/publishlab/node-acme-client/compare/v1.25.2...v1.25.3) (2024-09-24)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.25.2](https://github.com/publishlab/node-acme-client/compare/v1.25.1...v1.25.2) (2024-09-24)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.25.1](https://github.com/publishlab/node-acme-client/compare/v1.25.0...v1.25.1) (2024-09-24)\n\n**Note:** Version bump only for package @certd/acme-client\n\n# [1.25.0](https://github.com/publishlab/node-acme-client/compare/v1.24.4...v1.25.0) (2024-09-24)\n\n### Performance Improvements\n\n* 证书支持旧版RSA，pkcs1 ([3d9c3ec](https://github.com/publishlab/node-acme-client/commit/3d9c3ecb3eb604b2458154f608bde0f01915d116))\n* 支持七牛云 ([8ecc2f9](https://github.com/publishlab/node-acme-client/commit/8ecc2f9446a9ebd11b9bfbffbb6cf7812a043495))\n\n## [1.24.4](https://github.com/publishlab/node-acme-client/compare/v1.24.3...v1.24.4) (2024-09-09)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.24.3](https://github.com/publishlab/node-acme-client/compare/v1.24.2...v1.24.3) (2024-09-06)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.24.2](https://github.com/publishlab/node-acme-client/compare/v1.24.1...v1.24.2) (2024-09-06)\n\n### Performance Improvements\n\n* 修复windows下无法执行第二条命令的bug ([d5bfcdb](https://github.com/publishlab/node-acme-client/commit/d5bfcdb6de1dcc1702155442e2e00237d0bbb6e5))\n\n## [1.24.1](https://github.com/publishlab/node-acme-client/compare/v1.24.0...v1.24.1) (2024-09-02)\n\n### Bug Fixes\n\n* 修复在没有勾选使用代理的情况下，仍然会使用代理的bug ([0f66794](https://github.com/publishlab/node-acme-client/commit/0f6679425f6a736bb0128527dd99c085fac17d84))\n\n### Performance Improvements\n\n* 部署插件支持宝塔、易盾云等 ([ee61709](https://github.com/publishlab/node-acme-client/commit/ee617095efa1171548cf52fd45f0f98a368555a3))\n* 授权配置支持加密 ([42a56b5](https://github.com/publishlab/node-acme-client/commit/42a56b581d754c3e5f9838179d19ab0d004ef2eb))\n\n# [1.24.0](https://github.com/publishlab/node-acme-client/compare/v1.23.1...v1.24.0) (2024-08-25)\n\n### Bug Fixes\n\n* 修复成功后跳过之后丢失腾讯云证书id的bug ([37eb762](https://github.com/publishlab/node-acme-client/commit/37eb762afe25c5896b75dee25f32809f8426e7b7))\n* 修复创建流水线后立即运行时报no id错误的bug ([17ead54](https://github.com/publishlab/node-acme-client/commit/17ead547aab25333603980304aa3aad3db1f73d5))\n* 修复使用代理的情况下申请证书失败的bug ([95122e2](https://github.com/publishlab/node-acme-client/commit/95122e28609333f4df55c266e5434897954c0fb3))\n\n### Features\n\n* 支持google证书申请（需要使用代理） ([a593056](https://github.com/publishlab/node-acme-client/commit/a593056e79e99dd6a74f75b5eab621af7248cfbe))\n\n### Performance Improvements\n\n* 优化证书申请成功率 ([968c469](https://github.com/publishlab/node-acme-client/commit/968c4690a07f69c08dcb3d3a494da4e319627345))\n\n## [1.22.6](https://github.com/publishlab/node-acme-client/compare/v1.22.5...v1.22.6) (2024-08-03)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.22.4](https://github.com/publishlab/node-acme-client/compare/v1.22.3...v1.22.4) (2024-07-26)\n\n### Performance Improvements\n\n* 证书申请支持反向代理，letsencrypt无法访问时的备用方案 ([b7b5df0](https://github.com/publishlab/node-acme-client/commit/b7b5df0587e0f7ea288c1b2af6f87211f207395f))\n\n## [1.22.3](https://github.com/publishlab/node-acme-client/compare/v1.22.2...v1.22.3) (2024-07-25)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.22.2](https://github.com/publishlab/node-acme-client/compare/v1.22.1...v1.22.2) (2024-07-23)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.22.1](https://github.com/publishlab/node-acme-client/compare/v1.22.0...v1.22.1) (2024-07-20)\n\n**Note:** Version bump only for package @certd/acme-client\n\n# [1.22.0](https://github.com/publishlab/node-acme-client/compare/v1.21.2...v1.22.0) (2024-07-19)\n\n### Features\n\n* 升级midway，支持esm ([485e603](https://github.com/publishlab/node-acme-client/commit/485e603b5165c28bc08694997726eaf2a585ebe7))\n\n## [1.21.2](https://github.com/publishlab/node-acme-client/compare/v1.21.1...v1.21.2) (2024-07-08)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.21.1](https://github.com/publishlab/node-acme-client/compare/v1.21.0...v1.21.1) (2024-07-08)\n\n**Note:** Version bump only for package @certd/acme-client\n\n# [1.21.0](https://github.com/publishlab/node-acme-client/compare/v1.20.17...v1.21.0) (2024-07-03)\n\n### Features\n\n* 支持zero ssl ([eade2c2](https://github.com/publishlab/node-acme-client/commit/eade2c2b681569f03e9cd466e7d5bcd6703ed492))\n\n## [1.20.17](https://github.com/publishlab/node-acme-client/compare/v1.20.16...v1.20.17) (2024-07-03)\n\n### Performance Improvements\n\n* 创建dns解析后，强制等待60s ([f47b35f](https://github.com/publishlab/node-acme-client/commit/f47b35f6d5bd7d675005c3e286b7e9a029201f8b))\n* 优化cname verify ([eba333d](https://github.com/publishlab/node-acme-client/commit/eba333de7a5b5ef4b0b7eaa904f578720102fa61))\n\n## [1.20.16](https://github.com/publishlab/node-acme-client/compare/v1.20.15...v1.20.16) (2024-07-01)\n\n### Bug Fixes\n\n* 修复配置了cdn cname后申请失败的bug ([4a5fa76](https://github.com/publishlab/node-acme-client/commit/4a5fa767edc347d03d29a467e86c9a4d70b0220c))\n\n## [1.20.15](https://github.com/publishlab/node-acme-client/compare/v1.20.14...v1.20.15) (2024-06-28)\n\n### Performance Improvements\n\n* 腾讯云dns provider 支持腾讯云的accessId ([e0eb3a4](https://github.com/publishlab/node-acme-client/commit/e0eb3a441384d474fe2923c69b25318264bdc9df))\n\n## [1.20.14](https://github.com/publishlab/node-acme-client/compare/v1.20.13...v1.20.14) (2024-06-23)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.20.13](https://github.com/publishlab/node-acme-client/compare/v1.20.12...v1.20.13) (2024-06-18)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.20.12](https://github.com/publishlab/node-acme-client/compare/v1.20.10...v1.20.12) (2024-06-17)\n\n### Bug Fixes\n\n* 修复aliyun域名超过100个找不到域名的bug ([5b1494b](https://github.com/publishlab/node-acme-client/commit/5b1494b3ce93d1026dc56ee741342fbb8bf7be24))\n\n### Performance Improvements\n\n* 支持cloudflare域名 ([fbb9a47](https://github.com/publishlab/node-acme-client/commit/fbb9a47e8f7bb805289b9ee64bd46ffee0f01c06))\n\n## [1.20.10](https://github.com/publishlab/node-acme-client/compare/v1.20.9...v1.20.10) (2024-05-30)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.20.9](https://github.com/publishlab/node-acme-client/compare/v1.20.8...v1.20.9) (2024-03-22)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.20.8](https://github.com/publishlab/node-acme-client/compare/v1.20.7...v1.20.8) (2024-03-22)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.20.7](https://github.com/publishlab/node-acme-client/compare/v1.20.6...v1.20.7) (2024-03-22)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.20.6](https://github.com/publishlab/node-acme-client/compare/v1.20.5...v1.20.6) (2024-03-21)\n\n**Note:** Version bump only for package @certd/acme-client\n\n## [1.20.5](https://github.com/publishlab/node-acme-client/compare/v1.20.2...v1.20.5) (2024-03-11)\n\n### Bug Fixes\n\n* 修复腾讯云cdn部署无法选择端点的bug ([154409b](https://github.com/publishlab/node-acme-client/commit/154409b1dfee3ea1caae740ad9c1f99a6e7a9814))\n\n# Changelog\n\n## v5.4.0 (2024-07-16)\n\n* `added` Directory URLs for [Google](https://cloud.google.com/certificate-manager/docs/overview) ACME provider\n* `fixed` Invalidate ACME provider directory cache after 24 hours\n* `fixed` Retry HTTP requests on server errors or when rate limited - [#89](https://github.com/publishlab/node-acme-client/issues/89)\n\n## v5.3.1 (2024-05-22)\n\n* `fixed` Allow `client.auto()` being called with an empty CSR common name\n* `fixed` Bug when calling `updateAccountKey()` with external account binding\n\n## v5.3.0 (2024-02-05)\n\n* `added` Support and tests for satisfying `tls-alpn-01` challenges\n* `changed` Replace `jsrsasign` with `@peculiar/x509` for certificate and CSR handling\n* `changed` Method `getChallengeKeyAuthorization()` now returns `$token.$thumbprint` when called with a `tls-alpn-01` challenge\n    * Previously returned base64url encoded SHA256 digest of `$token.$thumbprint` erroneously\n    * This change is not considered breaking since the previous behavior was incorrect\n\n## v5.2.0 (2024-01-22)\n\n* `fixed` Allow self-signed or invalid certs when validating `http-01` challenges that redirect to HTTPS - [#65](https://github.com/publishlab/node-acme-client/issues/65)\n* `fixed` Wait for all challenge promises to settle before rejecting `client.auto()` - [#75](https://github.com/publishlab/node-acme-client/issues/75)\n\n## v5.1.0 (2024-01-20)\n\n* `fixed` Upgrade `jsrsasign@11.0.0` - [GHSA-rh63-9qcf-83gf](https://github.com/kjur/jsrsasign/security/advisories/GHSA-rh63-9qcf-83gf)\n* `fixed` Upgrade `axios@1.6.5` - [CVE-2023-45857](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2023-45857)\n\n## v5.0.0 (2022-07-28)\n\n* [Upgrade guide here](docs/upgrade-v5.md)\n* `added` New native crypto interface, ECC/ECDSA support\n* `breaking` Remove support for Node v10, v12 and v14\n* `breaking` Prioritize issuer closest to root during preferred chain selection - [#46](https://github.com/publishlab/node-acme-client/issues/46)\n* `changed` Replace `bluebird` dependency with native promise APIs\n* `changed` Replace `backo2` dependency with internal utility\n\n## v4.2.5 (2022-03-21)\n\n* `fixed` Upgrade `axios@0.26.1`\n* `fixed` Upgrade `node-forge@1.3.0` - [CVE-2022-24771](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-24771), [CVE-2022-24772](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-24772), [CVE-2022-24773](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-24773)\n\n## v4.2.4 (2022-03-19)\n\n* `fixed` Use SHA-256 when signing CSRs\n\n## v3.3.2 (2022-03-19)\n\n* `backport` Use SHA-256 when signing CSRs\n\n## v4.2.3 (2022-01-11)\n\n* `added` Directory URLs for ACME providers [Buypass](https://www.buypass.com) and [ZeroSSL](https://zerossl.com)\n* `fixed` Skip already valid authorizations when using `client.auto()`\n\n## v4.2.2 (2022-01-10)\n\n* `fixed` Upgrade `node-forge@1.2.0`\n\n## v4.2.1 (2022-01-10)\n\n* `fixed` ZeroSSL `duplicate_domains_in_array` error when using `client.auto()`\n\n## v4.2.0 (2022-01-06)\n\n* `added` Support for external account binding - [RFC 8555 Section 7.3.4](https://datatracker.ietf.org/doc/html/rfc8555#section-7.3.4)\n* `added` Ability to pass through custom logger function\n* `changed` Increase default `backoffAttempts` to 10\n* `fixed` Deactivate authorizations where challenges can not be completed\n* `fixed` Attempt authoritative name servers when verifying `dns-01` challenges\n* `fixed` Error verbosity when failing to read ACME directory\n* `fixed` Correctly recognize `ready` and `processing` states - [RFC 8555 Section 7.1.6](https://datatracker.ietf.org/doc/html/rfc8555#section-7.1.6)\n\n## v4.1.4 (2021-12-23)\n\n* `fixed` Upgrade `axios@0.21.4` - [CVE-2021-3749](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-3749)\n\n## v4.1.3 (2021-02-22)\n\n* `fixed` Upgrade `axios@0.21.1` - [CVE-2020-28168](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-28168)\n\n## v4.1.2 (2020-11-16)\n\n* `fixed` Bug when encoding PEM payloads, potentially causing malformed requests\n\n## v4.1.1 (2020-11-13)\n\n* `fixed` Missing TypeScript definitions\n\n## v4.1.0 (2020-11-12)\n\n* `added` Option `preferredChain` added to `client.getCertificate()` and `client.auto()` to indicate which certificate chain is preferred if a CA offers multiple\n    * Related: [https://community.letsencrypt.org/t/transition-to-isrgs-root-delayed-until-jan-11-2021/125516](https://community.letsencrypt.org/t/transition-to-isrgs-root-delayed-until-jan-11-2021/125516)\n* `added` Method `client.getOrder()` to refresh order from CA\n* `fixed` Upgrade `axios@0.21.0`\n* `fixed` Error when attempting to revoke a certificate chain\n* `fixed` Missing URL augmentation in `client.finalizeOrder()` and `client.deactivateAuthorization()`\n* `fixed` Add certificate issuer to response from `forge.readCertificateInfo()`\n\n## v4.0.2 (2020-10-09)\n\n* `fixed` Explicitly set default `axios` HTTP adapter - [axios/axios#1180](https://github.com/axios/axios/issues/1180)\n\n## v4.0.1 (2020-09-15)\n\n* `fixed` Upgrade `node-forge@0.10.0` - [CVE-2020-7720](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-7720)\n\n## v4.0.0 (2020-05-29)\n\n* `breaking` Remove support for Node v8\n* `breaking` Remove deprecated `openssl` crypto module\n* `fixed` Incorrect TypeScript `CertificateInfo` definitions\n* `fixed` Allow trailing whitespace character in `http-01` challenge response\n\n## v3.3.1 (2020-01-07)\n\n* `fixed` Improvements to TypeScript definitions\n\n## v3.3.0 (2019-12-19)\n\n* `added` TypeScript definitions\n* `fixed` Allow missing ACME directory meta field - [RFC 8555 Section 7.1.1](https://datatracker.ietf.org/doc/html/rfc8555#section-7.1.1)\n\n## v3.2.1 (2019-11-14)\n\n* `added` New option `skipChallengeVerification` added to `client.auto()` to bypass internal challenge verification\n\n## v3.2.0 (2019-08-26)\n\n* `added` More extensive testing using [letsencrypt/pebble](https://github.com/letsencrypt/pebble)\n* `changed` When creating a CSR, `commonName` no longer defaults to `'localhost'`\n    * This change is not considered breaking since `commonName: 'localhost'` will result in an error when ordering a certificate\n* `fixed` Retry signed API requests on `urn:ietf:params:acme:error:badNonce` - [RFC 8555 Section 6.5](https://datatracker.ietf.org/doc/html/rfc8555#section-6.5)\n* `fixed` Minor bugs related to `POST-as-GET` when calling `updateAccount()`\n* `fixed` Ensure subject common name is present in SAN when creating a CSR - [CAB v1.2.3 Section 9.2.2](https://cabforum.org/wp-content/uploads/BRv1.2.3.pdf)\n* `fixed` Send empty JSON body when responding to challenges - [RFC 8555 Section 7.5.1](https://datatracker.ietf.org/doc/html/rfc8555#section-7.5.1)\n\n## v2.3.1 (2019-08-26)\n\n* `backport` Minor bugs related to `POST-as-GET` when calling `client.updateAccount()`\n* `backport` Send empty JSON body when responding to challenges\n\n## v3.1.0 (2019-08-21)\n\n* `added` UTF-8 support when generating a CSR subject using forge - [RFC 5280](https://datatracker.ietf.org/doc/html/rfc5280)\n* `fixed` Implement `POST-as-GET` for all ACME API requests - [RFC 8555 Section 6.3](https://datatracker.ietf.org/doc/html/rfc8555#section-6.3)\n\n## v2.3.0 (2019-08-21)\n\n* `backport` Implement `POST-as-GET` for all ACME API requests\n\n## v3.0.0 (2019-07-13)\n\n* `added` Expose `axios` instance to allow manipulating HTTP client defaults\n* `breaking` Remove support for Node v4 and v6\n* `breaking` Remove Babel transpilation\n\n## v2.2.3 (2019-01-25)\n\n* `added` DNS CNAME detection when verifying `dns-01` challenges\n\n## v2.2.2 (2019-01-07)\n\n* `added` Support for `tls-alpn-01` challenge key authorization\n\n## v2.2.1 (2019-01-04)\n\n* `fixed` Handle and throw errors from OpenSSL process\n\n## v2.2.0 (2018-11-06)\n\n* `added` New [node-forge](https://www.npmjs.com/package/node-forge) crypto interface, removes OpenSSL CLI dependency\n* `added` Support native `crypto.generateKeyPair()` API when generating key pairs\n\n## v2.1.0 (2018-10-21)\n\n* `added` Ability to set and get current account URL\n* `fixed` Replace HTTP client `request` with `axios`\n* `fixed` Auto-mode no longer tries to create account when account URL exists\n\n## v2.0.1 (2018-08-17)\n\n* `fixed` Key rollover in compliance with [draft-ietf-acme-13](https://datatracker.ietf.org/doc/html/draft-ietf-acme-acme-13)\n\n## v2.0.0 (2018-04-02)\n\n* `breaking` ACMEv2\n* `breaking` API changes\n* `breaking` Rewrite to ES6\n* `breaking` Promises instead of callbacks\n\n## v1.0.0 (2017-10-20)\n\n* API stable\n\n## v0.2.1 (2017-09-27)\n\n* `fixed` Bug causing invalid anti-replay nonce\n\n## v0.2.0 (2017-09-21)\n\n* `breaking` OpenSSL method `readCsrDomains` and `readCertificateInfo` now return domains as an object\n* `fixed` Added and fixed some tests\n\n## v0.1.0 (2017-09-14)\n\n* `acme-client` released\n"
  },
  {
    "path": "packages/core/acme-client/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017-2024 Labrador CMS AS\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": "packages/core/acme-client/README.md",
    "content": "# acme-client [![test](https://github.com/publishlab/node-acme-client/actions/workflows/tests.yml/badge.svg)](https://github.com/publishlab/node-acme-client/actions/workflows/tests.yml)\n\n*A simple and unopinionated ACME client.*\n\nThis module is written to handle communication with a Boulder/Let's Encrypt-style ACME API.\n\n* RFC 8555 - Automatic Certificate Management Environment (ACME): [https://datatracker.ietf.org/doc/html/rfc8555](https://datatracker.ietf.org/doc/html/rfc8555)\n* Boulder divergences from ACME: [https://github.com/letsencrypt/boulder/blob/master/docs/acme-divergences.md](https://github.com/letsencrypt/boulder/blob/master/docs/acme-divergences.md)\n\n## Compatibility\n\n| acme-client | Node.js |                                           |\n| ----------- | ------- | ----------------------------------------- |\n| v5.x        | >= v16  | [Upgrade guide](docs/upgrade-v5.md)       |\n| v4.x        | >= v10  | [Changelog](CHANGELOG.md#v400-2020-05-29) |\n| v3.x        | >= v8   | [Changelog](CHANGELOG.md#v300-2019-07-13) |\n| v2.x        | >= v4   | [Changelog](CHANGELOG.md#v200-2018-04-02) |\n| v1.x        | >= v4   | [Changelog](CHANGELOG.md#v100-2017-10-20) |\n\n## Table of contents\n\n* [Installation](#installation)\n* [Usage](#usage)\n    * [Directory URLs](#directory-urls)\n    * [External account binding](#external-account-binding)\n    * [Specifying the account URL](#specifying-the-account-url)\n* [Cryptography](#cryptography)\n    * [Legacy .forge interface](#legacy-forge-interface)\n* [Auto mode](#auto-mode)\n    * [Challenge priority](#challenge-priority)\n    * [Internal challenge verification](#internal-challenge-verification)\n* [API](#api)\n* [HTTP client defaults](#http-client-defaults)\n* [Debugging](#debugging)\n* [License](#license)\n\n## Installation\n\n```bash\n$ npm install acme-client\n```\n\n## Usage\n\n```js\nconst acme = require('acme-client');\n\nconst accountPrivateKey = '<PEM encoded private key>';\n\nconst client = new acme.Client({\n    directoryUrl: acme.directory.letsencrypt.staging,\n    accountKey: accountPrivateKey,\n});\n```\n\n### Directory URLs\n\n```js\nacme.directory.buypass.staging;\nacme.directory.buypass.production;\n\nacme.directory.google.staging;\nacme.directory.google.production;\n\nacme.directory.letsencrypt.staging;\nacme.directory.letsencrypt.production;\n\nacme.directory.zerossl.production;\n```\n\n### External account binding\n\nTo enable [external account binding](https://datatracker.ietf.org/doc/html/rfc8555#section-7.3.4) when creating your ACME account, provide your KID and HMAC key to the client constructor.\n\n```js\nconst client = new acme.Client({\n    directoryUrl: 'https://acme-provider.example.com/directory-url',\n    accountKey: accountPrivateKey,\n    externalAccountBinding: {\n        kid: 'YOUR-EAB-KID',\n        hmacKey: 'YOUR-EAB-HMAC-KEY',\n    },\n});\n```\n\n### Specifying the account URL\n\nDuring the ACME account creation process, the server will check the supplied account key and either create a new account if the key is unused, or return the existing ACME account bound to that key.\n\nIn some cases, for example with some EAB providers, this account creation step may be prohibited and might require you to manually specify the account URL beforehand. This can be done through `accountUrl` in the client constructor.\n\n```js\nconst client = new acme.Client({\n    directoryUrl: acme.directory.letsencrypt.staging,\n    accountKey: accountPrivateKey,\n    accountUrl: 'https://acme-v02.api.letsencrypt.org/acme/acct/12345678',\n});\n```\n\nYou can fetch the clients current account URL, either after creating an account or supplying it through the constructor, using `getAccountUrl()`:\n\n```js\nconst myAccountUrl = client.getAccountUrl();\n```\n\n## Cryptography\n\nFor key pairs `acme-client` utilizes native Node.js cryptography APIs, supporting signing and generation of both RSA and ECDSA keys. The module [@peculiar/x509](https://www.npmjs.com/package/@peculiar/x509) is used to generate and parse Certificate Signing Requests.\n\nThese utility methods are exposed through `.crypto`.\n\n* **Documentation: [docs/crypto.md](docs/crypto.md)**\n\n```js\nconst privateRsaKey = await acme.crypto.createPrivateRsaKey();\nconst privateEcdsaKey = await acme.crypto.createPrivateEcdsaKey();\n\nconst [certificateKey, certificateCsr] = await acme.crypto.createCsr({\n    altNames: ['example.com', '*.example.com'],\n});\n```\n\n### Legacy `.forge` interface\n\nThe legacy `node-forge` crypto interface is still available for backward compatibility, however this interface is now considered deprecated and will be removed in a future major version of `acme-client`.\n\nYou should consider migrating to the new `.crypto` API at your earliest convenience. More details can be found in the [acme-client v5 upgrade guide](docs/upgrade-v5.md).\n\n* **Documentation: [docs/forge.md](docs/forge.md)**\n\n## Auto mode\n\nFor convenience an `auto()` method is included in the client that takes a single config object. This method will handle the entire process of getting a certificate for one or multiple domains.\n\n* **Documentation: [docs/client.md#AcmeClient+auto](docs/client.md#AcmeClient+auto)**\n* **Full example: [examples/auto.js](examples/auto.js)**\n\n```js\nconst autoOpts = {\n    csr: '<PEM encoded CSR>',\n    email: 'test@example.com',\n    termsOfServiceAgreed: true,\n    challengeCreateFn: async (authz, challenge, keyAuthorization) => {},\n    challengeRemoveFn: async (authz, challenge, keyAuthorization) => {},\n};\n\nconst certificate = await client.auto(autoOpts);\n```\n\n### Challenge priority\n\nWhen ordering a certificate using auto mode, `acme-client` uses a priority list when selecting challenges to respond to. Its default value is `['http-01', 'dns-01']` which translates to \"use `http-01` if any challenges exist, otherwise fall back to `dns-01`\".\n\nWhile most challenges can be validated using the method of your choosing, please note that **wildcard certificates can only be validated through `dns-01`**. More information regarding Let's Encrypt challenge types [can be found here](https://letsencrypt.org/docs/challenge-types/).\n\nTo modify challenge priority, provide a list of challenge types in `challengePriority`:\n\n```js\nawait client.auto({\n    ...,\n    challengePriority: ['http-01', 'dns-01'],\n});\n```\n\n### Internal challenge verification\n\nWhen using auto mode, `acme-client` will first validate that challenges are satisfied internally before completing the challenge at the ACME provider. In some cases (firewalls, etc) this internal challenge verification might not be possible to complete.\n\nIf internal challenge validation needs to travel through an HTTP proxy, see [HTTP client defaults](#http-client-defaults).\n\nTo completely disable `acme-client`s internal challenge verification, enable `skipChallengeVerification`:\n\n```js\nawait client.auto({\n    ...,\n    skipChallengeVerification: true,\n});\n```\n\n## API\n\nFor more fine-grained control you can interact with the ACME API using the methods documented below.\n\n* **Documentation: [docs/client.md](docs/client.md)**\n* **Full example: [examples/api.js](examples/api.js)**\n\n```js\nconst account = await client.createAccount({\n    termsOfServiceAgreed: true,\n    contact: ['mailto:test@example.com'],\n});\n\nconst order = await client.createOrder({\n    identifiers: [\n        { type: 'dns', value: 'example.com' },\n        { type: 'dns', value: '*.example.com' },\n    ],\n});\n```\n\n## HTTP client defaults\n\nThis module uses [axios](https://github.com/axios/axios) when communicating with the ACME HTTP API, and exposes the client instance through `.axios`.\n\nFor example, should you need to change the default axios configuration to route requests through an HTTP proxy, this can be achieved as follows:\n\n```js\nconst acme = require('acme-client');\n\nacme.axios.defaults.proxy = {\n    host: '127.0.0.1',\n    port: 9000,\n};\n```\n\nA complete list of axios options and documentation can be found at:\n\n* [https://github.com/axios/axios#request-config](https://github.com/axios/axios#request-config)\n* [https://github.com/axios/axios#custom-instance-defaults](https://github.com/axios/axios#custom-instance-defaults)\n\n## Debugging\n\nTo get a better grasp of what `acme-client` is doing behind the scenes, you can either pass it a logger function, or enable debugging through an environment variable.\n\nSetting a logger function may for example be useful for passing messages on to another logging system, or just dumping them to the console.\n\n```js\nacme.setLogger((message) => {\n    console.log(message);\n});\n```\n\nDebugging to the console can also be enabled through [debug](https://www.npmjs.com/package/debug) by setting an environment variable.\n\n```bash\nDEBUG=acme-client node index.js\n```\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "packages/core/acme-client/build.md",
    "content": "20:55\n"
  },
  {
    "path": "packages/core/acme-client/docs/client.md",
    "content": "## Classes\n\n<dl>\n<dt><a href=\"#AcmeClient\">AcmeClient</a></dt>\n<dd><p>AcmeClient</p>\n</dd>\n</dl>\n\n## Objects\n\n<dl>\n<dt><a href=\"#Client\">Client</a> : <code>object</code></dt>\n<dd><p>ACME client</p>\n</dd>\n</dl>\n\n<a name=\"AcmeClient\"></a>\n\n## AcmeClient\nAcmeClient\n\n**Kind**: global class  \n\n* [AcmeClient](#AcmeClient)\n    * [new AcmeClient(opts)](#new_AcmeClient_new)\n    * [.getTermsOfServiceUrl()](#AcmeClient+getTermsOfServiceUrl) ⇒ <code>Promise.&lt;(string\\|null)&gt;</code>\n    * [.getAccountUrl()](#AcmeClient+getAccountUrl) ⇒ <code>string</code>\n    * [.createAccount([data])](#AcmeClient+createAccount) ⇒ <code>Promise.&lt;object&gt;</code>\n    * [.updateAccount([data])](#AcmeClient+updateAccount) ⇒ <code>Promise.&lt;object&gt;</code>\n    * [.updateAccountKey(newAccountKey, [data])](#AcmeClient+updateAccountKey) ⇒ <code>Promise.&lt;object&gt;</code>\n    * [.createOrder(data)](#AcmeClient+createOrder) ⇒ <code>Promise.&lt;object&gt;</code>\n    * [.getOrder(order)](#AcmeClient+getOrder) ⇒ <code>Promise.&lt;object&gt;</code>\n    * [.finalizeOrder(order, csr)](#AcmeClient+finalizeOrder) ⇒ <code>Promise.&lt;object&gt;</code>\n    * [.getAuthorizations(order)](#AcmeClient+getAuthorizations) ⇒ <code>Promise.&lt;Array.&lt;object&gt;&gt;</code>\n    * [.deactivateAuthorization(authz)](#AcmeClient+deactivateAuthorization) ⇒ <code>Promise.&lt;object&gt;</code>\n    * [.getChallengeKeyAuthorization(challenge)](#AcmeClient+getChallengeKeyAuthorization) ⇒ <code>Promise.&lt;string&gt;</code>\n    * [.verifyChallenge(authz, challenge)](#AcmeClient+verifyChallenge) ⇒ <code>Promise</code>\n    * [.completeChallenge(challenge)](#AcmeClient+completeChallenge) ⇒ <code>Promise.&lt;object&gt;</code>\n    * [.waitForValidStatus(item)](#AcmeClient+waitForValidStatus) ⇒ <code>Promise.&lt;object&gt;</code>\n    * [.getCertificate(order, [preferredChain])](#AcmeClient+getCertificate) ⇒ <code>Promise.&lt;string&gt;</code>\n    * [.revokeCertificate(cert, [data])](#AcmeClient+revokeCertificate) ⇒ <code>Promise</code>\n    * [.auto(opts)](#AcmeClient+auto) ⇒ <code>Promise.&lt;string&gt;</code>\n\n<a name=\"new_AcmeClient_new\"></a>\n\n### new AcmeClient(opts)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| opts | <code>object</code> |  |\n| opts.directoryUrl | <code>string</code> | ACME directory URL |\n| opts.accountKey | <code>buffer</code> \\| <code>string</code> | PEM encoded account private key |\n| [opts.accountUrl] | <code>string</code> | Account URL, default: `null` |\n| [opts.externalAccountBinding] | <code>object</code> |  |\n| [opts.externalAccountBinding.kid] | <code>string</code> | External account binding KID |\n| [opts.externalAccountBinding.hmacKey] | <code>string</code> | External account binding HMAC key |\n| [opts.backoffAttempts] | <code>number</code> | Maximum number of backoff attempts, default: `10` |\n| [opts.backoffMin] | <code>number</code> | Minimum backoff attempt delay in milliseconds, default: `5000` |\n| [opts.backoffMax] | <code>number</code> | Maximum backoff attempt delay in milliseconds, default: `30000` |\n\n**Example**  \nCreate ACME client instance\n```js\nconst client = new acme.Client({\n    directoryUrl: acme.directory.letsencrypt.staging,\n    accountKey: 'Private key goes here',\n});\n```\n**Example**  \nCreate ACME client instance\n```js\nconst client = new acme.Client({\n    directoryUrl: acme.directory.letsencrypt.staging,\n    accountKey: 'Private key goes here',\n    accountUrl: 'Optional account URL goes here',\n    backoffAttempts: 10,\n    backoffMin: 5000,\n    backoffMax: 30000,\n});\n```\n**Example**  \nCreate ACME client with external account binding\n```js\nconst client = new acme.Client({\n    directoryUrl: 'https://acme-provider.example.com/directory-url',\n    accountKey: 'Private key goes here',\n    externalAccountBinding: {\n        kid: 'YOUR-EAB-KID',\n        hmacKey: 'YOUR-EAB-HMAC-KEY',\n    },\n});\n```\n<a name=\"AcmeClient+getTermsOfServiceUrl\"></a>\n\n### acmeClient.getTermsOfServiceUrl() ⇒ <code>Promise.&lt;(string\\|null)&gt;</code>\nGet Terms of Service URL if available\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;(string\\|null)&gt;</code> - ToS URL  \n**Example**  \nGet Terms of Service URL\n```js\nconst termsOfService = client.getTermsOfServiceUrl();\n\nif (!termsOfService) {\n    // CA did not provide Terms of Service\n}\n```\n<a name=\"AcmeClient+getAccountUrl\"></a>\n\n### acmeClient.getAccountUrl() ⇒ <code>string</code>\nGet current account URL\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>string</code> - Account URL  \n**Throws**:\n\n- <code>Error</code> No account URL found\n\n**Example**  \nGet current account URL\n```js\ntry {\n    const accountUrl = client.getAccountUrl();\n}\ncatch (e) {\n    // No account URL exists, need to create account first\n}\n```\n<a name=\"AcmeClient+createAccount\"></a>\n\n### acmeClient.createAccount([data]) ⇒ <code>Promise.&lt;object&gt;</code>\nCreate a new account\n\nhttps://datatracker.ietf.org/doc/html/rfc8555#section-7.3\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;object&gt;</code> - Account  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [data] | <code>object</code> | Request data |\n\n**Example**  \nCreate a new account\n```js\nconst account = await client.createAccount({\n    termsOfServiceAgreed: true,\n});\n```\n**Example**  \nCreate a new account with contact info\n```js\nconst account = await client.createAccount({\n    termsOfServiceAgreed: true,\n    contact: ['mailto:test@example.com'],\n});\n```\n<a name=\"AcmeClient+updateAccount\"></a>\n\n### acmeClient.updateAccount([data]) ⇒ <code>Promise.&lt;object&gt;</code>\nUpdate existing account\n\nhttps://datatracker.ietf.org/doc/html/rfc8555#section-7.3.2\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;object&gt;</code> - Account  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [data] | <code>object</code> | Request data |\n\n**Example**  \nUpdate existing account\n```js\nconst account = await client.updateAccount({\n    contact: ['mailto:foo@example.com'],\n});\n```\n<a name=\"AcmeClient+updateAccountKey\"></a>\n\n### acmeClient.updateAccountKey(newAccountKey, [data]) ⇒ <code>Promise.&lt;object&gt;</code>\nUpdate account private key\n\nhttps://datatracker.ietf.org/doc/html/rfc8555#section-7.3.5\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;object&gt;</code> - Account  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| newAccountKey | <code>buffer</code> \\| <code>string</code> | New PEM encoded private key |\n| [data] | <code>object</code> | Additional request data |\n\n**Example**  \nUpdate account private key\n```js\nconst newAccountKey = 'New private key goes here';\nconst result = await client.updateAccountKey(newAccountKey);\n```\n<a name=\"AcmeClient+createOrder\"></a>\n\n### acmeClient.createOrder(data) ⇒ <code>Promise.&lt;object&gt;</code>\nCreate a new order\n\nhttps://datatracker.ietf.org/doc/html/rfc8555#section-7.4\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;object&gt;</code> - Order  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| data | <code>object</code> | Request data |\n\n**Example**  \nCreate a new order\n```js\nconst order = await client.createOrder({\n    identifiers: [\n        { type: 'dns', value: 'example.com' },\n        { type: 'dns', value: 'test.example.com' },\n    ],\n});\n```\n<a name=\"AcmeClient+getOrder\"></a>\n\n### acmeClient.getOrder(order) ⇒ <code>Promise.&lt;object&gt;</code>\nRefresh order object from CA\n\nhttps://datatracker.ietf.org/doc/html/rfc8555#section-7.4\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;object&gt;</code> - Order  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| order | <code>object</code> | Order object |\n\n**Example**  \n```js\nconst order = { ... }; // Previously created order object\nconst result = await client.getOrder(order);\n```\n<a name=\"AcmeClient+finalizeOrder\"></a>\n\n### acmeClient.finalizeOrder(order, csr) ⇒ <code>Promise.&lt;object&gt;</code>\nFinalize order\n\nhttps://datatracker.ietf.org/doc/html/rfc8555#section-7.4\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;object&gt;</code> - Order  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| order | <code>object</code> | Order object |\n| csr | <code>buffer</code> \\| <code>string</code> | PEM encoded Certificate Signing Request |\n\n**Example**  \nFinalize order\n```js\nconst order = { ... }; // Previously created order object\nconst csr = { ... }; // Previously created Certificate Signing Request\nconst result = await client.finalizeOrder(order, csr);\n```\n<a name=\"AcmeClient+getAuthorizations\"></a>\n\n### acmeClient.getAuthorizations(order) ⇒ <code>Promise.&lt;Array.&lt;object&gt;&gt;</code>\nGet identifier authorizations from order\n\nhttps://datatracker.ietf.org/doc/html/rfc8555#section-7.5\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;Array.&lt;object&gt;&gt;</code> - Authorizations  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| order | <code>object</code> | Order |\n\n**Example**  \nGet identifier authorizations\n```js\nconst order = { ... }; // Previously created order object\nconst authorizations = await client.getAuthorizations(order);\n\nauthorizations.forEach((authz) => {\n    const { challenges } = authz;\n});\n```\n<a name=\"AcmeClient+deactivateAuthorization\"></a>\n\n### acmeClient.deactivateAuthorization(authz) ⇒ <code>Promise.&lt;object&gt;</code>\nDeactivate identifier authorization\n\nhttps://datatracker.ietf.org/doc/html/rfc8555#section-7.5.2\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;object&gt;</code> - Authorization  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| authz | <code>object</code> | Identifier authorization |\n\n**Example**  \nDeactivate identifier authorization\n```js\nconst authz = { ... }; // Identifier authorization resolved from previously created order\nconst result = await client.deactivateAuthorization(authz);\n```\n<a name=\"AcmeClient+getChallengeKeyAuthorization\"></a>\n\n### acmeClient.getChallengeKeyAuthorization(challenge) ⇒ <code>Promise.&lt;string&gt;</code>\nGet key authorization for ACME challenge\n\nhttps://datatracker.ietf.org/doc/html/rfc8555#section-8.1\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;string&gt;</code> - Key authorization  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| challenge | <code>object</code> | Challenge object returned by API |\n\n**Example**  \nGet challenge key authorization\n```js\nconst challenge = { ... }; // Challenge from previously resolved identifier authorization\nconst key = await client.getChallengeKeyAuthorization(challenge);\n\n// Write key somewhere to satisfy challenge\n```\n<a name=\"AcmeClient+verifyChallenge\"></a>\n\n### acmeClient.verifyChallenge(authz, challenge) ⇒ <code>Promise</code>\nVerify that ACME challenge is satisfied\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| authz | <code>object</code> | Identifier authorization |\n| challenge | <code>object</code> | Authorization challenge |\n\n**Example**  \nVerify satisfied ACME challenge\n```js\nconst authz = { ... }; // Identifier authorization\nconst challenge = { ... }; // Satisfied challenge\nawait client.verifyChallenge(authz, challenge);\n```\n<a name=\"AcmeClient+completeChallenge\"></a>\n\n### acmeClient.completeChallenge(challenge) ⇒ <code>Promise.&lt;object&gt;</code>\nNotify CA that challenge has been completed\n\nhttps://datatracker.ietf.org/doc/html/rfc8555#section-7.5.1\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;object&gt;</code> - Challenge  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| challenge | <code>object</code> | Challenge object returned by API |\n\n**Example**  \nNotify CA that challenge has been completed\n```js\nconst challenge = { ... }; // Satisfied challenge\nconst result = await client.completeChallenge(challenge);\n```\n<a name=\"AcmeClient+waitForValidStatus\"></a>\n\n### acmeClient.waitForValidStatus(item) ⇒ <code>Promise.&lt;object&gt;</code>\nWait for ACME provider to verify status on a order, authorization or challenge\n\nhttps://datatracker.ietf.org/doc/html/rfc8555#section-7.5.1\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;object&gt;</code> - Valid order, authorization or challenge  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| item | <code>object</code> | An order, authorization or challenge object |\n\n**Example**  \nWait for valid challenge status\n```js\nconst challenge = { ... };\nawait client.waitForValidStatus(challenge);\n```\n**Example**  \nWait for valid authorization status\n```js\nconst authz = { ... };\nawait client.waitForValidStatus(authz);\n```\n**Example**  \nWait for valid order status\n```js\nconst order = { ... };\nawait client.waitForValidStatus(order);\n```\n<a name=\"AcmeClient+getCertificate\"></a>\n\n### acmeClient.getCertificate(order, [preferredChain]) ⇒ <code>Promise.&lt;string&gt;</code>\nGet certificate from ACME order\n\nhttps://datatracker.ietf.org/doc/html/rfc8555#section-7.4.2\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;string&gt;</code> - Certificate  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| order | <code>object</code> |  | Order object |\n| [preferredChain] | <code>string</code> | <code>null</code> | Indicate which certificate chain is preferred if a CA offers multiple, by exact issuer common name, default: `null` |\n\n**Example**  \nGet certificate\n```js\nconst order = { ... }; // Previously created order\nconst certificate = await client.getCertificate(order);\n```\n**Example**  \nGet certificate with preferred chain\n```js\nconst order = { ... }; // Previously created order\nconst certificate = await client.getCertificate(order, 'DST Root CA X3');\n```\n<a name=\"AcmeClient+revokeCertificate\"></a>\n\n### acmeClient.revokeCertificate(cert, [data]) ⇒ <code>Promise</code>\nRevoke certificate\n\nhttps://datatracker.ietf.org/doc/html/rfc8555#section-7.6\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| cert | <code>buffer</code> \\| <code>string</code> | PEM encoded certificate |\n| [data] | <code>object</code> | Additional request data |\n\n**Example**  \nRevoke certificate\n```js\nconst certificate = { ... }; // Previously created certificate\nconst result = await client.revokeCertificate(certificate);\n```\n**Example**  \nRevoke certificate with reason\n```js\nconst certificate = { ... }; // Previously created certificate\nconst result = await client.revokeCertificate(certificate, {\n    reason: 4,\n});\n```\n<a name=\"AcmeClient+auto\"></a>\n\n### acmeClient.auto(opts) ⇒ <code>Promise.&lt;string&gt;</code>\nAuto mode\n\n**Kind**: instance method of [<code>AcmeClient</code>](#AcmeClient)  \n**Returns**: <code>Promise.&lt;string&gt;</code> - Certificate  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| opts | <code>object</code> |  |\n| opts.csr | <code>buffer</code> \\| <code>string</code> | Certificate Signing Request |\n| opts.challengeCreateFn | <code>function</code> | Function returning Promise triggered before completing ACME challenge |\n| opts.challengeRemoveFn | <code>function</code> | Function returning Promise triggered after completing ACME challenge |\n| [opts.email] | <code>string</code> | Account email address |\n| [opts.termsOfServiceAgreed] | <code>boolean</code> | Agree to Terms of Service, default: `false` |\n| [opts.skipChallengeVerification] | <code>boolean</code> | Skip internal challenge verification before notifying ACME provider, default: `false` |\n| [opts.challengePriority] | <code>Array.&lt;string&gt;</code> | Array defining challenge type priority, default: `['http-01', 'dns-01']` |\n| [opts.preferredChain] | <code>string</code> | Indicate which certificate chain is preferred if a CA offers multiple, by exact issuer common name, default: `null` |\n\n**Example**  \nOrder a certificate using auto mode\n```js\nconst [certificateKey, certificateRequest] = await acme.crypto.createCsr({\n    altNames: ['test.example.com'],\n});\n\nconst certificate = await client.auto({\n    csr: certificateRequest,\n    email: 'test@example.com',\n    termsOfServiceAgreed: true,\n    challengeCreateFn: async (authz, challenge, keyAuthorization) => {\n        // Satisfy challenge here\n    },\n    challengeRemoveFn: async (authz, challenge, keyAuthorization) => {\n        // Clean up challenge here\n    },\n});\n```\n**Example**  \nOrder a certificate using auto mode with preferred chain\n```js\nconst [certificateKey, certificateRequest] = await acme.crypto.createCsr({\n    altNames: ['test.example.com'],\n});\n\nconst certificate = await client.auto({\n    csr: certificateRequest,\n    email: 'test@example.com',\n    termsOfServiceAgreed: true,\n    preferredChain: 'DST Root CA X3',\n    challengeCreateFn: async () => {},\n    challengeRemoveFn: async () => {},\n});\n```\n<a name=\"Client\"></a>\n\n## Client : <code>object</code>\nACME client\n\n**Kind**: global namespace  \n"
  },
  {
    "path": "packages/core/acme-client/docs/crypto.md",
    "content": "## Objects\n\n<dl>\n<dt><a href=\"#crypto\">crypto</a> : <code>object</code></dt>\n<dd><p>Native Node.js crypto interface</p>\n</dd>\n</dl>\n\n## Constants\n\n<dl>\n<dt><a href=\"#createPrivateEcdsaKey\">createPrivateEcdsaKey</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>\n<dd><p>Generate a private ECDSA key</p>\n</dd>\n<dt><a href=\"#getPublicKey\">getPublicKey</a> ⇒ <code>buffer</code></dt>\n<dd><p>Get a public key derived from a RSA or ECDSA key</p>\n</dd>\n<dt><a href=\"#getPemBodyAsB64u\">getPemBodyAsB64u</a> ⇒ <code>string</code></dt>\n<dd><p>Parse body of PEM encoded object and return a Base64URL string\nIf multiple objects are chained, the first body will be returned</p>\n</dd>\n<dt><a href=\"#readCsrDomains\">readCsrDomains</a> ⇒ <code>object</code></dt>\n<dd><p>Read domains from a Certificate Signing Request</p>\n</dd>\n<dt><a href=\"#readCertificateInfo\">readCertificateInfo</a> ⇒ <code>object</code></dt>\n<dd><p>Read information from a certificate\nIf multiple certificates are chained, the first will be read</p>\n</dd>\n<dt><a href=\"#createCsr\">createCsr</a> ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code></dt>\n<dd><p>Create a Certificate Signing Request</p>\n</dd>\n<dt><a href=\"#createAlpnCertificate\">createAlpnCertificate</a> ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code></dt>\n<dd><p>Create a self-signed ALPN certificate for TLS-ALPN-01 challenges</p>\n<p><a href=\"https://datatracker.ietf.org/doc/html/rfc8737\">https://datatracker.ietf.org/doc/html/rfc8737</a></p>\n</dd>\n<dt><a href=\"#isAlpnCertificateAuthorizationValid\">isAlpnCertificateAuthorizationValid</a> ⇒ <code>boolean</code></dt>\n<dd><p>Validate that a ALPN certificate contains the expected key authorization</p>\n</dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#createPrivateRsaKey\">createPrivateRsaKey([modulusLength])</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>\n<dd><p>Generate a private RSA key</p>\n</dd>\n<dt><a href=\"#createPrivateKey\">createPrivateKey()</a></dt>\n<dd><p>Alias of <code>createPrivateRsaKey()</code></p>\n</dd>\n<dt><a href=\"#getJwk\">getJwk(keyPem)</a> ⇒ <code>object</code></dt>\n<dd><p>Get a JSON Web Key derived from a RSA or ECDSA key</p>\n<p><a href=\"https://datatracker.ietf.org/doc/html/rfc7517\">https://datatracker.ietf.org/doc/html/rfc7517</a></p>\n</dd>\n<dt><a href=\"#splitPemChain\">splitPemChain(chainPem)</a> ⇒ <code>Array.&lt;string&gt;</code></dt>\n<dd><p>Split chain of PEM encoded objects from string into array</p>\n</dd>\n</dl>\n\n<a name=\"crypto\"></a>\n\n## crypto : <code>object</code>\nNative Node.js crypto interface\n\n**Kind**: global namespace  \n<a name=\"createPrivateEcdsaKey\"></a>\n\n## createPrivateEcdsaKey ⇒ <code>Promise.&lt;buffer&gt;</code>\nGenerate a private ECDSA key\n\n**Kind**: global constant  \n**Returns**: <code>Promise.&lt;buffer&gt;</code> - PEM encoded private ECDSA key  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [namedCurve] | <code>string</code> | ECDSA curve name (P-256, P-384 or P-521), default `P-256` |\n\n**Example**  \nGenerate private ECDSA key\n```js\nconst privateKey = await acme.crypto.createPrivateEcdsaKey();\n```\n**Example**  \nPrivate ECDSA key using P-384 curve\n```js\nconst privateKey = await acme.crypto.createPrivateEcdsaKey('P-384');\n```\n<a name=\"getPublicKey\"></a>\n\n## getPublicKey ⇒ <code>buffer</code>\nGet a public key derived from a RSA or ECDSA key\n\n**Kind**: global constant  \n**Returns**: <code>buffer</code> - PEM encoded public key  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| keyPem | <code>buffer</code> \\| <code>string</code> | PEM encoded private or public key |\n\n**Example**  \nGet public key\n```js\nconst publicKey = acme.crypto.getPublicKey(privateKey);\n```\n<a name=\"getPemBodyAsB64u\"></a>\n\n## getPemBodyAsB64u ⇒ <code>string</code>\nParse body of PEM encoded object and return a Base64URL string\nIf multiple objects are chained, the first body will be returned\n\n**Kind**: global constant  \n**Returns**: <code>string</code> - Base64URL-encoded body  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| pem | <code>buffer</code> \\| <code>string</code> | PEM encoded chain or object |\n\n<a name=\"readCsrDomains\"></a>\n\n## readCsrDomains ⇒ <code>object</code>\nRead domains from a Certificate Signing Request\n\n**Kind**: global constant  \n**Returns**: <code>object</code> - {commonName, altNames}  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| csrPem | <code>buffer</code> \\| <code>string</code> | PEM encoded Certificate Signing Request |\n\n**Example**  \nRead Certificate Signing Request domains\n```js\nconst { commonName, altNames } = acme.crypto.readCsrDomains(certificateRequest);\n\nconsole.log(`Common name: ${commonName}`);\nconsole.log(`Alt names: ${altNames.join(', ')}`);\n```\n<a name=\"readCertificateInfo\"></a>\n\n## readCertificateInfo ⇒ <code>object</code>\nRead information from a certificate\nIf multiple certificates are chained, the first will be read\n\n**Kind**: global constant  \n**Returns**: <code>object</code> - Certificate info  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| certPem | <code>buffer</code> \\| <code>string</code> | PEM encoded certificate or chain |\n\n**Example**  \nRead certificate information\n```js\nconst info = acme.crypto.readCertificateInfo(certificate);\nconst { commonName, altNames } = info.domains;\n\nconsole.log(`Not after: ${info.notAfter}`);\nconsole.log(`Not before: ${info.notBefore}`);\n\nconsole.log(`Common name: ${commonName}`);\nconsole.log(`Alt names: ${altNames.join(', ')}`);\n```\n<a name=\"createCsr\"></a>\n\n## createCsr ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code>\nCreate a Certificate Signing Request\n\n**Kind**: global constant  \n**Returns**: <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code> - [privateKey, certificateSigningRequest]  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| data | <code>object</code> |  |\n| [data.keySize] | <code>number</code> | Size of newly created RSA private key modulus in bits, default: `2048` |\n| [data.commonName] | <code>string</code> | FQDN of your server |\n| [data.altNames] | <code>Array.&lt;string&gt;</code> | SAN (Subject Alternative Names), default: `[]` |\n| [data.country] | <code>string</code> | 2 letter country code |\n| [data.state] | <code>string</code> | State or province |\n| [data.locality] | <code>string</code> | City |\n| [data.organization] | <code>string</code> | Organization name |\n| [data.organizationUnit] | <code>string</code> | Organizational unit name |\n| [data.emailAddress] | <code>string</code> | Email address |\n| [keyPem] | <code>buffer</code> \\| <code>string</code> | PEM encoded CSR private key |\n\n**Example**  \nCreate a Certificate Signing Request\n```js\nconst [certificateKey, certificateRequest] = await acme.crypto.createCsr({\n    altNames: ['test.example.com'],\n});\n```\n**Example**  \nCertificate Signing Request with both common and alternative names\n> *Warning*: Certificate subject common name has been [deprecated](https://letsencrypt.org/docs/glossary/#def-CN) and its use is [discouraged](https://cabforum.org/uploads/BRv1.2.3.pdf).\n```js\nconst [certificateKey, certificateRequest] = await acme.crypto.createCsr({\n    keySize: 4096,\n    commonName: 'test.example.com',\n    altNames: ['foo.example.com', 'bar.example.com'],\n});\n```\n**Example**  \nCertificate Signing Request with additional information\n```js\nconst [certificateKey, certificateRequest] = await acme.crypto.createCsr({\n    altNames: ['test.example.com'],\n    country: 'US',\n    state: 'California',\n    locality: 'Los Angeles',\n    organization: 'The Company Inc.',\n    organizationUnit: 'IT Department',\n    emailAddress: 'contact@example.com',\n});\n```\n**Example**  \nCertificate Signing Request with ECDSA private key\n```js\nconst certificateKey = await acme.crypto.createPrivateEcdsaKey();\n\nconst [, certificateRequest] = await acme.crypto.createCsr({\n    altNames: ['test.example.com'],\n}, certificateKey);\n```\n<a name=\"createAlpnCertificate\"></a>\n\n## createAlpnCertificate ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code>\nCreate a self-signed ALPN certificate for TLS-ALPN-01 challenges\n\nhttps://datatracker.ietf.org/doc/html/rfc8737\n\n**Kind**: global constant  \n**Returns**: <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code> - [privateKey, certificate]  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| authz | <code>object</code> | Identifier authorization |\n| keyAuthorization | <code>string</code> | Challenge key authorization |\n| [keyPem] | <code>buffer</code> \\| <code>string</code> | PEM encoded CSR private key |\n\n**Example**  \nCreate a ALPN certificate\n```js\nconst [alpnKey, alpnCertificate] = await acme.crypto.createAlpnCertificate(authz, keyAuthorization);\n```\n**Example**  \nCreate a ALPN certificate with ECDSA private key\n```js\nconst alpnKey = await acme.crypto.createPrivateEcdsaKey();\nconst [, alpnCertificate] = await acme.crypto.createAlpnCertificate(authz, keyAuthorization, alpnKey);\n```\n<a name=\"isAlpnCertificateAuthorizationValid\"></a>\n\n## isAlpnCertificateAuthorizationValid ⇒ <code>boolean</code>\nValidate that a ALPN certificate contains the expected key authorization\n\n**Kind**: global constant  \n**Returns**: <code>boolean</code> - True when valid  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| certPem | <code>buffer</code> \\| <code>string</code> | PEM encoded certificate |\n| keyAuthorization | <code>string</code> | Expected challenge key authorization |\n\n<a name=\"createPrivateRsaKey\"></a>\n\n## createPrivateRsaKey([modulusLength]) ⇒ <code>Promise.&lt;buffer&gt;</code>\nGenerate a private RSA key\n\n**Kind**: global function  \n**Returns**: <code>Promise.&lt;buffer&gt;</code> - PEM encoded private RSA key  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [modulusLength] | <code>number</code> | Size of the keys modulus in bits, default: `2048` |\n\n**Example**  \nGenerate private RSA key\n```js\nconst privateKey = await acme.crypto.createPrivateRsaKey();\n```\n**Example**  \nPrivate RSA key with modulus size 4096\n```js\nconst privateKey = await acme.crypto.createPrivateRsaKey(4096);\n```\n<a name=\"createPrivateKey\"></a>\n\n## createPrivateKey()\nAlias of `createPrivateRsaKey()`\n\n**Kind**: global function  \n<a name=\"getJwk\"></a>\n\n## getJwk(keyPem) ⇒ <code>object</code>\nGet a JSON Web Key derived from a RSA or ECDSA key\n\nhttps://datatracker.ietf.org/doc/html/rfc7517\n\n**Kind**: global function  \n**Returns**: <code>object</code> - JSON Web Key  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| keyPem | <code>buffer</code> \\| <code>string</code> | PEM encoded private or public key |\n\n**Example**  \nGet JWK\n```js\nconst jwk = acme.crypto.getJwk(privateKey);\n```\n<a name=\"splitPemChain\"></a>\n\n## splitPemChain(chainPem) ⇒ <code>Array.&lt;string&gt;</code>\nSplit chain of PEM encoded objects from string into array\n\n**Kind**: global function  \n**Returns**: <code>Array.&lt;string&gt;</code> - Array of PEM objects including headers  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| chainPem | <code>buffer</code> \\| <code>string</code> | PEM encoded object chain |\n\n"
  },
  {
    "path": "packages/core/acme-client/docs/forge.md",
    "content": "## Objects\n\n<dl>\n<dt><a href=\"#forge\">forge</a> : <code>object</code></dt>\n<dd><p>Legacy node-forge crypto interface</p>\n<p>DEPRECATION WARNING: This crypto interface is deprecated and will be removed from acme-client in a future\nmajor release. Please migrate to the new <code>acme.crypto</code> interface at your earliest convenience.</p>\n</dd>\n</dl>\n\n## Constants\n\n<dl>\n<dt><a href=\"#createPublicKey\">createPublicKey</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>\n<dd><p>Create public key from a private RSA key</p>\n</dd>\n<dt><a href=\"#getPemBody\">getPemBody</a> ⇒ <code>string</code></dt>\n<dd><p>Parse body of PEM encoded object from buffer or string\nIf multiple objects are chained, the first body will be returned</p>\n</dd>\n<dt><a href=\"#splitPemChain\">splitPemChain</a> ⇒ <code>Array.&lt;string&gt;</code></dt>\n<dd><p>Split chain of PEM encoded objects from buffer or string into array</p>\n</dd>\n<dt><a href=\"#getModulus\">getModulus</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>\n<dd><p>Get modulus</p>\n</dd>\n<dt><a href=\"#getPublicExponent\">getPublicExponent</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>\n<dd><p>Get public exponent</p>\n</dd>\n<dt><a href=\"#readCsrDomains\">readCsrDomains</a> ⇒ <code>Promise.&lt;object&gt;</code></dt>\n<dd><p>Read domains from a Certificate Signing Request</p>\n</dd>\n<dt><a href=\"#readCertificateInfo\">readCertificateInfo</a> ⇒ <code>Promise.&lt;object&gt;</code></dt>\n<dd><p>Read information from a certificate</p>\n</dd>\n<dt><a href=\"#createCsr\">createCsr</a> ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code></dt>\n<dd><p>Create a Certificate Signing Request</p>\n</dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#createPrivateKey\">createPrivateKey([size])</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>\n<dd><p>Generate a private RSA key</p>\n</dd>\n</dl>\n\n<a name=\"forge\"></a>\n\n## forge : <code>object</code>\nLegacy node-forge crypto interface\n\nDEPRECATION WARNING: This crypto interface is deprecated and will be removed from acme-client in a future\nmajor release. Please migrate to the new `acme.crypto` interface at your earliest convenience.\n\n**Kind**: global namespace  \n<a name=\"createPublicKey\"></a>\n\n## createPublicKey ⇒ <code>Promise.&lt;buffer&gt;</code>\nCreate public key from a private RSA key\n\n**Kind**: global constant  \n**Returns**: <code>Promise.&lt;buffer&gt;</code> - PEM encoded public RSA key  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| key | <code>buffer</code> \\| <code>string</code> | PEM encoded private RSA key |\n\n**Example**  \nCreate public key\n```js\nconst publicKey = await acme.forge.createPublicKey(privateKey);\n```\n<a name=\"getPemBody\"></a>\n\n## getPemBody ⇒ <code>string</code>\nParse body of PEM encoded object from buffer or string\nIf multiple objects are chained, the first body will be returned\n\n**Kind**: global constant  \n**Returns**: <code>string</code> - PEM body  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| str | <code>buffer</code> \\| <code>string</code> | PEM encoded buffer or string |\n\n<a name=\"splitPemChain\"></a>\n\n## splitPemChain ⇒ <code>Array.&lt;string&gt;</code>\nSplit chain of PEM encoded objects from buffer or string into array\n\n**Kind**: global constant  \n**Returns**: <code>Array.&lt;string&gt;</code> - Array of PEM bodies  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| str | <code>buffer</code> \\| <code>string</code> | PEM encoded buffer or string |\n\n<a name=\"getModulus\"></a>\n\n## getModulus ⇒ <code>Promise.&lt;buffer&gt;</code>\nGet modulus\n\n**Kind**: global constant  \n**Returns**: <code>Promise.&lt;buffer&gt;</code> - Modulus  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| input | <code>buffer</code> \\| <code>string</code> | PEM encoded private key, certificate or CSR |\n\n**Example**  \nGet modulus\n```js\nconst m1 = await acme.forge.getModulus(privateKey);\nconst m2 = await acme.forge.getModulus(certificate);\nconst m3 = await acme.forge.getModulus(certificateRequest);\n```\n<a name=\"getPublicExponent\"></a>\n\n## getPublicExponent ⇒ <code>Promise.&lt;buffer&gt;</code>\nGet public exponent\n\n**Kind**: global constant  \n**Returns**: <code>Promise.&lt;buffer&gt;</code> - Exponent  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| input | <code>buffer</code> \\| <code>string</code> | PEM encoded private key, certificate or CSR |\n\n**Example**  \nGet public exponent\n```js\nconst e1 = await acme.forge.getPublicExponent(privateKey);\nconst e2 = await acme.forge.getPublicExponent(certificate);\nconst e3 = await acme.forge.getPublicExponent(certificateRequest);\n```\n<a name=\"readCsrDomains\"></a>\n\n## readCsrDomains ⇒ <code>Promise.&lt;object&gt;</code>\nRead domains from a Certificate Signing Request\n\n**Kind**: global constant  \n**Returns**: <code>Promise.&lt;object&gt;</code> - {commonName, altNames}  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| csr | <code>buffer</code> \\| <code>string</code> | PEM encoded Certificate Signing Request |\n\n**Example**  \nRead Certificate Signing Request domains\n```js\nconst { commonName, altNames } = await acme.forge.readCsrDomains(certificateRequest);\n\nconsole.log(`Common name: ${commonName}`);\nconsole.log(`Alt names: ${altNames.join(', ')}`);\n```\n<a name=\"readCertificateInfo\"></a>\n\n## readCertificateInfo ⇒ <code>Promise.&lt;object&gt;</code>\nRead information from a certificate\n\n**Kind**: global constant  \n**Returns**: <code>Promise.&lt;object&gt;</code> - Certificate info  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| cert | <code>buffer</code> \\| <code>string</code> | PEM encoded certificate |\n\n**Example**  \nRead certificate information\n```js\nconst info = await acme.forge.readCertificateInfo(certificate);\nconst { commonName, altNames } = info.domains;\n\nconsole.log(`Not after: ${info.notAfter}`);\nconsole.log(`Not before: ${info.notBefore}`);\n\nconsole.log(`Common name: ${commonName}`);\nconsole.log(`Alt names: ${altNames.join(', ')}`);\n```\n<a name=\"createCsr\"></a>\n\n## createCsr ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code>\nCreate a Certificate Signing Request\n\n**Kind**: global constant  \n**Returns**: <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code> - [privateKey, certificateSigningRequest]  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| data | <code>object</code> |  |\n| [data.keySize] | <code>number</code> | Size of newly created private key, default: `2048` |\n| [data.commonName] | <code>string</code> |  |\n| [data.altNames] | <code>Array.&lt;string&gt;</code> | default: `[]` |\n| [data.country] | <code>string</code> |  |\n| [data.state] | <code>string</code> |  |\n| [data.locality] | <code>string</code> |  |\n| [data.organization] | <code>string</code> |  |\n| [data.organizationUnit] | <code>string</code> |  |\n| [data.emailAddress] | <code>string</code> |  |\n| [key] | <code>buffer</code> \\| <code>string</code> | CSR private key |\n\n**Example**  \nCreate a Certificate Signing Request\n```js\nconst [certificateKey, certificateRequest] = await acme.forge.createCsr({\n    altNames: ['test.example.com'],\n});\n```\n**Example**  \nCertificate Signing Request with both common and alternative names\n> *Warning*: Certificate subject common name has been [deprecated](https://letsencrypt.org/docs/glossary/#def-CN) and its use is [discouraged](https://cabforum.org/uploads/BRv1.2.3.pdf).\n```js\nconst [certificateKey, certificateRequest] = await acme.forge.createCsr({\n    keySize: 4096,\n    commonName: 'test.example.com',\n    altNames: ['foo.example.com', 'bar.example.com'],\n});\n```\n**Example**  \nCertificate Signing Request with additional information\n```js\nconst [certificateKey, certificateRequest] = await acme.forge.createCsr({\n    altNames: ['test.example.com'],\n    country: 'US',\n    state: 'California',\n    locality: 'Los Angeles',\n    organization: 'The Company Inc.',\n    organizationUnit: 'IT Department',\n    emailAddress: 'contact@example.com',\n});\n```\n**Example**  \nCertificate Signing Request with predefined private key\n```js\nconst certificateKey = await acme.forge.createPrivateKey();\n\nconst [, certificateRequest] = await acme.forge.createCsr({\n    altNames: ['test.example.com'],\n}, certificateKey);\n<a name=\"createPrivateKey\"></a>\n\n## createPrivateKey([size]) ⇒ <code>Promise.&lt;buffer&gt;</code>\nGenerate a private RSA key\n\n**Kind**: global function  \n**Returns**: <code>Promise.&lt;buffer&gt;</code> - PEM encoded private RSA key  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [size] | <code>number</code> | Size of the key, default: `2048` |\n\n**Example**  \nGenerate private RSA key\n```js\nconst privateKey = await acme.forge.createPrivateKey();\n```\n**Example**  \nPrivate RSA key with defined size\n```js\nconst privateKey = await acme.forge.createPrivateKey(4096);\n```\n"
  },
  {
    "path": "packages/core/acme-client/docs/upgrade-v5.md",
    "content": "# Upgrading to v5 of `acme-client`\n\nThis document outlines the breaking changes introduced in v5 of `acme-client`, why they were introduced and what you should look out for when upgrading your application.\n\nFirst off this release drops support for Node LTS v10, v12 and v14, and the reason for that is a new native crypto interface - more on that below. Since Node v14 is still currently in maintenance mode, `acme-client` v4 will continue to receive security updates and bugfixes until (at least) Node v14 reaches its end-of-line.\n\n## New native crypto interface\n\nA new crypto interface has been introduced with v5, which you can find under `acme.crypto`. It uses native Node.js cryptography APIs to generate private keys, JSON Web Keys and signatures, and finally enables support for ECC/ECDSA (P-256, P384 and P521), both for account private keys and certificates. The [@peculiar/x509](https://www.npmjs.com/package/@peculiar/x509) module is used to handle generation and parsing of Certificate Signing Requests.\n\nFull documentation of `acme.crypto` can be [found here](crypto.md).\n\nSince the release of `acme-client` v1.0.0 the crypto interface API has remained mostly unaltered. Back then an OpenSSL CLI wrapper was used to generate keys, and very much has changed since. This has naturally resulted in a buildup of technical debt and slight API inconsistencies over time. The introduction of a new interface was a good opportunity to finally clean up these APIs.\n\nBelow you will find a table summarizing the current `acme.forge` methods, and their new `acme.crypto` replacements. A summary of the changes for each method, including examples on how to migrate, can be found following the table.\n\n*Note: The now deprecated `acme.forge` interface is still available for use in v5, and will not be removed until a future major version, most likely v6. Should you not wish to change to the new interface right away, the following breaking changes will not immediately affect you.*\n\n* :green_circle: = API functionality unchanged between `acme.forge` and `acme.crypto`\n* :orange_circle: = Slight API changes, like depromising or renaming, action may be required\n* :red_circle: = Breaking API changes or removal, action required if using these methods\n\n| Deprecated `.forge` API       | New `.crypto` API             | State                 |\n| ----------------------------- | ----------------------------- | --------------------- |\n| `await createPrivateKey()`    | `await createPrivateKey()`    | :green_circle:        |\n| `await createPublicKey()`     | `getPublicKey()`              | :orange_circle:   (1) |\n| `getPemBody()`                | `getPemBodyAsB64u()`          | :red_circle:      (2) |\n| `splitPemChain()`             | `splitPemChain()`             | :green_circle:        |\n| `await getModulus()`          | `getJwk()`                    | :red_circle:      (3) |\n| `await getPublicExponent()`   | `getJwk()`                    | :red_circle:      (3) |\n| `await readCsrDomains()`      | `readCsrDomains()`            | :orange_circle:   (4) |\n| `await readCertificateInfo()` | `readCertificateInfo()`       | :orange_circle:   (4) |\n| `await createCsr()`           | `await createCsr()`           | :green_circle:        |\n\n### 1. `createPublicKey` renamed and depromised\n\n* The method `createPublicKey()` has been renamed to `getPublicKey()`\n* No longer returns a promise, but the resulting public key directly\n* This is non-breaking if called with `await`, since `await` does not require its operand to be a promise\n* :orange_circle: **This is a breaking change if used with `.then()` or `.catch()`**\n\n```js\n// Before\nconst publicKey = await acme.forge.createPublicKey(privateKey);\n\n// After\nconst publicKey = acme.crypto.getPublicKey(privateKey);\n```\n\n### 2. `getPemBody` renamed, now returns Base64URL\n\n* Method `getPemBody()` has been renamed to `getPemBodyAsB64u()`\n* Instead of a Base64-encoded PEM body, now returns a Base64URL-encoded PEM body\n* :red_circle: **This is a breaking change**\n\n```js\n// Before\nconst body = acme.forge.getPemBody(pem);\n\n// After\nconst body = acme.crypto.getPemBodyAsB64u(pem);\n```\n\n### 3. `getModulus` and `getPublicExponent` merged into `getJwk`\n\n* Methods `getModulus()` and `getPublicExponent()` have been removed\n* Replaced by new method `getJwk()`\n* :red_circle: **This is a breaking change**\n\n```js\n// Before\nconst mod = await acme.forge.getModulus(key);\nconst exp = await acme.forge.getPublicExponent(key);\n\n// After\nconst { e, n } = acme.crypto.getJwk(key);\n```\n\n### 4. `readCsrDomains` and `readCertificateInfo` depromised\n\n* Methods `readCsrDomains()` and `readCertificateInfo()` no longer return promises, but their resulting payloads directly\n* This is non-breaking if called with `await`, since `await` does not require its operand to be a promise\n* :orange_circle: **This is a breaking change if used with `.then()` or `.catch()`**\n\n```js\n// Before\nconst domains = await acme.forge.readCsrDomains(csr);\nconst info = await acme.forge.readCertificateInfo(certificate);\n\n// After\nconst domains = acme.crypto.readCsrDomains(csr);\nconst info = acme.crypto.readCertificateInfo(certificate);\n```\n"
  },
  {
    "path": "packages/core/acme-client/examples/README.md",
    "content": "# Disclaimer\n\nThese examples should not be used as is for any production environment, as they are just proof of concepts meant for testing and to get you started. The examples are naively written and purposefully avoids important topics since they will be specific to your application and how you choose to use `acme-client`, like for example:\n\n1. **Concurrency control**\n    * If implementing on-demand certificate generation\n    * What happens when multiple requests hit your domain at the same time?\n    * Ensure your application does not place multiple cert orders for the same domain at the same time by implementing some sort of exclusive lock\n2. **Domain allow lists**\n    * If implementing on-demand certificate generation\n    * What happens when someone manipulates the `ServerName` or `Host` header to your service?\n    * Ensure your application is unable to place certificate orders for domains you do not intend, as this can quickly rate limit your account and cause a DoS\n3. **Clustering**\n    * If using `acme-client` across a cluster of servers\n    * Ensure challenge responses are known to all servers in your cluster, perhaps using a database or shared storage\n4. **Certificate and key storage**\n    * Where and how should the account key be stored and read?\n    * Where and how should certificates and cert keys be stored and read?\n    * How and when should they be renewed?\n"
  },
  {
    "path": "packages/core/acme-client/examples/api.js",
    "content": "/**\n * Example of acme.Client API\n */\n\nconst acme = require('./../');\n\nfunction log(m) {\n    process.stdout.write(`${m}\\n`);\n}\n\n/**\n * Function used to satisfy an ACME challenge\n *\n * @param {object} authz Authorization object\n * @param {object} challenge Selected challenge\n * @param {string} keyAuthorization Authorization key\n * @returns {Promise}\n */\n\nasync function challengeCreateFn(authz, challenge, keyAuthorization) {\n    /* Do something here */\n    log(JSON.stringify(authz));\n    log(JSON.stringify(challenge));\n    log(keyAuthorization);\n}\n\n/**\n * Function used to remove an ACME challenge response\n *\n * @param {object} authz Authorization object\n * @param {object} challenge Selected challenge\n * @returns {Promise}\n */\n\nasync function challengeRemoveFn(authz, challenge, keyAuthorization) {\n    /* Do something here */\n    log(JSON.stringify(authz));\n    log(JSON.stringify(challenge));\n    log(keyAuthorization);\n}\n\n/**\n * Main\n */\n\nmodule.exports = async () => {\n    /* Init client */\n    const client = new acme.Client({\n        directoryUrl: acme.directory.letsencrypt.staging,\n        accountKey: await acme.crypto.createPrivateKey(),\n    });\n\n    /* Register account */\n    await client.createAccount({\n        termsOfServiceAgreed: true,\n        contact: ['mailto:test@example.com'],\n    });\n\n    /* Place new order */\n    const order = await client.createOrder({\n        identifiers: [\n            { type: 'dns', value: 'example.com' },\n            { type: 'dns', value: '*.example.com' },\n        ],\n    });\n\n    /**\n     * authorizations / client.getAuthorizations(order);\n     * An array with one item per DNS name in the certificate order.\n     * All items require at least one satisfied challenge before order can be completed.\n     */\n\n    const authorizations = await client.getAuthorizations(order);\n\n    const promises = authorizations.map(async (authz) => {\n        let challengeCompleted = false;\n\n        try {\n            /**\n             * challenges / authz.challenges\n             * An array of all available challenge types for a single DNS name.\n             * One of these challenges needs to be satisfied.\n             */\n\n            const { challenges } = authz;\n\n            /* Just select any challenge */\n            const challenge = challenges.pop();\n            const keyAuthorization = await client.getChallengeKeyAuthorization(challenge);\n\n            try {\n                /* Satisfy challenge */\n                await challengeCreateFn(authz, challenge, keyAuthorization);\n\n                /* Verify that challenge is satisfied */\n                await client.verifyChallenge(authz, challenge);\n\n                /* Notify ACME provider that challenge is satisfied */\n                await client.completeChallenge(challenge);\n                challengeCompleted = true;\n\n                /* Wait for ACME provider to respond with valid status */\n                await client.waitForValidStatus(challenge);\n            }\n            finally {\n                /* Clean up challenge response */\n                try {\n                    await challengeRemoveFn(authz, challenge, keyAuthorization);\n                }\n                catch (e) {\n                    /**\n                     * Catch errors thrown by challengeRemoveFn() so the order can\n                     * be finalized, even though something went wrong during cleanup\n                     */\n                }\n            }\n        }\n        catch (e) {\n            /* Deactivate pending authz when unable to complete challenge */\n            if (!challengeCompleted) {\n                try {\n                    await client.deactivateAuthorization(authz);\n                }\n                catch (f) {\n                    /* Catch and suppress deactivateAuthorization() errors */\n                }\n            }\n\n            throw e;\n        }\n    });\n\n    /* Wait for challenges to complete */\n    await Promise.all(promises);\n\n    /* Finalize order */\n    const [key, csr] = await acme.crypto.createCsr({\n        altNames: ['example.com', '*.example.com'],\n    });\n\n    const finalized = await client.finalizeOrder(order, csr);\n    const cert = await client.getCertificate(finalized);\n\n    /* Done */\n    log(`CSR:\\n${csr.toString()}`);\n    log(`Private key:\\n${key.toString()}`);\n    log(`Certificate:\\n${cert.toString()}`);\n};\n"
  },
  {
    "path": "packages/core/acme-client/examples/auto.js",
    "content": "/**\n * Example of acme.Client.auto()\n */\n\n// const fs = require('fs').promises;\nconst acme = require('./../');\n\nfunction log(m) {\n    process.stdout.write(`${m}\\n`);\n}\n\n/**\n * Function used to satisfy an ACME challenge\n *\n * @param {object} authz Authorization object\n * @param {object} challenge Selected challenge\n * @param {string} keyAuthorization Authorization key\n * @returns {Promise}\n */\n\nasync function challengeCreateFn(authz, challenge, keyAuthorization) {\n    log('Triggered challengeCreateFn()');\n\n    /* http-01 */\n    if (challenge.type === 'http-01') {\n        const filePath = `/var/www/html/.well-known/acme-challenge/${challenge.token}`;\n        const fileContents = keyAuthorization;\n\n        log(`Creating challenge response for ${authz.identifier.value} at path: ${filePath}`);\n\n        /* Replace this */\n        log(`Would write \"${fileContents}\" to path \"${filePath}\"`);\n        // await fs.writeFile(filePath, fileContents);\n    }\n\n    /* dns-01 */\n    else if (challenge.type === 'dns-01') {\n        const dnsRecord = `_acme-challenge.${authz.identifier.value}`;\n        const recordValue = keyAuthorization;\n\n        log(`Creating TXT record for ${authz.identifier.value}: ${dnsRecord}`);\n\n        /* Replace this */\n        log(`Would create TXT record \"${dnsRecord}\" with value \"${recordValue}\"`);\n        // await dnsProvider.createRecord(dnsRecord, 'TXT', recordValue);\n    }\n}\n\n/**\n * Function used to remove an ACME challenge response\n *\n * @param {object} authz Authorization object\n * @param {object} challenge Selected challenge\n * @param {string} keyAuthorization Authorization key\n * @returns {Promise}\n */\n\nasync function challengeRemoveFn(authz, challenge, keyAuthorization) {\n    log('Triggered challengeRemoveFn()');\n\n    /* http-01 */\n    if (challenge.type === 'http-01') {\n        const filePath = `/var/www/html/.well-known/acme-challenge/${challenge.token}`;\n\n        log(`Removing challenge response for ${authz.identifier.value} at path: ${filePath}`);\n\n        /* Replace this */\n        log(`Would remove file on path \"${filePath}\"`);\n        // await fs.unlink(filePath);\n    }\n\n    /* dns-01 */\n    else if (challenge.type === 'dns-01') {\n        const dnsRecord = `_acme-challenge.${authz.identifier.value}`;\n        const recordValue = keyAuthorization;\n\n        log(`Removing TXT record for ${authz.identifier.value}: ${dnsRecord}`);\n\n        /* Replace this */\n        log(`Would remove TXT record \"${dnsRecord}\" with value \"${recordValue}\"`);\n        // await dnsProvider.removeRecord(dnsRecord, 'TXT', recordValue);\n    }\n}\n\n/**\n * Main\n */\n\nmodule.exports = async () => {\n    /* Init client */\n    const client = new acme.Client({\n        directoryUrl: acme.directory.letsencrypt.staging,\n        accountKey: await acme.crypto.createPrivateKey(),\n    });\n\n    /* Create CSR */\n    const [key, csr] = await acme.crypto.createCsr({\n        altNames: ['example.com'],\n    });\n\n    /* Certificate */\n    const cert = await client.auto({\n        csr,\n        email: 'test@example.com',\n        termsOfServiceAgreed: true,\n        challengeCreateFn,\n        challengeRemoveFn,\n    });\n\n    /* Done */\n    log(`CSR:\\n${csr.toString()}`);\n    log(`Private key:\\n${key.toString()}`);\n    log(`Certificate:\\n${cert.toString()}`);\n};\n"
  },
  {
    "path": "packages/core/acme-client/examples/dns-01/README.md",
    "content": "# dns-01\n\nThe greatest benefit of `dns-01` is that it is the only challenge type that can be used to issue ACME wildcard certificates, however it also has a few downsides. Your DNS provider needs to offer some sort of API you can use to automate adding and removing the required `TXT` DNS records. Additionally, solving DNS challenges will be much slower than the other challenge types because of DNS propagation delays.\n\n## How it works\n\nWhen solving `dns-01` challenges, you prove ownership of a domain by serving a specific payload within a specific DNS `TXT` record from the domains authoritative nameservers. The ACME authority provides the client with a token that, along with a thumbprint of your account key, is used to generate a `base64url` encoded `SHA256` digest. This payload is then placed as a `TXT` record under DNS name `_acme-challenge.$YOUR_DOMAIN`.\n\nOnce the order is finalized, the ACME authority will lookup your domains DNS record to verify that the payload is correct. `CNAME` and `NS` records are followed, should you wish to delegate challenge response to another DNS zone or record.\n\n## Pros and cons\n\n* Only challenge type that can be used to issue wildcard certificates\n* Your DNS provider needs to supply an API that can be used\n* DNS propagation time may be slow\n* Useful in instances where both port 80 and 443 are unavailable\n\n## External links\n\n* [https://letsencrypt.org/docs/challenge-types/#dns-01-challenge](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge)\n* [https://datatracker.ietf.org/doc/html/rfc8555#section-8.4](https://datatracker.ietf.org/doc/html/rfc8555#section-8.4)\n"
  },
  {
    "path": "packages/core/acme-client/examples/dns-01/dns-01.js",
    "content": "/**\n * Example using dns-01 challenge to generate certificates\n *\n * NOTE: This example is incomplete as the DNS challenge response implementation\n * will be specific to your DNS providers API.\n *\n * NOTE: This example does not order certificates on-demand, as solving dns-01\n * will likely be too slow for it to make sense. Instead, it orders a wildcard\n * certificate on init before starting the HTTPS server as a demonstration.\n */\n\nconst https = require('https');\nconst acme = require('./../../');\n\nconst HTTPS_SERVER_PORT = 443;\nconst WILDCARD_DOMAIN = 'example.com';\n\nfunction log(m) {\n    process.stdout.write(`${(new Date()).toISOString()} ${m}\\n`);\n}\n\n/**\n * Main\n */\n\n(async () => {\n    try {\n        /**\n         * Initialize ACME client\n         */\n\n        log('Initializing ACME client');\n        const client = new acme.Client({\n            directoryUrl: acme.directory.letsencrypt.staging,\n            accountKey: await acme.crypto.createPrivateKey(),\n        });\n\n        /**\n         * Order wildcard certificate\n         */\n\n        log(`Creating CSR for ${WILDCARD_DOMAIN}`);\n        const [key, csr] = await acme.crypto.createCsr({\n            altNames: [WILDCARD_DOMAIN, `*.${WILDCARD_DOMAIN}`],\n        });\n\n        log(`Ordering certificate for ${WILDCARD_DOMAIN}`);\n        const cert = await client.auto({\n            csr,\n            email: 'test@example.com',\n            termsOfServiceAgreed: true,\n            challengePriority: ['dns-01'],\n            challengeCreateFn: (authz, challenge, keyAuthorization) => {\n                /* TODO: Implement this */\n                log(`[TODO] Add TXT record key=_acme-challenge.${authz.identifier.value} value=${keyAuthorization}`);\n            },\n            challengeRemoveFn: (authz, challenge, keyAuthorization) => {\n                /* TODO: Implement this */\n                log(`[TODO] Remove TXT record key=_acme-challenge.${authz.identifier.value} value=${keyAuthorization}`);\n            },\n        });\n\n        log(`Certificate for ${WILDCARD_DOMAIN} created successfully`);\n\n        /**\n         * HTTPS server\n         */\n\n        const requestListener = (req, res) => {\n            log(`HTTP 200 ${req.headers.host}${req.url}`);\n            res.writeHead(200);\n            res.end('Hello world\\n');\n        };\n\n        const httpsServer = https.createServer({\n            key,\n            cert,\n        }, requestListener);\n\n        httpsServer.listen(HTTPS_SERVER_PORT, () => {\n            log(`HTTPS server listening on port ${HTTPS_SERVER_PORT}`);\n        });\n    }\n    catch (e) {\n        log(`[FATAL] ${e.message}`);\n        process.exit(1);\n    }\n})();\n"
  },
  {
    "path": "packages/core/acme-client/examples/fallback.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDCTCCAfGgAwIBAgIUGwI6ZLE3HN7oRZ9BvWLde0Tsu7EwDQYJKoZIhvcNAQEL\nBQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIyMDgwMTAwNTMzMVoXDTIyMDgz\nMTAwNTMzMVowFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEA4c7zSiY6OEp9xYZHY42FUfOLREm03NstZhd9IxFFePwe\nCTTirJjmi5teKQwzBmEok0SJkanJUaMsMlOHjEykWSc4SBO4QjD349Q60044i9WS\n7KHzeSqpWTG+V9jF3HOJPw843VG9hXy3ulXKcysTXzumTVQwfatCODBNkpWqMju2\nN33biLgmpqwLbDSfKXS3uSVTfoHAKGT/oRepko7/0Hwr5oEmjXEbpRWRhU09KYjH\n7jokRaiQRn0h216a0r4AKzSNGihNQtKJZIuwJvLFPMQYafsu9qBaCLPqDBXCwQWG\naYh6Cm3kTkADKzG1LVPB/7/Uh2d4Fck/ejR9qXRK3QIDAQABo1MwUTAdBgNVHQ4E\nFgQUvyceAVDMPbW7wHwNF9px5dWfgd4wHwYDVR0jBBgwFoAUvyceAVDMPbW7wHwN\nF9px5dWfgd4wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAaYkz\nAOHrRirPwfkwjb+uMliGHfANrmak8r5VDQA73RLTQLRhMpf1yrb1uhH7p/CUYKap\nx1C8RGQAXujoQbQOslyZA7cVLA9ASSZS6Noq7NerfGBiqxeuye+x3lIIk1EOL/rH\naBu9rrYGmlU49PlGAQSfFHkwzXti2Mp1VQv8eMOBLR49ezZIXHiPE8S3gjNymZ0G\nUA13wzZCT7SG1BLmQ/cBVASG2wvhlC8IG/4vF0Xe+boSOb1vGWUtHS+MnvvRK4n5\nTMUtrnxSQ/LA8AtobvzqgvQVKBSPLK6RzLE7I+Q9pWsbKTBqfyStuQrQFqafBOqN\neYfPUgiID9uvfrxLvA==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "packages/core/acme-client/examples/fallback.key",
    "content": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDhzvNKJjo4Sn3F\nhkdjjYVR84tESbTc2y1mF30jEUV4/B4JNOKsmOaLm14pDDMGYSiTRImRqclRoywy\nU4eMTKRZJzhIE7hCMPfj1DrTTjiL1ZLsofN5KqlZMb5X2MXcc4k/DzjdUb2FfLe6\nVcpzKxNfO6ZNVDB9q0I4ME2SlaoyO7Y3fduIuCamrAtsNJ8pdLe5JVN+gcAoZP+h\nF6mSjv/QfCvmgSaNcRulFZGFTT0piMfuOiRFqJBGfSHbXprSvgArNI0aKE1C0olk\ni7Am8sU8xBhp+y72oFoIs+oMFcLBBYZpiHoKbeROQAMrMbUtU8H/v9SHZ3gVyT96\nNH2pdErdAgMBAAECggEBAImI0FxQblOM45AkmmTDdPmWWjPspNGEWeF92wU55tOq\n0+yNnqa7tmg/6JkdyhJPqTQRoazr+ifUN/4rLDtDDzMSFVCpWihOxR2qTW4YjY52\nNjgU6EPbvSwLhUDiUplUcbrL3bnHqKSecxV2XYnKKdFudntRFPvmDL5GhWkL6Y8P\n9KiQaYuPf4av8PR0NlWBMiZs+CBjLlnSTMAWRYj5mRSyFSEOMT7+Lvr3TqrO2/nh\n0H30LXxrXXXuCbQXnVy3oSNf7TrathT2ADIrUUTdRHsLscvkEA35VtFQtWdJLtEg\nsso1J7viV9YDU4niPSdHPj3ubBjAExej4qCOzatsIQ0CgYEA8L5S3ojy89g7q6vB\nQuusIrjGkyM1yebDWqhEnjvlMpfrU1hCS90BM1ozZ28bjz/7PBimKL+A8BO+W0m4\n2s9YbZP5aGwo18Iq86XEdtDgWtQ3NXbYkb8F8LNtyevC/UlAI/xyIRr7hDYlr/1v\njJg16DXiNLyk+uj4Q3EuwzNl8n8CgYEA8B5UUkOiufPtm+ZOq9AlBpIa+NYaahZM\nh52jzMTKsFB18xsZU/ufvpKvXEu1sTeCDRo3JAHmiA6AG292Zc7W+uWRtMtlmQWE\nwnoZ6hKvEkFnArLCY6Nm5Qqm1wipLwDVO3dD/CDL86siHrXK4wU7Q+bp6xbt8lDi\nitz5F7p7HKMCgYAoj8iimexlTU9wczXSsqaECyHZ9JrBc9ICWkuFZY4OYi5SEpLI\n+WmUX2Q9zyiTkDIiQ/zq7KkqygjOlLNCmqDJhZ8GCwMupxZZitp5MmQ6qXrL1URT\n+h1kGrcqyEBIMKlP5t7L2SH7eqwK5OaAh7y9bSa5v/cEF3CM3GsGlIhevQKBgBGU\nRtwW84zlnNmzDMNrY6qNe8gH9LsbktLC6cEOD0DFQz1fGIWbgGB1YL1DFbQ5uh23\nc54BPZ1sYlif2m0trXOE5xvzYCbJzqRmSAto/sQ5YY9DAxREXD4cf4ZyreAxEWtf\nGe0VgZj/SGozKP1h3qrj9vAtJ5J79XnxH5NrJaQ9AoGBAM2rQrt8H2kizg4wMGRZ\n0G3709W7xxlbPdm+i/jFVDayJswCr0+eMm4gGyyZL3135D0fcijxytKgg3/OpOJF\njC9vsHsE2K1ATp6eYvYjrhqJHI1m44aq/h46SfajytZQjwMT/jaApULDP2/fCBm5\n6eS2WCyHyrYJyrgoYQF56nsT\n-----END PRIVATE KEY-----\n"
  },
  {
    "path": "packages/core/acme-client/examples/http-01/README.md",
    "content": "# http-01\n\nThe `http-01` challenge type is the simplest to implement and should likely be your default choice, unless you either require wildcard certificates or if port 80 is unavailable for use.\n\n## How it works\n\nWhen solving `http-01` challenges, you prove ownership of a domain name by serving a specific payload from a specific URL. The ACME authority provides the client with a token that is used to generate the URL and file contents. The file must exist at `http://$YOUR_DOMAIN/.well-known/acme-challenge/$TOKEN` and contain the token and a thumbprint of your account key.\n\nOnce the order is finalized, the ACME authority will verify that the URL responds with the correct payload by sending HTTP requests before the challenge is valid. HTTP redirects are followed, and Let's Encrypt allows redirecting to HTTPS although this diverges from the ACME spec.\n\n## Pros and cons\n\n* Challenge must be satisfied using port 80 (HTTP)\n* The simplest challenge type to implement\n* Can not be used to issue wildcard certificates\n* If using multiple web servers, all of them need to respond with the correct token\n\n## External links\n\n* [https://letsencrypt.org/docs/challenge-types/#http-01-challenge](https://letsencrypt.org/docs/challenge-types/#http-01-challenge)\n* [https://datatracker.ietf.org/doc/html/rfc8555#section-8.3](https://datatracker.ietf.org/doc/html/rfc8555#section-8.3)\n"
  },
  {
    "path": "packages/core/acme-client/examples/http-01/http-01.js",
    "content": "/**\n * Example using http-01 challenge to generate certificates on-demand\n */\n\nconst fs = require('fs');\nconst path = require('path');\nconst http = require('http');\nconst https = require('https');\nconst tls = require('tls');\nconst acme = require('./../../');\n\nconst HTTP_SERVER_PORT = 80;\nconst HTTPS_SERVER_PORT = 443;\nconst VALID_DOMAINS = ['example.com', 'example.org'];\nconst FALLBACK_KEY = fs.readFileSync(path.join(__dirname, '..', 'fallback.key'));\nconst FALLBACK_CERT = fs.readFileSync(path.join(__dirname, '..', 'fallback.crt'));\n\nconst pendingDomains = {};\nconst challengeResponses = {};\nconst certificateStore = {};\n\nfunction log(m) {\n    process.stdout.write(`${(new Date()).toISOString()} ${m}\\n`);\n}\n\n/**\n * On-demand certificate generation using http-01\n */\n\nasync function getCertOnDemand(client, servername, attempt = 0) {\n    /* Invalid domain */\n    if (!VALID_DOMAINS.includes(servername)) {\n        throw new Error(`Invalid domain: ${servername}`);\n    }\n\n    /* Certificate exists */\n    if (servername in certificateStore) {\n        return certificateStore[servername];\n    }\n\n    /* Waiting on certificate order to go through */\n    if (servername in pendingDomains) {\n        if (attempt >= 10) {\n            throw new Error(`Gave up waiting on certificate for ${servername}`);\n        }\n\n        await new Promise((resolve) => { setTimeout(resolve, 1000); });\n        return getCertOnDemand(client, servername, (attempt + 1));\n    }\n\n    /* Create CSR */\n    log(`Creating CSR for ${servername}`);\n    const [key, csr] = await acme.crypto.createCsr({\n        altNames: [servername],\n    });\n\n    /* Order certificate */\n    log(`Ordering certificate for ${servername}`);\n    const cert = await client.auto({\n        csr,\n        email: 'test@example.com',\n        termsOfServiceAgreed: true,\n        challengePriority: ['http-01'],\n        challengeCreateFn: (authz, challenge, keyAuthorization) => {\n            challengeResponses[challenge.token] = keyAuthorization;\n        },\n        challengeRemoveFn: (authz, challenge) => {\n            delete challengeResponses[challenge.token];\n        },\n    });\n\n    /* Done, store certificate */\n    log(`Certificate for ${servername} created successfully`);\n    certificateStore[servername] = [key, cert];\n    delete pendingDomains[servername];\n    return certificateStore[servername];\n}\n\n/**\n * Main\n */\n\n(async () => {\n    try {\n        /**\n         * Initialize ACME client\n         */\n\n        log('Initializing ACME client');\n        const client = new acme.Client({\n            directoryUrl: acme.directory.letsencrypt.staging,\n            accountKey: await acme.crypto.createPrivateKey(),\n        });\n\n        /**\n         * HTTP server\n         */\n\n        const httpServer = http.createServer((req, res) => {\n            if (req.url.match(/\\/\\.well-known\\/acme-challenge\\/.+/)) {\n                const token = req.url.split('/').pop();\n                log(`Received challenge request for token=${token}`);\n\n                /* ACME challenge response */\n                if (token in challengeResponses) {\n                    log(`Serving challenge response HTTP 200 token=${token}`);\n                    res.writeHead(200);\n                    res.end(challengeResponses[token]);\n                    return;\n                }\n\n                /* Challenge response not found */\n                log(`Oops, challenge response not found for token=${token}`);\n                res.writeHead(404);\n                res.end();\n                return;\n            }\n\n            /* HTTP 302 redirect */\n            log(`HTTP 302 ${req.headers.host}${req.url}`);\n            res.writeHead(302, { Location: `https://${req.headers.host}${req.url}` });\n            res.end();\n        });\n\n        httpServer.listen(HTTP_SERVER_PORT, () => {\n            log(`HTTP server listening on port ${HTTP_SERVER_PORT}`);\n        });\n\n        /**\n         * HTTPS server\n         */\n\n        const requestListener = (req, res) => {\n            log(`HTTP 200 ${req.headers.host}${req.url}`);\n            res.writeHead(200);\n            res.end('Hello world\\n');\n        };\n\n        const httpsServer = https.createServer({\n            /* Fallback certificate */\n            key: FALLBACK_KEY,\n            cert: FALLBACK_CERT,\n\n            /* Serve certificate based on servername */\n            SNICallback: async (servername, cb) => {\n                try {\n                    log(`Handling SNI request for ${servername}`);\n                    const [key, cert] = await getCertOnDemand(client, servername);\n\n                    log(`Found certificate for ${servername}, serving secure context`);\n                    cb(null, tls.createSecureContext({ key, cert }));\n                }\n                catch (e) {\n                    log(`[ERROR] ${e.message}`);\n                    cb(e.message);\n                }\n            },\n        }, requestListener);\n\n        httpsServer.listen(HTTPS_SERVER_PORT, () => {\n            log(`HTTPS server listening on port ${HTTPS_SERVER_PORT}`);\n        });\n    }\n    catch (e) {\n        log(`[FATAL] ${e.message}`);\n        process.exit(1);\n    }\n})();\n"
  },
  {
    "path": "packages/core/acme-client/examples/tls-alpn-01/README.md",
    "content": "# tls-alpn-01\n\nResponding to `tls-alpn-01` challenges using Node.js is a bit more involved than the other two challenge types, and requires a proxy (f.ex. [Nginx](https://nginx.org) or [HAProxy](https://www.haproxy.org)) in front of the Node.js service. The reason for this is that `tls-alpn-01` is solved by responding to the ACME challenge using self-signed certificates with an ALPN extension containing the challenge response.\n\nSince we don't want users of our application to be served with these self-signed certificates, we need to split the HTTPS traffic into two different Node.js backends - one that only serves ALPN certificates for challenge responses, and the other for actual end-user traffic that serves certificates retrieved from the ACME provider. As far as I *(library author)* know, routing HTTPS traffic based on ALPN protocol can not be done purely using Node.js.\n\nThe end result should look something like this:\n\n```text\nNginx or HAProxy (0.0.0.0:443)\n    *inspect requests SSL ALPN protocol*\n        If ALPN == acme-tls/1\n            -> Node.js ALPN responder (127.0.0.1:4444)\n        Else\n            -> Node.js HTTPS server (127.0.0.1:4443)\n```\n\nExample proxy configuration:\n\n* [haproxy.cfg](haproxy.cfg) *(requires HAProxy >= v1.9.1)*\n* [nginx.conf](nginx.conf) *(requires [ngx_stream_ssl_preread_module](https://nginx.org/en/docs/stream/ngx_stream_ssl_preread_module.html))*\n\nBig thanks to [acme.sh](https://github.com/acmesh-official/acme.sh) and [dehydrated](https://github.com/dehydrated-io/dehydrated) for doing the legwork and providing Nginx and HAProxy config examples.\n\n## How it works\n\nWhen solving `tls-alpn-01` challenges, you prove ownership of a domain name by serving a specially crafted certificate over HTTPS. The ACME authority provides the client with a token that is placed into the certificates `id-pe-acmeIdentifier` extension along with a thumbprint of your account key.\n\nOnce the order is finalized, the ACME authority will verify by sending HTTPS requests to your domain with the `acme-tls/1` ALPN protocol, indicating to the server that it should serve the challenge response certificate. If the `id-pe-acmeIdentifier` extension contains the correct payload, the challenge is valid.\n\n## Pros and cons\n\n* Challenge must be satisfied using port 443 (HTTPS)\n* Useful in instances where port 80 is unavailable\n* Can not be used to issue wildcard certificates\n* More complex than `http-01`, can not be solved purely using Node.js\n* If using multiple web servers, all of them need to respond with the correct certificate\n\n## External links\n\n* [https://letsencrypt.org/docs/challenge-types/#tls-alpn-01](https://letsencrypt.org/docs/challenge-types/#tls-alpn-01)\n* [https://github.com/dehydrated-io/dehydrated/blob/master/docs/tls-alpn.md](https://github.com/dehydrated-io/dehydrated/blob/master/docs/tls-alpn.md)\n* [https://github.com/acmesh-official/acme.sh/wiki/TLS-ALPN-without-downtime](https://github.com/acmesh-official/acme.sh/wiki/TLS-ALPN-without-downtime)\n* [https://datatracker.ietf.org/doc/html/rfc8737](https://datatracker.ietf.org/doc/html/rfc8737)\n"
  },
  {
    "path": "packages/core/acme-client/examples/tls-alpn-01/haproxy.cfg",
    "content": "##\n# HTTPS listener\n# - Send to ALPN responder port 4444 if protocol is acme-tls/1\n# - Default to HTTPS backend port 4443\n##\n\nfrontend https\n  mode tcp\n  bind :443\n  tcp-request inspect-delay 5s\n  tcp-request content accept if { req_ssl_hello_type 1 }\n  use_backend alpnresp if { req.ssl_alpn acme-tls/1 }\n  default_backend https\n\n# Default HTTPS backend\nbackend https\n  mode tcp\n  server https 127.0.0.1:4443\n\n# ACME tls-alpn-01 responder backend\nbackend alpnresp\n  mode tcp\n  server acmesh 127.0.0.1:4444\n"
  },
  {
    "path": "packages/core/acme-client/examples/tls-alpn-01/nginx.conf",
    "content": "##\n# HTTPS server\n# - Send to ALPN responder port 4444 if protocol is acme-tls/1\n# - Default to HTTPS backend port 4443\n##\n\nstream {\n  map $ssl_preread_alpn_protocols $tls_port {\n    ~\\bacme-tls/1\\b 4444;\n    default 4443;\n  }\n\n  server {\n    listen 443;\n    listen [::]:443;\n    proxy_pass 127.0.0.1:$tls_port;\n    ssl_preread on;\n  }\n}\n"
  },
  {
    "path": "packages/core/acme-client/examples/tls-alpn-01/tls-alpn-01.js",
    "content": "/**\n * Example using tls-alpn-01 challenge to generate certificates on-demand\n */\n\nconst fs = require('fs');\nconst path = require('path');\nconst https = require('https');\nconst tls = require('tls');\nconst acme = require('./../../');\n\nconst HTTPS_SERVER_PORT = 4443;\nconst ALPN_RESPONDER_PORT = 4444;\nconst VALID_DOMAINS = ['example.com', 'example.org'];\nconst FALLBACK_KEY = fs.readFileSync(path.join(__dirname, '..', 'fallback.key'));\nconst FALLBACK_CERT = fs.readFileSync(path.join(__dirname, '..', 'fallback.crt'));\n\nconst pendingDomains = {};\nconst alpnResponses = {};\nconst certificateStore = {};\n\nfunction log(m) {\n    process.stdout.write(`${(new Date()).toISOString()} ${m}\\n`);\n}\n\n/**\n * On-demand certificate generation using tls-alpn-01\n */\n\nasync function getCertOnDemand(client, servername, attempt = 0) {\n    /* Invalid domain */\n    if (!VALID_DOMAINS.includes(servername)) {\n        throw new Error(`Invalid domain: ${servername}`);\n    }\n\n    /* Certificate exists */\n    if (servername in certificateStore) {\n        return certificateStore[servername];\n    }\n\n    /* Waiting on certificate order to go through */\n    if (servername in pendingDomains) {\n        if (attempt >= 10) {\n            throw new Error(`Gave up waiting on certificate for ${servername}`);\n        }\n\n        await new Promise((resolve) => { setTimeout(resolve, 1000); });\n        return getCertOnDemand(client, servername, (attempt + 1));\n    }\n\n    /* Create CSR */\n    log(`Creating CSR for ${servername}`);\n    const [key, csr] = await acme.crypto.createCsr({\n        altNames: [servername],\n    });\n\n    /* Order certificate */\n    log(`Ordering certificate for ${servername}`);\n    const cert = await client.auto({\n        csr,\n        email: 'test@example.com',\n        termsOfServiceAgreed: true,\n        challengePriority: ['tls-alpn-01'],\n        challengeCreateFn: async (authz, challenge, keyAuthorization) => {\n            alpnResponses[authz.identifier.value] = await acme.crypto.createAlpnCertificate(authz, keyAuthorization);\n        },\n        challengeRemoveFn: (authz) => {\n            delete alpnResponses[authz.identifier.value];\n        },\n    });\n\n    /* Done, store certificate */\n    log(`Certificate for ${servername} created successfully`);\n    certificateStore[servername] = [key, cert];\n    delete pendingDomains[servername];\n    return certificateStore[servername];\n}\n\n/**\n * Main\n */\n\n(async () => {\n    try {\n        /**\n         * Initialize ACME client\n         */\n\n        log('Initializing ACME client');\n        const client = new acme.Client({\n            directoryUrl: acme.directory.letsencrypt.staging,\n            accountKey: await acme.crypto.createPrivateKey(),\n        });\n\n        /**\n         * ALPN responder\n         */\n\n        const alpnResponder = https.createServer({\n            /* Fallback cert */\n            key: FALLBACK_KEY,\n            cert: FALLBACK_CERT,\n\n            /* Allow acme-tls/1 ALPN protocol */\n            ALPNProtocols: ['acme-tls/1'],\n\n            /* Serve ALPN certificate based on servername */\n            SNICallback: async (servername, cb) => {\n                try {\n                    log(`Handling ALPN SNI request for ${servername}`);\n                    if (!Object.keys(alpnResponses).includes(servername)) {\n                        throw new Error(`No ALPN certificate found for ${servername}`);\n                    }\n\n                    /* Serve ALPN challenge response */\n                    log(`Found ALPN certificate for ${servername}, serving secure context`);\n                    cb(null, tls.createSecureContext({\n                        key: alpnResponses[servername][0],\n                        cert: alpnResponses[servername][1],\n                    }));\n                }\n                catch (e) {\n                    log(`[ERROR] ${e.message}`);\n                    cb(e.message);\n                }\n            },\n        });\n\n        /* Terminate once TLS handshake has been established */\n        alpnResponder.on('secureConnection', (socket) => {\n            socket.end();\n        });\n\n        alpnResponder.listen(ALPN_RESPONDER_PORT, () => {\n            log(`ALPN responder listening on port ${ALPN_RESPONDER_PORT}`);\n        });\n\n        /**\n         * HTTPS server\n         */\n\n        const requestListener = (req, res) => {\n            log(`HTTP 200 ${req.headers.host}${req.url}`);\n            res.writeHead(200);\n            res.end('Hello world\\n');\n        };\n\n        const httpsServer = https.createServer({\n            /* Fallback cert */\n            key: FALLBACK_KEY,\n            cert: FALLBACK_CERT,\n\n            /* Serve certificate based on servername */\n            SNICallback: async (servername, cb) => {\n                try {\n                    log(`Handling SNI request for ${servername}`);\n                    const [key, cert] = await getCertOnDemand(client, servername);\n\n                    log(`Found certificate for ${servername}, serving secure context`);\n                    cb(null, tls.createSecureContext({ key, cert }));\n                }\n                catch (e) {\n                    log(`[ERROR] ${e.message}`);\n                    cb(e.message);\n                }\n            },\n        }, requestListener);\n\n        httpsServer.listen(HTTPS_SERVER_PORT, () => {\n            log(`HTTPS server listening on port ${HTTPS_SERVER_PORT}`);\n        });\n    }\n    catch (e) {\n        log(`[FATAL] ${e.message}`);\n        process.exit(1);\n    }\n})();\n"
  },
  {
    "path": "packages/core/acme-client/package.json",
    "content": "{\n    \"name\": \"@certd/acme-client\",\n    \"description\": \"Simple and unopinionated ACME client\",\n    \"private\": false,\n    \"author\": \"nmorsman\",\n    \"version\": \"1.36.10\",\n    \"type\": \"module\",\n    \"module\": \"scr/index.js\",\n    \"main\": \"src/index.js\",\n    \"types\": \"types/index.d.ts\",\n    \"license\": \"MIT\",\n    \"homepage\": \"https://github.com/publishlab/node-acme-client\",\n    \"engines\": {\n        \"node\": \">= 18\"\n    },\n    \"files\": [\n        \"src\",\n        \"types\"\n    ],\n    \"dependencies\": {\n        \"@certd/basic\": \"^1.36.10\",\n        \"@peculiar/x509\": \"^1.11.0\",\n        \"asn1js\": \"^3.0.5\",\n        \"axios\": \"^1.7.2\",\n        \"debug\": \"^4.3.5\",\n        \"http-proxy-agent\": \"^7.0.2\",\n        \"https-proxy-agent\": \"^7.0.5\",\n        \"lodash-es\": \"^4.17.21\",\n        \"node-forge\": \"^1.3.1\",\n        \"punycode.js\": \"^2.3.1\"\n    },\n    \"devDependencies\": {\n        \"@types/node\": \"^20.14.10\",\n        \"@typescript-eslint/eslint-plugin\": \"^8.26.1\",\n        \"@typescript-eslint/parser\": \"^8.26.1\",\n        \"chai\": \"^4.4.1\",\n        \"chai-as-promised\": \"^7.1.2\",\n        \"eslint\": \"^8.57.0\",\n        \"eslint-config-prettier\": \"^8.5.0\",\n        \"eslint-plugin-import\": \"^2.29.1\",\n        \"eslint-plugin-prettier\": \"^4.2.1\",\n        \"jsdoc-to-markdown\": \"^8.0.1\",\n        \"mocha\": \"^10.6.0\",\n        \"nock\": \"^13.5.4\",\n        \"prettier\": \"^2.8.8\",\n        \"tsd\": \"^0.31.1\",\n        \"typescript\": \"^5.4.2\"\n    },\n    \"scripts\": {\n        \"build-docs\": \"jsdoc2md src/client.js > docs/client.md && jsdoc2md src/crypto/index.js > docs/crypto.md && jsdoc2md src/crypto/forge.js > docs/forge.md\",\n        \"lint\": \"eslint .\",\n        \"lint-types\": \"tsd\",\n        \"prepublishOnly\": \"npm run build-docs\",\n        \"test\": \"mocha -t 60000 \\\"test/setup.js\\\" \\\"test/**/*.spec.js\\\"\",\n        \"pub\": \"npm publish\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/publishlab/node-acme-client\"\n    },\n    \"keywords\": [\n        \"acme\",\n        \"client\",\n        \"lets\",\n        \"encrypt\",\n        \"acmev2\",\n        \"boulder\"\n    ],\n    \"bugs\": {\n        \"url\": \"https://github.com/publishlab/node-acme-client/issues\"\n    },\n    \"gitHead\": \"085bdf5cfa9140903611aa12cdd2542d05aba321\"\n}\n"
  },
  {
    "path": "packages/core/acme-client/src/api.js",
    "content": "/**\n * ACME API client\n */\nimport  * as util  from './util.js';\n\n/**\n * AcmeApi\n *\n * @class\n * @param {HttpClient} httpClient\n */\n\nclass AcmeApi {\n    constructor(httpClient, accountUrl = null) {\n        this.http = httpClient;\n        this.accountUrl = accountUrl;\n    }\n\n    getLocationFromHeader(resp) {\n        let locationUrl = resp.headers.location;\n        const mapping = this.http.urlMapping;\n        if (mapping.mappings) {\n            // eslint-disable-next-line guard-for-in,no-restricted-syntax\n            for (const key in mapping.mappings) {\n                const url = mapping.mappings[key];\n                if (locationUrl.indexOf(url) > -1) {\n                    locationUrl = locationUrl.replace(url, key);\n                }\n            }\n        }\n        console.log(locationUrl, mapping);\n        return locationUrl;\n    }\n\n    /**\n     * Get account URL\n     *\n     * @private\n     * @returns {string} Account URL\n     */\n\n    getAccountUrl() {\n        if (!this.accountUrl) {\n            throw new Error('No account URL found, register account first');\n        }\n\n        return this.accountUrl;\n    }\n\n    /**\n     * ACME API request\n     *\n     * @private\n     * @param {string} url Request URL\n     * @param {object} [payload] Request payload, default: `null`\n     * @param {number[]} [validStatusCodes] Array of valid HTTP response status codes, default: `[]`\n     * @param {object} [opts]\n     * @param {boolean} [opts.includeJwsKid] Include KID instead of JWK in JWS header, default: `true`\n     * @param {boolean} [opts.includeExternalAccountBinding] Include EAB in request, default: `false`\n     * @returns {Promise<object>} HTTP response\n     */\n\n    async apiRequest(url, payload = null, validStatusCodes = [], { includeJwsKid = true, includeExternalAccountBinding = false } = {}) {\n        const kid = includeJwsKid ? this.getAccountUrl() : null;\n        const resp = await this.http.signedRequest(url, payload, { kid, includeExternalAccountBinding });\n\n        if (validStatusCodes.length && (validStatusCodes.indexOf(resp.status) === -1)) {\n            throw new Error(util.formatResponseError(resp));\n        }\n\n        return resp;\n    }\n\n    /**\n     * ACME API request by resource name helper\n     *\n     * @private\n     * @param {string} resource Request resource name\n     * @param {object} [payload] Request payload, default: `null`\n     * @param {number[]} [validStatusCodes] Array of valid HTTP response status codes, default: `[]`\n     * @param {object} [opts]\n     * @param {boolean} [opts.includeJwsKid] Include KID instead of JWK in JWS header, default: `true`\n     * @param {boolean} [opts.includeExternalAccountBinding] Include EAB in request, default: `false`\n     * @returns {Promise<object>} HTTP response\n     */\n\n    async apiResourceRequest(resource, payload = null, validStatusCodes = [], { includeJwsKid = true, includeExternalAccountBinding = false } = {}) {\n        const resourceUrl = await this.http.getResourceUrl(resource);\n        return this.apiRequest(resourceUrl, payload, validStatusCodes, { includeJwsKid, includeExternalAccountBinding });\n    }\n\n    /**\n     * Get Terms of Service URL if available\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.1.1\n     *\n     * @returns {Promise<string|null>} ToS URL\n     */\n\n    async getTermsOfServiceUrl() {\n        return this.http.getMetaField('termsOfService');\n    }\n\n    /**\n     * Create new account\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.3\n     *\n     * @param {object} data Request payload\n     * @returns {Promise<object>} HTTP response\n     */\n\n    async createAccount(data) {\n        const resp = await this.apiResourceRequest('newAccount', data, [200, 201], {\n            includeJwsKid: false,\n            includeExternalAccountBinding: (data.onlyReturnExisting !== true),\n        });\n\n        /* Set account URL */\n        if (resp.headers.location) {\n            this.accountUrl = this.getLocationFromHeader(resp);\n        }\n\n        return resp;\n    }\n\n    /**\n     * Update account\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.3.2\n     *\n     * @param {object} data Request payload\n     * @returns {Promise<object>} HTTP response\n     */\n\n    updateAccount(data) {\n        return this.apiRequest(this.getAccountUrl(), data, [200, 202]);\n    }\n\n    /**\n     * Update account key\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.3.5\n     *\n     * @param {object} data Request payload\n     * @returns {Promise<object>} HTTP response\n     */\n\n    updateAccountKey(data) {\n        return this.apiResourceRequest('keyChange', data, [200]);\n    }\n\n    /**\n     * Create new order\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.4\n     *\n     * @param {object} data Request payload\n     * @returns {Promise<object>} HTTP response\n     */\n\n    createOrder(data) {\n        return this.apiResourceRequest('newOrder', data, [201]);\n    }\n\n    /**\n     * Get order\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.4\n     *\n     * @param {string} url Order URL\n     * @returns {Promise<object>} HTTP response\n     */\n\n    getOrder(url) {\n        return this.apiRequest(url, null, [200]);\n    }\n\n    /**\n     * Finalize order\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.4\n     *\n     * @param {string} url Finalization URL\n     * @param {object} data Request payload\n     * @returns {Promise<object>} HTTP response\n     */\n\n    finalizeOrder(url, data) {\n        return this.apiRequest(url, data, [200]);\n    }\n\n    /**\n     * Get identifier authorization\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.5\n     *\n     * @param {string} url Authorization URL\n     * @returns {Promise<object>} HTTP response\n     */\n\n    getAuthorization(url) {\n        return this.apiRequest(url, null, [200]);\n    }\n\n    /**\n     * Update identifier authorization\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.5.2\n     *\n     * @param {string} url Authorization URL\n     * @param {object} data Request payload\n     * @returns {Promise<object>} HTTP response\n     */\n\n    updateAuthorization(url, data) {\n        return this.apiRequest(url, data, [200]);\n    }\n\n    /**\n     * Complete challenge\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.5.1\n     *\n     * @param {string} url Challenge URL\n     * @param {object} data Request payload\n     * @returns {Promise<object>} HTTP response\n     */\n\n    completeChallenge(url, data) {\n        return this.apiRequest(url, data, [200]);\n    }\n\n    /**\n     * Revoke certificate\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.6\n     *\n     * @param {object} data Request payload\n     * @returns {Promise<object>} HTTP response\n     */\n\n    revokeCert(data) {\n        return this.apiResourceRequest('revokeCert', data, [200]);\n    }\n}\n\n/* Export API */\nexport default AcmeApi;\n"
  },
  {
    "path": "packages/core/acme-client/src/auto.js",
    "content": "/**\n * ACME auto helper\n */\nimport { readCsrDomains } from \"./crypto/index.js\";\nimport { log } from \"./logger.js\";\nimport { wait } from \"./wait.js\";\nimport { CancelError } from \"./error.js\";\n\n\nconst defaultOpts = {\n    csr: null,\n    email: null,\n    preferredChain: null,\n    termsOfServiceAgreed: false,\n    skipChallengeVerification: false,\n    challengePriority: [\"http-01\", \"dns-01\"],\n    challengeCreateFn: async () => {\n        throw new Error(\"Missing challengeCreateFn()\");\n    },\n    challengeRemoveFn: async () => {\n        throw new Error(\"Missing challengeRemoveFn()\");\n    }\n};\n\n/**\n * ACME client auto mode\n *\n * @param {AcmeClient} client ACME client\n * @param {object} userOpts Options\n * @returns {Promise<buffer>} Certificate\n */\n\nexport default async (client, userOpts) => {\n    const opts = { ...defaultOpts, ...userOpts };\n    const accountPayload = { termsOfServiceAgreed: opts.termsOfServiceAgreed };\n\n    if (!Buffer.isBuffer(opts.csr)) {\n        opts.csr = Buffer.from(opts.csr);\n    }\n\n    if (opts.email) {\n        accountPayload.contact = [`mailto:${opts.email}`];\n    }\n    if (opts.externalAccountBinding) {\n        accountPayload.externalAccountBinding = opts.externalAccountBinding;\n    }\n\n    /**\n     * Register account\n     */\n\n    log(\"[auto] Checking account\");\n\n    try {\n        client.getAccountUrl();\n        log(\"[auto] Account URL already exists, skipping account registration（ 证书申请账户已存在，跳过注册 ）\");\n    } catch (e) {\n        log(\"[auto] Registering account （注册证书申请账户）\");\n        await client.createAccount(accountPayload);\n    }\n\n    /**\n     * Parse domains from CSR\n     */\n\n    log(\"[auto] Parsing domains from Certificate Signing Request \");\n    const { commonName, altNames } = readCsrDomains(opts.csr);\n    const uniqueDomains = Array.from(new Set([commonName].concat(altNames).filter((d) => d)));\n\n    log(`[auto] Resolved ${uniqueDomains.length} unique domains from parsing the Certificate Signing Request`);\n\n    /**\n     * Place order\n     */\n\n    log(\"[auto] Placing new certificate order with ACME provider\");\n    const orderPayload = { identifiers: uniqueDomains.map((d) => ({ type: \"dns\", value: d })) };\n    if (opts.profile && client.sslProvider === 'letsencrypt' ){\n        orderPayload.profile = opts.profile;\n    }\n    const order = await client.createOrder(orderPayload);\n    const authorizations = await client.getAuthorizations(order);\n\n    log(`[auto] Placed certificate order successfully, received ${authorizations.length} identity authorizations`);\n\n    /**\n     * Resolve and satisfy challenges\n     */\n\n    log(\"[auto] Resolving and satisfying authorization challenges\");\n\n    const clearTasks = [];\n    const localVerifyTasks = [];\n    const completeChallengeTasks = [];\n\n    const challengeFunc = async (authz) => {\n        const d = authz.identifier.value;\n        let challengeCompleted = false;\n\n        /* Skip authz that already has valid status */\n        if (authz.status === \"valid\") {\n            log(`[auto] [${d}] Authorization already has valid status, no need to complete challenges`);\n            return;\n        }\n\n        const keyAuthorizationGetter = async (challenge) => {\n            return await client.getChallengeKeyAuthorization(challenge);\n        };\n\n        async function deactivateAuth(e) {\n            log(`[auto] [${d}] Unable to complete challenge: ${e.message}`);\n            try {\n                log(`[auto] [${d}] Deactivating failed authorization`);\n                await client.deactivateAuthorization(authz);\n            } catch (f) {\n                /* Suppress deactivateAuthorization() errors */\n                log(`[auto] [${d}] Authorization deactivation threw error: ${f.message}`);\n            }\n        }\n\n        log(`[auto] [${d}] Trigger challengeCreateFn()`);\n        try {\n            const { recordReq, recordRes, dnsProvider, challenge, keyAuthorization ,httpUploader} = await opts.challengeCreateFn(authz, keyAuthorizationGetter);\n            clearTasks.push(async () => {\n                /* Trigger challengeRemoveFn(), suppress errors */\n                log(`[auto] [${d}] Trigger challengeRemoveFn()`);\n                try {\n                    await opts.challengeRemoveFn(authz, challenge, keyAuthorization, recordReq, recordRes, dnsProvider,httpUploader);\n                } catch (e) {\n                    log(`[auto] [${d}] challengeRemoveFn threw error: ${e.message}`);\n                }\n            });\n\n            localVerifyTasks.push(async () => {\n                /* Challenge verification */\n                log(`[auto] [${d}] 开始本地验证, type = ${challenge.type}`);\n                try {\n                    await client.verifyChallenge(authz, challenge);\n                } catch (e) {\n                    log(`[auto] [${d}] 本地验证失败，尝试请求ACME提供商获取状态: ${e.message}`);\n                }\n            });\n\n            completeChallengeTasks.push(async () => {\n                /* Complete challenge and wait for valid status */\n                log(`[auto] [${d}] 请求ACME提供商完成验证`);\n                try{\n                    await client.completeChallenge(challenge);\n                }catch (e) {\n                    await deactivateAuth(e);\n                    throw e;\n                }\n                challengeCompleted = true;\n                log(`[auto] [${d}] 等待返回valid状态`);\n                await client.waitForValidStatus(challenge,d);\n            });\n\n\n        } catch (e) {\n            log(`[auto] [${d}] challengeCreateFn threw error: ${e.message}`);\n            await deactivateAuth(e);\n            throw e;\n        }\n\n    };\n    const domainSets = [];\n\n    authorizations.forEach((authz) => {\n        const d = authz.identifier.value;\n        log(`authorization:domain = ${d}, value = ${JSON.stringify(authz)}`);\n\n        if (authz.status === \"valid\") {\n            log(`[auto] [${d}] Authorization already has valid status, no need to complete challenges`);\n            return;\n        }\n        let setd = false;\n        // eslint-disable-next-line no-restricted-syntax\n        for (const group of domainSets) {\n            if (!group[d]) {\n                group[d] = authz;\n                setd = true;\n                break;\n            }\n        }\n        if (!setd) {\n            const group = {};\n            group[d] = authz;\n            domainSets.push(group);\n        }\n    });\n\n    // log(`domainSets:${JSON.stringify(domainSets)}`);\n\n    const allChallengePromises = [];\n    // eslint-disable-next-line no-restricted-syntax\n    const challengePromises = [];\n    allChallengePromises.push(challengePromises);\n    for (const domainSet of domainSets) {\n        // eslint-disable-next-line guard-for-in,no-restricted-syntax\n        for (const domain in domainSet) {\n            const authz = domainSet[domain];\n            challengePromises.push(async () => {\n                log(`[auto] [${domain}] Starting challenge`);\n                await challengeFunc(authz);\n            });\n        }\n    }\n\n    log(`[auto] challengeGroups:${allChallengePromises.length}`);\n\n    async function runAllPromise(tasks) {\n        let promise = Promise.resolve();\n        tasks.forEach((task) => {\n            promise = promise.then(task);\n        });\n        return promise;\n    }\n\n    async function runPromisePa(tasks, waitTime = 8000) {\n        const results = [];\n        let j = 0\n        // eslint-disable-next-line no-await-in-loop,no-restricted-syntax\n        for (const task of tasks) {\n            j++\n            log(`开始第${j}个任务`);\n            results.push(task());\n            // eslint-disable-next-line no-await-in-loop\n            log(`wait ${Math.floor(waitTime/1000)}s`)\n            await wait(waitTime);\n        }\n        return Promise.all(results);\n    }\n\n    log(`开始challenge，共${allChallengePromises.length}组`);\n    let i = 0;\n    // eslint-disable-next-line no-restricted-syntax\n    for (const challengePromises of allChallengePromises) {\n        i += 1;\n        log(`开始第${i}组`);\n        if (opts.signal && opts.signal.aborted) {\n            throw new CancelError(\"用户取消\");\n        }\n\n        const waitDnsDiffuseTime = opts.waitDnsDiffuseTime || 30;\n        try {\n            // eslint-disable-next-line no-await-in-loop\n            await runPromisePa(challengePromises);\n            if (opts.skipChallengeVerification === true) {\n                log(`跳过本地验证（skipChallengeVerification=true），等待 60s`);\n                await wait(60 * 1000);\n            } else {\n                log(\"开始本地校验\")\n                await runPromisePa(localVerifyTasks, 1000);\n                log(`本地校验完成，等待${waitDnsDiffuseTime}s`)\n                await wait(waitDnsDiffuseTime * 1000)\n            }\n\n            log(\"开始向提供商请求挑战验证\");\n            await runPromisePa(completeChallengeTasks, 1000);\n        } catch (e) {\n            log(`证书申请失败${e.message}`);\n            throw e;\n        } finally {\n            // letsencrypt 如果同时检出两个TXT记录，会以第一个为准，就会校验失败，所以需要提前删除\n            // zerossl 此方式测试无问题\n            log(`清理challenge痕迹，length:${clearTasks.length}`);\n            try {\n                // eslint-disable-next-line no-await-in-loop\n                await runAllPromise(clearTasks);\n            } catch (e) {\n                log(\"清理challenge失败\");\n                log(e);\n            }\n        }\n    }\n\n\n    log(\"challenge结束\");\n\n    // log('[auto] Waiting for challenge valid status');\n    // await Promise.all(challengePromises);\n    /**\n     * Finalize order and download certificate\n     */\n\n    log(\"[auto] Finalizing order and downloading certificate\");\n    const finalized = await client.finalizeOrder(order, opts.csr);\n    const res = await client.getCertificate(finalized, opts.preferredChain);\n    return res;\n    // try {\n    //     await Promise.allSettled(challengePromises);\n    // }\n    // finally {\n    //     log('清理challenge');\n    //     await Promise.allSettled(clearTasks);\n    // }\n};\n"
  },
  {
    "path": "packages/core/acme-client/src/axios.js",
    "content": "/**\n * Axios instance\n */\nimport axios from 'axios';\nimport { parseRetryAfterHeader } from './util.js';\nimport { log } from './logger.js';\nconst { AxiosError } = axios;\nimport {getGlobalAgents, HttpError} from '@certd/basic'\n/**\n * Defaults\n */\n\nconst instance = axios.create();\n\n/* Default User-Agent */\ninstance.defaults.headers.common['User-Agent'] = `@certd/acme-client`;\n\n/* Default ACME settings */\ninstance.defaults.acmeSettings = {\n    httpChallengePort: 80,\n    httpsChallengePort: 443,\n    tlsAlpnChallengePort: 443,\n\n    retryMaxAttempts: 3,\n    retryDefaultDelay: 3,\n};\n// instance.defaults.proxy = {\n//     host: '192.168.34.139',\n//     port: 10811\n// };\n/**\n * Explicitly set Node as default HTTP adapter\n *\n * https://github.com/axios/axios/issues/1180\n * https://stackoverflow.com/questions/42677387\n */\n\ninstance.defaults.adapter = 'http';\n\n/**\n * Retry requests on server errors or when rate limited\n *\n * https://datatracker.ietf.org/doc/html/rfc8555#section-6.6\n */\n\nfunction isRetryableError(error) {\n    return (error.code !== 'ECONNABORTED')\n        && (error.code !== 'ERR_NOCK_NO_MATCH')\n        && (!error.response\n            || (error.response.status === 429)\n            || ((error.response.status >= 500) && (error.response.status <= 599)));\n}\n\n/* https://github.com/axios/axios/blob/main/lib/core/settle.js */\nfunction validateStatus(response) {\n    if (!response) {\n        return new Error('Response is undefined');\n    }\n    let validator = null;\n    if (response.config) {\n        validator = response.config.retryValidateStatus;\n    }\n    if (!response.status || !validator || validator(response.status)) {\n        return response;\n    }\n\n    const err = new AxiosError(\n        `Request failed with status code ${response.status}`,\n        (Math.floor(response.status / 100) === 4) ? AxiosError.ERR_BAD_REQUEST : AxiosError.ERR_BAD_RESPONSE,\n        response.config,\n        response.request,\n        response,\n    );\n\n    throw new HttpError(err);\n}\n\n/* Pass all responses through the error interceptor */\ninstance.interceptors.request.use((config) => {\n    if (!('retryValidateStatus' in config)) {\n        config.retryValidateStatus = config.validateStatus;\n    }\n    config.validateStatus = () => false;\n\n    const agents = getGlobalAgents();\n    // if (config.skipSslVerify) {\n    //     logger.info('跳过SSL验证');\n    //     agents = createAgent({ rejectUnauthorized: false } as any);\n    // }\n    // delete config.skipSslVerify;\n    config.httpsAgent = agents.httpsAgent;\n    config.httpAgent = agents.httpAgent;\n    config.proxy = false; // 必须 否则还会走一层代理，\n    return config;\n});\n\n/* Handle request retries if applicable */\ninstance.interceptors.response.use(null, async (error) => {\n    const { config, response } = error;\n\n    if (!config) {\n        return Promise.reject(new HttpError(error));\n    }\n\n    /* Pick up errors we want to retry */\n    if (isRetryableError(error)) {\n        const { retryMaxAttempts, retryDefaultDelay } = instance.defaults.acmeSettings;\n        config.retryAttempt = ('retryAttempt' in config) ? (config.retryAttempt + 1) : 1;\n\n        if (config.retryAttempt <= retryMaxAttempts) {\n            const code = response ? `HTTP ${response.status}` : error.code;\n            log(`Caught ${code}, retry attempt ${config.retryAttempt}/${retryMaxAttempts} to URL ${config.url}`);\n\n            const retryAfter = (retryDefaultDelay * config.retryAttempt);\n            /* Attempt to parse Retry-After header, fallback to default delay */\n            const headerRetryAfter = response ? parseRetryAfterHeader(response.headers['retry-after']) : 0;\n\n            if (headerRetryAfter > 0) {\n                const waitMinutes = (headerRetryAfter / 60).toFixed(1);\n                log(`Found retry-after response header with value: ${response.headers['retry-after']}, waiting ${waitMinutes} minutes`);\n                log(JSON.stringify(response.data));\n                return Promise.reject(new HttpError(error));\n            }\n\n            log(`waiting ${retryAfter} seconds`);\n\n            /* Wait and retry the request */\n            await new Promise((resolve) => { setTimeout(resolve, (retryAfter * 1000)); });\n            log(`Retrying request to URL ${config.url}`);\n            return instance(config);\n        }\n    }\n\n    if (!response) {\n        return Promise.reject(new HttpError(error));\n    }\n    /* Validate and return response */\n    return validateStatus(response);\n});\n\n/**\n * Export instance\n */\n\nexport default instance;\n"
  },
  {
    "path": "packages/core/acme-client/src/client.js",
    "content": "/**\n * ACME client\n *\n * @namespace Client\n */\nimport { createHash } from 'crypto';\nimport  { getPemBodyAsB64u } from './crypto/index.js';\nimport { log } from './logger.js';\nimport HttpClient from './http.js';\nimport AcmeApi from './api.js';\nimport verify from './verify.js';\nimport * as util from './util.js';\nimport auto from './auto.js';\nimport { CancelError } from './error.js';\n\n\n\n/**\n * ACME states\n *\n * @private\n */\n\nconst validStates = ['ready', 'valid'];\nconst pendingStates = ['pending', 'processing'];\nconst invalidStates = ['invalid'];\n\n/**\n * Default options\n *\n * @private\n */\n\nconst defaultOpts = {\n    directoryUrl: undefined,\n    accountKey: undefined,\n    accountUrl: null,\n    externalAccountBinding: {},\n    backoffAttempts: 10,\n    backoffMin: 5000,\n    backoffMax: 30000,\n};\n\n/**\n * AcmeClient\n *\n * @class\n * @param {object} opts\n * @param {string} opts.directoryUrl ACME directory URL\n * @param {buffer|string} opts.accountKey PEM encoded account private key\n * @param {string} [opts.accountUrl] Account URL, default: `null`\n * @param {object} [opts.externalAccountBinding]\n * @param {string} [opts.externalAccountBinding.kid] External account binding KID\n * @param {string} [opts.externalAccountBinding.hmacKey] External account binding HMAC key\n * @param {number} [opts.backoffAttempts] Maximum number of backoff attempts, default: `10`\n * @param {number} [opts.backoffMin] Minimum backoff attempt delay in milliseconds, default: `5000`\n * @param {number} [opts.backoffMax] Maximum backoff attempt delay in milliseconds, default: `30000`\n *\n * @example Create ACME client instance\n * ```js\n * const client = new acme.Client({\n *     directoryUrl: acme.directory.letsencrypt.staging,\n *     accountKey: 'Private key goes here',\n * });\n * ```\n *\n * @example Create ACME client instance\n * ```js\n * const client = new acme.Client({\n *     directoryUrl: acme.directory.letsencrypt.staging,\n *     accountKey: 'Private key goes here',\n *     accountUrl: 'Optional account URL goes here',\n *     backoffAttempts: 10,\n *     backoffMin: 5000,\n *     backoffMax: 30000,\n * });\n * ```\n *\n * @example Create ACME client with external account binding\n * ```js\n * const client = new acme.Client({\n *     directoryUrl: 'https://acme-provider.example.com/directory-url',\n *     accountKey: 'Private key goes here',\n *     externalAccountBinding: {\n *         kid: 'YOUR-EAB-KID',\n *         hmacKey: 'YOUR-EAB-HMAC-KEY',\n *     },\n * });\n * ```\n */\n\nclass AcmeClient {\n    sslProvider\n    constructor(opts) {\n        if (!Buffer.isBuffer(opts.accountKey)) {\n            opts.accountKey = Buffer.from(opts.accountKey);\n        }\n        this.sslProvider = opts.sslProvider;\n\n        this.opts = { ...defaultOpts, ...opts };\n        this.backoffOpts = {\n            attempts: this.opts.backoffAttempts,\n            min: this.opts.backoffMin,\n            max: this.opts.backoffMax,\n        };\n\n        this.http = new HttpClient(this.opts.directoryUrl, this.opts.accountKey, this.opts.externalAccountBinding, this.opts.urlMapping);\n        this.api = new AcmeApi(this.http, this.opts.accountUrl);\n    }\n\n    /**\n     * Get Terms of Service URL if available\n     *\n     * @returns {Promise<string|null>} ToS URL\n     *\n     * @example Get Terms of Service URL\n     * ```js\n     * const termsOfService = client.getTermsOfServiceUrl();\n     *\n     * if (!termsOfService) {\n     *     // CA did not provide Terms of Service\n     * }\n     * ```\n     */\n\n    getTermsOfServiceUrl() {\n        return this.api.getTermsOfServiceUrl();\n    }\n\n    /**\n     * Get current account URL\n     *\n     * @returns {string} Account URL\n     * @throws {Error} No account URL found\n     *\n     * @example Get current account URL\n     * ```js\n     * try {\n     *     const accountUrl = client.getAccountUrl();\n     * }\n     * catch (e) {\n     *     // No account URL exists, need to create account first\n     * }\n     * ```\n     */\n\n    getAccountUrl() {\n        return this.api.getAccountUrl();\n    }\n\n    /**\n     * Create a new account\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.3\n     *\n     * @param {object} [data] Request data\n     * @returns {Promise<object>} Account\n     *\n     * @example Create a new account\n     * ```js\n     * const account = await client.createAccount({\n     *     termsOfServiceAgreed: true,\n     * });\n     * ```\n     *\n     * @example Create a new account with contact info\n     * ```js\n     * const account = await client.createAccount({\n     *     termsOfServiceAgreed: true,\n     *     contact: ['mailto:test@example.com'],\n     * });\n     * ```\n     */\n\n    async createAccount(data = {}) {\n        try {\n            this.getAccountUrl();\n\n            /* Account URL exists */\n            log('Account URL exists, returning updateAccount()');\n            return this.updateAccount(data);\n        }\n        catch (e) {\n            const resp = await this.api.createAccount(data);\n\n            /* HTTP 200: Account exists */\n            if (resp.status === 200) {\n                log('Account already exists (HTTP 200), returning updateAccount()');\n                return this.updateAccount(data);\n            }\n\n            return resp.data;\n        }\n    }\n\n    /**\n     * Update existing account\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.3.2\n     *\n     * @param {object} [data] Request data\n     * @returns {Promise<object>} Account\n     *\n     * @example Update existing account\n     * ```js\n     * const account = await client.updateAccount({\n     *     contact: ['mailto:foo@example.com'],\n     * });\n     * ```\n     */\n\n    async updateAccount(data = {}) {\n        try {\n            this.api.getAccountUrl();\n        }\n        catch (e) {\n            log('No account URL found, returning createAccount()');\n            return this.createAccount(data);\n        }\n\n        /* Remove data only applicable to createAccount() */\n        if ('onlyReturnExisting' in data) {\n            delete data.onlyReturnExisting;\n        }\n\n        /* POST-as-GET */\n        if (Object.keys(data).length === 0) {\n            data = null;\n        }\n\n        const resp = await this.api.updateAccount(data);\n        return resp.data;\n    }\n\n    /**\n     * Update account private key\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.3.5\n     *\n     * @param {buffer|string} newAccountKey New PEM encoded private key\n     * @param {object} [data] Additional request data\n     * @returns {Promise<object>} Account\n     *\n     * @example Update account private key\n     * ```js\n     * const newAccountKey = 'New private key goes here';\n     * const result = await client.updateAccountKey(newAccountKey);\n     * ```\n     */\n\n    async updateAccountKey(newAccountKey, data = {}) {\n        if (!Buffer.isBuffer(newAccountKey)) {\n            newAccountKey = Buffer.from(newAccountKey);\n        }\n\n        const accountUrl = this.api.getAccountUrl();\n\n        /* Create new HTTP and API clients using new key */\n        const newHttpClient = new HttpClient(this.opts.directoryUrl, newAccountKey, this.opts.externalAccountBinding);\n        const newApiClient = new AcmeApi(newHttpClient, accountUrl);\n\n        /* Get old JWK */\n        data.account = accountUrl;\n        data.oldKey = this.http.getJwk();\n\n        /* Get signed request body from new client */\n        const url = await newHttpClient.getResourceUrl('keyChange');\n        const body = newHttpClient.createSignedBody(url, data);\n\n        /* Change key using old client */\n        const resp = await this.api.updateAccountKey(body);\n\n        /* Replace existing HTTP and API client */\n        this.http = newHttpClient;\n        this.api = newApiClient;\n\n        return resp.data;\n    }\n\n    /**\n     * Create a new order\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.4\n     *\n     * @param {object} data Request data\n     * @returns {Promise<object>} Order\n     *\n     * @example Create a new order\n     * ```js\n     * const order = await client.createOrder({\n     *     identifiers: [\n     *         { type: 'dns', value: 'example.com' },\n     *         { type: 'dns', value: 'test.example.com' },\n     *     ],\n     * });\n     * ```\n     */\n\n    async createOrder(data) {\n        const resp = await this.api.createOrder(data);\n\n        if (!resp.headers.location) {\n            throw new Error('Creating a new order did not return an order link');\n        }\n\n        /* Add URL to response */\n        resp.data.url = this.api.getLocationFromHeader(resp);\n\n        return resp.data;\n    }\n\n    /**\n     * Refresh order object from CA\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.4\n     *\n     * @param {object} order Order object\n     * @returns {Promise<object>} Order\n     *\n     * @example\n     * ```js\n     * const order = { ... }; // Previously created order object\n     * const result = await client.getOrder(order);\n     * ```\n     */\n\n    async getOrder(order) {\n        if (!order.url) {\n            throw new Error('Unable to get order, URL not found');\n        }\n\n        const resp = await this.api.getOrder(order.url);\n\n        /* Add URL to response */\n        resp.data.url = order.url;\n        return resp.data;\n    }\n\n    /**\n     * Finalize order\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.4\n     *\n     * @param {object} order Order object\n     * @param {buffer|string} csr PEM encoded Certificate Signing Request\n     * @returns {Promise<object>} Order\n     *\n     * @example Finalize order\n     * ```js\n     * const order = { ... }; // Previously created order object\n     * const csr = { ... }; // Previously created Certificate Signing Request\n     * const result = await client.finalizeOrder(order, csr);\n     * ```\n     */\n\n    async finalizeOrder(order, csr) {\n        if (!order.finalize) {\n            throw new Error('Unable to finalize order, URL not found');\n        }\n\n        if (!Buffer.isBuffer(csr)) {\n            csr = Buffer.from(csr);\n        }\n\n        const data = { csr: getPemBodyAsB64u(csr) };\n        const resp = await this.api.finalizeOrder(order.finalize, data);\n\n        /* Add URL to response */\n        resp.data.url = order.url;\n        return resp.data;\n    }\n\n    /**\n     * Get identifier authorizations from order\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.5\n     *\n     * @param {object} order Order\n     * @returns {Promise<object[]>} Authorizations\n     *\n     * @example Get identifier authorizations\n     * ```js\n     * const order = { ... }; // Previously created order object\n     * const authorizations = await client.getAuthorizations(order);\n     *\n     * authorizations.forEach((authz) => {\n     *     const { challenges } = authz;\n     * });\n     * ```\n     */\n\n    async getAuthorizations(order) {\n        return Promise.all((order.authorizations || []).map(async (url) => {\n            const resp = await this.api.getAuthorization(url);\n\n            /* Add URL to response */\n            resp.data.url = url;\n            return resp.data;\n        }));\n    }\n\n    /**\n     * Deactivate identifier authorization\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.5.2\n     *\n     * @param {object} authz Identifier authorization\n     * @returns {Promise<object>} Authorization\n     *\n     * @example Deactivate identifier authorization\n     * ```js\n     * const authz = { ... }; // Identifier authorization resolved from previously created order\n     * const result = await client.deactivateAuthorization(authz);\n     * ```\n     */\n\n    async deactivateAuthorization(authz) {\n        if (!authz.url) {\n            throw new Error('Unable to deactivate identifier authorization, URL not found');\n        }\n\n        const data = { status: 'deactivated' };\n        const resp = await this.api.updateAuthorization(authz.url, data);\n\n        /* Add URL to response */\n        resp.data.url = authz.url;\n        return resp.data;\n    }\n\n    /**\n     * Get key authorization for ACME challenge\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-8.1\n     *\n     * @param {object} challenge Challenge object returned by API\n     * @returns {Promise<string>} Key authorization\n     *\n     * @example Get challenge key authorization\n     * ```js\n     * const challenge = { ... }; // Challenge from previously resolved identifier authorization\n     * const key = await client.getChallengeKeyAuthorization(challenge);\n     *\n     * // Write key somewhere to satisfy challenge\n     * ```\n     */\n\n    async getChallengeKeyAuthorization(challenge) {\n        const jwk = this.http.getJwk();\n        const keysum = createHash('sha256').update(JSON.stringify(jwk));\n        const thumbprint = keysum.digest('base64url');\n        const result = `${challenge.token}.${thumbprint}`;\n\n        /* https://datatracker.ietf.org/doc/html/rfc8555#section-8.3 */\n        if (challenge.type === 'http-01') {\n            return result;\n        }\n\n        /* https://datatracker.ietf.org/doc/html/rfc8555#section-8.4 */\n        if (challenge.type === 'dns-01') {\n            return createHash('sha256').update(result).digest('base64url');\n        }\n\n        /* https://datatracker.ietf.org/doc/html/rfc8737 */\n        if (challenge.type === 'tls-alpn-01') {\n            return result;\n        }\n\n        throw new Error(`Unable to produce key authorization, unknown challenge type: ${challenge.type}`);\n    }\n\n    /**\n     * Verify that ACME challenge is satisfied\n     *\n     * @param {object} authz Identifier authorization\n     * @param {object} challenge Authorization challenge\n     * @returns {Promise}\n     *\n     * @example Verify satisfied ACME challenge\n     * ```js\n     * const authz = { ... }; // Identifier authorization\n     * const challenge = { ... }; // Satisfied challenge\n     * await client.verifyChallenge(authz, challenge);\n     * ```\n     */\n\n    async verifyChallenge(authz, challenge) {\n        if (!authz.url || !challenge.url) {\n            throw new Error('Unable to verify ACME challenge, URL not found');\n        }\n\n        if (typeof verify[challenge.type] === 'undefined') {\n            throw new Error(`Unable to verify ACME challenge, unknown type: ${challenge.type}`);\n        }\n\n        const keyAuthorization = await this.getChallengeKeyAuthorization(challenge);\n\n        const verifyFn = async (abort) => {\n            if (this.opts.signal && this.opts.signal.aborted) {\n                abort();\n                throw new CancelError('用户取消');\n            }\n            await verify[challenge.type](authz, challenge, keyAuthorization);\n        };\n\n        log('Waiting for ACME challenge verification（等待ACME挑战验证）', this.backoffOpts);\n        return util.retry(verifyFn, this.backoffOpts);\n    }\n\n    /**\n     * Notify CA that challenge has been completed\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.5.1\n     *\n     * @param {object} challenge Challenge object returned by API\n     * @returns {Promise<object>} Challenge\n     *\n     * @example Notify CA that challenge has been completed\n     * ```js\n     * const challenge = { ... }; // Satisfied challenge\n     * const result = await client.completeChallenge(challenge);\n     * ```\n     */\n\n    async completeChallenge(challenge) {\n        if (this.opts.signal && this.opts.signal.aborted) {\n            throw new CancelError('用户取消');\n        }\n        const resp = await this.api.completeChallenge(challenge.url, {});\n        return resp.data;\n    }\n\n    /**\n     * Wait for ACME provider to verify status on a order, authorization or challenge\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.5.1\n     *\n     * @param {object} item An order, authorization or challenge object\n     * @returns {Promise<object>} Valid order, authorization or challenge\n     *\n     * @example Wait for valid challenge status\n     * ```js\n     * const challenge = { ... };\n     * await client.waitForValidStatus(challenge);\n     * ```\n     *\n     * @example Wait for valid authorization status\n     * ```js\n     * const authz = { ... };\n     * await client.waitForValidStatus(authz);\n     * ```\n     *\n     * @example Wait for valid order status\n     * ```js\n     * const order = { ... };\n     * await client.waitForValidStatus(order);\n     * ```\n     */\n\n    async waitForValidStatus(item,d) {\n        if (!item.url) {\n            throw new Error(`[${d}] Unable to verify status of item, URL not found`);\n        }\n\n        const verifyFn = async (abort) => {\n            if (this.opts.signal && this.opts.signal.aborted) {\n                abort();\n                throw new CancelError('用户取消');\n            }\n\n            const resp = await this.api.apiRequest(item.url, null, [200]);\n\n            /* Verify status */\n            log(`[${d}] Item has status（挑战状态）: ${resp.data.status}`);\n\n            if (invalidStates.includes(resp.data.status)) {\n                abort();\n                throw new Error(util.formatResponseError(resp));\n            }\n            else if (pendingStates.includes(resp.data.status)) {\n                throw new Error(`[${d}] Operation is pending or processing（当前仍然在等待状态）`);\n            }\n            else if (validStates.includes(resp.data.status)) {\n                return resp.data;\n            }\n\n            throw new Error(`[${d}] Unexpected item status: ${resp.data.status}`);\n        };\n\n        log(`[${d}] Waiting for valid status （等待valid状态）: ${item.url}`, this.backoffOpts);\n        return util.retry(verifyFn, this.backoffOpts);\n    }\n\n    /**\n     * Get certificate from ACME order\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.4.2\n     *\n     * @param {object} order Order object\n     * @param {string} [preferredChain] Indicate which certificate chain is preferred if a CA offers multiple, by exact issuer common name, default: `null`\n     * @returns {Promise<string>} Certificate\n     *\n     * @example Get certificate\n     * ```js\n     * const order = { ... }; // Previously created order\n     * const certificate = await client.getCertificate(order);\n     * ```\n     *\n     * @example Get certificate with preferred chain\n     * ```js\n     * const order = { ... }; // Previously created order\n     * const certificate = await client.getCertificate(order, 'DST Root CA X3');\n     * ```\n     */\n\n    async getCertificate(order, preferredChain = null) {\n        if (!validStates.includes(order.status)) {\n            order = await this.waitForValidStatus(order);\n        }\n\n        if (!order.certificate) {\n            throw new Error('Unable to download certificate, URL not found');\n        }\n\n        const resp = await this.api.apiRequest(order.certificate, null, [200]);\n\n        /* Handle alternate certificate chains */\n        if (preferredChain && resp.headers.link) {\n            const alternateLinks = util.parseLinkHeader(resp.headers.link);\n            const alternates = await Promise.all(alternateLinks.map(async (link) => this.api.apiRequest(link, null, [200])));\n            const certificates = [resp].concat(alternates).map((c) => c.data);\n\n            return util.findCertificateChainForIssuer(certificates, preferredChain);\n        }\n\n        /* Return default certificate chain */\n        return resp.data;\n    }\n\n    /**\n     * Revoke certificate\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.6\n     *\n     * @param {buffer|string} cert PEM encoded certificate\n     * @param {object} [data] Additional request data\n     * @returns {Promise}\n     *\n     * @example Revoke certificate\n     * ```js\n     * const certificate = { ... }; // Previously created certificate\n     * const result = await client.revokeCertificate(certificate);\n     * ```\n     *\n     * @example Revoke certificate with reason\n     * ```js\n     * const certificate = { ... }; // Previously created certificate\n     * const result = await client.revokeCertificate(certificate, {\n     *     reason: 4,\n     * });\n     * ```\n     */\n\n    async revokeCertificate(cert, data = {}) {\n        data.certificate = getPemBodyAsB64u(cert);\n        const resp = await this.api.revokeCert(data);\n        return resp.data;\n    }\n\n    /**\n     * Auto mode\n     *\n     * @param {object} opts\n     * @param {buffer|string} opts.csr Certificate Signing Request\n     * @param {function} opts.challengeCreateFn Function returning Promise triggered before completing ACME challenge\n     * @param {function} opts.challengeRemoveFn Function returning Promise triggered after completing ACME challenge\n     * @param {string} [opts.email] Account email address\n     * @param {boolean} [opts.termsOfServiceAgreed] Agree to Terms of Service, default: `false`\n     * @param {boolean} [opts.skipChallengeVerification] Skip internal challenge verification before notifying ACME provider, default: `false`\n     * @param {string[]} [opts.challengePriority] Array defining challenge type priority, default: `['http-01', 'dns-01']`\n     * @param {string} [opts.preferredChain] Indicate which certificate chain is preferred if a CA offers multiple, by exact issuer common name, default: `null`\n     * @returns {Promise<string>} Certificate\n     *\n     * @example Order a certificate using auto mode\n     * ```js\n     * const [certificateKey, certificateRequest] = await acme.crypto.createCsr({\n     *     altNames: ['test.example.com'],\n     * });\n     *\n     * const certificate = await client.auto({\n     *     csr: certificateRequest,\n     *     email: 'test@example.com',\n     *     termsOfServiceAgreed: true,\n     *     challengeCreateFn: async (authz, challenge, keyAuthorization) => {\n     *         // Satisfy challenge here\n     *     },\n     *     challengeRemoveFn: async (authz, challenge, keyAuthorization) => {\n     *         // Clean up challenge here\n     *     },\n     * });\n     * ```\n     *\n     * @example Order a certificate using auto mode with preferred chain\n     * ```js\n     * const [certificateKey, certificateRequest] = await acme.crypto.createCsr({\n     *     altNames: ['test.example.com'],\n     * });\n     *\n     * const certificate = await client.auto({\n     *     csr: certificateRequest,\n     *     email: 'test@example.com',\n     *     termsOfServiceAgreed: true,\n     *     preferredChain: 'DST Root CA X3',\n     *     challengeCreateFn: async () => {},\n     *     challengeRemoveFn: async () => {},\n     * });\n     * ```\n     */\n\n    auto(opts) {\n        return auto(this, opts);\n    }\n}\n\n/* Export client */\nexport default  AcmeClient;\n"
  },
  {
    "path": "packages/core/acme-client/src/crypto/forge.js",
    "content": "/**\n * Legacy node-forge crypto interface\n *\n * DEPRECATION WARNING: This crypto interface is deprecated and will be removed from acme-client in a future\n * major release. Please migrate to the new `acme.crypto` interface at your earliest convenience.\n *\n * @namespace forge\n */\nimport net from 'net';\nimport { promisify } from 'util';\nimport forge from 'node-forge';\nimport { createPrivateEcdsaKey } from './index.js';\n\nconst generateKeyPair = promisify(forge.pki.rsa.generateKeyPair);\n\n/**\n * Attempt to parse forge object from PEM encoded string\n *\n * @private\n * @param {string} input PEM string\n * @return {object}\n */\n\nfunction forgeObjectFromPem(input) {\n    const msg = forge.pem.decode(input)[0];\n    let result;\n\n    switch (msg.type) {\n        case 'PRIVATE KEY':\n        case 'RSA PRIVATE KEY':\n            result = forge.pki.privateKeyFromPem(input);\n            break;\n\n        case 'PUBLIC KEY':\n        case 'RSA PUBLIC KEY':\n            result = forge.pki.publicKeyFromPem(input);\n            break;\n\n        case 'CERTIFICATE':\n        case 'X509 CERTIFICATE':\n        case 'TRUSTED CERTIFICATE':\n            result = forge.pki.certificateFromPem(input).publicKey;\n            break;\n\n        case 'CERTIFICATE REQUEST':\n            result = forge.pki.certificationRequestFromPem(input).publicKey;\n            break;\n\n        default:\n            throw new Error('Unable to detect forge message type');\n    }\n\n    return result;\n}\n\n/**\n * Parse domain names from a certificate or CSR\n *\n * @private\n * @param {object} obj Forge certificate or CSR\n * @returns {object} {commonName, altNames}\n */\n\nfunction parseDomains(obj) {\n    let commonName = null;\n    let altNames = [];\n    let altNamesDict = [];\n\n    const commonNameObject = (obj.subject.attributes || []).find((a) => a.name === 'commonName');\n    const rootAltNames = (obj.extensions || []).find((e) => 'altNames' in e);\n    const rootExtensions = (obj.attributes || []).find((a) => 'extensions' in a);\n\n    if (rootAltNames && rootAltNames.altNames && rootAltNames.altNames.length) {\n        altNamesDict = rootAltNames.altNames;\n    }\n    else if (rootExtensions && rootExtensions.extensions && rootExtensions.extensions.length) {\n        const extAltNames = rootExtensions.extensions.find((e) => 'altNames' in e);\n\n        if (extAltNames && extAltNames.altNames && extAltNames.altNames.length) {\n            altNamesDict = extAltNames.altNames;\n        }\n    }\n\n    if (commonNameObject) {\n        commonName = commonNameObject.value;\n    }\n\n    if (altNamesDict) {\n        altNames = altNamesDict.map((a) => a.value);\n    }\n\n    return {\n        commonName,\n        altNames,\n    };\n}\n\n/**\n * Generate a private RSA key\n *\n * @param {number} [size] Size of the key, default: `2048`\n * @returns {Promise<buffer>} PEM encoded private RSA key\n *\n * @example Generate private RSA key\n * ```js\n * const privateKey = await acme.forge.createPrivateKey();\n * ```\n *\n * @example Private RSA key with defined size\n * ```js\n * const privateKey = await acme.forge.createPrivateKey(4096);\n * ```\n */\n\nexport async function createPrivateKey(size = 2048) {\n    const keyPair = await generateKeyPair({ bits: size });\n    const pemKey = forge.pki.privateKeyToPem(keyPair.privateKey);\n    return Buffer.from(pemKey);\n}\n\n\n/**\n * Create public key from a private RSA key\n *\n * @param {buffer|string} key PEM encoded private RSA key\n * @returns {Promise<buffer>} PEM encoded public RSA key\n *\n * @example Create public key\n * ```js\n * const publicKey = await acme.forge.createPublicKey(privateKey);\n * ```\n */\n\nexport const createPublicKey = async (key) => {\n    const privateKey = forge.pki.privateKeyFromPem(key);\n    const publicKey = forge.pki.rsa.setPublicKey(privateKey.n, privateKey.e);\n    const pemKey = forge.pki.publicKeyToPem(publicKey);\n    return Buffer.from(pemKey);\n};\n\n/**\n * Parse body of PEM encoded object from buffer or string\n * If multiple objects are chained, the first body will be returned\n *\n * @param {buffer|string} str PEM encoded buffer or string\n * @returns {string} PEM body\n */\n\nexport const getPemBody = (str) => {\n    const msg = forge.pem.decode(str)[0];\n    return forge.util.encode64(msg.body);\n};\n\n/**\n * Split chain of PEM encoded objects from buffer or string into array\n *\n * @param {buffer|string} str PEM encoded buffer or string\n * @returns {string[]} Array of PEM bodies\n */\n\nexport const splitPemChain = (str) => forge.pem.decode(str).map(forge.pem.encode);\n\n/**\n * Get modulus\n *\n * @param {buffer|string} input PEM encoded private key, certificate or CSR\n * @returns {Promise<buffer>} Modulus\n *\n * @example Get modulus\n * ```js\n * const m1 = await acme.forge.getModulus(privateKey);\n * const m2 = await acme.forge.getModulus(certificate);\n * const m3 = await acme.forge.getModulus(certificateRequest);\n * ```\n */\n\nexport const getModulus = async (input) => {\n    if (!Buffer.isBuffer(input)) {\n        input = Buffer.from(input);\n    }\n\n    const obj = forgeObjectFromPem(input);\n    return Buffer.from(forge.util.hexToBytes(obj.n.toString(16)), 'binary');\n};\n\n/**\n * Get public exponent\n *\n * @param {buffer|string} input PEM encoded private key, certificate or CSR\n * @returns {Promise<buffer>} Exponent\n *\n * @example Get public exponent\n * ```js\n * const e1 = await acme.forge.getPublicExponent(privateKey);\n * const e2 = await acme.forge.getPublicExponent(certificate);\n * const e3 = await acme.forge.getPublicExponent(certificateRequest);\n * ```\n */\n\nexport const getPublicExponent = async (input) => {\n    if (!Buffer.isBuffer(input)) {\n        input = Buffer.from(input);\n    }\n\n    const obj = forgeObjectFromPem(input);\n    return Buffer.from(forge.util.hexToBytes(obj.e.toString(16)), 'binary');\n};\n\n/**\n * Read domains from a Certificate Signing Request\n *\n * @param {buffer|string} csr PEM encoded Certificate Signing Request\n * @returns {Promise<object>} {commonName, altNames}\n *\n * @example Read Certificate Signing Request domains\n * ```js\n * const { commonName, altNames } = await acme.forge.readCsrDomains(certificateRequest);\n *\n * console.log(`Common name: ${commonName}`);\n * console.log(`Alt names: ${altNames.join(', ')}`);\n * ```\n */\n\nexport const readCsrDomains = async (csr) => {\n    if (!Buffer.isBuffer(csr)) {\n        csr = Buffer.from(csr);\n    }\n\n    const obj = forge.pki.certificationRequestFromPem(csr);\n    return parseDomains(obj);\n};\n\n/**\n * Read information from a certificate\n *\n * @param {buffer|string} cert PEM encoded certificate\n * @returns {Promise<object>} Certificate info\n *\n * @example Read certificate information\n * ```js\n * const info = await acme.forge.readCertificateInfo(certificate);\n * const { commonName, altNames } = info.domains;\n *\n * console.log(`Not after: ${info.notAfter}`);\n * console.log(`Not before: ${info.notBefore}`);\n *\n * console.log(`Common name: ${commonName}`);\n * console.log(`Alt names: ${altNames.join(', ')}`);\n * ```\n */\n\nexport const readCertificateInfo = async (cert) => {\n    if (!Buffer.isBuffer(cert)) {\n        cert = Buffer.from(cert);\n    }\n\n    const obj = forge.pki.certificateFromPem(cert);\n    const issuerCn = (obj.issuer.attributes || []).find((a) => a.name === 'commonName');\n\n    return {\n        issuer: {\n            commonName: issuerCn ? issuerCn.value : null,\n        },\n        domains: parseDomains(obj),\n        notAfter: obj.validity.notAfter,\n        notBefore: obj.validity.notBefore,\n    };\n};\n\n/**\n * Determine ASN.1 type for CSR subject short name\n * Note: https://datatracker.ietf.org/doc/html/rfc5280\n *\n * @private\n * @param {string} shortName CSR subject short name\n * @returns {forge.asn1.Type} ASN.1 type\n */\n\nfunction getCsrValueTagClass(shortName) {\n    switch (shortName) {\n        case 'C':\n            return forge.asn1.Type.PRINTABLESTRING;\n        case 'E':\n            return forge.asn1.Type.IA5STRING;\n        default:\n            return forge.asn1.Type.UTF8;\n    }\n}\n\n/**\n * Create array of short names and values for Certificate Signing Request subjects\n *\n * @private\n * @param {object} subjectObj Key-value of short names and values\n * @returns {object[]} Certificate Signing Request subject array\n */\n\nfunction createCsrSubject(subjectObj) {\n    return Object.entries(subjectObj).reduce((result, [shortName, value]) => {\n        if (value) {\n            const valueTagClass = getCsrValueTagClass(shortName);\n            result.push({ shortName, value, valueTagClass });\n        }\n\n        return result;\n    }, []);\n}\n\n/**\n * Create array of alt names for Certificate Signing Requests\n * Note: https://github.com/digitalbazaar/forge/blob/dfdde475677a8a25c851e33e8f81dca60d90cfb9/lib/x509.js#L1444-L1454\n *\n * @private\n * @param {string[]} altNames Alt names\n * @returns {object[]} Certificate Signing Request alt names array\n */\n\nfunction formatCsrAltNames(altNames) {\n    return altNames.map((value) => {\n        const type = net.isIP(value) ? 7 : 2;\n        return { type, value };\n    });\n}\n\n/**\n * Create a Certificate Signing Request\n *\n * @param {object} data\n * @param {number} [data.keySize] Size of newly created private key, default: `2048`\n * @param {string} [data.commonName]\n * @param {string[]} [data.altNames] default: `[]`\n * @param {string} [data.country]\n * @param {string} [data.state]\n * @param {string} [data.locality]\n * @param {string} [data.organization]\n * @param {string} [data.organizationUnit]\n * @param {string} [data.emailAddress]\n * @param {buffer|string} [key] CSR private key\n * @returns {Promise<buffer[]>} [privateKey, certificateSigningRequest]\n *\n * @example Create a Certificate Signing Request\n * ```js\n * const [certificateKey, certificateRequest] = await acme.forge.createCsr({\n *     altNames: ['test.example.com'],\n * });\n * ```\n *\n * @example Certificate Signing Request with both common and alternative names\n * > *Warning*: Certificate subject common name has been [deprecated](https://letsencrypt.org/docs/glossary/#def-CN) and its use is [discouraged](https://cabforum.org/uploads/BRv1.2.3.pdf).\n * ```js\n * const [certificateKey, certificateRequest] = await acme.forge.createCsr({\n *     keySize: 4096,\n *     commonName: 'test.example.com',\n *     altNames: ['foo.example.com', 'bar.example.com'],\n * });\n * ```\n *\n * @example Certificate Signing Request with additional information\n * ```js\n * const [certificateKey, certificateRequest] = await acme.forge.createCsr({\n *     altNames: ['test.example.com'],\n *     country: 'US',\n *     state: 'California',\n *     locality: 'Los Angeles',\n *     organization: 'The Company Inc.',\n *     organizationUnit: 'IT Department',\n *     emailAddress: 'contact@example.com',\n * });\n * ```\n *\n * @example Certificate Signing Request with predefined private key\n * ```js\n * const certificateKey = await acme.forge.createPrivateKey();\n *\n * const [, certificateRequest] = await acme.forge.createCsr({\n *     altNames: ['test.example.com'],\n * }, certificateKey);\n */\n\nexport const createCsr = async (data, keyType = null) => {\n    let key = null;\n    if (keyType === 'ec') {\n        key = await createPrivateEcdsaKey();\n    }\n    else {\n        key = await createPrivateKey(data.keySize);\n    }\n    // else if (!Buffer.isBuffer(key)) {\n    //     key = Buffer.from(key);\n    // }\n\n    if (typeof data.altNames === 'undefined') {\n        data.altNames = [];\n    }\n\n    const csr = forge.pki.createCertificationRequest();\n\n    /* Public key */\n    const privateKey = forge.pki.privateKeyFromPem(key);\n    const publicKey = forge.pki.rsa.setPublicKey(privateKey.n, privateKey.e);\n    csr.publicKey = publicKey;\n    // const privateKey = key;\n    // csr.publicKey = getPublicKey(key);\n\n    /* Ensure subject common name is present in SAN - https://cabforum.org/wp-content/uploads/BRv1.2.3.pdf */\n    if (data.commonName && !data.altNames.includes(data.commonName)) {\n        data.altNames.unshift(data.commonName);\n    }\n\n    /* Subject */\n    const subject = createCsrSubject({\n        CN: data.commonName,\n        C: data.country,\n        ST: data.state,\n        L: data.locality,\n        O: data.organization,\n        OU: data.organizationUnit,\n        E: data.emailAddress,\n    });\n\n    csr.setSubject(subject);\n\n    /* SAN extension */\n    if (data.altNames.length) {\n        csr.setAttributes([{\n            name: 'extensionRequest',\n            extensions: [{\n                name: 'subjectAltName',\n                altNames: formatCsrAltNames(data.altNames),\n            }],\n        }]);\n    }\n\n    /* Sign CSR using SHA-256 */\n    csr.sign(privateKey, forge.md.sha256.create());\n\n    /* Done */\n    const pemCsr = forge.pki.certificationRequestToPem(csr);\n    return [key, Buffer.from(pemCsr)];\n};\n"
  },
  {
    "path": "packages/core/acme-client/src/crypto/index.js",
    "content": "/**\n * Native Node.js crypto interface\n *\n * @namespace crypto\n */\nimport  net from 'net';\nimport { promisify } from 'util';\nimport crypto from 'crypto';\nimport asn1js from 'asn1js';\nimport x509 from '@peculiar/x509';\n\n\nconst randomInt = promisify(crypto.randomInt);\nconst generateKeyPair = promisify(crypto.generateKeyPair);\n\n/* Use Node.js Web Crypto API */\nx509.cryptoProvider.set(crypto.webcrypto);\n\n/* id-ce-subjectAltName - https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.6 */\nconst subjectAltNameOID = '2.5.29.17';\n\n/* id-pe-acmeIdentifier - https://datatracker.ietf.org/doc/html/rfc8737#section-6.1 */\nconst alpnAcmeIdentifierOID = '1.3.6.1.5.5.7.1.31';\n\n/**\n * Determine key type and info by attempting to derive public key\n *\n * @private\n * @param {buffer|string} keyPem PEM encoded private or public key\n * @returns {object}\n */\n\nfunction getKeyInfo(keyPem) {\n    const result = {\n        isRSA: false,\n        isECDSA: false,\n        publicKey: crypto.createPublicKey(keyPem),\n    };\n\n    if (result.publicKey.asymmetricKeyType === 'rsa') {\n        result.isRSA = true;\n    }\n    else if (result.publicKey.asymmetricKeyType === 'ec') {\n        result.isECDSA = true;\n    }\n    else {\n        throw new Error('Unable to parse key information, unknown format');\n    }\n\n    return result;\n}\n\n/**\n * Generate a private RSA key\n *\n * @param {number} [modulusLength] Size of the keys modulus in bits, default: `2048`\n * @returns {Promise<buffer>} PEM encoded private RSA key\n *\n * @example Generate private RSA key\n * ```js\n * const privateKey = await acme.crypto.createPrivateRsaKey();\n * ```\n *\n * @example Private RSA key with modulus size 4096\n * ```js\n * const privateKey = await acme.crypto.createPrivateRsaKey(4096);\n * ```\n */\n\nexport async function createPrivateRsaKey(modulusLength = 2048, encodingType = 'pkcs8') {\n    const pair = await generateKeyPair('rsa', {\n        modulusLength,\n        privateKeyEncoding: {\n            type: encodingType,\n            format: 'pem',\n        },\n    });\n\n    return Buffer.from(pair.privateKey);\n}\n\n\n/**\n * Alias of `createPrivateRsaKey()`\n *\n * @function\n */\n\nexport const createPrivateKey = createPrivateRsaKey;\n\n/**\n * Generate a private ECDSA key\n *\n * @param {string} [namedCurve] ECDSA curve name (P-256, P-384 or P-521), default `P-256`\n * @returns {Promise<buffer>} PEM encoded private ECDSA key\n *\n * @example Generate private ECDSA key\n * ```js\n * const privateKey = await acme.crypto.createPrivateEcdsaKey();\n * ```\n *\n * @example Private ECDSA key using P-384 curve\n * ```js\n * const privateKey = await acme.crypto.createPrivateEcdsaKey('P-384');\n * ```\n */\n\nexport const createPrivateEcdsaKey = async (namedCurve = 'P-256', encodingType = 'pkcs8') => {\n    const pair = await generateKeyPair('ec', {\n        namedCurve,\n        privateKeyEncoding: {\n            type: encodingType,\n            format: 'pem',\n        },\n    });\n\n    return Buffer.from(pair.privateKey);\n};\n\n/**\n * Get a public key derived from a RSA or ECDSA key\n *\n * @param {buffer|string} keyPem PEM encoded private or public key\n * @returns {buffer} PEM encoded public key\n *\n * @example Get public key\n * ```js\n * const publicKey = acme.crypto.getPublicKey(privateKey);\n * ```\n */\n\nexport const getPublicKey = (keyPem) => {\n    const info = getKeyInfo(keyPem);\n\n    const publicKey = info.publicKey.export({\n        type: info.isECDSA ? 'spki' : 'pkcs1',\n        format: 'pem',\n    });\n\n    return Buffer.from(publicKey);\n};\n\n/**\n * Get a JSON Web Key derived from a RSA or ECDSA key\n *\n * https://datatracker.ietf.org/doc/html/rfc7517\n *\n * @param {buffer|string} keyPem PEM encoded private or public key\n * @returns {object} JSON Web Key\n *\n * @example Get JWK\n * ```js\n * const jwk = acme.crypto.getJwk(privateKey);\n * ```\n */\n\nexport function getJwk(keyPem) {\n    const jwk = crypto.createPublicKey(keyPem).export({\n        format: 'jwk',\n    });\n\n    /* Sort keys */\n    return Object.keys(jwk).sort().reduce((result, k) => {\n        result[k] = jwk[k];\n        return result;\n    }, {});\n}\n\n\n/**\n * Produce CryptoKeyPair and signing algorithm from a PEM encoded private key\n *\n * @private\n * @param {buffer|string} keyPem PEM encoded private key\n * @returns {Promise<array>} [keyPair, signingAlgorithm]\n */\n\nasync function getWebCryptoKeyPair(keyPem) {\n    const info = getKeyInfo(keyPem);\n    const jwk = getJwk(keyPem);\n\n    /* Signing algorithm */\n    const sigalg = {\n        name: 'RSASSA-PKCS1-v1_5',\n        hash: { name: 'SHA-256' },\n    };\n\n    if (info.isECDSA) {\n        sigalg.name = 'ECDSA';\n        sigalg.namedCurve = jwk.crv;\n\n        if (jwk.crv === 'P-384') {\n            sigalg.hash.name = 'SHA-384';\n        }\n\n        if (jwk.crv === 'P-521') {\n            sigalg.hash.name = 'SHA-512';\n        }\n    }\n\n    /* Decode PEM and import into CryptoKeyPair */\n    const privateKeyDec = x509.PemConverter.decodeFirst(keyPem.toString());\n    const privateKey = await crypto.webcrypto.subtle.importKey('pkcs8', privateKeyDec, sigalg, true, ['sign']);\n    const publicKey = await crypto.webcrypto.subtle.importKey('jwk', jwk, sigalg, true, ['verify']);\n\n    return [{ privateKey, publicKey }, sigalg];\n}\n\n/**\n * Split chain of PEM encoded objects from string into array\n *\n * @param {buffer|string} chainPem PEM encoded object chain\n * @returns {string[]} Array of PEM objects including headers\n */\n\nexport function splitPemChain(chainPem) {\n    if (Buffer.isBuffer(chainPem)) {\n        chainPem = chainPem.toString();\n    }\n\n    /* Decode into array and re-encode */\n    return x509.PemConverter.decodeWithHeaders(chainPem)\n        .map((params) => x509.PemConverter.encode([params]));\n}\n\n\n/**\n * Parse body of PEM encoded object and return a Base64URL string\n * If multiple objects are chained, the first body will be returned\n *\n * @param {buffer|string} pem PEM encoded chain or object\n * @returns {string} Base64URL-encoded body\n */\n\nexport const getPemBodyAsB64u = (pem) => {\n    const chain = splitPemChain(pem);\n\n    if (!chain.length) {\n        throw new Error('Unable to parse PEM body from string');\n    }\n\n    /* Select first object, extract body and convert to b64u */\n    const dec = x509.PemConverter.decodeFirst(chain[0]);\n    return Buffer.from(dec).toString('base64url');\n};\n\n/**\n * Parse domains from a certificate or CSR\n *\n * @private\n * @param {object} input x509.Certificate or x509.Pkcs10CertificateRequest\n * @returns {object} {commonName, altNames}\n */\n\nfunction parseDomains(input) {\n    const commonName = input.subjectName.getField('CN').pop() || null;\n    const altNamesRaw = input.getExtension(subjectAltNameOID);\n    let altNames = [];\n\n    if (altNamesRaw) {\n        const altNamesExt = new x509.SubjectAlternativeNameExtension(altNamesRaw.rawData);\n        altNames = altNames.concat(altNamesExt.names.items.map((i) => i.value));\n    }\n\n    return {\n        commonName,\n        altNames,\n    };\n}\n\n/**\n * Read domains from a Certificate Signing Request\n *\n * @param {buffer|string} csrPem PEM encoded Certificate Signing Request\n * @returns {object} {commonName, altNames}\n *\n * @example Read Certificate Signing Request domains\n * ```js\n * const { commonName, altNames } = acme.crypto.readCsrDomains(certificateRequest);\n *\n * console.log(`Common name: ${commonName}`);\n * console.log(`Alt names: ${altNames.join(', ')}`);\n * ```\n */\n\nexport const readCsrDomains = (csrPem) => {\n    if (Buffer.isBuffer(csrPem)) {\n        csrPem = csrPem.toString();\n    }\n    const dec = x509.PemConverter.decodeFirst(csrPem);\n    const csr = new x509.Pkcs10CertificateRequest(dec);\n    return parseDomains(csr);\n};\n\n/**\n * Read information from a certificate\n * If multiple certificates are chained, the first will be read\n *\n * @param {buffer|string} certPem PEM encoded certificate or chain\n * @returns {object} Certificate info\n *\n * @example Read certificate information\n * ```js\n * const info = acme.crypto.readCertificateInfo(certificate);\n * const { commonName, altNames } = info.domains;\n *\n * console.log(`Not after: ${info.notAfter}`);\n * console.log(`Not before: ${info.notBefore}`);\n *\n * console.log(`Common name: ${commonName}`);\n * console.log(`Alt names: ${altNames.join(', ')}`);\n * ```\n */\n\nexport const readCertificateInfo = (certPem) => {\n    if (Buffer.isBuffer(certPem)) {\n        certPem = certPem.toString();\n    }\n\n    const dec = x509.PemConverter.decodeFirst(certPem);\n    const cert = new x509.X509Certificate(dec);\n\n    return {\n        issuer: {\n            commonName: cert.issuerName.getField('CN').pop() || null,\n        },\n        domains: parseDomains(cert),\n        notBefore: cert.notBefore,\n        notAfter: cert.notAfter,\n    };\n};\n\n/**\n * Determine ASN.1 character string type for CSR subject field name\n *\n * https://datatracker.ietf.org/doc/html/rfc5280\n * https://github.com/PeculiarVentures/x509/blob/ecf78224fd594abbc2fa83c41565d79874f88e00/src/name.ts#L65-L71\n *\n * @private\n * @param {string} field CSR subject field name\n * @returns {string} ASN.1 character string type\n */\n\nfunction getCsrAsn1CharStringType(field) {\n    switch (field) {\n        case 'C':\n            return 'printableString';\n        case 'E':\n            return 'ia5String';\n        default:\n            return 'utf8String';\n    }\n}\n\n/**\n * Create array of subject fields for a Certificate Signing Request\n *\n * https://github.com/PeculiarVentures/x509/blob/ecf78224fd594abbc2fa83c41565d79874f88e00/src/name.ts#L65-L71\n *\n * @private\n * @param {object} input Key-value of subject fields\n * @returns {object[]} Certificate Signing Request subject array\n */\n\nfunction createCsrSubject(input) {\n    return Object.entries(input).reduce((result, [type, value]) => {\n        if (value) {\n            const ds = getCsrAsn1CharStringType(type);\n            result.push({ [type]: [{ [ds]: value }] });\n        }\n\n        return result;\n    }, []);\n}\n\n/**\n * Create x509 subject alternate name extension\n *\n * https://github.com/PeculiarVentures/x509/blob/ecf78224fd594abbc2fa83c41565d79874f88e00/src/extensions/subject_alt_name.ts\n *\n * @private\n * @param {string[]} altNames Array of alt names\n * @returns {x509.SubjectAlternativeNameExtension} Subject alternate name extension\n */\n\nfunction createSubjectAltNameExtension(altNames) {\n    return new x509.SubjectAlternativeNameExtension(altNames.map((value) => {\n        const type = net.isIP(value) ? 'ip' : 'dns';\n        return { type, value };\n    }));\n}\n\n/**\n * Create a Certificate Signing Request\n *\n * @param {object} data\n * @param {number} [data.keySize] Size of newly created RSA private key modulus in bits, default: `2048`\n * @param {string} [data.commonName] FQDN of your server\n * @param {string[]} [data.altNames] SAN (Subject Alternative Names), default: `[]`\n * @param {string} [data.country] 2 letter country code\n * @param {string} [data.state] State or province\n * @param {string} [data.locality] City\n * @param {string} [data.organization] Organization name\n * @param {string} [data.organizationUnit] Organizational unit name\n * @param {string} [data.emailAddress] Email address\n * @param {buffer|string} [keyPem] PEM encoded CSR private key\n * @returns {Promise<buffer[]>} [privateKey, certificateSigningRequest]\n *\n * @example Create a Certificate Signing Request\n * ```js\n * const [certificateKey, certificateRequest] = await acme.crypto.createCsr({\n *     altNames: ['test.example.com'],\n * });\n * ```\n *\n * @example Certificate Signing Request with both common and alternative names\n * > *Warning*: Certificate subject common name has been [deprecated](https://letsencrypt.org/docs/glossary/#def-CN) and its use is [discouraged](https://cabforum.org/uploads/BRv1.2.3.pdf).\n * ```js\n * const [certificateKey, certificateRequest] = await acme.crypto.createCsr({\n *     keySize: 4096,\n *     commonName: 'test.example.com',\n *     altNames: ['foo.example.com', 'bar.example.com'],\n * });\n * ```\n *\n * @example Certificate Signing Request with additional information\n * ```js\n * const [certificateKey, certificateRequest] = await acme.crypto.createCsr({\n *     altNames: ['test.example.com'],\n *     country: 'US',\n *     state: 'California',\n *     locality: 'Los Angeles',\n *     organization: 'The Company Inc.',\n *     organizationUnit: 'IT Department',\n *     emailAddress: 'contact@example.com',\n * });\n * ```\n *\n * @example Certificate Signing Request with ECDSA private key\n * ```js\n * const certificateKey = await acme.crypto.createPrivateEcdsaKey();\n *\n * const [, certificateRequest] = await acme.crypto.createCsr({\n *     altNames: ['test.example.com'],\n * }, certificateKey);\n * ```\n */\n\nexport const createCsr = async (data, keyPem = null) => {\n    if (!keyPem) {\n        keyPem = await createPrivateRsaKey(data.keySize);\n    }\n    else if (!Buffer.isBuffer(keyPem)) {\n        keyPem = Buffer.from(keyPem);\n    }\n\n    if (typeof data.altNames === 'undefined') {\n        data.altNames = [];\n    }\n\n    /* Ensure subject common name is present in SAN - https://cabforum.org/wp-content/uploads/BRv1.2.3.pdf */\n    if (data.commonName && !data.altNames.includes(data.commonName)) {\n        data.altNames.unshift(data.commonName);\n    }\n\n    /* CryptoKeyPair and signing algorithm from private key */\n    const [keys, signingAlgorithm] = await getWebCryptoKeyPair(keyPem);\n\n    const extensions = [\n        /* https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.3 */\n        new x509.KeyUsagesExtension(x509.KeyUsageFlags.digitalSignature | x509.KeyUsageFlags.keyEncipherment), // eslint-disable-line no-bitwise\n\n        /* https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.6 */\n        createSubjectAltNameExtension(data.altNames),\n    ];\n\n    /* Create CSR */\n    const csr = await x509.Pkcs10CertificateRequestGenerator.create({\n        keys,\n        extensions,\n        signingAlgorithm,\n        name: createCsrSubject({\n            CN: data.commonName,\n            C: data.country,\n            ST: data.state,\n            L: data.locality,\n            O: data.organization,\n            OU: data.organizationUnit,\n            E: data.emailAddress,\n        }),\n    });\n\n    /* Done */\n    const pem = csr.toString('pem');\n    return [keyPem, Buffer.from(pem)];\n};\n\n/**\n * Create a self-signed ALPN certificate for TLS-ALPN-01 challenges\n *\n * https://datatracker.ietf.org/doc/html/rfc8737\n *\n * @param {object} authz Identifier authorization\n * @param {string} keyAuthorization Challenge key authorization\n * @param {buffer|string} [keyPem] PEM encoded CSR private key\n * @returns {Promise<buffer[]>} [privateKey, certificate]\n *\n * @example Create a ALPN certificate\n * ```js\n * const [alpnKey, alpnCertificate] = await acme.crypto.createAlpnCertificate(authz, keyAuthorization);\n * ```\n *\n * @example Create a ALPN certificate with ECDSA private key\n * ```js\n * const alpnKey = await acme.crypto.createPrivateEcdsaKey();\n * const [, alpnCertificate] = await acme.crypto.createAlpnCertificate(authz, keyAuthorization, alpnKey);\n * ```\n */\n\nexport const createAlpnCertificate = async (authz, keyAuthorization, keyPem = null) => {\n    if (!keyPem) {\n        keyPem = await createPrivateRsaKey();\n    }\n    else if (!Buffer.isBuffer(keyPem)) {\n        keyPem = Buffer.from(keyPem);\n    }\n\n    const now = new Date();\n    const commonName = authz.identifier.value;\n\n    /* Pseudo-random serial - max 20 bytes, 11 for epoch (year 5138), 9 random */\n    const random = await randomInt(1, 999999999);\n    const serialNumber = `${Math.floor(now.getTime() / 1000)}${random}`;\n\n    /* CryptoKeyPair and signing algorithm from private key */\n    const [keys, signingAlgorithm] = await getWebCryptoKeyPair(keyPem);\n\n    const extensions = [\n        /* https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.3 */\n        new x509.KeyUsagesExtension(x509.KeyUsageFlags.keyCertSign | x509.KeyUsageFlags.cRLSign, true), // eslint-disable-line no-bitwise\n\n        /* https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.9 */\n        new x509.BasicConstraintsExtension(true, 2, true),\n\n        /* https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.2 */\n        await x509.SubjectKeyIdentifierExtension.create(keys.publicKey),\n\n        /* https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.6 */\n        createSubjectAltNameExtension([commonName]),\n    ];\n\n    /* ALPN extension */\n    const payload = crypto.createHash('sha256').update(keyAuthorization).digest('hex');\n    const octstr = new asn1js.OctetString({ valueHex: Buffer.from(payload, 'hex') });\n    extensions.push(new x509.Extension(alpnAcmeIdentifierOID, true, octstr.toBER()));\n\n    /* Self-signed ALPN certificate */\n    const cert = await x509.X509CertificateGenerator.createSelfSigned({\n        keys,\n        signingAlgorithm,\n        extensions,\n        serialNumber,\n        notBefore: now,\n        notAfter: now,\n        name: createCsrSubject({\n            CN: commonName,\n        }),\n    });\n\n    /* Done */\n    const pem = cert.toString('pem');\n    return [keyPem, Buffer.from(pem)];\n};\n\n/**\n * Validate that a ALPN certificate contains the expected key authorization\n *\n * @param {buffer|string} certPem PEM encoded certificate\n * @param {string} keyAuthorization Expected challenge key authorization\n * @returns {boolean} True when valid\n */\n\nexport const isAlpnCertificateAuthorizationValid = (certPem, keyAuthorization) => {\n    const expected = crypto.createHash('sha256').update(keyAuthorization).digest('hex');\n\n    /* Attempt to locate ALPN extension */\n    const cert = new x509.X509Certificate(certPem);\n    const ext = cert.getExtension(alpnAcmeIdentifierOID);\n\n    if (!ext) {\n        throw new Error('Unable to locate ALPN extension within parsed certificate');\n    }\n\n    /* Decode extension value */\n    const parsed = asn1js.fromBER(ext.value);\n    const result = Buffer.from(parsed.result.valueBlock.valueHexView).toString('hex');\n\n    /* Return true if match */\n    return (result === expected);\n};\n"
  },
  {
    "path": "packages/core/acme-client/src/error.js",
    "content": "export class CancelError extends Error {\n    constructor(message) {\n        super(message);\n        this.name = 'CancelError';\n    }\n}\n\n\n\n"
  },
  {
    "path": "packages/core/acme-client/src/http.js",
    "content": "/**\n * ACME HTTP client\n */\nimport { createHmac, createSign, constants } from 'crypto';\nconst { RSA_PKCS1_PADDING } = constants;\nimport axios from './axios.js';\nimport { log } from './logger.js';\nimport { getJwk } from './crypto/index.js';\n\n/**\n * ACME HTTP client\n *\n * @class\n * @param {string} directoryUrl ACME directory URL\n * @param {buffer} accountKey PEM encoded account private key\n * @param {object} [opts.externalAccountBinding]\n * @param {string} [opts.externalAccountBinding.kid] External account binding KID\n * @param {string} [opts.externalAccountBinding.hmacKey] External account binding HMAC key\n */\n\nclass HttpClient {\n    constructor(directoryUrl, accountKey, externalAccountBinding = {}, urlMapping = {}) {\n        this.directoryUrl = directoryUrl;\n        this.accountKey = accountKey;\n        this.externalAccountBinding = externalAccountBinding;\n\n        this.maxBadNonceRetries = 5;\n        this.jwk = null;\n\n        this.directoryCache = null;\n        this.directoryMaxAge = 86400;\n        this.directoryTimestamp = 0;\n        this.urlMapping = urlMapping;\n    }\n\n    /**\n     * HTTP request\n     *\n     * @param {string} url HTTP URL\n     * @param {string} method HTTP method\n     * @param {object} [opts] Request options\n     * @returns {Promise<object>} HTTP response\n     */\n\n    async request(url, method, opts = {}) {\n        if (this.urlMapping && this.urlMapping.enabled && this.urlMapping.mappings) {\n            // eslint-disable-next-line no-restricted-syntax\n            for (const key in this.urlMapping.mappings) {\n                if (url.includes(key)) {\n                    const newUrl = url.replace(key, this.urlMapping.mappings[key]);\n                    log(`use reverse proxy: ${newUrl}`);\n                    url = newUrl;\n                }\n            }\n        }\n        opts.url = url;\n        opts.method = method;\n        opts.validateStatus = null;\n\n        /* Headers */\n        if (typeof opts.headers === 'undefined') {\n            opts.headers = {};\n        }\n\n        opts.headers['Content-Type'] = 'application/jose+json';\n\n        /* Request */\n        log(`HTTP request: ${method} ${url}`);\n        const resp = await axios.request(opts);\n\n        log(`RESP ${resp.status} ${method} ${url}`);\n        return resp;\n    }\n\n    /**\n     * Get ACME provider directory\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.1.1\n     *\n     * @returns {Promise<object>} ACME directory contents\n     */\n\n    async getDirectory() {\n        const now = Math.floor(Date.now() / 1000);\n        const age = (now - this.directoryTimestamp);\n\n        if (!this.directoryCache || (age > this.directoryMaxAge)) {\n            log(`Refreshing ACME directory, age: ${age}`);\n            const resp = await this.request(this.directoryUrl, 'get');\n\n            if (resp.status >= 400) {\n                throw new Error(`Attempting to read ACME directory returned error ${resp.status}: ${this.directoryUrl}`);\n            }\n\n            if (!resp.data) {\n                throw new Error('Attempting to read ACME directory returned no data');\n            }\n\n            this.directoryCache = resp.data;\n            this.directoryTimestamp = now;\n        }\n\n        return this.directoryCache;\n    }\n\n    /**\n     * Get JSON Web Key\n     *\n     * @returns {object} JSON Web Key\n     */\n\n    getJwk() {\n        if (!this.jwk) {\n            this.jwk = getJwk(this.accountKey);\n        }\n\n        return this.jwk;\n    }\n\n    /**\n     * Get nonce from directory API endpoint\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-7.2\n     *\n     * @returns {Promise<string>} Nonce\n     */\n\n    async getNonce() {\n        const url = await this.getResourceUrl('newNonce');\n        const resp = await this.request(url, 'head');\n\n        if (!resp.headers['replay-nonce']) {\n            throw new Error('Failed to get nonce from ACME provider');\n        }\n\n        return resp.headers['replay-nonce'];\n    }\n\n    /**\n     * Get URL for a directory resource\n     *\n     * @param {string} resource API resource name\n     * @returns {Promise<string>} URL\n     */\n\n    async getResourceUrl(resource) {\n        const dir = await this.getDirectory();\n\n        if (!dir[resource]) {\n            throw new Error(`Unable to locate API resource URL in ACME directory: \"${resource}\"`);\n        }\n\n        return dir[resource];\n    }\n\n    /**\n     * Get directory meta field\n     *\n     * @param {string} field Meta field name\n     * @returns {Promise<string|null>} Meta field value\n     */\n\n    async getMetaField(field) {\n        const dir = await this.getDirectory();\n\n        if (('meta' in dir) && (field in dir.meta)) {\n            return dir.meta[field];\n        }\n\n        return null;\n    }\n\n    /**\n     * Prepare HTTP request body for signature\n     *\n     * @param {string} alg JWS algorithm\n     * @param {string} url Request URL\n     * @param {object} [payload] Request payload\n     * @param {object} [opts]\n     * @param {string} [opts.nonce] JWS anti-replay nonce\n     * @param {string} [opts.kid] JWS KID\n     * @returns {object} Signed HTTP request body\n     */\n\n    prepareSignedBody(alg, url, payload = null, { nonce = null, kid = null } = {}) {\n        const header = { alg, url };\n\n        /* Nonce */\n        if (nonce) {\n            log(`Using nonce: ${nonce}`);\n            header.nonce = nonce;\n        }\n\n        /* KID or JWK */\n        if (kid) {\n            header.kid = kid;\n        }\n        else {\n            header.jwk = this.getJwk();\n        }\n\n        /* Body */\n        return {\n            payload: payload ? Buffer.from(JSON.stringify(payload)).toString('base64url') : '',\n            protected: Buffer.from(JSON.stringify(header)).toString('base64url'),\n        };\n    }\n\n    /**\n     * Create JWS HTTP request body using HMAC\n     *\n     * @param {string} hmacKey HMAC key\n     * @param {string} url Request URL\n     * @param {object} [payload] Request payload\n     * @param {object} [opts]\n     * @param {string} [opts.nonce] JWS anti-replay nonce\n     * @param {string} [opts.kid] JWS KID\n     * @returns {object} Signed HMAC request body\n     */\n\n    createSignedHmacBody(hmacKey, url, payload = null, { nonce = null, kid = null } = {}) {\n        const result = this.prepareSignedBody('HS256', url, payload, { nonce, kid });\n\n        /* Signature */\n        const signer = createHmac('SHA256', Buffer.from(hmacKey, 'base64')).update(`${result.protected}.${result.payload}`, 'utf8');\n        result.signature = signer.digest().toString('base64url');\n\n        return result;\n    }\n\n    /**\n     * Create JWS HTTP request body using RSA or ECC\n     *\n     * https://datatracker.ietf.org/doc/html/rfc7515\n     *\n     * @param {string} url Request URL\n     * @param {object} [payload] Request payload\n     * @param {object} [opts]\n     * @param {string} [opts.nonce] JWS nonce\n     * @param {string} [opts.kid] JWS KID\n     * @returns {object} JWS request body\n     */\n\n    createSignedBody(url, payload = null, { nonce = null, kid = null } = {}) {\n        const jwk = this.getJwk();\n        let headerAlg = 'RS256';\n        let signerAlg = 'SHA256';\n\n        /* https://datatracker.ietf.org/doc/html/rfc7518#section-3.1 */\n        if (jwk.crv && (jwk.kty === 'EC')) {\n            headerAlg = 'ES256';\n\n            if (jwk.crv === 'P-384') {\n                headerAlg = 'ES384';\n                signerAlg = 'SHA384';\n            }\n            else if (jwk.crv === 'P-521') {\n                headerAlg = 'ES512';\n                signerAlg = 'SHA512';\n            }\n        }\n\n        /* Prepare body and signer */\n        const result = this.prepareSignedBody(headerAlg, url, payload, { nonce, kid });\n        const signer = createSign(signerAlg).update(`${result.protected}.${result.payload}`, 'utf8');\n\n        /* Signature - https://stackoverflow.com/questions/39554165 */\n        result.signature = signer.sign({\n            key: this.accountKey,\n            padding: RSA_PKCS1_PADDING,\n            dsaEncoding: 'ieee-p1363',\n        }, 'base64url');\n\n        return result;\n    }\n\n    /**\n     * Signed HTTP request\n     *\n     * https://datatracker.ietf.org/doc/html/rfc8555#section-6.2\n     *\n     * @param {string} url Request URL\n     * @param {object} payload Request payload\n     * @param {object} [opts]\n     * @param {string} [opts.kid] JWS KID\n     * @param {string} [opts.nonce] JWS anti-replay nonce\n     * @param {boolean} [opts.includeExternalAccountBinding] Include EAB in request\n     * @param {number} [attempts] Request attempt counter\n     * @returns {Promise<object>} HTTP response\n     */\n\n    async signedRequest(url, payload, { kid = null, nonce = null, includeExternalAccountBinding = false } = {}, attempts = 0) {\n        if (!nonce) {\n            nonce = await this.getNonce();\n        }\n\n        /* External account binding */\n        if (includeExternalAccountBinding && this.externalAccountBinding) {\n            if (this.externalAccountBinding.kid && this.externalAccountBinding.hmacKey) {\n                const jwk = this.getJwk();\n                const eabKid = this.externalAccountBinding.kid;\n                const eabHmacKey = this.externalAccountBinding.hmacKey;\n\n                payload.externalAccountBinding = this.createSignedHmacBody(eabHmacKey, url, jwk, { kid: eabKid });\n            }\n        }\n\n        /* Sign body and send request */\n        const data = this.createSignedBody(url, payload, { nonce, kid });\n        const resp = await this.request(url, 'post', { data });\n\n        /* Retry on bad nonce - https://datatracker.ietf.org/doc/html/rfc8555#section-6.5 */\n        if (resp.data && resp.data.type && (resp.status === 400) && (resp.data.type === 'urn:ietf:params:acme:error:badNonce') && (attempts < this.maxBadNonceRetries)) {\n            nonce = resp.headers['replay-nonce'] || null;\n            attempts += 1;\n\n            log(`Caught invalid nonce error, retrying (${attempts}/${this.maxBadNonceRetries}) signed request to: ${url}`);\n            return this.signedRequest(url, payload, { kid, nonce, includeExternalAccountBinding }, attempts);\n        }\n\n        /* Return response */\n        return resp;\n    }\n}\n\n/* Export client */\nexport default HttpClient;\n"
  },
  {
    "path": "packages/core/acme-client/src/index.js",
    "content": "/**\n * acme-client\n */\nimport AcmeClinet  from './client.js'\nexport const Client = AcmeClinet\n\n/**\n * Directory URLs\n */\n\nexport const directory = {\n    buypass: {\n        staging: 'https://api.test4.buypass.no/acme/directory',\n        production: 'https://api.buypass.com/acme/directory',\n    },\n    google: {\n        staging: 'https://dv.acme-v02.test-api.pki.goog/directory',\n        production: 'https://dv.acme-v02.api.pki.goog/directory',\n    },\n    letsencrypt: {\n        staging: 'https://acme-staging-v02.api.letsencrypt.org/directory',\n        production: 'https://acme-v02.api.letsencrypt.org/directory',\n    },\n    zerossl: {\n        staging: 'https://acme.zerossl.com/v2/DV90',\n        production: 'https://acme.zerossl.com/v2/DV90',\n    },\n};\n\n/**\n * Crypto\n */\n\nexport * as crypto from './crypto/index.js'\nexport * as forge from './crypto/forge.js'\n\n/**\n * Axios\n */\n\nexport *  from './axios.js'\n/**\n * Logger\n */\n\nexport * from './logger.js'\nexport * from './verify.js'\nexport * from './error.js'\n\nexport * from './util.js'"
  },
  {
    "path": "packages/core/acme-client/src/logger.js",
    "content": "/**\n * ACME logger\n */\n\nimport debugg from 'debug'\nconst debug = debugg('acme-client');\n\nlet logger = () => {};\n\n/**\n * Set logger function\n *\n * @param {function} fn Logger function\n */\n\nexport const setLogger = (fn) => {\n    logger = fn;\n};\n\n/**\n * Log message\n *\n * @param {string} msg Message\n */\n\nexport const  log = (...msg) => {\n    debug(...msg);\n    logger(...msg);\n};\n"
  },
  {
    "path": "packages/core/acme-client/src/util.js",
    "content": "/**\n * Utility methods\n */\n\nimport tls from 'tls';\nimport dnsSdk from 'dns';\nimport { readCertificateInfo, splitPemChain }from './crypto/index.js'\nimport { log } from './logger.js'\n\nconst dns = dnsSdk.promises;\n/**\n * Exponential backoff\n *\n * https://github.com/mokesmokes/backo\n *\n * @class\n * @param {object} [opts]\n * @param {number} [opts.min] Minimum backoff duration in ms\n * @param {number} [opts.max] Maximum backoff duration in ms\n */\n\nclass Backoff {\n    constructor({ min = 100, max = 10000 } = {}) {\n        this.min = min;\n        this.max = max;\n        this.attempts = 0;\n    }\n\n    /**\n     * Get backoff duration\n     *\n     * @returns {number} Backoff duration in ms\n     */\n\n    duration() {\n        const ms = this.min * (2 ** this.attempts);\n        this.attempts += 1;\n        return Math.min(ms, this.max);\n    }\n}\n\n/**\n * Retry promise\n *\n * @param {function} fn Function returning promise that should be retried\n * @param {number} attempts Maximum number of attempts\n * @param {Backoff} backoff Backoff instance\n * @returns {Promise}\n */\n\nasync function retryPromise(fn, attempts, backoff) {\n    let aborted = false;\n\n    try {\n        const data = await fn(() => { aborted = true; });\n        return data;\n    }\n    catch (e) {\n        if (aborted || ((backoff.attempts + 1) >= attempts)) {\n            throw e;\n        }\n\n        log(`Promise rejected: ${e.message}`);\n        const duration = backoff.duration();\n        log(`Promise rejected attempt #${backoff.attempts}, ${duration}ms 后重试: ${e.message}`);\n\n        await new Promise((resolve) => { setTimeout(resolve, duration); });\n        return retryPromise(fn, attempts, backoff);\n    }\n}\n\n/**\n * Retry promise\n *\n * @param {function} fn Function returning promise that should be retried\n * @param {object} [backoffOpts] Backoff options\n * @param {number} [backoffOpts.attempts] Maximum number of attempts, default: `5`\n * @param {number} [backoffOpts.min] Minimum attempt delay in milliseconds, default: `5000`\n * @param {number} [backoffOpts.max] Maximum attempt delay in milliseconds, default: `30000`\n * @returns {Promise}\n */\n\nfunction retry(fn, { attempts = 5, min = 5000, max = 30000 } = {}) {\n    const backoff = new Backoff({ min, max });\n    return retryPromise(fn, attempts, backoff);\n}\n\n/**\n * Parse URLs from Link header\n *\n * https://datatracker.ietf.org/doc/html/rfc8555#section-7.4.2\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Link\n *\n * @param {string} header Header contents\n * @param {string} rel Link relation, default: `alternate`\n * @returns {string[]} Array of URLs\n */\n\nfunction parseLinkHeader(header, rel = 'alternate') {\n    const relRe = new RegExp(`\\\\s*rel\\\\s*=\\\\s*\"?${rel}\"?`, 'i');\n\n    const results = (header || '').split(/,\\s*</).map((link) => {\n        const [, linkUrl, linkParts] = link.match(/<?([^>]*)>;(.*)/) || [];\n        return (linkUrl && linkParts && linkParts.match(relRe)) ? linkUrl : null;\n    });\n\n    return results.filter((r) => r);\n}\n\n/**\n * Parse date or duration from Retry-After header\n *\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After\n *\n * @param {string} header Header contents\n * @returns {number} Retry duration in seconds\n */\n\nfunction parseRetryAfterHeader(header) {\n    const sec = parseInt(header, 10);\n    const date = new Date(header);\n\n    /* Seconds into the future */\n    if (Number.isSafeInteger(sec) && (sec > 0)) {\n        return sec;\n    }\n\n    /* Future date string */\n    if (date instanceof Date && !Number.isNaN(date)) {\n        const now = new Date();\n        const diff = Math.ceil((date.getTime() - now.getTime()) / 1000);\n\n        if (diff > 0) {\n            return diff;\n        }\n    }\n\n    return 0;\n}\n\n/**\n * Find certificate chain with preferred issuer common name\n *  - If issuer is found in multiple chains, the closest to root wins\n *  - If issuer can not be located, the first chain will be returned\n *\n * @param {string[]} certificates Array of PEM encoded certificate chains\n * @param {string} issuer Preferred certificate issuer\n * @returns {string} PEM encoded certificate chain\n */\n\nfunction findCertificateChainForIssuer(chains, issuer) {\n    log(`Attempting to find match for issuer=\"${issuer}\" in ${chains.length} certificate chains`);\n    let bestMatch = null;\n    let bestDistance = null;\n\n    chains.forEach((chain) => {\n        /* Look up all issuers */\n        const certs = splitPemChain(chain);\n        const infoCollection = certs.map((c) => readCertificateInfo(c));\n        const issuerCollection = infoCollection.map((i) => i.issuer.commonName);\n\n        /* Found issuer match, get distance from root - lower is better */\n        if (issuerCollection.includes(issuer)) {\n            const distance = (issuerCollection.length - issuerCollection.indexOf(issuer));\n            log(`Found matching chain for preferred issuer=\"${issuer}\" distance=${distance} issuers=${JSON.stringify(issuerCollection)}`);\n\n            /* Chain wins, use it */\n            if (!bestDistance || (distance < bestDistance)) {\n                log(`Issuer is closer to root than previous match, using it (${distance} < ${bestDistance || 'undefined'})`);\n                bestMatch = chain;\n                bestDistance = distance;\n            }\n        }\n        else {\n            /* No match */\n            log(`Unable to match certificate for preferred issuer=\"${issuer}\", issuers=${JSON.stringify(issuerCollection)}`);\n        }\n    });\n\n    /* Return found match */\n    if (bestMatch) {\n        return bestMatch;\n    }\n\n    /* No chains matched, return default */\n    log(`Found no match in ${chains.length} certificate chains for preferred issuer=\"${issuer}\", returning default certificate chain`);\n    return chains[0];\n}\n\n/**\n * Find and format error in response object\n *\n * @param {object} resp HTTP response\n * @returns {string} Error message\n */\n\nfunction formatResponseError(resp) {\n    let result;\n\n    if (resp.data) {\n        if (resp.data.error) {\n            result = resp.data.error.detail || resp.data.error;\n        }\n        else {\n            result = resp.data.detail || JSON.stringify(resp.data);\n        }\n    }\n\n    return (result || '').replace(/\\n/g, '');\n}\n\n/**\n * Resolve root domain name by looking for SOA record\n *\n * @param {string} recordName DNS record name\n * @returns {Promise<string>} Root domain name\n */\n\nasync function resolveDomainBySoaRecord(recordName) {\n    try {\n        await dns.resolveSoa(recordName);\n        log(`找到${recordName}的SOA记录`);\n        return recordName;\n    }\n    catch (e) {\n        log(`找不到${recordName}的SOA记录,继续往主域名查找`);\n        const parentRecordName = recordName.split('.').slice(1).join('.');\n\n        if (!parentRecordName.includes('.')) {\n            throw new Error('SOA record查找失败');\n        }\n\n        return resolveDomainBySoaRecord(parentRecordName);\n    }\n}\n\n/**\n * Get DNS resolver using domains authoritative NS records\n *\n * @param {string} recordName DNS record name\n * @returns {Promise<dns.Resolver>} DNS resolver\n */\n\nasync function getAuthoritativeDnsResolver(recordName) {\n    log(`获取域名${recordName}的权威NS服务器: `);\n    const resolver = new dns.Resolver();\n\n    try {\n        /* Resolve root domain by SOA */\n        const domain = await resolveDomainBySoaRecord(recordName);\n\n        /* Resolve authoritative NS addresses */\n        log(`获取到权威NS服务器name: ${domain}`);\n        const nsRecords = await dns.resolveNs(domain);\n        log(`域名权威NS服务器：${nsRecords}`);\n        const nsAddrArray = await Promise.all(nsRecords.map(async (r) => dns.resolve4(r)));\n        const nsAddresses = [].concat(...nsAddrArray).filter((a) => a);\n\n        if (!nsAddresses.length) {\n            throw new Error(`Unable to locate any valid authoritative NS addresses for domain（获取权威服务器IP失败）: ${domain}`);\n        }\n\n        /* Authoritative NS success */\n        log(`Found ${nsAddresses.length} authoritative NS addresses for domain: ${domain}`);\n        resolver.setServers(nsAddresses);\n    }\n    catch (e) {\n        log(`Authoritative NS lookup error（获取权威NS服务器地址失败）: ${e.message}`);\n    }\n\n    /* Return resolver */\n    const addresses = resolver.getServers();\n    log(`DNS resolver addresses（域名的权威NS服务器地址）: ${addresses.join(', ')}`);\n\n    return resolver;\n}\n\n/**\n * Attempt to retrieve TLS ALPN certificate from peer\n *\n * https://nodejs.org/api/tls.html#tlsconnectoptions-callback\n *\n * @param {string} host Host the TLS client should connect to\n * @param {number} port Port the client should connect to\n * @param {string} servername Server name for the SNI (Server Name Indication)\n * @returns {Promise<string>} PEM encoded certificate\n */\n\nasync function retrieveTlsAlpnCertificate(host, port, timeout = 30000) {\n    return new Promise((resolve, reject) => {\n        let result;\n\n        /* TLS connection */\n        const socket = tls.connect({\n            host,\n            port,\n            servername: host,\n            rejectUnauthorized: false,\n            ALPNProtocols: ['acme-tls/1'],\n        });\n\n        socket.setTimeout(timeout);\n        socket.setEncoding('utf-8');\n\n        /* Grab certificate once connected and close */\n        socket.on('secureConnect', () => {\n            result = socket.getPeerX509Certificate();\n            socket.end();\n        });\n\n        /* Errors */\n        socket.on('error', (err) => {\n            reject(err);\n        });\n\n        socket.on('timeout', () => {\n            socket.destroy(new Error('TLS ALPN certificate lookup request timed out'));\n        });\n\n        /* Done, return cert as PEM if found */\n        socket.on('end', () => {\n            if (result) {\n                return resolve(result.toString());\n            }\n\n            return reject(new Error('TLS ALPN lookup failed to retrieve certificate'));\n        });\n    });\n}\n\n/**\n * Export utils\n */\n\nexport {\n    retry,\n    parseLinkHeader,\n    parseRetryAfterHeader,\n    findCertificateChainForIssuer,\n    formatResponseError,\n    getAuthoritativeDnsResolver,\n    retrieveTlsAlpnCertificate,\n    resolveDomainBySoaRecord\n};\n\n"
  },
  {
    "path": "packages/core/acme-client/src/verify.js",
    "content": "/**\n * ACME challenge verification\n */\n\nimport dnsSdk from \"dns\"\nimport https from 'https'\nimport {log} from './logger.js'\nimport axios from './axios.js'\nimport * as util from './util.js'\nimport {isAlpnCertificateAuthorizationValid} from './crypto/index.js'\n\n\nconst dns = dnsSdk.promises\n/**\n * Verify ACME HTTP challenge\n *\n * https://datatracker.ietf.org/doc/html/rfc8555#section-8.3\n *\n * @param {object} authz Identifier authorization\n * @param {object} challenge Authorization challenge\n * @param {string} keyAuthorization Challenge key authorization\n * @param {string} [suffix] URL suffix\n * @returns {Promise<boolean>}\n */\n\nasync function verifyHttpChallenge(authz, challenge, keyAuthorization, suffix = `/.well-known/acme-challenge/${challenge.token}`) {\n\n    async function doQuery(challengeUrl){\n        log(`正在测试请求 ${challengeUrl} `)\n        // const httpsPort = axios.defaults.acmeSettings.httpsChallengePort || 443;\n        // const challengeUrl = `https://${authz.identifier.value}:${httpsPort}${suffix}`;\n\n        /* May redirect to HTTPS with invalid/self-signed cert - https://letsencrypt.org/docs/challenge-types/#http-01-challenge */\n        const httpsAgent = new https.Agent({ rejectUnauthorized: false });\n\n        log(`Sending HTTP query to ${authz.identifier.value}, suffix: ${suffix}, port: ${httpPort}`);\n        let data = \"\"\n        try{\n            const resp = await axios.get(challengeUrl, { httpsAgent });\n            data = (resp.data || '').replace(/\\s+$/, '');\n        }catch (e) {\n            log(`[error] HTTP request error from ${authz.identifier.value}`,e.message);\n            return false\n        }\n\n        if (!data || (data !== keyAuthorization)) {\n            log(`[error] Authorization not found in HTTP response from ${authz.identifier.value}`);\n            return false\n        }\n        return true\n\n    }\n\n    const httpPort = axios.defaults.acmeSettings.httpChallengePort || 80;\n    const challengeUrl = `http://${authz.identifier.value}:${httpPort}${suffix}`;\n\n    if (!await doQuery(challengeUrl)) {\n        const httpsPort = axios.defaults.acmeSettings.httpsChallengePort || 443;\n        const httpsChallengeUrl = `https://${authz.identifier.value}:${httpsPort}${suffix}`;\n        const res = await doQuery(httpsChallengeUrl)\n        if (!res) {\n            throw new Error(`[error] 验证失败，请检查以上测试url是否可以正常访问`);\n        }\n    }\n\n\n    log(`Key authorization match for ${challenge.type}/${authz.identifier.value}, ACME challenge verified`);\n    return true;\n}\n\n/**\n * Walk DNS until TXT records are found\n */\n\nasync function walkDnsChallengeRecord(recordName, resolver = dns,deep = 0) {\n\n    let records = [];\n\n    /* Resolve TXT records */\n    try {\n        log(`检查域名 ${recordName} 的TXT记录`);\n        const txtRecords = await resolver.resolveTxt(recordName);\n\n        if (txtRecords && txtRecords.length) {\n            log(`找到 ${txtRecords.length} 条 TXT记录（ ${recordName}）`);\n            log(`TXT records: ${JSON.stringify(txtRecords)}`);\n            records = records.concat(...txtRecords);\n        }\n    } catch (e) {\n        log(`解析 TXT 记录出错, ${recordName} :${e.message}`);\n    }\n\n    /* Resolve CNAME record first */\n    try {\n        log(`检查是否存在CNAME映射: ${recordName}`);\n        const cnameRecords = await resolver.resolveCname(recordName);\n\n        if (cnameRecords.length) {\n            const cnameRecord = cnameRecords[0];\n            log(`已找到${recordName}的CNAME记录，将检查: ${cnameRecord}`);\n            let res= await  walkTxtRecord(cnameRecord,deep+1);\n            if (res && res.length) {\n                log(`从CNAME中找到TXT记录: ${JSON.stringify(res)}`);\n                records = records.concat(...res);\n            }\n        }else{\n            log(`没有CNAME映射（${recordName}）`);\n        }\n    } catch (e) {\n        log(`检查CNAME出错（${recordName}） :${e.message}`);\n    }\n    return records\n}\n\nexport async function walkTxtRecord(recordName,deep = 0) {\n    if(deep >5){\n        log(`walkTxtRecord too deep (#${deep}) , skip walk`)\n        return []\n    }\n\n    const txtRecords = []\n    try {\n        /* Default DNS resolver first */\n        log('从本地DNS服务器获取TXT解析记录');\n        const res = await walkDnsChallengeRecord(recordName,dns,deep);\n        if (res && res.length > 0) {\n            for (const item of res) {\n                txtRecords.push(item)\n            }\n        }\n\n    } catch (e) {\n        log(`本地获取TXT解析记录失败:${e.message}`)\n    }\n\n    try{\n        /* Authoritative DNS resolver */\n        log(`从域名权威服务器获取TXT解析记录`);\n        const authoritativeResolver = await util.getAuthoritativeDnsResolver(recordName);\n        const res = await walkDnsChallengeRecord(recordName, authoritativeResolver,deep);\n        if (res && res.length > 0) {\n            for (const item of res) {\n                txtRecords.push(item)\n            }\n        }\n    }catch (e) {\n        log(`权威服务器获取TXT解析记录失败:${e.message}`)\n    }\n\n    if (txtRecords.length === 0) {\n        throw new Error(`没有找到TXT解析记录（${recordName}）`);\n    }\n    return txtRecords;\n}\n\n/**\n * Verify ACME DNS challenge\n *\n * https://datatracker.ietf.org/doc/html/rfc8555#section-8.4\n *\n * @param {object} authz Identifier authorization\n * @param {object} challenge Authorization challenge\n * @param {string} keyAuthorization Challenge key authorization\n * @param {string} [prefix] DNS prefix\n * @returns {Promise<boolean>}\n */\n\nasync function verifyDnsChallenge(authz, challenge, keyAuthorization, prefix = '_acme-challenge.') {\n    const recordName = `${prefix}${authz.identifier.value}`;\n    log(`本地校验TXT记录）: ${recordName}`);\n    let recordValues = await walkTxtRecord(recordName);\n    //去重\n    recordValues = [...new Set(recordValues)];\n    log(`DNS查询成功, 找到 ${recordValues.length} 条TXT记录：${recordValues}`);\n    if (!recordValues.length || !recordValues.includes(keyAuthorization)) {\n        throw new Error(`没有找到需要的DNS TXT记录: ${recordName}，期望:${keyAuthorization},结果:${recordValues}`);\n    }\n\n    log(`关键授权匹配成功（${challenge.type}/${recordName}）:${keyAuthorization}，校验成功， ACME challenge verified`);\n    return true;\n}\n\n/**\n * Verify ACME TLS ALPN challenge\n *\n * https://datatracker.ietf.org/doc/html/rfc8737\n *\n * @param {object} authz Identifier authorization\n * @param {object} challenge Authorization challenge\n * @param {string} keyAuthorization Challenge key authorization\n * @returns {Promise<boolean>}\n */\n\nasync function verifyTlsAlpnChallenge(authz, challenge, keyAuthorization) {\n    const tlsAlpnPort = axios.defaults.acmeSettings.tlsAlpnChallengePort || 443;\n    const host = authz.identifier.value;\n    log(`Establishing TLS connection with host: ${host}:${tlsAlpnPort}`);\n\n    const certificate = await util.retrieveTlsAlpnCertificate(host, tlsAlpnPort);\n    log('Certificate received from server successfully, matching key authorization in ALPN');\n\n    if (!isAlpnCertificateAuthorizationValid(certificate, keyAuthorization)) {\n        throw new Error(`Authorization not found in certificate from ${authz.identifier.value}`);\n    }\n\n    log(`Key authorization match for ${challenge.type}/${authz.identifier.value}, ACME challenge verified`);\n    return true;\n}\n\n/**\n * Export API\n */\n\nexport default {\n    'http-01': verifyHttpChallenge,\n    'dns-01': verifyDnsChallenge,\n    'tls-alpn-01': verifyTlsAlpnChallenge,\n};\n"
  },
  {
    "path": "packages/core/acme-client/src/wait.js",
    "content": "export async function wait(ms) {\n    return new Promise((resolve) => {\n        setTimeout(resolve, ms);\n    });\n}\n"
  },
  {
    "path": "packages/core/acme-client/test/00-pebble.spec.js",
    "content": "/**\n * Pebble Challenge Test Server tests\n */\n\nconst dns = require('dns').promises;\nconst { randomUUID: uuid } = require('crypto');\nconst https = require('https');\nconst { assert } = require('chai');\nconst cts = require('./challtestsrv');\nconst axios = require('./../src/axios');\nconst { retrieveTlsAlpnCertificate } = require('./../src/util');\nconst { isAlpnCertificateAuthorizationValid } = require('./../src/crypto');\n\nconst domainName = process.env.ACME_DOMAIN_NAME || 'example.com';\nconst httpPort = axios.defaults.acmeSettings.httpChallengePort || 80;\nconst httpsPort = axios.defaults.acmeSettings.httpsChallengePort || 443;\nconst tlsAlpnPort = axios.defaults.acmeSettings.tlsAlpnChallengePort || 443;\n\ndescribe('pebble', () => {\n    const httpsAgent = new https.Agent({ rejectUnauthorized: false });\n\n    const testAHost = `${uuid()}.${domainName}`;\n    const testARecords = ['1.1.1.1', '2.2.2.2'];\n    const testCnameHost = `${uuid()}.${domainName}`;\n    const testCnameRecord = `${uuid()}.${domainName}`;\n\n    const testHttp01ChallengeHost = `${uuid()}.${domainName}`;\n    const testHttp01ChallengeToken = uuid();\n    const testHttp01ChallengeContent = uuid();\n\n    const testHttps01ChallengeHost = `${uuid()}.${domainName}`;\n    const testHttps01ChallengeToken = uuid();\n    const testHttps01ChallengeContent = uuid();\n\n    const testDns01ChallengeHost = `_acme-challenge.${uuid()}.${domainName}.`;\n    const testDns01ChallengeValue = uuid();\n\n    const testTlsAlpn01ChallengeHost = `${uuid()}.${domainName}`;\n    const testTlsAlpn01ChallengeValue = uuid();\n\n    /**\n     * Pebble CTS required\n     */\n\n    before(function () {\n        if (!cts.isEnabled()) {\n            this.skip();\n        }\n    });\n\n    /**\n     * DNS mocking\n     */\n\n    describe('dns', () => {\n        it('should not locate a records', async () => {\n            const resp = await dns.resolve4(testAHost);\n\n            assert.isArray(resp);\n            assert.notDeepEqual(resp, testARecords);\n        });\n\n        it('should add dns a records', async () => {\n            const resp = await cts.addDnsARecord(testAHost, testARecords);\n            assert.isTrue(resp);\n        });\n\n        it('should locate a records', async () => {\n            const resp = await dns.resolve4(testAHost);\n\n            assert.isArray(resp);\n            assert.deepStrictEqual(resp, testARecords);\n        });\n\n        it('should not locate cname records', async () => {\n            await assert.isRejected(dns.resolveCname(testCnameHost));\n        });\n\n        it('should set dns cname record', async () => {\n            const resp = await cts.setDnsCnameRecord(testCnameHost, testCnameRecord);\n            assert.isTrue(resp);\n        });\n\n        it('should locate cname record', async () => {\n            const resp = await dns.resolveCname(testCnameHost);\n\n            assert.isArray(resp);\n            assert.deepStrictEqual(resp, [testCnameRecord]);\n        });\n    });\n\n    /**\n     * HTTP-01 challenge response\n     */\n\n    describe('http-01', () => {\n        it('should not locate challenge response', async () => {\n            const resp = await axios.get(`http://${testHttp01ChallengeHost}:${httpPort}/.well-known/acme-challenge/${testHttp01ChallengeToken}`);\n\n            assert.isString(resp.data);\n            assert.notEqual(resp.data, testHttp01ChallengeContent);\n        });\n\n        it('should add challenge response', async () => {\n            const resp = await cts.addHttp01ChallengeResponse(testHttp01ChallengeToken, testHttp01ChallengeContent);\n            assert.isTrue(resp);\n        });\n\n        it('should locate challenge response', async () => {\n            const resp = await axios.get(`http://${testHttp01ChallengeHost}:${httpPort}/.well-known/acme-challenge/${testHttp01ChallengeToken}`);\n\n            assert.isString(resp.data);\n            assert.strictEqual(resp.data, testHttp01ChallengeContent);\n        });\n    });\n\n    /**\n     * HTTPS-01 challenge response\n     */\n\n    describe('https-01', () => {\n        it('should not locate challenge response', async () => {\n            const r1 = await axios.get(`http://${testHttps01ChallengeHost}:${httpPort}/.well-known/acme-challenge/${testHttps01ChallengeToken}`, { httpsAgent });\n            const r2 = await axios.get(`https://${testHttps01ChallengeHost}:${httpsPort}/.well-known/acme-challenge/${testHttps01ChallengeToken}`, { httpsAgent });\n\n            [r1, r2].forEach((resp) => {\n                assert.isString(resp.data);\n                assert.notEqual(resp.data, testHttps01ChallengeContent);\n            });\n        });\n\n        it('should add challenge response', async () => {\n            const resp = await cts.addHttps01ChallengeResponse(testHttps01ChallengeToken, testHttps01ChallengeContent, testHttps01ChallengeHost);\n            assert.isTrue(resp);\n        });\n\n        it('should 302 with self-signed cert', async () => {\n            /* Assert HTTP 302 */\n            const resp = await axios.get(`http://${testHttps01ChallengeHost}:${httpPort}/.well-known/acme-challenge/${testHttps01ChallengeToken}`, {\n                maxRedirects: 0,\n                validateStatus: null,\n            });\n\n            assert.strictEqual(resp.status, 302);\n            assert.strictEqual(resp.headers.location, `https://${testHttps01ChallengeHost}:${httpsPort}/.well-known/acme-challenge/${testHttps01ChallengeToken}`);\n\n            /* Self-signed cert test */\n            await assert.isRejected(axios.get(`https://${testHttps01ChallengeHost}:${httpsPort}/.well-known/acme-challenge/${testHttps01ChallengeToken}`));\n            await assert.isFulfilled(axios.get(`https://${testHttps01ChallengeHost}:${httpsPort}/.well-known/acme-challenge/${testHttps01ChallengeToken}`, { httpsAgent }));\n        });\n\n        it('should locate challenge response', async () => {\n            const r1 = await axios.get(`http://${testHttps01ChallengeHost}:${httpPort}/.well-known/acme-challenge/${testHttps01ChallengeToken}`, { httpsAgent });\n            const r2 = await axios.get(`https://${testHttps01ChallengeHost}:${httpsPort}/.well-known/acme-challenge/${testHttps01ChallengeToken}`, { httpsAgent });\n\n            [r1, r2].forEach((resp) => {\n                assert.isString(resp.data);\n                assert.strictEqual(resp.data, testHttps01ChallengeContent);\n            });\n        });\n    });\n\n    /**\n     * DNS-01 challenge response\n     */\n\n    describe('dns-01', () => {\n        it('should not locate challenge response', async () => {\n            await assert.isRejected(dns.resolveTxt(testDns01ChallengeHost));\n        });\n\n        it('should add challenge response', async () => {\n            const resp = await cts.addDns01ChallengeResponse(testDns01ChallengeHost, testDns01ChallengeValue);\n            assert.isTrue(resp);\n        });\n\n        it('should locate challenge response', async () => {\n            const resp = await dns.resolveTxt(testDns01ChallengeHost);\n\n            assert.isArray(resp);\n            assert.deepStrictEqual(resp, [[testDns01ChallengeValue]]);\n        });\n    });\n\n    /**\n     * TLS-ALPN-01 challenge response\n     */\n\n    describe('tls-alpn-01', () => {\n        it('should not locate challenge response', async () => {\n            await assert.isRejected(retrieveTlsAlpnCertificate(testTlsAlpn01ChallengeHost, tlsAlpnPort), /(failed to retrieve)|(ssl3_read_bytes:tlsv1 alert internal error)/);\n        });\n\n        it('should timeout challenge response', async () => {\n            await assert.isRejected(retrieveTlsAlpnCertificate('example.org', tlsAlpnPort, 500));\n        });\n\n        it('should add challenge response', async () => {\n            const resp = await cts.addTlsAlpn01ChallengeResponse(testTlsAlpn01ChallengeHost, testTlsAlpn01ChallengeValue);\n            assert.isTrue(resp);\n        });\n\n        it('should locate challenge response', async () => {\n            const resp = await retrieveTlsAlpnCertificate(testTlsAlpn01ChallengeHost, tlsAlpnPort);\n            assert.isTrue(isAlpnCertificateAuthorizationValid(resp, testTlsAlpn01ChallengeValue));\n        });\n    });\n});\n"
  },
  {
    "path": "packages/core/acme-client/test/10-http.spec.js",
    "content": "/**\n * HTTP client tests\n */\n\nconst { randomUUID: uuid } = require('crypto');\nconst { assert } = require('chai');\nconst nock = require('nock');\nconst axios = require('./../src/axios');\nconst HttpClient = require('./../src/http');\nconst pkg = require('./../package.json');\n\ndescribe('http', () => {\n    let testClient;\n\n    const endpoint = `http://${uuid()}.example.com`;\n    const defaultUserAgent = `node-${pkg.name}/${pkg.version}`;\n    const customUserAgent = 'custom-ua-123';\n\n    afterEach(() => {\n        nock.cleanAll();\n    });\n\n    /**\n     * Initialize\n     */\n\n    it('should initialize clients', () => {\n        testClient = new HttpClient();\n    });\n\n    /**\n     * HTTP verbs\n     */\n\n    it('should http get', async () => {\n        nock(endpoint).get('/').reply(200, 'ok');\n        const resp = await testClient.request(endpoint, 'get');\n\n        assert.isObject(resp);\n        assert.strictEqual(resp.status, 200);\n        assert.strictEqual(resp.data, 'ok');\n    });\n\n    /**\n     * User-Agent\n     */\n\n    it('should request using default user-agent', async () => {\n        nock(endpoint).matchHeader('user-agent', defaultUserAgent).get('/').reply(200, 'ok');\n        axios.defaults.headers.common['User-Agent'] = defaultUserAgent;\n        const resp = await testClient.request(endpoint, 'get');\n\n        assert.isObject(resp);\n        assert.strictEqual(resp.status, 200);\n        assert.strictEqual(resp.data, 'ok');\n    });\n\n    it('should reject using custom user-agent', async () => {\n        nock(endpoint).matchHeader('user-agent', defaultUserAgent).get('/').reply(200, 'ok');\n        axios.defaults.headers.common['User-Agent'] = customUserAgent;\n        await assert.isRejected(testClient.request(endpoint, 'get'));\n    });\n\n    it('should request using custom user-agent', async () => {\n        nock(endpoint).matchHeader('user-agent', customUserAgent).get('/').reply(200, 'ok');\n        axios.defaults.headers.common['User-Agent'] = customUserAgent;\n        const resp = await testClient.request(endpoint, 'get');\n\n        assert.isObject(resp);\n        assert.strictEqual(resp.status, 200);\n        assert.strictEqual(resp.data, 'ok');\n    });\n\n    it('should reject using default user-agent', async () => {\n        nock(endpoint).matchHeader('user-agent', customUserAgent).get('/').reply(200, 'ok');\n        axios.defaults.headers.common['User-Agent'] = defaultUserAgent;\n        await assert.isRejected(testClient.request(endpoint, 'get'));\n    });\n\n    /**\n     * Retry on HTTP errors\n     */\n\n    it('should retry on 429 rate limit', async () => {\n        let rateLimitCount = 0;\n\n        nock(endpoint).persist().get('/').reply(() => {\n            rateLimitCount += 1;\n\n            if (rateLimitCount < 3) {\n                return [429, 'Rate Limit Exceeded', { 'Retry-After': 1 }];\n            }\n\n            return [200, 'ok'];\n        });\n\n        assert.strictEqual(rateLimitCount, 0);\n        const resp = await testClient.request(endpoint, 'get');\n\n        assert.isObject(resp);\n        assert.strictEqual(resp.status, 200);\n        assert.strictEqual(resp.data, 'ok');\n        assert.strictEqual(rateLimitCount, 3);\n    });\n\n    it('should retry on 5xx server error', async () => {\n        let serverErrorCount = 0;\n\n        nock(endpoint).persist().get('/').reply(() => {\n            serverErrorCount += 1;\n            return [500, 'Internal Server Error', { 'Retry-After': 1 }];\n        });\n\n        assert.strictEqual(serverErrorCount, 0);\n        const resp = await testClient.request(endpoint, 'get');\n\n        assert.isObject(resp);\n        assert.strictEqual(resp.status, 500);\n        assert.strictEqual(serverErrorCount, 4);\n    });\n});\n"
  },
  {
    "path": "packages/core/acme-client/test/10-logger.spec.js",
    "content": "/**\n * Logger tests\n */\n\nconst { assert } = require('chai');\nconst logger = require('./../src/logger');\n\ndescribe('logger', () => {\n    let lastLogMessage = null;\n\n    function customLoggerFn(msg) {\n        lastLogMessage = msg;\n    }\n\n    /**\n     * Logger\n     */\n\n    it('should log without custom logger', () => {\n        logger.log('something');\n        assert.isNull(lastLogMessage);\n    });\n\n    it('should log with custom logger', () => {\n        logger.setLogger(customLoggerFn);\n\n        ['abc123', 'def456', 'ghi789'].forEach((m) => {\n            logger.log(m);\n            assert.strictEqual(lastLogMessage, m);\n        });\n    });\n});\n"
  },
  {
    "path": "packages/core/acme-client/test/10-util.spec.js",
    "content": "/**\n * Utility method tests\n */\n\nconst dns = require('dns').promises;\nconst fs = require('fs').promises;\nconst path = require('path');\nconst { assert } = require('chai');\nconst util = require('./../src/util');\nconst { readCertificateInfo } = require('./../src/crypto');\n\ndescribe('util', () => {\n    const testCertPath1 = path.join(__dirname, 'fixtures', 'certificate.crt');\n    const testCertPath2 = path.join(__dirname, 'fixtures', 'letsencrypt.crt');\n\n    it('retry()', async () => {\n        let attempts = 0;\n        const backoffOpts = {\n            min: 100,\n            max: 500,\n        };\n\n        await assert.isRejected(util.retry(() => {\n            throw new Error('oops');\n        }, backoffOpts));\n\n        const r = await util.retry(() => {\n            attempts += 1;\n\n            if (attempts < 3) {\n                throw new Error('oops');\n            }\n\n            return 'abc';\n        }, backoffOpts);\n\n        assert.strictEqual(r, 'abc');\n        assert.strictEqual(attempts, 3);\n    });\n\n    it('parseLinkHeader()', () => {\n        const r1 = util.parseLinkHeader('<https://example.com/a>;rel=\"alternate\"');\n        assert.isArray(r1);\n        assert.strictEqual(r1.length, 1);\n        assert.strictEqual(r1[0], 'https://example.com/a');\n\n        const r2 = util.parseLinkHeader('<https://example.com/b>;rel=\"test\"');\n        assert.isArray(r2);\n        assert.strictEqual(r2.length, 0);\n\n        const r3 = util.parseLinkHeader('<http://example.com/c>; rel=\"test\"', 'test');\n        assert.isArray(r3);\n        assert.strictEqual(r3.length, 1);\n        assert.strictEqual(r3[0], 'http://example.com/c');\n\n        const r4 = util.parseLinkHeader(`<https://example.com/a>; rel=\"alternate\",\n            <https://example.com/x>; rel=\"nope\",\n            <https://example.com/b>;rel=\"alternate\",\n            <https://example.com/c>;   rel=\"alternate\"`);\n        assert.isArray(r4);\n        assert.strictEqual(r4.length, 3);\n        assert.strictEqual(r4[0], 'https://example.com/a');\n        assert.strictEqual(r4[1], 'https://example.com/b');\n        assert.strictEqual(r4[2], 'https://example.com/c');\n    });\n\n    it('parseRetryAfterHeader()', () => {\n        const r1 = util.parseRetryAfterHeader('');\n        assert.strictEqual(r1, 0);\n\n        const r2 = util.parseRetryAfterHeader('abcdef');\n        assert.strictEqual(r2, 0);\n\n        const r3 = util.parseRetryAfterHeader('123');\n        assert.strictEqual(r3, 123);\n\n        const r4 = util.parseRetryAfterHeader('123.456');\n        assert.strictEqual(r4, 123);\n\n        const r5 = util.parseRetryAfterHeader('-555');\n        assert.strictEqual(r5, 0);\n\n        const r6 = util.parseRetryAfterHeader('Wed, 21 Oct 2015 07:28:00 GMT');\n        assert.strictEqual(r6, 0);\n\n        const now = new Date();\n        const future = new Date(now.getTime() + 123000);\n        const r7 = util.parseRetryAfterHeader(future.toUTCString());\n        assert.isTrue(r7 > 100);\n    });\n\n    it('findCertificateChainForIssuer()', async () => {\n        const certs = [\n            (await fs.readFile(testCertPath1)).toString(),\n            (await fs.readFile(testCertPath2)).toString(),\n        ];\n\n        const r1 = util.findCertificateChainForIssuer(certs, 'abc123');\n        const r2 = util.findCertificateChainForIssuer(certs, 'example.com');\n        const r3 = util.findCertificateChainForIssuer(certs, 'E6');\n\n        [r1, r2, r3].forEach((r) => {\n            assert.isString(r);\n            assert.isNotEmpty(r);\n        });\n\n        assert.strictEqual(readCertificateInfo(r1).issuer.commonName, 'example.com');\n        assert.strictEqual(readCertificateInfo(r2).issuer.commonName, 'example.com');\n        assert.strictEqual(readCertificateInfo(r3).issuer.commonName, 'E6');\n    });\n\n    it('formatResponseError()', () => {\n        const e1 = util.formatResponseError({ data: { error: 'aaa' } });\n        assert.strictEqual(e1, 'aaa');\n\n        const e2 = util.formatResponseError({ data: { error: { detail: 'bbb' } } });\n        assert.strictEqual(e2, 'bbb');\n\n        const e3 = util.formatResponseError({ data: { detail: 'ccc' } });\n        assert.strictEqual(e3, 'ccc');\n\n        const e4 = util.formatResponseError({ data: { a: 123 } });\n        assert.strictEqual(e4, '{\"a\":123}');\n\n        const e5 = util.formatResponseError({});\n        assert.isString(e5);\n        assert.isEmpty(e5);\n    });\n\n    it('getAuthoritativeDnsResolver()', async () => {\n        /* valid domain - should not use global default */\n        const r1 = await util.getAuthoritativeDnsResolver('example.com');\n        assert.instanceOf(r1, dns.Resolver);\n        assert.isNotEmpty(r1.getServers());\n        assert.notDeepEqual(r1.getServers(), dns.getServers());\n\n        /* invalid domain - fallback to global default */\n        const r2 = await util.getAuthoritativeDnsResolver('invalid.xtldx');\n        assert.instanceOf(r2, dns.Resolver);\n        assert.deepStrictEqual(r2.getServers(), dns.getServers());\n    });\n\n    /* TODO: Figure out how to test this */\n    it('retrieveTlsAlpnCertificate()');\n});\n"
  },
  {
    "path": "packages/core/acme-client/test/10-verify.spec.js",
    "content": "/**\n * Challenge verification tests\n */\n\nconst { randomUUID: uuid } = require('crypto');\nconst { assert } = require('chai');\nconst cts = require('./challtestsrv');\nconst verify = require('./../src/verify');\n\nconst domainName = process.env.ACME_DOMAIN_NAME || 'example.com';\n\ndescribe('verify', () => {\n    const challengeTypes = ['http-01', 'dns-01'];\n\n    const testHttp01Authz = { identifier: { type: 'dns', value: `${uuid()}.${domainName}` } };\n    const testHttp01Challenge = { type: 'http-01', status: 'pending', token: uuid() };\n    const testHttp01Key = uuid();\n\n    const testHttps01Authz = { identifier: { type: 'dns', value: `${uuid()}.${domainName}` } };\n    const testHttps01Challenge = { type: 'http-01', status: 'pending', token: uuid() };\n    const testHttps01Key = uuid();\n\n    const testDns01Authz = { identifier: { type: 'dns', value: `${uuid()}.${domainName}` } };\n    const testDns01Challenge = { type: 'dns-01', status: 'pending', token: uuid() };\n    const testDns01Key = uuid();\n    const testDns01Cname = `${uuid()}.${domainName}`;\n\n    const testTlsAlpn01Authz = { identifier: { type: 'dns', value: `${uuid()}.${domainName}` } };\n    const testTlsAlpn01Challenge = { type: 'dns-01', status: 'pending', token: uuid() };\n    const testTlsAlpn01Key = uuid();\n\n    /**\n     * Pebble CTS required\n     */\n\n    before(function () {\n        if (!cts.isEnabled()) {\n            this.skip();\n        }\n    });\n\n    /**\n     * API\n     */\n\n    it('should expose verification api', async () => {\n        assert.containsAllKeys(verify, challengeTypes);\n    });\n\n    /**\n     * http-01\n     */\n\n    describe('http-01', () => {\n        it('should reject challenge', async () => {\n            await assert.isRejected(verify['http-01'](testHttp01Authz, testHttp01Challenge, testHttp01Key));\n        });\n\n        it('should mock challenge response', async () => {\n            const resp = await cts.addHttp01ChallengeResponse(testHttp01Challenge.token, testHttp01Key);\n            assert.isTrue(resp);\n        });\n\n        it('should verify challenge', async () => {\n            const resp = await verify['http-01'](testHttp01Authz, testHttp01Challenge, testHttp01Key);\n            assert.isTrue(resp);\n        });\n\n        it('should mock challenge response with trailing newline', async () => {\n            const resp = await cts.addHttp01ChallengeResponse(testHttp01Challenge.token, `${testHttp01Key}\\n`);\n            assert.isTrue(resp);\n        });\n\n        it('should verify challenge with trailing newline', async () => {\n            const resp = await verify['http-01'](testHttp01Authz, testHttp01Challenge, testHttp01Key);\n            assert.isTrue(resp);\n        });\n    });\n\n    /**\n     * https-01\n     */\n\n    describe('https-01', () => {\n        it('should reject challenge', async () => {\n            await assert.isRejected(verify['http-01'](testHttps01Authz, testHttps01Challenge, testHttps01Key));\n        });\n\n        it('should mock challenge response', async () => {\n            const resp = await cts.addHttps01ChallengeResponse(testHttps01Challenge.token, testHttps01Key, testHttps01Authz.identifier.value);\n            assert.isTrue(resp);\n        });\n\n        it('should verify challenge', async () => {\n            const resp = await verify['http-01'](testHttps01Authz, testHttps01Challenge, testHttps01Key);\n            assert.isTrue(resp);\n        });\n    });\n\n    /**\n     * dns-01\n     */\n\n    describe('dns-01', () => {\n        it('should reject challenge', async () => {\n            await assert.isRejected(verify['dns-01'](testDns01Authz, testDns01Challenge, testDns01Key));\n        });\n\n        it('should mock challenge response', async () => {\n            const resp = await cts.addDns01ChallengeResponse(`_acme-challenge.${testDns01Authz.identifier.value}.`, testDns01Key);\n            assert.isTrue(resp);\n        });\n\n        it('should add cname to challenge response', async () => {\n            const resp = await cts.setDnsCnameRecord(testDns01Cname, `_acme-challenge.${testDns01Authz.identifier.value}.`);\n            assert.isTrue(resp);\n        });\n\n        it('should verify challenge', async () => {\n            const resp = await verify['dns-01'](testDns01Authz, testDns01Challenge, testDns01Key);\n            assert.isTrue(resp);\n        });\n\n        it('should verify challenge using cname', async () => {\n            const resp = await verify['dns-01'](testDns01Authz, testDns01Challenge, testDns01Key);\n            assert.isTrue(resp);\n        });\n    });\n\n    /**\n     * tls-alpn-01\n     */\n\n    describe('tls-alpn-01', () => {\n        it('should reject challenge', async () => {\n            await assert.isRejected(verify['tls-alpn-01'](testTlsAlpn01Authz, testTlsAlpn01Challenge, testTlsAlpn01Key));\n        });\n\n        it('should mock challenge response', async () => {\n            const resp = await cts.addTlsAlpn01ChallengeResponse(testTlsAlpn01Authz.identifier.value, testTlsAlpn01Key);\n            assert.isTrue(resp);\n        });\n\n        it('should verify challenge', async () => {\n            const resp = await verify['tls-alpn-01'](testTlsAlpn01Authz, testTlsAlpn01Challenge, testTlsAlpn01Key);\n            assert.isTrue(resp);\n        });\n    });\n});\n"
  },
  {
    "path": "packages/core/acme-client/test/20-crypto-legacy.spec.js",
    "content": "/**\n * Legacy crypto tests\n */\n\nconst fs = require('fs').promises;\nconst path = require('path');\nconst { assert } = require('chai');\nconst spec = require('./spec');\nconst forge = require('./../src/crypto/forge');\n\nconst cryptoEngines = {\n    forge,\n};\n\ndescribe('crypto-legacy', () => {\n    let testPemKey;\n    let testCert;\n    let testSanCert;\n\n    const modulusStore = [];\n    const exponentStore = [];\n    const publicKeyStore = [];\n\n    const testCsrDomain = 'example.com';\n    const testSanCsrDomains = ['example.com', 'test.example.com', 'abc.example.com'];\n    const testKeyPath = path.join(__dirname, 'fixtures', 'private.key');\n    const testCertPath = path.join(__dirname, 'fixtures', 'certificate.crt');\n    const testSanCertPath = path.join(__dirname, 'fixtures', 'san-certificate.crt');\n\n    /**\n     * Fixtures\n     */\n\n    describe('fixtures', () => {\n        it('should read private key fixture', async () => {\n            testPemKey = await fs.readFile(testKeyPath);\n            assert.isTrue(Buffer.isBuffer(testPemKey));\n        });\n\n        it('should read certificate fixture', async () => {\n            testCert = await fs.readFile(testCertPath);\n            assert.isTrue(Buffer.isBuffer(testCert));\n        });\n\n        it('should read san certificate fixture', async () => {\n            testSanCert = await fs.readFile(testSanCertPath);\n            assert.isTrue(Buffer.isBuffer(testSanCert));\n        });\n    });\n\n    /**\n     * Engines\n     */\n\n    Object.entries(cryptoEngines).forEach(([name, engine]) => {\n        describe(`engine/${name}`, () => {\n            let testCsr;\n            let testSanCsr;\n            let testNonCnCsr;\n            let testNonAsciiCsr;\n\n            /**\n             * Key generation\n             */\n\n            it('should generate a private key', async () => {\n                const key = await engine.createPrivateKey();\n                assert.isTrue(Buffer.isBuffer(key));\n            });\n\n            it('should generate a private key with size=1024', async () => {\n                const key = await engine.createPrivateKey(1024);\n                assert.isTrue(Buffer.isBuffer(key));\n            });\n\n            it('should generate a public key', async () => {\n                const key = await engine.createPublicKey(testPemKey);\n                assert.isTrue(Buffer.isBuffer(key));\n                publicKeyStore.push(key.toString().replace(/[\\r\\n]/gm, ''));\n            });\n\n            /**\n             * Certificate Signing Request\n             */\n\n            it('should generate a csr', async () => {\n                const [key, csr] = await engine.createCsr({\n                    commonName: testCsrDomain,\n                });\n\n                assert.isTrue(Buffer.isBuffer(key));\n                assert.isTrue(Buffer.isBuffer(csr));\n\n                testCsr = csr;\n            });\n\n            it('should generate a san csr', async () => {\n                const [key, csr] = await engine.createCsr({\n                    commonName: testSanCsrDomains[0],\n                    altNames: testSanCsrDomains.slice(1, testSanCsrDomains.length),\n                });\n\n                assert.isTrue(Buffer.isBuffer(key));\n                assert.isTrue(Buffer.isBuffer(csr));\n\n                testSanCsr = csr;\n            });\n\n            it('should generate a csr without common name', async () => {\n                const [key, csr] = await engine.createCsr({\n                    altNames: testSanCsrDomains,\n                });\n\n                assert.isTrue(Buffer.isBuffer(key));\n                assert.isTrue(Buffer.isBuffer(csr));\n\n                testNonCnCsr = csr;\n            });\n\n            it('should generate a non-ascii csr', async () => {\n                const [key, csr] = await engine.createCsr({\n                    commonName: testCsrDomain,\n                    organization: '大安區',\n                    organizationUnit: '中文部門',\n                });\n\n                assert.isTrue(Buffer.isBuffer(key));\n                assert.isTrue(Buffer.isBuffer(csr));\n\n                testNonAsciiCsr = csr;\n            });\n\n            it('should resolve domains from csr', async () => {\n                const result = await engine.readCsrDomains(testCsr);\n\n                spec.crypto.csrDomains(result);\n                assert.strictEqual(result.commonName, testCsrDomain);\n                assert.deepStrictEqual(result.altNames, [testCsrDomain]);\n            });\n\n            it('should resolve domains from san csr', async () => {\n                const result = await engine.readCsrDomains(testSanCsr);\n\n                spec.crypto.csrDomains(result);\n                assert.strictEqual(result.commonName, testSanCsrDomains[0]);\n                assert.deepStrictEqual(result.altNames, testSanCsrDomains);\n            });\n\n            it('should resolve domains from san without common name', async () => {\n                const result = await engine.readCsrDomains(testNonCnCsr);\n\n                spec.crypto.csrDomains(result);\n                assert.isNull(result.commonName);\n                assert.deepStrictEqual(result.altNames, testSanCsrDomains);\n            });\n\n            it('should resolve domains from non-ascii csr', async () => {\n                const result = await engine.readCsrDomains(testNonAsciiCsr);\n\n                spec.crypto.csrDomains(result);\n                assert.strictEqual(result.commonName, testCsrDomain);\n                assert.deepStrictEqual(result.altNames, [testCsrDomain]);\n            });\n\n            /**\n             * Certificate\n             */\n\n            it('should read info from certificate', async () => {\n                const info = await engine.readCertificateInfo(testCert);\n\n                spec.crypto.certificateInfo(info);\n                assert.strictEqual(info.domains.commonName, testCsrDomain);\n                assert.strictEqual(info.domains.altNames.length, 0);\n            });\n\n            it('should read info from san certificate', async () => {\n                const info = await engine.readCertificateInfo(testSanCert);\n\n                spec.crypto.certificateInfo(info);\n                assert.strictEqual(info.domains.commonName, testSanCsrDomains[0]);\n                assert.deepEqual(info.domains.altNames, testSanCsrDomains.slice(1, testSanCsrDomains.length));\n            });\n\n            /**\n             * PEM utils\n             */\n\n            it('should get pem body', () => {\n                [testPemKey, testCert, testSanCert].forEach((pem) => {\n                    const body = engine.getPemBody(pem);\n\n                    assert.isString(body);\n                    assert.notInclude(body, '\\r');\n                    assert.notInclude(body, '\\n');\n                    assert.notInclude(body, '\\r\\n');\n                });\n            });\n\n            it('should split pem chain', () => {\n                [testPemKey, testCert, testSanCert].forEach((pem) => {\n                    const chain = engine.splitPemChain(pem);\n\n                    assert.isArray(chain);\n                    assert.isNotEmpty(chain);\n                    chain.forEach((c) => assert.isString(c));\n                });\n            });\n\n            /**\n             * Modulus and exponent\n             */\n\n            it('should get modulus', async () => {\n                const result = await Promise.all([testPemKey, testCert, testSanCert].map(async (item) => {\n                    const mod = await engine.getModulus(item);\n                    assert.isTrue(Buffer.isBuffer(mod));\n\n                    return mod;\n                }));\n\n                modulusStore.push(result);\n            });\n\n            it('should get public exponent', async () => {\n                const result = await Promise.all([testPemKey, testCert, testSanCert].map(async (item) => {\n                    const exp = await engine.getPublicExponent(item);\n                    assert.isTrue(Buffer.isBuffer(exp));\n\n                    const b64exp = exp.toString('base64');\n                    assert.strictEqual(b64exp, 'AQAB');\n\n                    return b64exp;\n                }));\n\n                exponentStore.push(result);\n            });\n        });\n    });\n\n    /**\n     * Verify identical results\n     */\n\n    describe('verification', () => {\n        it('should have identical public keys', () => {\n            if (publicKeyStore.length > 1) {\n                const reference = publicKeyStore.shift();\n                publicKeyStore.forEach((item) => assert.strictEqual(reference, item));\n            }\n        });\n\n        it('should have identical moduli', () => {\n            if (modulusStore.length > 1) {\n                const reference = modulusStore.shift();\n                modulusStore.forEach((item) => assert.deepStrictEqual(reference, item));\n            }\n        });\n\n        it('should have identical public exponents', () => {\n            if (exponentStore.length > 1) {\n                const reference = exponentStore.shift();\n                exponentStore.forEach((item) => assert.deepStrictEqual(reference, item));\n            }\n        });\n    });\n});\n"
  },
  {
    "path": "packages/core/acme-client/test/20-crypto.spec.js",
    "content": "/**\n * Crypto tests\n */\n\nconst fs = require('fs').promises;\nconst path = require('path');\nconst { assert } = require('chai');\nconst spec = require('./spec');\nconst { crypto } = require('./../');\n\nconst emptyBodyChain1 = `\n-----BEGIN TEST-----\ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZw==\n-----END TEST-----\n-----BEGIN TEST-----\ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZw==\n-----END TEST-----\n\n-----BEGIN TEST-----\n\n-----END TEST-----\n\n\n-----BEGIN TEST-----\ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZw==\n-----END TEST-----\n`;\n\nconst emptyBodyChain2 = `\n\n\n-----BEGIN TEST-----\n-----END TEST-----\n-----BEGIN TEST-----\n\n\n\n-----END TEST-----\n\n-----BEGIN TEST-----\ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZw==\n-----END TEST-----\n\n\n-----BEGIN TEST-----\ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZw==\n-----END TEST-----\n-----BEGIN TEST-----\ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZ3Rlc3Rpbmd0ZXN0aW5ndGVzdGluZw==\n-----END TEST-----\n`;\n\ndescribe('crypto', () => {\n    const testCsrDomain = 'example.com';\n    const testSanCsrDomains = ['example.com', 'test.example.com', 'abc.example.com'];\n    const testKeyPath = path.join(__dirname, 'fixtures', 'private.key');\n    const testCertPath = path.join(__dirname, 'fixtures', 'certificate.crt');\n    const testSanCertPath = path.join(__dirname, 'fixtures', 'san-certificate.crt');\n\n    /**\n     * Key types\n     */\n\n    Object.entries({\n        rsa: {\n            createKeyFns: {\n                s1024: () => crypto.createPrivateRsaKey(1024),\n                s2048: () => crypto.createPrivateRsaKey(),\n                s4096: () => crypto.createPrivateRsaKey(4096),\n            },\n            jwkSpecFn: spec.jwk.rsa,\n        },\n        ecdsa: {\n            createKeyFns: {\n                p256: () => crypto.createPrivateEcdsaKey(),\n                p384: () => crypto.createPrivateEcdsaKey('P-384'),\n                p521: () => crypto.createPrivateEcdsaKey('P-521'),\n            },\n            jwkSpecFn: spec.jwk.ecdsa,\n        },\n    }).forEach(([name, { createKeyFns, jwkSpecFn }]) => {\n        describe(name, () => {\n            const testPrivateKeys = {};\n            const testPublicKeys = {};\n\n            /**\n             * Iterate through all generator variations\n             */\n\n            Object.entries(createKeyFns).forEach(([n, createFn]) => {\n                let testCsr;\n                let testSanCsr;\n                let testNonCnCsr;\n                let testNonAsciiCsr;\n                let testAlpnCertificate;\n\n                /**\n                 * Keys and JWK\n                 */\n\n                it(`${n}/should generate private key`, async () => {\n                    testPrivateKeys[n] = await createFn();\n                    assert.isTrue(Buffer.isBuffer(testPrivateKeys[n]));\n                });\n\n                it(`${n}/should get public key`, () => {\n                    testPublicKeys[n] = crypto.getPublicKey(testPrivateKeys[n]);\n                    assert.isTrue(Buffer.isBuffer(testPublicKeys[n]));\n                });\n\n                it(`${n}/should get public key from string`, () => {\n                    testPublicKeys[n] = crypto.getPublicKey(testPrivateKeys[n].toString());\n                    assert.isTrue(Buffer.isBuffer(testPublicKeys[n]));\n                });\n\n                it(`${n}/should get jwk from private key`, () => {\n                    const jwk = crypto.getJwk(testPrivateKeys[n]);\n                    jwkSpecFn(jwk);\n                });\n\n                it(`${n}/should get jwk from public key`, () => {\n                    const jwk = crypto.getJwk(testPublicKeys[n]);\n                    jwkSpecFn(jwk);\n                });\n\n                it(`${n}/should get jwk from string`, () => {\n                    const jwk = crypto.getJwk(testPrivateKeys[n].toString());\n                    jwkSpecFn(jwk);\n                });\n\n                /**\n                 * Certificate Signing Request\n                 */\n\n                it(`${n}/should generate a csr`, async () => {\n                    const [key, csr] = await crypto.createCsr({\n                        commonName: testCsrDomain,\n                    }, testPrivateKeys[n]);\n\n                    assert.isTrue(Buffer.isBuffer(key));\n                    assert.isTrue(Buffer.isBuffer(csr));\n\n                    testCsr = csr;\n                });\n\n                it(`${n}/should generate a san csr`, async () => {\n                    const [key, csr] = await crypto.createCsr({\n                        commonName: testSanCsrDomains[0],\n                        altNames: testSanCsrDomains.slice(1, testSanCsrDomains.length),\n                    }, testPrivateKeys[n]);\n\n                    assert.isTrue(Buffer.isBuffer(key));\n                    assert.isTrue(Buffer.isBuffer(csr));\n\n                    testSanCsr = csr;\n                });\n\n                it(`${n}/should generate a csr without common name`, async () => {\n                    const [key, csr] = await crypto.createCsr({\n                        altNames: testSanCsrDomains,\n                    }, testPrivateKeys[n]);\n\n                    assert.isTrue(Buffer.isBuffer(key));\n                    assert.isTrue(Buffer.isBuffer(csr));\n\n                    testNonCnCsr = csr;\n                });\n\n                it(`${n}/should generate a non-ascii csr`, async () => {\n                    const [key, csr] = await crypto.createCsr({\n                        commonName: testCsrDomain,\n                        organization: '大安區',\n                        organizationUnit: '中文部門',\n                    }, testPrivateKeys[n]);\n\n                    assert.isTrue(Buffer.isBuffer(key));\n                    assert.isTrue(Buffer.isBuffer(csr));\n\n                    testNonAsciiCsr = csr;\n                });\n\n                it(`${n}/should generate a csr with key as string`, async () => {\n                    const [key, csr] = await crypto.createCsr({\n                        commonName: testCsrDomain,\n                    }, testPrivateKeys[n].toString());\n\n                    assert.isTrue(Buffer.isBuffer(key));\n                    assert.isTrue(Buffer.isBuffer(csr));\n                });\n\n                it(`${n}/should throw with invalid key`, async () => {\n                    await assert.isRejected(crypto.createCsr({\n                        commonName: testCsrDomain,\n                    }, testPublicKeys[n]));\n                });\n\n                /**\n                 * Domain and info resolver\n                 */\n\n                it(`${n}/should resolve domains from csr`, () => {\n                    const result = crypto.readCsrDomains(testCsr);\n\n                    spec.crypto.csrDomains(result);\n                    assert.strictEqual(result.commonName, testCsrDomain);\n                    assert.deepStrictEqual(result.altNames, [testCsrDomain]);\n                });\n\n                it(`${n}/should resolve domains from san csr`, () => {\n                    const result = crypto.readCsrDomains(testSanCsr);\n\n                    spec.crypto.csrDomains(result);\n                    assert.strictEqual(result.commonName, testSanCsrDomains[0]);\n                    assert.deepStrictEqual(result.altNames, testSanCsrDomains);\n                });\n\n                it(`${n}/should resolve domains from csr without common name`, () => {\n                    const result = crypto.readCsrDomains(testNonCnCsr);\n\n                    spec.crypto.csrDomains(result);\n                    assert.isNull(result.commonName);\n                    assert.deepStrictEqual(result.altNames, testSanCsrDomains);\n                });\n\n                it(`${n}/should resolve domains from non-ascii csr`, () => {\n                    const result = crypto.readCsrDomains(testNonAsciiCsr);\n\n                    spec.crypto.csrDomains(result);\n                    assert.strictEqual(result.commonName, testCsrDomain);\n                    assert.deepStrictEqual(result.altNames, [testCsrDomain]);\n                });\n\n                it(`${n}/should resolve domains from csr string`, () => {\n                    [testCsr, testSanCsr, testNonCnCsr, testNonAsciiCsr].forEach((csr) => {\n                        const result = crypto.readCsrDomains(csr.toString());\n                        spec.crypto.csrDomains(result);\n                    });\n                });\n\n                /**\n                 * ALPN\n                 */\n\n                it(`${n}/should generate alpn certificate`, async () => {\n                    const authz = { identifier: { value: 'test.example.com' } };\n                    const [key, cert] = await crypto.createAlpnCertificate(authz, 'super-secret.12345', await createFn());\n\n                    assert.isTrue(Buffer.isBuffer(key));\n                    assert.isTrue(Buffer.isBuffer(cert));\n\n                    testAlpnCertificate = cert;\n                });\n\n                it(`${n}/should generate alpn certificate with key as string`, async () => {\n                    const k = await createFn();\n                    const authz = { identifier: { value: 'test.example.com' } };\n                    const [key, cert] = await crypto.createAlpnCertificate(authz, 'super-secret.12345', k.toString());\n\n                    assert.isTrue(Buffer.isBuffer(key));\n                    assert.isTrue(Buffer.isBuffer(cert));\n                });\n\n                it(`${n}/should not validate invalid alpn certificate key authorization`, () => {\n                    assert.isFalse(crypto.isAlpnCertificateAuthorizationValid(testAlpnCertificate, 'aaaaaaa'));\n                    assert.isFalse(crypto.isAlpnCertificateAuthorizationValid(testAlpnCertificate, 'bbbbbbb'));\n                    assert.isFalse(crypto.isAlpnCertificateAuthorizationValid(testAlpnCertificate, 'ccccccc'));\n                });\n\n                it(`${n}/should validate valid alpn certificate key authorization`, () => {\n                    assert.isTrue(crypto.isAlpnCertificateAuthorizationValid(testAlpnCertificate, 'super-secret.12345'));\n                });\n\n                it(`${n}/should validate valid alpn certificate with cert as string`, () => {\n                    assert.isTrue(crypto.isAlpnCertificateAuthorizationValid(testAlpnCertificate.toString(), 'super-secret.12345'));\n                });\n            });\n        });\n    });\n\n    /**\n     * Common functionality\n     */\n\n    describe('common', () => {\n        let testPemKey;\n        let testCert;\n        let testSanCert;\n\n        it('should read private key fixture', async () => {\n            testPemKey = await fs.readFile(testKeyPath);\n            assert.isTrue(Buffer.isBuffer(testPemKey));\n        });\n\n        it('should read certificate fixture', async () => {\n            testCert = await fs.readFile(testCertPath);\n            assert.isTrue(Buffer.isBuffer(testCert));\n        });\n\n        it('should read san certificate fixture', async () => {\n            testSanCert = await fs.readFile(testSanCertPath);\n            assert.isTrue(Buffer.isBuffer(testSanCert));\n        });\n\n        /**\n         * CSR with auto-generated key\n         */\n\n        it('should generate a csr with default key', async () => {\n            const [key, csr] = await crypto.createCsr({\n                commonName: testCsrDomain,\n            });\n\n            assert.isTrue(Buffer.isBuffer(key));\n            assert.isTrue(Buffer.isBuffer(csr));\n        });\n\n        /**\n         * Certificate\n         */\n\n        it('should read certificate info', () => {\n            const info = crypto.readCertificateInfo(testCert);\n\n            spec.crypto.certificateInfo(info);\n            assert.strictEqual(info.domains.commonName, testCsrDomain);\n            assert.strictEqual(info.domains.altNames.length, 0);\n        });\n\n        it('should read certificate info with san', () => {\n            const info = crypto.readCertificateInfo(testSanCert);\n\n            spec.crypto.certificateInfo(info);\n            assert.strictEqual(info.domains.commonName, testSanCsrDomains[0]);\n            assert.deepEqual(info.domains.altNames, testSanCsrDomains.slice(1, testSanCsrDomains.length));\n        });\n\n        it('should read certificate info from string', () => {\n            [testCert, testSanCert].forEach((cert) => {\n                const info = crypto.readCertificateInfo(cert.toString());\n                spec.crypto.certificateInfo(info);\n            });\n        });\n\n        /**\n         * ALPN\n         */\n\n        it('should generate alpn certificate with default key', async () => {\n            const authz = { identifier: { value: 'test.example.com' } };\n            const [key, cert] = await crypto.createAlpnCertificate(authz, 'abc123');\n\n            assert.isTrue(Buffer.isBuffer(key));\n            assert.isTrue(Buffer.isBuffer(cert));\n        });\n\n        /**\n         * PEM utils\n         */\n\n        it('should get pem body as b64u', () => {\n            [testPemKey, testCert, testSanCert].forEach((pem) => {\n                const body = crypto.getPemBodyAsB64u(pem);\n\n                assert.isString(body);\n                assert.notInclude(body, '\\r');\n                assert.notInclude(body, '\\n');\n                assert.notInclude(body, '\\r\\n');\n            });\n        });\n\n        it('should get pem body as b64u from string', () => {\n            [testPemKey, testCert, testSanCert].forEach((pem) => {\n                const body = crypto.getPemBodyAsB64u(pem.toString());\n\n                assert.isString(body);\n                assert.notInclude(body, '\\r');\n                assert.notInclude(body, '\\n');\n                assert.notInclude(body, '\\r\\n');\n            });\n        });\n\n        it('should split pem chain', () => {\n            [testPemKey, testCert, testSanCert].forEach((pem) => {\n                const chain = crypto.splitPemChain(pem);\n\n                assert.isArray(chain);\n                assert.isNotEmpty(chain);\n                chain.forEach((c) => assert.isString(c));\n            });\n        });\n\n        it('should split pem chain from string', () => {\n            [testPemKey, testCert, testSanCert].forEach((pem) => {\n                const chain = crypto.splitPemChain(pem.toString());\n\n                assert.isArray(chain);\n                assert.isNotEmpty(chain);\n                chain.forEach((c) => assert.isString(c));\n            });\n        });\n\n        it('should split pem chain with empty bodies', () => {\n            const c1 = crypto.splitPemChain(emptyBodyChain1);\n            const c2 = crypto.splitPemChain(emptyBodyChain2);\n\n            assert.strictEqual(c1.length, 3);\n            assert.strictEqual(c2.length, 3);\n        });\n    });\n});\n"
  },
  {
    "path": "packages/core/acme-client/test/50-client.spec.js",
    "content": "/**\n * ACME client tests\n */\n\nconst { randomUUID: uuid } = require('crypto');\nconst { assert } = require('chai');\nconst cts = require('./challtestsrv');\nconst getCertIssuers = require('./get-cert-issuers');\nconst spec = require('./spec');\nconst acme = require('./../');\n\nconst domainName = process.env.ACME_DOMAIN_NAME || 'example.com';\nconst directoryUrl = process.env.ACME_DIRECTORY_URL || acme.directory.letsencrypt.staging;\nconst capEabEnabled = (('ACME_CAP_EAB_ENABLED' in process.env) && (process.env.ACME_CAP_EAB_ENABLED === '1'));\nconst capMetaTosField = !(('ACME_CAP_META_TOS_FIELD' in process.env) && (process.env.ACME_CAP_META_TOS_FIELD === '0'));\nconst capUpdateAccountKey = !(('ACME_CAP_UPDATE_ACCOUNT_KEY' in process.env) && (process.env.ACME_CAP_UPDATE_ACCOUNT_KEY === '0'));\nconst capAlternateCertRoots = !(('ACME_CAP_ALTERNATE_CERT_ROOTS' in process.env) && (process.env.ACME_CAP_ALTERNATE_CERT_ROOTS === '0'));\n\nconst clientOpts = {\n    directoryUrl,\n    backoffAttempts: 5,\n    backoffMin: 1000,\n    backoffMax: 5000,\n};\n\nif (capEabEnabled && process.env.ACME_EAB_KID && process.env.ACME_EAB_HMAC_KEY) {\n    clientOpts.externalAccountBinding = {\n        kid: process.env.ACME_EAB_KID,\n        hmacKey: process.env.ACME_EAB_HMAC_KEY,\n    };\n}\n\ndescribe('client', () => {\n    const testDomain = `${uuid()}.${domainName}`;\n    const testDomainAlpn = `${uuid()}.${domainName}`;\n    const testDomainWildcard = `*.${testDomain}`;\n    const testContact = `mailto:test-${uuid()}@nope.com`;\n\n    /**\n     * Pebble CTS required\n     */\n\n    before(function () {\n        if (!cts.isEnabled()) {\n            this.skip();\n        }\n    });\n\n    /**\n     * Key types\n     */\n\n    Object.entries({\n        rsa: {\n            createKeyFn: () => acme.crypto.createPrivateRsaKey(),\n            createKeyAltFns: {\n                s1024: () => acme.crypto.createPrivateRsaKey(1024),\n                s4096: () => acme.crypto.createPrivateRsaKey(4096),\n            },\n            jwkSpecFn: spec.jwk.rsa,\n        },\n        ecdsa: {\n            createKeyFn: () => acme.crypto.createPrivateEcdsaKey(),\n            createKeyAltFns: {\n                p384: () => acme.crypto.createPrivateEcdsaKey('P-384'),\n                p521: () => acme.crypto.createPrivateEcdsaKey('P-521'),\n            },\n            jwkSpecFn: spec.jwk.ecdsa,\n        },\n    }).forEach(([name, { createKeyFn, createKeyAltFns, jwkSpecFn }]) => {\n        describe(name, () => {\n            let testIssuers;\n            let testAccountKey;\n            let testAccountSecondaryKey;\n            let testClient;\n            let testAccount;\n            let testAccountUrl;\n            let testOrder;\n            let testOrderAlpn;\n            let testOrderWildcard;\n            let testAuthz;\n            let testAuthzAlpn;\n            let testAuthzWildcard;\n            let testChallenge;\n            let testChallengeAlpn;\n            let testChallengeWildcard;\n            let testKeyAuthorization;\n            let testKeyAuthorizationAlpn;\n            let testKeyAuthorizationWildcard;\n            let testCsr;\n            let testCsrAlpn;\n            let testCsrWildcard;\n            let testCertificate;\n            let testCertificateAlpn;\n            let testCertificateWildcard;\n\n            /**\n             * Fixtures\n             */\n\n            it('should generate a private key', async () => {\n                testAccountKey = await createKeyFn();\n                assert.isTrue(Buffer.isBuffer(testAccountKey));\n            });\n\n            it('should create a second private key', async () => {\n                testAccountSecondaryKey = await createKeyFn();\n                assert.isTrue(Buffer.isBuffer(testAccountSecondaryKey));\n            });\n\n            it('should generate certificate signing request', async () => {\n                [, testCsr] = await acme.crypto.createCsr({ commonName: testDomain }, await createKeyFn());\n                [, testCsrAlpn] = await acme.crypto.createCsr({ altNames: [testDomainAlpn] }, await createKeyFn());\n                [, testCsrWildcard] = await acme.crypto.createCsr({ altNames: [testDomainWildcard] }, await createKeyFn());\n            });\n\n            it('should resolve certificate issuers [ACME_CAP_ALTERNATE_CERT_ROOTS]', async function () {\n                if (!capAlternateCertRoots) {\n                    this.skip();\n                }\n\n                testIssuers = await getCertIssuers();\n\n                assert.isArray(testIssuers);\n                assert.isTrue(testIssuers.length > 1);\n\n                testIssuers.forEach((i) => {\n                    assert.isString(i);\n                    assert.strictEqual(1, testIssuers.filter((c) => (c === i)).length);\n                });\n            });\n\n            /**\n             * Initialize clients\n             */\n\n            it('should initialize client', () => {\n                testClient = new acme.Client({\n                    ...clientOpts,\n                    accountKey: testAccountKey,\n                });\n            });\n\n            it('should produce a valid jwk', () => {\n                const jwk = testClient.http.getJwk();\n                jwkSpecFn(jwk);\n            });\n\n            /**\n             * Terms of Service\n             */\n\n            it('should produce tos url [ACME_CAP_META_TOS_FIELD]', async function () {\n                if (!capMetaTosField) {\n                    this.skip();\n                }\n\n                const tos = await testClient.getTermsOfServiceUrl();\n                assert.isString(tos);\n            });\n\n            it('should not produce tos url [!ACME_CAP_META_TOS_FIELD]', async function () {\n                if (capMetaTosField) {\n                    this.skip();\n                }\n\n                const tos = await testClient.getTermsOfServiceUrl();\n                assert.isNull(tos);\n            });\n\n            /**\n             * Create account\n             */\n\n            it('should refuse account creation without tos [ACME_CAP_META_TOS_FIELD]', async function () {\n                if (!capMetaTosField) {\n                    this.skip();\n                }\n\n                await assert.isRejected(testClient.createAccount());\n            });\n\n            it('should refuse account creation without eab [ACME_CAP_EAB_ENABLED]', async function () {\n                if (!capEabEnabled) {\n                    this.skip();\n                }\n\n                const client = new acme.Client({\n                    ...clientOpts,\n                    accountKey: testAccountKey,\n                    externalAccountBinding: null,\n                });\n\n                await assert.isRejected(client.createAccount({\n                    termsOfServiceAgreed: true,\n                }));\n            });\n\n            it('should create an account', async () => {\n                testAccount = await testClient.createAccount({\n                    termsOfServiceAgreed: true,\n                });\n\n                spec.rfc8555.account(testAccount);\n                assert.strictEqual(testAccount.status, 'valid');\n            });\n\n            it('should produce an account url', () => {\n                testAccountUrl = testClient.getAccountUrl();\n                assert.isString(testAccountUrl);\n            });\n\n            /**\n             * Create account with alternate key sizes\n             */\n\n            Object.entries(createKeyAltFns).forEach(([k, altKeyFn]) => {\n                it(`should create account with key=${k}`, async () => {\n                    const client = new acme.Client({\n                        ...clientOpts,\n                        accountKey: await altKeyFn(),\n                    });\n\n                    const account = await client.createAccount({\n                        termsOfServiceAgreed: true,\n                    });\n\n                    spec.rfc8555.account(account);\n                    assert.strictEqual(account.status, 'valid');\n                });\n            });\n\n            /**\n             * Find existing account using secondary client\n             */\n\n            it('should throw when trying to find account using invalid account key', async () => {\n                const client = new acme.Client({\n                    ...clientOpts,\n                    accountKey: testAccountSecondaryKey,\n                });\n\n                await assert.isRejected(client.createAccount({\n                    onlyReturnExisting: true,\n                }));\n            });\n\n            it('should find existing account using account key', async () => {\n                const client = new acme.Client({\n                    ...clientOpts,\n                    accountKey: testAccountKey,\n                });\n\n                const account = await client.createAccount({\n                    onlyReturnExisting: true,\n                });\n\n                spec.rfc8555.account(account);\n                assert.strictEqual(account.status, 'valid');\n                assert.deepStrictEqual(account.key, testAccount.key);\n            });\n\n            /**\n             * Account URL\n             */\n\n            it('should refuse invalid account url', async () => {\n                const client = new acme.Client({\n                    ...clientOpts,\n                    accountKey: testAccountKey,\n                    accountUrl: 'https://acme-staging-v02.api.letsencrypt.org/acme/acct/1',\n                });\n\n                await assert.isRejected(client.updateAccount());\n            });\n\n            it('should find existing account using account url', async () => {\n                const client = new acme.Client({\n                    ...clientOpts,\n                    accountKey: testAccountKey,\n                    accountUrl: testAccountUrl,\n                });\n\n                const account = await client.createAccount({\n                    onlyReturnExisting: true,\n                });\n\n                spec.rfc8555.account(account);\n                assert.strictEqual(account.status, 'valid');\n                assert.deepStrictEqual(account.key, testAccount.key);\n            });\n\n            /**\n             * Update account contact info\n             */\n\n            it('should update account contact info', async () => {\n                const data = { contact: [testContact] };\n                const account = await testClient.updateAccount(data);\n\n                spec.rfc8555.account(account);\n                assert.strictEqual(account.status, 'valid');\n                assert.deepStrictEqual(account.key, testAccount.key);\n                assert.isArray(account.contact);\n                assert.include(account.contact, testContact);\n            });\n\n            /**\n             * Change account private key\n             */\n\n            it('should change account private key [ACME_CAP_UPDATE_ACCOUNT_KEY]', async function () {\n                if (!capUpdateAccountKey) {\n                    this.skip();\n                }\n\n                await testClient.updateAccountKey(testAccountSecondaryKey);\n\n                const account = await testClient.createAccount({\n                    onlyReturnExisting: true,\n                });\n\n                spec.rfc8555.account(account);\n                assert.strictEqual(account.status, 'valid');\n                assert.notDeepEqual(account.key, testAccount.key);\n            });\n\n            /**\n             * Create new certificate order\n             */\n\n            it('should create new order', async () => {\n                const data1 = { identifiers: [{ type: 'dns', value: testDomain }] };\n                const data2 = { identifiers: [{ type: 'dns', value: testDomainAlpn }] };\n                const data3 = { identifiers: [{ type: 'dns', value: testDomainWildcard }] };\n\n                testOrder = await testClient.createOrder(data1);\n                testOrderAlpn = await testClient.createOrder(data2);\n                testOrderWildcard = await testClient.createOrder(data3);\n\n                [testOrder, testOrderAlpn, testOrderWildcard].forEach((item) => {\n                    spec.rfc8555.order(item);\n                    assert.strictEqual(item.status, 'pending');\n                });\n            });\n\n            /**\n             * Get status of existing certificate order\n             */\n\n            it('should get existing order', async () => {\n                await Promise.all([testOrder, testOrderAlpn, testOrderWildcard].map(async (existing) => {\n                    const result = await testClient.getOrder(existing);\n\n                    spec.rfc8555.order(result);\n                    assert.deepStrictEqual(existing, result);\n                }));\n            });\n\n            /**\n             * Get identifier authorization\n             */\n\n            it('should get identifier authorization', async () => {\n                const orderAuthzCollection = await testClient.getAuthorizations(testOrder);\n                const alpnAuthzCollection = await testClient.getAuthorizations(testOrderAlpn);\n                const wildcardAuthzCollection = await testClient.getAuthorizations(testOrderWildcard);\n\n                [orderAuthzCollection, alpnAuthzCollection, wildcardAuthzCollection].forEach((collection) => {\n                    assert.isArray(collection);\n                    assert.isNotEmpty(collection);\n\n                    collection.forEach((authz) => {\n                        spec.rfc8555.authorization(authz);\n                        assert.strictEqual(authz.status, 'pending');\n                    });\n                });\n\n                testAuthz = orderAuthzCollection.pop();\n                testAuthzAlpn = alpnAuthzCollection.pop();\n                testAuthzWildcard = wildcardAuthzCollection.pop();\n\n                testAuthz.challenges.concat(testAuthzAlpn.challenges).concat(testAuthzWildcard.challenges).forEach((item) => {\n                    spec.rfc8555.challenge(item);\n                    assert.strictEqual(item.status, 'pending');\n                });\n            });\n\n            /**\n             * Generate challenge key authorization\n             */\n\n            it('should get challenge key authorization', async () => {\n                testChallenge = testAuthz.challenges.find((c) => (c.type === 'http-01'));\n                testChallengeAlpn = testAuthzAlpn.challenges.find((c) => (c.type === 'tls-alpn-01'));\n                testChallengeWildcard = testAuthzWildcard.challenges.find((c) => (c.type === 'dns-01'));\n\n                testKeyAuthorization = await testClient.getChallengeKeyAuthorization(testChallenge);\n                testKeyAuthorizationAlpn = await testClient.getChallengeKeyAuthorization(testChallengeAlpn);\n                testKeyAuthorizationWildcard = await testClient.getChallengeKeyAuthorization(testChallengeWildcard);\n\n                [testKeyAuthorization, testKeyAuthorizationAlpn, testKeyAuthorizationWildcard].forEach((k) => assert.isString(k));\n            });\n\n            /**\n             * Deactivate identifier authorization\n             */\n\n            it('should deactivate identifier authorization', async () => {\n                const order = await testClient.createOrder({\n                    identifiers: [\n                        { type: 'dns', value: `${uuid()}.${domainName}` },\n                        { type: 'dns', value: `${uuid()}.${domainName}` },\n                    ],\n                });\n\n                const authzCollection = await testClient.getAuthorizations(order);\n\n                const results = await Promise.all(authzCollection.map(async (authz) => {\n                    spec.rfc8555.authorization(authz);\n                    assert.strictEqual(authz.status, 'pending');\n                    return testClient.deactivateAuthorization(authz);\n                }));\n\n                results.forEach((authz) => {\n                    spec.rfc8555.authorization(authz);\n                    assert.strictEqual(authz.status, 'deactivated');\n                });\n            });\n\n            /**\n             * Verify satisfied challenge\n             */\n\n            it('should verify challenge', async () => {\n                await cts.assertHttpChallengeCreateFn(testAuthz, testChallenge, testKeyAuthorization);\n                await cts.assertTlsAlpnChallengeCreateFn(testAuthzAlpn, testChallengeAlpn, testKeyAuthorizationAlpn);\n                await cts.assertDnsChallengeCreateFn(testAuthzWildcard, testChallengeWildcard, testKeyAuthorizationWildcard);\n\n                await testClient.verifyChallenge(testAuthz, testChallenge);\n                await testClient.verifyChallenge(testAuthzAlpn, testChallengeAlpn);\n                await testClient.verifyChallenge(testAuthzWildcard, testChallengeWildcard);\n            });\n\n            /**\n             * Complete challenge\n             */\n\n            it('should complete challenge', async () => {\n                await Promise.all([testChallenge, testChallengeAlpn, testChallengeWildcard].map(async (challenge) => {\n                    const result = await testClient.completeChallenge(challenge);\n\n                    spec.rfc8555.challenge(result);\n                    assert.strictEqual(challenge.url, result.url);\n                }));\n            });\n\n            /**\n             * Wait for valid challenge\n             */\n\n            it('should wait for valid challenge status', async () => {\n                await Promise.all([testChallenge, testChallengeAlpn, testChallengeWildcard].map(async (c) => testClient.waitForValidStatus(c)));\n            });\n\n            /**\n             * Finalize order\n             */\n\n            it('should finalize order', async () => {\n                const finalize = await testClient.finalizeOrder(testOrder, testCsr);\n                const finalizeAlpn = await testClient.finalizeOrder(testOrderAlpn, testCsrAlpn);\n                const finalizeWildcard = await testClient.finalizeOrder(testOrderWildcard, testCsrWildcard);\n\n                [finalize, finalizeAlpn, finalizeWildcard].forEach((f) => spec.rfc8555.order(f));\n\n                assert.strictEqual(testOrder.url, finalize.url);\n                assert.strictEqual(testOrderAlpn.url, finalizeAlpn.url);\n                assert.strictEqual(testOrderWildcard.url, finalizeWildcard.url);\n            });\n\n            /**\n             * Wait for valid order\n             */\n\n            it('should wait for valid order status', async () => {\n                await Promise.all([testOrder, testOrderAlpn, testOrderWildcard].map(async (o) => testClient.waitForValidStatus(o)));\n            });\n\n            /**\n             * Get certificate\n             */\n\n            it('should get certificate', async () => {\n                testCertificate = await testClient.getCertificate(testOrder);\n                testCertificateAlpn = await testClient.getCertificate(testOrderAlpn);\n                testCertificateWildcard = await testClient.getCertificate(testOrderWildcard);\n\n                [testCertificate, testCertificateAlpn, testCertificateWildcard].forEach((cert) => {\n                    assert.isString(cert);\n                    acme.crypto.readCertificateInfo(cert);\n                });\n            });\n\n            it('should get alternate certificate chain [ACME_CAP_ALTERNATE_CERT_ROOTS]', async function () {\n                if (!capAlternateCertRoots) {\n                    this.skip();\n                }\n\n                await Promise.all(testIssuers.map(async (issuer) => {\n                    const cert = await testClient.getCertificate(testOrder, issuer);\n                    const rootCert = acme.crypto.splitPemChain(cert).pop();\n                    const info = acme.crypto.readCertificateInfo(rootCert);\n\n                    assert.strictEqual(issuer, info.issuer.commonName);\n                }));\n            });\n\n            it('should get default chain with invalid preference [ACME_CAP_ALTERNATE_CERT_ROOTS]', async function () {\n                if (!capAlternateCertRoots) {\n                    this.skip();\n                }\n\n                const cert = await testClient.getCertificate(testOrder, uuid());\n                const rootCert = acme.crypto.splitPemChain(cert).pop();\n                const info = acme.crypto.readCertificateInfo(rootCert);\n\n                assert.strictEqual(testIssuers[0], info.issuer.commonName);\n            });\n\n            /**\n             * Revoke certificate\n             */\n\n            it('should revoke certificate', async () => {\n                await testClient.revokeCertificate(testCertificate);\n                await testClient.revokeCertificate(testCertificateAlpn, { reason: 0 });\n                await testClient.revokeCertificate(testCertificateWildcard, { reason: 4 });\n            });\n\n            it('should not allow getting revoked certificate', async () => {\n                await assert.isRejected(testClient.getCertificate(testOrder));\n                await assert.isRejected(testClient.getCertificate(testOrderAlpn));\n                await assert.isRejected(testClient.getCertificate(testOrderWildcard));\n            });\n\n            /**\n             * Deactivate account\n             */\n\n            it('should deactivate account', async () => {\n                const data = { status: 'deactivated' };\n                const account = await testClient.updateAccount(data);\n\n                spec.rfc8555.account(account);\n                assert.strictEqual(account.status, 'deactivated');\n            });\n\n            /**\n             * Verify that no new orders can be made\n             */\n\n            it('should not allow new orders from deactivated account', async () => {\n                const data = { identifiers: [{ type: 'dns', value: 'nope.com' }] };\n                await assert.isRejected(testClient.createOrder(data));\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/core/acme-client/test/70-auto.spec.js",
    "content": "/**\n * ACME client.auto tests\n */\n\nconst { randomUUID: uuid } = require('crypto');\nconst { assert } = require('chai');\nconst cts = require('./challtestsrv');\nconst getCertIssuers = require('./get-cert-issuers');\nconst spec = require('./spec');\nconst acme = require('./../');\n\nconst domainName = process.env.ACME_DOMAIN_NAME || 'example.com';\nconst directoryUrl = process.env.ACME_DIRECTORY_URL || acme.directory.letsencrypt.staging;\nconst capEabEnabled = (('ACME_CAP_EAB_ENABLED' in process.env) && (process.env.ACME_CAP_EAB_ENABLED === '1'));\nconst capAlternateCertRoots = !(('ACME_CAP_ALTERNATE_CERT_ROOTS' in process.env) && (process.env.ACME_CAP_ALTERNATE_CERT_ROOTS === '0'));\n\nconst clientOpts = {\n    directoryUrl,\n    backoffAttempts: 5,\n    backoffMin: 1000,\n    backoffMax: 5000,\n};\n\nif (capEabEnabled && process.env.ACME_EAB_KID && process.env.ACME_EAB_HMAC_KEY) {\n    clientOpts.externalAccountBinding = {\n        kid: process.env.ACME_EAB_KID,\n        hmacKey: process.env.ACME_EAB_HMAC_KEY,\n    };\n}\n\ndescribe('client.auto', () => {\n    const testDomain = `${uuid()}.${domainName}`;\n    const testHttpDomain = `${uuid()}.${domainName}`;\n    const testHttpsDomain = `${uuid()}.${domainName}`;\n    const testDnsDomain = `${uuid()}.${domainName}`;\n    const testAlpnDomain = `${uuid()}.${domainName}`;\n    const testWildcardDomain = `${uuid()}.${domainName}`;\n\n    const testSanDomains = [\n        `${uuid()}.${domainName}`,\n        `${uuid()}.${domainName}`,\n        `${uuid()}.${domainName}`,\n    ];\n\n    /**\n     * Pebble CTS required\n     */\n\n    before(function () {\n        if (!cts.isEnabled()) {\n            this.skip();\n        }\n    });\n\n    /**\n     * Key types\n     */\n\n    Object.entries({\n        rsa: {\n            createKeyFn: () => acme.crypto.createPrivateRsaKey(),\n            createKeyAltFns: {\n                s1024: () => acme.crypto.createPrivateRsaKey(1024),\n                s4096: () => acme.crypto.createPrivateRsaKey(4096),\n            },\n        },\n        ecdsa: {\n            createKeyFn: () => acme.crypto.createPrivateEcdsaKey(),\n            createKeyAltFns: {\n                p384: () => acme.crypto.createPrivateEcdsaKey('P-384'),\n                p521: () => acme.crypto.createPrivateEcdsaKey('P-521'),\n            },\n        },\n    }).forEach(([name, { createKeyFn, createKeyAltFns }]) => {\n        describe(name, () => {\n            let testIssuers;\n            let testClient;\n            let testCertificate;\n            let testSanCertificate;\n            let testWildcardCertificate;\n\n            /**\n             * Fixtures\n             */\n\n            it('should resolve certificate issuers [ACME_CAP_ALTERNATE_CERT_ROOTS]', async function () {\n                if (!capAlternateCertRoots) {\n                    this.skip();\n                }\n\n                testIssuers = await getCertIssuers();\n\n                assert.isArray(testIssuers);\n                assert.isTrue(testIssuers.length > 1);\n\n                testIssuers.forEach((i) => {\n                    assert.isString(i);\n                    assert.strictEqual(1, testIssuers.filter((c) => (c === i)).length);\n                });\n            });\n\n            /**\n             * Initialize client\n             */\n\n            it('should initialize client', async () => {\n                testClient = new acme.Client({\n                    ...clientOpts,\n                    accountKey: await createKeyFn(),\n                });\n            });\n\n            /**\n             * Invalid challenge response\n             */\n\n            it('should throw on invalid challenge response', async () => {\n                const [, csr] = await acme.crypto.createCsr({\n                    commonName: `${uuid()}.${domainName}`,\n                }, await createKeyFn());\n\n                await assert.isRejected(testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    challengeCreateFn: cts.challengeNoopFn,\n                    challengeRemoveFn: cts.challengeNoopFn,\n                }), /^authorization not found/i);\n            });\n\n            it('should throw on invalid challenge response with opts.skipChallengeVerification=true', async () => {\n                const [, csr] = await acme.crypto.createCsr({\n                    commonName: `${uuid()}.${domainName}`,\n                }, await createKeyFn());\n\n                await assert.isRejected(testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    skipChallengeVerification: true,\n                    challengeCreateFn: cts.challengeNoopFn,\n                    challengeRemoveFn: cts.challengeNoopFn,\n                }));\n            });\n\n            /**\n             * Challenge function exceptions\n             */\n\n            it('should throw on challengeCreate exception', async () => {\n                const [, csr] = await acme.crypto.createCsr({\n                    commonName: `${uuid()}.${domainName}`,\n                }, await createKeyFn());\n\n                await assert.isRejected(testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    challengeCreateFn: cts.challengeThrowFn,\n                    challengeRemoveFn: cts.challengeNoopFn,\n                }), /^oops$/);\n            });\n\n            it('should not throw on challengeRemove exception', async () => {\n                const [, csr] = await acme.crypto.createCsr({\n                    commonName: `${uuid()}.${domainName}`,\n                }, await createKeyFn());\n\n                const cert = await testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    challengeCreateFn: cts.challengeCreateFn,\n                    challengeRemoveFn: cts.challengeThrowFn,\n                });\n\n                assert.isString(cert);\n            });\n\n            it('should settle all challenges before rejecting', async () => {\n                const results = [];\n                const [, csr] = await acme.crypto.createCsr({\n                    commonName: `${uuid()}.${domainName}`,\n                    altNames: [\n                        `${uuid()}.${domainName}`,\n                        `${uuid()}.${domainName}`,\n                        `${uuid()}.${domainName}`,\n                        `${uuid()}.${domainName}`,\n                    ],\n                }, await createKeyFn());\n\n                await assert.isRejected(testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    challengeCreateFn: async (...args) => {\n                        if ([0, 1, 2].includes(results.length)) {\n                            results.push(false);\n                            throw new Error('oops');\n                        }\n\n                        await new Promise((resolve) => { setTimeout(resolve, 500); });\n                        results.push(true);\n                        return cts.challengeCreateFn(...args);\n                    },\n                    challengeRemoveFn: cts.challengeRemoveFn,\n                }));\n\n                assert.strictEqual(results.length, 5);\n                assert.deepStrictEqual(results, [false, false, false, true, true]);\n            });\n\n            /**\n             * Order certificates\n             */\n\n            it('should order certificate', async () => {\n                const [, csr] = await acme.crypto.createCsr({\n                    commonName: testDomain,\n                }, await createKeyFn());\n\n                const cert = await testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    challengeCreateFn: cts.challengeCreateFn,\n                    challengeRemoveFn: cts.challengeRemoveFn,\n                });\n\n                assert.isString(cert);\n                testCertificate = cert;\n            });\n\n            it('should order certificate using http-01', async () => {\n                const [, csr] = await acme.crypto.createCsr({\n                    commonName: testHttpDomain,\n                }, await createKeyFn());\n\n                const cert = await testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    challengeCreateFn: cts.assertHttpChallengeCreateFn,\n                    challengeRemoveFn: cts.challengeRemoveFn,\n                    challengePriority: ['http-01'],\n                });\n\n                assert.isString(cert);\n            });\n\n            it('should order certificate using https-01', async () => {\n                const [, csr] = await acme.crypto.createCsr({\n                    commonName: testHttpsDomain,\n                }, await createKeyFn());\n\n                const cert = await testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    challengeCreateFn: cts.assertHttpsChallengeCreateFn,\n                    challengeRemoveFn: cts.challengeRemoveFn,\n                    challengePriority: ['http-01'],\n                });\n\n                assert.isString(cert);\n            });\n\n            it('should order certificate using dns-01', async () => {\n                const [, csr] = await acme.crypto.createCsr({\n                    commonName: testDnsDomain,\n                }, await createKeyFn());\n\n                const cert = await testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    challengeCreateFn: cts.assertDnsChallengeCreateFn,\n                    challengeRemoveFn: cts.challengeRemoveFn,\n                    challengePriority: ['dns-01'],\n                });\n\n                assert.isString(cert);\n            });\n\n            it('should order certificate using tls-alpn-01', async () => {\n                const [, csr] = await acme.crypto.createCsr({\n                    commonName: testAlpnDomain,\n                }, await createKeyFn());\n\n                const cert = await testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    challengeCreateFn: cts.assertTlsAlpnChallengeCreateFn,\n                    challengeRemoveFn: cts.challengeRemoveFn,\n                    challengePriority: ['tls-alpn-01'],\n                });\n\n                assert.isString(cert);\n            });\n\n            it('should order san certificate', async () => {\n                const [, csr] = await acme.crypto.createCsr({\n                    altNames: testSanDomains,\n                }, await createKeyFn());\n\n                const cert = await testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    challengeCreateFn: cts.challengeCreateFn,\n                    challengeRemoveFn: cts.challengeRemoveFn,\n                });\n\n                assert.isString(cert);\n                testSanCertificate = cert;\n            });\n\n            it('should order wildcard certificate', async () => {\n                const [, csr] = await acme.crypto.createCsr({\n                    altNames: [testWildcardDomain, `*.${testWildcardDomain}`],\n                }, await createKeyFn());\n\n                const cert = await testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    challengeCreateFn: cts.challengeCreateFn,\n                    challengeRemoveFn: cts.challengeRemoveFn,\n                });\n\n                assert.isString(cert);\n                testWildcardCertificate = cert;\n            });\n\n            it('should order certificate with opts.skipChallengeVerification=true', async () => {\n                const [, csr] = await acme.crypto.createCsr({\n                    commonName: `${uuid()}.${domainName}`,\n                }, await createKeyFn());\n\n                const cert = await testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    skipChallengeVerification: true,\n                    challengeCreateFn: cts.challengeCreateFn,\n                    challengeRemoveFn: cts.challengeRemoveFn,\n                });\n\n                assert.isString(cert);\n            });\n\n            it('should order alternate certificate chain [ACME_CAP_ALTERNATE_CERT_ROOTS]', async function () {\n                if (!capAlternateCertRoots) {\n                    this.skip();\n                }\n\n                await Promise.all(testIssuers.map(async (issuer) => {\n                    const [, csr] = await acme.crypto.createCsr({\n                        commonName: `${uuid()}.${domainName}`,\n                    }, await createKeyFn());\n\n                    const cert = await testClient.auto({\n                        csr,\n                        termsOfServiceAgreed: true,\n                        preferredChain: issuer,\n                        challengeCreateFn: cts.challengeCreateFn,\n                        challengeRemoveFn: cts.challengeRemoveFn,\n                    });\n\n                    const rootCert = acme.crypto.splitPemChain(cert).pop();\n                    const info = acme.crypto.readCertificateInfo(rootCert);\n\n                    assert.strictEqual(issuer, info.issuer.commonName);\n                }));\n            });\n\n            it('should get default chain with invalid preference [ACME_CAP_ALTERNATE_CERT_ROOTS]', async function () {\n                if (!capAlternateCertRoots) {\n                    this.skip();\n                }\n\n                const [, csr] = await acme.crypto.createCsr({\n                    commonName: `${uuid()}.${domainName}`,\n                }, await createKeyFn());\n\n                const cert = await testClient.auto({\n                    csr,\n                    termsOfServiceAgreed: true,\n                    preferredChain: uuid(),\n                    challengeCreateFn: cts.challengeCreateFn,\n                    challengeRemoveFn: cts.challengeRemoveFn,\n                });\n\n                const rootCert = acme.crypto.splitPemChain(cert).pop();\n                const info = acme.crypto.readCertificateInfo(rootCert);\n\n                assert.strictEqual(testIssuers[0], info.issuer.commonName);\n            });\n\n            /**\n             * Order certificate with alternate key sizes\n             */\n\n            Object.entries(createKeyAltFns).forEach(([k, altKeyFn]) => {\n                it(`should order certificate with key=${k}`, async () => {\n                    const [, csr] = await acme.crypto.createCsr({\n                        commonName: testDomain,\n                    }, await altKeyFn());\n\n                    const cert = await testClient.auto({\n                        csr,\n                        termsOfServiceAgreed: true,\n                        challengeCreateFn: cts.challengeCreateFn,\n                        challengeRemoveFn: cts.challengeRemoveFn,\n                    });\n\n                    assert.isString(cert);\n                });\n            });\n\n            /**\n             * Read certificates\n             */\n\n            it('should read certificate info', () => {\n                const info = acme.crypto.readCertificateInfo(testCertificate);\n\n                spec.crypto.certificateInfo(info);\n                assert.isNull(info.domains.commonName);\n                assert.deepStrictEqual(info.domains.altNames, [testDomain]);\n            });\n\n            it('should read san certificate info', () => {\n                const info = acme.crypto.readCertificateInfo(testSanCertificate);\n\n                spec.crypto.certificateInfo(info);\n                assert.isNull(info.domains.commonName);\n                assert.deepStrictEqual(info.domains.altNames, testSanDomains);\n            });\n\n            it('should read wildcard certificate info', () => {\n                const info = acme.crypto.readCertificateInfo(testWildcardCertificate);\n\n                spec.crypto.certificateInfo(info);\n                assert.isNull(info.domains.commonName);\n                assert.deepStrictEqual(info.domains.altNames, [testWildcardDomain, `*.${testWildcardDomain}`]);\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/core/acme-client/test/challtestsrv.js",
    "content": "/**\n * Pebble Challenge Test Server integration\n */\n\nconst { assert } = require('chai');\nconst axios = require('./../src/axios');\n\nconst apiBaseUrl = process.env.ACME_CHALLTESTSRV_URL || null;\nconst httpsPort = axios.defaults.acmeSettings.httpsChallengePort || 443;\n\n/**\n * Send request\n */\n\nasync function request(apiPath, data = {}) {\n    if (!apiBaseUrl) {\n        throw new Error('No Pebble Challenge Test Server URL found');\n    }\n\n    await axios.request({\n        url: `${apiBaseUrl}/${apiPath}`,\n        method: 'post',\n        data,\n    });\n\n    return true;\n}\n\n/**\n * State\n */\n\nexports.isEnabled = () => !!apiBaseUrl;\n\n/**\n * DNS\n */\n\nexports.addDnsARecord = async (host, addresses) => request('add-a', { host, addresses });\nexports.setDnsCnameRecord = async (host, target) => request('set-cname', { host, target });\n\n/**\n * Challenge response\n */\n\nasync function addHttp01ChallengeResponse(token, content) {\n    return request('add-http01', { token, content });\n}\n\nasync function addHttps01ChallengeResponse(token, content, targetHostname) {\n    await addHttp01ChallengeResponse(token, content);\n    return request('add-redirect', {\n        path: `/.well-known/acme-challenge/${token}`,\n        targetURL: `https://${targetHostname}:${httpsPort}/.well-known/acme-challenge/${token}`,\n    });\n}\n\nasync function addDns01ChallengeResponse(host, value) {\n    return request('set-txt', { host, value });\n}\n\nasync function addTlsAlpn01ChallengeResponse(host, content) {\n    return request('add-tlsalpn01', { host, content });\n}\n\nexports.addHttp01ChallengeResponse = addHttp01ChallengeResponse;\nexports.addHttps01ChallengeResponse = addHttps01ChallengeResponse;\nexports.addDns01ChallengeResponse = addDns01ChallengeResponse;\nexports.addTlsAlpn01ChallengeResponse = addTlsAlpn01ChallengeResponse;\n\n/**\n * Challenge response mock functions\n */\n\nasync function assertHttpChallengeCreateFn(authz, challenge, keyAuthorization) {\n    assert.strictEqual(challenge.type, 'http-01');\n    return addHttp01ChallengeResponse(challenge.token, keyAuthorization);\n}\n\nasync function assertHttpsChallengeCreateFn(authz, challenge, keyAuthorization) {\n    assert.strictEqual(challenge.type, 'http-01');\n    return addHttps01ChallengeResponse(challenge.token, keyAuthorization, authz.identifier.value);\n}\n\nasync function assertDnsChallengeCreateFn(authz, challenge, keyAuthorization) {\n    assert.strictEqual(challenge.type, 'dns-01');\n    return addDns01ChallengeResponse(`_acme-challenge.${authz.identifier.value}.`, keyAuthorization);\n}\n\nasync function assertTlsAlpnChallengeCreateFn(authz, challenge, keyAuthorization) {\n    assert.strictEqual(challenge.type, 'tls-alpn-01');\n    return addTlsAlpn01ChallengeResponse(authz.identifier.value, keyAuthorization);\n}\n\nasync function challengeCreateFn(authz, challenge, keyAuthorization) {\n    if (challenge.type === 'http-01') {\n        return assertHttpChallengeCreateFn(authz, challenge, keyAuthorization);\n    }\n\n    if (challenge.type === 'dns-01') {\n        return assertDnsChallengeCreateFn(authz, challenge, keyAuthorization);\n    }\n\n    if (challenge.type === 'tls-alpn-01') {\n        return assertTlsAlpnChallengeCreateFn(authz, challenge, keyAuthorization);\n    }\n\n    throw new Error(`Unsupported challenge type ${challenge.type}`);\n}\n\nexports.challengeRemoveFn = async () => true;\nexports.challengeNoopFn = async () => true;\nexports.challengeThrowFn = async () => { throw new Error('oops'); };\n\nexports.assertHttpChallengeCreateFn = assertHttpChallengeCreateFn;\nexports.assertHttpsChallengeCreateFn = assertHttpsChallengeCreateFn;\nexports.assertDnsChallengeCreateFn = assertDnsChallengeCreateFn;\nexports.assertTlsAlpnChallengeCreateFn = assertTlsAlpnChallengeCreateFn;\nexports.challengeCreateFn = challengeCreateFn;\n"
  },
  {
    "path": "packages/core/acme-client/test/fixtures/certificate.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIFMjCCAxoCCQCVordquLnq8TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQGEwJB\nVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0\ncyBQdHkgTHRkMRQwEgYDVQQDEwtleGFtcGxlLmNvbTAeFw0xNzA5MTQxNDMzMTRa\nFw0xODA5MTQxNDMzMTRaMFsxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0\nYXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxFDASBgNVBAMT\nC2V4YW1wbGUuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwi2P\nYBNGl1n78niRGDKgcsWK03TcTeVbQ1HztA57Rr1iDHAZNx3Mv4E/Sha8VKbKoshc\nmUcOS3AlmbIZX+7+9c7lL2oD+vtUZF1YUR/69fWuO72wk6fKj/eofxH9Ud5KFje8\nqrYZdJWKkPMdWlYgjD6qpA5wl60NiuxmUr44ADZDytqHzNThN3wrFruz74PcMfak\ncSUMxkh98LuNeGtqHpEAw+wliko3oDD4PanvDvp5mRgiQVKHEGT7dm85Up+W1iJK\nJ65fkc/j940MaLbdISZYYCT5dtPgCGKCHgVuVrY+OXFJrD3TTm94ILsR/BkS/VSK\nNigGVPXg3q8tgIS++k13CzLUO0PNRMuod1RD9j5NEc2CVic9rcH06ugZyHlOcuVv\nvRsPGd52BPn+Jf1aePKPPQHxT9i5GOs80CJw0eduZCDZB32biRYNwUtjFkHbu8ii\n2IGkvhnWonjd4w5wOldG+RPr+XoFCIaHp5TszQ+HnUTLIXKtBgzzCKjK4eZqrck7\nxpo5B5m5V7EUxBze2LYVky+GsDsqL8CggQqJL4ZKuZVoxgPwhnDy5nMs057NCU9E\nnXcauMW9UEqEHu5NXnmGJrCvQ56wjYN3lgvCHEtmIpsRjCCWaBJYiawu1J5ZAf1y\nGTVNh8pEvO//zL9ImUxrSfOGUeFiN1tzSFlTfbcCAwEAATANBgkqhkiG9w0BAQUF\nAAOCAgEAdZZpgWv79CgF5ny6HmMaYgsXJKJyQE9RhJ1cmzDY8KAF+nzT7q4Pgt3W\nbA9bpdji7C0WqKjX7hLipqhgFnqb8qZcodEKhX788qBj4X45+4nT6QipyJlz5x6K\ncCn/v9gQNKks7U+dBlqquiVfbXaa1EAKMeGtqinf+Y51nR/fBcr/P9TBnSJqH61K\nDO3qrE5KGTwHQ9VXoeKyeppGt5sYf8G0vwoHhtPTOO8TuLEIlFcXtzbC3zAtmQj6\nSu//fI5yjuYTkiayxMx8nCGrQhQSXdC8gYpYd0os7UY01DVu4BTCXEvf0GYXtiGJ\neG8lQT/eu7WdK83uJ93U/BMYzoq4lSVcqY4LNxlfAQXKhaAbioA5XyT7co7FQ0g+\ns2CGBUKa11wPDe8M2GVLPsxT2bXDQap5DQyVIuTwjtgL0tykGxPJPAnL2zuUy6T3\n/YzrWaJ9Os+6mUCVdLnXtDgZ10Ujel7mq6wo9Ns+u07grXZkXpmJYnJXBrwOsY8K\nZa5vFwgJrDXhWe+Fmgt1EP5VIqRCQAxH2iYvAaELi8udbN/ZiUU3K9t79MP/M3U/\ntEWAubHXsaAv03jRy43X0VjlZHmagU/4dU7RBWfyuwRarYIXLNT2FCd2z4kd3fsL\n3rB5iI+RH0uoNuOa1+UApfFCv0O65TYkp5jEWSlU8PhKYD43nXA=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "packages/core/acme-client/test/fixtures/letsencrypt.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDzzCCA1WgAwIBAgISA0ghDoSv5DpT3Pd3lqwjbVDDMAoGCCqGSM49BAMDMDIx\nCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF\nNjAeFw0yNDA2MTAxNzEyMjZaFw0yNDA5MDgxNzEyMjVaMBQxEjAQBgNVBAMTCWxl\nbmNyLm9yZzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABEHJ3DjN7pYV3mftHzaP\nV/WI0RhOJnSI5AIFEPFHDi8UowOINRGIfm9FHGIDqrb4Rmyvr9JrrqBdFGDen8BW\n6OGjggJnMIICYzAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0lBBYwFAYIKwYBBQUHAwEG\nCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFIdCTnxqmpOELDyzPaEM\nseB36lUOMB8GA1UdIwQYMBaAFJMnRpgDqVFojpjWxEJI2yO/WJTSMFUGCCsGAQUF\nBwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0cDovL2U2Lm8ubGVuY3Iub3JnMCIGCCsG\nAQUFBzAChhZodHRwOi8vZTYuaS5sZW5jci5vcmcvMG8GA1UdEQRoMGaCCWxlbmNy\nLm9yZ4IPbGV0c2VuY3J5cHQuY29tgg9sZXRzZW5jcnlwdC5vcmeCDXd3dy5sZW5j\nci5vcmeCE3d3dy5sZXRzZW5jcnlwdC5jb22CE3d3dy5sZXRzZW5jcnlwdC5vcmcw\nEwYDVR0gBAwwCjAIBgZngQwBAgEwggEFBgorBgEEAdZ5AgQCBIH2BIHzAPEAdgA/\nF0tP1yJHWJQdZRyEvg0S7ZA3fx+FauvBvyiF7PhkbgAAAZADWfneAAAEAwBHMEUC\nIGlp+dPU2hLT2suTMYkYMlt/xbzSnKLZDA/wYSsPACP7AiEAxbAzx6mkzn0cs0hh\nti6sLf0pcbmDhxHdlJRjuo6SQZEAdwDf4VbrqgWvtZwPhnGNqMAyTq5W2W6n9aVq\nAdHBO75SXAAAAZADWfqrAAAEAwBIMEYCIQCrAmDUrlX3oGhri1qCIb65Cuf8h2GR\nLC1VfXBenX7dCAIhALXwbhCQ1vO1WLv4CqyihMHOwFaICYqN/N6ylaBlVAM4MAoG\nCCqGSM49BAMDA2gAMGUCMFdgjOXGl+hE2ABDsAeuNq8wi34yTMUHk0KMTOjRAfy9\nrOCGQqvP0myoYlyzXOH9uQIxAMdkG1ZWBZS1dHavbPf1I/MjYpzX6gy0jVHIXXu5\naYWylBi/Uf2RPj0LWFZh8tNa1Q==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "packages/core/acme-client/test/fixtures/private.key",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAo0nBEFBeo2XnR1kx0jV00W9EszE5Ei/zuJKLXXwTeUGMhy9h\nCqPFWQnTOD5PQUcja98p96LCdRZpfsfoL1RewksD6BCJN+9hZucImBASpmg2M432\nwsF7fa3/FMtICrEmQh+LJ48zOottr93YcipY1fNxHWzFr8Hvv+OZCMmQvL4W5u5U\nrxdi7jptbAbFvv470TN8lpVwneG7kG3cemPhW6RmfTTUQ2Qp/QP6fptpWIIy5kQe\nzvgpql2xRPBjqb4VDy1kVTTCe/Lpt7bNGe2eZOzXJcjrU+d5LEOrfQoX5ZO4H5UC\n9YlT6wqyPv9VZ5g2slz198LGV8hdGEVix8XPiQIDAQABAoIBAQCaoo4jVPlK5IZS\nGzYDTHyEmksFJ+hUQPUeJim1LnuCqYDbxRKxcMbDu3o8GUYVG7l/vqePzKM7Hy5o\n0gggSlYyybe5XW+VeS1UthZ9azs+PBKYYCj/5xt7ufuHRbvD5F/G3vh5TjPFjaUi\nl4UTGOdoNlM4+nl8KL1Ti8axe7GGCztxmjJL7VnN4RWc5yzBrU6oiQED0BM/6KFx\nnJHPuwzRemRRjz8Lk1ryMsCymtZx70slxVJeHPdoMc9vkseOulooBMZtXqOixoHO\nUtFuKGgIkg6KA9qI+8RmqSPUeXrbrPeRZtu3N9NcsPUYVptNo1ZjLpa9Eigd0tkq\n1+/TyGDBAoGBANCnK/+uXIZWt4QoF+7AUGeckOmRAbJnWf8KrScSa/TSGNObGP00\nLpeM10eNDqvfY9RepM6RH5R75vDWltJd4+fyQPaHqG4AhlMk1JglZn71F91FWstx\nK/qrPfnBQP7qq4yuQ0zavPkgIUWzryLk0JnQ4wPNLiXFAfQYDt+F8Vg3AoGBAMhX\nS+sej87zRHbV/wj7zLa/QwnDLiU7wswv9zUf2Ot+49pfwEzzSGuLHFHoIXVrGo2y\nQQl6sovJ6dFi7GFPikiwj9em/EF4JgTmWZhoYH1HmThTUeziLa2/VT4eIZn7Viwb\n/goxKAvGvHkcdQIeNPPFaEi0m7vDkTAv/WG/prY/AoGAcKWwVWuXPFfY4BqdQSLG\nxgl7Gv5UgjLWHaFv9iY17oj3KlcT2K+xb9Rz7Yc0IoqKZP9rzrH+8LUr616PMqfK\nAVGCzRZUUn8qBf1eYX3fpi9AYQ+ugyNocP6+iPZS1s1vLJZwcy+s0nsMO4tUxGvw\nSvrBdS3y+iUwds3+SaMQt2UCgYAg0BuBIPpQ3QtDo30oDYXUELN8L9mpA4a+RsTo\nkJTIzXmoVLJ8aAReiORUjf6c6rPorV91nAEOYD3Jq7gnoA14JmMI4TLDzlf7yXa3\nPbFAE7AGx67Na6YrpQDjMbAzNjVA+Dy9kpuKgjxwYbbQZ/4oRxbzgZFYSYnIKLQJ\nhIhbpQKBgEc8fYYc3UqyNIGNupYBZhb0pF7FPMwldzv4UufMjkYzKREaCT2D3HIC\nFEKiJxatIhOtCW5oa5sXK/mGR9EEzW1ltlljymu0u+slIoWvWWGfQU9DxFBnZ2x5\n4/nzeq4zI+qYt8qXZTnhY/bpZI0pdQqWT9+AoFJJn8Bfdk1mLuIs\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "packages/core/acme-client/test/fixtures/san-certificate.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIC3zCCAcegAwIBAgIJAPZkD9qD+FX8MA0GCSqGSIb3DQEBBQUAMBYxFDASBgNV\nBAMMC2V4YW1wbGUuY29tMB4XDTE3MDkyMTIwMzY1MFoXDTE4MDkyMTIwMzY1MFow\nFjEUMBIGA1UEAwwLZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQDNygRzPEyGP90Q3ms1DzUIj597u4t22TU08TQywMTt+/Sd+LNDvgwI\nyhCbbwetVq+rvEayAMaQjFzqgoQOxY8GDrrqfPfQ50ED79vu5VPaqVSTN5FwK7hq\n6Bl+kT2MUMIwhhGTfrn7inGhxB1hhYtAaUJDuLN2JjB6Ax9BfVv5NJLPeN1V6qdV\nedtmNrUV5eWwEPfl4kCJ8Ytes6YttN2UDnet/B19po3/JEdy5YgPmeAfW1wbA+kl\noU475uPpKPV79M+6hrKNlS2hPFcGOiL/7glKgXURg7Ih+e53Qx6tgqKrgmjRM8Jq\n0bLwM1+xY0O/2C9wbkpElBLU9CKS9I+PAgMBAAGjMDAuMCwGA1UdEQQlMCOCEHRl\nc3QuZXhhbXBsZS5jb22CD2FiYy5leGFtcGxlLmNvbTANBgkqhkiG9w0BAQUFAAOC\nAQEAGCVsiJZOe0LVYQ40a/N/PaVVs1zj1KXmVDrKEWW8fhjEMao/j/Bb4rXuKCkC\nDQIZR1jsFC4IWyL4eOpUp4SPFn6kbdzhxjl+42kuzQLqTc1EiEobwEbroQSoUJpT\nxj2j0YnrFn/9hVBHUgsA3tONNXL5McEtiHOQ+iXUmoPw9sRvs0DEshS1XeYvTuzY\nJua6uev1QBXxll3+pw7i2Wbt9ifeX6NBe+MOGIYxn6aMwwmgtoLbxDMThtVJJGCH\nV0JrSBhEkVlfK1LukSUeSO1RpCsV+97Xx2jEsNwbiji/xKnXk44sVJhJ/yQnWkiC\nwZLUm/SNOOtPT68U5RopRC0IXA==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "packages/core/acme-client/test/get-cert-issuers.js",
    "content": "/**\n * Get ACME certificate issuers\n */\n\nconst acme = require('./../');\nconst util = require('./../src/util');\n\nconst pebbleManagementUrl = process.env.ACME_PEBBLE_MANAGEMENT_URL || null;\n\n/**\n * Pebble\n */\n\nasync function getPebbleCertIssuers() {\n    /* Get intermediate certificate and resolve alternates */\n    const root = await acme.axios.get(`${pebbleManagementUrl}/intermediates/0`);\n    const links = util.parseLinkHeader(root.headers.link || '');\n    const alternates = await Promise.all(links.map(async (link) => acme.axios.get(link)));\n\n    /* Get certificate info */\n    const certs = [root].concat(alternates).map((c) => c.data);\n    const info = certs.map((c) => acme.crypto.readCertificateInfo(c));\n\n    /* Return issuers */\n    return info.map((i) => i.issuer.commonName);\n}\n\n/**\n * Get certificate issuers\n */\n\nmodule.exports = async () => {\n    if (pebbleManagementUrl) {\n        return getPebbleCertIssuers();\n    }\n\n    throw new Error('Unable to resolve list of certificate issuers');\n};\n"
  },
  {
    "path": "packages/core/acme-client/test/retry.js",
    "content": "const { assert } = require('chai');\nconst Promise = require('bluebird');\nconst util = require('../src/util');\n\nlet count = 0;\nasync function apiRequest() {\n    count += 1;\n    console.log(new Date(), 'retry count:', count);\n    await Promise.delay(2000);\n    return count;\n}\n\nasync function waitForValidStatus() {\n    const verifyFn = async (abort) => {\n        const resp = await apiRequest();\n\n        /* Verify status */\n        console.log(new Date(), 'Item has status', resp);\n        if (count < 3) {\n            abort();\n            throw new Error(`${new Date()}error`, count);\n        }\n\n        console.log(new Date(), 'success');\n        return 'success';\n\n        // if (resp.data.status === 'invalid') {\n        //     abort();\n        //     throw new Error(util.formatResponseError(resp));\n        // }\n        // else if (resp.data.status === 'pending') {\n        //     throw new Error('Operation is pending');\n        // }\n        // else if (resp.data.status === 'valid') {\n        //     return resp.data;\n        // }\n        //\n        // throw new Error(`Unexpected item status: ${resp.data.status}`);\n    };\n\n    console.log(new Date(), 'Waiting for valid status from', this.backoffOpts);\n    return util.retry(verifyFn, this.backoffOpts);\n}\n/**\n */\ndescribe('util', () => {\n    it('retry', async function() {\n        this.timeout(100000);\n        try {\n            await waitForValidStatus();\n        }\n        catch (e) {\n            console.error('1111', e);\n        }\n\n\n        // await Promise.delay(100000);\n    });\n});\n"
  },
  {
    "path": "packages/core/acme-client/test/setup.js",
    "content": "/**\n * Setup testing\n */\n\nconst fs = require('fs');\nconst chai = require('chai');\nconst chaiAsPromised = require('chai-as-promised');\nconst axios = require('./../src/axios');\n\n/**\n * Add promise support to Chai\n */\n\nchai.use(chaiAsPromised);\n\n/**\n * Challenge test server ports\n */\n\nif (process.env.ACME_HTTP_PORT) {\n    axios.defaults.acmeSettings.httpChallengePort = process.env.ACME_HTTP_PORT;\n}\n\nif (process.env.ACME_HTTPS_PORT) {\n    axios.defaults.acmeSettings.httpsChallengePort = process.env.ACME_HTTPS_PORT;\n}\n\nif (process.env.ACME_TLSALPN_PORT) {\n    axios.defaults.acmeSettings.tlsAlpnChallengePort = process.env.ACME_TLSALPN_PORT;\n}\n\n/**\n * Greatly reduce retry duration while testing\n */\n\naxios.defaults.acmeSettings.retryMaxAttempts = 3;\naxios.defaults.acmeSettings.retryDefaultDelay = 1;\n\n/**\n * External account binding\n */\n\nif (('ACME_CAP_EAB_ENABLED' in process.env) && (process.env.ACME_CAP_EAB_ENABLED === '1')) {\n    const pebbleConfig = JSON.parse(fs.readFileSync('/etc/pebble/pebble.json').toString());\n    const [kid, hmacKey] = Object.entries(pebbleConfig.pebble.externalAccountMACKeys)[0];\n\n    process.env.ACME_EAB_KID = kid;\n    process.env.ACME_EAB_HMAC_KEY = hmacKey;\n}\n"
  },
  {
    "path": "packages/core/acme-client/test/soa.spec.mjs",
    "content": "import {assert} from 'chai'\nimport {resolveDomainBySoaRecord} from \"../src/util.js\"\ndescribe('dns', () => {\n    it('resolveDomainBySoaRecord', async () => {\n        const resp = await resolveDomainBySoaRecord(\"a.corp.smartdeer.com\")\n\n        assert.equal(resp, \"smartdeer.com\")\n\n    });\n\n})"
  },
  {
    "path": "packages/core/acme-client/test/spec.js",
    "content": "/**\n * Assertions\n */\n\nconst { assert } = require('chai');\n\nconst spec = {};\nmodule.exports = spec;\n\n/**\n * ACME\n */\n\nspec.rfc8555 = {};\n\nspec.rfc8555.account = (obj) => {\n    assert.isObject(obj);\n\n    assert.isString(obj.status);\n    assert.include(['valid', 'deactivated', 'revoked'], obj.status);\n\n    assert.isString(obj.orders);\n\n    if ('contact' in obj) {\n        assert.isArray(obj.contact);\n        obj.contact.forEach((c) => assert.isString(c));\n    }\n\n    if ('termsOfServiceAgreed' in obj) {\n        assert.isBoolean(obj.termsOfServiceAgreed);\n    }\n\n    if ('externalAccountBinding' in obj) {\n        assert.isObject(obj.externalAccountBinding);\n    }\n};\n\nspec.rfc8555.order = (obj) => {\n    assert.isObject(obj);\n\n    assert.isString(obj.status);\n    assert.include(['pending', 'ready', 'processing', 'valid', 'invalid'], obj.status);\n\n    assert.isArray(obj.identifiers);\n    obj.identifiers.forEach((i) => spec.rfc8555.identifier(i));\n\n    assert.isArray(obj.authorizations);\n    obj.authorizations.forEach((a) => assert.isString(a));\n\n    assert.isString(obj.finalize);\n\n    if ('expires' in obj) {\n        assert.isString(obj.expires);\n    }\n\n    if ('notBefore' in obj) {\n        assert.isString(obj.notBefore);\n    }\n\n    if ('notAfter' in obj) {\n        assert.isString(obj.notAfter);\n    }\n\n    if ('error' in obj) {\n        assert.isObject(obj.error);\n    }\n\n    if ('certificate' in obj) {\n        assert.isString(obj.certificate);\n    }\n\n    /* Augmentations */\n    assert.isString(obj.url);\n};\n\nspec.rfc8555.authorization = (obj) => {\n    assert.isObject(obj);\n\n    spec.rfc8555.identifier(obj.identifier);\n\n    assert.isString(obj.status);\n    assert.include(['pending', 'valid', 'invalid', 'deactivated', 'expires', 'revoked'], obj.status);\n\n    assert.isArray(obj.challenges);\n    obj.challenges.forEach((c) => spec.rfc8555.challenge(c));\n\n    if ('expires' in obj) {\n        assert.isString(obj.expires);\n    }\n\n    if ('wildcard' in obj) {\n        assert.isBoolean(obj.wildcard);\n    }\n\n    /* Augmentations */\n    assert.isString(obj.url);\n};\n\nspec.rfc8555.identifier = (obj) => {\n    assert.isObject(obj);\n    assert.isString(obj.type);\n    assert.isString(obj.value);\n};\n\nspec.rfc8555.challenge = (obj) => {\n    assert.isObject(obj);\n    assert.isString(obj.type);\n    assert.isString(obj.url);\n\n    assert.isString(obj.status);\n    assert.include(['pending', 'processing', 'valid', 'invalid'], obj.status);\n\n    if ('validated' in obj) {\n        assert.isString(obj.validated);\n    }\n\n    if ('error' in obj) {\n        assert.isObject(obj.error);\n    }\n};\n\n/**\n * Crypto\n */\n\nspec.crypto = {};\n\nspec.crypto.csrDomains = (obj) => {\n    assert.isObject(obj);\n\n    assert.isDefined(obj.commonName);\n    assert.isArray(obj.altNames);\n    obj.altNames.forEach((a) => assert.isString(a));\n};\n\nspec.crypto.certificateInfo = (obj) => {\n    assert.isObject(obj);\n\n    assert.isObject(obj.issuer);\n    assert.isDefined(obj.issuer.commonName);\n\n    assert.isObject(obj.domains);\n    assert.isDefined(obj.domains.commonName);\n    assert.isArray(obj.domains.altNames);\n    obj.domains.altNames.forEach((a) => assert.isString(a));\n\n    assert.strictEqual(Object.prototype.toString.call(obj.notBefore), '[object Date]');\n    assert.strictEqual(Object.prototype.toString.call(obj.notAfter), '[object Date]');\n};\n\n/**\n * JWK\n */\n\nspec.jwk = {};\n\nspec.jwk.rsa = (obj) => {\n    assert.isObject(obj);\n    assert.isString(obj.e);\n    assert.isString(obj.kty);\n    assert.isString(obj.n);\n\n    assert.strictEqual(obj.e, 'AQAB');\n    assert.strictEqual(obj.kty, 'RSA');\n};\n\nspec.jwk.ecdsa = (obj) => {\n    assert.isObject(obj);\n    assert.isString(obj.crv);\n    assert.isString(obj.kty);\n    assert.isString(obj.x);\n    assert.isString(obj.y);\n\n    assert.strictEqual(obj.kty, 'EC');\n};\n"
  },
  {
    "path": "packages/core/acme-client/types/index.d.ts",
    "content": "/**\n * acme-client type definitions\n */\n\nimport { AxiosInstance } from 'axios';\nimport * as rfc8555 from './rfc8555';\nimport {CancelError} from '../src/error.js'\nexport * from '../src/error.js'\n\nexport type PrivateKeyBuffer = Buffer;\nexport type PublicKeyBuffer = Buffer;\nexport type CertificateBuffer = Buffer;\nexport type CsrBuffer = Buffer;\n\nexport type PrivateKeyString = string;\nexport type PublicKeyString = string;\nexport type CertificateString = string;\nexport type CsrString = string;\n\n/**\n * Augmented ACME interfaces\n */\n\nexport interface Order extends rfc8555.Order {\n    url: string;\n}\n\nexport interface Authorization extends rfc8555.Authorization {\n    url: string;\n}\n\nexport type UrlMapping={\n    enabled: boolean\n    mappings: Record<string, string>\n}\n\n/**\n * Client\n */\n\nexport interface ClientOptions {\n    sslProvider:string;\n    directoryUrl: string;\n    accountKey: PrivateKeyBuffer | PrivateKeyString;\n    accountUrl?: string;\n    externalAccountBinding?: ClientExternalAccountBindingOptions;\n    backoffAttempts?: number;\n    backoffMin?: number;\n    backoffMax?: number;\n    urlMapping?: UrlMapping;\n    signal?: AbortSignal;\n}\n\nexport interface ClientExternalAccountBindingOptions {\n    kid: string;\n    hmacKey: string;\n}\n\nexport interface ClientAutoOptions {\n    csr: CsrBuffer | CsrString;\n    challengeCreateFn: (authz: Authorization, keyAuthorization: (challenge:rfc8555.Challenge)=>Promise<string>) => Promise<{recordReq?:any,recordRes?:any,dnsProvider?:any,challenge: rfc8555.Challenge,keyAuthorization:string}>;\n    challengeRemoveFn: (authz: Authorization, challenge: rfc8555.Challenge, keyAuthorization: string,recordReq:any, recordRes:any,dnsProvider:any,httpUploader:any) => Promise<any>;\n    email?: string;\n    termsOfServiceAgreed?: boolean;\n    skipChallengeVerification?: boolean;\n    challengePriority?: string[];\n    preferredChain?: string;\n    signal?: AbortSignal;\n    profile?:string;\n}\n\nexport class Client {\n    constructor(opts: ClientOptions);\n    getTermsOfServiceUrl(): Promise<string>;\n    getAccountUrl(): string;\n    createAccount(data?: rfc8555.AccountCreateRequest): Promise<rfc8555.Account>;\n    updateAccount(data?: rfc8555.AccountUpdateRequest): Promise<rfc8555.Account>;\n    updateAccountKey(newAccountKey: PrivateKeyBuffer | PrivateKeyString, data?: object): Promise<rfc8555.Account>;\n    createOrder(data: rfc8555.OrderCreateRequest): Promise<Order>;\n    getOrder(order: Order): Promise<Order>;\n    finalizeOrder(order: Order, csr: CsrBuffer | CsrString): Promise<Order>;\n    getAuthorizations(order: Order): Promise<Authorization[]>;\n    deactivateAuthorization(authz: Authorization): Promise<Authorization>;\n    getChallengeKeyAuthorization(challenge: rfc8555.Challenge): Promise<string>;\n    verifyChallenge(authz: Authorization, challenge: rfc8555.Challenge): Promise<boolean>;\n    completeChallenge(challenge: rfc8555.Challenge): Promise<rfc8555.Challenge>;\n    waitForValidStatus<T = Order | Authorization | rfc8555.Challenge>(item: T): Promise<T>;\n    getCertificate(order: Order, preferredChain?: string): Promise<string>;\n    revokeCertificate(cert: CertificateBuffer | CertificateString, data?: rfc8555.CertificateRevocationRequest): Promise<void>;\n    auto(opts: ClientAutoOptions): Promise<string>;\n}\n\n/**\n * Directory URLs\n */\n\nexport const directory: {\n    buypass: {\n        staging: string,\n        production: string\n    },\n    google: {\n        staging: string,\n        production: string\n    },\n    letsencrypt: {\n        staging: string,\n        production: string\n    },\n    zerossl: {\n        staging: string,\n        production: string\n    }\n};\n\n/**\n * Crypto\n */\n\nexport interface CertificateDomains {\n    commonName: string;\n    altNames: string[];\n}\n\nexport interface CertificateIssuer {\n    commonName: string;\n}\n\nexport interface CertificateInfo {\n    issuer: CertificateIssuer;\n    domains: CertificateDomains;\n    notAfter: Date;\n    notBefore: Date;\n}\n\nexport interface CsrOptions {\n    keySize?: number;\n    commonName?: string;\n    altNames?: string[];\n    country?: string;\n    state?: string;\n    locality?: string;\n    organization?: string;\n    organizationUnit?: string;\n    emailAddress?: string;\n}\n\nexport interface RsaPublicJwk {\n    e: string;\n    kty: string;\n    n: string;\n}\n\nexport interface EcdsaPublicJwk {\n    crv: string;\n    kty: string;\n    x: string;\n    y: string;\n}\n\nexport interface CryptoInterface {\n    createPrivateKey(keySize?: number,encodingType?:string): Promise<PrivateKeyBuffer>;\n    createPrivateRsaKey(keySize?: number,encodingType?:string): Promise<PrivateKeyBuffer>;\n    createPrivateEcdsaKey(namedCurve?: 'P-256' | 'P-384' | 'P-521',encodingType?:string): Promise<PrivateKeyBuffer>;\n    getPublicKey(keyPem: PrivateKeyBuffer | PrivateKeyString | PublicKeyBuffer | PublicKeyString): PublicKeyBuffer;\n    getJwk(keyPem: PrivateKeyBuffer | PrivateKeyString | PublicKeyBuffer | PublicKeyString): RsaPublicJwk | EcdsaPublicJwk;\n    splitPemChain(chainPem: CertificateBuffer | CertificateString): string[];\n    getPemBodyAsB64u(pem: CertificateBuffer | CertificateString): string;\n    readCsrDomains(csrPem: CsrBuffer | CsrString): CertificateDomains;\n    readCertificateInfo(certPem: CertificateBuffer | CertificateString): CertificateInfo;\n    createCsr(data: CsrOptions, keyPem?: PrivateKeyBuffer | PrivateKeyString,encodingType?:string): Promise<[PrivateKeyBuffer, CsrBuffer]>;\n    createAlpnCertificate(authz: Authorization, keyAuthorization: string, keyPem?: PrivateKeyBuffer | PrivateKeyString): Promise<[PrivateKeyBuffer, CertificateBuffer]>;\n    isAlpnCertificateAuthorizationValid(certPem: CertificateBuffer | CertificateString, keyAuthorization: string): boolean;\n}\n\nexport const crypto: CryptoInterface;\n\n/* TODO: LEGACY */\nexport interface CryptoLegacyInterface {\n    createPrivateKey(size?: number): Promise<PrivateKeyBuffer>;\n    createPublicKey(key: PrivateKeyBuffer | PrivateKeyString): Promise<PublicKeyBuffer>;\n    getPemBody(str: string): string;\n    splitPemChain(str: string): string[];\n    getModulus(input: PrivateKeyBuffer | PrivateKeyString | PublicKeyBuffer | PublicKeyString | CertificateBuffer | CertificateString | CsrBuffer | CsrString): Promise<Buffer>;\n    getPublicExponent(input: PrivateKeyBuffer | PrivateKeyString | PublicKeyBuffer | PublicKeyString | CertificateBuffer | CertificateString | CsrBuffer | CsrString): Promise<Buffer>;\n    readCsrDomains(csr: CsrBuffer | CsrString): Promise<CertificateDomains>;\n    readCertificateInfo(cert: CertificateBuffer | CertificateString): Promise<CertificateInfo>;\n    createCsr(data: CsrOptions, key?: PrivateKeyBuffer | PrivateKeyString): Promise<[PrivateKeyBuffer, CsrBuffer]>;\n}\n\nexport const forge: CryptoLegacyInterface;\n\n/**\n * Axios\n */\n\nexport const axios: AxiosInstance;\n\nexport const agents: any;\n/**\n * Logger\n */\n\nexport function setLogger(fn: (message: any, ...args: any[]) => void): void;\n\nexport function walkTxtRecord(record: any): Promise<string[]>;\nexport function getAuthoritativeDnsResolver(record:string): Promise<any>;\n\nexport const CancelError: typeof CancelError;\n\nexport function resolveDomainBySoaRecord(domain: string): Promise<string>;"
  },
  {
    "path": "packages/core/acme-client/types/index.test-d.ts",
    "content": "/**\n * acme-client type definition tests\n */\n\nimport * as acme from 'acme-client';\n\n(async () => {\n    /* Client */\n    const accountKey = await acme.crypto.createPrivateKey();\n\n    const client = new acme.Client({\n        accountKey,\n        directoryUrl: acme.directory.letsencrypt.staging\n    });\n\n    /* Account */\n    await client.createAccount({\n        termsOfServiceAgreed: true,\n        contact: ['mailto:test@example.com']\n    });\n\n    /* Order */\n    const order = await client.createOrder({\n        identifiers: [\n            { type: 'dns', value: 'example.com' },\n            { type: 'dns', value: '*.example.com' },\n        ]\n    });\n\n    await client.getOrder(order);\n\n    /* Authorizations / Challenges */\n    const authorizations = await client.getAuthorizations(order);\n    const authorization = authorizations[0];\n    const challenge = authorization.challenges[0];\n\n    await client.getChallengeKeyAuthorization(challenge);\n    await client.verifyChallenge(authorization, challenge);\n    await client.completeChallenge(challenge);\n    await client.waitForValidStatus(challenge);\n\n    /* Finalize */\n    const [certKey, certCsr] = await acme.crypto.createCsr({\n        commonName: 'example.com',\n        altNames: ['example.com', '*.example.com']\n    });\n\n    await client.finalizeOrder(order, certCsr);\n    await client.getCertificate(order);\n    await client.getCertificate(order, 'DST Root CA X3');\n\n    /* Auto */\n    await client.auto({\n        csr: certCsr,\n        challengeCreateFn: async (authz, challenge, keyAuthorization) => {},\n        challengeRemoveFn: async (authz, challenge, keyAuthorization) => {}\n    });\n\n    await client.auto({\n        csr: certCsr,\n        email: 'test@example.com',\n        termsOfServiceAgreed: false,\n        skipChallengeVerification: false,\n        challengePriority: ['http-01', 'dns-01'],\n        preferredChain: 'DST Root CA X3',\n        challengeCreateFn: async (authz, challenge, keyAuthorization) => {},\n        challengeRemoveFn: async (authz, challenge, keyAuthorization) => {}\n    });\n})();\n"
  },
  {
    "path": "packages/core/acme-client/types/rfc8555.d.ts",
    "content": "/**\n * Account\n *\n * https://datatracker.ietf.org/doc/html/rfc8555#section-7.1.2\n * https://datatracker.ietf.org/doc/html/rfc8555#section-7.3\n * https://datatracker.ietf.org/doc/html/rfc8555#section-7.3.2\n */\n\nexport interface Account {\n    status: 'valid' | 'deactivated' | 'revoked';\n    orders: string;\n    contact?: string[];\n    termsOfServiceAgreed?: boolean;\n    externalAccountBinding?: object;\n}\n\nexport interface AccountCreateRequest {\n    contact?: string[];\n    termsOfServiceAgreed?: boolean;\n    onlyReturnExisting?: boolean;\n    externalAccountBinding?: object;\n}\n\nexport interface AccountUpdateRequest {\n    status?: string;\n    contact?: string[];\n    termsOfServiceAgreed?: boolean;\n}\n\n/**\n * Order\n *\n * https://datatracker.ietf.org/doc/html/rfc8555#section-7.1.3\n * https://datatracker.ietf.org/doc/html/rfc8555#section-7.4\n */\n\nexport interface Order {\n    status: 'pending' | 'ready' | 'processing' | 'valid' | 'invalid';\n    identifiers: Identifier[];\n    authorizations: string[];\n    finalize: string;\n    expires?: string;\n    notBefore?: string;\n    notAfter?: string;\n    error?: object;\n    certificate?: string;\n}\n\nexport interface OrderCreateRequest {\n    identifiers: Identifier[];\n    notBefore?: string;\n    notAfter?: string;\n}\n\n/**\n * Authorization\n *\n * https://datatracker.ietf.org/doc/html/rfc8555#section-7.1.4\n */\n\nexport interface Authorization {\n    identifier: Identifier;\n    status: 'pending' | 'valid' | 'invalid' | 'deactivated' | 'expired' | 'revoked';\n    challenges: Challenge[];\n    expires?: string;\n    wildcard?: boolean;\n}\n\nexport interface Identifier {\n    type: string;\n    value: string;\n}\n\n/**\n * Challenge\n *\n * https://datatracker.ietf.org/doc/html/rfc8555#section-8\n * https://datatracker.ietf.org/doc/html/rfc8555#section-8.3\n * https://datatracker.ietf.org/doc/html/rfc8555#section-8.4\n */\n\nexport interface ChallengeAbstract {\n    type: string;\n    url: string;\n    status: 'pending' | 'processing' | 'valid' | 'invalid';\n    validated?: string;\n    error?: object;\n}\n\nexport interface HttpChallenge extends ChallengeAbstract {\n    type: 'http-01';\n    token: string;\n}\n\nexport interface DnsChallenge extends ChallengeAbstract {\n    type: 'dns-01';\n    token: string;\n}\n\nexport type Challenge = HttpChallenge | DnsChallenge;\n\n/**\n * Certificate\n *\n * https://datatracker.ietf.org/doc/html/rfc8555#section-7.6\n */\n\nexport enum CertificateRevocationReason {\n    Unspecified = 0,\n    KeyCompromise = 1,\n    CACompromise = 2,\n    AffiliationChanged = 3,\n    Superseded = 4,\n    CessationOfOperation = 5,\n    CertificateHold = 6,\n    RemoveFromCRL = 8,\n    PrivilegeWithdrawn = 9,\n    AACompromise = 10,\n}\n\nexport interface CertificateRevocationRequest {\n    reason?: CertificateRevocationReason;\n}\n"
  },
  {
    "path": "packages/core/basic/.eslintrc",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"plugins\": [\n    \"@typescript-eslint\"\n  ],\n  \"extends\": [\n    \"plugin:@typescript-eslint/recommended\",\n    \"plugin:prettier/recommended\",\n    \"prettier\"\n  ],\n  \"env\": {\n    \"mocha\": true\n  },\n  \"rules\": {\n    \"@typescript-eslint/no-var-requires\": \"off\",\n    \"@typescript-eslint/ban-ts-comment\": \"off\",\n    \"@typescript-eslint/ban-ts-ignore\": \"off\",\n    \"@typescript-eslint/no-explicit-any\": \"off\",\n    \"@typescript-eslint/no-empty-function\": \"off\",\n    \"@typescript-eslint/no-unused-vars\": \"off\"\n  }\n}\n"
  },
  {
    "path": "packages/core/basic/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n\ntest/user.secret.*\ntest/**/*.js\nsrc/**/*.spec.ts\n"
  },
  {
    "path": "packages/core/basic/.npmignore",
    "content": "node_modules\nsrc\ndist/**/*.spec.*"
  },
  {
    "path": "packages/core/basic/.npmrc",
    "content": "link-workspace-packages=deep\nprefer-workspace-packages=true\n"
  },
  {
    "path": "packages/core/basic/.prettierrc",
    "content": "{\n  \"printWidth\": 220,\n  \"bracketSpacing\": true,\n  \"singleQuote\": false,\n  \"trailingComma\": \"es5\",\n  \"arrowParens\": \"avoid\"\n}"
  },
  {
    "path": "packages/core/basic/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n### Performance Improvements\n\n* 证书检查支持自定义dns服务器 ([c53bb7c](https://github.com/certd/certd/commit/c53bb7cf677faa32729709ae0c10359db5194d7a))\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n**Note:** Version bump only for package @certd/basic\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n**Note:** Version bump only for package @certd/basic\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n### Performance Improvements\n\n* 支持部署到飞牛OS ([ddfd0fb](https://github.com/certd/certd/commit/ddfd0fb81d6638352920261065f1ab8e27bdd564))\n* 支持日志写入文件 ([37edbf5](https://github.com/certd/certd/commit/37edbf5824d6aaae68ea1ef7259c6f739d418d2c))\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n### Performance Improvements\n\n* 支持部署到宝塔aaWAF ([094565c](https://github.com/certd/certd/commit/094565ccd619ef671c6c11ce5fb7fd54a7a21d1c))\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n### Bug Fixes\n\n* 修复导入在线插件不生效的bug ([fcf8309](https://github.com/certd/certd/commit/fcf8309c238208281ecb4575b2c3cfe50c11d783))\n* 修复自建插件保存丢失部署策略的bug ([863e74d](https://github.com/certd/certd/commit/863e74dd2e3912f950ff5025b5ed0070aeb37035))\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n### Performance Improvements\n\n* 支持部署证书到火山dcdn ([5f85219](https://github.com/certd/certd/commit/5f852194953dc1b4e6336770f417507b8f5a33ad))\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n### Performance Improvements\n\n* 支持51dns ([96a0900](https://github.com/certd/certd/commit/96a0900edc95dcfd9acccf9d13592f12f5a09b3d))\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n### Performance Improvements\n\n* 多重认证登录 ([0f82cf4](https://github.com/certd/certd/commit/0f82cf409bc60706ab07e4ca4f272b9a1ca7eecb))\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n### Bug Fixes\n\n* 修复某些情况下无法输出日志的bug ([70101bf](https://github.com/certd/certd/commit/70101bfa7ade65678d9202c804bbae2cb808b594))\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n**Note:** Version bump only for package @certd/basic\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n**Note:** Version bump only for package @certd/basic\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.31.10](https://github.com/certd/certd/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.31.9](https://github.com/certd/certd/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n### Performance Improvements\n\n* 支持又拍云cdn ([fd0536b](https://github.com/certd/certd/commit/fd0536bd4b41f15b6b5d42e0b447f0dcbf73b8a8))\n\n## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n### Performance Improvements\n\n* 支持部署到天翼云CDN ([82a72e0](https://github.com/certd/certd/commit/82a72e0b497efa043d342ad0e33c083a2de79a05))\n\n## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n**Note:** Version bump only for package @certd/basic\n\n# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n### Performance Improvements\n\n* 流水线同一个阶段任务优化为并行执行 ([efa9c74](https://github.com/certd/certd/commit/efa9c748c5c07fc950af3db742ef9310f1ac9a4b))\n* 支持易盾RCDN部署 ([065713c](https://github.com/certd/certd/commit/065713cdb6953d16df08585c316c1a7a8eaec437))\n\n## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n### Performance Improvements\n\n* 支持新版本LeCDN ([44d43f4](https://github.com/certd/certd/commit/44d43f45cb9094619df7494c2a64a51ba77ad116))\n\n## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n**Note:** Version bump only for package @certd/basic\n\n# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n### Bug Fixes\n\n* 修复某处金额转换丢失精度的bug ([d2d6f12](https://github.com/certd/certd/commit/d2d6f12218cbe7bd55f4ae082b93084be85f0a7b))\n\n# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n### Features\n\n* 用户套餐，用户支付功能 ([a019956](https://github.com/certd/certd/commit/a019956698acaf2c4beb620b5ad8c18918ead6a1))\n* 支持微信支付 ([45d6347](https://github.com/certd/certd/commit/45d6347f5b6199493b11aabdd74177f6dca2cea4))\n\n### Performance Improvements\n\n* 站点证书监控通知发送，每天定时检查 ([bb4910f](https://github.com/certd/certd/commit/bb4910f4e57234e42b44505f4620ae7af66025c5))\n* 支持plesk网站证书部署 ([eda45c1](https://github.com/certd/certd/commit/eda45c1528199648b3970505e87f492d398226cd))\n\n## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n### Performance Improvements\n\n* 通知选择器优化 ([2c0cbdd](https://github.com/certd/certd/commit/2c0cbdd29ecb74cc939b2ae7ee86b8d40f70ba31))\n\n# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n### Performance Improvements\n\n* 优化证书申请成功通知发送方式 ([8002a56](https://github.com/certd/certd/commit/8002a56efc5998aa03db5711ae87f9eb4bc9e160))\n* 支持短信验证码登录 ([387bcc5](https://github.com/certd/certd/commit/387bcc5fa418cdeea81a06da5e3f8cd6b43cd082))\n\n## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n### Performance Improvements\n\n* 系统设置中的代理设置优化为可全局生效，环境变量中的https_proxy设置将无效 ([381a37f](https://github.com/certd/certd/commit/381a37fbaa6b61c887eda743897ae00afb825bdf))\n* 新手导航在非编辑模式下不显示 ([18bfcc2](https://github.com/certd/certd/commit/18bfcc24ad0bde57bb04db8a4209861ec6b8ff1d))\n* 优化腾讯云 cloudflare 重复解析记录时的返回值 ([90d1b68](https://github.com/certd/certd/commit/90d1b68bd6cf232fbe085234efe07d29b7690044))\n\n## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n### Bug Fixes\n\n* 修复ipv6未开启情况下，请求带有ipv6地址域名报ETIMEDOUT的bug ([a9a0967](https://github.com/certd/certd/commit/a9a0967a6f1d0bd27e69f3ec52c31d90d470bc23))\n\n## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n### Performance Improvements\n\n* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941))\n\n## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n### Performance Improvements\n\n* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9))\n\n# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n### Performance Improvements\n\n* 支持华为云cdn ([81a3fdb](https://github.com/certd/certd/commit/81a3fdbc29b71f380762008cc151493ec97458f9))\n\n## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n### Bug Fixes\n\n* 修复启动时自签证书无法保存的bug ([526c484](https://github.com/certd/certd/commit/526c48450bcd37b3ccded9b448f17de8140bdc6e))\n\n## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n### Performance Improvements\n\n* 新增部署到百度云CDN插件 ([f126f9f](https://github.com/certd/certd/commit/f126f9f932d37fa01fff1accc7bdd17d349f8db5))\n\n## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n### Bug Fixes\n\n* 申请证书没有使用到系统设置的http代理的bug ([3db216f](https://github.com/certd/certd/commit/3db216f515ba404cb4330fdab452971b22a50f08))\n\n## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n### Performance Improvements\n\n* 新增代理设置功能 ([273ab61](https://github.com/certd/certd/commit/273ab6139f5807f4d7fe865cc353b97f51b9a668))\n\n## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n**Note:** Version bump only for package @certd/basic\n\n## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package @certd/basic\n\n# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n### Performance Improvements\n\n* 检查cname是否正确配置 ([b5d8935](https://github.com/certd/certd/commit/b5d8935159374fbe7fc7d4c48ae0ed9396861bdd))\n"
  },
  {
    "path": "packages/core/basic/LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "packages/core/basic/build.md",
    "content": "23:02\n"
  },
  {
    "path": "packages/core/basic/package.json",
    "content": "{\n  \"name\": \"@certd/basic\",\n  \"private\": false,\n  \"version\": \"1.36.10\",\n  \"type\": \"module\",\n  \"main\": \"./dist/index.js\",\n  \"module\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.ts\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"before-build\": \"rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache\",\n    \"build\": \"npm run before-build && tsc --skipLibCheck\",\n    \"dev-build\": \"npm run build\",\n    \"preview\": \"vite preview\",\n    \"test\": \"mocha   --loader=ts-node/esm\",\n    \"pub\": \"npm publish\"\n  },\n  \"dependencies\": {\n    \"axios\": \"^1.7.2\",\n    \"dayjs\": \"^1.11.7\",\n    \"http-proxy-agent\": \"^7.0.2\",\n    \"https-proxy-agent\": \"^7.0.5\",\n    \"iconv-lite\": \"^0.6.3\",\n    \"lodash-es\": \"^4.17.21\",\n    \"log4js\": \"^6.9.1\",\n    \"lru-cache\": \"^10.0.0\",\n    \"mitt\": \"^3.0.1\",\n    \"nanoid\": \"^5.0.7\",\n    \"node-forge\": \"^1.3.1\",\n    \"nodemailer\": \"^6.9.3\"\n  },\n  \"devDependencies\": {\n    \"@types/chai\": \"^4.3.10\",\n    \"@types/lodash-es\": \"^4.17.12\",\n    \"@types/mocha\": \"^10.0.1\",\n    \"@types/node-forge\": \"^1.3.2\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.26.1\",\n    \"@typescript-eslint/parser\": \"^8.26.1\",\n    \"chai\": \"4.3.10\",\n    \"eslint\": \"^8.41.0\",\n    \"eslint-config-prettier\": \"^8.8.0\",\n    \"eslint-plugin-prettier\": \"^4.2.1\",\n    \"prettier\": \"^2.8.8\",\n    \"rimraf\": \"^5.0.5\",\n    \"tslib\": \"^2.8.1\",\n    \"typescript\": \"^5.4.2\"\n  },\n  \"gitHead\": \"085bdf5cfa9140903611aa12cdd2542d05aba321\"\n}\n"
  },
  {
    "path": "packages/core/basic/readme.md",
    "content": ""
  },
  {
    "path": "packages/core/basic/src/index.ts",
    "content": "export * from './utils/index.js';\nexport * from './utils/util.id.js';\n"
  },
  {
    "path": "packages/core/basic/src/utils/index.ts",
    "content": "export * from \"./util.request.js\";\nexport * from \"./util.env.js\";\nexport * from \"./util.log.js\";\nexport * from \"./util.file.js\";\nexport * from \"./util.sp.js\";\nexport * from \"./util.promise.js\";\nexport * from \"./util.hash.js\";\nexport * from \"./util.merge.js\";\nexport * from \"./util.cache.js\";\nexport * from \"./util.string.js\";\nexport * from \"./util.lock.js\";\nexport * from \"./util.mitter.js\";\nexport * from \"./util.id.js\";\nexport * from \"./util.domain.js\";\nexport * from \"./util.amount.js\";\nimport { stringUtils } from \"./util.string.js\";\nimport sleep from \"./util.sleep.js\";\nimport { http, download } from \"./util.request.js\";\n\nimport { mergeUtils } from \"./util.merge.js\";\nimport { sp } from \"./util.sp.js\";\nimport { hashUtils } from \"./util.hash.js\";\nimport { promises } from \"./util.promise.js\";\nimport { fileUtils } from \"./util.file.js\";\nimport * as _ from \"lodash-es\";\nimport { cache } from \"./util.cache.js\";\nimport dayjs from \"dayjs\";\nimport { domainUtils } from \"./util.domain.js\";\nimport { optionsUtils } from \"./util.options.js\";\nimport { amountUtils } from \"./util.amount.js\";\nimport { nanoid } from \"nanoid\";\nimport * as id from \"./util.id.js\";\nimport { locker } from \"./util.lock.js\";\nimport { mitter } from \"./util.mitter.js\";\n\nimport * as request from \"./util.request.js\";\nexport * from \"./util.cache.js\";\nexport const utils = {\n  sleep,\n  http,\n  download,\n  sp,\n  hash: hashUtils,\n  promises,\n  file: fileUtils,\n  _,\n  mergeUtils,\n  cache,\n  nanoid,\n  id,\n  dayjs,\n  domain: domainUtils,\n  options: optionsUtils,\n  string: stringUtils,\n  locker,\n  mitter,\n  amount: amountUtils,\n  request,\n};\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.amount.ts",
    "content": "export const amountUtils = {\n  toCent(amount: number): number {\n    return parseInt((amount * 100).toFixed(0));\n  },\n\n  toYuan(amount: number): number {\n    return parseFloat((amount / 100).toFixed(2));\n  },\n};\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.cache.ts",
    "content": "// LRUCache\n\nimport { LRUCache } from \"lru-cache\";\n\nexport const cache = new LRUCache<string, any>({\n  max: 1000,\n  ttl: 1000 * 60 * 10,\n});\n\nexport class LocalCache<V = any> {\n  cache: Map<string, { value: V; expiresAt: number }>;\n  constructor(opts: { clearInterval?: number } = {}) {\n    this.cache = new Map();\n    setInterval(() => {\n      this.clearExpires();\n    }, opts.clearInterval ?? 5 * 60 * 1000);\n  }\n\n  get(key: string): V | undefined {\n    const entry = this.cache.get(key);\n    if (!entry) {\n      return undefined;\n    }\n\n    // 检查是否过期\n    if (Date.now() > entry.expiresAt) {\n      this.cache.delete(key);\n      return undefined;\n    }\n\n    return entry.value;\n  }\n\n  set(key: string, value: V, ttl = 300000) {\n    // 默认5分钟 (300000毫秒)\n    this.cache.set(key, {\n      value,\n      expiresAt: Date.now() + ttl,\n    });\n  }\n\n  clear() {\n    this.cache.clear();\n  }\n\n  clearExpires() {\n    for (const [key, entry] of this.cache) {\n      if (entry.expiresAt < Date.now()) {\n        this.cache.delete(key);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.domain.ts",
    "content": "//域名是否匹配，支持通配符\nfunction match(targetDomains: string | string[], inDomains: string[]) {\n  if (!targetDomains || targetDomains.length == 0) {\n    return false;\n  }\n  if (!inDomains || inDomains.length == 0) {\n    return false;\n  }\n\n  if (typeof targetDomains === 'string') {\n    targetDomains = [targetDomains];\n  }\n  for (let targetDomain of targetDomains) {\n    let matched = false;\n    if (targetDomain.startsWith('.')) {\n      targetDomain = '*' + targetDomain;\n    }\n    for (let inDomain of inDomains) {\n      if (inDomain.startsWith('.')) {\n        inDomain = '*' + inDomain;\n      }\n      if (targetDomain === inDomain) {\n        matched = true;\n        break;\n      }\n\n      if (!inDomain.startsWith('*.')) {\n        //不可能匹配\n        continue;\n      }\n      //子域名匹配通配符即可\n      const firstDotIndex = targetDomain.indexOf('.');\n      const targetDomainSuffix = targetDomain.substring(firstDotIndex + 1);\n      if (targetDomainSuffix === inDomain.substring(2)) {\n        matched = true;\n        break;\n      }\n    }\n    //有一个没有匹配上，就失败\n    if (!matched) {\n      return false;\n    }\n    //这个匹配上了，检查下一个\n  }\n  //没有提前return 全部匹配上了\n  return true;\n}\n\nexport const domainUtils = {\n  match,\n};\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.env.ts",
    "content": "export function isDev() {\n  const nodeEnv = process.env.NODE_ENV || '';\n  return nodeEnv === 'development' || nodeEnv.includes('local') || nodeEnv.startsWith('dev');\n}\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.file.ts",
    "content": "import fs from 'fs';\nfunction getFileRootDir(rootDir?: string) {\n  if (rootDir == null) {\n    const userHome = process.env.HOME || process.env.USERPROFILE;\n    rootDir = userHome + '/.certd/storage/';\n  }\n\n  if (!fs.existsSync(rootDir)) {\n    fs.mkdirSync(rootDir, { recursive: true });\n  }\n  return rootDir;\n}\n\nexport const fileUtils = {\n  getFileRootDir,\n};\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.hash.ts",
    "content": "import crypto, { BinaryToTextEncoding } from \"crypto\";\n\nfunction md5(data: string, digest: BinaryToTextEncoding = \"hex\") {\n  return crypto.createHash(\"md5\").update(data).digest(digest);\n}\nfunction sha256(data: string, digest: BinaryToTextEncoding = \"hex\") {\n  return crypto.createHash(\"sha256\").update(data).digest(digest);\n}\n\nfunction hmacSha256(data: string, digest: BinaryToTextEncoding = \"base64\") {\n  return crypto.createHmac(\"sha256\", data).update(Buffer.alloc(0)).digest(digest);\n}\n\nfunction base64(data: string) {\n  return Buffer.from(data).toString(\"base64\");\n}\nfunction base64Decode(data: string) {\n  return Buffer.from(data, \"base64\").toString(\"utf8\");\n}\nexport const hashUtils = {\n  md5,\n  sha256,\n  base64,\n  base64Decode,\n  hmacSha256,\n};\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.id.ts",
    "content": "import { customAlphabet } from \"nanoid\";\n\nexport const randomNumber = customAlphabet(\"1234567890\", 4);\nexport const simpleNanoId = customAlphabet(\"1234567890abcdefghijklmopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ\", 12);\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.lock.ts",
    "content": "import { logger, utils } from './index.js';\n\nexport class Locker {\n  locked: Record<string, any> = {};\n\n  async execute(lockStr: string, callback: any) {\n    await this.lock(lockStr);\n    const timeoutId = setTimeout(() => {\n      logger.warn('Lock timeout,自动解锁', lockStr);\n      this.unlock(lockStr);\n    }, 20000);\n    try {\n      return await callback();\n    } finally {\n      clearTimeout(timeoutId);\n      this.unlock(lockStr);\n    }\n  }\n\n  async lock(str: string) {\n    const isLocked = this.isLocked(str);\n    if (isLocked) {\n      let count = 0;\n      while (true) {\n        await utils.sleep(100);\n        if (!this.isLocked(str)) {\n          break;\n        }\n        count++;\n        if (count > 20) {\n          throw new Error('Lock timeout');\n        }\n      }\n    }\n    this.locked[str] = true;\n  }\n\n  unlock(str: string) {\n    delete this.locked[str];\n  }\n\n  isLocked(str: string) {\n    return this.locked[str] ?? false;\n  }\n}\n\nexport const locker = new Locker();\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.log.ts",
    "content": "import log4js, { LoggingEvent, Logger } from \"log4js\";\n\nconst OutputAppender = {\n  configure: (config: any, layouts: any, findAppender: any, levels: any) => {\n    let layout = layouts.basicLayout;\n    if (config.layout) {\n      layout = layouts.layout(config.layout.type, config.layout);\n    }\n    function customAppender(layout: any, timezoneOffset: any) {\n      return (loggingEvent: LoggingEvent) => {\n        if (loggingEvent.context.outputHandler?.write) {\n          const text = `${layout(loggingEvent, timezoneOffset)}\\n`;\n          loggingEvent.context.outputHandler.write(text);\n        }\n      };\n    }\n    return customAppender(layout, config.timezoneOffset);\n  },\n};\n\nlet logFilePath = \"./logs/app.log\";\nexport function resetLogConfigure() {\n  // @ts-ignore\n  log4js.configure({\n    appenders: {\n      std: { type: \"stdout\" },\n      output: { type: OutputAppender },\n      file: {\n        type: \"dateFile\",\n        filename: logFilePath,\n        keepFileExt: true,\n        compress: true,\n        numBackups: 3,\n      },\n    },\n    categories: { default: { appenders: [\"std\", \"file\"], level: \"info\" }, pipeline: { appenders: [\"std\", \"file\", \"output\"], level: \"info\" } },\n  });\n}\nresetLogConfigure();\nexport const logger = log4js.getLogger(\"default\");\n\nexport function resetLogFilePath(filePath: string) {\n  logFilePath = filePath;\n  resetLogConfigure();\n}\nexport function buildLogger(write: (text: string) => void) {\n  const logger = log4js.getLogger(\"pipeline\");\n  const _secrets: string[] = [];\n  //@ts-ignore\n  logger.addSecret = (secret: string) => {\n    _secrets.push(secret);\n  };\n  logger.addContext(\"outputHandler\", {\n    write: (text: string) => {\n      for (const item of _secrets) {\n        if (item == null) {\n          continue;\n        }\n        if (item.includes(text)) {\n          //整个包含\n          text = \"*\".repeat(text.length);\n          continue;\n        }\n        if (text.includes(item)) {\n          //换成同长度的*号， item可能有多行\n          text = text.replaceAll(item, \"*\".repeat(item.length));\n        }\n      }\n      write(text);\n    },\n  });\n  return logger;\n}\n\nexport type ILogger = Logger;\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.merge.ts",
    "content": "import * as _ from 'lodash-es';\nfunction isUnMergeable(srcValue: any) {\n  return srcValue != null && srcValue instanceof UnMergeable;\n}\nfunction isUnCloneable(value: any) {\n  return isUnMergeable(value) && !value.cloneable;\n}\nfunction merge(target: any, ...sources: any) {\n  /**\n   * 如果目标为不可合并对象，比如array、unMergeable、ref,则直接覆盖不合并\n   * @param objValue 被合并对象\n   * @param srcValue 来源对象\n   */\n  function customizer(objValue: any, srcValue: any) {\n    if (srcValue == null) {\n      return;\n    }\n    // 如果被合并对象为数组，则直接被覆盖对象覆盖，只要覆盖对象不为空\n    if (_.isArray(objValue)) {\n      //原对象如果是数组\n      return srcValue; //来源对象\n    }\n\n    if (isUnMergeable(srcValue)) {\n      return srcValue;\n    }\n  }\n\n  let found: any = null;\n  for (const item of sources) {\n    if (isUnMergeable(item)) {\n      found = item;\n    }\n  }\n  if (found) {\n    return found;\n  }\n  return _.mergeWith(target, ...sources, customizer);\n}\n\nfunction cloneDeep(target: any) {\n  if (isUnCloneable(target)) {\n    return target;\n  }\n  function customizer(value: any) {\n    if (isUnCloneable(value)) {\n      return value;\n    }\n  }\n\n  return _.cloneDeepWith(target, customizer);\n}\nexport class UnMergeable {\n  cloneable = false;\n\n  setCloneable(cloneable: any) {\n    this.cloneable = cloneable;\n  }\n}\n\nexport const mergeUtils = {\n  merge,\n  cloneDeep,\n};\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.mitter.ts",
    "content": "import mitt from 'mitt';\nexport const mitter = mitt();\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.options.ts",
    "content": "import { domainUtils } from \"./util.domain.js\";\n\nfunction groupByDomain(options: any[], inDomains: string[]) {\n  const matched = [];\n  const notMatched = [];\n  for (const item of options) {\n    if (domainUtils.match(item.domain, inDomains)) {\n      matched.push(item);\n    } else {\n      notMatched.push(item);\n    }\n  }\n  return {\n    matched,\n    notMatched,\n  };\n}\n\nfunction buildGroupOptions(options: any[], inDomains: string[]) {\n  const grouped = groupByDomain(options, inDomains);\n  const groupOptions = [];\n  groupOptions.push({ value: \"matched\", disabled: true, label: \"----已匹配----\" });\n  if (grouped.matched.length === 0) {\n    options.push({ value: \"\", disabled: true, label: \"没有可以匹配的域名\" });\n  } else {\n    for (const matched of grouped.matched) {\n      groupOptions.push(matched);\n    }\n  }\n  if (grouped.notMatched.length > 0) {\n    groupOptions.push({ value: \"unmatched\", disabled: true, label: \"----未匹配----\" });\n    for (const notMatched of grouped.notMatched) {\n      groupOptions.push(notMatched);\n    }\n  }\n  return groupOptions;\n}\n\nexport const optionsUtils = {\n  //获取分组\n  groupByDomain,\n  //构建分组后的选项列表，常用\n  buildGroupOptions,\n};\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.promise.ts",
    "content": "import { logger } from \"./util.log.js\";\n\nexport function TimeoutPromise(callback: () => Promise<void>, ms = 30 * 1000) {\n  let timeout: any;\n  return Promise.race([\n    callback(),\n    new Promise((resolve, reject) => {\n      timeout = setTimeout(() => {\n        reject(new Error(`Task timeout in ${ms} ms`));\n      }, ms);\n    }),\n  ]).finally(() => {\n    clearTimeout(timeout);\n  });\n}\n\nexport function safePromise<T>(callback: (resolve: (ret: T) => void, reject: (ret: any) => void) => void): Promise<T> {\n  return new Promise((resolve, reject) => {\n    try {\n      callback(resolve, reject);\n    } catch (e) {\n      logger.error(e);\n      reject(e);\n    }\n  });\n}\n\nexport function promisify(func: any) {\n  return function (...args: any) {\n    return new Promise((resolve, reject) => {\n      try {\n        func(...args, (err: any, data: any) => {\n          if (err) {\n            reject(err);\n          } else {\n            resolve(data);\n          }\n        });\n      } catch (e) {\n        reject(e);\n      }\n    });\n  };\n}\n\nexport const promises = {\n  TimeoutPromise,\n  safePromise,\n  promisify,\n};\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.request.ts",
    "content": "import axios, { AxiosHeaders, AxiosRequestConfig } from \"axios\";\nimport { ILogger, logger } from \"./util.log.js\";\nimport { Logger } from \"log4js\";\nimport { HttpProxyAgent } from \"http-proxy-agent\";\nimport { HttpsProxyAgent } from \"https-proxy-agent\";\nimport nodeHttp from \"http\";\nimport * as https from \"node:https\";\nimport { merge } from \"lodash-es\";\nimport { safePromise } from \"./util.promise.js\";\nimport fs from \"fs\";\nexport class HttpError extends Error {\n  status?: number;\n  statusText?: string;\n  code?: string;\n  request?: { baseURL: string; url: string; method: string; params?: any; data?: any };\n  response?: { data: any; headers: AxiosHeaders };\n  cause?: any;\n  constructor(error: any) {\n    if (!error) {\n      return;\n    }\n    super(error.message || error.response?.statusText);\n\n    const message = error?.message;\n    if (message && typeof message === \"string\") {\n      if (message.indexOf && message.indexOf(\"ssl3_get_record:wrong version number\") >= 0) {\n        this.message = `${message}(http协议错误，服务端要求http协议，请检查是否使用了https请求)`;\n      } else if (message.indexOf(\"getaddrinfo EAI_AGAIN\") >= 0) {\n        this.message = `${message}(无法解析域名，请检查网络连接或dns配置，更换docker-compose.yaml中dns配置)`;\n      }\n    }\n\n    this.name = error.name;\n    this.code = error.code;\n\n    this.status = error.response?.status;\n    this.statusText = error.response?.statusText || error.code;\n    if (!this.message) {\n      this.message = error.code;\n    }\n    this.request = {\n      baseURL: error.config?.baseURL,\n      url: error.config?.url,\n      method: error.config?.method,\n      params: error.config?.params,\n      data: error.config?.data,\n    };\n    let url = error.config?.url;\n    if (error.config?.baseURL) {\n      url = (error.config?.baseURL || \"\") + url;\n    }\n    if (url) {\n      this.message = `${this.message} 【${url}】`;\n    }\n\n    this.response = {\n      data: error.response?.data,\n      headers: error.response?.headers,\n    };\n\n    const { stack, cause } = error;\n    this.cause = cause;\n    this.stack = stack;\n    delete error.response;\n    delete error.config;\n    delete error.request;\n    // logger.error(error);\n  }\n}\n\nexport const HttpCommonError = HttpError;\n\nlet defaultAgents = createAgent();\n\nexport function setGlobalProxy(opts: { httpProxy?: string; httpsProxy?: string }) {\n  logger.info(\"setGlobalProxy:\", opts);\n  defaultAgents = createAgent(opts);\n}\n\nexport function getGlobalAgents() {\n  return defaultAgents;\n}\n\n/**\n * @description 创建请求实例\n */\nexport function createAxiosService({ logger }: { logger: Logger }) {\n  // 创建一个 axios 实例\n  const service = axios.create();\n\n  // 请求拦截\n  service.interceptors.request.use(\n    (config: any) => {\n      if (config.logParams == null) {\n        config.logParams = false;\n      }\n      if (config.logRes == null) {\n        config.logRes = false;\n      }\n      if (config.logData == null) {\n        config.logData = false;\n      }\n\n      logger.info(`http request:${config.url}，method:${config.method}`);\n      if (config.logParams !== false && config.params) {\n        logger.info(`params:${JSON.stringify(config.params)}`);\n      }\n      if (config.logData !== false && config.data) {\n        logger.info(`data:${JSON.stringify(config.data)}`);\n      }\n      if (config.timeout == null) {\n        config.timeout = 15000;\n      }\n      let agents = defaultAgents;\n      if (config.skipSslVerify || config.httpProxy) {\n        let rejectUnauthorized = true;\n        if (config.skipSslVerify) {\n          logger.info(\"跳过SSL验证\");\n          rejectUnauthorized = false;\n        }\n        const proxy: any = {};\n        if (config.httpProxy) {\n          logger.info(\"使用自定义http代理:\", config.httpProxy);\n          proxy.httpProxy = config.httpProxy;\n          proxy.httpsProxy = config.httpProxy;\n        }\n\n        agents = createAgent({ rejectUnauthorized, ...proxy } as any);\n      }\n\n      delete config.skipSslVerify;\n      config.httpsAgent = agents.httpsAgent;\n      config.httpAgent = agents.httpAgent;\n\n      // const agent = new https.Agent({\n      //   rejectUnauthorized: false  // 允许自签名证书\n      // });\n      // config.httpsAgent = agent;\n      config.proxy = false; //必须 否则还会走一层代理，\n      return config;\n    },\n    (error: Error) => {\n      // 发送失败\n      logger.error(\"接口请求失败：\", error);\n      return Promise.reject(error);\n    }\n  );\n  // 响应拦截\n  service.interceptors.response.use(\n    (response: any) => {\n      if (response?.config?.logRes !== false) {\n        let resData = response?.data;\n        try {\n          resData = JSON.stringify(response?.data);\n        } catch (e) {}\n\n        logger.info(`http response : status=${response?.status},data=${resData}`);\n      } else {\n        logger.info(\"http response status:\", response?.status);\n      }\n\n      if (response?.config?.returnOriginRes) {\n        return response;\n      }\n      return response.data;\n    },\n    (error: any) => {\n      const status = error.response?.status;\n      switch (status) {\n        case 400:\n          error.message = \"请求错误\";\n          break;\n        case 401:\n          error.message = \"认证/登录失败\";\n          break;\n        case 403:\n          error.message = \"拒绝访问\";\n          break;\n        case 404:\n          error.message = `请求地址出错`;\n          break;\n        case 408:\n          error.message = \"请求超时\";\n          break;\n        case 500:\n          error.message = \"服务器内部错误\";\n          break;\n        case 501:\n          error.message = \"服务未实现\";\n          break;\n        case 502:\n          error.message = \"网关错误\";\n          break;\n        case 503:\n          error.message = \"服务不可用\";\n          break;\n        case 504:\n          error.message = \"网关超时\";\n          break;\n        case 505:\n          error.message = \"HTTP版本不受支持\";\n          break;\n        default:\n          break;\n      }\n      logger.error(`请求出错：status:${error.response?.status},statusText:${error.response?.statusText},url:${error.config?.url},method:${error.config?.method}。`);\n      logger.error(\"返回数据:\", JSON.stringify(error.response?.data));\n      if (error.response?.data) {\n        const message = error.response.data.message || error.response.data.msg || error.response.data.error;\n        if (typeof message === \"string\") {\n          error.message = message;\n        }\n      }\n      if (error instanceof AggregateError) {\n        logger.error(\"AggregateError\", error);\n      }\n      const err = new HttpError(error);\n      if (error.response?.config?.logParams === false) {\n        delete err.request?.params;\n        delete err.request?.data;\n      }\n      return Promise.reject(err);\n    }\n  );\n  return service;\n}\n\nexport const http = createAxiosService({ logger }) as HttpClient;\nexport type HttpClientResponse<R> = any;\nexport type HttpRequestConfig<D = any> = {\n  skipSslVerify?: boolean;\n  skipCheckRes?: boolean;\n  logParams?: boolean;\n  logRes?: boolean;\n  logData?: boolean;\n  httpProxy?: string;\n  returnOriginRes?: boolean;\n} & AxiosRequestConfig<D>;\nexport type HttpClient = {\n  request<D = any, R = any>(config: HttpRequestConfig<D>): Promise<HttpClientResponse<R>>;\n};\n\n// const http_proxy_backup = process.env.HTTP_PROXY || process.env.http_proxy;\n// const https_proxy_backup = process.env.HTTPS_PROXY || process.env.https_proxy;\n\nexport type CreateAgentOptions = {\n  httpProxy?: string;\n  httpsProxy?: string;\n} & nodeHttp.AgentOptions;\nexport function createAgent(opts: CreateAgentOptions = {}) {\n  opts = merge(\n    {\n      autoSelectFamily: true,\n      autoSelectFamilyAttemptTimeout: 1000,\n    },\n    opts\n  );\n\n  let httpAgent, httpsAgent;\n  const httpProxy = opts.httpProxy;\n  if (httpProxy) {\n    process.env.HTTP_PROXY = httpProxy;\n    process.env.http_proxy = httpProxy;\n    logger.info(\"use httpProxy:\", httpProxy);\n    httpAgent = new HttpProxyAgent(httpProxy, opts as any);\n    merge(httpAgent.options, opts);\n  } else {\n    process.env.HTTP_PROXY = \"\";\n    process.env.http_proxy = \"\";\n    httpAgent = new nodeHttp.Agent(opts);\n  }\n  const httpsProxy = opts.httpsProxy;\n  if (httpsProxy) {\n    process.env.HTTPS_PROXY = httpsProxy;\n    process.env.https_proxy = httpsProxy;\n    logger.info(\"use httpsProxy:\", httpsProxy);\n    httpsAgent = new HttpsProxyAgent(httpsProxy, opts as any);\n    merge(httpsAgent.options, opts);\n  } else {\n    process.env.HTTPS_PROXY = \"\";\n    process.env.https_proxy = \"\";\n    httpsAgent = new https.Agent(opts);\n  }\n  return {\n    httpAgent,\n    httpsAgent,\n  };\n}\n\nexport async function download(req: { http: HttpClient; config: HttpRequestConfig; savePath: string; logger: ILogger }) {\n  const { http, config, savePath, logger } = req;\n  return safePromise((resolve, reject) => {\n    http\n      .request({\n        logRes: false,\n        responseType: \"stream\",\n        ...config,\n      })\n      .then(res => {\n        const writer = fs.createWriteStream(savePath);\n        res.pipe(writer);\n        writer.on(\"close\", () => {\n          logger.info(\"文件下载成功\");\n          resolve(true);\n        });\n        //error\n        writer.on(\"error\", err => {\n          logger.error(\"下载失败\", err);\n          reject(err);\n        });\n        //进度条打印\n        const totalLength = res.headers[\"content-length\"];\n        let currentLength = 0;\n        // 每5%打印一次\n        const step = (totalLength / 100) * 5;\n        res.on(\"data\", (chunk: any) => {\n          currentLength += chunk.length;\n          if (currentLength % step < chunk.length) {\n            const percent = ((currentLength / totalLength) * 100).toFixed(2);\n            logger.info(`下载进度：${percent}%`);\n          }\n        });\n      })\n      .catch(err => {\n        logger.info(\"下载失败\", err);\n        reject(err);\n      });\n  });\n}\n\nexport function getCookie(response: any, name: string) {\n  const cookies = response.headers[\"set-cookie\"];\n  //根据name 返回对应的cookie\n  const found = cookies.find((cookie: any) => cookie.includes(name));\n  if (!found) {\n    return null;\n  }\n  const cookie = found.split(\";\")[0];\n  return cookie.substring(cookie.indexOf(\"=\") + 1);\n}\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.sleep.ts",
    "content": "export default function (timeout: number) {\n  return new Promise(resolve => {\n    setTimeout(() => {\n      resolve({});\n    }, timeout);\n  });\n}\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.sp.ts",
    "content": "//转换为import\nimport childProcess from 'child_process';\nimport { safePromise } from './util.promise.js';\nimport { ILogger, logger } from './util.log.js';\nimport iconv from 'iconv-lite';\nexport type ExecOption = {\n  cmd: string | string[];\n  env: any;\n  logger?: ILogger;\n  options?: any;\n};\n\nasync function exec(opts: ExecOption): Promise<string> {\n  let cmd = '';\n  const log = opts.logger || logger;\n  if (opts.cmd instanceof Array) {\n    for (const item of opts.cmd) {\n      if (cmd) {\n        cmd += ' && ' + item;\n      } else {\n        cmd = item;\n      }\n    }\n  }\n  log.info(`执行命令: ${cmd}`);\n  return safePromise((resolve, reject) => {\n    childProcess.exec(\n      cmd,\n      {\n        env: {\n          ...process.env,\n          ...opts.env,\n        },\n        ...opts.options,\n      },\n      (error, stdout, stderr) => {\n        if (error) {\n          log.error(`exec error: ${error}`);\n          reject(error);\n        } else {\n          const res = stdout.toString('utf-8');\n          log.info(`stdout: ${res}`);\n          resolve(res);\n        }\n      }\n    );\n  });\n}\n\nexport type SpawnOption = {\n  cmd: string | string[];\n  onStdout?: (data: string) => void;\n  onStderr?: (data: string) => void;\n  env?: any;\n  logger?: ILogger;\n  options?: any;\n};\n\nfunction isWindows() {\n  return process.platform === 'win32';\n}\nfunction convert(buffer: any) {\n  if (isWindows()) {\n    const decoded = iconv.decode(buffer, 'GBK');\n    // 检查是否有有效字符\n    return decoded && decoded.trim().length > 0 ? decoded : buffer.toString();\n  } else {\n    return buffer;\n  }\n}\n\n// function convert(buffer: any) {\n//   return buffer;\n// }\n\nasync function spawn(opts: SpawnOption): Promise<string> {\n  let cmd = '';\n  const log = opts.logger || logger;\n  if (opts.cmd instanceof Array) {\n    for (const item of opts.cmd) {\n      if (cmd) {\n        cmd += ' && ' + item;\n      } else {\n        cmd = item;\n      }\n    }\n  } else {\n    cmd = opts.cmd;\n  }\n  log.info(`执行命令: ${cmd}`);\n  let stdout = '';\n  let stderr = '';\n  return safePromise((resolve, reject) => {\n    const ls = childProcess.spawn(cmd, {\n      shell: true,\n      env: {\n        ...process.env,\n        ...opts.env,\n      },\n      ...opts.options,\n    });\n    ls.stdout.on('data', data => {\n      data = convert(data);\n      log.info(`stdout: ${data}`);\n      stdout += data;\n    });\n\n    ls.stderr.on('data', data => {\n      data = convert(data);\n      log.warn(`stderr: ${data}`);\n      stderr += data;\n    });\n    ls.on('error', error => {\n      log.error(`child process error: ${error}`);\n      reject(error);\n    });\n\n    ls.on('close', (code: number) => {\n      if (code !== 0) {\n        log.error(`child process exited with code ${code}`);\n        reject(new Error(stderr));\n      } else {\n        resolve(stdout);\n      }\n    });\n  });\n}\n\nexport const sp = {\n  spawn,\n  exec,\n};\n"
  },
  {
    "path": "packages/core/basic/src/utils/util.string.ts",
    "content": "export const stringUtils = {\n  maxLength(str?: string, length = 100) {\n    if (str) {\n      return str.length > length ? str.slice(0, length) + '...' : str;\n    }\n    return '';\n  },\n};\n"
  },
  {
    "path": "packages/core/basic/tsconfig.json",
    "content": "{\n  \"compileOnSave\": true,\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"esModuleInterop\": true,\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"noImplicitThis\": true,\n    \"noUnusedLocals\": true,\n    \"stripInternal\": true,\n    \"importHelpers\": true,\n    \"skipLibCheck\": true,\n    \"pretty\": true,\n    \"declaration\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"composite\": false,\n    \"useDefineForClassFields\": true,\n    \"strict\": true,\n    \"typeRoots\": [ \"./typings\", \"./node_modules/@types\"],\n    \"inlineSourceMap\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": false,\n    \"lib\": [\"ESNext\", \"DOM\"],\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"src/**/*.json\"\n  ],\n  \"exclude\": [\n    \"*.js\",\n    \"*.ts\",\n    \"*.spec.ts\",\n    \"dist\",\n    \"node_modules\",\n    \"test\"\n  ],\n}\n"
  },
  {
    "path": "packages/core/pipeline/.eslintrc",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"plugins\": [\n    \"@typescript-eslint\"\n  ],\n  \"extends\": [\n    \"plugin:@typescript-eslint/recommended\",\n    \"plugin:prettier/recommended\",\n    \"prettier\"\n  ],\n  \"env\": {\n    \"mocha\": true\n  },\n  \"rules\": {\n    \"@typescript-eslint/no-var-requires\": \"off\",\n    \"@typescript-eslint/ban-ts-comment\": \"off\",\n    \"@typescript-eslint/ban-ts-ignore\": \"off\",\n    \"@typescript-eslint/no-explicit-any\": \"off\",\n    \"@typescript-eslint/no-empty-function\": \"off\",\n    \"@typescript-eslint/no-unused-vars\": \"off\"\n  }\n}\n"
  },
  {
    "path": "packages/core/pipeline/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n\ntest/user.secret.*\ntest/**/*.js\nsrc/**/*.spec.ts\n.test.mjs\n"
  },
  {
    "path": "packages/core/pipeline/.mocharc.json",
    "content": "{\n  \"extension\": [\"ts\"],\n  \"spec\": \"src/**/*.spec.ts\"\n}\n"
  },
  {
    "path": "packages/core/pipeline/.npmignore",
    "content": "node_modules\nsrc\ndist/**/*.spec.*"
  },
  {
    "path": "packages/core/pipeline/.npmrc",
    "content": "link-workspace-packages=deep\nprefer-workspace-packages=true\n"
  },
  {
    "path": "packages/core/pipeline/.prettierrc",
    "content": "{\n  \"printWidth\": 220,\n  \"bracketSpacing\": true,\n  \"singleQuote\": false,\n  \"trailingComma\": \"es5\",\n  \"arrowParens\": \"avoid\"\n}"
  },
  {
    "path": "packages/core/pipeline/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n### Performance Improvements\n\n* 支持邮箱发送证书 ([95332d5](https://github.com/certd/certd/commit/95332d5db96cd54ddab6ab737332417a09169b39))\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n**Note:** Version bump only for package @certd/pipeline\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n### Performance Improvements\n\n* 阿里云waf cname站点选择支持翻页及域名查询 ([4cf9858](https://github.com/certd/certd/commit/4cf98584dacc5999752732f136246647a2f1f07d))\n* 支持选择运行策略设置 ([60f055f](https://github.com/certd/certd/commit/60f055f293ce237c21cd9050333dad9609eceac1))\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n### Performance Improvements\n\n* 支持批量修改通知和定时 ([e11b3be](https://github.com/certd/certd/commit/e11b3becfd4abe6547e84d09adc38ebd6e1c4b87))\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n### Performance Improvements\n\n* 支持s3 access做测试 ([f00aeac](https://github.com/certd/certd/commit/f00aeacb8b5c81f0bafa4c1b76723dec2b6b7784))\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n### Bug Fixes\n\n* 修复消息内容存在()<>等括号情况下无法发送tg通知的bug ([c937583](https://github.com/certd/certd/commit/c937583a50d8513d76adead3648f83eee2fcc6f9))\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n**Note:** Version bump only for package @certd/pipeline\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n### Performance Improvements\n\n* 支持部署到飞牛OS ([ddfd0fb](https://github.com/certd/certd/commit/ddfd0fb81d6638352920261065f1ab8e27bdd564))\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n### Performance Improvements\n\n* 优化站点选择组件，切换选择时不刷新列表 ([3a14714](https://github.com/certd/certd/commit/3a147141b1a5d67c92a5ce88a5313eaa62859e03))\n* 站点监控支持监控IP ([9cc4c01](https://github.com/certd/certd/commit/9cc4c017ae646a18284e732769b82636feda01d3))\n* 支持批量重新运行 ([8189982](https://github.com/certd/certd/commit/818998259ddc75e722196ac5c365038818539b9b))\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n### Bug Fixes\n\n* 修复公共插件配置修改不生效的bug，优化系统设置参数注入时机 ([e1e510c](https://github.com/certd/certd/commit/e1e510ce1e37a5ae82478226b6987a83f22d1ecb))\n* 优化 RunnableError错误信息展示 ([36bc3ff](https://github.com/certd/certd/commit/36bc3ff22da93ba342c3c1103d7ee2bbcecf44f2))\n\n### Performance Improvements\n\n* 添加阿里云 ESA证书部署插件 ([1db1ffd](https://github.com/certd/certd/commit/1db1ffde99ac7e4684fa606ebc4c327f829b3a26))\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n### Performance Improvements\n\n* 优化钉钉通知标题颜色 ([a560999](https://github.com/certd/certd/commit/a560999d13eed18d08dd32ee530166569e3f8746))\n* 优化飞书通知为卡片模式 ([a818a3d](https://github.com/certd/certd/commit/a818a3d293e22fb46979bc77055c05621a6fed81))\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n### Bug Fixes\n\n* 修复导入在线插件不生效的bug ([fcf8309](https://github.com/certd/certd/commit/fcf8309c238208281ecb4575b2c3cfe50c11d783))\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n**Note:** Version bump only for package @certd/pipeline\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n### Bug Fixes\n\n* 修复ssh插件报length空指针的bug ([9c4cbe1](https://github.com/certd/certd/commit/9c4cbe17a22b548611cf1fbefecc83a421788e42))\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n### Performance Improvements\n\n* 隐藏运行策略选项 ([2951df0](https://github.com/certd/certd/commit/2951df0cd94c23e2efee84ff1b843055aac56cae))\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n### Performance Improvements\n\n* 支持部署到京东云cdn ([6f17c70](https://github.com/certd/certd/commit/6f17c700b84965baa01b40fe2abaa0a91bcbaffd))\n\n## [1.31.10](https://github.com/certd/certd/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n### Performance Improvements\n\n*  tab增加图标显示 ([a03ae5a](https://github.com/certd/certd/commit/a03ae5a216a1df2c1d3da12ae18dcd0f089a92d3))\n\n## [1.31.9](https://github.com/certd/certd/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n### Performance Improvements\n\n* dns支持火山引擎 ([99ff879](https://github.com/certd/certd/commit/99ff879d93658c29ea493a4bde7e9e3f85996d64))\n\n## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n### Bug Fixes\n\n* 修复站点监控通知通过webhook发送失败的bug ([9be1ecc](https://github.com/certd/certd/commit/9be1ecc8aab3ea23dd0dc2dab3688f4edb90ef2c))\n\n### Performance Improvements\n\n* 流水线增加上传证书快捷方式 ([425bba6](https://github.com/certd/certd/commit/425bba67c539b734e2a85a83a4f9ecc9b2434fb4))\n* 支持飞书通知 ([b82e1dc](https://github.com/certd/certd/commit/b82e1dcd6217b09a7d7e21cd648bb31de320cadf))\n* 支持手动上传证书并部署 ([a9fffa5](https://github.com/certd/certd/commit/a9fffa5180c83da27b35886aa2e858a92a2c5f94))\n\n## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n**Note:** Version bump only for package @certd/pipeline\n\n# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n### Performance Improvements\n\n* 流水线同一个阶段任务优化为并行执行 ([efa9c74](https://github.com/certd/certd/commit/efa9c748c5c07fc950af3db742ef9310f1ac9a4b))\n\n## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n### Performance Improvements\n\n* 上传到阿里云证书名称后缀增加毫秒时间戳 ([9f0ee21](https://github.com/certd/certd/commit/9f0ee219d02907ffe128a5cf10173397d934ccd7))\n\n## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n### Bug Fixes\n\n* 修复tg消息内容中存在.和*就会发送失败的bug ([ae5dfc3](https://github.com/certd/certd/commit/ae5dfc3bee950267123ae2fbd1c11e7ce36626ea))\n\n# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n### Performance Improvements\n\n* 证书仓库 ([91e7f45](https://github.com/certd/certd/commit/91e7f45a1c5ea1e0ec0aa3236b80028f03a6d0aa))\n\n## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n### Performance Improvements\n\n* 支持http校验方式申请证书 ([405591c](https://github.com/certd/certd/commit/405591c5d08fa1a3b228ee3980199e7731cfec4a))\n\n## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n### Performance Improvements\n\n* 用户创建证书流水线没有购买套餐或者超限时提前报错 ([472f06c](https://github.com/certd/certd/commit/472f06c2d190d0ae48e8b53c18bc278437656a1c))\n\n# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n### Features\n\n* 套餐购买支持易支付、支付宝支付 ([faa28f8](https://github.com/certd/certd/commit/faa28f88f954cba4c1dd29125562e5acd2fd99af))\n* 支持微信支付 ([45d6347](https://github.com/certd/certd/commit/45d6347f5b6199493b11aabdd74177f6dca2cea4))\n\n### Performance Improvements\n\n* 同一时间只允许一个套餐生效 ([8ebf95a](https://github.com/certd/certd/commit/8ebf95a222a900d1707716c7b1f3b39f8a6d8f94))\n* 优化证书申请跳过的状态显示，成功通知现在在跳过时不会发送 ([67d762b](https://github.com/certd/certd/commit/67d762b6a520f1fa24719a124e5ae975a81f5f82))\n* 支持plesk网站证书部署 ([eda45c1](https://github.com/certd/certd/commit/eda45c1528199648b3970505e87f492d398226cd))\n\n## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n### Bug Fixes\n\n* 修复证书成功通知发送失败的bug ([0f5c690](https://github.com/certd/certd/commit/0f5c69040ba77340c909813220a26bc7ddada3ea))\n\n## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n### Performance Improvements\n\n* 通知标题优化 ([ff083ce](https://github.com/certd/certd/commit/ff083ce6848a8bee3c8248e4b881086ae1517c28))\n* 支持aws cloudfront ([0ae39f1](https://github.com/certd/certd/commit/0ae39f160a7c6b6696b3bf513d68aa28905810ad))\n\n## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n### Performance Improvements\n\n* 通知选择器优化 ([2c0cbdd](https://github.com/certd/certd/commit/2c0cbdd29ecb74cc939b2ae7ee86b8d40f70ba31))\n* 新增七牛云插件分组 ([49e7dc5](https://github.com/certd/certd/commit/49e7dc56e1a95fbdea3e30cdeb945b48415b69e3))\n\n# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n### Features\n\n* 手机号登录、邮箱验证码注册 ([7b55337](https://github.com/certd/certd/commit/7b55337c5edb470cca7aa62201eda8d274784004))\n\n### Performance Improvements\n\n* 首页新增修改密码提示 ([0772d3b](https://github.com/certd/certd/commit/0772d3b3fd24afdde4086d9f09ef19d037b431b4))\n* 选项显示图标 ([aedc462](https://github.com/certd/certd/commit/aedc46213571a3bd93809b7af7fa17a08d546237))\n* 优化证书申请成功通知发送方式 ([8002a56](https://github.com/certd/certd/commit/8002a56efc5998aa03db5711ae87f9eb4bc9e160))\n* 支持短信验证码登录 ([387bcc5](https://github.com/certd/certd/commit/387bcc5fa418cdeea81a06da5e3f8cd6b43cd082))\n\n## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n### Performance Improvements\n\n* 通知支持自定义webhook、anpush、iyuu、server酱 ([cbccd9e](https://github.com/certd/certd/commit/cbccd9e3d0a4c24aba772af62734666d40b22c57))\n* 通知支持vocechat、bark、telegram、discord、slack ([642f57f](https://github.com/certd/certd/commit/642f57ff6d7152a9e14f59c7fc0e32a6b1751fb7))\n\n## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n### Performance Improvements\n\n* 通知管理 ([d9a00ee](https://github.com/certd/certd/commit/d9a00eeaf72735ced67c59d7983d84e3c730064a))\n* 通知渠道支持测试按钮 ([b54ae27](https://github.com/certd/certd/commit/b54ae272ebc2d31b32b049d44e2299a6be7f153c))\n* 优化插件开发，dnsProvider无需写http logger 变量 ([fcbb5e4](https://github.com/certd/certd/commit/fcbb5e46a112174150a62648319b8224fce3b7ed))\n* 支持企业微信群聊机器人通知 ([b805a29](https://github.com/certd/certd/commit/b805a2925984144a31575b8aaa622f0c30d41b56))\n\n## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n### Performance Improvements\n\n* 新手导航在非编辑模式下不显示 ([18bfcc2](https://github.com/certd/certd/commit/18bfcc24ad0bde57bb04db8a4209861ec6b8ff1d))\n\n## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n### Performance Improvements\n\n* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941))\n\n## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n### Performance Improvements\n\n* 优化时间选择器，自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211))\n\n# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n### Performance Improvements\n\n* 支持白山云cdn部署 ([b1b2cd0](https://github.com/certd/certd/commit/b1b2cd088b684eda764962abd61754c26a204d1c))\n\n## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n### Performance Improvements\n\n* 默认证书更新时间设置为35天，增加腾讯云删除过期证书插件，可以避免腾讯云过期证书邮件 ([51b6fed](https://github.com/certd/certd/commit/51b6fed468eaa6f28ce4497ce303ace1a52abb96))\n\n## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n### Performance Improvements\n\n* 申请证书启用新的反代地址 ([a705182](https://github.com/certd/certd/commit/a705182b85e51157883e48f23463263793bf3c12))\n\n## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n### Bug Fixes\n\n* 修复cname服务普通用户access访问权限问题 ([c1e3e2e](https://github.com/certd/certd/commit/c1e3e2ee1f923ee5806479dd5f178c3286a01ae0))\n\n## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n### Performance Improvements\n\n* 触发证书重新申请input变化对比规则优化，减少升级版本后触发申请证书的情况 ([c46a2a9](https://github.com/certd/certd/commit/c46a2a9a399c2a9a8bb59a48b9fb6e93227cce9b))\n* 任务下所有步骤都跳过时，整个任务显示跳过 ([84fd3b2](https://github.com/certd/certd/commit/84fd3b250dd1161ea06c5582fdadece4b29c2e53))\n\n## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n### Performance Improvements\n\n* 密钥备份 ([1c6028a](https://github.com/certd/certd/commit/1c6028abcf8849163462bb2f8441b6838357e09b))\n* 证书直接查看 ([5dde5bd](https://github.com/certd/certd/commit/5dde5bd3f76db3959d411619d29bfb8064e3b307))\n\n## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n### Performance Improvements\n\n* [comm] 支持插件管理 ([e8b617b](https://github.com/certd/certd/commit/e8b617b80ce882dd63006f0cfc719a80a1cc6acc))\n* EAB授权支持绑定邮箱，支持公共EAB设置 ([07043af](https://github.com/certd/certd/commit/07043aff0ca7fd29c56dd3c363002cb15d78b464))\n\n## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package @certd/pipeline\n\n# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n### Bug Fixes\n\n* 修复某些代理情况下 报 400 The plain HTTP request was sent to HTTPS port use proxy 的bug ([a13203f](https://github.com/certd/certd/commit/a13203fb3f48c427d0d81a504912248dcc07df1a))\n\n### Features\n\n* 域名验证方法支持CNAME间接方式，此方式支持所有域名注册商，且无需提供Access授权，但是需要手动添加cname解析 ([f3d3508](https://github.com/certd/certd/commit/f3d35084ed44f9f33845f7045e520be5c27eed93))\n* 站点个性化设置 ([11a9fe9](https://github.com/certd/certd/commit/11a9fe9014d96cba929e5a066e78f2af7ae59d14))\n\n### Performance Improvements\n\n* 调整全部静态资源到static目录 ([a218890](https://github.com/certd/certd/commit/a21889080d6c7ffdf0af526a3a21f0b2d1c77288))\n* 检查cname是否正确配置 ([b5d8935](https://github.com/certd/certd/commit/b5d8935159374fbe7fc7d4c48ae0ed9396861bdd))\n* cname校验配置增加未校验通过提示 ([77cc3c4](https://github.com/certd/certd/commit/77cc3c4a5cbd81f8233a8e0bb33fab0621c0905f))\n\n## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)\n\n### Bug Fixes\n\n* 修复某些地区被屏蔽无法激活专业版的bug ([7532a96](https://github.com/certd/certd/commit/7532a960851b84d4f2cc3dba02353c5235e1a364))\n\n## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)\n\n### Performance Improvements\n\n* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))\n\n## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)\n\n**Note:** Version bump only for package @certd/pipeline\n\n# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)\n\n### Bug Fixes\n\n* 修复首次创建任务运行时不自动设置当前运行情况的bug ([ecd83ee](https://github.com/certd/certd/commit/ecd83ee136abdd3df9ed2f21ec2ff0f24c0ed9d9))\n\n### Performance Improvements\n\n* 群晖支持OTP双重验证登录 ([8b8039f](https://github.com/certd/certd/commit/8b8039f42bbce10a4d0e737cdeeeef9bb17bee5a))\n* 任务支持禁用 ([8ed16b3](https://github.com/certd/certd/commit/8ed16b3ea2dfe847357863a0bfa614e4fa5fc041))\n* 支持阿里云ACK证书部署 ([d331fea](https://github.com/certd/certd/commit/d331fea47789122650e057ec7c9e85ee8e66f09b))\n* 支持七牛云 ([8ecc2f9](https://github.com/certd/certd/commit/8ecc2f9446a9ebd11b9bfbffbb6cf7812a043495))\n* 支持k8s ingress secret ([e5a5d0a](https://github.com/certd/certd/commit/e5a5d0a607bb6b4e1a1f7a1a419bada5f2dee59f))\n* http请求增加默认超时时间 ([664bd86](https://github.com/certd/certd/commit/664bd863e5b4895aabe2384277c0c65f5902fdb2))\n* plugins增加图标 ([a8da658](https://github.com/certd/certd/commit/a8da658a9723342b4f43a579f7805bfef0648efb))\n\n## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09)\n\n### Performance Improvements\n\n* 前置任务步骤增加错误提示 ([ae3daa9](https://github.com/certd/certd/commit/ae3daa9bcf4fc363825aad9b77f5d3879aeeff70))\n* 群晖部署教程 ([0f0af2f](https://github.com/certd/certd/commit/0f0af2f309390f388e7a272cea3a1dd30c01977d))\n* 支持群晖 ([5c270b6](https://github.com/certd/certd/commit/5c270b6b9d45a2152f9fdb3c07bd98b7c803cb8e))\n\n## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06)\n\n### Performance Improvements\n\n* 支持多吉云cdn证书部署 ([65ef685](https://github.com/certd/certd/commit/65ef6857296784ca765926e09eafcb6fc8b6ecde))\n\n## [1.24.2](https://github.com/certd/certd/compare/v1.24.1...v1.24.2) (2024-09-06)\n\n### Performance Improvements\n\n* 优化跳过处理逻辑 ([b80210f](https://github.com/certd/certd/commit/b80210f24bf5db1c958d06ab27c9e5d3db452eda))\n* 支持pfx、der ([fbeaed2](https://github.com/certd/certd/commit/fbeaed203519f59b6d9396c4e8953353ccb5e723))\n\n## [1.24.1](https://github.com/certd/certd/compare/v1.24.0...v1.24.1) (2024-09-02)\n\n### Performance Improvements\n\n* 部署插件支持宝塔、易盾云等 ([ee61709](https://github.com/certd/certd/commit/ee617095efa1171548cf52fd45f0f98a368555a3))\n* 授权配置支持加密 ([42a56b5](https://github.com/certd/certd/commit/42a56b581d754c3e5f9838179d19ab0d004ef2eb))\n* 支持阿里云 DCDN ([98b77f8](https://github.com/certd/certd/commit/98b77f80843834616fb26f83b4c42245326abd06))\n* 支持已跳过的步骤重新运行 ([ea775ad](https://github.com/certd/certd/commit/ea775adae18d57a04470cfba6b9460d761d74035))\n\n# [1.24.0](https://github.com/certd/certd/compare/v1.23.1...v1.24.0) (2024-08-25)\n\n### Bug Fixes\n\n* 修复成功后跳过之后丢失腾讯云证书id的bug ([37eb762](https://github.com/certd/certd/commit/37eb762afe25c5896b75dee25f32809f8426e7b7))\n* 修复执行日志没有清理的bug ([22a3363](https://github.com/certd/certd/commit/22a336370a88a7df2a23c967043bae153da71ed5))\n\n### Features\n\n* 支持google证书申请（需要使用代理） ([a593056](https://github.com/certd/certd/commit/a593056e79e99dd6a74f75b5eab621af7248cfbe))\n\n### Performance Improvements\n\n* 优化成功后跳过的提示 ([7b451bb](https://github.com/certd/certd/commit/7b451bbf6e6337507f4627b5a845f5bd96ab4f7b))\n* 优化证书申请成功率 ([968c469](https://github.com/certd/certd/commit/968c4690a07f69c08dcb3d3a494da4e319627345))\n* email proxy ([453f1ba](https://github.com/certd/certd/commit/453f1baa0b9eb0f648aa1b71ccf5a95b202ce13f))\n\n## [1.23.1](https://github.com/certd/certd/compare/v1.23.0...v1.23.1) (2024-08-06)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.22.8](https://github.com/certd/certd/compare/v1.22.7...v1.22.8) (2024-08-05)\n\n### Performance Improvements\n\n* 优化pipeline删除时，删除其他history ([b425203](https://github.com/certd/certd/commit/b4252033d56a9ad950f3e204ff021497c3978015))\n\n## [1.22.7](https://github.com/certd/certd/compare/v1.22.6...v1.22.7) (2024-08-04)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.22.6](https://github.com/certd/certd/compare/v1.22.5...v1.22.6) (2024-08-03)\n\n### Bug Fixes\n\n* 修复在相同的cron时偶尔无法触发定时任务的bug ([680941a](https://github.com/certd/certd/commit/680941af119619006b592e3ab6fb112cb5556a8b))\n\n### Performance Improvements\n\n* 流水线支持名称模糊查询 ([59897c4](https://github.com/certd/certd/commit/59897c4ceae992ebe2972ca9e8f9196616ffdfd7))\n* 优化前置任务输出为空的提示 ([6ed1e18](https://github.com/certd/certd/commit/6ed1e18c7d9c46d964ecc6abc90f3908297b7632))\n\n## [1.22.5](https://github.com/certd/certd/compare/v1.22.4...v1.22.5) (2024-07-26)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.22.3](https://github.com/certd/certd/compare/v1.22.2...v1.22.3) (2024-07-25)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.22.2](https://github.com/certd/certd/compare/v1.22.1...v1.22.2) (2024-07-23)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20)\n\n### Performance Improvements\n\n* 创建证书任务可以选择lege插件 ([affef13](https://github.com/certd/certd/commit/affef130378030c517250c58a4e787b0fc85d7d1))\n\n# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)\n\n### Features\n\n* 升级midway，支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))\n* 支持lego，海量DNS提供商 ([0bc6d0a](https://github.com/certd/certd/commit/0bc6d0a211920fb0084d705e1db67ee1e7262c44))\n* 支持postgresql ([3b19bfb](https://github.com/certd/certd/commit/3b19bfb4291e89064b3b407a80dae092d54747d5))\n\n## [1.21.2](https://github.com/certd/certd/compare/v1.21.1...v1.21.2) (2024-07-08)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.21.1](https://github.com/certd/certd/compare/v1.21.0...v1.21.1) (2024-07-08)\n\n**Note:** Version bump only for package @certd/pipeline\n\n# [1.21.0](https://github.com/certd/certd/compare/v1.20.17...v1.21.0) (2024-07-03)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.20.17](https://github.com/certd/certd/compare/v1.20.16...v1.20.17) (2024-07-03)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.20.16](https://github.com/certd/certd/compare/v1.20.15...v1.20.16) (2024-07-01)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.20.15](https://github.com/certd/certd/compare/v1.20.14...v1.20.15) (2024-06-28)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.20.14](https://github.com/certd/certd/compare/v1.20.13...v1.20.14) (2024-06-23)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.20.13](https://github.com/certd/certd/compare/v1.20.12...v1.20.13) (2024-06-18)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.20.12](https://github.com/certd/certd/compare/v1.20.10...v1.20.12) (2024-06-17)\n\n### Performance Improvements\n\n* 支持cloudflare域名 ([fbb9a47](https://github.com/certd/certd/commit/fbb9a47e8f7bb805289b9ee64bd46ffee0f01c06))\n\n## [1.20.10](https://github.com/certd/certd/compare/v1.20.9...v1.20.10) (2024-05-30)\n\n### Performance Improvements\n\n* 优化文件下载包名 ([d9eb927](https://github.com/certd/certd/commit/d9eb927b0a1445feab08b1958aa9ea80637a5ae6))\n\n## [1.20.9](https://github.com/certd/certd/compare/v1.20.8...v1.20.9) (2024-03-22)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.20.8](https://github.com/certd/certd/compare/v1.20.7...v1.20.8) (2024-03-22)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.20.7](https://github.com/certd/certd/compare/v1.20.6...v1.20.7) (2024-03-22)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.20.6](https://github.com/certd/certd/compare/v1.20.5...v1.20.6) (2024-03-21)\n\n### Performance Improvements\n\n* 插件贡献文档及示例 ([72fb20a](https://github.com/certd/certd/commit/72fb20abf3ba5bdd862575d2907703a52fd7eb17))\n\n## [1.20.5](https://github.com/certd/certd/compare/v1.20.2...v1.20.5) (2024-03-11)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.20.2](https://github.com/certd/certd/compare/v1.2.1...v1.20.2) (2024-02-28)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.2.1](https://github.com/certd/certd/compare/v1.2.0...v1.2.1) (2023-12-12)\n\n**Note:** Version bump only for package @certd/pipeline\n\n**Note:** Version bump only for package @certd/pipeline\n\n# [1.2.0](https://github.com/certd/certd/compare/v1.1.6...v1.2.0) (2023-10-27)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.1.6](https://github.com/certd/certd/compare/v1.1.5...v1.1.6) (2023-07-10)\n\n### Bug Fixes\n\n* 修复上传证书到腾讯云失败的bug ([e950322](https://github.com/certd/certd/commit/e950322232e19d1263b8552eefa5b0150fd7864e))\n\n## [1.1.5](https://github.com/certd/certd/compare/v1.1.4...v1.1.5) (2023-07-03)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.1.4](https://github.com/certd/certd/compare/v1.1.3...v1.1.4) (2023-07-03)\n\n### Performance Improvements\n\n* cancel task ([bc65c0a](https://github.com/certd/certd/commit/bc65c0a786360c087fe95cad93ec6a87804cc5ee))\n* flush log ([891a43a](https://github.com/certd/certd/commit/891a43ae6716ff98ed06643f7da2e35199ee195c))\n* flush logger ([91be682](https://github.com/certd/certd/commit/91be6826b902e0f302b1a6cbdb1d24e15914c18d))\n* timeout ([3eeb1f7](https://github.com/certd/certd/commit/3eeb1f77aa2922f3545f3d2067f561d95621d54f))\n\n## [1.1.3](https://github.com/certd/certd/compare/v1.1.2...v1.1.3) (2023-07-03)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.1.2](https://github.com/certd/certd/compare/v1.1.1...v1.1.2) (2023-07-03)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.1.1](https://github.com/certd/certd/compare/v1.1.0...v1.1.1) (2023-06-28)\n\n**Note:** Version bump only for package @certd/pipeline\n\n# [1.1.0](https://github.com/certd/certd/compare/v1.0.6...v1.1.0) (2023-06-28)\n\n### Bug Fixes\n\n* 修复access选择类型trigger ([2851a33](https://github.com/certd/certd/commit/2851a33eb2510f038fadb55da29512597a4ba512))\n\n### Features\n\n* 邮件通知 ([937e3fa](https://github.com/certd/certd/commit/937e3fac19cd03b8aa91db8ba03fda7fcfbacea2))\n* cert download ([5a51c14](https://github.com/certd/certd/commit/5a51c14de521cb8075a80d2ae41a16e6d5281259))\n* save files ([99522fb](https://github.com/certd/certd/commit/99522fb49adb42c1dfdf7bec3dd52d641158285b))\n* save files ([671d273](https://github.com/certd/certd/commit/671d273e2f9136d16896536b0ca127cf372f1619))\n\n## [1.0.6](https://github.com/certd/certd/compare/v1.0.5...v1.0.6) (2023-05-25)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.0.5](https://github.com/certd/certd/compare/v1.0.4...v1.0.5) (2023-05-25)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.0.4](https://github.com/certd/certd/compare/v1.0.3...v1.0.4) (2023-05-25)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.0.3](https://github.com/certd/certd/compare/v1.0.2...v1.0.3) (2023-05-25)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.0.2](https://github.com/certd/certd/compare/v1.0.1...v1.0.2) (2023-05-24)\n\n**Note:** Version bump only for package @certd/pipeline\n\n## [1.0.1](https://github.com/certd/certd/compare/v1.0.0...v1.0.1) (2023-05-24)\n\n**Note:** Version bump only for package @certd/pipeline\n"
  },
  {
    "path": "packages/core/pipeline/LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "packages/core/pipeline/README.md",
    "content": "# Vue 3 + TypeScript + Vite\n\nThis template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.\n\n## Recommended IDE Setup\n\n- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar)\n\n## Type Support For `.vue` Imports in TS\n\nSince TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates. However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can enable Volar's Take Over mode by following these steps:\n\n1. Run `Extensions: Show Built-in Extensions` from VS Code's command palette, look for `TypeScript and JavaScript Language Features`, then right click and select `Disable (Workspace)`. By default, Take Over mode will enable itself if the default TypeScript extension is disabled.\n2. Reload the VS Code window by running `Developer: Reload Window` from the command palette.\n\nYou can learn more about Take Over mode [here](https://github.com/johnsoncodehk/volar/discussions/471).\n"
  },
  {
    "path": "packages/core/pipeline/build.md",
    "content": "02:40\n"
  },
  {
    "path": "packages/core/pipeline/fix-esm-import-paths.js",
    "content": "import * as fs from \"fs\";\nimport * as path from \"path\";\n\n// https://gist.github.com/lovasoa/8691344\nasync function* walk(dir) {\n  for await (const d of await fs.promises.opendir(dir)) {\n    const entry = path.join(dir, d.name);\n    if (d.isDirectory()) {\n      yield* walk(entry);\n    } else if (d.isFile()) {\n      yield entry;\n    }\n  }\n}\n\nfunction resolveImportPath(sourceFile, importPath, options) {\n  const sourceFileAbs = path.resolve(process.cwd(), sourceFile);\n  const root = path.dirname(sourceFileAbs);\n  const { moduleFilter = defaultModuleFilter } = options;\n\n  if (moduleFilter(importPath)) {\n    const importPathAbs = path.resolve(root, importPath);\n    let possiblePath = [path.resolve(importPathAbs, \"./index.ts\"), path.resolve(importPathAbs, \"./index.js\"), importPathAbs + \".ts\", importPathAbs + \".js\"];\n\n    if (possiblePath.length) {\n      for (let i = 0; i < possiblePath.length; i++) {\n        let entry = possiblePath[i];\n        if (fs.existsSync(entry)) {\n          const resolved = path.relative(root, entry.replace(/\\.ts$/, \".js\"));\n\n          if (!resolved.startsWith(\".\")) {\n            return \"./\" + resolved;\n          }\n\n          return resolved;\n        }\n      }\n    }\n  }\n\n  return null;\n}\n\nfunction replace(filePath, outFilePath, options) {\n  const code = fs.readFileSync(filePath).toString();\n  const newCode = code.replace(/(import|export) (.+?) from ('[^\\n']+'|\"[^\\n\"]+\");/gs, function (found, action, imported, from) {\n    const importPath = from.slice(1, -1);\n    let resolvedPath = resolveImportPath(filePath, importPath, options);\n\n    if (resolvedPath) {\n      resolvedPath = resolvedPath.replaceAll(\"\\\\\", \"/\");\n      console.log(\"\\t\", importPath, resolvedPath);\n      return `${action} ${imported} from \"${resolvedPath}\";`;\n    }\n\n    return found;\n  });\n\n  if (code !== newCode) {\n    fs.writeFileSync(outFilePath, newCode);\n  }\n}\n\n// Then, use it with a simple async for loop\nasync function run(srcDir, options = defaultOptions) {\n  const { sourceFileFilter = defaultSourceFileFilter } = options;\n\n  for await (const entry of walk(srcDir)) {\n    if (sourceFileFilter(entry)) {\n      console.log(entry);\n      replace(entry, entry, options);\n    }\n  }\n}\n\nconst defaultSourceFileFilter = function (sourceFilePath) {\n  return /\\.(js|ts)$/.test(sourceFilePath) && !/node_modules/.test(sourceFilePath);\n};\n\nconst defaultModuleFilter = function (importedModule) {\n  return !path.isAbsolute(importedModule) && !importedModule.startsWith(\"@\") && !importedModule.endsWith(\".js\");\n};\n\nconst defaultOptions = {\n  sourceFileFilter: defaultSourceFileFilter,\n  moduleFilter: defaultModuleFilter,\n};\n\n// Switch this to test on one file or directly run on a directory.\nconst DEBUG = false;\n\nif (DEBUG) {\n  replace(\"./src/index.ts\", \"./out.ts\", defaultOptions);\n} else {\n  await run(\"./src/\", defaultOptions);\n}\n"
  },
  {
    "path": "packages/core/pipeline/package.json",
    "content": "{\n  \"name\": \"@certd/pipeline\",\n  \"private\": false,\n  \"version\": \"1.36.10\",\n  \"type\": \"module\",\n  \"main\": \"./dist/index.js\",\n  \"module\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.ts\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"before-build\": \"rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache\",\n    \"build\": \"npm run before-build && tsc --skipLibCheck\",\n    \"dev-build\": \"npm run build\",\n    \"build3\": \"rollup -c\",\n    \"preview\": \"vite preview\",\n    \"test\": \"mocha   --loader=ts-node/esm\",\n    \"pub\": \"npm publish\"\n  },\n  \"dependencies\": {\n    \"@certd/basic\": \"^1.36.10\",\n    \"@certd/plus-core\": \"^1.36.10\",\n    \"dayjs\": \"^1.11.7\",\n    \"lodash-es\": \"^4.17.21\",\n    \"reflect-metadata\": \"^0.1.13\"\n  },\n  \"devDependencies\": {\n    \"@rollup/plugin-commonjs\": \"^23.0.4\",\n    \"@rollup/plugin-json\": \"^6.0.0\",\n    \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n    \"@rollup/plugin-terser\": \"^0.4.3\",\n    \"@rollup/plugin-typescript\": \"^11.0.0\",\n    \"@types/chai\": \"^4.3.10\",\n    \"@types/lodash-es\": \"^4.17.12\",\n    \"@types/mocha\": \"^10.0.1\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.26.1\",\n    \"@typescript-eslint/parser\": \"^8.26.1\",\n    \"chai\": \"4.3.10\",\n    \"eslint\": \"^8.41.0\",\n    \"eslint-config-prettier\": \"^8.8.0\",\n    \"eslint-plugin-prettier\": \"^4.2.1\",\n    \"mocha\": \"^10.2.0\",\n    \"prettier\": \"^2.8.8\",\n    \"rimraf\": \"^5.0.5\",\n    \"tslib\": \"^2.8.1\",\n    \"typescript\": \"^5.4.2\"\n  },\n  \"gitHead\": \"085bdf5cfa9140903611aa12cdd2542d05aba321\"\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/access/api.ts",
    "content": "import { Registrable } from \"../registry/index.js\";\nimport { FormItemProps } from \"../dt/index.js\";\nimport { HttpClient, ILogger, utils } from \"@certd/basic\";\nimport * as _ from \"lodash-es\";\nimport { PluginRequestHandleReq } from \"../plugin/index.js\";\n\nexport type AccessRequestHandleReqInput<T = any> = {\n  id?: number;\n  title?: string;\n  access: T;\n};\n\nexport type AccessRequestHandleReq<T = any> = PluginRequestHandleReq<AccessRequestHandleReqInput<T>>;\n\nexport type AccessInputDefine = FormItemProps & {\n  title: string;\n  required?: boolean;\n  encrypt?: boolean;\n};\nexport type AccessDefine = Registrable & {\n  icon?: string;\n  input?: {\n    [key: string]: AccessInputDefine;\n  };\n};\nexport interface IAccessService {\n  getById<T = any>(id: any): Promise<T>;\n  getCommonById<T = any>(id: any): Promise<T>;\n}\n\nexport interface IAccess {\n  ctx: AccessContext;\n  [key: string]: any;\n}\n\nexport type AccessContext = {\n  http: HttpClient;\n  logger: ILogger;\n  utils: typeof utils;\n  accessService: IAccessService;\n};\n\nexport abstract class BaseAccess implements IAccess {\n  ctx!: AccessContext;\n\n  setCtx(ctx: AccessContext) {\n    this.ctx = ctx;\n  }\n\n  async onRequest(req: AccessRequestHandleReq) {\n    if (!req.action) {\n      throw new Error(\"action is required\");\n    }\n\n    let methodName = req.action;\n    if (!req.action.startsWith(\"on\")) {\n      methodName = `on${_.upperFirst(req.action)}`;\n    }\n\n    // @ts-ignore\n    const method = this[methodName];\n    if (method) {\n      // @ts-ignore\n      return await this[methodName](req.data);\n    }\n    throw new Error(`action ${req.action} not found`);\n  }\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/access/decorator.ts",
    "content": "// src/decorator/memoryCache.decorator.ts\nimport { AccessContext, AccessDefine, AccessInputDefine, IAccessService } from \"./api.js\";\nimport { Decorator } from \"../decorator/index.js\";\nimport * as _ from \"lodash-es\";\nimport { accessRegistry } from \"./registry.js\";\nimport { http, logger, utils } from \"@certd/basic\";\n\n// 提供一个唯一 key\nexport const ACCESS_CLASS_KEY = \"pipeline:access\";\nexport const ACCESS_INPUT_KEY = \"pipeline:access:input\";\n\nexport function IsAccess(define: AccessDefine): ClassDecorator {\n  return (target: any) => {\n    target = Decorator.target(target);\n\n    const inputs: any = {};\n    const properties = Decorator.getClassProperties(target);\n    for (const property in properties) {\n      const input = Reflect.getMetadata(ACCESS_INPUT_KEY, target, property);\n      if (input) {\n        inputs[property] = input;\n      }\n    }\n    _.merge(define, { input: inputs });\n    Reflect.defineMetadata(ACCESS_CLASS_KEY, define, target);\n    target.define = define;\n    accessRegistry.register(define.name, {\n      define,\n      target: async () => {\n        return target;\n      },\n    });\n  };\n}\n\nexport function AccessInput(input?: AccessInputDefine): PropertyDecorator {\n  return (target, propertyKey) => {\n    target = Decorator.target(target, propertyKey);\n    // const _type = Reflect.getMetadata(\"design:type\", target, propertyKey);\n    Reflect.defineMetadata(ACCESS_INPUT_KEY, input, target, propertyKey);\n  };\n}\n\nexport async function newAccess(type: string, input: any, accessService: IAccessService, ctx?: AccessContext) {\n  const register = accessRegistry.get(type);\n  if (register == null) {\n    throw new Error(`access ${type} not found`);\n  }\n  // @ts-ignore\n  const accessCls = await register.target();\n  // @ts-ignore\n  const access = new accessCls();\n  for (const key in input) {\n    access[key] = input[key];\n  }\n  if (!ctx) {\n    ctx = {\n      http,\n      logger,\n      utils,\n      accessService,\n    };\n  }\n  access.setCtx(ctx);\n  access._type = type;\n  return access;\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/access/index.ts",
    "content": "export * from \"./api.js\";\nexport * from \"./registry.js\";\nexport * from \"./decorator.js\";\n"
  },
  {
    "path": "packages/core/pipeline/src/access/registry.ts",
    "content": "import { createRegistry } from \"../registry/index.js\";\n\n// @ts-ignore\nexport const accessRegistry = createRegistry(\"access\");\n"
  },
  {
    "path": "packages/core/pipeline/src/context/index.ts",
    "content": "import { IContext } from \"../core/index.js\";\n\nexport type UserContext = IContext;\nexport type PipelineContext = IContext;\n\nexport type PageSearch = {\n  pageNo?: number;\n  pageSize?: number;\n  searchKey?: string;\n  // sortBy?: string;\n  // sortOrder?: \"asc\" | \"desc\";\n};\n\n\nexport type PageRes = {\n  pageNo?: number;\n  pageSize?: number;\n  total?: string;\n  list: any[];\n};\n\nexport class Pager {\n  pageNo: number;\n  pageSize: number;\n  constructor(req: PageSearch) {\n    this.pageNo = req.pageNo ?? 1;\n    this.pageSize = req.pageSize || 50;\n  }\n\n  getOffset() {\n    return (this.pageNo - 1) * (this.pageSize ?? 50);\n  }\n\n  setOffset(offset: number) {\n    this.pageNo = Math.ceil(offset / (this.pageSize ?? 50)) + 1;\n  }\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/core/context.ts",
    "content": "import { IStorage, MemoryStorage } from \"./storage.js\";\n\nconst CONTEXT_VERSION_KEY = \"contextVersion\";\nexport interface IContext {\n  getInt(key: string): Promise<number>;\n  get(key: string): Promise<string | null>;\n  set(key: string, value: string): Promise<void>;\n  getObj<T = any>(key: string): Promise<T | null>;\n  setObj<T = any>(key: string, value: T): Promise<void>;\n  updateVersion(): Promise<void>;\n  initVersion(): Promise<void>;\n}\n\nexport class ContextFactory {\n  storage: IStorage;\n  memoryStorage: IStorage;\n\n  constructor(storage: IStorage) {\n    this.storage = storage;\n    this.memoryStorage = new MemoryStorage();\n  }\n\n  getContext(scope: string, namespace: string): IContext {\n    return new StorageContext(scope, namespace, this.storage);\n  }\n\n  getMemoryContext(scope: string, namespace: string): IContext {\n    return new StorageContext(scope, namespace, this.memoryStorage);\n  }\n}\n\nexport class StorageContext implements IContext {\n  storage: IStorage;\n  namespace: string;\n  scope: string;\n\n  _version = 0;\n  _initialVersion = 0;\n  constructor(scope: string, namespace: string, storage: IStorage) {\n    this.storage = storage;\n    this.scope = scope;\n    this.namespace = namespace;\n  }\n\n  async initVersion() {\n    const version = await this.getInt(CONTEXT_VERSION_KEY);\n    this._initialVersion = version;\n    this._version = version;\n  }\n\n  async updateVersion() {\n    if (this._version === this._initialVersion) {\n      this._version++;\n    }\n\n    await this.set(CONTEXT_VERSION_KEY, this._version.toString());\n  }\n\n  async get(key: string) {\n    const version = key === CONTEXT_VERSION_KEY ? 0 : this._version;\n    return await this.storage.get(this.scope, this.namespace, version.toString(), key);\n  }\n  async set(key: string, value: string) {\n    const version = key === CONTEXT_VERSION_KEY ? 0 : this._version;\n    return await this.storage.set(this.scope, this.namespace, version.toString(), key, value);\n  }\n\n  async getInt(key: string): Promise<number> {\n    const str = await this.get(key);\n    if (str) {\n      return parseInt(str);\n    }\n    return 0;\n  }\n  async getObj<T = any>(key: string): Promise<T | null> {\n    const str = await this.get(key);\n    if (str) {\n      const store = JSON.parse(str);\n      return store.value;\n    }\n    return null;\n  }\n\n  async setObj<T = any>(key: string, value: T) {\n    await this.set(key, JSON.stringify({ value }));\n  }\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/core/exceptions.ts",
    "content": "import type { ResultError } from \"../dt/index.js\";\n\nexport class CancelError extends Error {\n  constructor(message: string) {\n    super(message);\n  }\n}\n\nexport class RunnableError extends Error {\n  errors: ResultError[];\n  constructor(message: string, errors: ResultError[]) {\n    super(message);\n    this.errors = errors;\n  }\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/core/executor.ts",
    "content": "import { ConcurrencyStrategy, NotificationWhen, Pipeline, ResultType, Runnable, RunStrategy, Stage, Step, Task, ResultError } from \"../dt/index.js\";\nimport { RunHistory, RunnableCollection } from \"./run-history.js\";\nimport { AbstractTaskPlugin, ITaskPlugin, PluginDefine, pluginRegistry, TaskInstanceContext, UserInfo } from \"../plugin/index.js\";\nimport { ContextFactory, IContext } from \"./context.js\";\nimport { IStorage } from \"./storage.js\";\nimport { createAxiosService, hashUtils, HttpRequestConfig, ILogger, logger, utils } from \"@certd/basic\";\nimport { IAccessService } from \"../access/index.js\";\nimport { RegistryItem } from \"../registry/index.js\";\nimport { Decorator } from \"../decorator/index.js\";\nimport { ICnameProxyService, IEmailService, IPluginConfigService, IServiceGetter, IUrlService } from \"../service/index.js\";\nimport { FileStore } from \"./file-store.js\";\nimport { cloneDeep, forEach, merge } from \"lodash-es\";\nimport { INotificationService } from \"../notification/index.js\";\nimport { taskEmitterCreate } from \"../service/emit.js\";\nimport { RunnableError } from \"./exceptions.js\";\n\nexport type SysInfo = {\n  //系统标题\n  title?: string;\n};\n\nexport type ExecutorOptions = {\n  pipeline: Pipeline;\n  storage: IStorage;\n  onChanged: (history: RunHistory) => Promise<void>;\n  accessService: IAccessService;\n  emailService: IEmailService;\n  notificationService: INotificationService;\n  cnameProxyService: ICnameProxyService;\n  pluginConfigService: IPluginConfigService;\n  urlService: IUrlService;\n  fileRootDir?: string;\n  user: UserInfo;\n  baseURL?: string;\n  sysInfo?: SysInfo;\n  serviceGetter: IServiceGetter;\n};\n\nexport class Executor {\n  pipeline: Pipeline;\n  runtime!: RunHistory;\n  contextFactory: ContextFactory;\n  logger: ILogger;\n  pipelineContext!: IContext;\n  currentStatusMap!: RunnableCollection;\n  lastStatusMap!: RunnableCollection;\n  lastRuntime!: RunHistory;\n  options: ExecutorOptions;\n  abort: AbortController = new AbortController();\n\n  _inited = false;\n\n  onChanged: (history: RunHistory) => Promise<void>;\n  constructor(options: ExecutorOptions) {\n    this.options = options;\n    this.pipeline = cloneDeep(options.pipeline);\n    this.onChanged = async (history: RunHistory) => {\n      await options.onChanged(history);\n    };\n    this.pipeline.userId = options.user.id;\n    this.contextFactory = new ContextFactory(options.storage);\n    this.logger = logger;\n    this.pipelineContext = this.contextFactory.getContext(\"pipeline\", this.pipeline.id);\n  }\n\n  async init() {\n    if (this._inited) {\n      return;\n    }\n    this._inited = true;\n    const lastRuntime = await this.pipelineContext.getObj(`lastRuntime`);\n    this.lastRuntime = lastRuntime;\n    this.lastStatusMap = new RunnableCollection(lastRuntime?.pipeline);\n    this.currentStatusMap = new RunnableCollection(this.pipeline);\n  }\n\n  async cancel() {\n    this.abort.abort();\n    this.runtime?.cancel(this.pipeline);\n    await this.onChanged(this.runtime);\n  }\n\n  async run(runtimeId: any = 0, triggerType: string) {\n    let intervalFlushLogId: any = undefined;\n    try {\n      await this.init();\n      const trigger = { type: triggerType };\n      // 读取last\n      this.runtime = new RunHistory(runtimeId, trigger, this.pipeline);\n      this.logger.info(`pipeline.${this.pipeline.id}  start`);\n      await this.notification(\"start\");\n\n      this.runtime.start(this.pipeline);\n      intervalFlushLogId = setInterval(async () => {\n        await this.onChanged(this.runtime);\n      }, 5000);\n\n      const result = await this.runWithHistory(this.pipeline, \"pipeline\", async () => {\n        return await this.runStages(this.pipeline);\n      });\n      if (result === ResultType.success) {\n        if (this.lastRuntime && this.lastRuntime.pipeline.status?.status === ResultType.error) {\n          await this.notification(\"turnToSuccess\");\n        } else {\n          await this.notification(\"success\");\n        }\n      }\n      return result;\n    } catch (e: any) {\n      await this.notification(\"error\", e);\n      this.logger.error(\"pipeline 执行失败\", e);\n    } finally {\n      clearInterval(intervalFlushLogId);\n      await this.onChanged(this.runtime);\n      //保存之前移除logs\n      const lastRuntime: any = {\n        ...this.runtime,\n      };\n      delete lastRuntime.logs;\n      delete lastRuntime._loggers;\n      await this.pipelineContext.setObj(\"lastRuntime\", lastRuntime);\n      this.logger.info(`pipeline.${this.pipeline.id}  end`);\n    }\n  }\n\n  async runWithHistory(runnable: Runnable, runnableType: string, run: () => Promise<ResultType | void>) {\n    runnable.runnableType = runnableType;\n\n    this.runtime.start(runnable);\n\n    try {\n      if (runnable.disabled) {\n        //该任务被禁用\n        this.runtime.disabled(runnable);\n        return ResultType.disabled;\n      }\n\n      await this.onChanged(this.runtime);\n\n      if (this.abort.signal.aborted) {\n        this.runtime.cancel(runnable);\n        return ResultType.canceled;\n      }\n      const resultType = await run();\n      if (this.abort.signal.aborted) {\n        this.runtime.cancel(runnable);\n        return ResultType.canceled;\n      }\n      if (resultType == ResultType.skip) {\n        this.runtime.skip(runnable);\n        return resultType;\n      }\n      if (resultType == ResultType.disabled) {\n        this.runtime.disabled(runnable);\n        return resultType;\n      }\n      this.runtime.success(runnable);\n      return ResultType.success;\n    } catch (e: any) {\n      if (e.name === \"CancelError\" || this.abort.signal.aborted) {\n        this.runtime.cancel(runnable);\n        return ResultType.canceled;\n      } else {\n        this.runtime.error(runnable, e);\n      }\n      throw e;\n    } finally {\n      this.runtime.finally(runnable);\n      await this.onChanged(this.runtime);\n    }\n  }\n\n  private async runStages(pipeline: Pipeline) {\n    const resList: ResultType[] = [];\n    for (const stage of pipeline.stages) {\n      const res: ResultType = await this.runWithHistory(stage, \"stage\", async () => {\n        return await this.runStage(stage);\n      });\n      resList.push(res);\n    }\n    return this.compositionResultType(resList);\n  }\n\n  async runStage(stage: Stage) {\n    const runnerList = [];\n    for (const task of stage.tasks) {\n      const runner = async () => {\n        return this.runWithHistory(task, \"task\", async () => {\n          const res = await this.runTask(task);\n          return res;\n        });\n      };\n      runnerList.push(runner);\n    }\n\n    let resList: ResultType[] = [];\n    const errorList: ResultError[] = [];\n    let errorMessage = \"\";\n    if (stage.concurrency === ConcurrencyStrategy.Parallel) {\n      //并行\n      const pList = [];\n      for (const item of runnerList) {\n        pList.push(item());\n      }\n      resList = await Promise.all(pList);\n    } else {\n      //串行且报错继续\n      for (let i = 0; i < runnerList.length; i++) {\n        const runner = runnerList[i];\n        try {\n          resList[i] = await runner();\n        } catch (e: any) {\n          const t = stage.tasks[i];\n          this.logger.error(`任务 ${t.title} 执行异常:`, e.message);\n          resList[i] = ResultType.error;\n          errorList.push({\n            e,\n            returnType: ResultType.error,\n            runnable: t,\n          });\n          errorMessage += `任务${t.title}执行失败，错误详情：${e.message}；`;\n        }\n      }\n      if (errorList.length > 0) {\n        throw new RunnableError(errorMessage, errorList);\n      }\n    }\n    return this.compositionResultType(resList);\n  }\n\n  compositionResultType(resList: ResultType[]): ResultType {\n    let hasSuccess = false;\n    let hasSkip = false;\n    let hasDisabled = false;\n    for (const type of resList) {\n      if (type === ResultType.error) {\n        return ResultType.error;\n      } else if (type === ResultType.success) {\n        hasSuccess = true;\n      } else if (type === ResultType.skip) {\n        hasSkip = true;\n      } else if (type === ResultType.disabled) {\n        hasDisabled = true;\n      }\n    }\n    if (!hasSuccess && !hasSkip && hasDisabled) {\n      //全是disabled\n      return ResultType.disabled;\n    }\n    if (!hasSuccess && hasSkip) {\n      //全是跳过\n      return ResultType.skip;\n    }\n    if (hasSuccess) {\n      return ResultType.success;\n    }\n    return ResultType.error;\n  }\n\n  private async runTask(task: Task) {\n    const resList: ResultType[] = [];\n    for (const step of task.steps) {\n      step.runnableType = \"step\";\n      // @ts-ignore\n      const res: ResultType = await this.runWithHistory(step, \"step\", async () => {\n        return await this.runStep(step);\n      });\n      resList.push(res);\n    }\n    return this.compositionResultType(resList);\n  }\n\n  private async runStep(step: Step) {\n    const currentLogger = this.runtime._loggers[step.id];\n    this.currentStatusMap.add(step);\n    const lastStatus = this.lastStatusMap.get(step.id);\n    //执行任务\n    const plugin: RegistryItem<AbstractTaskPlugin> = pluginRegistry.get(step.type);\n\n    //@ts-ignore\n    let instance: ITaskPlugin = null;\n    try {\n      //@ts-ignore\n      const pluginCls = await plugin.target();\n      //@ts-ignore\n      instance = new pluginCls();\n    } catch (e: any) {\n      currentLogger.error(`实例化插件失败:${e.message}`);\n      throw new Error(`实例化插件失败`, e);\n    }\n\n    // @ts-ignore\n    const define: PluginDefine = plugin.define;\n    const pluginName = define.name;\n    const pluginConfig = await this.options.pluginConfigService.getPluginConfig(pluginName);\n    //从outputContext读取输入参数\n    const input = cloneDeep(step.input);\n    const sysInput = pluginConfig.sysSetting?.input || {};\n    //注入系统设置参数\n    for (const sysInputKey in sysInput) {\n      input[sysInputKey] = sysInput[sysInputKey];\n    }\n\n    Decorator.inject(define.input, instance, input, (item, key) => {\n      if (item.component?.name === \"output-selector\") {\n        const contextKey = input[key];\n        if (contextKey != null) {\n          if (typeof contextKey !== \"string\") {\n            throw new Error(`步骤${step.title}的${item.title}属性必须为String类型，请重新配置该属性`);\n          }\n          // \"cert\": \"step.-BNFVPMKPu2O-i9NiOQxP.cert\",\n          const arr = contextKey.split(\".\");\n          const id = arr[1];\n          const outputKey = arr[2];\n          input[key] = this.currentStatusMap.get(id)?.status?.output[outputKey] ?? this.lastStatusMap.get(id)?.status?.output[outputKey];\n          if (input[key] == null) {\n            this.logger.warn(`${item.title}的配置未找到对应的输出值，请确认对应的前置任务是否存在或者是否执行正确`);\n          }\n        }\n      }\n    });\n\n    const newInputHash = hashUtils.md5(JSON.stringify(input));\n    step.status!.inputHash = newInputHash;\n    //判断是否需要跳过\n    const lastNode = this.lastStatusMap.get(step.id);\n    const lastResult = lastNode?.status?.status;\n    let inputChanged = true;\n    const lastInputHash = lastNode?.status?.inputHash;\n    if (lastInputHash && newInputHash && lastInputHash === newInputHash) {\n      //参数没有变化\n      inputChanged = false;\n    }\n    if (step.strategy?.runStrategy === RunStrategy.SkipWhenSucceed) {\n      if (lastResult != null && lastResult === ResultType.success && !inputChanged) {\n        step.status!.output = lastNode?.status?.output;\n        step.status!.files = lastNode?.status?.files;\n        return ResultType.skip;\n      }\n    }\n\n    const http = createAxiosService({ logger: currentLogger });\n    const download = async (config: HttpRequestConfig, savePath: string) => {\n      await utils.download({\n        http,\n        logger: currentLogger,\n        config,\n        savePath,\n      });\n    };\n    const taskCtx: TaskInstanceContext = {\n      pipeline: this.pipeline,\n      runtime: this.runtime,\n      step,\n      lastStatus,\n      http,\n      download,\n      logger: currentLogger,\n      inputChanged,\n      accessService: this.options.accessService,\n      emailService: this.options.emailService,\n      cnameProxyService: this.options.cnameProxyService,\n      pluginConfigService: this.options.pluginConfigService,\n      notificationService: this.options.notificationService,\n      urlService: this.options.urlService,\n      pipelineContext: this.pipelineContext,\n      userContext: this.contextFactory.getContext(\"user\", this.options.user.id),\n      fileStore: new FileStore({\n        scope: this.pipeline.id,\n        parent: this.runtime.id,\n        rootDir: this.options.fileRootDir,\n      }),\n      signal: this.abort.signal,\n      utils,\n      user: this.options.user,\n      emitter: taskEmitterCreate({\n        step,\n        pipeline: this.pipeline,\n      }),\n      serviceGetter: this.options.serviceGetter,\n    };\n    instance.setCtx(taskCtx);\n\n    await instance.onInstance();\n    const result = await instance.execute();\n    //执行结果处理\n    if (instance._result.clearLastStatus) {\n      //是否需要清除所有状态\n      this.lastStatusMap.clear();\n    }\n    //输出上下文变量到output context\n    forEach(define.output, (item: any, key: any) => {\n      step.status!.output[key] = instance[key];\n      // const stepOutputKey = `step.${step.id}.${key}`;\n      // this.runtime.context[stepOutputKey] = instance[key];\n    });\n    step.status!.files = instance.getFiles();\n    //更新pipeline vars\n    if (Object.keys(instance._result.pipelineVars).length > 0) {\n      // 判断 pipelineVars 有值时更新\n      let vars = await this.pipelineContext.getObj(\"vars\");\n      vars = vars || {};\n      merge(vars, instance._result.pipelineVars);\n      await this.pipelineContext.setObj(\"vars\", vars);\n    }\n    if (Object.keys(instance._result.pipelinePrivateVars).length > 0) {\n      // 判断 pipelineVars 有值时更新\n      let vars = await this.pipelineContext.getObj(\"privateVars\");\n      vars = vars || {};\n      merge(vars, instance._result.pipelinePrivateVars);\n      await this.pipelineContext.setObj(\"privateVars\", vars);\n    }\n\n    return result;\n  }\n\n  async notification(when: NotificationWhen, error?: any) {\n    if (!this.pipeline.notifications) {\n      return;\n    }\n    const url = await this.options.urlService.getPipelineDetailUrl(this.pipeline.id, this.runtime.id);\n    let subject = \"\";\n    let content = \"\";\n    const errorMessage = error?.message;\n    if (when === \"start\") {\n      subject = `开始执行，${this.pipeline.title}【${this.pipeline.id}】`;\n      content = `流水线ID:${this.pipeline.id}，运行ID:${this.runtime.id}`;\n    } else if (when === \"success\") {\n      subject = `执行成功，${this.pipeline.title}【${this.pipeline.id}】`;\n      content = `流水线ID:${this.pipeline.id}，运行ID:${this.runtime.id}`;\n    } else if (when === \"turnToSuccess\") {\n      subject = `执行成功（失败转成功），${this.pipeline.title}【${this.pipeline.id}】`;\n      content = `流水线ID:${this.pipeline.id}，运行ID:${this.runtime.id}`;\n    } else if (when === \"error\") {\n      subject = `执行失败，${this.pipeline.title}【${this.pipeline.id}】`;\n\n      if (error instanceof RunnableError) {\n        const runnableError = error as RunnableError;\n        content = `流水线ID:${this.pipeline.id}，运行ID:${this.runtime.id}\\n\\n`;\n        for (const re of runnableError.errors) {\n          content += ` - ${re.runnable.title} 执行失败，错误详情：${re.e?.message || re.e?.error?.message}\\n\\n`;\n        }\n      } else {\n        content = `流水线ID:${this.pipeline.id}，运行ID:${this.runtime.id}\\n\\n${this.currentStatusMap?.currentStep?.title} 执行失败\\n\\n错误详情:${error.message}`;\n      }\n    } else {\n      return;\n    }\n\n    for (const notification of this.pipeline.notifications) {\n      if (!notification.when.includes(when)) {\n        continue;\n      }\n\n      if (notification.type === \"email\" && notification.options?.receivers) {\n        try {\n          await this.options.emailService?.send({\n            subject,\n            content,\n            receivers: notification.options?.receivers,\n          });\n        } catch (e) {\n          logger.error(\"send email error\", e);\n        }\n      } else {\n        try {\n          //发送通知\n          await this.options.notificationService.send({\n            id: notification.notificationId,\n            useDefault: true,\n            useEmail: false,\n            logger: this.logger,\n            body: {\n              title: subject,\n              content,\n              userId: this.pipeline.userId,\n              pipeline: this.pipeline,\n              result: this.lastRuntime?.pipeline?.status,\n              pipelineId: this.pipeline.id,\n              historyId: this.runtime.id,\n              errorMessage,\n              url,\n            },\n          });\n        } catch (e) {\n          logger.error(\"send notification error\", e);\n        }\n      }\n    }\n  }\n\n  /**\n   *\n   * @param stepId 如果==ALL 清除所有\n   */\n  clearLastStatus(stepId: string) {\n    if (stepId === \"ALL\") {\n      this.lastStatusMap.clear();\n      return;\n    }\n    this.lastStatusMap.clearById(stepId);\n  }\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/core/file-store.ts",
    "content": "import { fileUtils } from \"@certd/basic\";\nimport dayjs from \"dayjs\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { logger } from \"@certd/basic\";\n\nexport type FileStoreOptions = {\n  rootDir?: string;\n  scope: string;\n  parent: string;\n};\n\nexport interface IFileStore {\n  readFile(filePath: string): Buffer | null;\n  writeFile(filename: string, file: Buffer): string;\n  deleteByParent(scope: string, parent: string): void;\n}\n\nexport class FileStore {\n  rootDir: string;\n  // pipelineId\n  scope: string;\n  // historyId\n  parent: string;\n  constructor(options?: FileStoreOptions) {\n    this.rootDir = fileUtils.getFileRootDir(options?.rootDir);\n    this.scope = options?.scope || \"0\";\n    this.parent = options?.parent || \"0\";\n  }\n\n  readFile(filePath: string) {\n    if (!fs.existsSync(filePath)) {\n      return null;\n    }\n    return fs.readFileSync(filePath);\n  }\n\n  writeFile(filename: string, file: Buffer) {\n    const localPath = this.buildFilePath(filename);\n\n    fs.writeFileSync(localPath, file);\n    logger.info(`写入文件：${localPath}`);\n    return localPath;\n  }\n\n  protected buildFilePath(filename: string) {\n    const parentDir = path.join(this.rootDir, this.scope + \"\", this.parent + \"\", dayjs().format(\"YYYY-MM-DD\"));\n    if (!fs.existsSync(parentDir)) {\n      fs.mkdirSync(parentDir, { recursive: true });\n    }\n    return path.join(parentDir, filename);\n  }\n\n  deleteByParent(scope: string, parent: string) {\n    const dir = path.join(this.rootDir, scope, parent);\n    if (fs.existsSync(dir)) {\n      fs.rmSync(dir, {\n        recursive: true,\n        force: true,\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/core/index.ts",
    "content": "export * from \"./executor.js\";\nexport * from \"./run-history.js\";\nexport * from \"./context.js\";\nexport * from \"./storage.js\";\nexport * from \"./file-store.js\";\nexport * from \"./exceptions.js\";\n"
  },
  {
    "path": "packages/core/pipeline/src/core/run-history.ts",
    "content": "import { HistoryResult, Pipeline, ResultType, Runnable, RunnableMap, Stage, Step, Task } from \"../dt/index.js\";\nimport * as _ from \"lodash-es\";\nimport { buildLogger, ILogger } from \"@certd/basic\";\n\nexport type HistoryStatus = {\n  result: HistoryResult;\n  logs: string[];\n};\n\nexport type RunTrigger = {\n  type: string; // user , timer\n};\n\nexport function NewRunHistory(obj: any) {\n  const history = new RunHistory(obj.id, obj.trigger, obj.pipeline);\n  history.logs = obj.logs;\n  history._loggers = obj.loggers;\n  return history;\n}\nexport class RunHistory {\n  id!: any;\n  pipeline!: Pipeline;\n  logs: {\n    [runnableId: string]: string[];\n  } = {};\n  _loggers: {\n    [runnableId: string]: ILogger;\n  } = {};\n  trigger!: RunTrigger;\n\n  constructor(runtimeId: any, trigger: RunTrigger, pipeline: Pipeline) {\n    this.id = runtimeId;\n    this.pipeline = pipeline;\n    this.trigger = trigger;\n  }\n\n  start(runnable: Runnable): HistoryResult {\n    const now = new Date().getTime();\n    this.logs[runnable.id] = [];\n    this._loggers[runnable.id] = buildLogger((text: string) => {\n      this.logs[runnable.id].push(text);\n    });\n    const status: HistoryResult = {\n      output: {},\n      status: ResultType.start,\n      startTime: now,\n      result: ResultType.start,\n    };\n    runnable.status = status;\n    this.log(runnable, `开始执行`);\n    return status;\n  }\n\n  success(runnable: Runnable) {\n    const now = new Date().getTime();\n    const status = runnable.status;\n    _.merge(status, {\n      status: \"success\",\n      endTime: now,\n      result: \"success\",\n    });\n    this.log(runnable, `执行成功`);\n  }\n\n  skip(runnable: Runnable) {\n    const now = new Date().getTime();\n    const status = runnable.status;\n    _.merge(status, {\n      status: \"success\",\n      endTime: now,\n      result: \"skip\",\n    });\n    this.log(runnable, `跳过`);\n  }\n\n  disabled(runnable: Runnable) {\n    const now = new Date().getTime();\n    const status = runnable.status;\n    _.merge(status, {\n      status: \"canceled\",\n      endTime: now,\n      result: \"disabled\",\n    });\n    this.log(runnable, `禁用`);\n  }\n\n  error(runnable: Runnable, e: Error) {\n    const now = new Date().getTime();\n    const status = runnable.status;\n    _.merge(status, {\n      status: ResultType.error,\n      endTime: now,\n      result: ResultType.error,\n      message: e.message,\n    });\n\n    this.logError(runnable, e);\n  }\n\n  cancel(runnable: Runnable) {\n    const now = new Date().getTime();\n    const status = runnable.status;\n    _.merge(status, {\n      status: ResultType.canceled,\n      endTime: now,\n      result: ResultType.canceled,\n      message: \"用户取消\",\n    });\n\n    this.log(runnable, \"任务取消\");\n  }\n\n  log(runnable: Runnable, text: string) {\n    // @ts-ignore\n    this._loggers[runnable.id].info(`[${runnable.runnableType}] [${runnable.title}]<id:${runnable.id}> ：`, text);\n  }\n\n  logError(runnable: Runnable, e: Error) {\n    const { cause, stack } = e;\n    delete e.stack;\n    delete e.cause;\n    if (runnable.runnableType === \"step\") {\n      this._loggers[runnable.id].error(`[${runnable.runnableType}] [${runnable.title}]<id:${runnable.id}> ：`, e, stack, cause);\n    } else {\n      this._loggers[runnable.id].error(`[${runnable.runnableType}] [${runnable.title}]<id:${runnable.id}> ：`, e.message);\n    }\n  }\n\n  finally(runnable: Runnable) {\n    //\n  }\n}\n\nexport class RunnableCollection {\n  private collection: RunnableMap = {};\n  private pipeline!: Pipeline;\n  currentStep!: Step;\n  constructor(pipeline?: Pipeline) {\n    if (!pipeline) {\n      return;\n    }\n    this.pipeline = pipeline;\n    const map = this.toMap(pipeline);\n    this.collection = map;\n  }\n\n  static initPipelineRunnableType(pipeline: Pipeline) {\n    pipeline.runnableType = \"pipeline\";\n    if (pipeline.stages === undefined) {\n      pipeline.stages = [];\n      return;\n    }\n    pipeline.stages.forEach(stage => {\n      stage.runnableType = \"stage\";\n      stage.tasks.forEach(task => {\n        task.runnableType = \"task\";\n        task.steps.forEach(step => {\n          step.runnableType = \"step\";\n        });\n      });\n    });\n  }\n\n  static each<T extends Runnable>(list: T[], exec: (item: Runnable) => void) {\n    list.forEach(item => {\n      exec(item);\n      if (item.runnableType === \"pipeline\") {\n        // @ts-ignore\n        RunnableCollection.each<Stage>(item.stages, exec);\n      } else if (item.runnableType === \"stage\") {\n        // @ts-ignore\n        RunnableCollection.each<Task>(item.tasks, exec);\n      } else if (item.runnableType === \"task\") {\n        // @ts-ignore\n        RunnableCollection.each<Step>(item.steps, exec);\n      }\n    });\n  }\n  public toMap(pipeline: Pipeline) {\n    const map: RunnableMap = {};\n\n    RunnableCollection.each(pipeline.stages, item => {\n      map[item.id] = item;\n    });\n    return map;\n  }\n\n  get(id: string): Runnable | undefined {\n    return this.collection[id];\n  }\n\n  clear() {\n    if (!this.pipeline) {\n      return;\n    }\n    RunnableCollection.each(this.pipeline.stages, item => {\n      item.status = undefined;\n    });\n  }\n\n  clearById(id: string) {\n    const runnable = this.collection[id];\n    if (runnable?.status) {\n      runnable.status.status = ResultType.none;\n      runnable.status.result = ResultType.none;\n      runnable.status.output = {};\n      runnable.status.inputHash = \"\";\n      // @ts-ignore\n      runnable.input = {};\n    }\n  }\n\n  add(runnable: Runnable) {\n    this.collection[runnable.id] = runnable;\n    if (runnable.runnableType === \"step\") {\n      this.currentStep = runnable as Step;\n    }\n  }\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/core/storage.ts",
    "content": "import fs from \"fs\";\nimport path from \"path\";\nimport { fileUtils } from \"@certd/basic\";\n\nexport interface IStorage {\n  get(scope: string, namespace: string, version: string, key: string): Promise<string | null>;\n  set(scope: string, namespace: string, version: string, key: string, value: string): Promise<void>;\n  remove(scope: string, namespace: string, version: string, key: string): Promise<void>;\n}\n\nexport class FileStorage implements IStorage {\n  root: string;\n  constructor(rootDir?: string) {\n    this.root = fileUtils.getFileRootDir(rootDir);\n  }\n\n  async remove(scope: string, namespace: string, version: string, key: string): Promise<void> {\n    if (key) {\n      fs.unlinkSync(this.buildPath(scope, namespace, version, key));\n    } else if (version) {\n      fs.rmdirSync(this.buildPath(scope, namespace, version));\n    } else if (namespace) {\n      fs.rmdirSync(this.buildPath(scope, namespace));\n    } else {\n      fs.rmdirSync(this.buildPath(scope));\n    }\n  }\n\n  writeFile(filePath: string, value: string) {\n    const dir = path.dirname(filePath);\n    if (!fs.existsSync(dir)) {\n      fs.mkdirSync(dir, { recursive: true });\n    }\n    fs.writeFileSync(filePath, value);\n    return filePath;\n  }\n\n  readFile(filePath: string) {\n    if (!fs.existsSync(filePath)) {\n      return null;\n    }\n    return fs.readFileSync(filePath).toString();\n  }\n\n  async get(scope: string, namespace: string, version: string, key: string): Promise<string | null> {\n    const path = this.buildPath(scope, namespace, version, key);\n    return this.readFile(path);\n  }\n\n  async set(scope: string, namespace: string, version: string, key: string, value: string): Promise<void> {\n    const path = this.buildPath(scope, namespace, version, key);\n    this.writeFile(path, value);\n  }\n\n  private buildPath(scope: string, namespace?: string, version?: string, key?: string) {\n    if (key) {\n      return `${this.root}/${scope}/${namespace}/${version}/${key}`;\n    } else if (version) {\n      return `${this.root}/${scope}/${namespace}/${version}`;\n    } else if (namespace) {\n      return `${this.root}/${scope}/${namespace}`;\n    } else {\n      return `${this.root}/${scope}`;\n    }\n  }\n}\n\nexport class MemoryStorage implements IStorage {\n  /**\n   * 范围： user / pipeline / runtime / task\n   */\n  scope: any;\n  namespace: any;\n  context: {\n    [scope: string]: {\n      [key: string]: any;\n    };\n  } = {};\n\n  async get(scope: string, namespace: string, version: string, key: string): Promise<string | null> {\n    const scopeContext = this.context[scope];\n    if (scopeContext == null) {\n      return null;\n    }\n    const nsContext = scopeContext[namespace];\n    if (nsContext == null) {\n      return null;\n    }\n    const versionContext = nsContext[version];\n    if (versionContext == null) {\n      return null;\n    }\n    return versionContext[key];\n  }\n\n  async set(scope: string, namespace: string, version: string, key: string, value: string): Promise<void> {\n    let scopeContext = this.context[scope];\n    if (scopeContext == null) {\n      scopeContext = scopeContext[scope];\n    }\n    let nsContext = scopeContext[namespace];\n    if (nsContext == null) {\n      nsContext = {};\n      scopeContext[namespace] = nsContext;\n    }\n    let versionContext = nsContext[version];\n    if (versionContext == null) {\n      versionContext = {};\n      nsContext[version] = versionContext;\n    }\n    versionContext[key] = value;\n  }\n\n  async remove(scope: string, namespace = \"\", version = \"\", key = \"\") {\n    if (key) {\n      if (this.context[scope] && this.context[scope][namespace] && this.context[scope][namespace][version]) {\n        delete this.context[scope][namespace][version][key];\n      }\n    } else if (version) {\n      if (this.context[scope] && this.context[scope][namespace]) {\n        delete this.context[scope][namespace][version];\n      }\n    } else if (namespace) {\n      if (this.context[scope]) {\n        delete this.context[scope][namespace];\n      }\n    } else {\n      delete this.context[scope];\n    }\n  }\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/decorator/index.ts",
    "content": "export * from \"./utils.js\";\n"
  },
  {
    "path": "packages/core/pipeline/src/decorator/utils.ts",
    "content": "import * as _ from \"lodash-es\";\n\nconst propertyMap: any = {};\nfunction attachProperty(target: any, propertyKey: string | symbol) {\n  let props = propertyMap[target];\n  if (props == null) {\n    props = {};\n    propertyMap[target] = props;\n  }\n  props[propertyKey] = true;\n}\n\nfunction getClassProperties(target: any) {\n  //获取父类, 向上追溯三层\n  const parent = Object.getPrototypeOf(target);\n  const pParent = Object.getPrototypeOf(parent);\n  const pParentMap = propertyMap[pParent] || {};\n  const parentMap = propertyMap[parent] || {};\n  const current = propertyMap[target] || {};\n  return _.merge({}, pParentMap, parentMap, current);\n}\n\nfunction target(target: any, propertyKey?: string | symbol) {\n  if (typeof target === \"object\" && target.constructor) {\n    target = target.constructor;\n  }\n  if (propertyKey != null) {\n    attachProperty(target, propertyKey);\n  }\n  return target;\n}\n\nfunction inject(define: any, instance: any, context: any, preHandler?: (item: any, key: string, instance: any, context: any) => void) {\n  _.forEach(define, (item: any, key: any) => {\n    if (preHandler) {\n      preHandler(item, key, instance, context);\n    }\n    if (context[key] != undefined) {\n      instance[key] = context[key];\n    }\n  });\n}\nexport const Decorator = {\n  target,\n  attachProperty,\n  getClassProperties,\n  inject,\n};\n"
  },
  {
    "path": "packages/core/pipeline/src/dt/fast-crud.ts",
    "content": "/**\n * [x]-col的配置\n */\nexport type ColProps = {\n  span?: number;\n  [props: string]: any;\n};\n\nexport type FormItemProps = {\n  /**\n   * 字段label\n   */\n  title?: string;\n  /**\n   * 表单字段组件配置\n   */\n  component?: ComponentProps;\n  /**\n   * 表单字段 [a|el|n]-col的配置\n   * 一般用来配置跨列：{span:24} 占满一行\n   */\n  col?: ColProps;\n  /**\n   * 默认值\n   */\n  value?: any;\n  /**\n   * 帮助提示配置\n   */\n  helper?: string | FormItemHelperProps;\n  /**\n   * 排序号\n   */\n  order?: number;\n  /**\n   * 是否显示此字段\n   */\n  show?: boolean;\n  /**\n   * 是否是空白占位栏\n   */\n  blank?: boolean;\n\n  [key: string]: any;\n};\n\n/**\n * 表单字段帮助说明配置\n */\nexport type FormItemHelperProps = {\n  /**\n   * 自定义渲染帮助说明\n   * @param scope\n   */\n  render?: (scope: any) => any;\n  /**\n   * 帮助文本\n   */\n  text?: string;\n  /**\n   * 帮助说明所在的位置，[ undefined | label]\n   */\n  position?: string;\n  /**\n   * [a|el|n]-tooltip配置\n   */\n  tooltip?: object;\n\n  [key: string]: any;\n};\n\n/**\n * 组件配置\n */\nexport type ComponentProps = {\n  /**\n   * 组件的名称\n   */\n  name?: string | object;\n  /**\n   * vmodel绑定的目标属性名\n   */\n  vModel?: string;\n\n  /**\n   * 当原始组件名的参数被以上属性名占用时，可以配置在这里\n   * 例如:原始组件有一个叫name的属性，你想要配置它，则可以按如下配置\n   * ```\n   * component:{\n   *   name:\"组件的名称\"\n   *   props:{\n   *     name:\"组件的name属性\"  <-----------\n   *   }\n   * }\n   * ```\n   */\n  props?: {\n    [key: string]: any;\n  };\n\n  /**\n   * 组件事件监听\n   */\n  on?: {\n    [key: string]: (context?: any) => void;\n  };\n\n  /**\n   * 组件其他参数\n   * 事件：onXxx:(event)=>void 组件原始事件监听\n   *      on.onXxx:(context)=>void 组件事件监听(对原始事件包装)\n   * 样式：style、class等\n   */\n  [key: string]: any;\n};\n"
  },
  {
    "path": "packages/core/pipeline/src/dt/index.ts",
    "content": "export * from \"./pipeline.js\";\nexport * from \"./fast-crud.js\";\n"
  },
  {
    "path": "packages/core/pipeline/src/dt/pipeline.ts",
    "content": "export enum RunStrategy {\n  AlwaysRun,\n  SkipWhenSucceed,\n}\n\nexport enum ConcurrencyStrategy {\n  Serial,\n  Parallel,\n}\n\nexport enum NextStrategy {\n  AllSuccess,\n  OneSuccess,\n}\n\nexport enum HandlerType {\n  //清空后续任务的状态\n  ClearFollowStatus,\n  SendEmail,\n}\n\nexport type EventHandler = {\n  type: HandlerType;\n  params: {\n    [key: string]: any;\n  };\n};\n\nexport type RunnableStrategy = {\n  runStrategy?: RunStrategy;\n  onSuccess?: EventHandler[];\n  onError?: EventHandler[];\n};\n\nexport type Step = Runnable & {\n  type: string; //插件类型\n  input: {\n    [key: string]: any;\n  };\n};\nexport type Task = Runnable & {\n  steps: Step[];\n};\n\nexport type Stage = Runnable & {\n  tasks: Task[];\n  concurrency: ConcurrencyStrategy;\n  next: NextStrategy;\n  maxTaskCount?: number;\n};\n\nexport type Trigger = {\n  id: string;\n  title: string;\n  props: {\n    cron: string;\n  };\n  type: string;\n};\n\nexport type FileItem = {\n  id: string;\n  filename: string;\n  path: string;\n};\nexport type Runnable = {\n  id: any;\n  title: string;\n  strategy?: RunnableStrategy;\n  runnableType?: string; // pipeline, stage, task , step\n  status?: HistoryResult;\n  timeout?: number;\n  default?: {\n    [key: string]: any;\n  };\n  disabled?: boolean;\n};\n\nexport type EmailOptions = {\n  receivers: string[];\n};\nexport type NotificationWhen = \"error\" | \"success\" | \"turnToSuccess\" | \"start\";\nexport type NotificationType = \"email\" | \"other\";\nexport type Notification = {\n  type: NotificationType;\n  when: NotificationWhen[];\n  options?: EmailOptions;\n  notificationId: number;\n  title: string;\n};\n\nexport type Pipeline = Runnable & {\n  version?: number;\n  userId: any;\n  stages: Stage[];\n  triggers: Trigger[];\n  notifications?: Notification[];\n};\n\nexport type Context = {\n  [key: string]: any;\n};\n\nexport type Log = {\n  title: string;\n  time: number;\n  level: string;\n  text: string;\n};\n\nexport type ResultError = {\n  e: any;\n  returnType: ResultType;\n  runnable: Runnable;\n};\n\nexport enum ResultType {\n  start = \"start\",\n  success = \"success\",\n  error = \"error\",\n  canceled = \"canceled\",\n  skip = \"skip\",\n  disabled = \"disabled\",\n  none = \"none\",\n}\n\nexport type HistoryResultGroup = {\n  [key: string]: {\n    runnable: Runnable;\n    res: HistoryResult;\n  };\n};\nexport type HistoryResult = {\n  inputHash?: string;\n  output: any;\n  files?: FileItem[];\n  /**\n   * 任务状态\n   */\n  status: ResultType;\n  startTime: number;\n  endTime?: number;\n  /**\n   * 处理结果\n   */\n  result?: ResultType; //success, error,skip\n  message?: string;\n};\n\nexport type RunnableMap = {\n  [id: string]: Runnable;\n};\n"
  },
  {
    "path": "packages/core/pipeline/src/index.ts",
    "content": "export * from \"./core/index.js\";\nexport * from \"./dt/index.js\";\nexport * from \"./access/index.js\";\nexport * from \"./registry/index.js\";\nexport * from \"./plugin/index.js\";\nexport * from \"./context/index.js\";\nexport * from \"./decorator/index.js\";\nexport * from \"./service/index.js\";\nexport * from \"./notification/index.js\";\n"
  },
  {
    "path": "packages/core/pipeline/src/notification/api.ts",
    "content": "import { PluginRequestHandleReq } from \"../plugin\";\nimport { Registrable } from \"../registry/index.js\";\nimport { FormItemProps, HistoryResult, Pipeline } from \"../dt/index.js\";\nimport { HttpClient, ILogger, utils } from \"@certd/basic\";\nimport * as _ from \"lodash-es\";\nimport { IEmailService } from \"../service/index.js\";\n\nexport type NotificationBody = {\n  userId?: number;\n  title: string;\n  content: string;\n  pipeline?: Pipeline;\n  pipelineId?: number;\n  result?: HistoryResult;\n  historyId?: number;\n  errorMessage?: string;\n  url?: string;\n};\n\nexport type NotificationRequestHandleReqInput<T = any> = {\n  id?: number;\n  title?: string;\n  access: T;\n};\n\nexport type NotificationRequestHandleReq<T = any> = PluginRequestHandleReq<NotificationRequestHandleReqInput<T>>;\n\nexport type NotificationInputDefine = FormItemProps & {\n  title: string;\n  required?: boolean;\n  encrypt?: boolean;\n};\nexport type NotificationDefine = Registrable & {\n  needPlus?: boolean;\n  input?: {\n    [key: string]: NotificationInputDefine;\n  };\n};\n\nexport type NotificationInstanceConfig = {\n  id: number;\n  type: string;\n  name: string;\n  userId: number;\n  setting: {\n    [key: string]: any;\n  };\n};\n\nexport type NotificationSendReq = {\n  id?: number;\n  useDefault?: boolean;\n  useEmail?: boolean;\n  emailAddress?: string;\n  logger: ILogger;\n  body: NotificationBody;\n};\nexport interface INotificationService {\n  getById(id: number): Promise<NotificationInstanceConfig>;\n  getDefault(): Promise<NotificationInstanceConfig>;\n  send(req: NotificationSendReq): Promise<void>;\n}\n\nexport interface INotification {\n  ctx: NotificationContext;\n  [key: string]: any;\n}\n\nexport type NotificationContext = {\n  http: HttpClient;\n  logger: ILogger;\n  utils: typeof utils;\n  emailService: IEmailService;\n};\n\nexport abstract class BaseNotification implements INotification {\n  define!: NotificationDefine;\n  ctx!: NotificationContext;\n  http!: HttpClient;\n  logger!: ILogger;\n\n  async doSend(body: NotificationBody) {\n    return await this.send(body);\n  }\n  abstract send(body: NotificationBody): Promise<void>;\n\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  async onInstance() {}\n  setCtx(ctx: NotificationContext) {\n    this.ctx = ctx;\n    this.http = ctx.http;\n    this.logger = ctx.logger;\n  }\n  setDefine = (define: NotificationDefine) => {\n    this.define = define;\n  };\n\n  async onRequest(req: NotificationRequestHandleReq) {\n    if (!req.action) {\n      throw new Error(\"action is required\");\n    }\n\n    let methodName = req.action;\n    if (!req.action.startsWith(\"on\")) {\n      methodName = `on${_.upperFirst(req.action)}`;\n    }\n\n    // @ts-ignore\n    const method = this[methodName];\n    if (method) {\n      // @ts-ignore\n      return await this[methodName](req.data);\n    }\n    throw new Error(`action ${req.action} not found`);\n  }\n\n  async onTestRequest() {\n    return await this.doSend({\n      userId: 0,\n      title: \"【标题】测试通知【*.foo.com】，标题长度测试、测试、测试\",\n      content: `测试通知\n域名测试: *.foo.com\n换行测试\n(括号测试)\n<尖括号测试>\n[中括号测试]\n      `,\n      pipeline: {\n        id: 1,\n        title: \"证书申请成功【测试流水线】\",\n      } as any,\n      pipelineId: 1,\n      historyId: 1,\n      url: \"https://certd.docmirror.cn\",\n    });\n  }\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/notification/decorator.ts",
    "content": "// src/decorator/memoryCache.decorator.ts\nimport { Decorator } from \"../decorator/index.js\";\nimport * as _ from \"lodash-es\";\nimport { merge } from \"lodash-es\";\nimport { notificationRegistry } from \"./registry.js\";\nimport { BaseNotification, NotificationBody, NotificationContext, NotificationDefine, NotificationInputDefine, NotificationInstanceConfig } from \"./api.js\";\n\n// 提供一个唯一 key\nexport const NOTIFICATION_CLASS_KEY = \"pipeline:notification\";\nexport const NOTIFICATION_INPUT_KEY = \"pipeline:notification:input\";\n\nexport function IsNotification(define: NotificationDefine): ClassDecorator {\n  return (target: any) => {\n    target = Decorator.target(target);\n\n    const inputs: any = {};\n    const properties = Decorator.getClassProperties(target);\n    for (const property in properties) {\n      const input = Reflect.getMetadata(NOTIFICATION_INPUT_KEY, target, property);\n      if (input) {\n        inputs[property] = input;\n      }\n    }\n    _.merge(define, { input: inputs });\n    Reflect.defineMetadata(NOTIFICATION_CLASS_KEY, define, target);\n    target.define = define;\n    notificationRegistry.register(define.name, {\n      define,\n      target: async () => {\n        return target;\n      },\n    });\n  };\n}\n\nexport function NotificationInput(input?: NotificationInputDefine): PropertyDecorator {\n  return (target, propertyKey) => {\n    target = Decorator.target(target, propertyKey);\n    // const _type = Reflect.getMetadata(\"design:type\", target, propertyKey);\n    Reflect.defineMetadata(NOTIFICATION_INPUT_KEY, input, target, propertyKey);\n  };\n}\n\nexport async function newNotification(type: string, input: any, ctx: NotificationContext) {\n  const register = notificationRegistry.get(type);\n  if (register == null) {\n    throw new Error(`notification ${type} not found`);\n  }\n  // @ts-ignore\n  const pluginCls = await register.target();\n  // @ts-ignore\n  const plugin = new pluginCls();\n  merge(plugin, input);\n  if (!ctx) {\n    throw new Error(\"ctx is required\");\n  }\n  plugin.setDefine(register.define);\n  plugin.setCtx(ctx);\n  await plugin.onInstance();\n  return plugin;\n}\n\nexport async function sendNotification(opts: { config: NotificationInstanceConfig; ctx: NotificationContext; body: NotificationBody }) {\n  const notification: BaseNotification = await newNotification(opts.config.type, opts.config.setting, opts.ctx);\n  await notification.doSend(opts.body);\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/notification/index.ts",
    "content": "export * from \"./api.js\";\nexport * from \"./registry.js\";\nexport * from \"./decorator.js\";\n"
  },
  {
    "path": "packages/core/pipeline/src/notification/registry.ts",
    "content": "import { createRegistry } from \"../registry/index.js\";\n\n// @ts-ignore\nexport const notificationRegistry = createRegistry(\"notification\");\n"
  },
  {
    "path": "packages/core/pipeline/src/plugin/api.ts",
    "content": "import { Registrable } from \"../registry/index.js\";\nimport { FileItem, FormItemProps, Pipeline, Runnable, Step } from \"../dt/index.js\";\nimport { FileStore } from \"../core/file-store.js\";\nimport { accessRegistry, IAccessService } from \"../access/index.js\";\nimport { ICnameProxyService, IEmailService, IServiceGetter, IUrlService } from \"../service/index.js\";\nimport { CancelError, IContext, RunHistory, RunnableCollection } from \"../core/index.js\";\nimport { HttpRequestConfig, ILogger, logger, utils } from \"@certd/basic\";\nimport { HttpClient } from \"@certd/basic\";\nimport dayjs from \"dayjs\";\nimport { IPluginConfigService } from \"../service/config.js\";\nimport { upperFirst } from \"lodash-es\";\nimport { INotificationService } from \"../notification/index.js\";\nimport { TaskEmitter } from \"../service/emit.js\";\n\nexport type PluginRequestHandleReq<T = any> = {\n  typeName: string;\n  action: string;\n  input: T;\n  data: any;\n};\n\nexport type UserInfo = {\n  role: \"admin\" | \"user\";\n  id: any;\n};\nexport enum ContextScope {\n  global,\n  pipeline,\n  runtime,\n}\n\nexport type TaskOutputDefine = {\n  title: string;\n  value?: any;\n  type?: string;\n};\n\nexport type TaskInputDefine = {\n  required?: boolean;\n  isSys?: boolean;\n} & FormItemProps;\n\nexport type PluginDefine = Registrable & {\n  default?: any;\n  group?: string;\n  icon?: string;\n  input?: {\n    [key: string]: TaskInputDefine;\n  };\n  output?: {\n    [key: string]: TaskOutputDefine;\n  };\n\n  shortcut?: {\n    [key: string]: {\n      title: string;\n      icon: string;\n      action: string;\n      form: any;\n    };\n  };\n  needPlus?: boolean;\n  showRunStrategy?: boolean;\n  pluginType?: string; //类型\n  type?: string; //来源\n};\n\nexport type ITaskPlugin = {\n  onInstance(): Promise<void>;\n  execute(): Promise<void | string>;\n  onRequest(req: PluginRequestHandleReq<any>): Promise<any>;\n  [key: string]: any;\n};\n\nexport type TaskResult = {\n  clearLastStatus?: boolean;\n  files?: FileItem[];\n  pipelineVars: Record<string, any>;\n  pipelinePrivateVars?: Record<string, any>;\n};\nexport type TaskInstanceContext = {\n  //流水线定义\n  pipeline: Pipeline;\n  //运行时历史\n  runtime: RunHistory;\n  //步骤定义\n  step: Step;\n  //日志\n  logger: ILogger;\n  //当前步骤输入参数跟上一次执行比较是否有变化\n  inputChanged: boolean;\n  //授权获取服务\n  accessService: IAccessService;\n  //邮件服务\n  emailService: IEmailService;\n  //cname记录服务\n  cnameProxyService: ICnameProxyService;\n  //插件配置服务\n  pluginConfigService: IPluginConfigService;\n  //通知服务\n  notificationService: INotificationService;\n  //url构建\n  urlService: IUrlService;\n  //流水线上下文\n  pipelineContext: IContext;\n  //用户上下文\n  userContext: IContext;\n  //http请求客户端\n  http: HttpClient;\n  //下载文件方法\n  download: (config: HttpRequestConfig, savePath: string) => Promise<void>;\n  //文件存储\n  fileStore: FileStore;\n  //上一次执行结果状态\n  lastStatus?: Runnable;\n  //用户取消信号\n  signal: AbortSignal;\n  //工具类\n  utils: typeof utils;\n  //用户信息\n  user: UserInfo;\n\n  emitter: TaskEmitter;\n\n  //service 容器\n  serviceGetter?: IServiceGetter;\n};\n\nexport abstract class AbstractTaskPlugin implements ITaskPlugin {\n  _result: TaskResult = { clearLastStatus: false, files: [], pipelineVars: {}, pipelinePrivateVars: {} };\n  ctx!: TaskInstanceContext;\n  logger!: ILogger;\n  http!: HttpClient;\n  accessService!: IAccessService;\n\n  clearLastStatus() {\n    this._result.clearLastStatus = true;\n  }\n\n  getFiles() {\n    return this._result.files;\n  }\n\n  checkSignal() {\n    if (this.ctx.signal && this.ctx.signal.aborted) {\n      throw new CancelError(\"用户取消\");\n    }\n  }\n\n  setCtx(ctx: TaskInstanceContext) {\n    this.ctx = ctx;\n    this.logger = ctx.logger;\n    this.accessService = ctx.accessService;\n    this.http = ctx.http;\n    // 将证书加入secret\n    // @ts-ignore\n    if (this.cert && this.cert.crt && this.cert.key) {\n      //有证书\n      // @ts-ignore\n      const cert: any = this.cert;\n      this.registerSecret(cert.crt);\n      this.registerSecret(cert.key);\n      this.registerSecret(cert.one);\n    }\n  }\n\n  async getAccess<T = any>(accessId: string | number, isCommon = false) {\n    if (accessId == null) {\n      throw new Error(\"您还没有配置授权\");\n    }\n    let res: any = null;\n    if (isCommon) {\n      res = await this.ctx.accessService.getCommonById(accessId);\n    } else {\n      res = await this.ctx.accessService.getById(accessId);\n    }\n    if (res == null) {\n      throw new Error(\"授权不存在，可能已被删除，请前往任务配置里面重新选择授权\");\n    }\n    // @ts-ignore\n    if (this.logger?.addSecret) {\n      // 隐藏加密信息，不在日志中输出\n      const type = res._type;\n      const plugin = accessRegistry.get(type);\n      const define = plugin.define;\n      // @ts-ignore\n      const input = define.input;\n      for (const key in input) {\n        if (input[key].encrypt && res[key] != null) {\n          // @ts-ignore\n          this.logger.addSecret(res[key]);\n        }\n      }\n    }\n\n    return res as T;\n  }\n\n  registerSecret(value: string) {\n    // @ts-ignore\n    if (this.logger?.addSecret) {\n      // @ts-ignore\n      this.logger.addSecret(value);\n    }\n  }\n\n  randomFileId() {\n    return Math.random().toString(36).substring(2, 9);\n  }\n  saveFile(filename: string, file: Buffer) {\n    const filePath = this.ctx.fileStore.writeFile(filename, file);\n    logger.info(`saveFile:${filePath}`);\n    this._result.files?.push({\n      id: this.randomFileId(),\n      filename,\n      path: filePath,\n    });\n  }\n\n  extendsFiles() {\n    if (this._result.files == null) {\n      this._result.files = [];\n    }\n    this._result.files.push(...(this.ctx.lastStatus?.status?.files || []));\n  }\n\n  get pipeline() {\n    return this.ctx.pipeline;\n  }\n\n  get step() {\n    return this.ctx.step;\n  }\n\n  async onInstance(): Promise<void> {\n    return;\n  }\n\n  abstract execute(): Promise<void | string>;\n\n  appendTimeSuffix(name?: string) {\n    if (name == null) {\n      name = \"certd\";\n    }\n    return name + \"_\" + dayjs().format(\"YYYYMMDDHHmmssSSS\");\n  }\n\n  buildCertName(domain: string) {\n    domain = domain.replaceAll(\"*\", \"_\").replaceAll(\".\", \"_\");\n    return `${domain}_${dayjs().format(\"YYYYMMDDHHmmssSSS\")}`;\n  }\n\n  async onRequest(req: PluginRequestHandleReq<any>) {\n    if (!req.action) {\n      throw new Error(\"action is required\");\n    }\n\n    let methodName = req.action;\n    if (!req.action.startsWith(\"on\")) {\n      methodName = `on${upperFirst(req.action)}`;\n    }\n\n    // @ts-ignore\n    const method = this[methodName];\n    if (method) {\n      // @ts-ignore\n      return await this[methodName](req.data);\n    }\n    throw new Error(`action ${req.action} not found`);\n  }\n\n  isAdmin() {\n    return this.ctx.user.role === \"admin\";\n  }\n\n  getStepFromPipeline(stepId: string) {\n    let found: any = null;\n    RunnableCollection.each(this.ctx.pipeline.stages, step => {\n      if (step.id === stepId) {\n        found = step;\n        return;\n      }\n    });\n    return found;\n  }\n\n  getStepIdFromRefInput(ref = \".\") {\n    return ref.split(\".\")[1];\n  }\n}\n\nexport type OutputVO = {\n  key: string;\n  title: string;\n  value: any;\n};\n"
  },
  {
    "path": "packages/core/pipeline/src/plugin/decorator.ts",
    "content": "import { pluginRegistry } from \"./registry.js\";\nimport { PluginDefine, TaskInputDefine, TaskOutputDefine } from \"./api.js\";\nimport { Decorator } from \"../decorator/index.js\";\nimport \"reflect-metadata\";\nimport { merge, sortBy } from \"lodash-es\";\n// 提供一个唯一 key\nexport const PLUGIN_CLASS_KEY = \"pipeline:plugin\";\n\nexport function IsTaskPlugin(define: PluginDefine): ClassDecorator {\n  return (target: any) => {\n    target = Decorator.target(target);\n\n    const inputs: any = {};\n    const outputs: any = {};\n    const properties = Decorator.getClassProperties(target);\n    for (const property in properties) {\n      const input = Reflect.getMetadata(PLUGIN_INPUT_KEY, target, property);\n      if (input) {\n        inputs[property] = input;\n      }\n\n      const output = Reflect.getMetadata(PLUGIN_OUTPUT_KEY, target, property);\n      if (output) {\n        outputs[property] = output;\n      }\n    }\n\n    // inputs 转换为array，根据order排序，然后再转换为map\n\n    let inputArray = [];\n    for (const key in inputs) {\n      const _input = inputs[key];\n      if (_input.order == null) {\n        _input.order = 0;\n      }\n      inputArray.push([key, _input]);\n    }\n    inputArray = sortBy(inputArray, (item: any) => item[1].order);\n    const inputMap: any = {};\n    inputArray.forEach((item: any) => {\n      inputMap[item[0]] = item[1];\n    });\n\n    const defaultConfig = {\n      showRunStrategy: false,\n      default: {\n        strategy: {\n          runStrategy: 1, // 0:正常执行，1:成功后跳过\n        },\n      },\n    };\n\n    define = merge(defaultConfig, define, { input: inputMap, output: outputs });\n\n    Reflect.defineMetadata(PLUGIN_CLASS_KEY, define, target);\n\n    target.define = define;\n\n    pluginRegistry.register(define.name, {\n      define,\n      target: async () => {\n        return target;\n      },\n    });\n  };\n}\n\nexport const PLUGIN_INPUT_KEY = \"pipeline:plugin:input\";\n\nexport function TaskInput(input?: TaskInputDefine): PropertyDecorator {\n  return (target, propertyKey) => {\n    target = Decorator.target(target, propertyKey);\n    Reflect.defineMetadata(PLUGIN_INPUT_KEY, input, target, propertyKey);\n  };\n}\n\n// 装饰器内部的唯一 id\nexport const PLUGIN_OUTPUT_KEY = \"pipeline:plugin:output\";\nexport function TaskOutput(output?: TaskOutputDefine): PropertyDecorator {\n  return (target, propertyKey) => {\n    target = Decorator.target(target, propertyKey);\n    Reflect.defineMetadata(PLUGIN_OUTPUT_KEY, output, target, propertyKey);\n  };\n}\n\nexport const PLUGIN_DOWNLOAD_KEY = \"pipeline:plugin:download\";\nexport function TaskDownload(output?: TaskOutputDefine): PropertyDecorator {\n  return (target, propertyKey) => {\n    target = Decorator.target(target, propertyKey);\n    Reflect.defineMetadata(PLUGIN_DOWNLOAD_KEY, output, target, propertyKey);\n  };\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/plugin/group.ts",
    "content": "import { PluginDefine } from \"./api\";\n\nexport class PluginGroup {\n  key: string;\n  title: string;\n  desc?: string;\n  order: number;\n  plugins: PluginDefine[];\n  icon?: string;\n\n  constructor(key: string, title: string, order = 0, icon = \"\") {\n    this.key = key;\n    this.title = title;\n    this.order = order;\n    this.icon = icon;\n    this.plugins = [];\n  }\n}\n\nexport const pluginGroups = {\n  cert: new PluginGroup(\"cert\", \"证书申请\", 1, \"ph:certificate\"),\n  host: new PluginGroup(\"host\", \"主机\", 2, \"clarity:host-line\"),\n  cdn: new PluginGroup(\"cdn\", \"CDN\", 2, \"svg:icon-cdn\"),\n  panel: new PluginGroup(\"panel\", \"面板\", 2, \"fluent:panel-left-header-32-filled\"),\n  aliyun: new PluginGroup(\"aliyun\", \"阿里云\", 2, \"svg:icon-aliyun\"),\n  huawei: new PluginGroup(\"huawei\", \"华为云\", 3, \"svg:icon-huawei\"),\n  tencent: new PluginGroup(\"tencent\", \"腾讯云\", 4, \"svg:icon-tencentcloud\"),\n  volcengine: new PluginGroup(\"volcengine\", \"火山引擎\", 4, \"svg:icon-volcengine\"),\n  jdcloud: new PluginGroup(\"jdcloud\", \"京东云\", 4, \"svg:icon-jdcloud\"),\n  qiniu: new PluginGroup(\"qiniu\", \"七牛云\", 5, \"svg:icon-qiniuyun\"),\n  aws: new PluginGroup(\"aws\", \"亚马逊云\", 6, \"svg:icon-aws\"),\n  other: new PluginGroup(\"other\", \"其他\", 10, \"clarity:plugin-line\"),\n};\n"
  },
  {
    "path": "packages/core/pipeline/src/plugin/index.ts",
    "content": "export * from \"./api.js\";\nexport * from \"./registry.js\";\nexport * from \"./decorator.js\";\nexport * from \"./group.js\";\n"
  },
  {
    "path": "packages/core/pipeline/src/plugin/registry.ts",
    "content": "import { createRegistry, OnRegisterContext } from \"../registry/index.js\";\nimport { AbstractTaskPlugin } from \"./api.js\";\nimport { pluginGroups } from \"./group.js\";\n\nconst onRegister = ({ key, value }: OnRegisterContext<AbstractTaskPlugin>) => {\n  //如果有相同名字的先移除\n\n  for (const group of Object.values(pluginGroups)) {\n    const index = group.plugins.findIndex(plugin => plugin.name === key);\n    if (index > -1) {\n      group.plugins.splice(index, 1);\n    }\n  }\n\n  const group = value?.define?.group as string;\n  if (group) {\n    if (pluginGroups.hasOwnProperty(group)) {\n      // @ts-ignore\n      pluginGroups[group].plugins.push(value.define);\n      return;\n    }\n  }\n  pluginGroups.other.plugins.push(value.define);\n};\nexport const pluginRegistry = createRegistry<AbstractTaskPlugin>(\"plugin\", onRegister);\n"
  },
  {
    "path": "packages/core/pipeline/src/registry/index.ts",
    "content": "export * from \"./registry.js\";\n"
  },
  {
    "path": "packages/core/pipeline/src/registry/registry.ts",
    "content": "import { isDev, logger } from \"@certd/basic\";\n\nexport type Registrable = {\n  name: string;\n  title: string;\n  desc?: string;\n  group?: string;\n  deprecated?: string;\n  order?: number;\n};\nexport type TargetGetter<T> = () => Promise<T>;\nexport type RegistryItem<T> = {\n  define: Registrable;\n  target: TargetGetter<T>;\n};\n\nexport type OnRegisterContext<T> = {\n  registry: Registry<T>;\n  key: string;\n  value: RegistryItem<T>;\n};\nexport type OnRegister<T> = (ctx: OnRegisterContext<T>) => void;\nexport class Registry<T = any> {\n  type = \"\";\n  storage: {\n    [key: string]: RegistryItem<T>;\n  } = {};\n\n  onRegister?: OnRegister<T>;\n\n  constructor(type: string, onRegister?: OnRegister<T>) {\n    this.type = type;\n    this.onRegister = onRegister;\n  }\n\n  register(key: string, value: RegistryItem<T>) {\n    if (!key || value == null) {\n      return;\n    }\n    this.storage[key] = value;\n    if (this.onRegister) {\n      this.onRegister({\n        registry: this,\n        key,\n        value,\n      });\n    }\n    logger.info(`注册插件:${this.type}:${key}`);\n  }\n\n  unRegister(key: string) {\n    delete this.storage[key];\n    logger.info(`反注册插件:${this.type}:${key}`);\n  }\n\n  get(name: string): RegistryItem<T> {\n    if (!name) {\n      throw new Error(\"插件名称不能为空\");\n    }\n\n    const plugin = this.storage[name];\n    if (!plugin) {\n      throw new Error(`插件${name}还未注册`);\n    }\n    return plugin;\n  }\n\n  getStorage() {\n    return this.storage;\n  }\n\n  getDefineList() {\n    let list = [];\n    for (const key in this.storage) {\n      const define = this.getDefine(key);\n      if (define) {\n        if (define?.deprecated) {\n          continue;\n        }\n        if (!isDev() && define.name.startsWith(\"demo\")) {\n          continue;\n        }\n        list.push({ ...define, key });\n      }\n    }\n\n    list = list.sort((a, b) => {\n      return (a.order ?? 10) - (b?.order ?? 10);\n    });\n    return list;\n  }\n\n  getDefine(key: string) {\n    const item = this.storage[key];\n    if (!item) {\n      return;\n    }\n    return item.define;\n  }\n}\n\nexport function createRegistry<T>(type: string, onRegister?: OnRegister<T>): Registry<T> {\n  const pipelineregistrycacheKey = \"PIPELINE_REGISTRY_CACHE\";\n  // @ts-ignore\n  let cached: any = global[pipelineregistrycacheKey];\n  if (!cached) {\n    cached = {};\n    // @ts-ignore\n    global[pipelineregistrycacheKey] = cached;\n  }\n\n  if (cached[type]) {\n    return cached[type];\n  }\n  const newRegistry = new Registry<T>(type, onRegister);\n  cached[type] = newRegistry;\n  return newRegistry;\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/service/cname.ts",
    "content": "import { IAccess } from \"../access\";\n\nexport type CnameProvider = {\n  id: any;\n  domain: string;\n  title?: string;\n  dnsProviderType?: string;\n  access?: IAccess;\n  accessId?: any;\n};\n\nexport type CnameRecord = {\n  id: any;\n  domain: string;\n  hostRecord: string;\n  recordValue: string;\n  cnameProvider: CnameProvider;\n  status: string;\n  commonDnsProvider?: any;\n};\n\nexport type ICnameProxyService = {\n  getByDomain: (domain: string) => Promise<CnameRecord>;\n};\n"
  },
  {
    "path": "packages/core/pipeline/src/service/config.ts",
    "content": "export type PluginConfig = {\n  name: string;\n  disabled: boolean;\n  sysSetting: {\n    input: Record<string, any>;\n  };\n};\n\n//插件配置服务\nexport type IPluginConfigService = {\n  getPluginConfig: (pluginName: string) => Promise<PluginConfig>;\n};\n"
  },
  {
    "path": "packages/core/pipeline/src/service/email.ts",
    "content": "export type EmailSend = {\n  subject: string;\n  receivers: string[];\n  content?: string;\n  attachments?: any[];\n  html?: string;\n};\n\nexport interface IEmailService {\n  send(email: EmailSend): Promise<void>;\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/service/emit.ts",
    "content": "import { logger } from \"@certd/basic\";\nimport { Pipeline, Runnable } from \"../dt\";\n\nexport type PipelineEventListener = (...args: any[]) => Promise<void>;\nexport type PipelineEvent<T> = {\n  pipeline: Pipeline;\n  step: Runnable;\n  event: T;\n};\nexport class PipelineEmitter {\n  events: Record<string, PipelineEventListener[]>;\n  constructor() {\n    this.events = {};\n  }\n  on(event: string, listener: PipelineEventListener) {\n    if (!this.events[event]) {\n      this.events[event] = [];\n    }\n    this.events[event].push(listener);\n  }\n  async emit<T>(name: string, event: PipelineEvent<T>) {\n    const listeners = this.events[name];\n    if (listeners) {\n      for (const listener of listeners) {\n        try {\n          await listener(event);\n        } catch (e) {\n          logger.error(`事件<${name}>监听器执行失败:`, e);\n        }\n      }\n    }\n  }\n  off(event: string, listener: PipelineEventListener) {\n    if (this.events[event]) {\n      this.events[event] = this.events[event].filter((l) => l !== listener);\n    }\n  }\n  once(event: string, listener: PipelineEventListener) {\n    const onceListener = async (...args: any[]) => {\n      this.off(event, onceListener);\n      await listener(...args);\n    };\n    this.on(event, onceListener);\n  }\n}\n\nexport const pipelineEmitter = new PipelineEmitter();\n\nexport type TaskEmitterCreateReq = {\n  step: Runnable;\n  pipeline: Pipeline;\n};\n\nexport type TaskEmitter = {\n  emit: <T>(name: string, event: T) => Promise<void>;\n};\n\nexport function taskEmitterCreate(req: TaskEmitterCreateReq) {\n  return {\n    emit: async <T>(name: string, event: T) => {\n      await pipelineEmitter.emit(name, {\n        pipeline: req.pipeline,\n        step: req.step,\n        event,\n      });\n    },\n  } as TaskEmitter;\n}\n"
  },
  {
    "path": "packages/core/pipeline/src/service/index.ts",
    "content": "export * from \"./email.js\";\nexport * from \"./cname.js\";\nexport * from \"./config.js\";\nexport * from \"./url.js\";\nexport * from \"./emit.js\";\nexport type IServiceGetter = {\n  get: <T>(name: string) => Promise<T>;\n};\n"
  },
  {
    "path": "packages/core/pipeline/src/service/url.ts",
    "content": "export interface IUrlService {\n  getPipelineDetailUrl(pipelineId: number, historyId: number): Promise<string>;\n}\n"
  },
  {
    "path": "packages/core/pipeline/test/cert.fake.test.ts",
    "content": "export const fakeCrt = `-----BEGIN CERTIFICATE-----\nMIIFSTCCBDGgAwIBAgITAPoZZk/LhVIyXoic2NnJyxubezANBgkqhkiG9w0BAQsF\nADAiMSAwHgYDVQQDDBdGYWtlIExFIEludGVybWVkaWF0ZSBYMTAeFw0yMDEyMTQx\nNjA1NTFaFw0yMTAzMTQxNjA1NTFaMBsxGTAXBgNVBAMMECouZG9jbWlycm9yLmNs\ndWIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC75tGrYjly+RpcZehQ\nmy1EpaXElT4L60pINKV2YDKnBrcSSo1c6rO7nFh12eC/ju4WwYUep0RVmBDF8xD0\nI1Sd1uuDTQWP0UT1X9yqdXtjvxpUqoCHAzG633f3sJRFul7mDLuC9tRCuae9o7qP\nEZ827XOmjBR35dso9I2GEE4828J3YE3tSKtobZlM+30jozLEcsO0PTyM5mq5PPjP\nVI3fGLcEaBmLZf5ixz4XkcY9IAhyAMYf03cT2wRoYPBaDdXblgCYL6sFtIMbzl3M\nDi94PB8NyoNSsC2nmBdWi54wFOgBvY/4ljsX/q7X3EqlSvcA0/M6/c/J9kJ3eupv\njV8nAgMBAAGjggJ9MIICeTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB\nBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAkdTjSCV3KD\nx28sf98MrwVfyFYgMB8GA1UdIwQYMBaAFMDMA0a5WCDMXHJw8+EuyyCm9Wg6MHcG\nCCsGAQUFBwEBBGswaTAyBggrBgEFBQcwAYYmaHR0cDovL29jc3Auc3RnLWludC14\nMS5sZXRzZW5jcnlwdC5vcmcwMwYIKwYBBQUHMAKGJ2h0dHA6Ly9jZXJ0LnN0Zy1p\nbnQteDEubGV0c2VuY3J5cHQub3JnLzArBgNVHREEJDAighAqLmRvY21pcnJvci5j\nbHVigg5kb2NtaXJyb3IuY2x1YjBMBgNVHSAERTBDMAgGBmeBDAECATA3BgsrBgEE\nAYLfEwEBATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9y\nZzCCAQQGCisGAQQB1nkCBAIEgfUEgfIA8AB1ABboacHRlerXw/iXGuPwdgH3jOG2\nnTGoUhi2g38xqBUIAAABdmI3LM4AAAQDAEYwRAIgaiNqXSEq+sxp8eqlJXp/KFdO\nso5mT50MoRsLF8Inu0ACIDP46+ekng7I0BlmyIPmbqFcZgnZFVWLLCdLYijhVyOL\nAHcA3Zk0/KXnJIDJVmh9gTSZCEmySfe1adjHvKs/XMHzbmQAAAF2YjcuxwAABAMA\nSDBGAiEAxpeB8/w4YkHZ62nH20h128VtuTSmYDCnF7EK2fQyeZYCIQDbJlF2wehZ\nsF1BeE7qnYYqCTP0dYIrQ9HWtBa/MbGOKTANBgkqhkiG9w0BAQsFAAOCAQEAL2di\nHKh6XcZtGk0BFxJa51sCZ3MLu9+Zy90kCRD4ooP5x932WxVM25+LBRd+xSzx+TRL\nUVrlKp9GdMYX1JXL4Vf2NwzuFO3snPDe/qizD/3+D6yo8eKJ/LD82t5kLWAD2rto\nYfVSTKwfNIBBJwHUnjviBPJmheHHCKmz8Ct6/6QxFAeta9TAMn0sFeVCQnmAq7HL\njrunq0tNHR/EKG0ITPLf+6P7MxbmpYNnq918766l0tKsW8oo8ZSGEwKU2LMaSiAa\nhasyl/2gMnYXjtKOjDcnR8oLpbrOg0qpVbynmJin1HP835oHPPAZ1gLsqYTTizNz\nAHxTaXliTVvS83dogw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEqzCCApOgAwIBAgIRAIvhKg5ZRO08VGQx8JdhT+UwDQYJKoZIhvcNAQELBQAw\nGjEYMBYGA1UEAwwPRmFrZSBMRSBSb290IFgxMB4XDTE2MDUyMzIyMDc1OVoXDTM2\nMDUyMzIyMDc1OVowIjEgMB4GA1UEAwwXRmFrZSBMRSBJbnRlcm1lZGlhdGUgWDEw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtWKySDn7rWZc5ggjz3ZB0\n8jO4xti3uzINfD5sQ7Lj7hzetUT+wQob+iXSZkhnvx+IvdbXF5/yt8aWPpUKnPym\noLxsYiI5gQBLxNDzIec0OIaflWqAr29m7J8+NNtApEN8nZFnf3bhehZW7AxmS1m0\nZnSsdHw0Fw+bgixPg2MQ9k9oefFeqa+7Kqdlz5bbrUYV2volxhDFtnI4Mh8BiWCN\nxDH1Hizq+GKCcHsinDZWurCqder/afJBnQs+SBSL6MVApHt+d35zjBD92fO2Je56\ndhMfzCgOKXeJ340WhW3TjD1zqLZXeaCyUNRnfOmWZV8nEhtHOFbUCU7r/KkjMZO9\nAgMBAAGjgeMwgeAwDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAw\nHQYDVR0OBBYEFMDMA0a5WCDMXHJw8+EuyyCm9Wg6MHoGCCsGAQUFBwEBBG4wbDA0\nBggrBgEFBQcwAYYoaHR0cDovL29jc3Auc3RnLXJvb3QteDEubGV0c2VuY3J5cHQu\nb3JnLzA0BggrBgEFBQcwAoYoaHR0cDovL2NlcnQuc3RnLXJvb3QteDEubGV0c2Vu\nY3J5cHQub3JnLzAfBgNVHSMEGDAWgBTBJnSkikSg5vogKNhcI5pFiBh54DANBgkq\nhkiG9w0BAQsFAAOCAgEABYSu4Il+fI0MYU42OTmEj+1HqQ5DvyAeyCA6sGuZdwjF\nUGeVOv3NnLyfofuUOjEbY5irFCDtnv+0ckukUZN9lz4Q2YjWGUpW4TTu3ieTsaC9\nAFvCSgNHJyWSVtWvB5XDxsqawl1KzHzzwr132bF2rtGtazSqVqK9E07sGHMCf+zp\nDQVDVVGtqZPHwX3KqUtefE621b8RI6VCl4oD30Olf8pjuzG4JKBFRFclzLRjo/h7\nIkkfjZ8wDa7faOjVXx6n+eUQ29cIMCzr8/rNWHS9pYGGQKJiY2xmVC9h12H99Xyf\nzWE9vb5zKP3MVG6neX1hSdo7PEAb9fqRhHkqVsqUvJlIRmvXvVKTwNCP3eCjRCCI\nPTAvjV+4ni786iXwwFYNz8l3PmPLCyQXWGohnJ8iBm+5nk7O2ynaPVW0U2W+pt2w\nSVuvdDM5zGv2f9ltNWUiYZHJ1mmO97jSY/6YfdOUH66iRtQtDkHBRdkNBsMbD+Em\n2TgBldtHNSJBfB3pm9FblgOcJ0FSWcUDWJ7vO0+NTXlgrRofRT6pVywzxVo6dND0\nWzYlTWeUVsO40xJqhgUQRER9YLOLxJ0O6C8i0xFxAMKOtSdodMB3RIwt7RFQ0uyt\nn5Z5MqkYhlMI3J1tPRTp1nEt9fyGspBOO05gi148Qasp+3N+svqKomoQglNoAxU=\n-----END CERTIFICATE-----`;\n"
  },
  {
    "path": "packages/core/pipeline/test/index.test.ts",
    "content": "import { expect } from \"chai\";\nimport \"mocha\";\nimport { EchoPlugin } from \"./echo-plugin.js\";\ndescribe(\"task_plugin\", function () {\n  it(\"#taskplugin\", function () {\n    console.log(\"before new plugin\");\n    const echoPlugin = new EchoPlugin();\n    console.log(\"before set property\", echoPlugin);\n    echoPlugin.cert = { test: 1 };\n    console.log(\"before execute\");\n    // @ts-ignore\n    echoPlugin.execute();\n    console.log(\"after execute\");\n    expect(echoPlugin.cert.test).eq(1);\n  });\n});\n"
  },
  {
    "path": "packages/core/pipeline/test/pipeline/.gitignore",
    "content": "license.*"
  },
  {
    "path": "packages/core/pipeline/test/pipeline/access-service-test.ts",
    "content": "import { IAccess, IAccessService } from \"../../src\";\n// @ts-ignore\nimport { aliyunSecret } from \"../user.secret\";\nexport class AccessServiceTest implements IAccessService {\n  async getById(id: any): Promise<IAccess> {\n    return {\n      ...aliyunSecret,\n    } as any;\n  }\n}\n"
  },
  {
    "path": "packages/core/pipeline/test/pipeline/init.test.ts",
    "content": "import { ContextFactory } from \"../../src/core/context\";\nimport { FileStorage } from \"../../src/core/storage\";\nimport { AccessServiceTest } from \"./access-service-test\";\nimport { logger } from \"../../src/utils/util.log\";\n\nconst contextFactory = new ContextFactory(new FileStorage());\n\nconst userContext = contextFactory.getContext(\"user\", \"test\");\nconst pipelineContext = contextFactory.getContext(\"pipeline\", \"test\");\nexport const pluginInitProps = {\n  accessService: new AccessServiceTest(),\n  pipelineContext: pipelineContext,\n  userContext: userContext,\n  logger: logger,\n};\n"
  },
  {
    "path": "packages/core/pipeline/test/pipeline/pipeline.define.ts",
    "content": "import { ConcurrencyStrategy, NextStrategy, Pipeline, RunStrategy } from \"../../src\";\n\nlet idIndex = 0;\nfunction generateId() {\n  idIndex++;\n  return idIndex + \"\";\n}\nexport const pipeline: Pipeline = {\n  version: 1,\n  id: generateId(),\n  title: \"测试管道\",\n  userId: 1,\n  triggers: [],\n  stages: [\n    {\n      id: generateId(),\n      title: \"证书申请阶段\",\n      concurrency: ConcurrencyStrategy.Serial,\n      next: NextStrategy.AllSuccess,\n      tasks: [\n        {\n          id: generateId(),\n          title: \"申请证书任务\",\n          steps: [\n            {\n              id: generateId(),\n              title: \"申请证书\",\n              type: \"CertApply\",\n              input: {\n                domains: [\"*.docmirror.cn\"],\n                email: \"xiaojunnuo@qq.com\",\n                dnsProviderType: \"aliyun\",\n                accessId: \"111\",\n              },\n            },\n          ],\n        },\n      ],\n    },\n    {\n      id: generateId(),\n      title: \"证书部署阶段\",\n      concurrency: ConcurrencyStrategy.Serial,\n      next: NextStrategy.AllSuccess,\n      tasks: [\n        {\n          id: generateId(),\n          title: \"测试输出参数任务\",\n          steps: [\n            {\n              id: generateId(),\n              title: \"输出参数（echo插件）\",\n              type: \"EchoPlugin\",\n              input: {\n                cert: \"cert\",\n              },\n              strategy: {\n                runStrategy: RunStrategy.SkipWhenSucceed,\n              },\n            },\n          ],\n        },\n      ],\n    },\n  ],\n};\n"
  },
  {
    "path": "packages/core/pipeline/test/pipeline/pipeline.test.ts",
    "content": "//import { expect } from \"chai\";\nimport \"mocha\";\nimport { Executor, RunHistory } from \"../../src\";\nimport { pipeline } from \"./pipeline.define\";\nimport { AccessServiceTest } from \"./access-service-test\";\nimport { FileStorage } from \"../../src/core/storage\";\ndescribe(\"pipeline\", function () {\n  it(\"#pipeline\", async function () {\n    this.timeout(120000);\n    async function onChanged(history: RunHistory) {\n      console.log(\"changed:\");\n    }\n\n    const executor = new Executor({ userId: \"test\", pipeline, onChanged, accessService: new AccessServiceTest(), storage: new FileStorage() });\n    await executor.run(1, \"user\");\n    // expect(define.name).eq(\"EchoPlugin\");\n  });\n});\n"
  },
  {
    "path": "packages/core/pipeline/tsconfig.json",
    "content": "{\n  \"compileOnSave\": true,\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"esModuleInterop\": true,\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"inlineSourceMap\":true,\n    \"noImplicitThis\": true,\n    \"noUnusedLocals\": true,\n    \"importHelpers\": true,\n    \"stripInternal\": true,\n    \"skipLibCheck\": true,\n    \"pretty\": true,\n    \"declaration\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"composite\": false,\n    \"useDefineForClassFields\": true,\n    \"strict\": true,\n//    \"sourceMap\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": false,\n    \"lib\": [\"ESNext\", \"DOM\"],\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"src/**/*.d.ts\",\n    \"src/**/*.json\"\n  ],\n  \"exclude\": [\n    \"*.js\",\n    \"*.ts\",\n    \"*.spec.ts\",\n    \"dist\",\n    \"node_modules\",\n    \"test\"\n  ],\n}\n"
  },
  {
    "path": "packages/libs/lib-huawei/.eslintrc",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"plugins\": [\n    \"@typescript-eslint\"\n  ],\n  \"extends\": [\n    \"plugin:@typescript-eslint/recommended\",\n    \"plugin:prettier/recommended\",\n    \"prettier\"\n  ],\n  \"env\": {\n    \"mocha\": true\n  },\n  \"rules\": {\n    \"@typescript-eslint/no-var-requires\": \"off\",\n    \"@typescript-eslint/ban-ts-comment\": \"off\",\n    \"@typescript-eslint/ban-ts-ignore\": \"off\",\n    \"@typescript-eslint/no-explicit-any\": \"off\",\n    \"@typescript-eslint/no-empty-function\": \"off\",\n    \"@typescript-eslint/no-unused-vars\": \"off\"\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-huawei/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n\ntest/user.secret.ts\n\n.rollup.cache\n"
  },
  {
    "path": "packages/libs/lib-huawei/.npmignore",
    "content": "node_modules\nsrc\n.rollup.cache\n"
  },
  {
    "path": "packages/libs/lib-huawei/.prettierrc",
    "content": "{\n  \"printWidth\": 220,\n  \"bracketSpacing\": true,\n  \"singleQuote\": false,\n  \"trailingComma\": \"es5\",\n  \"arrowParens\": \"avoid\"\n}"
  },
  {
    "path": "packages/libs/lib-huawei/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n### Performance Improvements\n\n* 支持京东云dns申请证书 ([04d79f9](https://github.com/certd/certd/commit/04d79f9117670be504960b018fd49ae3bf7c1c11))\n\n## [1.31.10](https://github.com/certd/certd/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n### Performance Improvements\n\n* 优化华为dns接口报错信息输出 ([bf30b7a](https://github.com/certd/certd/commit/bf30b7afaef623dd8126570344f1fcc2c06f1215))\n\n## [1.31.9](https://github.com/certd/certd/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n### Bug Fixes\n\n* 修复华为云dns接口请求出错的bug ([caa15b4](https://github.com/certd/certd/commit/caa15b47355363cbb8847f415ff12363cd53eeda))\n\n## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.24.2](https://github.com/certd/certd/compare/v1.24.1...v1.24.2) (2024-09-06)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.24.1](https://github.com/certd/certd/compare/v1.24.0...v1.24.1) (2024-09-02)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20)\n\n**Note:** Version bump only for package @certd/lib-huawei\n\n# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)\n\n### Features\n\n* 升级midway，支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))\n* 支持postgresql ([3b19bfb](https://github.com/certd/certd/commit/3b19bfb4291e89064b3b407a80dae092d54747d5))\n"
  },
  {
    "path": "packages/libs/lib-huawei/LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "packages/libs/lib-huawei/README.md",
    "content": "# Vue 3 + TypeScript + Vite\n\nThis template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.\n\n## Recommended IDE Setup\n\n- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar)\n\n## Type Support For `.vue` Imports in TS\n\nSince TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates. However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can enable Volar's Take Over mode by following these steps:\n\n1. Run `Extensions: Show Built-in Extensions` from VS Code's command palette, look for `TypeScript and JavaScript Language Features`, then right click and select `Disable (Workspace)`. By default, Take Over mode will enable itself if the default TypeScript extension is disabled.\n2. Reload the VS Code window by running `Developer: Reload Window` from the command palette.\n\nYou can learn more about Take Over mode [here](https://github.com/johnsoncodehk/volar/discussions/471).\n"
  },
  {
    "path": "packages/libs/lib-huawei/fix-esm-import-paths.js",
    "content": "import * as fs from \"fs\";\nimport * as path from \"path\";\n\n// https://gist.github.com/lovasoa/8691344\nasync function* walk(dir) {\n  for await (const d of await fs.promises.opendir(dir)) {\n    const entry = path.join(dir, d.name);\n    if (d.isDirectory()) {\n      yield* walk(entry);\n    } else if (d.isFile()) {\n      yield entry;\n    }\n  }\n}\n\nfunction resolveImportPath(sourceFile, importPath, options) {\n  const sourceFileAbs = path.resolve(process.cwd(), sourceFile);\n  const root = path.dirname(sourceFileAbs);\n  const { moduleFilter = defaultModuleFilter } = options;\n\n  if (moduleFilter(importPath)) {\n    const importPathAbs = path.resolve(root, importPath);\n    let possiblePath = [path.resolve(importPathAbs, \"./index.ts\"), path.resolve(importPathAbs, \"./index.js\"), importPathAbs + \".ts\", importPathAbs + \".js\"];\n\n    if (possiblePath.length) {\n      for (let i = 0; i < possiblePath.length; i++) {\n        let entry = possiblePath[i];\n        if (fs.existsSync(entry)) {\n          const resolved = path.relative(root, entry.replace(/\\.ts$/, \".js\"));\n\n          if (!resolved.startsWith(\".\")) {\n            return \"./\" + resolved;\n          }\n\n          return resolved;\n        }\n      }\n    }\n  }\n\n  return null;\n}\n\nfunction replace(filePath, outFilePath, options) {\n  const code = fs.readFileSync(filePath).toString();\n  const newCode = code.replace(/(import|export) (.+?) from ('[^\\n']+'|\"[^\\n\"]+\");/gs, function (found, action, imported, from) {\n    const importPath = from.slice(1, -1);\n    let resolvedPath = resolveImportPath(filePath, importPath, options);\n\n    if (resolvedPath) {\n      resolvedPath = resolvedPath.replaceAll(\"\\\\\", \"/\");\n      console.log(\"\\t\", importPath, resolvedPath);\n      return `${action} ${imported} from \"${resolvedPath}\";`;\n    }\n\n    return found;\n  });\n\n  if (code !== newCode) {\n    fs.writeFileSync(outFilePath, newCode);\n  }\n}\n\n// Then, use it with a simple async for loop\nasync function run(srcDir, options = defaultOptions) {\n  const { sourceFileFilter = defaultSourceFileFilter } = options;\n\n  for await (const entry of walk(srcDir)) {\n    if (sourceFileFilter(entry)) {\n      console.log(entry);\n      replace(entry, entry, options);\n    }\n  }\n}\n\nconst defaultSourceFileFilter = function (sourceFilePath) {\n  return /\\.(js|ts)$/.test(sourceFilePath) && !/node_modules/.test(sourceFilePath);\n};\n\nconst defaultModuleFilter = function (importedModule) {\n  return !path.isAbsolute(importedModule) && !importedModule.startsWith(\"@\") && !importedModule.endsWith(\".js\");\n};\n\nconst defaultOptions = {\n  sourceFileFilter: defaultSourceFileFilter,\n  moduleFilter: defaultModuleFilter,\n};\n\n// Switch this to test on one file or directly run on a directory.\nconst DEBUG = false;\n\nif (DEBUG) {\n  replace(\"./src/index.ts\", \"./out.ts\", defaultOptions);\n} else {\n  await run(\"./src/\", defaultOptions);\n}\n"
  },
  {
    "path": "packages/libs/lib-huawei/package.json",
    "content": "{\n  \"name\": \"@certd/lib-huawei\",\n  \"private\": false,\n  \"version\": \"1.36.10\",\n  \"main\": \"./dist/bundle.js\",\n  \"module\": \"./dist/bundle.js\",\n  \"types\": \"./dist/d/index.d.ts\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"before-build\": \"rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache\",\n    \"build\": \"npm run before-build && rollup -c \",\n    \"dev-build\": \"npm run build\",\n    \"preview\": \"vite preview\",\n    \"pub\": \"npm publish\"\n  },\n  \"dependencies\": {\n    \"axios\": \"^1.7.2\",\n    \"rimraf\": \"^5.0.5\",\n    \"rollup\": \"^3.7.4\"\n  },\n  \"devDependencies\": {\n    \"@typescript-eslint/eslint-plugin\": \"^8.26.1\",\n    \"@typescript-eslint/parser\": \"^8.26.1\",\n    \"prettier\": \"^2.8.8\",\n    \"tslib\": \"^2.8.1\"\n  },\n  \"gitHead\": \"085bdf5cfa9140903611aa12cdd2542d05aba321\"\n}\n"
  },
  {
    "path": "packages/libs/lib-huawei/rollup.config.js",
    "content": "const resolve = require(\"@rollup/plugin-node-resolve\");\nconst commonjs = require(\"@rollup/plugin-commonjs\");\n//const Typescript = require(\"rollup-plugin-typescript2\");\nconst Typescript = require(\"@rollup/plugin-typescript\");\nconst json = require(\"@rollup/plugin-json\");\nconst terser = require(\"@rollup/plugin-terser\");\nmodule.exports = {\n  input: \"src/index.ts\",\n  output: {\n    file: \"dist/bundle.js\",\n    format: \"cjs\",\n  },\n  plugins: [\n    // 解析第三方依赖\n    resolve(),\n    // 识别 commonjs 模式第三方依赖\n    commonjs({\n      // dynamicRequireRoot: \"../../../../\",\n      // dynamicRequireTargets: [\n      //   // include using a glob pattern (either a string or an array of strings)\n      //   \"../../../../**/shelljs/src/*\",\n      // ],\n    }),\n    Typescript({\n      target: \"esnext\",\n      rootDir: \"src\",\n      declaration: true,\n      declarationDir: \"dist/d\",\n      exclude: [\"./node_modules/**\", \"./src/**/*.vue\", \"./src/**/*.spec.ts\"],\n      allowSyntheticDefaultImports: true,\n    }),\n    json(),\n    // terser(),\n  ],\n  external: [\"vue\", \"lodash-es\", \"dayjs\", \"log4js\", \"@midwayjs/core\", \"@certd/pipeline\", \"axios\"],\n};\n"
  },
  {
    "path": "packages/libs/lib-huawei/src/index.ts",
    "content": "export { HuaweiYunClient } from \"./lib/client.js\";\nexport { ApiRequestOptions } from \"./lib/client.js\";\n"
  },
  {
    "path": "packages/libs/lib-huawei/src/lib/APIGW-javascript-sdk-2.0.5/licenses/license-crypto-js",
    "content": "﻿# License\n\n[The MIT License (MIT)](http://opensource.org/licenses/MIT)\n\nCopyright (c) 2009-2013 Jeff Mott\nCopyright (c) 2013-2016 Evan Vosberg\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\nall copies 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\nTHE SOFTWARE."
  },
  {
    "path": "packages/libs/lib-huawei/src/lib/APIGW-javascript-sdk-2.0.5/licenses/license-node",
    "content": "﻿// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "packages/libs/lib-huawei/src/lib/APIGW-javascript-sdk-2.0.5/node_demo.js",
    "content": "var signer = require(\"./signer\");\nvar https = require(\"https\");\nvar sig = new signer.Signer();\n//Set the AK/SK to sign and authenticate the request.\nsig.Key = \"QTWAOYTTINDUT2QVKYUC\";\nsig.Secret = \"MFyfvK41ba2giqM7**********KGpownRZlmVmHc\";\n\n//The following example shows how to set the request URL and parameters to query a VPC list.\n//Specify a request method, such as GET, PUT, POST, DELETE, HEAD, and PATCH.\n//Set request host.\n//Set request URI.\n//Set parameters for the request URL.\nvar r = new signer.HttpRequest(\"GET\", \"endpoint.example.com/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs?limie=1\");\n//Add header parameters, for example, x-domain-id for invoking a global service and x-project-id for invoking a project-level service.\nr.headers = { \"Content-Type\": \"application/json\" };\n//Add a body if you have specified the PUT or POST method. Special characters, such as the double quotation mark (\"), contained in the body must be escaped.\nr.body = \"\";\n\nvar opt = sig.Sign(r);\nconsole.log(opt.headers[\"X-Sdk-Date\"]);\nconsole.log(opt.headers[\"Authorization\"]);\n\nvar req = https.request(opt, function (res) {\n  console.log(res.statusCode);\n  console.log(\"headers:\", JSON.stringify(res.headers));\n  res.on(\"data\", function (chunk) {\n    console.log(chunk.toString());\n  });\n});\n\nreq.on(\"error\", function (err) {\n  console.log(err.message);\n});\nreq.write(r.body);\nreq.end();\n"
  },
  {
    "path": "packages/libs/lib-huawei/src/lib/APIGW-javascript-sdk-2.0.5/signer.js",
    "content": "// HWS API Gateway Signature\n(function (root, factory) {\n  \"use strict\";\n\n  /*global define*/\n  if (typeof define === \"function\" && define.amd) {\n    // AMD\n    define([\"CryptoJS\"], function (CryptoJS) {\n      var crypto_wrapper = {\n        hmacsha256: function (keyByte, message) {\n          return CryptoJS.HmacSHA256(message, keyByte).toString(CryptoJS.enc.Hex);\n        },\n        HexEncodeSHA256Hash: function (body) {\n          return CryptoJS.SHA256(body);\n        },\n      };\n      return factory(crypto_wrapper);\n    });\n  } else if (typeof wx === \"object\") {\n    // wechat\n    var CryptoJS = require(\"./js/hmac-sha256.js\");\n    var crypto_wrapper = {\n      hmacsha256: function (keyByte, message) {\n        return CryptoJS.HmacSHA256(message, keyByte).toString(CryptoJS.enc.Hex);\n      },\n      HexEncodeSHA256Hash: function (body) {\n        return CryptoJS.SHA256(body);\n      },\n    };\n    module.exports = factory(crypto_wrapper);\n  } else if (typeof module === \"object\" && module.exports) {\n    // Node\n    var crypto = require(\"crypto\");\n    var crypto_wrapper = {\n      hmacsha256: function (keyByte, message) {\n        return crypto.createHmac(\"SHA256\", keyByte).update(message).digest().toString(\"hex\");\n      },\n      HexEncodeSHA256Hash: function (body) {\n        return crypto.createHash(\"SHA256\").update(body).digest().toString(\"hex\");\n      },\n    };\n    module.exports = factory(crypto_wrapper);\n  } else {\n    // Browser\n    var CryptoJS = root.CryptoJS;\n    var crypto_wrapper = {\n      hmacsha256: function (keyByte, message) {\n        return CryptoJS.HmacSHA256(message, keyByte).toString(CryptoJS.enc.Hex);\n      },\n      HexEncodeSHA256Hash: function (body) {\n        return CryptoJS.SHA256(body);\n      },\n    };\n    root.signer = factory(crypto_wrapper);\n  }\n})(this, function (crypto_wrapper) {\n  \"use strict\";\n\n  var Algorithm = \"SDK-HMAC-SHA256\";\n  var HeaderXDate = \"X-Sdk-Date\";\n  var HeaderAuthorization = \"Authorization\";\n  var HeaderContentSha256 = \"x-sdk-content-sha256\";\n\n  const hexTable = new Array(256);\n  for (var i = 0; i < 256; ++i) hexTable[i] = \"%\" + ((i < 16 ? \"0\" : \"\") + i.toString(16)).toUpperCase();\n\n  const noEscape = [\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0, // 0 - 15\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0, // 16 - 31\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    1,\n    1,\n    0, // 32 - 47\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0, // 48 - 63\n    0,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1, // 64 - 79\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1, // 80 - 95\n    0,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1, // 96 - 111\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    0,\n    0,\n    0,\n    1,\n    0, // 112 - 127\n  ];\n\n  // function urlEncode is based on https://github.com/nodejs/node/blob/master/lib/querystring.js\n  // Copyright Joyent, Inc. and other Node contributors.\n  function urlEncode(str) {\n    if (typeof str !== \"string\") {\n      if (typeof str === \"object\") str = String(str);\n      else str += \"\";\n    }\n    var out = \"\";\n    var lastPos = 0;\n\n    for (var i = 0; i < str.length; ++i) {\n      var c = str.charCodeAt(i);\n\n      // ASCII\n      if (c < 0x80) {\n        if (noEscape[c] === 1) continue;\n        if (lastPos < i) out += str.slice(lastPos, i);\n        lastPos = i + 1;\n        out += hexTable[c];\n        continue;\n      }\n\n      if (lastPos < i) out += str.slice(lastPos, i);\n\n      // Multi-byte characters ...\n      if (c < 0x800) {\n        lastPos = i + 1;\n        out += hexTable[0xc0 | (c >> 6)] + hexTable[0x80 | (c & 0x3f)];\n        continue;\n      }\n      if (c < 0xd800 || c >= 0xe000) {\n        lastPos = i + 1;\n        out += hexTable[0xe0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3f)] + hexTable[0x80 | (c & 0x3f)];\n        continue;\n      }\n      // Surrogate pair\n      ++i;\n\n      if (i >= str.length) throw new errors.URIError(\"ERR_INVALID_URI\");\n\n      var c2 = str.charCodeAt(i) & 0x3ff;\n\n      lastPos = i + 1;\n      c = 0x10000 + (((c & 0x3ff) << 10) | c2);\n      out += hexTable[0xf0 | (c >> 18)] + hexTable[0x80 | ((c >> 12) & 0x3f)] + hexTable[0x80 | ((c >> 6) & 0x3f)] + hexTable[0x80 | (c & 0x3f)];\n    }\n    if (lastPos === 0) return str;\n    if (lastPos < str.length) return out + str.slice(lastPos);\n    return out;\n  }\n\n  function HttpRequest(method, url, headers, body) {\n    if (method === undefined) {\n      this.method = \"\";\n    } else {\n      this.method = method;\n    }\n    if (url === undefined) {\n      this.host = \"\";\n      this.uri = \"\";\n      this.query = {};\n    } else {\n      this.query = {};\n      var host, path;\n      var i = url.indexOf(\"://\");\n      if (i !== -1) {\n        url = url.substr(i + 3);\n      }\n      var i = url.indexOf(\"?\");\n      if (i !== -1) {\n        var query_str = url.substr(i + 1);\n        url = url.substr(0, i);\n        var spl = query_str.split(\"&\");\n        for (var i in spl) {\n          var kv = spl[i];\n          var index = kv.indexOf(\"=\");\n          var key, value;\n          if (index >= 0) {\n            key = kv.substr(0, index);\n            value = kv.substr(index + 1);\n          } else {\n            key = kv;\n            value = \"\";\n          }\n          if (key !== \"\") {\n            key = decodeURI(key);\n            value = decodeURI(value);\n            if (this.query[key] === undefined) {\n              this.query[key] = [value];\n            } else {\n              this.query[key].push(value);\n            }\n          }\n        }\n      }\n      var i = url.indexOf(\"/\");\n      if (i === -1) {\n        host = url;\n        path = \"/\";\n      } else {\n        host = url.substr(0, i);\n        path = url.substr(i);\n      }\n      this.host = host;\n      this.uri = decodeURI(path);\n    }\n    if (headers === undefined) {\n      this.headers = {};\n    } else {\n      this.headers = headers;\n    }\n    if (body === undefined) {\n      this.body = \"\";\n    } else {\n      this.body = body;\n    }\n  }\n\n  function findHeader(r, header) {\n    for (var k in r.headers) {\n      if (k.toLowerCase() === header.toLowerCase()) {\n        return r.headers[k];\n      }\n    }\n    return null;\n  }\n\n  // Build a CanonicalRequest from a regular request string\n  //\n  // CanonicalRequest =\n  //  HTTPRequestMethod + '\\n' +\n  //  CanonicalURI + '\\n' +\n  //  CanonicalQueryString + '\\n' +\n  //  CanonicalHeaders + '\\n' +\n  //  SignedHeaders + '\\n' +\n  //  HexEncode(Hash(RequestPayload))\n  function CanonicalRequest(r, signedHeaders) {\n    var hexencode = findHeader(r, HeaderContentSha256);\n    if (hexencode === null) {\n      var data = RequestPayload(r);\n      hexencode = crypto_wrapper.HexEncodeSHA256Hash(data);\n    }\n    return (\n      r.method +\n      \"\\n\" +\n      CanonicalURI(r) +\n      \"\\n\" +\n      CanonicalQueryString(r) +\n      \"\\n\" +\n      CanonicalHeaders(r, signedHeaders) +\n      \"\\n\" +\n      signedHeaders.join(\";\") +\n      \"\\n\" +\n      hexencode\n    );\n  }\n\n  function CanonicalURI(r) {\n    var pattens = r.uri.split(\"/\");\n    var uri = [];\n    for (var k in pattens) {\n      var v = pattens[k];\n      uri.push(urlEncode(v));\n    }\n    var urlpath = uri.join(\"/\");\n    if (urlpath[urlpath.length - 1] !== \"/\") {\n      urlpath = urlpath + \"/\";\n    }\n    //r.uri = urlpath\n    return urlpath;\n  }\n\n  function CanonicalQueryString(r) {\n    var keys = [];\n    for (var key in r.query) {\n      keys.push(key);\n    }\n    keys.sort();\n    var a = [];\n    for (var i in keys) {\n      var key = urlEncode(keys[i]);\n      var value = r.query[keys[i]];\n      if (Array.isArray(value)) {\n        value.sort();\n        for (var iv in value) {\n          a.push(key + \"=\" + urlEncode(value[iv]));\n        }\n      } else {\n        a.push(key + \"=\" + urlEncode(value));\n      }\n    }\n    return a.join(\"&\");\n  }\n\n  function CanonicalHeaders(r, signedHeaders) {\n    var headers = {};\n    for (var key in r.headers) {\n      headers[key.toLowerCase()] = r.headers[key];\n    }\n    var a = [];\n    for (var i in signedHeaders) {\n      var value = headers[signedHeaders[i]];\n      a.push(signedHeaders[i] + \":\" + value.trim());\n    }\n    return a.join(\"\\n\") + \"\\n\";\n  }\n\n  function SignedHeaders(r) {\n    var a = [];\n    for (var key in r.headers) {\n      a.push(key.toLowerCase());\n    }\n    a.sort();\n    return a;\n  }\n\n  function RequestPayload(r) {\n    return r.body;\n  }\n\n  // Create a \"String to Sign\".\n  function StringToSign(canonicalRequest, t) {\n    var bytes = crypto_wrapper.HexEncodeSHA256Hash(canonicalRequest);\n    return Algorithm + \"\\n\" + t + \"\\n\" + bytes;\n  }\n\n  // Create the HWS Signature.\n  function SignStringToSign(stringToSign, signingKey) {\n    return crypto_wrapper.hmacsha256(signingKey, stringToSign);\n  }\n\n  // Get the finalized value for the \"Authorization\" header.  The signature\n  // parameter is the output from SignStringToSign\n  function AuthHeaderValue(signature, Key, signedHeaders) {\n    return Algorithm + \" Access=\" + Key + \", SignedHeaders=\" + signedHeaders.join(\";\") + \", Signature=\" + signature;\n  }\n\n  function twoChar(s) {\n    if (s >= 10) {\n      return \"\" + s;\n    } else {\n      return \"0\" + s;\n    }\n  }\n\n  function getTime() {\n    var date = new Date();\n    return (\n      \"\" +\n      date.getUTCFullYear() +\n      twoChar(date.getUTCMonth() + 1) +\n      twoChar(date.getUTCDate()) +\n      \"T\" +\n      twoChar(date.getUTCHours()) +\n      twoChar(date.getUTCMinutes()) +\n      twoChar(date.getUTCSeconds()) +\n      \"Z\"\n    );\n  }\n\n  function Signer() {\n    this.Key = \"\";\n    this.Secret = \"\";\n  }\n\n  Signer.prototype.Sign = function (r) {\n    var headerTime = findHeader(r, HeaderXDate);\n    if (headerTime === null) {\n      headerTime = getTime();\n      r.headers[HeaderXDate] = headerTime;\n    }\n    if (r.method !== \"PUT\" && r.method !== \"PATCH\" && r.method !== \"POST\") {\n      r.body = \"\";\n    }\n    var queryString = CanonicalQueryString(r);\n    if (queryString !== \"\") {\n      queryString = \"?\" + queryString;\n    }\n    var options = {\n      hostname: r.host,\n      path: encodeURI(r.uri) + queryString,\n      method: r.method,\n      headers: r.headers,\n    };\n    if (findHeader(r, \"host\") === null) {\n      r.headers.host = r.host;\n    }\n    var signedHeaders = SignedHeaders(r);\n    var canonicalRequest = CanonicalRequest(r, signedHeaders);\n    var stringToSign = StringToSign(canonicalRequest, headerTime);\n    var signature = SignStringToSign(stringToSign, this.Secret);\n    options.headers[HeaderAuthorization] = AuthHeaderValue(signature, this.Key, signedHeaders);\n    return options;\n  };\n  return {\n    HttpRequest: HttpRequest,\n    Signer: Signer,\n    urlEncode: urlEncode,\n    findHeader: findHeader,\n    SignedHeaders: SignedHeaders,\n    CanonicalRequest: CanonicalRequest,\n    StringToSign: StringToSign,\n  };\n});\n"
  },
  {
    "path": "packages/libs/lib-huawei/src/lib/client.d.ts",
    "content": "import { HuaweiAccess } from \"../access/index.js\";\nexport type ApiRequestOptions = {\n  method: string;\n  url: string;\n  headers?: any;\n  data?: any;\n};\nexport declare class HuaweiYunClient {\n  access: HuaweiAccess;\n  constructor(access: HuaweiAccess);\n  request(options: ApiRequestOptions): Promise<any>;\n}\n"
  },
  {
    "path": "packages/libs/lib-huawei/src/lib/client.js",
    "content": "import { Signer, SigHttpRequest } from \"./signer.js\";\nimport axios from \"axios\";\nexport class HuaweiYunClient {\n  access;\n  logger;\n  constructor(access, logger) {\n    this.access = access;\n    this.logger = logger\n  }\n  async request(options) {\n    const sig = new Signer(this.access.accessKeyId, this.access.accessKeySecret);\n    //The following example shows how to set the request URL and parameters to query a VPC list.\n    //Specify a request method, such as GET, PUT, POST, DELETE, HEAD, and PATCH.\n    //Set request host.\n    //Set request URI.\n    //Set parameters for the request URL.\n    let body = undefined;\n    if (options.data) {\n      body = JSON.stringify(options.data);\n    }\n    const r = new SigHttpRequest(options.method, options.url, options.headers, body);\n    //Add header parameters, for example, x-domain-id for invoking a global service and x-project-id for invoking a project-level service.\n    r.headers = { \"Content-Type\": \"application/json\" };\n    //Add a body if you have specified the PUT or POST method. Special characters, such as the double quotation mark (\"), contained in the body must be escaped.\n    // r.body = option;\n    const opt = sig.Sign(r);\n    try {\n      const res = await axios.request({\n        url: options.url,\n        method: options.method,\n        headers: opt.headers,\n        data: body,\n      });\n      return res.data;\n    } catch (e) {\n      this.logger.error(\"华为云接口请求出错：\", e?.response?.data);\n      const error = new Error(JSON.stringify(e?.response?.data));\n      error.code = e?.response?.code;\n      throw error;\n    }\n  }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbnMvcGx1Z2luLWh1YXdlaS9saWIvY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFRekMsTUFBTSxPQUFPLGVBQWU7SUFDMUIsTUFBTSxDQUFlO0lBQ3JCLFlBQVksTUFBb0I7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUNELEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBMEI7UUFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FDNUIsQ0FBQztRQUVGLDRGQUE0RjtRQUM1Riw0RUFBNEU7UUFDNUUsbUJBQW1CO1FBQ25CLGtCQUFrQjtRQUNsQixxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3JCLElBQUksT0FBTyxDQUFDLElBQUksRUFBRTtZQUNoQixJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckM7UUFDRCxNQUFNLENBQUMsR0FBRyxJQUFJLGNBQWMsQ0FDMUIsT0FBTyxDQUFDLE1BQU0sRUFDZCxPQUFPLENBQUMsR0FBRyxFQUNYLE9BQU8sQ0FBQyxPQUFPLEVBQ2YsSUFBSSxDQUNMLENBQUM7UUFDRixzSUFBc0k7UUFDdEksQ0FBQyxDQUFDLE9BQU8sR0FBRyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1FBQ25ELDRKQUE0SjtRQUM1SixtQkFBbUI7UUFDbkIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJO1lBQ0YsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUM5QixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7Z0JBQ2hCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtnQkFDdEIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO2dCQUNwQixJQUFJLEVBQUUsSUFBSTthQUNYLENBQUMsQ0FBQztZQUNILE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztTQUNqQjtRQUFDLE9BQU8sQ0FBTSxFQUFFO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM5QyxNQUFNLEtBQUssR0FBUSxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4RCxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO1lBQy9CLE1BQU0sS0FBSyxDQUFDO1NBQ2I7SUFDSCxDQUFDO0NBQ0YifQ==\n"
  },
  {
    "path": "packages/libs/lib-huawei/src/lib/signer.d.ts",
    "content": "export declare class SigHttpRequest {\n  method: string;\n  host: string;\n  uri: string;\n  query: any;\n  headers: any;\n  body: string;\n  constructor(method: any, url: any, headers: any, body: any);\n}\nexport declare class Signer {\n  Key: string;\n  Secret: string;\n  constructor(Key: any, Secret: any);\n  Sign(r: any): {\n    hostname: any;\n    path: string;\n    method: any;\n    headers: any;\n  };\n}\n"
  },
  {
    "path": "packages/libs/lib-huawei/src/lib/signer.js",
    "content": "import crypto from 'crypto';\nfunction hmacsha256(keyByte, message) {\n    return crypto\n        .createHmac('SHA256', keyByte)\n        .update(message)\n        .digest()\n        .toString('hex');\n}\nfunction HexEncodeSHA256Hash(body) {\n    return crypto.createHash('SHA256').update(body).digest().toString('hex');\n}\nconst Algorithm = 'SDK-HMAC-SHA256';\nconst HeaderXDate = 'X-Sdk-Date';\nconst HeaderAuthorization = 'Authorization';\nconst HeaderContentSha256 = 'x-sdk-content-sha256';\nconst hexTable = new Array(256);\nfor (let i = 0; i < 256; ++i)\n    hexTable[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();\nconst noEscape = [\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    1,\n    1,\n    0,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    0,\n    0,\n    0,\n    1,\n    0, // 112 - 127\n];\n// function urlEncode is based on https://github.com/nodejs/node/blob/master/lib/querystring.js\n// Copyright Joyent, Inc. and other Node contributors.\nfunction urlEncode(str) {\n    if (typeof str !== 'string') {\n        if (typeof str === 'object')\n            str = String(str);\n        else\n            str += '';\n    }\n    let out = '';\n    let lastPos = 0;\n    for (let i = 0; i < str.length; ++i) {\n        let c = str.charCodeAt(i);\n        // ASCII\n        if (c < 0x80) {\n            if (noEscape[c] === 1)\n                continue;\n            if (lastPos < i)\n                out += str.slice(lastPos, i);\n            lastPos = i + 1;\n            out += hexTable[c];\n            continue;\n        }\n        if (lastPos < i)\n            out += str.slice(lastPos, i);\n        // Multi-byte characters ...\n        if (c < 0x800) {\n            lastPos = i + 1;\n            out += hexTable[0xc0 | (c >> 6)] + hexTable[0x80 | (c & 0x3f)];\n            continue;\n        }\n        if (c < 0xd800 || c >= 0xe000) {\n            lastPos = i + 1;\n            out +=\n                hexTable[0xe0 | (c >> 12)] +\n                    hexTable[0x80 | ((c >> 6) & 0x3f)] +\n                    hexTable[0x80 | (c & 0x3f)];\n            continue;\n        }\n        // Surrogate pair\n        ++i;\n        if (i >= str.length)\n            throw new Error('ERR_INVALID_URI');\n        const c2 = str.charCodeAt(i) & 0x3ff;\n        lastPos = i + 1;\n        c = 0x10000 + (((c & 0x3ff) << 10) | c2);\n        out +=\n            hexTable[0xf0 | (c >> 18)] +\n                hexTable[0x80 | ((c >> 12) & 0x3f)] +\n                hexTable[0x80 | ((c >> 6) & 0x3f)] +\n                hexTable[0x80 | (c & 0x3f)];\n    }\n    if (lastPos === 0)\n        return str;\n    if (lastPos < str.length)\n        return out + str.slice(lastPos);\n    return out;\n}\nfunction findHeader(r, header) {\n    for (const k in r.headers) {\n        if (k.toLowerCase() === header.toLowerCase()) {\n            return r.headers[k];\n        }\n    }\n    return null;\n}\n// Build a CanonicalRequest from a regular request string\n//\n// CanonicalRequest =\n//  HTTPRequestMethod + '\\n' +\n//  CanonicalURI + '\\n' +\n//  CanonicalQueryString + '\\n' +\n//  CanonicalHeaders + '\\n' +\n//  SignedHeaders + '\\n' +\n//  HexEncode(Hash(RequestPayload))\nfunction CanonicalRequest(r, signedHeaders) {\n    let hexencode = findHeader(r, HeaderContentSha256);\n    if (hexencode === null) {\n        const data = RequestPayload(r);\n        hexencode = HexEncodeSHA256Hash(data);\n    }\n    return (r.method +\n        '\\n' +\n        CanonicalURI(r) +\n        '\\n' +\n        CanonicalQueryString(r) +\n        '\\n' +\n        CanonicalHeaders(r, signedHeaders) +\n        '\\n' +\n        signedHeaders.join(';') +\n        '\\n' +\n        hexencode);\n}\nfunction CanonicalURI(r) {\n    const pattens = r.uri.split('/');\n    const uri = [];\n    for (const k in pattens) {\n        const v = pattens[k];\n        uri.push(urlEncode(v));\n    }\n    let urlpath = uri.join('/');\n    if (urlpath[urlpath.length - 1] !== '/') {\n        urlpath = urlpath + '/';\n    }\n    //r.uri = urlpath\n    return urlpath;\n}\nfunction CanonicalQueryString(r) {\n    const keys = [];\n    for (const key in r.query) {\n        keys.push(key);\n    }\n    keys.sort();\n    const a = [];\n    for (const i in keys) {\n        const key = urlEncode(keys[i]);\n        const value = r.query[keys[i]];\n        if (Array.isArray(value)) {\n            value.sort();\n            for (const iv in value) {\n                a.push(key + '=' + urlEncode(value[iv]));\n            }\n        }\n        else {\n            a.push(key + '=' + urlEncode(value));\n        }\n    }\n    return a.join('&');\n}\nfunction CanonicalHeaders(r, signedHeaders) {\n    const headers = {};\n    for (const key in r.headers) {\n        headers[key.toLowerCase()] = r.headers[key];\n    }\n    const a = [];\n    for (const i in signedHeaders) {\n        const value = headers[signedHeaders[i]];\n        a.push(signedHeaders[i] + ':' + value.trim());\n    }\n    return a.join('\\n') + '\\n';\n}\nfunction SignedHeaders(r) {\n    const a = [];\n    for (const key in r.headers) {\n        a.push(key.toLowerCase());\n    }\n    a.sort();\n    return a;\n}\nfunction RequestPayload(r) {\n    return r.body;\n}\n// Create a \"String to Sign\".\nfunction StringToSign(canonicalRequest, t) {\n    const bytes = HexEncodeSHA256Hash(canonicalRequest);\n    return Algorithm + '\\n' + t + '\\n' + bytes;\n}\n// Create the HWS Signature.\nfunction SignStringToSign(stringToSign, signingKey) {\n    return hmacsha256(signingKey, stringToSign);\n}\n// Get the finalized value for the \"Authorization\" header.  The signature\n// parameter is the output from SignStringToSign\nfunction AuthHeaderValue(signature, Key, signedHeaders) {\n    return (Algorithm +\n        ' Access=' +\n        Key +\n        ', SignedHeaders=' +\n        signedHeaders.join(';') +\n        ', Signature=' +\n        signature);\n}\nfunction twoChar(s) {\n    if (s >= 10) {\n        return '' + s;\n    }\n    else {\n        return '0' + s;\n    }\n}\nfunction getTime() {\n    const date = new Date();\n    return ('' +\n        date.getUTCFullYear() +\n        twoChar(date.getUTCMonth() + 1) +\n        twoChar(date.getUTCDate()) +\n        'T' +\n        twoChar(date.getUTCHours()) +\n        twoChar(date.getUTCMinutes()) +\n        twoChar(date.getUTCSeconds()) +\n        'Z');\n}\nexport class SigHttpRequest {\n    method = '';\n    host = '';\n    uri = '';\n    query = {};\n    headers = {};\n    body = '';\n    constructor(method, url, headers, body) {\n        if (method === undefined) {\n            this.method = '';\n        }\n        else {\n            this.method = method;\n        }\n        if (url === undefined) {\n            this.host = '';\n            this.uri = '';\n            this.query = {};\n        }\n        else {\n            this.query = {};\n            let host, path;\n            let i = url.indexOf('://');\n            if (i !== -1) {\n                url = url.substr(i + 3);\n            }\n            i = url.indexOf('?');\n            if (i !== -1) {\n                const query_str = url.substr(i + 1);\n                url = url.substr(0, i);\n                const spl = query_str.split('&');\n                for (const i in spl) {\n                    const kv = spl[i];\n                    const index = kv.indexOf('=');\n                    let key, value;\n                    if (index >= 0) {\n                        key = kv.substr(0, index);\n                        value = kv.substr(index + 1);\n                    }\n                    else {\n                        key = kv;\n                        value = '';\n                    }\n                    if (key !== '') {\n                        key = decodeURI(key);\n                        value = decodeURI(value);\n                        if (this.query[key] === undefined) {\n                            this.query[key] = [value];\n                        }\n                        else {\n                            this.query[key].push(value);\n                        }\n                    }\n                }\n            }\n            i = url.indexOf('/');\n            if (i === -1) {\n                host = url;\n                path = '/';\n            }\n            else {\n                host = url.substr(0, i);\n                path = url.substr(i);\n            }\n            this.host = host;\n            this.uri = decodeURI(path);\n        }\n        if (headers === undefined) {\n            this.headers = {};\n        }\n        else {\n            this.headers = headers;\n        }\n        if (body === undefined) {\n            this.body = '';\n        }\n        else {\n            this.body = body;\n        }\n    }\n}\nexport class Signer {\n    Key = '';\n    Secret = '';\n    constructor(Key, Secret) {\n        this.Key = Key;\n        this.Secret = Secret;\n    }\n    Sign(r) {\n        let headerTime = findHeader(r, HeaderXDate);\n        if (headerTime === null) {\n            headerTime = getTime();\n            r.headers[HeaderXDate] = headerTime;\n        }\n        if (r.method !== 'PUT' && r.method !== 'PATCH' && r.method !== 'POST') {\n            r.body = '';\n        }\n        let queryString = CanonicalQueryString(r);\n        if (queryString !== '') {\n            queryString = '?' + queryString;\n        }\n        const options = {\n            hostname: r.host,\n            path: encodeURI(r.uri) + queryString,\n            method: r.method,\n            headers: r.headers,\n        };\n        if (findHeader(r, 'host') === null) {\n            r.headers.host = r.host;\n        }\n        const signedHeaders = SignedHeaders(r);\n        const canonicalRequest = CanonicalRequest(r, signedHeaders);\n        const stringToSign = StringToSign(canonicalRequest, headerTime);\n        const signature = SignStringToSign(stringToSign, this.Secret);\n        options.headers[HeaderAuthorization] = AuthHeaderValue(signature, this.Key, signedHeaders);\n        return options;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbnMvcGx1Z2luLWh1YXdlaS9saWIvc2lnbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixTQUFTLFVBQVUsQ0FBQyxPQUFZLEVBQUUsT0FBWTtJQUM1QyxPQUFPLE1BQU07U0FDVixVQUFVLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQztTQUM3QixNQUFNLENBQUMsT0FBTyxDQUFDO1NBQ2YsTUFBTSxFQUFFO1NBQ1IsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JCLENBQUM7QUFDRCxTQUFTLG1CQUFtQixDQUFDLElBQVM7SUFDcEMsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUNELE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDO0FBQ3BDLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQztBQUNqQyxNQUFNLG1CQUFtQixHQUFHLGVBQWUsQ0FBQztBQUM1QyxNQUFNLG1CQUFtQixHQUFHLHNCQUFzQixDQUFDO0FBRW5ELE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQzFCLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBRTNFLE1BQU0sUUFBUSxHQUFHO0lBQ2YsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUMsRUFBRSxZQUFZO0NBQ2hCLENBQUM7QUFFRiwrRkFBK0Y7QUFDL0Ysc0RBQXNEO0FBQ3RELFNBQVMsU0FBUyxDQUFDLEdBQVE7SUFDekIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7UUFDM0IsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1lBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzs7WUFDMUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztLQUNoQjtJQUNELElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNiLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUVoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNuQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFCLFFBQVE7UUFDUixJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUU7WUFDWixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUFFLFNBQVM7WUFDaEMsSUFBSSxPQUFPLEdBQUcsQ0FBQztnQkFBRSxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixTQUFTO1NBQ1Y7UUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDO1lBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTlDLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUU7WUFDYixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQixHQUFHLElBQUksUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMvRCxTQUFTO1NBQ1Y7UUFDRCxJQUFJLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sRUFBRTtZQUM3QixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQixHQUFHO2dCQUNELFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzFCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztvQkFDbEMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzlCLFNBQVM7U0FDVjtRQUNELGlCQUFpQjtRQUNqQixFQUFFLENBQUMsQ0FBQztRQUVKLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXhELE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRXJDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLEdBQUc7WUFDRCxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQixRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ25DLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQy9CO0lBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzlCLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNO1FBQUUsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxDQUFNLEVBQUUsTUFBVztJQUNyQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU7UUFDekIsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQzVDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNyQjtLQUNGO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQseURBQXlEO0FBQ3pELEVBQUU7QUFDRixxQkFBcUI7QUFDckIsOEJBQThCO0FBQzlCLHlCQUF5QjtBQUN6QixpQ0FBaUM7QUFDakMsNkJBQTZCO0FBQzdCLDBCQUEwQjtBQUMxQixtQ0FBbUM7QUFDbkMsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFNLEVBQUUsYUFBa0I7SUFDbEQsSUFBSSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ25ELElBQUksU0FBUyxLQUFLLElBQUksRUFBRTtRQUN0QixNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsU0FBUyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3ZDO0lBQ0QsT0FBTyxDQUNMLENBQUMsQ0FBQyxNQUFNO1FBQ1IsSUFBSTtRQUNKLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDZixJQUFJO1FBQ0osb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUk7UUFDSixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDO1FBQ2xDLElBQUk7UUFDSixhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN2QixJQUFJO1FBQ0osU0FBUyxDQUNWLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsQ0FBTTtJQUMxQixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDZixLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRTtRQUN2QixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN4QjtJQUNELElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7UUFDdkMsT0FBTyxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUM7S0FDekI7SUFDRCxpQkFBaUI7SUFDakIsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsQ0FBTTtJQUNsQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7SUFDaEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDaEI7SUFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDWixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDYixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRTtRQUNwQixNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLEVBQUU7Z0JBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxQztTQUNGO2FBQU07WUFDTCxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDdEM7S0FDRjtJQUNELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFNLEVBQUUsYUFBa0I7SUFDbEQsTUFBTSxPQUFPLEdBQVEsRUFBRSxDQUFDO0lBQ3hCLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtRQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUM3QztJQUNELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNiLEtBQUssTUFBTSxDQUFDLElBQUksYUFBYSxFQUFFO1FBQzdCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7S0FDL0M7SUFDRCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzdCLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxDQUFNO0lBQzNCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNiLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtRQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0tBQzNCO0lBQ0QsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ1QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsQ0FBTTtJQUM1QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVELDZCQUE2QjtBQUM3QixTQUFTLFlBQVksQ0FBQyxnQkFBcUIsRUFBRSxDQUFNO0lBQ2pELE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDcEQsT0FBTyxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQzdDLENBQUM7QUFFRCw0QkFBNEI7QUFDNUIsU0FBUyxnQkFBZ0IsQ0FBQyxZQUFpQixFQUFFLFVBQWU7SUFDMUQsT0FBTyxVQUFVLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsZ0RBQWdEO0FBQ2hELFNBQVMsZUFBZSxDQUFDLFNBQWMsRUFBRSxHQUFRLEVBQUUsYUFBa0I7SUFDbkUsT0FBTyxDQUNMLFNBQVM7UUFDVCxVQUFVO1FBQ1YsR0FBRztRQUNILGtCQUFrQjtRQUNsQixhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN2QixjQUFjO1FBQ2QsU0FBUyxDQUNWLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsQ0FBTTtJQUNyQixJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDWCxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDZjtTQUFNO1FBQ0wsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0tBQ2hCO0FBQ0gsQ0FBQztBQUVELFNBQVMsT0FBTztJQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDeEIsT0FBTyxDQUNMLEVBQUU7UUFDRixJQUFJLENBQUMsY0FBYyxFQUFFO1FBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDMUIsR0FBRztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLEdBQUcsQ0FDSixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sT0FBTyxjQUFjO0lBQ3pCLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDWixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ1YsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNULEtBQUssR0FBUSxFQUFFLENBQUM7SUFDaEIsT0FBTyxHQUFRLEVBQUUsQ0FBQztJQUNsQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRVYsWUFBWSxNQUFXLEVBQUUsR0FBUSxFQUFFLE9BQVksRUFBRSxJQUFTO1FBQ3hELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztTQUNsQjthQUFNO1lBQ0wsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDdEI7UUFDRCxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1NBQ2pCO2FBQU07WUFDTCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLElBQUksRUFBRSxJQUFJLENBQUM7WUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNaLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUN6QjtZQUNELENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNaLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFO29CQUNuQixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xCLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzlCLElBQUksR0FBRyxFQUFFLEtBQUssQ0FBQztvQkFDZixJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7d0JBQ2QsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUMxQixLQUFLLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQzlCO3lCQUFNO3dCQUNMLEdBQUcsR0FBRyxFQUFFLENBQUM7d0JBQ1QsS0FBSyxHQUFHLEVBQUUsQ0FBQztxQkFDWjtvQkFDRCxJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUU7d0JBQ2QsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDckIsS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRTs0QkFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUMzQjs2QkFBTTs0QkFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDN0I7cUJBQ0Y7aUJBQ0Y7YUFDRjtZQUNELENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNaLElBQUksR0FBRyxHQUFHLENBQUM7Z0JBQ1gsSUFBSSxHQUFHLEdBQUcsQ0FBQzthQUNaO2lCQUFNO2dCQUNMLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEI7WUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNqQixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1QjtRQUNELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztTQUNuQjthQUFNO1lBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7U0FDeEI7UUFDRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDdEIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7U0FDaEI7YUFBTTtZQUNMLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztDQUNGO0FBQ0QsTUFBTSxPQUFPLE1BQU07SUFDakIsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNULE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDWixZQUFZLEdBQVEsRUFBRSxNQUFXO1FBQy9CLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksQ0FBQyxDQUFNO1FBQ1QsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM1QyxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7WUFDdkIsVUFBVSxHQUFHLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRTtZQUNyRSxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztTQUNiO1FBQ0QsSUFBSSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxXQUFXLEtBQUssRUFBRSxFQUFFO1lBQ3RCLFdBQVcsR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDO1NBQ2pDO1FBQ0QsTUFBTSxPQUFPLEdBQUc7WUFDZCxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUk7WUFDaEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVztZQUNwQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDaEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO1NBQ25CLENBQUM7UUFDRixJQUFJLFVBQVUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2xDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDekI7UUFDRCxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDNUQsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLGVBQWUsQ0FDcEQsU0FBUyxFQUNULElBQUksQ0FBQyxHQUFHLEVBQ1IsYUFBYSxDQUNkLENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YifQ=="
  },
  {
    "path": "packages/libs/lib-huawei/tsconfig.json",
    "content": "{\n  \"compileOnSave\": true,\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"esModuleInterop\": true,\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"noImplicitThis\": true,\n    \"noUnusedLocals\": true,\n    \"stripInternal\": true,\n    \"importHelpers\": true,\n    \"skipLibCheck\": true,\n    \"pretty\": true,\n    \"declaration\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"typeRoots\": [ \"./typings\", \"./node_modules/@types\"],\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"composite\": false,\n    \"useDefineForClassFields\": true,\n    \"strict\": false,\n    \"sourceMap\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": false,\n    \"lib\": [\"ESNext\", \"DOM\"],\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"src/**/*.d.ts\",\n    \"src/**/*.js\",\n    \"src/**/*.json\"\n  ],\n  \"exclude\": [\n    \"*.ts\",\n    \"dist\",\n    \"node_modules\",\n    \"test\"\n  ],\n}\n"
  },
  {
    "path": "packages/libs/lib-iframe/.eslintrc",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"plugins\": [\n    \"@typescript-eslint\"\n  ],\n  \"extends\": [\n    \"plugin:@typescript-eslint/recommended\",\n    \"plugin:prettier/recommended\",\n    \"prettier\"\n  ],\n  \"env\": {\n    \"mocha\": true\n  },\n  \"rules\": {\n    \"@typescript-eslint/no-var-requires\": \"off\",\n    \"@typescript-eslint/ban-ts-comment\": \"off\",\n    \"@typescript-eslint/ban-ts-ignore\": \"off\",\n    \"@typescript-eslint/no-explicit-any\": \"off\",\n    \"@typescript-eslint/no-empty-function\": \"off\",\n    \"@typescript-eslint/no-unused-vars\": \"off\"\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-iframe/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n\nsrc/test/user.secret.ts\n\nsrc/**/*.js\n"
  },
  {
    "path": "packages/libs/lib-iframe/.npmignore",
    "content": "node_modules\nsrc\n"
  },
  {
    "path": "packages/libs/lib-iframe/.prettierrc",
    "content": "{\n  \"printWidth\": 220,\n  \"bracketSpacing\": true,\n  \"singleQuote\": false,\n  \"trailingComma\": \"es5\",\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "packages/libs/lib-iframe/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n### Performance Improvements\n\n* 更新license时同时绑定url ([78367af](https://github.com/certd/certd/commit/78367af8307f801e778c76d49f0918c21ffe032f))\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.31.10](https://github.com/certd/certd/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.31.9](https://github.com/certd/certd/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)\n\n### Performance Improvements\n\n* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))\n\n## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)\n\n**Note:** Version bump only for package @certd/lib-iframe\n\n# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)\n\n### Features\n\n* 支持vip转移 ([361e8fe](https://github.com/certd/certd/commit/361e8fe7ae5877e23fd5de31bc919bedd09c57f5))\n\n## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.24.2](https://github.com/certd/certd/compare/v1.24.1...v1.24.2) (2024-09-06)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.24.1](https://github.com/certd/certd/compare/v1.24.0...v1.24.1) (2024-09-02)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.24.0](https://github.com/certd/certd/compare/v1.23.1...v1.24.0) (2024-08-25)\n\n### Performance Improvements\n\n* 更新k8s底层api库 ([746bb9d](https://github.com/certd/certd/commit/746bb9d385e2f397daef4976eca1d4782a2f5ebd))\n\n## [1.23.1](https://github.com/certd/certd/compare/v1.23.0...v1.23.1) (2024-08-06)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.8](https://github.com/certd/certd/compare/v1.22.7...v1.22.8) (2024-08-05)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.7](https://github.com/certd/certd/compare/v1.22.6...v1.22.7) (2024-08-04)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.6](https://github.com/certd/certd/compare/v1.22.5...v1.22.6) (2024-08-03)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.5](https://github.com/certd/certd/compare/v1.22.4...v1.22.5) (2024-07-26)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.3](https://github.com/certd/certd/compare/v1.22.2...v1.22.3) (2024-07-25)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.2](https://github.com/certd/certd/compare/v1.22.1...v1.22.2) (2024-07-23)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)\n\n### Features\n\n* 升级midway，支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))\n* 支持postgresql ([3b19bfb](https://github.com/certd/certd/commit/3b19bfb4291e89064b3b407a80dae092d54747d5))\n"
  },
  {
    "path": "packages/libs/lib-iframe/LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "packages/libs/lib-iframe/README.md",
    "content": "# Vue 3 + TypeScript + Vite\n\nThis template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.\n\n## Recommended IDE Setup\n\n- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar)\n\n## Type Support For `.vue` Imports in TS\n\nSince TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates. However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can enable Volar's Take Over mode by following these steps:\n\n1. Run `Extensions: Show Built-in Extensions` from VS Code's command palette, look for `TypeScript and JavaScript Language Features`, then right click and select `Disable (Workspace)`. By default, Take Over mode will enable itself if the default TypeScript extension is disabled.\n2. Reload the VS Code window by running `Developer: Reload Window` from the command palette.\n\nYou can learn more about Take Over mode [here](https://github.com/johnsoncodehk/volar/discussions/471).\n"
  },
  {
    "path": "packages/libs/lib-iframe/fix-esm-import-paths.js",
    "content": "import * as fs from \"fs\";\nimport * as path from \"path\";\n\n// https://gist.github.com/lovasoa/8691344\nasync function* walk(dir) {\n  for await (const d of await fs.promises.opendir(dir)) {\n    const entry = path.join(dir, d.name);\n    if (d.isDirectory()) {\n      yield* walk(entry);\n    } else if (d.isFile()) {\n      yield entry;\n    }\n  }\n}\n\nfunction resolveImportPath(sourceFile, importPath, options) {\n  const sourceFileAbs = path.resolve(process.cwd(), sourceFile);\n  const root = path.dirname(sourceFileAbs);\n  const { moduleFilter = defaultModuleFilter } = options;\n\n  if (moduleFilter(importPath)) {\n    const importPathAbs = path.resolve(root, importPath);\n    let possiblePath = [path.resolve(importPathAbs, \"./index.ts\"), path.resolve(importPathAbs, \"./index.js\"), importPathAbs + \".ts\", importPathAbs + \".js\"];\n\n    if (possiblePath.length) {\n      for (let i = 0; i < possiblePath.length; i++) {\n        let entry = possiblePath[i];\n        if (fs.existsSync(entry)) {\n          const resolved = path.relative(root, entry.replace(/\\.ts$/, \".js\"));\n\n          if (!resolved.startsWith(\".\")) {\n            return \"./\" + resolved;\n          }\n\n          return resolved;\n        }\n      }\n    }\n  }\n\n  return null;\n}\n\nfunction replace(filePath, outFilePath, options) {\n  const code = fs.readFileSync(filePath).toString();\n  const newCode = code.replace(/(import|export) (.+?) from ('[^\\n']+'|\"[^\\n\"]+\");/gs, function (found, action, imported, from) {\n    const importPath = from.slice(1, -1);\n    let resolvedPath = resolveImportPath(filePath, importPath, options);\n\n    if (resolvedPath) {\n      resolvedPath = resolvedPath.replaceAll(\"\\\\\", \"/\");\n      console.log(\"\\t\", importPath, resolvedPath);\n      return `${action} ${imported} from \"${resolvedPath}\";`;\n    }\n\n    return found;\n  });\n\n  if (code !== newCode) {\n    fs.writeFileSync(outFilePath, newCode);\n  }\n}\n\n// Then, use it with a simple async for loop\nasync function run(srcDir, options = defaultOptions) {\n  const { sourceFileFilter = defaultSourceFileFilter } = options;\n\n  for await (const entry of walk(srcDir)) {\n    if (sourceFileFilter(entry)) {\n      console.log(entry);\n      replace(entry, entry, options);\n    }\n  }\n}\n\nconst defaultSourceFileFilter = function (sourceFilePath) {\n  return /\\.(js|ts)$/.test(sourceFilePath) && !/node_modules/.test(sourceFilePath);\n};\n\nconst defaultModuleFilter = function (importedModule) {\n  return !path.isAbsolute(importedModule) && !importedModule.startsWith(\"@\") && !importedModule.endsWith(\".js\");\n};\n\nconst defaultOptions = {\n  sourceFileFilter: defaultSourceFileFilter,\n  moduleFilter: defaultModuleFilter,\n};\n\n// Switch this to test on one file or directly run on a directory.\nconst DEBUG = false;\n\nif (DEBUG) {\n  replace(\"./src/index.ts\", \"./out.ts\", defaultOptions);\n} else {\n  await run(\"./src/\", defaultOptions);\n}\n"
  },
  {
    "path": "packages/libs/lib-iframe/package.json",
    "content": "{\n  \"name\": \"@certd/lib-iframe\",\n  \"private\": false,\n  \"version\": \"1.36.10\",\n  \"type\": \"module\",\n  \"main\": \"./dist/index.js\",\n  \"module\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.ts\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"before-build\": \"rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache\",\n    \"build\": \"npm run before-build && tsc --skipLibCheck\",\n    \"dev-build\": \"npm run build\",\n    \"build3\": \"rollup -c\",\n    \"build2\": \"vue-tsc --noEmit && vite build\",\n    \"preview\": \"vite preview\",\n    \"pub\": \"npm publish\"\n  },\n  \"dependencies\": {\n    \"nanoid\": \"^4.0.0\"\n  },\n  \"devDependencies\": {\n    \"@types/chai\": \"^4.3.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.26.1\",\n    \"@typescript-eslint/parser\": \"^8.26.1\",\n    \"eslint\": \"^8.24.0\",\n    \"eslint-config-prettier\": \"^8.5.0\",\n    \"eslint-plugin-prettier\": \"^4.2.1\",\n    \"prettier\": \"^2.8.8\",\n    \"rimraf\": \"^5.0.5\",\n    \"tslib\": \"^2.8.1\",\n    \"typescript\": \"^5.4.2\"\n  },\n  \"gitHead\": \"085bdf5cfa9140903611aa12cdd2542d05aba321\"\n}\n"
  },
  {
    "path": "packages/libs/lib-iframe/src/index.ts",
    "content": "export * from './lib/iframe.client.js';\n"
  },
  {
    "path": "packages/libs/lib-iframe/src/lib/iframe.client.ts",
    "content": "import { nanoid } from 'nanoid';\n\nexport type IframeMessageData<T> = {\n  action: string;\n  id: string;\n  data?: T;\n  replyId?: string;\n  errorCode?: number; //0为成功\n  message?: string;\n};\n\nexport type IframeMessageReq<T = any, R = any> = {\n  req: IframeMessageData<T>;\n  onReply: (data: IframeMessageData<R>) => void;\n};\n\nexport class IframeException extends Error {\n  code?: number = 0;\n  constructor(data: IframeMessageData<any>) {\n    super(data.message);\n    this.code = data.errorCode;\n  }\n}\n\nexport class IframeClient {\n  requestQueue: Record<string, IframeMessageReq> = {};\n  //当前客户端是否是父级页面\n  iframe?: HTMLIFrameElement;\n  onError?: any;\n\n  handlers: Record<string, (data: IframeMessageData<any>) => Promise<void>> = {};\n  constructor(iframe?: HTMLIFrameElement, onError?: (e: any) => void) {\n    this.iframe = iframe;\n    this.onError = onError;\n    window.addEventListener('message', async (event: MessageEvent<IframeMessageData<any>>) => {\n      const data = event.data;\n      if (data.action) {\n        console.log(`收到消息[isSub:${this.isInFrame()}]`, data);\n        try {\n          const handler = this.handlers[data.action];\n          if (handler) {\n            const res = await handler(data);\n            if (data.id && data.action !== 'reply') {\n              await this.send('reply', res, data.id);\n            }\n          } else {\n            throw new Error(`action:${data.action} 未注册处理器，可能版本过低`);\n          }\n        } catch (e: any) {\n          console.error(e);\n          await this.send('reply', {}, data.id, 500, e.message);\n        }\n      }\n    });\n\n    this.register('reply', async data => {\n      const req = this.requestQueue[data.replyId!];\n      if (req) {\n        req.onReply(data);\n        delete this.requestQueue[data.replyId!];\n      }\n    });\n  }\n  isInFrame() {\n    return window.self !== window.top;\n  }\n\n  register<T = any>(action: string, handler: (data: IframeMessageData<T>) => Promise<any>) {\n    this.handlers[action] = handler;\n  }\n\n  async send<R = any, T = any>(action: string, data?: T, replyId?: string, errorCode?: number, message?: string): Promise<IframeMessageData<R>> {\n    try {\n      return await this.doSend<R, T>(action, data, replyId, errorCode, message);\n    } catch (e) {\n      if (this.onError) {\n        this.onError(e);\n      }\n      throw e;\n    }\n  }\n\n  async doSend<R = any, T = any>(action: string, data?: T, replyId?: string, errorCode?: number, message?: string): Promise<IframeMessageData<R>> {\n    const reqMessageData: IframeMessageData<T> = {\n      id: nanoid(),\n      action,\n      data,\n      replyId,\n      errorCode,\n      message,\n    };\n\n    return new Promise((resolve, reject) => {\n      const onReply = (reply: IframeMessageData<R>) => {\n        if (reply.errorCode && reply.errorCode > 0) {\n          reject(new IframeException(reply));\n          return;\n        }\n        resolve(reply);\n      };\n      this.requestQueue[reqMessageData.id] = {\n        req: reqMessageData,\n        onReply,\n      };\n      try {\n        console.log(`send message[isSub:${this.isInFrame()}]:`, reqMessageData);\n        if (!this.iframe) {\n          if (!window.parent) {\n            reject('当前页面不在 iframe 中');\n          }\n          window.parent.postMessage(reqMessageData, '*');\n        } else {\n          //子页面\n          this.iframe.contentWindow?.postMessage(reqMessageData, '*');\n        }\n      } catch (e) {\n        console.error(e);\n        reject(e);\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-iframe/tsconfig.json",
    "content": "{\n  \"compileOnSave\": true,\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"esModuleInterop\": true,\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"inlineSourceMap\":true,\n    \"noImplicitThis\": true,\n    \"noUnusedLocals\": true,\n    \"stripInternal\": true,\n    \"skipLibCheck\": true,\n    \"importHelpers\": true,\n    \"pretty\": true,\n    \"declaration\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"typeRoots\": [ \"./typings\", \"./node_modules/@types\"],\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"composite\": false,\n    \"useDefineForClassFields\": true,\n    \"strict\": false,\n//    \"sourceMap\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"src/**/*.d.ts\",\n    \"src/**/*.json\"\n  ],\n  \"exclude\": [\n    \"*.js\",\n    \"*.ts\",\n    \"dist\",\n    \"node_modules\",\n    \"src/test\"\n  ],\n}\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/.eslintrc",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"plugins\": [\n    \"@typescript-eslint\"\n  ],\n  \"extends\": [\n    \"plugin:@typescript-eslint/recommended\",\n    \"plugin:prettier/recommended\",\n    \"prettier\"\n  ],\n  \"env\": {\n    \"mocha\": true\n  },\n  \"rules\": {\n    \"@typescript-eslint/no-var-requires\": \"off\",\n    \"@typescript-eslint/ban-ts-comment\": \"off\",\n    \"@typescript-eslint/ban-ts-ignore\": \"off\",\n    \"@typescript-eslint/no-explicit-any\": \"off\",\n    \"@typescript-eslint/no-empty-function\": \"off\",\n    \"@typescript-eslint/no-unused-vars\": \"off\"\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n\ntest/user.secret.ts\n\n.rollup.cache\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/.npmignore",
    "content": "node_modules\nsrc\n.rollup.cache\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/.travis.yml",
    "content": "language: node_js"
  },
  {
    "path": "packages/libs/lib-jdcloud/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n**Note:** Version bump only for package @certd/jdcloud\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n### Performance Improvements\n\n* 支持部署到京东云cdn ([6f17c70](https://github.com/certd/certd/commit/6f17c700b84965baa01b40fe2abaa0a91bcbaffd))\n* 支持京东云dns申请证书 ([04d79f9](https://github.com/certd/certd/commit/04d79f9117670be504960b018fd49ae3bf7c1c11))\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/README.md",
    "content": "---\n[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)\n\n# 简介 #\n  欢迎使用京东云开发者Node.js工具套件（Node.js SDK）。使用京东云Node.js SDK，您无需复杂编程就可以访问京东云提供的各种服务。 \n\n  为了方便您理解SDK中的一些概念和参数的含义，使用SDK前建议您先查看[京东云OpenAPI使用入门](http://www.jdcloud.com/help/detail/355/isCatalog/0)。要了解每个API的具体参数和含义，请参考程序注释或参考OpenAPI&SDK下具体产品线的API文档。\n\n\n\n# 环境准备 #\n 1.京东云Node.js SDK适用于Node.js 8.6.0及以上，npm 5.6.0及以上。\n\n 2.在开始调用京东云open API之前，需提前在京东云用户中心账户管理下的[AccessKey管理页面](https://uc.jdcloud.com/accesskey/index)申请accesskey和secretKey密钥对（简称AK/SK）。AK/SK信息请妥善保管，如果遗失可能会造成非法用户使用此信息操作您在云上的资源，给你造成数据和财产损失。\n\n\n\n# SDK使用方法 #\n建议使用npm安装京东云Node.js SDK，如下所示： \n\nnpm install jdcloud-sdk-js\n\n \n\n您还可以下载sdk源代码自行使用，[源代码地址](https://github.com/jdcloud-api/jdcloud-sdk-nodejs)。\n\n \n\nSDK使用中的任何问题，欢迎您在[SDK使用问题反馈页面](https://github.com/jdcloud-api/jdcloud-sdk-nodejs/issues)交流。\n\n\n\n注意：京东云并没有提供其他下载方式，请务必使用上述官方下载方式！\n\n \n\n# 调用SDK #\n\n## 两种引用方式 ##\n\tvar JDCloud = require('jdcloud-sdk-js');\n\n这种引用方式会加载所有的可用的services\n\n\n\n\tvar NC = require('jdcloud-sdk-js/services/nativecontainer');\n\n这种引用方式只会加载用到的service，此时仍然可以使用var JDCloud = require('jdcloud-sdk-js/global')来引用JDCloud对象\n\n## 配置方法  ##\n\n对JDCloud的配置为通用配置，所有services共享配置:\n\n\tJDCloud.config.update({//*配置项/*/});\n\n对某个service的配置会覆盖通用配置：\n\n\tvar NC = require('jdcloud-sdk-js/services/nativecontainer'); \n\tvar nc = new NATIVECONTAINER({//*配置项/*/});\n\n\n## 配置项 ##\n\n\tlet config = { \n\t\tcredentials: { \n\t\t\taccessKeyId: global.accessKeyId, secretAccessKey: global.secretAccessKey \n\t\t},\n\t\tregionId: 'cn-north-1' //地域信息，某个api调用可以单独传参regionId，如果不传则会使用此配置中的regionId \n\t}\n\n\n## 调用示例 ##\n\n以下是查询单个云主机实例详情的调用示例\n\n\n###  引用和配置  ###\n\n    var VM = require('jdcloud-sdk-js/services/vm')\n    var vm = new VM({\n            credentials: {\n        accessKeyId: global.accessKeyId,\n                secretAccessKey: global.secretAccessKey\n    },\n    regionId: 'cn-north-1'\n    })\n\n\n\n### Promise方式调用 ####\n\n\tvm.createInstances({\n        instanceSpec: {\n            instanceType: 'g.s1.micro',\n                    az: 'cn-north-1a',\n                    imageId: '98d44a0f-88c1-451a-8971-f1f769073b6c',\n                    name: 'node-sdk-test',\n                    elasticIp: {\n                bandwidthMbps: 2, provider: 'BGP'\n            },\n            primaryNetworkInterface: {\n                networkInterface: {\n                    subnetId: 'subnet-3dm13k30gh',\n                            az: 'cn-north-1a'\n                }\n            },\n            systemDisk: {\n                diskCategory: 'local'\n            },\n            description: 'sdk'\n        },\n        maxCount: 1\n    },'cn-north-1').then(function(data){ // 返回数据处理 data \n    },\n    function(e){ // 调用API失败，错误处理 \n    })\n\n\n\n### callback方式调用 ###\n\n\tvm.createInstances({\n        instanceSpec: {\n            instanceType: 'g.s1.micro',\n                    az: 'cn-north-1a',\n                    imageId: '98d44a0f-88c1-451a-8971-f1f769073b6c',\n                    name: 'node-sdk-test',\n                    elasticIp: {\n                bandwidthMbps: 2,\n                        provider: 'BGP'\n            },\n            primaryNetworkInterface: {\n                networkInterface: {\n                    subnetId: 'subnet-3dm13k30gh',\n                            az: 'cn-north-1a'\n                }\n            },\n            systemDisk: {\n                diskCategory: 'local'\n            },\n            description: 'sdk'\n        },\n        maxCount: 1\n    },'cn-north-1',\n    function(err, data){\n        if(err){ // 调用API失败，错误处理 \n        } \n\t\telse { // 返回数据处理 data \n        } \n    })\n\n如果需要设置访问点，配置超时,额外请求头等，请参考如下更复杂的例子：\n\n```\n    var nc = new NATIVECONTAINER({\n        credentials: {\n            accessKeyId: global.accessKeyId,\n            secretAccessKey: global.secretAccessKey\n        },\n        endpoint: {\n            host: 'nativecontainer.internal.cn-north-1.jdcloud-api.com', //指定非默认Endpoint\n            protocol: 'http' //设置使用HTTP而不是HTTPS，vpc专用域名不支持HTTPS\n        },\n        'x-extra-header': { //指定额外header\n            \"x-jdcloud-security-token\" : \"xxx\", //要调用开启了MFA操作保护的接口需要传递\n            \"x-jdcloud-content-sha256\" : \"xxx\", //body过大，希望用此value替代对body进行哈希的过程\n            \"MyOwn\" : \"xxx\"\n        },\n        version: {\n            nativecontainer: 'v1'\n        }\n    })\n```\n    \n\n更多调用示例参考  [SDK使用Demo](https://github.com/jdcloud-api/jdcloud-sdk-nodejs/tree/master/test)\n\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/package.json",
    "content": "{\n  \"name\": \"@certd/jdcloud\",\n  \"version\": \"1.36.10\",\n  \"description\": \"jdcloud openApi sdk\",\n  \"main\": \"./dist/bundle.js\",\n  \"module\": \"./dist/bundle.js\",\n  \"types\": \"./dist/d/index.d.ts\",\n  \"scripts\": {\n    \"test\": \"cross-env NODE_CONFIG_DIR=./test/config  mocha --recursive --require babel-register\",\n    \"dev\": \"babel src --out-dir babel -w\",\n    \"build\": \"rollup -c \",\n    \"dev-build\": \"npm run build\",\n    \"pub\": \"npm publish\"\n  },\n  \"author\": \"\",\n  \"license\": \"Apache\",\n  \"dependencies\": {\n    \"babel-register\": \"^6.26.0\",\n    \"buffer\": \"^5.0.8\",\n    \"create-hash\": \"^1.1.3\",\n    \"create-hmac\": \"^1.1.6\",\n    \"debug\": \"^3.1.0\",\n    \"node-fetch\": \"^2.1.2\",\n    \"querystring\": \"^0.2.0\",\n    \"rollup\": \"^3.7.4\",\n    \"url\": \"^0.11.0\",\n    \"uuid\": \"^3.1.0\"\n  },\n  \"devDependencies\": {\n    \"@rollup/plugin-typescript\": \"^11.0.0\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.26.1\",\n    \"@typescript-eslint/parser\": \"^8.26.1\",\n    \"babel-cli\": \"^6.26.0\",\n    \"babel-preset-env\": \"^1.6.1\",\n    \"chai\": \"^4.1.2\",\n    \"config\": \"^1.30.0\",\n    \"cross-env\": \"^5.1.4\",\n    \"js-yaml\": \"^3.11.0\",\n    \"mocha\": \"^5.0.0\",\n    \"prettier\": \"^2.8.8\",\n    \"tslib\": \"^2.8.1\"\n  },\n  \"engines\": {\n    \"node\": \">= 8.6.0\",\n    \"npm\": \">= 5.6.0\"\n  },\n  \"browserslist\": [\n    \"> 1%\",\n    \"last 2 versions\",\n    \"not ie <= 9\"\n  ],\n  \"standard\": {\n    \"env\": [\n      \"node\",\n      \"mocha\",\n      \"browser\"\n    ],\n    \"globals\": [\n      \"Request\",\n      \"Headers\",\n      \"fetch\"\n    ]\n  },\n  \"gitHead\": \"085bdf5cfa9140903611aa12cdd2542d05aba321\"\n}\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/rollup.config.js",
    "content": "const resolve = require(\"@rollup/plugin-node-resolve\");\nconst commonjs = require(\"@rollup/plugin-commonjs\");\n//const Typescript = require(\"rollup-plugin-typescript2\");\nconst Typescript = require(\"@rollup/plugin-typescript\");\nconst json = require(\"@rollup/plugin-json\");\nconst terser = require(\"@rollup/plugin-terser\");\nmodule.exports = {\n  input: \"src/index.ts\",\n  output: {\n    file: \"dist/bundle.js\",\n    format: \"cjs\",\n  },\n  plugins: [\n    // 解析第三方依赖\n    resolve(),\n    // 识别 commonjs 模式第三方依赖\n    commonjs({\n      // dynamicRequireRoot: \"../../../../\",\n      // dynamicRequireTargets: [\n      //   // include using a glob pattern (either a string or an array of strings)\n      //   \"../../../../**/shelljs/src/*\",\n      // ],\n    }),\n    Typescript({\n      target: \"esnext\",\n      rootDir: \"src\",\n      declaration: true,\n      declarationDir: \"dist/d\",\n      exclude: [\"./node_modules/**\", \"./src/**/*.vue\", \"./src/**/*.spec.ts\"],\n      allowSyntheticDefaultImports: true,\n    }),\n    json(),\n    // terser(),\n  ],\n  external: [\"vue\", \"lodash-es\", \"dayjs\", \"log4js\", \"@midwayjs/core\", \"@certd/pipeline\", \"axios\"],\n};\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/global.js",
    "content": "require('./lib/node_loader')\nmodule.exports = require('./lib/core')\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/index.ts",
    "content": "import jdCloud  from \"./lib/core.js\";\nimport jdService from './lib/service.js'\n\nimport domainService from './repo/domainservice/v2/domainservice.js'\nimport cdnService from './repo/cdn/v1/cdn.js'\nimport sslService from './repo/ssl/v1/ssl.js'\nexport const JDCloud = jdCloud;\nexport const JDService = jdService;\nexport const JDDomainService = domainService;\nexport const JDCdnService = cdnService;\nexport const JDSslService = sslService;"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/jdcloud.js",
    "content": "module.exports = require('./lib/jc')\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/browser.js",
    "content": "require('babel-polyfill')\nrequire('./browser_loader')\nvar JC = require('./core')\nrequire('../services/all')\nmodule.exports = JC\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/browser_loader.js",
    "content": "var util = require('./util')\nutil.crypto.lib = {\n  createHash: require('create-hash'),\n  createHmac: require('create-hmac')\n}\nutil.Buffer = require('buffer/').Buffer\nutil.url = require('url/')\nutil.querystring = require('querystring/')\nutil.environment = 'js'\n\nvar JC = require('./core')\n\nmodule.exports = JC\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/common.js",
    "content": "require('./core')\n\nrequire('./config')\nrequire('./request')\nrequire('./service')\nrequire('./credentials')\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/config.js",
    "content": "var JDCloud = require('./core')\n\nlet defaultValues = {\n  credentials: null,\n  regionId: null,\n  apiVersions: null,\n  endpoint: {},\n  version: {},\n  logger: function (string, level = 'INFO') {\n    // level: INFO / DEBUG / ERROR / WARN\n    console.log(string)\n  }\n}\nJDCloud.Config = class Config {\n  constructor (options = {}) {\n    options = this.extractCredentials(options)\n\n    JDCloud.util.each.call(this, defaultValues, function (key, value) {\n      if (options[key] === undefined) {\n        this[key] = value\n      } else {\n        this[key] = options[key]\n      }\n    })\n    JDCloud.util.each.call(this, JDCloud.Service._services, function (\n      key,\n      value\n    ) {\n      if (options[key] !== undefined) {\n        this[key] = options[key]\n      }\n    })\n  }\n\n  extractCredentials (options) {\n    if (options.accessKeyId && options.secretAccessKey) {\n      options = Object.assign({}, options)\n      options.credentials = new JDCloud.Credentials(options)\n    }\n    return options\n  }\n\n  getCredentials () {\n    var p = new Promise((resolve, reject) => {\n      if (this.credentials) {\n        if (typeof this.credentials.get === 'function') {\n        } else if (\n          this.credentials.accessKeyId &&\n          this.credentials.secretAccessKey\n        ) {\n          resolve()\n        } else {\n          reject(new Error('missing credentials'))\n        }\n      } else if (this.credentialProvider) {\n      } else {\n        reject(new Error('get credentials failed'))\n      }\n    })\n\n    return p\n  }\n\n  update (options, allowUnknownKeys = false) {\n    options = this.extractCredentials(options)\n    JDCloud.util.each.call(this, options, function (key, value) {\n      if (\n        allowUnknownKeys ||\n        defaultValues.hasOwnProperty(key) ||\n        JDCloud.Service.hasService(key)\n      ) {\n        this[key] = options[key]\n      }\n    })\n  }\n}\n\nJDCloud.config = new JDCloud.Config()\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/core.js",
    "content": "require('node-fetch')\n\nvar JDCloud = {\n  util: require('./util'),\n  // todo swaggerVar\n  VERSION: ''\n}\n\nmodule.exports = JDCloud\n\nrequire('./service')\nrequire('./config')\nrequire('./request')\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/credentials.js",
    "content": "var JDCloud = require('./core')\n\nJDCloud.Credentials = class Credentials {\n  constructor () {\n    this.expired = false\n    this.expireTime = null\n\n    if (arguments.length === 1 && typeof arguments[0] === 'object') {\n      var creds = arguments[0].credentials || arguments[0]\n      this.accessKeyId = creds.accessKeyId\n      this.secretAccessKey = creds.secretAccessKey\n      this.sessionToken = creds.sessionToken\n    } else {\n      this.accessKeyId = arguments[0]\n      this.secretAccessKey = arguments[1]\n      this.sessionToken = arguments[2]\n    }\n  }\n}\n\nmodule.exports = JDCloud.Credentials\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/jc.js",
    "content": "require('./node_loader')\nvar JDCloud = require('./core')\nrequire('../services/all')\nmodule.exports = JDCloud\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/node_loader.js",
    "content": "var util = require('./util')\n\nutil.crypto.lib = require('crypto')\nutil.Buffer = require('buffer').Buffer\nutil.url = require('url')\nutil.querystring = require('querystring')\nutil.environment = 'nodejs'\nlet JDCloud = require('./core')\nJDCloud.fetch = require('node-fetch')\nmodule.exports = JDCloud\n\nrequire('./credentials')\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/request.js",
    "content": "var JDCloud = require('./core')\n\nlet util = JDCloud.util\nJDCloud.JCRequest = class JCRequest {\n  constructor (\n    service,\n    path,\n    httpMethod,\n    pathParams,\n    queryParams,\n    headerParams,\n    formParams,\n    postBody,\n    contentTypes,\n    accepts,\n    returnType\n  ) {\n    this.service = service\n\n    var endpoint = service.config.endpoint\n    pathParams.regionId = pathParams.regionId || service.config.regionId\n    this.regionId = pathParams.regionId\n\n    this.path = this.buildPath(path, pathParams)\n    this.path = util.uriEscapePath(this.path)\n\n    var queryString = this.buildQuery(queryParams)\n\n    var url = this.path\n    if (queryString) {\n      url = this.path + '?' + queryString\n    }\n\n    var contentType = this.jsonPreferredMime(contentTypes) || 'application/json'\n    headerParams['content-type'] = contentType\n    var requestHeaders = this.buildHeaders(headerParams)\n\n    var requestInit = {\n      method: httpMethod || 'GET',\n      headers: requestHeaders\n    }\n\n    if (contentType === 'application/x-www-form-urlencoded') {\n    } else if (contentType === 'multipart/form-data') {\n    } else if (postBody) {\n      requestInit.body = JSON.stringify(postBody)\n    }\n    var fetchUrl = endpoint.protocol + '://' + endpoint.host + url\n    JDCloud.config.logger(\n      `make request where url is :${fetchUrl} \\nwith fetch config:${JSON.stringify(\n        requestInit\n      )}`\n    )\n    this.request = new JDCloud.fetch.Request(fetchUrl, requestInit)\n  }\n\n  buildPath (path, pathParams) {\n    var uri = (this.service.config.basePath || '') + path\n    uri = uri.replace(/\\{([\\w-]+)\\}/g, (fullMatch, key) => {\n      var value\n      if (pathParams.hasOwnProperty(key)) {\n        value = pathParams[key]\n      } else {\n        value = fullMatch\n      }\n      return value\n    })\n    return uri\n  }\n\n  buildQuery (queryParams) {\n    var queryParamsWithoutEmptyItem = {}\n    var keys = Object.keys(queryParams)\n    for (let key of keys) {\n      if (queryParams[key] !== undefined) {\n        queryParamsWithoutEmptyItem[key] = queryParams[key]\n      }\n    }\n    return JDCloud.util.querystring.stringify(queryParamsWithoutEmptyItem)\n  }\n\n  search () {\n    var query = this.request.url.split('?', 2)[1]\n    if (query) {\n      query = JDCloud.util.querystring.parse(query)\n      return JDCloud.util.queryParamsToString(query)\n    }\n    return ''\n  }\n\n  digitizationArray (key, obj) {\n    var result = key\n    if (Array.isArray(obj)) {\n      JDCloud.util.arrayEach(obj, (arrayValue, index) => {\n        result += this.digitizationArray(`.${index + 1}`, arrayValue)\n      })\n    } else if (typeof obj === 'object' && obj != null) {\n      JDCloud.util.each(obj, (key, ObjValue) => {\n        result += `.name=${key}&${result}.values` + this.digitizationArray()\n        result +=\n          key +\n          '.name=' +\n          ObjValue +\n          '&' +\n          this.digitizationArray(key + '.values', ObjValue)\n      })\n    } else {\n      result += key + '=' + encodeURI(obj)\n    }\n    return result\n  }\n\n  buildHeaders (headerParams) {\n    var headers = new JDCloud.fetch.Headers({\n      accept: 'application/json'\n    })\n\n    util.each.call(this, headerParams, function (key) {\n      if (headerParams[key] !== undefined && headerParams[key] != null) {\n        headers.append(key, headerParams[key])\n      }\n    })\n    return headers\n  }\n\n  /**\n   * Checks whether the given content type represents JSON.<br>\n   * JSON content type examples:<br>\n   * <ul>\n   * <li>application/json</li>\n   * <li>application/json; charset=UTF8</li>\n   * <li>APPLICATION/JSON</li>\n   * </ul>\n   * @param {String} contentType The MIME content type to check.\n   * @returns {Boolean} <code>true</code> if <code>contentType</code> represents JSON, otherwise <code>false</code>.\n   */\n  isJsonMime (contentType) {\n    return Boolean(\n      contentType != null && contentType.match(/^application\\/json(;.*)?$/i)\n    )\n  }\n\n  /**\n   * Chooses a content type from the given array, with JSON preferred; i.e. return JSON if included, otherwise return the first.\n   * @param {Array.<String>} contentTypes\n   * @returns {String} The chosen content type, preferring JSON.\n   */\n  jsonPreferredMime (contentTypes) {\n    for (var i = 0; i < contentTypes.length; i++) {\n      if (this.isJsonMime(contentTypes[i])) {\n        return contentTypes[i]\n      }\n    }\n\n    return contentTypes[0]\n  }\n}\n\nmodule.exports = JDCloud.JCRequest\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/service.js",
    "content": "var JDCloud = require('./core')\nvar SignerV2 = require('./signers/v2')\n\nJDCloud.Service = class Service {\n  constructor (serviceId, config = {}) {\n    this.serviceId = serviceId\n    this.init(config)\n  }\n\n  init (config) {\n    // 某个服务类型的全局配置\n    var serviceConfig = JDCloud.config[this.serviceId]\n    // 全局配置\n    this.config = new JDCloud.Config(JDCloud.config)\n    if (serviceConfig) {\n      this.config.update(serviceConfig, true)\n    }\n    if (config) {\n      if (!this.config.endpoint.host && !config.endpoint) {\n        config.endpoint = config._defaultEndpoint\n      }\n      delete config._defaultEndpoint\n      this.config.update(config, true)\n    }\n  }\n\n  makeRequest (\n    path,\n    httpMethod,\n    pathParams,\n    queryParams,\n    headerParams,\n    formParams,\n    postBody,\n    contentTypes,\n    accepts,\n    returnType,\n    callback\n  ) {\n    var request = new JDCloud.JCRequest(\n      this,\n      path,\n      httpMethod,\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType\n    )\n\n    var signer = new SignerV2(request, this.serviceId)\n\n    return this.config.getCredentials().then(() => {\n      signer.addAuthorization(this.config.credentials)\n      return JDCloud.fetch(signer.request.request).then(response => {\n        return response.json().then(\n          result => {\n            result.responseObj = response\n            if (response.ok) {\n              return result\n            }\n            return Promise.reject(result)\n          },\n          error => {\n            error.responseObj = response\n            if (error.type === 'invalid-json') {\n              // oss没有返回json\n              if (response.ok) {\n                return Promise.resolve({\n                  requestId: response.headers.get('x-jdcloud-request-id') || ''\n                })\n              } else {\n                /* eslint-disable */\n                return Promise.reject({\n                  requestId: response.headers.get('x-jdcloud-request-id') || ''\n                })\n                /* eslint-enable */\n              }\n            }\n            throw error\n          }\n        )\n      })\n    })\n  }\n\n  buildCollectionParam (param, collectionFormat) {\n    if (param === null || param === undefined) {\n      return param\n    }\n    switch (collectionFormat) {\n      case 'csv':\n        return param.map(this.paramToString).join(',')\n      case 'ssv':\n        return param.map(this.paramToString).join(' ')\n      case 'tsv':\n        return param.map(this.paramToString).join('\\t')\n      case 'pipes':\n        return param.map(this.paramToString).join('|')\n      case 'multi':\n        // return the array directly as SuperAgent will handle it as expected\n        return param.map(this.paramToString)\n      default:\n        throw new Error('Unknown collection format: ' + collectionFormat)\n    }\n  }\n\n  /**\n   *  filter is a special type of array\n   *  only contains:\n   *  [\n   *      { name: someString , values:[ someString, someString ] ,operator: someString}\n   *  ]\n   *\n   */\n  buildFilterParam (param, key) {\n    var result = {}\n    if (Array.isArray(param)) {\n      let index = 0\n      for (var i = 0; i < param.length; i++) {\n        var obj = param[i]\n\n        // 兼容空字符串\n        if (obj.values !== '' && !Array.isArray(obj.values)) {\n          throw new Error('The type of filters.values should be Array!')\n        }\n        if (obj.name && obj.values) {\n          if (!obj.values.length) continue\n          result[`${key}.${index + 1}.name`] = obj.name\n          for (var j = 0; j < obj.values.length; j++) {\n            var someString = obj.values[j]\n            result[`${key}.${index + 1}.values.${j + 1}`] = someString\n          }\n          if (obj.operator) {\n            result[`${key}.${index + 1}.operator`] = obj.operator\n          }\n          index++\n        }\n      }\n    }\n    return result\n  }\n\n  buildTagFilterParam (param = [], key) {\n    var result = {}\n    if (!Array.isArray(param)) {\n      throw new Error(`The type of param 'param' should be Array!`)\n    }\n\n    for (var i = 0; i < param.length; i++) {\n      var obj = param[i]\n\n      if (obj.values && !Array.isArray(obj.values)) {\n        throw new Error(\n          `The type of param 'param[${i}].values' should be Array or NULL!`\n        )\n      }\n\n      if (obj.key) {\n        result[`${key}.${i + 1}.key`] = obj.key\n\n        if (obj.values) {\n          for (var j = 0; j < obj.values.length; j++) {\n            var someString = obj.values[j]\n            result[`${key}.${i + 1}.values.${j + 1}`] = someString\n          }\n        }\n      }\n    }\n    return result\n  }\n\n  buildSortParam (param = [], key) {\n    var result = {}\n    if (!Array.isArray(param)) {\n      throw new Error(`The type of param 'param' should be Array!`)\n    }\n\n    var index = 0\n    for (var i = 0; i < param.length; i++) {\n      var obj = param[i]\n\n      if (obj.name && obj.direction) {\n        index++\n        result[`${key}.${index}.name`] = obj.name\n        result[`${key}.${index}.direction`] = obj.direction\n      }\n    }\n    return result\n  }\n\n  // arr=[a,b,c] =>  arr={arr1:a, arr2:b, arr3:c}\n  buildArrayParam (param = [], key) {\n    var result = {}\n    if (!Array.isArray(param)) {\n      throw new Error(`The type of param 'param' should be Array!`)\n    }\n\n    for (var i = 0; i < param.length; i++) {\n      var value = param[i]\n      result[`${key}.${i + 1}`] = value\n    }\n    return result\n  }\n\n  /**\n   * Returns a string representation for an actual parameter.\n   * @param param The actual parameter.\n   * @returns {String} The string representation of <code>param</code>.\n   */\n  paramToString (param) {\n    if (param === undefined || param === null) {\n      return ''\n    }\n    if (param instanceof Date) {\n      return param.toJSON()\n    }\n\n    return param.toString()\n  }\n\n  static hasService (id) {\n    return JDCloud.Service._services.hasOwnProperty(id)\n  }\n}\nJDCloud.Service._services = {}\n\nmodule.exports = JDCloud.Service\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/signers/request_signer.js",
    "content": "module.exports = class RequestSigner {\n  constructor (request) {\n    this.request = request\n  }\n\n  setServiceClientId (id) {\n    this.serviceClientId = id\n  }\n\n  getServiceClientId () {\n    return this.serviceClientId\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/signers/v2.js",
    "content": "// Copyright 2018 JDCLOUD.COM\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License\n// This signer is modified from AWS V4 signer algorithm.\n\nvar util = require('../util')\nvar RequestSigner = require('./request_signer')\nvar v2Credentials = require('./v2_credentials')\nvar uuid = require('uuid')\nvar JDCloud = require('../core')\n\nmodule.exports = class SignerV2 extends RequestSigner {\n  constructor (request, serviceName, options = {}) {\n    super(request)\n    this.signatureCache = true\n    this.algorithm = 'JDCLOUD2-HMAC-SHA256'\n    this.unsignableHeaders = ['authorization', 'user-agent']\n    this.serviceName = serviceName\n    // this.signatureCache = typeof options.signatureCache === 'boolean' ? options.signatureCache : true;\n  }\n\n  // 签名流程见 https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html\n\n  addAuthorization (credentials, date) {\n    // var datetime = '20180119T070300Z';\n    var datetime = util.date.iso8601(date).replace(/[:-]|\\.\\d{3}/g, '')\n    this.addHeaders(credentials, datetime)\n    this.request.request.headers.set(\n      'Authorization',\n      this.authorization(credentials, datetime)\n    )\n  }\n\n  addHeaders (credentials, datetime) {\n    this.request.request.headers.set('x-jdcloud-date', datetime)\n    this.request.request.headers.set('x-jdcloud-nonce', uuid.v4())\n    this.request.request.headers.set(\n      'host',\n      this.request.service.config.endpoint.host\n    )\n  }\n\n  signedHeaders () {\n    var keys = []\n    this.request.request.headers.forEach((value, key) => {\n      key = key.toLowerCase()\n      if (this.isSignableHeader(key)) {\n        keys.push(key)\n      }\n    })\n    /* util.each.call(this, this.request.headers, function (key) {\n\n        }); */\n    return keys.sort().join(';')\n  }\n\n  credentialString (datetime) {\n    return v2Credentials.createScope(\n      datetime.substr(0, 8),\n      this.request.regionId,\n      this.serviceName\n    )\n  }\n\n  signature (credentials, datetime) {\n    var signingKey = v2Credentials.getSigningKey(\n      credentials,\n      datetime.substr(0, 8),\n      this.request.regionId,\n      this.serviceName,\n      this.signatureCache\n    )\n    return util.crypto.hmac(signingKey, this.stringToSign(datetime), 'hex')\n  }\n\n  stringToSign (datetime) {\n    var parts = []\n    parts.push(this.algorithm)\n    parts.push(datetime)\n    parts.push(this.credentialString(datetime))\n    parts.push(this.hexEncodedHash(this.canonicalString()))\n    JDCloud.config.logger('StringToSign is \\n' + JSON.stringify(parts), 'DEBUG')\n    return parts.join('\\n')\n  }\n\n  // 构建标准签名字符串\n  canonicalString () {\n    var parts = []\n    var pathname = this.request.path\n    //    if (this.serviceName !== 'jfs') {\n    //      pathname = util.uriEscapePath(pathname)\n    //    }\n\n    parts.push(this.request.request.method)\n    parts.push(pathname)\n    parts.push(this.request.search())\n    parts.push(this.canonicalHeaders() + '\\n')\n    parts.push(this.signedHeaders())\n    parts.push(this.hexEncodedBodyHash())\n    JDCloud.config.logger(\n      'canonicalString is \\n' + JSON.stringify(parts),\n      'DEBUG'\n    )\n    return parts.join('\\n')\n  }\n\n  canonicalHeaders () {\n    var headers = []\n    this.request.request.headers.forEach((value, key) => {\n      headers.push([key, value])\n    })\n    headers.sort(function (a, b) {\n      return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : 1\n    })\n    var parts = []\n    util.arrayEach.call(this, headers, function (item) {\n      var key = item[0].toLowerCase()\n      if (this.isSignableHeader(key)) {\n        var value = item[1]\n        if (\n          typeof value === 'undefined' ||\n          value === null ||\n          typeof value.toString !== 'function'\n        ) {\n          throw util.error(\n            new Error('Header ' + key + ' contains invalid value'),\n            {\n              code: 'InvalidHeader'\n            }\n          )\n        }\n        parts.push(key + ':' + this.canonicalHeaderValues(value.toString()))\n      }\n    })\n    return parts.join('\\n')\n  }\n\n  canonicalHeaderValues (values) {\n    return values.replace(/\\s+/g, ' ').replace(/^\\s+|\\s+$/g, '')\n  }\n\n  authorization (credentials, datetime) {\n    var parts = []\n    var credString = this.credentialString(datetime)\n    parts.push(\n      this.algorithm +\n        ' Credential=' +\n        credentials.accessKeyId +\n        '/' +\n        credString\n    )\n    parts.push('SignedHeaders=' + this.signedHeaders())\n    parts.push('Signature=' + this.signature(credentials, datetime))\n    JDCloud.config.logger('Signature is \\n' + JSON.stringify(parts), 'DEBUG')\n    return parts.join(', ')\n  }\n\n  hexEncodedHash (string) {\n    return util.crypto.sha256(string, 'hex')\n  }\n\n  hexEncodedBodyHash () {\n    return this.hexEncodedHash(this.request.request.body || '')\n    /* var request = this.request;\n        if (this.isPresigned() && this.serviceName === 's3' && !request.body) {\n            return 'UNSIGNED-PAYLOAD';\n        } else if (request.headers['X-Amz-Content-Sha256']) {\n            return request.headers['X-Amz-Content-Sha256'];\n        } else {\n            return this.hexEncodedHash(this.request.body || '');\n        } */\n  }\n\n  isSignableHeader (key) {\n    if (key.toLowerCase().includes('x-jdcloud-')) {\n      return true\n    }\n    return !this.unsignableHeaders.includes(key.toLowerCase())\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/signers/v2_credentials.js",
    "content": "var cachedSecret = {}\nvar cacheQueue = []\nvar maxCacheEntries = 50\nvar v2Identifier = 'jdcloud2_request'\n\nvar util = require('../util')\n\nmodule.exports = {\n  /**\n   * @api private\n   *\n   * @param date [String]\n   * @param region [String]\n   * @param serviceName [String]\n   * @return [String]\n   */\n  createScope: function createScope (date, region, serviceName) {\n    return [date.substr(0, 8), region, serviceName, v2Identifier].join('/')\n  },\n\n  /**\n   * @api private\n   *\n   * @param credentials [Credentials]\n   * @param date [String]\n   * @param region [String]\n   * @param service [String]\n   * @param shouldCache [Boolean]\n   * @return [String]\n   */\n  getSigningKey: function getSigningKey (\n    credentials,\n    date,\n    region,\n    service,\n    shouldCache\n  ) {\n    var credsIdentifier = util.crypto.hmac(\n      credentials.secretAccessKey,\n      credentials.accessKeyId,\n      'base64'\n    )\n    var cacheKey = [credsIdentifier, date, region, service].join('_')\n    shouldCache = shouldCache !== false\n    if (shouldCache && cacheKey in cachedSecret) {\n      return cachedSecret[cacheKey]\n    }\n\n    var kDate = util.crypto.hmac(\n      'JDCLOUD2' + credentials.secretAccessKey,\n      date,\n      'buffer'\n    )\n    var kRegion = util.crypto.hmac(kDate, region, 'buffer')\n    var kService = util.crypto.hmac(kRegion, service, 'buffer')\n\n    var signingKey = util.crypto.hmac(kService, v2Identifier, 'buffer')\n    if (shouldCache) {\n      cachedSecret[cacheKey] = signingKey\n      cacheQueue.push(cacheKey)\n      if (cacheQueue.length > maxCacheEntries) {\n        // remove the oldest entry (not the least recently used)\n        delete cachedSecret[cacheQueue.shift()]\n      }\n    }\n\n    return signingKey\n  },\n\n  /**\n   * @api private\n   *\n   * Empties the derived signing key cache. Made available for testing purposes\n   * only.\n   */\n  emptyCache: function emptyCache () {\n    cachedSecret = {}\n    cacheQueue = []\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/lib/util.js",
    "content": "var util = {\n  isBrowser: function isBrowser () {\n    return process && process.browser\n  },\n  isNode: function isNode () {\n    return !util.isBrowser()\n  },\n  uriEscape: function uriEscape (string) {\n    var output = encodeURIComponent(string)\n    output = output.replace(/[^A-Za-z0-9_.~\\-%]+/g, escape)\n\n    // AWS percent-encodes some extra non-standard characters in a URI\n    output = output.replace(/[*]/g, function (ch) {\n      return (\n        '%' +\n        ch\n          .charCodeAt(0)\n          .toString(16)\n          .toUpperCase()\n      )\n    })\n\n    return output\n  },\n  uriEscapePath: function uriEscapePath (string) {\n    var parts = []\n    util.arrayEach(string.split('/'), function (part) {\n      parts.push(util.uriEscape(part))\n    })\n    return parts.join('/')\n  },\n  abort: {},\n  each: function each (object, iterFunction) {\n    for (var key in object) {\n      if (Object.prototype.hasOwnProperty.call(object, key)) {\n        var ret = iterFunction.call(this, key, object[key])\n        if (ret === util.abort) break\n      }\n    }\n  },\n\n  arrayEach: function arrayEach (array, iterFunction) {\n    for (var idx in array) {\n      if (Object.prototype.hasOwnProperty.call(array, idx)) {\n        var ret = iterFunction.call(this, array[idx], parseInt(idx, 10))\n        if (ret === util.abort) break\n      }\n    }\n  },\n  arraySliceFn: function arraySliceFn (obj) {\n    var fn = obj.slice || obj.webkitSlice || obj.mozSlice\n    return typeof fn === 'function' ? fn : null\n  },\n  queryParamsToString: function queryParamsToString (params) {\n    var items = []\n    var escape = util.uriEscape\n    var sortedKeys = Object.keys(params).sort()\n\n    util.arrayEach(sortedKeys, function (name) {\n      var value = params[name]\n      var ename = escape(name)\n      var result = ename + '='\n      if (Array.isArray(value)) {\n        var vals = []\n        util.arrayEach(value, function (item) {\n          vals.push(escape(item))\n        })\n        result = ename + '=' + vals.sort().join('&' + ename + '=')\n      } else if (value !== undefined && value !== null) {\n        result = ename + '=' + escape(value)\n      }\n      items.push(result)\n    })\n\n    return items.join('&')\n  },\n  date: {\n    getDate () {\n      return new Date()\n    },\n    iso8601: function iso8601 (date) {\n      if (date === undefined) {\n        date = util.date.getDate()\n      }\n      return date.toISOString().replace(/\\.\\d{3}Z$/, 'Z')\n    }\n  },\n  crypto: {\n    /* eslint-disable no-use-before-define */\n    crc32Table: [\n      0x00000000,\n      0x77073096,\n      0xee0e612c,\n      0x990951ba,\n      0x076dc419,\n      0x706af48f,\n      0xe963a535,\n      0x9e6495a3,\n      0x0edb8832,\n      0x79dcb8a4,\n      0xe0d5e91e,\n      0x97d2d988,\n      0x09b64c2b,\n      0x7eb17cbd,\n      0xe7b82d07,\n      0x90bf1d91,\n      0x1db71064,\n      0x6ab020f2,\n      0xf3b97148,\n      0x84be41de,\n      0x1adad47d,\n      0x6ddde4eb,\n      0xf4d4b551,\n      0x83d385c7,\n      0x136c9856,\n      0x646ba8c0,\n      0xfd62f97a,\n      0x8a65c9ec,\n      0x14015c4f,\n      0x63066cd9,\n      0xfa0f3d63,\n      0x8d080df5,\n      0x3b6e20c8,\n      0x4c69105e,\n      0xd56041e4,\n      0xa2677172,\n      0x3c03e4d1,\n      0x4b04d447,\n      0xd20d85fd,\n      0xa50ab56b,\n      0x35b5a8fa,\n      0x42b2986c,\n      0xdbbbc9d6,\n      0xacbcf940,\n      0x32d86ce3,\n      0x45df5c75,\n      0xdcd60dcf,\n      0xabd13d59,\n      0x26d930ac,\n      0x51de003a,\n      0xc8d75180,\n      0xbfd06116,\n      0x21b4f4b5,\n      0x56b3c423,\n      0xcfba9599,\n      0xb8bda50f,\n      0x2802b89e,\n      0x5f058808,\n      0xc60cd9b2,\n      0xb10be924,\n      0x2f6f7c87,\n      0x58684c11,\n      0xc1611dab,\n      0xb6662d3d,\n      0x76dc4190,\n      0x01db7106,\n      0x98d220bc,\n      0xefd5102a,\n      0x71b18589,\n      0x06b6b51f,\n      0x9fbfe4a5,\n      0xe8b8d433,\n      0x7807c9a2,\n      0x0f00f934,\n      0x9609a88e,\n      0xe10e9818,\n      0x7f6a0dbb,\n      0x086d3d2d,\n      0x91646c97,\n      0xe6635c01,\n      0x6b6b51f4,\n      0x1c6c6162,\n      0x856530d8,\n      0xf262004e,\n      0x6c0695ed,\n      0x1b01a57b,\n      0x8208f4c1,\n      0xf50fc457,\n      0x65b0d9c6,\n      0x12b7e950,\n      0x8bbeb8ea,\n      0xfcb9887c,\n      0x62dd1ddf,\n      0x15da2d49,\n      0x8cd37cf3,\n      0xfbd44c65,\n      0x4db26158,\n      0x3ab551ce,\n      0xa3bc0074,\n      0xd4bb30e2,\n      0x4adfa541,\n      0x3dd895d7,\n      0xa4d1c46d,\n      0xd3d6f4fb,\n      0x4369e96a,\n      0x346ed9fc,\n      0xad678846,\n      0xda60b8d0,\n      0x44042d73,\n      0x33031de5,\n      0xaa0a4c5f,\n      0xdd0d7cc9,\n      0x5005713c,\n      0x270241aa,\n      0xbe0b1010,\n      0xc90c2086,\n      0x5768b525,\n      0x206f85b3,\n      0xb966d409,\n      0xce61e49f,\n      0x5edef90e,\n      0x29d9c998,\n      0xb0d09822,\n      0xc7d7a8b4,\n      0x59b33d17,\n      0x2eb40d81,\n      0xb7bd5c3b,\n      0xc0ba6cad,\n      0xedb88320,\n      0x9abfb3b6,\n      0x03b6e20c,\n      0x74b1d29a,\n      0xead54739,\n      0x9dd277af,\n      0x04db2615,\n      0x73dc1683,\n      0xe3630b12,\n      0x94643b84,\n      0x0d6d6a3e,\n      0x7a6a5aa8,\n      0xe40ecf0b,\n      0x9309ff9d,\n      0x0a00ae27,\n      0x7d079eb1,\n      0xf00f9344,\n      0x8708a3d2,\n      0x1e01f268,\n      0x6906c2fe,\n      0xf762575d,\n      0x806567cb,\n      0x196c3671,\n      0x6e6b06e7,\n      0xfed41b76,\n      0x89d32be0,\n      0x10da7a5a,\n      0x67dd4acc,\n      0xf9b9df6f,\n      0x8ebeeff9,\n      0x17b7be43,\n      0x60b08ed5,\n      0xd6d6a3e8,\n      0xa1d1937e,\n      0x38d8c2c4,\n      0x4fdff252,\n      0xd1bb67f1,\n      0xa6bc5767,\n      0x3fb506dd,\n      0x48b2364b,\n      0xd80d2bda,\n      0xaf0a1b4c,\n      0x36034af6,\n      0x41047a60,\n      0xdf60efc3,\n      0xa867df55,\n      0x316e8eef,\n      0x4669be79,\n      0xcb61b38c,\n      0xbc66831a,\n      0x256fd2a0,\n      0x5268e236,\n      0xcc0c7795,\n      0xbb0b4703,\n      0x220216b9,\n      0x5505262f,\n      0xc5ba3bbe,\n      0xb2bd0b28,\n      0x2bb45a92,\n      0x5cb36a04,\n      0xc2d7ffa7,\n      0xb5d0cf31,\n      0x2cd99e8b,\n      0x5bdeae1d,\n      0x9b64c2b0,\n      0xec63f226,\n      0x756aa39c,\n      0x026d930a,\n      0x9c0906a9,\n      0xeb0e363f,\n      0x72076785,\n      0x05005713,\n      0x95bf4a82,\n      0xe2b87a14,\n      0x7bb12bae,\n      0x0cb61b38,\n      0x92d28e9b,\n      0xe5d5be0d,\n      0x7cdcefb7,\n      0x0bdbdf21,\n      0x86d3d2d4,\n      0xf1d4e242,\n      0x68ddb3f8,\n      0x1fda836e,\n      0x81be16cd,\n      0xf6b9265b,\n      0x6fb077e1,\n      0x18b74777,\n      0x88085ae6,\n      0xff0f6a70,\n      0x66063bca,\n      0x11010b5c,\n      0x8f659eff,\n      0xf862ae69,\n      0x616bffd3,\n      0x166ccf45,\n      0xa00ae278,\n      0xd70dd2ee,\n      0x4e048354,\n      0x3903b3c2,\n      0xa7672661,\n      0xd06016f7,\n      0x4969474d,\n      0x3e6e77db,\n      0xaed16a4a,\n      0xd9d65adc,\n      0x40df0b66,\n      0x37d83bf0,\n      0xa9bcae53,\n      0xdebb9ec5,\n      0x47b2cf7f,\n      0x30b5ffe9,\n      0xbdbdf21c,\n      0xcabac28a,\n      0x53b39330,\n      0x24b4a3a6,\n      0xbad03605,\n      0xcdd70693,\n      0x54de5729,\n      0x23d967bf,\n      0xb3667a2e,\n      0xc4614ab8,\n      0x5d681b02,\n      0x2a6f2b94,\n      0xb40bbe37,\n      0xc30c8ea1,\n      0x5a05df1b,\n      0x2d02ef8d\n    ],\n    /* eslint-disable no-use-before-define */\n\n    crc32: function crc32 (data) {\n      var tbl = util.crypto.crc32Table\n      var crc = 0 ^ -1\n\n      if (typeof data === 'string') {\n        data = new util.Buffer(data)\n      }\n\n      for (var i = 0; i < data.length; i++) {\n        var code = data.readUInt8(i)\n        crc = (crc >>> 8) ^ tbl[(crc ^ code) & 0xff]\n      }\n      return (crc ^ -1) >>> 0\n    },\n\n    hmac: function hmac (key, string, digest, fn) {\n      if (!digest) digest = 'binary'\n      if (digest === 'buffer') {\n        digest = undefined\n      }\n      if (!fn) fn = 'sha256'\n      if (typeof string === 'string') string = new util.Buffer(string)\n      return util.crypto.lib\n        .createHmac(fn, key)\n        .update(string)\n        .digest(digest)\n    },\n\n    md5: function md5 (data, digest, callback) {\n      return util.crypto.hash('md5', data, digest, callback)\n    },\n\n    sha256: function sha256 (data, digest, callback) {\n      return util.crypto.hash('sha256', data, digest, callback)\n    },\n\n    hash: function (algorithm, data, digest, callback) {\n      var hash = util.crypto.createHash(algorithm)\n      if (!digest) {\n        digest = 'binary'\n      }\n      if (digest === 'buffer') {\n        digest = undefined\n      }\n      if (typeof data === 'string') data = new util.Buffer(data)\n      var sliceFn = util.arraySliceFn(data)\n      var isBuffer = util.Buffer.isBuffer(data)\n      // Identifying objects with an ArrayBuffer as buffers\n      if (\n        util.isBrowser() &&\n        typeof ArrayBuffer !== 'undefined' &&\n        data &&\n        data.buffer instanceof ArrayBuffer\n      ) {\n        isBuffer = true\n      }\n\n      if (\n        callback &&\n        typeof data === 'object' &&\n        typeof data.on === 'function' &&\n        !isBuffer\n      ) {\n        data.on('data', function (chunk) {\n          hash.update(chunk)\n        })\n        data.on('error', function (err) {\n          callback(err)\n        })\n        data.on('end', function () {\n          callback(null, hash.digest(digest))\n        })\n      } else if (\n        callback &&\n        sliceFn &&\n        !isBuffer &&\n        typeof FileReader !== 'undefined'\n      ) {\n        // this might be a File/Blob\n        var index = 0\n        var size = 1024 * 512\n        var reader = new FileReader()\n        reader.onerror = function () {\n          callback(new Error('Failed to read data.'))\n        }\n        reader.onload = function () {\n          var buf = new util.Buffer(new Uint8Array(reader.result))\n          hash.update(buf)\n          index += buf.length\n          reader._continueReading()\n        }\n        reader._continueReading = function () {\n          if (index >= data.size) {\n            callback(null, hash.digest(digest))\n            return\n          }\n\n          var back = index + size\n          if (back > data.size) back = data.size\n          reader.readAsArrayBuffer(sliceFn.call(data, index, back))\n        }\n\n        reader._continueReading()\n      } else {\n        if (util.isBrowser() && typeof data === 'object' && !isBuffer) {\n          data = new util.Buffer(new Uint8Array(data))\n        }\n        var out = hash.update(data).digest(digest)\n        if (callback) callback(null, out)\n        return out\n      }\n    },\n\n    toHex: function toHex (data) {\n      var out = []\n      for (var i = 0; i < data.length; i++) {\n        out.push(('0' + data.charCodeAt(i).toString(16)).substr(-2, 2))\n      }\n      return out.join('')\n    },\n\n    createHash: function createHash (algorithm) {\n      return util.crypto.lib.createHash(algorithm)\n    }\n  }\n}\n\nmodule.exports = util\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/ag/v1/ag.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Quota\n * 关于高可用组配额的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ag'\nService._services[serviceId] = true\n\n/**\n * ag service.\n * @version 0.8.5\n */\n\nclass AG extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'ag.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  使用过滤条件查询一个或多个弹性伸缩活动\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组 ID\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - status - 状态，包括成功：SUCCESS,拒绝：REJECTED,失败：FAILED,执行中：RUNNING,部分成功：WARN，精确匹配\nbeginTime - 开始时间，精确匹配，查询大于等于这个时间的记录\nendTime - 结束时间，精确匹配，查询小于等于这个时间的记录\n以上每个filter项仅支持单个值查询,如果传多个值仅取第一个值\n  optional\n      * @param {sort} [opts.sorts] - 排序条件列表，目前只支持单个排序条件，不支持多个排序条件，默认按照 &#x60;startTime&#x60; 降序排序\n支持使用以下关键字进行排序\n- &#x60;startTime&#x60;: 活动开始时间\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param activity scalingActivities\n      * @param integer totalCount\n      */\n\n  describeScalingActivities (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeScalingActivities\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling describeScalingActivities\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId,\n      agId: opts.agId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeScalingActivities with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/autoScaling/{agId}:describeScalingActivities',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看告警任务\n- 所有参数取值为字符串类型的都严格区分大小写\n- 伸缩功能开启或者关闭的情况下，都支持调用此接口\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码，默认为&#x60;1&#x60;，最小值必须大于0  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为&#x60;20&#x60;，取值范围[&#x60;10&#x60; ~ &#x60;100&#x60;]  optional\n      * @param {filter} [opts.filters] - 支持使用以下关键字进行过滤查询\n- &#x60;agId&#x60;: 高可用组ID，精确匹配，支持多个\n- &#x60;asAlarmId&#x60;: 告警任务ID，精确匹配，支持多个\n- &#x60;name&#x60;: 告警任务名称，模糊匹配，支持单个\n- &#x60;metricType&#x60;: 监控项类型，精确匹配，支持多个，取值范围：[&#x60;System&#x60;,&#x60;Custom&#x60;]\n  optional\n      * @param {sort} [opts.sorts] - 排序条件列表，目前只支持单个排序条件，不支持多个排序条件，默认按照 &#x60;createTime&#x60; 降序排序\n支持使用以下关键字进行排序\n- &#x60;createTime&#x60;: 创建时间\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  本次查询可匹配到的总记录数，使用者需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      * @param asAlarmInfo asAlarms\n      */\n\n  describeAsAlarms (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAsAlarms\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAsAlarms with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asAlarms',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建告警任务\n- 所有参数取值为字符串类型的都严格区分大小写\n- 伸缩功能关闭的情况下，不支持调用此接口\n- 创建告警可以不选择简单伸缩规则，但是最终一个告警只允许关联一个简单规则和一个步进规则，步进规则优先级高于简单规则\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组ID\n      * @param {string} opts.name - 名称，长度为1~32个字符，只允许中文、数字、大小写字母、英文下划线（_）、连字符（-）\n      * @param {string} [opts.description] - 描述，最大长度为256个字符  optional\n      * @param {string} opts.metricType - 监控项类型，取值范围：[&#x60;System&#x60;,&#x60;Custom&#x60;]\n- &#x60;System&#x60;：系统监控项\n- &#x60;Custom&#x60;：自定义监控项\n\n      * @param {string} opts.metricName - 监控项，云主机监控指标说明：https://docs.jdcloud.com/cn/monitoring/vm\n目前支持的指标项如下:\n- &#x60;cpu_util&#x60;: &#x60;CPU使用率&#x60;\n- &#x60;memory.usage&#x60;: &#x60;内存使用率&#x60;\n- &#x60;vm.disk.bytes.read&#x60;: &#x60;磁盘读吞吐量(host)&#x60;\n- &#x60;vm.disk.bytes.write&#x60;: &#x60;磁盘写吞吐量(host)&#x60;\n- &#x60;vm.network.bytes.incoming&#x60;: &#x60;网络进速率(host)&#x60;\n- &#x60;vm.network.bytes.outgoing&#x60;: &#x60;网络出速率(host)&#x60;\n\n      * @param {string} [opts.namespace] - 命名空间，当&#x60;metricType&#x60;为&#x60;Custom&#x60;，此参数必填  optional\n      * @param {integer} opts.period - 监控项数据统计周期，单位分钟，取值范围：[&#x60;1&#x60;,&#x60;2&#x60;,&#x60;5&#x60;,&#x60;10&#x60;,&#x60;15&#x60;,&#x60;30&#x60;,&#x60;60&#x60;]\n      * @param {string} opts.statistic - 统计监控项数据的方法\n- 系统监控取值范围：[&#x60;avg&#x60;,&#x60;max&#x60;,&#x60;min&#x60;]\n- 自定义监控取值范围：[&#x60;avg&#x60;]\n\n      * @param {number} opts.threshold - 监控指标的阈值，必须大于0，阈值单位与监控项单位一致\n      * @param {string} opts.comparison - 对监控项阈值的判断方式，取值范围：[&#x60;gte&#x60;:&#x60;大于等于&#x60;,&#x60;lte&#x60;:&#x60;小于等于&#x60;,&#x60;gt&#x60;:&#x60;大于&#x60;,&#x60;lt&#x60;:&#x60;小于&#x60;]\n      * @param {integer} [opts.hitCount] - 触发告警需要满足阈值表达式的次数，默认为&#x60;3&#x60;，取值范围：[&#x60;1&#x60;,&#x60;2&#x60;,&#x60;3&#x60;,&#x60;5&#x60;,&#x60;10&#x60;,&#x60;15&#x60;,&#x60;30&#x60;,&#x60;60&#x60;]  optional\n      * @param {string} [opts.asRuleId] - 伸缩规则ID，可以为告警任务绑定伸缩规则，目前只支持 &#x60;asRuleType&#x60; 为 &#x60;Simple&#x60; 的伸缩规则  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string asAlarmId  告警任务ID\n      */\n\n  createAsAlarm (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAsAlarm\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling createAsAlarm\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createAsAlarm\"\n      )\n    }\n    if (opts.metricType === undefined || opts.metricType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metricType' when calling createAsAlarm\"\n      )\n    }\n    if (opts.metricName === undefined || opts.metricName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metricName' when calling createAsAlarm\"\n      )\n    }\n    if (opts.period === undefined || opts.period === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.period' when calling createAsAlarm\"\n      )\n    }\n    if (opts.statistic === undefined || opts.statistic === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.statistic' when calling createAsAlarm\"\n      )\n    }\n    if (opts.threshold === undefined || opts.threshold === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.threshold' when calling createAsAlarm\"\n      )\n    }\n    if (opts.comparison === undefined || opts.comparison === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.comparison' when calling createAsAlarm\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.agId !== undefined && opts.agId !== null) {\n      postBody['agId'] = opts.agId\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.metricType !== undefined && opts.metricType !== null) {\n      postBody['metricType'] = opts.metricType\n    }\n    if (opts.metricName !== undefined && opts.metricName !== null) {\n      postBody['metricName'] = opts.metricName\n    }\n    if (opts.namespace !== undefined && opts.namespace !== null) {\n      postBody['namespace'] = opts.namespace\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.statistic !== undefined && opts.statistic !== null) {\n      postBody['statistic'] = opts.statistic\n    }\n    if (opts.threshold !== undefined && opts.threshold !== null) {\n      postBody['threshold'] = opts.threshold\n    }\n    if (opts.comparison !== undefined && opts.comparison !== null) {\n      postBody['comparison'] = opts.comparison\n    }\n    if (opts.hitCount !== undefined && opts.hitCount !== null) {\n      postBody['hitCount'] = opts.hitCount\n    }\n    if (opts.asRuleId !== undefined && opts.asRuleId !== null) {\n      postBody['asRuleId'] = opts.asRuleId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAsAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asAlarms',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改告警任务\n- 所有参数取值为字符串类型的都严格区分大小写\n- 所有告警任务不允许修改高可用组\n- 所有告警任务不允许修改监控类型\n- 目标跟踪规则生成的告警任务不允许修改任何内容\n- 监控类型为自定义监控的告警任务不允许修改命名空间\n- 步进规则绑定的告警任务不允许修改报警指标相关内容\n- 所有参数都为非必传，但是至少需要传入一个参数，否则报错\n- 伸缩功能开启或者关闭的情况下，都支持调用此接口\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.asAlarmId - 告警任务ID\n      * @param {string} [opts.name] - 名称，长度为1~32个字符，只允许中文、数字、大小写字母、英文下划线（_）、连字符（-）  optional\n      * @param {string} [opts.description] - 描述，最大长度为256个字符  optional\n      * @param {string} [opts.metricName] - 监控项，云主机监控指标说明：https://docs.jdcloud.com/cn/monitoring/vm\n目前支持的指标项如下:\n- &#x60;cpu_util&#x60;: &#x60;CPU使用率&#x60;\n- &#x60;memory.usage&#x60;: &#x60;内存使用率&#x60;\n- &#x60;vm.disk.bytes.read&#x60;: &#x60;磁盘读吞吐量(host)&#x60;\n- &#x60;vm.disk.bytes.write&#x60;: &#x60;磁盘写吞吐量(host)&#x60;\n- &#x60;vm.network.bytes.incoming&#x60;: &#x60;网络进速率(host)&#x60;\n- &#x60;vm.network.bytes.outgoing&#x60;: &#x60;网络出速率(host)&#x60;\n  optional\n      * @param {integer} [opts.period] - 监控项数据统计周期，单位分钟，取值范围：[&#x60;1&#x60;,&#x60;2&#x60;,&#x60;5&#x60;,&#x60;10&#x60;,&#x60;15&#x60;,&#x60;30&#x60;,&#x60;60&#x60;]  optional\n      * @param {string} [opts.statistic] - 统计监控项数据的方法\n- 系统监控取值范围：[&#x60;avg&#x60;,&#x60;max&#x60;,&#x60;min&#x60;]\n- 自定义监控取值范围：[&#x60;avg&#x60;]\n  optional\n      * @param {number} [opts.threshold] - 监控指标的阈值，必须大于0，阈值单位与监控项单位一致  optional\n      * @param {string} [opts.comparison] - 对监控项阈值的判断方式，取值范围：[&#x60;gte&#x60;:&#x60;大于等于&#x60;,&#x60;lte&#x60;:&#x60;小于等于&#x60;,&#x60;gt&#x60;:&#x60;大于&#x60;,&#x60;lt&#x60;:&#x60;小于&#x60;]  optional\n      * @param {integer} [opts.hitCount] - 触发告警需要满足阈值表达式的次数，取值范围：[&#x60;1&#x60;,&#x60;2&#x60;,&#x60;3&#x60;,&#x60;5&#x60;,&#x60;10&#x60;,&#x60;15&#x60;,&#x60;30&#x60;,&#x60;60&#x60;]  optional\n      * @param {string} [opts.asRuleId] - 伸缩规则ID，更新告警任务关联的伸缩规则，目前只支持 &#x60;asRuleType&#x60; 为 &#x60;Simple&#x60; 的伸缩规则  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateAsAlarm (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateAsAlarm\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.asAlarmId === undefined || opts.asAlarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.asAlarmId' when calling updateAsAlarm\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.metricName !== undefined && opts.metricName !== null) {\n      postBody['metricName'] = opts.metricName\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.statistic !== undefined && opts.statistic !== null) {\n      postBody['statistic'] = opts.statistic\n    }\n    if (opts.threshold !== undefined && opts.threshold !== null) {\n      postBody['threshold'] = opts.threshold\n    }\n    if (opts.comparison !== undefined && opts.comparison !== null) {\n      postBody['comparison'] = opts.comparison\n    }\n    if (opts.hitCount !== undefined && opts.hitCount !== null) {\n      postBody['hitCount'] = opts.hitCount\n    }\n    if (opts.asRuleId !== undefined && opts.asRuleId !== null) {\n      postBody['asRuleId'] = opts.asRuleId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      asAlarmId: opts.asAlarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateAsAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asAlarms/{asAlarmId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除告警任务\n- 所有参数取值为字符串类型的都严格区分大小写\n- 伸缩功能开启或者关闭的情况下，都支持调用此接口\n- 目标跟踪规则生成的告警任务不允许删除\n- 告警任务关联简单规则，告警任务可以删除\n- 告警任务关联步进规则，告警任务不允许删除，但是可以删除步进规则，删除步进规则后，关联的告警任务会保留\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.asAlarmId - 告警任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteAsAlarm (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAsAlarm\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.asAlarmId === undefined || opts.asAlarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.asAlarmId' when calling deleteAsAlarm\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      asAlarmId: opts.asAlarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAsAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asAlarms/{asAlarmId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用告警任务\n- 所有参数取值为字符串类型的都严格区分大小写\n- 伸缩功能开启或者关闭的情况下，都支持调用此接口\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.asAlarmId - 告警任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableAsAlarm (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableAsAlarm\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.asAlarmId === undefined || opts.asAlarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.asAlarmId' when calling disableAsAlarm\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      asAlarmId: opts.asAlarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableAsAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asAlarms/{asAlarmId}:disable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用告警任务\n- 所有参数取值为字符串类型的都严格区分大小写\n- 伸缩功能关闭的情况下，不支持调用此接口\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.asAlarmId - 告警任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableAsAlarm (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableAsAlarm\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.asAlarmId === undefined || opts.asAlarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.asAlarmId' when calling enableAsAlarm\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      asAlarmId: opts.asAlarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableAsAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asAlarms/{asAlarmId}:enable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看定时任务\n- 所有参数取值为字符串类型的都严格区分大小写\n- 所有参数都为非必传，但是至少需要传入一个参数，否则报错\n- 伸缩功能开启或者关闭的情况下，都支持调用此接口\n- 定时任务如果关联伸缩规则，只能关联简单规则，且一个定时任务只能关联一个简单规则\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码，默认为&#x60;1&#x60;，最小值必须大于0  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为&#x60;20&#x60;，取值范围[&#x60;10&#x60; ~ &#x60;100&#x60;]  optional\n      * @param {filter} [opts.filters] - 支持使用以下关键字进行过滤查询\n- &#x60;agId&#x60;: 高可用组ID，精确匹配，支持多个\n- &#x60;asCronId&#x60;: 定时任务ID，精确匹配，支持多个\n- &#x60;name&#x60;: 定时任务名称，模糊匹配，支持单个\n  optional\n      * @param {sort} [opts.sorts] - 排序条件列表，目前只支持单个排序条件，不支持多个排序条件，默认按照 &#x60;createTime&#x60; 降序排序\n支持使用以下关键字进行排序\n- &#x60;createTime&#x60;: 创建时间\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  本次查询可匹配到的总记录数，使用者需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      * @param asCronInfo asCrons\n      */\n\n  describeAsCrons (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAsCrons\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAsCrons with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asCrons',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建定时任务\n- 所有参数取值为字符串类型的都严格区分大小写\n- 伸缩功能关闭的情况下，不支持调用此接口\n- 定时任务如果关联伸缩规则，只能关联简单规则，且一个定时任务只能关联一个简单规则\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组ID\n      * @param {string} opts.name - 名称，长度为1~32个字符，只允许中文、数字、大小写字母、英文下划线（_）、连字符（-）\n      * @param {string} [opts.description] - 描述，最大长度为256个字符  optional\n      * @param {string} [opts.asRuleId] - 可以为定时任务绑定伸缩规则，目前只支持简单规则，即 &#x60;asRuleType&#x60; 为 &#x60;Simple&#x60; 的伸缩规则\n- 当指定参数&#x60;asRuleId&#x60;时，不允许指定参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;\n  optional\n      * @param {integer} [opts.minSize] - 设置伸缩组最小实例数，必须大于等于0，如果没有设置此参数，则此参数将会保存为 -1\n- 如果没有指定参数&#x60;asRuleId&#x60;，则参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;三者至少填写一个\n  optional\n      * @param {integer} [opts.maxSize] - 设置伸缩组最大实例数，必须大于等于0，如果没有设置此参数，则此参数将会保存为 -1\n- 如果没有指定参数&#x60;asRuleId&#x60;，则参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;三者至少填写一个\n  optional\n      * @param {integer} [opts.desiredCapacity] - 设置伸缩组期望实例数，必须大于等于0，如果没有设置此参数，则此参数将会保存为 -1\n- 如果没有指定参数&#x60;asRuleId&#x60;，则参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;三者至少填写一个\n  optional\n      * @param {string} opts.launchTime - 定时任务触发的时间点\n时间格式：&#x60;2023-05-10 10:10:00&#x60;，目前只支持到分钟，秒数会被忽略，但是需要严格按照此时间格式填写\n- 如果未指定&#x60;repeatType&#x60;，则按指定的日期和时间执行一次\n- 如果指定了&#x60;repeatType&#x60;，则此属性指定的时间点，表示从这个时间之后开始按照重复周期执行定时任务\n时间限制如下：\n- 时间必须大于当前时间\n- 不能填写当前时间起30日后的时间\n- 时间必须小于&#x60;repeatEndTime&#x60;\n\n      * @param {string} [opts.repeatType] - 重复执行定时任务的类型，如果指定了&#x60;repeatType&#x60;，则&#x60;repeatValue&#x60;必填\n取值范围：[&#x60;Daily&#x60;,&#x60;Weekly&#x60;,&#x60;Monthly&#x60;,&#x60;Cron&#x60;]\n- Daily：每多少天重复执行一次定时任务\n- Weekly：每周指定几天重复执行一次定时任务\n- Monthly：每月内指定几天重复执行一次定时任务\n- Cron：按照指定的Cron表达式执行定时任务\n  optional\n      * @param {string} [opts.repeatValue] - 重复执行定时任务的数值，如果指定了&#x60;repeatType&#x60;，则&#x60;repeatValue&#x60;必填\n- &#x60;repeatType&#x60;取值为&#x60;Daily&#x60;时，只能填一个值，取值范围：[ &#x60;1&#x60; ~ &#x60;31&#x60; ]，表示：每几天执行\n- &#x60;repeatType&#x60;取值为&#x60;Weekly&#x60;时，可以填入多个值，填多个值时使用半角逗号（,）分隔。取值范围：[&#x60;0&#x60;,&#x60;1&#x60;,&#x60;2&#x60;,&#x60;3&#x60;,&#x60;4&#x60;,&#x60;5&#x60;,&#x60;6&#x60;]，分别对应：周日、周一、周二、周三、周四、周五、周六，表示：每周几执行\n- &#x60;repeatType&#x60;取值为&#x60;Monthly&#x60;时，格式为A-B。A、B的取值范围：[ &#x60;1&#x60; ~ &#x60;31&#x60; ]，并且B必须大于等于A，表示：每个月的几号到几号执行\n- &#x60;repeatType&#x60;取值为&#x60;Cron&#x60;时，必须填写Cron表达式，不支持秒，最小单位为分钟\n\n支持的Cron格式如下：\n*    *    *    *    *   从左到右依次表示：&#x60;[分] [小时] [日] [月] [周]&#x60;\n\n- 分，取值范围：[&#x60;0&#x60; ~ &#x60;59&#x60;]，允许的连接符号取值范围：[&#x60;*&#x60; &#x60;/&#x60; &#x60;,&#x60; &#x60;-&#x60;]\n- 小时，取值范围：[&#x60;0&#x60; ~ &#x60;23&#x60;]，允许的连接符号取值范围：[&#x60;*&#x60; &#x60;/&#x60; &#x60;,&#x60; &#x60;-&#x60;]\n- 日，取值范围：[&#x60;1&#x60; ~ &#x60;31&#x60;]，允许的连接符号取值范围：[&#x60;*&#x60; &#x60;/&#x60; &#x60;,&#x60; &#x60;-&#x60; &#x60;?&#x60;]\n- 月，取值范围：[&#x60;1&#x60; ~ &#x60;12&#x60;]，允许的连接符号取值范围：[&#x60;*&#x60; &#x60;/&#x60; &#x60;,&#x60; &#x60;-&#x60;]\n- 周，取值范围：[&#x60;0&#x60; ~ &#x60;6&#x60;]，允许的连接符号取值范围：[&#x60;*&#x60; &#x60;/&#x60; &#x60;,&#x60; &#x60;-&#x60; &#x60;?&#x60;]\n\n符号解析：&#x60;*&#x60;表示任意值，&#x60;/&#x60;表示步长，&#x60;,&#x60;表示多个值，&#x60;-&#x60;表示范围，&#x60;?&#x60;表示不指定值\n\n示例：0 10 * * *  表示：每天10点执行\n  optional\n      * @param {string} [opts.repeatEndTime] - 重复执行定时任务的结束时间\n默认为空，表示不限制结束时间，一直重复执行\n时间格式：&#x60;2023-05-10 10:10:00&#x60;，目前只支持到分钟，秒数会被忽略，但是需要严格按照此时间格式填写\n时间限制如下：\n- 时间必须大于&#x60;launchTime&#x60;\n  optional\n      * @param {integer} [opts.launchExpirationTime] - 定时任务触发操作失败后，在此时间内重试，单位为秒，默认为600，取值范围：[&#x60;0&#x60; ~ &#x60;1800&#x60;]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string asCronId  定时任务ID\n      */\n\n  createAsCron (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAsCron\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling createAsCron\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createAsCron\"\n      )\n    }\n    if (opts.launchTime === undefined || opts.launchTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.launchTime' when calling createAsCron\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.agId !== undefined && opts.agId !== null) {\n      postBody['agId'] = opts.agId\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.asRuleId !== undefined && opts.asRuleId !== null) {\n      postBody['asRuleId'] = opts.asRuleId\n    }\n    if (opts.minSize !== undefined && opts.minSize !== null) {\n      postBody['minSize'] = opts.minSize\n    }\n    if (opts.maxSize !== undefined && opts.maxSize !== null) {\n      postBody['maxSize'] = opts.maxSize\n    }\n    if (opts.desiredCapacity !== undefined && opts.desiredCapacity !== null) {\n      postBody['desiredCapacity'] = opts.desiredCapacity\n    }\n    if (opts.launchTime !== undefined && opts.launchTime !== null) {\n      postBody['launchTime'] = opts.launchTime\n    }\n    if (opts.repeatType !== undefined && opts.repeatType !== null) {\n      postBody['repeatType'] = opts.repeatType\n    }\n    if (opts.repeatValue !== undefined && opts.repeatValue !== null) {\n      postBody['repeatValue'] = opts.repeatValue\n    }\n    if (opts.repeatEndTime !== undefined && opts.repeatEndTime !== null) {\n      postBody['repeatEndTime'] = opts.repeatEndTime\n    }\n    if (\n      opts.launchExpirationTime !== undefined &&\n      opts.launchExpirationTime !== null\n    ) {\n      postBody['launchExpirationTime'] = opts.launchExpirationTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAsCron with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asCrons',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改定时任务\n- 所有参数取值为字符串类型的都严格区分大小写\n- 定时任务换绑高可用组，如果目前伸缩方式是执行简单规则，那么需要重新从新的高可用组中选择一个简单规则\n- 伸缩功能开启或者关闭的情况下，都支持调用此接口\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.asCronId - 定时任务ID\n      * @param {string} [opts.agId] - 高可用组ID  optional\n      * @param {string} [opts.name] - 名称，长度为1~32个字符，只允许中文、数字、大小写字母、英文下划线（_）、连字符（-）  optional\n      * @param {string} [opts.description] - 描述，最大长度为256个字符  optional\n      * @param {string} [opts.asRuleId] - 可以为定时任务绑定伸缩规则，目前只支持简单规则，即 &#x60;asRuleType&#x60; 为 &#x60;Simple&#x60; 的伸缩规则\n- 如果指定了参数&#x60;asRuleId&#x60;，则不允许指定参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;\n- 如果指定了参数&#x60;asRuleId&#x60;，并且当前伸缩方式为执行简单规则，那么表示更换定时任务关联的伸缩规则\n- 如果指定了参数&#x60;asRuleId&#x60;，但是当前伸缩方式为修改伸缩组属性[&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;]，那么将会清空&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;的值，同时设置&#x60;asRuleId&#x60;的值\n  optional\n      * @param {integer} [opts.minSize] - 设置伸缩组最小实例数，必须大于等于0，如果没有设置此参数，则此参数将会保存为 -1\n- 如果指定了参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;三者任意一个或多个，则不允许指定参数&#x60;asRuleId&#x60;\n- 如果指定了参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;三者任意一个或多个，并且当前伸缩方式为修改伸缩组属性[&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;]，那么将会更新&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;指定的参数值\n- 如果指定了参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;三者任意一个或多个，但是当前伸缩方式为执行简单规则，那么将会清空&#x60;asRuleId&#x60;的值，同时设置&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;指定的参数值\n  optional\n      * @param {integer} [opts.maxSize] - 设置伸缩组最大实例数，必须大于等于0，如果没有设置此参数，则此参数将会保存为 -1\n- 如果指定了参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;三者任意一个或多个，则不允许指定参数&#x60;asRuleId&#x60;\n- 如果指定了参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;三者任意一个或多个，并且当前伸缩方式为修改伸缩组属性[&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;]，那么将会更新&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;指定的参数值\n- 如果指定了参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;三者任意一个或多个，但是当前伸缩方式为执行简单规则，那么将会清空&#x60;asRuleId&#x60;的值，同时设置&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;指定的参数值\n  optional\n      * @param {integer} [opts.desiredCapacity] - 设置伸缩组期望实例数，必须大于等于0，如果没有设置此参数，则此参数将会保存为 -1\n- 如果指定了参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;三者任意一个或多个，则不允许指定参数&#x60;asRuleId&#x60;\n- 如果指定了参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;三者任意一个或多个，并且当前伸缩方式为修改伸缩组属性[&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;]，那么将会更新&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;指定的参数值\n- 如果指定了参数&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;三者任意一个或多个，但是当前伸缩方式为执行简单规则，那么将会清空&#x60;asRuleId&#x60;的值，同时设置&#x60;minSize&#x60;,&#x60;maxSize&#x60;,&#x60;desiredCapacity&#x60;指定的参数值\n  optional\n      * @param {string} [opts.launchTime] - 定时任务触发的时间点\n时间格式：&#x60;2023-05-10 10:10:00&#x60;，目前只支持到分钟，秒数会被忽略，但是需要严格按照此时间格式填写\n- 如果未指定&#x60;repeatType&#x60;，则按指定的日期和时间执行一次\n- 如果指定了&#x60;repeatType&#x60;，则此属性指定的时间点，表示从这个时间之后开始按照重复周期执行定时任务\n时间限制如下：\n- 时间必须大于当前时间\n- 不能填写当前时间起30日后的时间\n- 时间必须小于&#x60;repeatEndTime&#x60;\n  optional\n      * @param {string} [opts.repeatType] - 重复执行定时任务的类型，如果指定了&#x60;repeatType&#x60;，则&#x60;repeatValue&#x60;必填\n取值范围：[&#x60;Daily&#x60;,&#x60;Weekly&#x60;,&#x60;Monthly&#x60;,&#x60;Cron&#x60;]\n- Daily：每多少天重复执行一次定时任务\n- Weekly：每周指定几天重复执行一次定时任务\n- Monthly：每月内指定几天重复执行一次定时任务\n- Cron：按照指定的Cron表达式执行定时任务\n  optional\n      * @param {string} [opts.repeatValue] - 重复执行定时任务的数值，如果指定了&#x60;repeatType&#x60;，则&#x60;repeatValue&#x60;必填\n- &#x60;repeatType&#x60;取值为&#x60;Daily&#x60;时，只能填一个值，取值范围：[ &#x60;1&#x60; ~ &#x60;31&#x60; ]，表示：每几天执行\n- &#x60;repeatType&#x60;取值为&#x60;Weekly&#x60;时，可以填入多个值，填多个值时使用半角逗号（,）分隔。取值范围：[&#x60;0&#x60;,&#x60;1&#x60;,&#x60;2&#x60;,&#x60;3&#x60;,&#x60;4&#x60;,&#x60;5&#x60;,&#x60;6&#x60;]，分别对应：周日、周一、周二、周三、周四、周五、周六，表示：每周几执行\n- &#x60;repeatType&#x60;取值为&#x60;Monthly&#x60;时，格式为A-B。A、B的取值范围：[ &#x60;1&#x60; ~ &#x60;31&#x60; ]，并且B必须大于等于A，表示：每个月的几号到几号执行\n- &#x60;repeatType&#x60;取值为&#x60;Cron&#x60;时，必须填写Cron表达式，不支持秒，最小单位为分钟\n\n支持的Cron格式如下：\n*    *    *    *    *   从左到右依次表示：&#x60;[分] [小时] [日] [月] [周]&#x60;\n\n- 分，取值范围：[&#x60;0&#x60; ~ &#x60;59&#x60;]，允许的连接符号取值范围：[&#x60;*&#x60; &#x60;/&#x60; &#x60;,&#x60; &#x60;-&#x60;]\n- 小时，取值范围：[&#x60;0&#x60; ~ &#x60;23&#x60;]，允许的连接符号取值范围：[&#x60;*&#x60; &#x60;/&#x60; &#x60;,&#x60; &#x60;-&#x60;]\n- 日，取值范围：[&#x60;1&#x60; ~ &#x60;31&#x60;]，允许的连接符号取值范围：[&#x60;*&#x60; &#x60;/&#x60; &#x60;,&#x60; &#x60;-&#x60; &#x60;?&#x60;]\n- 月，取值范围：[&#x60;1&#x60; ~ &#x60;12&#x60;]，允许的连接符号取值范围：[&#x60;*&#x60; &#x60;/&#x60; &#x60;,&#x60; &#x60;-&#x60;]\n- 周，取值范围：[&#x60;0&#x60; ~ &#x60;6&#x60;]，允许的连接符号取值范围：[&#x60;*&#x60; &#x60;/&#x60; &#x60;,&#x60; &#x60;-&#x60; &#x60;?&#x60;]\n\n符号解析：&#x60;*&#x60;表示任意值，&#x60;/&#x60;表示步长，&#x60;,&#x60;表示多个值，&#x60;-&#x60;表示范围，&#x60;?&#x60;表示不指定值\n\n示例：0 10 * * *  表示：每天10点执行\n  optional\n      * @param {string} [opts.repeatEndTime] - 重复执行定时任务的结束时间\n默认为空，表示不限制结束时间，一直重复执行\n时间格式：&#x60;2023-05-10 10:10:00&#x60;，目前只支持到分钟，秒数会被忽略，但是需要严格按照此时间格式填写\n时间限制如下：\n- 时间必须大于&#x60;launchTime&#x60;\n  optional\n      * @param {integer} [opts.launchExpirationTime] - 定时任务触发操作失败后，在此时间内重试，单位为秒，取值范围：[&#x60;0&#x60; ~ &#x60;1800&#x60;]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateAsCron (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateAsCron\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.asCronId === undefined || opts.asCronId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.asCronId' when calling updateAsCron\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.agId !== undefined && opts.agId !== null) {\n      postBody['agId'] = opts.agId\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.asRuleId !== undefined && opts.asRuleId !== null) {\n      postBody['asRuleId'] = opts.asRuleId\n    }\n    if (opts.minSize !== undefined && opts.minSize !== null) {\n      postBody['minSize'] = opts.minSize\n    }\n    if (opts.maxSize !== undefined && opts.maxSize !== null) {\n      postBody['maxSize'] = opts.maxSize\n    }\n    if (opts.desiredCapacity !== undefined && opts.desiredCapacity !== null) {\n      postBody['desiredCapacity'] = opts.desiredCapacity\n    }\n    if (opts.launchTime !== undefined && opts.launchTime !== null) {\n      postBody['launchTime'] = opts.launchTime\n    }\n    if (opts.repeatType !== undefined && opts.repeatType !== null) {\n      postBody['repeatType'] = opts.repeatType\n    }\n    if (opts.repeatValue !== undefined && opts.repeatValue !== null) {\n      postBody['repeatValue'] = opts.repeatValue\n    }\n    if (opts.repeatEndTime !== undefined && opts.repeatEndTime !== null) {\n      postBody['repeatEndTime'] = opts.repeatEndTime\n    }\n    if (\n      opts.launchExpirationTime !== undefined &&\n      opts.launchExpirationTime !== null\n    ) {\n      postBody['launchExpirationTime'] = opts.launchExpirationTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      asCronId: opts.asCronId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateAsCron with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asCrons/{asCronId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除定时任务\n- 所有参数取值为字符串类型的都严格区分大小写\n- 伸缩功能开启或者关闭的情况下，都支持调用此接口\n- 定时任务关联简单规则，定时任务可以删除\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.asCronId - 定时任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteAsCron (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAsCron\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.asCronId === undefined || opts.asCronId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.asCronId' when calling deleteAsCron\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      asCronId: opts.asCronId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAsCron with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asCrons/{asCronId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用定时任务\n- 所有参数取值为字符串类型的都严格区分大小写\n- 伸缩功能开启或者关闭的情况下，都支持调用此接口\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.asCronId - 定时任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableAsCron (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableAsCron\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.asCronId === undefined || opts.asCronId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.asCronId' when calling disableAsCron\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      asCronId: opts.asCronId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableAsCron with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asCrons/{asCronId}:disable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用定时任务\n- 所有参数取值为字符串类型的都严格区分大小写\n- 伸缩功能关闭的情况下，不支持调用此接口\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.asCronId - 定时任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableAsCron (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableAsCron\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.asCronId === undefined || opts.asCronId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.asCronId' when calling enableAsCron\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      asCronId: opts.asCronId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableAsCron with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asCrons/{asCronId}:enable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启弹性伸缩功能\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组 ID\n      * @param {boolean} [opts.isManaged] - 高可用中实例是否托管给弹性伸缩组，托管后缩容时可以删除该实例，默认false  optional\n      * @param {autoscalingSpec} [opts.autoscalingSpec] - 伸缩组详细信息，如果高可用组已开启过伸缩功能，该参数将被忽略  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableAutoScaling (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableAutoScaling\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling enableAutoScaling\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.isManaged !== undefined && opts.isManaged !== null) {\n      postBody['isManaged'] = opts.isManaged\n    }\n    if (opts.autoscalingSpec !== undefined && opts.autoscalingSpec !== null) {\n      postBody['autoscalingSpec'] = opts.autoscalingSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      agId: opts.agId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableAutoScaling with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/autoScaling/{agId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭弹性伸缩组\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableAutoScaling (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableAutoScaling\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling disableAutoScaling\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      agId: opts.agId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableAutoScaling with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/autoScaling/{agId}:disable',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新弹性伸缩组\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组 ID\n      * @param {autoscalingSpecByUpdate} opts.autoscalingSpec - 伸缩组详细信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateAutoScaling (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateAutoScaling\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling updateAutoScaling\"\n      )\n    }\n    if (opts.autoscalingSpec === undefined || opts.autoscalingSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.autoscalingSpec' when calling updateAutoScaling\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.autoscalingSpec !== undefined && opts.autoscalingSpec !== null) {\n      postBody['autoscalingSpec'] = opts.autoscalingSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      agId: opts.agId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateAutoScaling with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/autoScaling/{agId}:updateAutoScaling',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  弹性伸缩组内资源托管设置\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组 ID\n      * @param {boolean} opts.isManaged - 实例是否托管给弹性伸缩组，托管后缩容时可以删除该实例。\n      * @param {array} [opts.instanceIds] - 资源ID数组。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstancesManaged (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstancesManaged\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling modifyInstancesManaged\"\n      )\n    }\n    if (opts.isManaged === undefined || opts.isManaged === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.isManaged' when calling modifyInstancesManaged\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.isManaged !== undefined && opts.isManaged !== null) {\n      postBody['isManaged'] = opts.isManaged\n    }\n    if (opts.instanceIds !== undefined && opts.instanceIds !== null) {\n      postBody['instanceIds'] = opts.instanceIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      agId: opts.agId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstancesManaged with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/autoScaling/{agId}:modifyInstancesManaged',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  弹性伸缩组内资源保护设置\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组 ID\n      * @param {boolean} opts.isProtected - 实例在弹性伸缩组是否为保护状态，保护状态的实例缩容时不可以删除。\n      * @param {array} [opts.instanceIds] - 资源ID数组。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstancesProtected (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstancesProtected\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling modifyInstancesProtected\"\n      )\n    }\n    if (opts.isProtected === undefined || opts.isProtected === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.isProtected' when calling modifyInstancesProtected\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.isProtected !== undefined && opts.isProtected !== null) {\n      postBody['isProtected'] = opts.isProtected\n    }\n    if (opts.instanceIds !== undefined && opts.instanceIds !== null) {\n      postBody['instanceIds'] = opts.instanceIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      agId: opts.agId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstancesProtected with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/autoScaling/{agId}:modifyInstancesProtected',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看伸缩规则\n- 所有参数取值为字符串类型的都严格区分大小写\n- 伸缩功能开启或者关闭的情况下，都支持调用此接口\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组ID\n      * @param {integer} [opts.pageNumber] - 页码，默认为&#x60;1&#x60;，最小值必须大于0  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为&#x60;20&#x60;，取值范围[&#x60;10&#x60; ~ &#x60;100&#x60;]  optional\n      * @param {filter} [opts.filters] - 支持使用以下关键字进行过滤查询\n- &#x60;asRuleId&#x60;: 伸缩规则ID，精确匹配，支持多个\n- &#x60;name&#x60;: 伸缩规则名称，模糊匹配，支持单个\n- &#x60;asRuleType&#x60;: 伸缩规则类型，精确匹配，支持多个，取值范围：[&#x60;Simple&#x60;,&#x60;Target&#x60;,&#x60;Step&#x60;]\n  optional\n      * @param {sort} [opts.sorts] - 排序条件列表，目前只支持单个排序条件，不支持多个排序条件，默认按照 &#x60;createTime&#x60; 降序排序\n支持使用以下关键字进行排序\n- &#x60;createTime&#x60;: 创建时间\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  本次查询可匹配到的总记录数，使用者需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      * @param asRuleInfo asRules\n      */\n\n  describeAsRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAsRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling describeAsRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.agId !== undefined && opts.agId !== null) {\n      queryParams['agId'] = opts.agId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAsRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asRules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建伸缩规则\n- 所有参数取值为字符串类型的都严格区分大小写\n- 伸缩功能关闭的情况下，不支持调用此接口\n- 目标跟踪规则创建后会自动生成两个告警任务，分别用于扩容和缩容\n- 步进规则必须绑定一个告警任务\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组ID\n      * @param {string} opts.name - 伸缩规则名称，长度为1~32个字符，只允许中文、数字、大小写字母、英文下划线（_）、连字符（-）\n      * @param {string} [opts.description] - 伸缩规则描述，最大长度为256个字符  optional\n      * @param {string} opts.asRuleType - 伸缩规则类型，取值范围：[&#x60;Simple&#x60;,&#x60;Target&#x60;,&#x60;Step&#x60;]\n- &#x60;Simple&#x60;：简单规则，直接设置调整方式和调整值\n- &#x60;Target&#x60;：目标跟踪规则，根据监控项和目标值计算需要扩缩容的实例数量，尽量将监控项的指标值维持在目标值和目标值的90%之间\n- &#x60;Step&#x60;：步进规则，根据阈值和指标值提供分步扩展方式\n\n      * @param {createSimpleAsRuleSpec} [opts.simpleAsRuleSpec] - 简单规则相关参数，当&#x60;asRuleType&#x60;为&#x60;Simple&#x60;时必填  optional\n      * @param {createTargetAsRuleSpec} [opts.targetAsRuleSpec] - 目标跟踪规则相关参数，当&#x60;asRuleType&#x60;为&#x60;Target&#x60;时必填  optional\n      * @param {createStepAsRuleSpec} [opts.stepAsRuleSpec] - 步进规则相关参数，当&#x60;asRuleType&#x60;为&#x60;Step&#x60;时必填  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string asRuleId  伸缩规则ID\n      */\n\n  createAsRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAsRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling createAsRule\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createAsRule\"\n      )\n    }\n    if (opts.asRuleType === undefined || opts.asRuleType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.asRuleType' when calling createAsRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.agId !== undefined && opts.agId !== null) {\n      postBody['agId'] = opts.agId\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.asRuleType !== undefined && opts.asRuleType !== null) {\n      postBody['asRuleType'] = opts.asRuleType\n    }\n    if (opts.simpleAsRuleSpec !== undefined && opts.simpleAsRuleSpec !== null) {\n      postBody['simpleAsRuleSpec'] = opts.simpleAsRuleSpec\n    }\n    if (opts.targetAsRuleSpec !== undefined && opts.targetAsRuleSpec !== null) {\n      postBody['targetAsRuleSpec'] = opts.targetAsRuleSpec\n    }\n    if (opts.stepAsRuleSpec !== undefined && opts.stepAsRuleSpec !== null) {\n      postBody['stepAsRuleSpec'] = opts.stepAsRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAsRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改伸缩规则\n- 所有参数取值为字符串类型的都严格区分大小写\n- 所有伸缩规则不允许更换高可用组\n- 所有伸缩规则不允许修改伸缩规则类型\n- 步进规则不允许修改监控类型\n- 所有参数都为非必传，但是至少需要传入一个参数，否则报错\n- 伸缩功能开启或者关闭的情况下，都支持调用此接口\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.asRuleId - 伸缩规则ID\n      * @param {string} [opts.name] - 伸缩规则名称，长度为1~32个字符，只允许中文、数字、大小写字母、英文下划线（_）、连字符（-）  optional\n      * @param {string} [opts.description] - 伸缩规则描述，最大长度为256个字符  optional\n      * @param {updateSimpleAsRuleSpec} [opts.simpleAsRuleSpec] - 简单规则相关参数，当待修改的规则类型为&#x60;Simple&#x60;时，填写此参数才有效  optional\n      * @param {updateTargetAsRuleSpec} [opts.targetAsRuleSpec] - 目标跟踪规则相关参数，当待修改的规则类型为&#x60;Target&#x60;时，填写此参数才有效  optional\n      * @param {updateStepAsRuleSpec} [opts.stepAsRuleSpec] - 步进规则相关参数，当待修改的规则类型为&#x60;Step&#x60;时，填写此参数才有效  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateAsRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateAsRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.asRuleId === undefined || opts.asRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.asRuleId' when calling updateAsRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.simpleAsRuleSpec !== undefined && opts.simpleAsRuleSpec !== null) {\n      postBody['simpleAsRuleSpec'] = opts.simpleAsRuleSpec\n    }\n    if (opts.targetAsRuleSpec !== undefined && opts.targetAsRuleSpec !== null) {\n      postBody['targetAsRuleSpec'] = opts.targetAsRuleSpec\n    }\n    if (opts.stepAsRuleSpec !== undefined && opts.stepAsRuleSpec !== null) {\n      postBody['stepAsRuleSpec'] = opts.stepAsRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      asRuleId: opts.asRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateAsRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asRules/{asRuleId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除伸缩规则\n- 所有参数取值为字符串类型的都严格区分大小写\n- 伸缩功能开启或者关闭的情况下，都支持调用此接口\n- 删除目标跟踪规则后，会自动删除目标跟踪规则下的所有告警规则\n- 删除步进规则后，关联的告警规则会保留\n- 简单规则关联告警任务或者定时任务时，不允许删除简单规则\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.asRuleId - 伸缩规则ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteAsRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAsRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.asRuleId === undefined || opts.asRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.asRuleId' when calling deleteAsRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      asRuleId: opts.asRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAsRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asRules/{asRuleId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  执行伸缩规则\n- 所有参数取值为字符串类型的都严格区分大小写\n- 只支持手动执行简单规则\n- 伸缩功能关闭的情况下，不支持调用此接口\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.asRuleId - 伸缩规则ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  executeAsRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  executeAsRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.asRuleId === undefined || opts.asRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.asRuleId' when calling executeAsRule\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      asRuleId: opts.asRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call executeAsRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/asRules/{asRuleId}:execute',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  使用过滤条件查询一个或多个高可用组\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - agName - ag名字，支持模糊匹配\nagId - ag id，精确匹配\ninstanceTemplateId - 实例模板id，精确匹配\nvpcId - vpc id，精确匹配\nplacementType - placement type，放置策略\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param availabilityGroup ags\n      * @param integer totalCount\n      */\n\n  describeAgs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAgs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAgs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/availabilityGroups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个高可用组\n      * @param {Object} opts - parameters\n      * @param {array} [opts.azs] - 支持的可用区，最少一个  optional\n      * @param {string} opts.agName - 高可用组名称，只支持中文、数字、大小写字母、英文下划线 “_” 及中划线 “-”，且不能超过 32 字符\n      * @param {string} [opts.agType] - 高可用组资源类型，支持vm  optional\n      * @param {string} [opts.instanceTemplateId] - 实例模板的ID  optional\n      * @param {string} [opts.description] - 描述，长度不超过 256 字符  optional\n      * @param {string} [opts.configurationType] - 高可用组配置类型，支持strict(关联模板型)、loose(自定义配置型)  optional\n      * @param {string} [opts.placementType] - 高可用资源放置类型，支持fd、switch、host  optional\n      * @param {autoscalingSpec} [opts.autoscalingSpec] - 伸缩组详细信息，当创建时选择打开弹性伸缩功能时需要传该参数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string agId  创建成功的高可用组 ID\n      */\n\n  createAg (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAg\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agName === undefined || opts.agName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agName' when calling createAg\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.azs !== undefined && opts.azs !== null) {\n      postBody['azs'] = opts.azs\n    }\n    if (opts.agName !== undefined && opts.agName !== null) {\n      postBody['agName'] = opts.agName\n    }\n    if (opts.agType !== undefined && opts.agType !== null) {\n      postBody['agType'] = opts.agType\n    }\n    if (\n      opts.instanceTemplateId !== undefined &&\n      opts.instanceTemplateId !== null\n    ) {\n      postBody['instanceTemplateId'] = opts.instanceTemplateId\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (\n      opts.configurationType !== undefined &&\n      opts.configurationType !== null\n    ) {\n      postBody['configurationType'] = opts.configurationType\n    }\n    if (opts.placementType !== undefined && opts.placementType !== null) {\n      postBody['placementType'] = opts.placementType\n    }\n    if (opts.autoscalingSpec !== undefined && opts.autoscalingSpec !== null) {\n      postBody['autoscalingSpec'] = opts.autoscalingSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAg with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/availabilityGroups',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据 ID 查询高可用组详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param availabilityGroup ag\n      */\n\n  describeAg (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAg\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling describeAg\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      agId: opts.agId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAg with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/availabilityGroups/{agId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改一个高可用组的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组 ID\n      * @param {string} [opts.description] - 描述，长度不超过 256 字符  optional\n      * @param {string} [opts.name] - 高可用组名称，只支持中文、数字、大小写字母、英文下划线 “_” 及中划线 “-”，且不能超过 32 字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateAg (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateAg\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling updateAg\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      agId: opts.agId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateAg with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/availabilityGroups/{agId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据 ID 删除高可用组，需确保 AG 中云主机实例已全部删除\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteAg (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAg\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling deleteAg\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      agId: opts.agId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAg with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/availabilityGroups/{agId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  从高可用组中剔除实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组 ID\n      * @param {array} [opts.instanceIds] - 准备剔除出高可用组的实例 ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  abandonInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  abandonInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling abandonInstances\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceIds !== undefined && opts.instanceIds !== null) {\n      postBody['instanceIds'] = opts.instanceIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      agId: opts.agId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call abandonInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/availabilityGroups/{agId}:abandonInstances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改高可用组的实例模板&lt;br&gt;- 对于更换实例模板来说，如果已经关联负载均衡，则VPC不可以更改。&lt;br&gt;- 自定义配置型不可更改实例模板。\n      * @param {Object} opts - parameters\n      * @param {string} opts.agId - 高可用组 ID\n      * @param {string} opts.instanceTemplateId - 实例模板 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setInstanceTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setInstanceTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agId === undefined || opts.agId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agId' when calling setInstanceTemplate\"\n      )\n    }\n    if (\n      opts.instanceTemplateId === undefined ||\n      opts.instanceTemplateId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceTemplateId' when calling setInstanceTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.instanceTemplateId !== undefined &&\n      opts.instanceTemplateId !== null\n    ) {\n      postBody['instanceTemplateId'] = opts.instanceTemplateId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      agId: opts.agId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setInstanceTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/availabilityGroups/{agId}:setInstanceTemplate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询(ag)配额\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - resourceTypes - 资源类型，暂时只支持[ag]\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quotas\n      */\n\n  describeQuotas (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuotas\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ag/0.8.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuotas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/quotas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = AG\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/ams/v1/ams.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 应用管理平台API (仅对授权用户使用)\n * 应用管理平台API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ams'\nService._services[serviceId] = true\n\n/**\n * ams service.\n * @version 1.0.0\n */\n\nJDCloud.AMS = class AMS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'ams.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  获取收流基础数据查询\n      * @param {Object} opts - parameters\n      * @param {string} opts.streamId - 流ID\n      * @param {string} [opts.startTime] - 起始时间  optional\n      * @param {string} [opts.endTime] - 结束时间  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param streamInputData streamInputDatas\n      */\n\n  describeStreamsInput (opts, callback) {\n    opts = opts || {}\n\n    if (opts.streamId === undefined || opts.streamId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamId' when calling describeStreamsInput\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      streamId: opts.streamId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ams/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStreamsInput with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/streams/{streamId}/inputs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  客户端鉴权查询\n      * @param {Object} opts - parameters\n      * @param {string} opts.pId - PinId\n      * @param {integer} [opts.ver] - 版本  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string pId  PinId\n      * @param integer ver  版本\n      * @param number blacklist  集合\n      * @param integer status  状态\n      * @param string license  授权号\n      */\n\n  describeAuthenticate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.pId === undefined || opts.pId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pId' when calling describeAuthenticate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.ver !== undefined && opts.ver !== null) {\n      queryParams['ver'] = opts.ver\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      pId: opts.pId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ams/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAuthenticate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/appManager/{pId}/authenticates',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.AMS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/antipro/v1/antipro.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Operation Records APIs\n * Anti DDoS Protection Package Operation Records APIs\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'antipro'\nService._services[serviceId] = true\n\n/**\n * antipro service.\n * @version 1.2.0\n */\n\nclass ANTIPRO extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'antipro.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询攻击记录, 参数 ip 优先级大于 instanceId. &lt;br&gt;- 指定 ip 参数时, 忽略 instanceId 参数, 查询 ip 相关攻击记录. &lt;br&gt;- 未指定 ip 时, 查询 instanceId 指定实例相关攻击记录. &lt;br&gt;- ip 和 instanceId 均未指定时, 查询用户所有公网 IP 攻击记录\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} opts.endTime - 查询的结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.instanceId] - 防护包实例 Id  optional\n      * @param {string} [opts.ip] - DDoS 防护包已防护的公网 IP. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-protection-package/api/describeprotectediplist&#39;&gt;describeProtectedIpList&lt;/a&gt; 接口查询 DDoS 防护包已防护的公网 IP  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param attackLog dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describeAttackLogs (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeAttackLogs\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeAttackLogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    Object.assign(queryParams, super.buildArrayParam(opts.ip, 'ip'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAttackLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/attacklog',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  攻击记录统计, 参数 ip 优先级大于 instanceId. &lt;br&gt;- 指定 ip 参数时, 忽略 instanceId 参数, 统计 ip 的攻击情况. &lt;br&gt;- 未指定 ip 时, 统计 instanceId 指定实例相关攻击情况. &lt;br&gt;- ip 和 instanceId 均未指定时, 查询用户所有公网 IP 攻击情况\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} opts.endTime - 结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.instanceId] - 防护包实例 Id  optional\n      * @param {string} [opts.ip] - DDoS 防护包已防护的公网 IP. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-protection-package/api/describeprotectediplist&#39;&gt;describeProtectedIpList&lt;/a&gt; 接口查询 DDoS 防护包已防护的公网 IP  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer attackCount  攻击次数\n      * @param integer blackHoleCount  黑洞次数\n      * @param number peak  攻击流量峰值\n      * @param string unit  攻击流量单位\n      */\n\n  describeAttackStatistics (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeAttackStatistics\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeAttackStatistics\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    Object.assign(queryParams, super.buildArrayParam(opts.ip, 'ip'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAttackStatistics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeAttackStatistics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询各类型攻击次数, 参数 ip 优先级大于 instanceId. &lt;br&gt;- 指定 ip 参数时, 忽略 instanceId 参数, 查询 ip 相关攻击记录的各类型攻击次数&lt;br&gt;- 未指定 ip 时, 查询 instanceId 指定实例相关攻击记录的各类型攻击次数&lt;br&gt;- ip 和 instanceId 均未指定时, 查询用户所有公网 IP 攻击记录的各类型攻击次数\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} opts.endTime - 结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.instanceId] - 防护包实例 Id  optional\n      * @param {string} [opts.ip] - DDoS 防护包已防护的公网 IP. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-protection-package/api/describeprotectediplist&#39;&gt;describeProtectedIpList&lt;/a&gt; 接口查询 DDoS 防护包已防护的公网 IP  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param attackTypeCount dataList\n      */\n\n  describeAttackTypeCount (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeAttackTypeCount\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeAttackTypeCount\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    Object.assign(queryParams, super.buildArrayParam(opts.ip, 'ip'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAttackTypeCount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeAttackTypeCount',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询攻击来源\n      * @param {Object} opts - parameters\n      * @param {string} opts.attackLogId - 攻击记录 Id\n      * @param {string} opts.ip - DDoS 防护包已防护的公网 IP. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-protection-package/api/describeprotectediplist&#39;&gt;describeProtectedIpList&lt;/a&gt; 接口查询 DDoS 防护包已防护的公网 IP\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  describeAttackSource (opts, callback) {\n    opts = opts || {}\n\n    if (opts.attackLogId === undefined || opts.attackLogId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.attackLogId' when calling describeAttackSource\"\n      )\n    }\n    if (opts.ip === undefined || opts.ip === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ip' when calling describeAttackSource\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.ip !== undefined && opts.ip !== null) {\n      queryParams['ip'] = opts.ip\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      attackLogId: opts.attackLogId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAttackSource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/attacklog/{attackLogId}:describeAttackSource',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询公网 IP 的监控流量\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式：yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} opts.endTime - 查询的结束时间, UTC 时间, 格式：yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.ip] - DDoS 防护包已防护的公网 IP. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-protection-package/api/describeprotectediplist&#39;&gt;describeProtectedIpList&lt;/a&gt; 接口查询 DDoS 防护包已防护的公网 IP  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResourceFlow bps\n      * @param ipResourceFlow pps\n      */\n\n  describeIpMonitorFlow (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeIpMonitorFlow\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeIpMonitorFlow\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(queryParams, super.buildArrayParam(opts.ip, 'ip'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpMonitorFlow with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeIpMonitorFlow',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询防护包实例列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} [opts.name] - 防护包名称, 支持模糊匹配  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建防护包实例\n      * @param {Object} opts - parameters\n      * @param {createInstanceSpec} opts.createInstanceSpec - 创建防护包实例请求参数\n      * @param {autoRenewalSpec} [opts.autoRenewalSpec] - 自动续费配置, 默认不开通  optional\n      * @param {extraOperationSpec} [opts.extraOperationSpec] - 提交订单附加操作  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId  创建的防护包实例 Id\n      */\n\n  createInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.createInstanceSpec === undefined ||\n      opts.createInstanceSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createInstanceSpec' when calling createInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.createInstanceSpec !== undefined &&\n      opts.createInstanceSpec !== null\n    ) {\n      postBody['createInstanceSpec'] = opts.createInstanceSpec\n    }\n    if (opts.autoRenewalSpec !== undefined && opts.autoRenewalSpec !== null) {\n      postBody['autoRenewalSpec'] = opts.autoRenewalSpec\n    }\n    if (\n      opts.extraOperationSpec !== undefined &&\n      opts.extraOperationSpec !== null\n    ) {\n      postBody['extraOperationSpec'] = opts.extraOperationSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询防护包实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance data\n      */\n\n  describeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  升级防护包实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {modifyInstanceSpec} opts.modifyInstanceSpec - 升级防护包实例请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId  升级的防护包实例 Id\n      */\n\n  modifyInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstance\"\n      )\n    }\n    if (\n      opts.modifyInstanceSpec === undefined ||\n      opts.modifyInstanceSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.modifyInstanceSpec' when calling modifyInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.modifyInstanceSpec !== undefined &&\n      opts.modifyInstanceSpec !== null\n    ) {\n      postBody['modifyInstanceSpec'] = opts.modifyInstanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改防护包实例名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {modifyInstanceNameSpec} opts.modifyInstanceNameSpec - 修改防护包实例名称请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  修改结果, 0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyInstanceName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceName\"\n      )\n    }\n    if (\n      opts.modifyInstanceNameSpec === undefined ||\n      opts.modifyInstanceNameSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.modifyInstanceNameSpec' when calling modifyInstanceName\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.modifyInstanceNameSpec !== undefined &&\n      opts.modifyInstanceNameSpec !== null\n    ) {\n      postBody['modifyInstanceNameSpec'] = opts.modifyInstanceNameSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceName',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加防护包防护 IP. &lt;br&gt;- 防护包仅能防护防护包实例所在区域的公网 IP, 且该公网 IP 未被其他防护包防护, 如果已经被其他防护包防护, 请先调用删除防护包防护 IP 接口删除防护 IP&lt;br&gt;- 防护包可添加的防护 IP 个数小于等于防护包的可防护 IP 数量减去已防护的 IP 数量&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-protection-package/api/describeelasticipresources&#39;&gt;describeElasticIpResources&lt;/a&gt; 接口查询防护包可防护的弹性公网 IP&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-protection-package/api/describecpsipresources&#39;&gt;describeCpsIpResources&lt;/a&gt; 接口查询防护包可防护的云物理服务器公网 IP&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-protection-package/api/describewafipresources&#39;&gt;describeWafIpResources&lt;/a&gt; 接口查询防护包可防护的Web应用防火墙公网 IP&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-protection-package/api/describeccsipresources&#39;&gt;describeCcsIpResources&lt;/a&gt; 接口查询防护包可防护的托管区公网 IP\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {protectedIpSpec} opts.protectedIpSpec - 添加防护包防护 IP 请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  添加防护 IP 结果, 0: 添加失败, 1: 添加成功\n      * @param string message  添加失败时给出具体原因\n      */\n\n  addProtectedIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addProtectedIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling addProtectedIp\"\n      )\n    }\n    if (opts.protectedIpSpec === undefined || opts.protectedIpSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.protectedIpSpec' when calling addProtectedIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.protectedIpSpec !== undefined && opts.protectedIpSpec !== null) {\n      postBody['protectedIpSpec'] = opts.protectedIpSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addProtectedIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:addProtectedIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除防护包防护 IP\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {protectedIpSpec} opts.protectedIpSpec - 删除防护包防护 IP 请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  删除防护 IP 结果, 0: 删除失败, 1: 删除成功\n      * @param string message  删除失败时给出具体原因\n      */\n\n  deleteProtectedIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteProtectedIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteProtectedIp\"\n      )\n    }\n    if (opts.protectedIpSpec === undefined || opts.protectedIpSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.protectedIpSpec' when calling deleteProtectedIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.protectedIpSpec !== undefined && opts.protectedIpSpec !== null) {\n      postBody['protectedIpSpec'] = opts.protectedIpSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteProtectedIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:deleteProtectedIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询已防护 IP 列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} [opts.instanceId] - 实例 Id, 缺省时查询用户所有已防护 IP  optional\n      * @param {integer} opts.type - 被防护 IP类型. &lt;br&gt;- 0: 全部&lt;br&gt;- 1: 弹性公网 IP&lt;br&gt;- 2: 云物理服务器公网 IP&lt;br&gt;- 3: Web应用防护墙公网 IP&lt;br&gt;- 4: 托管区公网 IP\n      * @param {string} [opts.ip] - 被防护 IP, 支持模糊查询  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param protectedIp dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describeProtectedIpList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.type === undefined || opts.type === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.type' when calling describeProtectedIpList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n    if (opts.ip !== undefined && opts.ip !== null) {\n      queryParams['ip'] = opts.ip\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProtectedIpList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeProtectedIpList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取防护包实例或 IP 的防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} [opts.ip] - 被防护 IP, 缺省时获取防护包实例的防护规则  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param protectionRule data\n      */\n\n  describeProtectionRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeProtectionRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeProtectionRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.ip !== undefined && opts.ip !== null) {\n      queryParams['ip'] = opts.ip\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProtectionRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeProtectionRule',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询防护规则 Geo 拦截可设置区域\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param country dataList\n      */\n\n  describeGeoAreas (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeGeoAreas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeGeoAreas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改防护包实例或 IP 的防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {protectionRuleSpec} opts.protectionRuleSpec - 修改防护规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  修改防护规则结果, 0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyProtectionRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyProtectionRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyProtectionRule\"\n      )\n    }\n    if (\n      opts.protectionRuleSpec === undefined ||\n      opts.protectionRuleSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.protectionRuleSpec' when calling modifyProtectionRule\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.protectionRuleSpec !== undefined &&\n      opts.protectionRuleSpec !== null\n    ) {\n      postBody['protectionRuleSpec'] = opts.protectionRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyProtectionRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyProtectionRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  检测实例名称是否可用, 防护包实例名称不可重复\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceName - 待检测实例名称, 长度限制为 1-80 个字符, 只允许包含中文, 字母, 数字, -, ., /, _\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  检测结果 code, 0: 不可用, 1: 可用\n      * @param string message  检测结果, 不可用时给出具体原因\n      */\n\n  checkInstanceName (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling checkInstanceName\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      queryParams['instanceName'] = opts.instanceName\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkInstanceName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/checkInstanceName',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  防护包防护信息概要\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param protectionOutline data\n      */\n\n  describeProtectionOutline (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProtectionOutline with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeProtectionOutline',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询已添加的访问控制规则数量\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer cnt  已添加的访问控制规则数量\n      */\n\n  describeInstanceAclCnt (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceAclCnt\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceAclCnt\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceAclCnt with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeInstanceAclCnt',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  打开实例的访问控制规则总开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableInstanceAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableInstanceAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableInstanceAcl\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableInstanceAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:enableInstanceAcl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭实例的访问控制规则总开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableInstanceAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableInstanceAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableInstanceAcl\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableInstanceAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:disableInstanceAcl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例的访问控制规则总开关状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer aclEnable  实例访问控制总开关: 0: 关闭, 1: 打开\n      */\n\n  describeInstanceAclEnable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceAclEnable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceAclEnable\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceAclEnable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeInstanceAclEnable',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询防护包实例的访问控制列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {filter} [opts.filters] - sip - 按照源 IP, 源 IP 范围或者 IP 地址库名称匹配, 仅支持 like 操作符，支持单个\ndip - 按照目的 IP, 目的 IP 范围或者 IP 地址库名称匹配, 仅支持 like 操作符，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param acl dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describeAcls (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAcls\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAcls\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAcls with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/acl',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建访问控制规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {createAclSpec} opts.createAclSpec - 创建防护包实例请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string aclId  创建的访问控制规则 Id\n      */\n\n  createAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createAcl\"\n      )\n    }\n    if (opts.createAclSpec === undefined || opts.createAclSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createAclSpec' when calling createAcl\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.createAclSpec !== undefined && opts.createAclSpec !== null) {\n      postBody['createAclSpec'] = opts.createAclSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/acl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改访问控制规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} opts.aclId - 访问控制规则 Id\n      * @param {modifyAclSpec} opts.modifyAclSpec - 修改访问控制规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyAcl\"\n      )\n    }\n    if (opts.aclId === undefined || opts.aclId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aclId' when calling modifyAcl\"\n      )\n    }\n    if (opts.modifyAclSpec === undefined || opts.modifyAclSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.modifyAclSpec' when calling modifyAcl\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.modifyAclSpec !== undefined && opts.modifyAclSpec !== null) {\n      postBody['modifyAclSpec'] = opts.modifyAclSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      aclId: opts.aclId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/acl/{aclId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除实例的访问控制规则. 支持批量操作, 批量操作时 aclId个, 以 &#39;,&#39; 分隔\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} opts.aclId - 访问控制规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param batchResultDetail data\n      */\n\n  deleteAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteAcl\"\n      )\n    }\n    if (opts.aclId === undefined || opts.aclId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aclId' when calling deleteAcl\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      aclId: opts.aclId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/acl/{aclId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改访问控制规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} opts.aclId - 访问控制规则 Id\n      * @param {modifyAclPrioritySpec} opts.modifyAclPrioritySpec - 修改访问控制规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyAclPriority (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyAclPriority\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyAclPriority\"\n      )\n    }\n    if (opts.aclId === undefined || opts.aclId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aclId' when calling modifyAclPriority\"\n      )\n    }\n    if (\n      opts.modifyAclPrioritySpec === undefined ||\n      opts.modifyAclPrioritySpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.modifyAclPrioritySpec' when calling modifyAclPriority\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.modifyAclPrioritySpec !== undefined &&\n      opts.modifyAclPrioritySpec !== null\n    ) {\n      postBody['modifyAclPrioritySpec'] = opts.modifyAclPrioritySpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      aclId: opts.aclId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyAclPriority with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/acl/{aclId}:modifyAclPriority',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  打开实例的访问控制规则. 支持批量操作, 批量操作时 aclId 传多个, 以 &#39;,&#39; 分隔\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} opts.aclId - 访问控制规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param batchResultDetail data\n      */\n\n  enableAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableAcl\"\n      )\n    }\n    if (opts.aclId === undefined || opts.aclId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aclId' when calling enableAcl\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      aclId: opts.aclId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/acl/{aclId}:enableAcl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭实例的访问控制规则. 支持批量操作, 批量操作时 aclId 传多个, 以 &#39;,&#39; 分隔\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} opts.aclId - 访问控制规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param batchResultDetail data\n      */\n\n  disableAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableAcl\"\n      )\n    }\n    if (opts.aclId === undefined || opts.aclId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aclId' when calling disableAcl\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      aclId: opts.aclId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/acl/{aclId}:disableAcl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例的 IP 库列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipSet dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describeIpSets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpSets\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeIpSets\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpSets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ipSets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建实例的 IP 库\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {ipSetSpec} opts.ipSetSpec - 创建实例的 IP 库请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string ipSetId  创建的IP库 Id\n      */\n\n  createIpSet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createIpSet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createIpSet\"\n      )\n    }\n    if (opts.ipSetSpec === undefined || opts.ipSetSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipSetSpec' when calling createIpSet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ipSetSpec !== undefined && opts.ipSetSpec !== null) {\n      postBody['ipSetSpec'] = opts.ipSetSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createIpSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ipSets',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例的 IP 库\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} opts.ipSetId - IP 库 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipSet data\n      */\n\n  describeIpSet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpSet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeIpSet\"\n      )\n    }\n    if (opts.ipSetId === undefined || opts.ipSetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipSetId' when calling describeIpSet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      ipSetId: opts.ipSetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ipSets/{ipSetId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例的 IP 库\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} opts.ipSetId - IP 库 Id\n      * @param {ipSetSpec} opts.ipSetSpec - 添加实例的 IP 库请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyIpSet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyIpSet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyIpSet\"\n      )\n    }\n    if (opts.ipSetId === undefined || opts.ipSetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipSetId' when calling modifyIpSet\"\n      )\n    }\n    if (opts.ipSetSpec === undefined || opts.ipSetSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipSetSpec' when calling modifyIpSet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ipSetSpec !== undefined && opts.ipSetSpec !== null) {\n      postBody['ipSetSpec'] = opts.ipSetSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      ipSetId: opts.ipSetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyIpSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ipSets/{ipSetId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除实例的 IP 库. 支持批量操作, 批量操作时 ipSetId 传多个, 以 &#39;,&#39; 分隔. IP 黑白名单规则被引用时不允许删除\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} opts.ipSetId - IP 库 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param batchResultDetail data\n      */\n\n  deleteIpSet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteIpSet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteIpSet\"\n      )\n    }\n    if (opts.ipSetId === undefined || opts.ipSetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipSetId' when calling deleteIpSet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      ipSetId: opts.ipSetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteIpSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ipSets/{ipSetId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例的端口库列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param portSet dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describePortSets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePortSets\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describePortSets\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePortSets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/portSets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建实例的端口库\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {portSetSpec} opts.portSetSpec - 创建实例的端口库请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string portSetId  创建的端口库 Id\n      */\n\n  createPortSet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createPortSet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createPortSet\"\n      )\n    }\n    if (opts.portSetSpec === undefined || opts.portSetSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.portSetSpec' when calling createPortSet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.portSetSpec !== undefined && opts.portSetSpec !== null) {\n      postBody['portSetSpec'] = opts.portSetSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createPortSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/portSets',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例的端口库\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} opts.portSetId - 端口库 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param portSet data\n      */\n\n  describePortSet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePortSet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describePortSet\"\n      )\n    }\n    if (opts.portSetId === undefined || opts.portSetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.portSetId' when calling describePortSet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      portSetId: opts.portSetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePortSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/portSets/{portSetId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例的端口库\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} opts.portSetId - 端口库 Id\n      * @param {portSetSpec} opts.portSetSpec - 添加实例的端口库请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyPortSet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyPortSet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyPortSet\"\n      )\n    }\n    if (opts.portSetId === undefined || opts.portSetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.portSetId' when calling modifyPortSet\"\n      )\n    }\n    if (opts.portSetSpec === undefined || opts.portSetSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.portSetSpec' when calling modifyPortSet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.portSetSpec !== undefined && opts.portSetSpec !== null) {\n      postBody['portSetSpec'] = opts.portSetSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      portSetId: opts.portSetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyPortSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/portSets/{portSetId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除实例的端口库. 支持批量操作, 批量操作时 ipSetId 传多个, 以 &#39;,&#39; 分隔. IP 黑白名单规则被引用时不允许删除\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 防护包实例 Id\n      * @param {string} opts.portSetId - 端口库 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param batchResultDetail data\n      */\n\n  deletePortSet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deletePortSet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deletePortSet\"\n      )\n    }\n    if (opts.portSetId === undefined || opts.portSetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.portSetId' when calling deletePortSet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      portSetId: opts.portSetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deletePortSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/portSets/{portSetId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 DDoS 防护包可防护的私有网络弹性公网 IP(不包括运营商级 NAT 保留地址和 IPv6)\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResource dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describeElasticIpResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeElasticIpResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeElasticIpResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIpResources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 DDoS 防护包可防护的云物理服务器公网 IP(包括云物理服务器弹性公网 IP 及云物理服务器基础网络实例的公网 IP)\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResource dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describeCpsIpResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCpsIpResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCpsIpResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cpsIpResources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 DDoS 防护包可防护的托管区公网 IP\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResource dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeCcsIpResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCcsIpResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCcsIpResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ccsIpResources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 DDoS 防护包可防护的Web应用防护墙 IP\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResource dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeWafIpResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWafIpResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWafIpResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafIpResources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询操作日志\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} opts.startTime - 开始时间, UTC 时间, 格式：yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} opts.endTime - 结束时间, UTC 时间, 格式：yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {integer} [opts.action] - 操作类型, 默认查全部. &lt;br&gt;- 0: 全部&lt;br&gt;- 1: 套餐变更&lt;br&gt;- 2: 防护规则变更&lt;br&gt;- 3: 防护对象变更&lt;br&gt;- 4: IP 地址变更&lt;br&gt;- 5: 防护包名称变更&lt;br&gt;- 6: IP地址库变更&lt;br&gt;- 7: 端口库变更&lt;br&gt;- 8: 访问控制规则变更  optional\n      * @param {string} [opts.name] - 防护包名称, 支持模糊匹配  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param operationRecord dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describeOperationRecords (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeOperationRecords\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeOperationRecords\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.action !== undefined && opts.action !== null) {\n      queryParams['action'] = opts.action\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  antipro/1.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeOperationRecords with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/operationRecords',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = ANTIPRO\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/apigateway/v1/apigateway.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 自定义域名\n * api 自定义域名 service\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'apigateway'\nService._services[serviceId] = true\n\n/**\n * apigateway service.\n * @version 1.0.1\n */\n\nJDCloud.APIGATEWAY = class APIGATEWAY extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'apigateway.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询访问授权列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - auth_user_type - 授权类型，默认为 全部类型\nauth_user_id - 用户标识，精确匹配，jd_cloud（京东云用户）, jd_apikms（api网关签名密钥）, jd_subscription_key（订阅密钥）,jd_cloud_pin（激活用户）\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param accessAuth accessAuths\n      * @param integer totalCount  查询的访问授权数目\n      */\n\n  queryAccessAuths (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryAccessAuths\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryAccessAuths with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessAuths',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建访问授权\n      * @param {Object} opts - parameters\n      * @param {accessAuthView} [opts.accessAuthView] - api分组  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string accessAuthId  已创建访问授权ID\n      */\n\n  createAccessAuth (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAccessAuth\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.accessAuthView !== undefined && opts.accessAuthView !== null) {\n      postBody['accessAuthView'] = opts.accessAuthView\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAccessAuth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessAuths',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  检查accessAuth是否重复\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessKey\n      * @param {string} opts.authUserType\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string accessAuthId  返回accessAuthId\n      */\n\n  checkAuthExist (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkAuthExist\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessKey === undefined || opts.accessKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKey' when calling checkAuthExist\"\n      )\n    }\n    if (opts.authUserType === undefined || opts.authUserType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.authUserType' when calling checkAuthExist\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accessKey !== undefined && opts.accessKey !== null) {\n      postBody['accessKey'] = opts.accessKey\n    }\n    if (opts.authUserType !== undefined && opts.authUserType !== null) {\n      postBody['authUserType'] = opts.authUserType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkAuthExist with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessAuths:checkAccessKeyExist',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个访问授权\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessAuthId - 访问授权ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param accessAuth accessAuth\n      */\n\n  queryAccessAuth (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryAccessAuth\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessAuthId === undefined || opts.accessAuthId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessAuthId' when calling queryAccessAuth\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessAuthId: opts.accessAuthId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryAccessAuth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessAuths/{accessAuthId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新访问授权\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessAuthId - 访问授权ID\n      * @param {accessAuthView} [opts.accessAuthView] - 访问授权详情  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string accessAuthId  已更新访问授权ID\n      */\n\n  updateAccessAuth (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateAccessAuth\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessAuthId === undefined || opts.accessAuthId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessAuthId' when calling updateAccessAuth\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accessAuthView !== undefined && opts.accessAuthView !== null) {\n      postBody['accessAuthView'] = opts.accessAuthView\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessAuthId: opts.accessAuthId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateAccessAuth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessAuths/{accessAuthId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除访问授权\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessAuthId - 访问授权ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string accessAuthId  已删除授权ID\n      */\n\n  deleteAccessAuth (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAccessAuth\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessAuthId === undefined || opts.accessAuthId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessAuthId' when calling deleteAccessAuth\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessAuthId: opts.accessAuthId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAccessAuth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessAuths/{accessAuthId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询已绑定详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessAuthId - 访问授权ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bindGroups bindGroups\n      */\n\n  queryBindGroupAuth (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryBindGroupAuth\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessAuthId === undefined || opts.accessAuthId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessAuthId' when calling queryBindGroupAuth\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessAuthId: opts.accessAuthId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBindGroupAuth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessAuths/{accessAuthId}:bindGroup',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  绑定分组\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessAuthId - 访问授权ID\n      * @param {string} opts.deploymentIds - 待绑定的部署ids逗号隔开\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bindGroups bindGroups\n      */\n\n  bindGroupAuth (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  bindGroupAuth\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessAuthId === undefined || opts.accessAuthId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessAuthId' when calling bindGroupAuth\"\n      )\n    }\n    if (opts.deploymentIds === undefined || opts.deploymentIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deploymentIds' when calling bindGroupAuth\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deploymentIds !== undefined && opts.deploymentIds !== null) {\n      postBody['deploymentIds'] = opts.deploymentIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessAuthId: opts.accessAuthId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bindGroupAuth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessAuths/{accessAuthId}:bindGroup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可绑定部署列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.authUserType - 待绑定的用户类型\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bindGroups bindGroups\n      */\n\n  queryAuthGroupList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryAuthGroupList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.authUserType === undefined || opts.authUserType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.authUserType' when calling queryAuthGroupList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.authUserType !== undefined && opts.authUserType !== null) {\n      queryParams['authUserType'] = opts.authUserType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryAuthGroupList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessAuths:groupList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询所有已授权api分组列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - apiGroupName - 名称，模糊匹配\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param userBindedGroups apiGroups\n      */\n\n  authorizedApiGroupList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  authorizedApiGroupList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call authorizedApiGroupList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessAuths:authorizedApiGroupList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询密钥列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - description - 名称，模糊匹配\naccessKey - accesskey，模糊匹配\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param accessKey accessKeys\n      * @param integer totalCount  查询的密钥数目\n      */\n\n  queryAccessKeys (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryAccessKeys\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryAccessKeys with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessKeys',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建密钥\n      * @param {Object} opts - parameters\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} [opts.accessKeyType] - 密钥类型  optional\n      * @param {string} [opts.accessKey] - Access Key  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string accessKeyId  已创建密钥ID\n      */\n\n  createAccessKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAccessKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.accessKeyType !== undefined && opts.accessKeyType !== null) {\n      postBody['accessKeyType'] = opts.accessKeyType\n    }\n    if (opts.accessKey !== undefined && opts.accessKey !== null) {\n      postBody['accessKey'] = opts.accessKey\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAccessKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessKeys',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  检查AccessKey是否重复\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessKey\n      * @param {string} opts.accessKeyType\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  checkKeyExist (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkKeyExist\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessKey === undefined || opts.accessKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKey' when calling checkKeyExist\"\n      )\n    }\n    if (opts.accessKeyType === undefined || opts.accessKeyType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKeyType' when calling checkKeyExist\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accessKey !== undefined && opts.accessKey !== null) {\n      postBody['accessKey'] = opts.accessKey\n    }\n    if (opts.accessKeyType !== undefined && opts.accessKeyType !== null) {\n      postBody['accessKeyType'] = opts.accessKeyType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkKeyExist with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessKeys:checkAccessKeyExist',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个密钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessKeyId - access key id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param accessKey accessKey\n      */\n\n  queryAccessKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryAccessKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessKeyId === undefined || opts.accessKeyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKeyId' when calling queryAccessKey\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessKeyId: opts.accessKeyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryAccessKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessKeys/{accessKeyId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新密钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessKeyId - access key id\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} [opts.accessKeyType] - 密钥类型  optional\n      * @param {string} [opts.accessKey] - Access Key  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string accessKeyId  已更新密钥Id\n      */\n\n  updateAccessKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateAccessKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessKeyId === undefined || opts.accessKeyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKeyId' when calling updateAccessKey\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.accessKeyType !== undefined && opts.accessKeyType !== null) {\n      postBody['accessKeyType'] = opts.accessKeyType\n    }\n    if (opts.accessKey !== undefined && opts.accessKey !== null) {\n      postBody['accessKey'] = opts.accessKey\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessKeyId: opts.accessKeyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateAccessKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessKeys/{accessKeyId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除密钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessKeyId - access key id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string accessKeyId  已删除密钥Id\n      */\n\n  deleteAccessKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAccessKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessKeyId === undefined || opts.accessKeyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKeyId' when calling deleteAccessKey\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessKeyId: opts.accessKeyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAccessKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessKeys/{accessKeyId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询绑定分组详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessKeyId - access key id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bindGroups bindGroups\n      */\n\n  queryBindGroupKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryBindGroupKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessKeyId === undefined || opts.accessKeyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKeyId' when calling queryBindGroupKey\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessKeyId: opts.accessKeyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBindGroupKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessKeys/{accessKeyId}:bindGroup',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  绑定分组\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessKeyId - access key id\n      * @param {string} opts.deploymentIds - 待绑定的部署ids用逗号隔开\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bindGroups bindGroups\n      */\n\n  bindGroupKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  bindGroupKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessKeyId === undefined || opts.accessKeyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKeyId' when calling bindGroupKey\"\n      )\n    }\n    if (opts.deploymentIds === undefined || opts.deploymentIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deploymentIds' when calling bindGroupKey\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deploymentIds !== undefined && opts.deploymentIds !== null) {\n      postBody['deploymentIds'] = opts.deploymentIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessKeyId: opts.accessKeyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bindGroupKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessKeys/{accessKeyId}:bindGroup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可绑定部署列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessKeyId - access key id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bindGroups bindGroups\n      */\n\n  queryKeyGroupList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryKeyGroupList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessKeyId === undefined || opts.accessKeyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKeyId' when calling queryKeyGroupList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessKeyId: opts.accessKeyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryKeyGroupList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accessKeys/{accessKeyId}:groupList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询api列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.revision - 版本号\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - apiName - API名称，模糊匹配，支持单个\naction - 动作，精确匹配，支持多个\nbackServiceType- 后端服务类型，精确匹配，支持多个\npath - 路径，模糊匹配，支持单个\ndescription - 描述，模糊匹配，支持单个\nisApiProduct - 是否API产品，精确匹配，1为是\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param api apis\n      * @param integer totalCount  查询的数目\n      */\n\n  queryApis (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryApis\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling queryApis\"\n      )\n    }\n    if (opts.revision === undefined || opts.revision === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revision' when calling queryApis\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      revision: opts.revision\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryApis with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision/{revision}/apis',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建api\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.revision - 版本号\n      * @param {createApi} [opts.api] - api  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string apiId  apiId\n      */\n\n  createApis (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createApis\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling createApis\"\n      )\n    }\n    if (opts.revision === undefined || opts.revision === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revision' when calling createApis\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.api !== undefined && opts.api !== null) {\n      postBody['api'] = opts.api\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      revision: opts.revision\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createApis with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision/{revision}/apis',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建API时，检查API名称是否重复,返回重复的apiId,如果没有返回空\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.revision - 版本号\n      * @param {string} opts.apiName - API名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string apiId  API名称\n      */\n\n  checkApiNameExist (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkApiNameExist\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling checkApiNameExist\"\n      )\n    }\n    if (opts.revision === undefined || opts.revision === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revision' when calling checkApiNameExist\"\n      )\n    }\n    if (opts.apiName === undefined || opts.apiName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiName' when calling checkApiNameExist\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.apiName !== undefined && opts.apiName !== null) {\n      postBody['apiName'] = opts.apiName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      revision: opts.revision\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkApiNameExist with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision/{revision}/apis:checkApiNameExist',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个api\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.revision - 版本号\n      * @param {string} opts.apiId - 接口ID\n      * @param {filter} [opts.filters] - isApiProduct - 是否API产品，精确匹配，1为是\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param api api\n      */\n\n  queryApi (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryApi\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling queryApi\"\n      )\n    }\n    if (opts.revision === undefined || opts.revision === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revision' when calling queryApi\"\n      )\n    }\n    if (opts.apiId === undefined || opts.apiId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiId' when calling queryApi\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      revision: opts.revision,\n      apiId: opts.apiId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryApi with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision/{revision}/apis/{apiId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改api\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.revision - 版本号\n      * @param {string} opts.apiId - 接口ID\n      * @param {createApi} [opts.api] - api  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string apiId  apiId\n      */\n\n  updateApi (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateApi\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling updateApi\"\n      )\n    }\n    if (opts.revision === undefined || opts.revision === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revision' when calling updateApi\"\n      )\n    }\n    if (opts.apiId === undefined || opts.apiId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiId' when calling updateApi\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.api !== undefined && opts.api !== null) {\n      postBody['api'] = opts.api\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      revision: opts.revision,\n      apiId: opts.apiId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateApi with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision/{revision}/apis/{apiId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除api\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.revision - 版本号\n      * @param {string} opts.apiId - 接口ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteApi (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteApi\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling deleteApi\"\n      )\n    }\n    if (opts.revision === undefined || opts.revision === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revision' when calling deleteApi\"\n      )\n    }\n    if (opts.apiId === undefined || opts.apiId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiId' when calling deleteApi\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      revision: opts.revision,\n      apiId: opts.apiId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteApi with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision/{revision}/apis/{apiId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改api\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.revision - 版本号\n      * @param {string} opts.apiName\n      * @param {createApi} [opts.api] - api  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateApiByName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateApiByName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling updateApiByName\"\n      )\n    }\n    if (opts.revision === undefined || opts.revision === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revision' when calling updateApiByName\"\n      )\n    }\n    if (opts.apiName === undefined || opts.apiName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiName' when calling updateApiByName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.api !== undefined && opts.api !== null) {\n      postBody['api'] = opts.api\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      revision: opts.revision,\n      apiName: opts.apiName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateApiByName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision/{revision}/apisName/{apiName}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除api\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.revision - 版本号\n      * @param {string} opts.apiName\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteApiByName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteApiByName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling deleteApiByName\"\n      )\n    }\n    if (opts.revision === undefined || opts.revision === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revision' when calling deleteApiByName\"\n      )\n    }\n    if (opts.apiName === undefined || opts.apiName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiName' when calling deleteApiByName\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      revision: opts.revision,\n      apiName: opts.apiName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteApiByName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision/{revision}/apisName/{apiName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询分组\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - groupName - 分组名称，模糊匹配，支持单个\ndescription - 描述信息，模糊匹配，支持单个\ngroupId - 分组ID，精确匹配\ndomain - 域名，模糊匹配\njdsfId - 微服务网关ID，精确匹配\n  optional\n      * @param {tagFilter} [opts.tagFilters] - 标签查询条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param apiGroup apiGroups\n      * @param integer totalCount  查询的分组数目\n      */\n\n  describeApiGroups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeApiGroups\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(\n      queryParams,\n      this.buildTagFilterParam(opts.tagFilters, 'tagFilters')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeApiGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建API分组\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupName - 名称\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} [opts.prefix] - 分组路径前缀，无需添加/  optional\n      * @param {string} [opts.keyCheck] - 密钥验证方式：check_exist（密钥必须在访问授权中已配置）、no_check_exist（无需事先配置）  optional\n      * @param {string} opts.authType - 访问授权方式：None（免鉴权）、jd_cloud（开启访问授权，且必须使用京东云的AK、SK验签）、hufu（虎符用户）\n      * @param {integer} [opts.prefixStrip] - 是否转发分组路径到后端服务：0（不转发）、1（转发）默认为1  optional\n      * @param {string} [opts.groupType] - 分组类型：api_group（api分组）、jdsf_group（微服务分组）默认为 api_group  optional\n      * @param {string} [opts.jdsfName] - 微服务网关名称  optional\n      * @param {string} [opts.jdsfRegistryName] - 微服务注册中心ID  optional\n      * @param {string} [opts.jdsfId] - 微服务网关ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string apiGroupId  创建的API分组ID\n      * @param string revision  修订版本号\n      */\n\n  createApiGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createApiGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.groupName === undefined || opts.groupName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupName' when calling createApiGroup\"\n      )\n    }\n    if (opts.authType === undefined || opts.authType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.authType' when calling createApiGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.groupName !== undefined && opts.groupName !== null) {\n      postBody['groupName'] = opts.groupName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.prefix !== undefined && opts.prefix !== null) {\n      postBody['prefix'] = opts.prefix\n    }\n    if (opts.keyCheck !== undefined && opts.keyCheck !== null) {\n      postBody['keyCheck'] = opts.keyCheck\n    }\n    if (opts.authType !== undefined && opts.authType !== null) {\n      postBody['authType'] = opts.authType\n    }\n    if (opts.prefixStrip !== undefined && opts.prefixStrip !== null) {\n      postBody['prefixStrip'] = opts.prefixStrip\n    }\n    if (opts.groupType !== undefined && opts.groupType !== null) {\n      postBody['groupType'] = opts.groupType\n    }\n    if (opts.jdsfName !== undefined && opts.jdsfName !== null) {\n      postBody['jdsfName'] = opts.jdsfName\n    }\n    if (opts.jdsfRegistryName !== undefined && opts.jdsfRegistryName !== null) {\n      postBody['jdsfRegistryName'] = opts.jdsfRegistryName\n    }\n    if (opts.jdsfId !== undefined && opts.jdsfId !== null) {\n      postBody['jdsfId'] = opts.jdsfId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createApiGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  检查分组名称是否重复,返回重复的apiGroupId,如果没有返回空\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupName - 分组名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string apiGroupId  分组id\n      */\n\n  checkGroupNameExist (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkGroupNameExist\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.groupName === undefined || opts.groupName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupName' when calling checkGroupNameExist\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.groupName !== undefined && opts.groupName !== null) {\n      postBody['groupName'] = opts.groupName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkGroupNameExist with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups:checkGroupNameExist',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询API分组详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param apiGroup apiGroup\n      */\n\n  describeApiGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeApiGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling describeApiGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeApiGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改API分组信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} [opts.groupName] - 名称  optional\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} [opts.prefix] - 分组路径前缀  optional\n      * @param {string} [opts.keyCheck] - 密钥验证方式：check_exist（密钥必须在访问授权中已配置）、no_check_exist（无需事先配置）  optional\n      * @param {string} [opts.authType] - 访问授权方式：None（免鉴权）、jd_cloud（开启访问授权，且必须使用京东云的AK、SK验签）、hufu（虎符用户）  optional\n      * @param {integer} [opts.prefixStrip] - 是否转发分组路径到后端服务：0（不转发）、1（转发）默认为1  optional\n      * @param {string} [opts.groupType] - 分组类型：api_group（api分组）、jdsf_group（微服务分组）默认为 api_group  optional\n      * @param {string} [opts.jdsfName] - 微服务网关名称  optional\n      * @param {string} [opts.jdsfRegistryName] - 微服务注册中心ID  optional\n      * @param {string} [opts.jdsfId] - 微服务网关ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyApiGroupAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyApiGroupAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling modifyApiGroupAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.groupName !== undefined && opts.groupName !== null) {\n      postBody['groupName'] = opts.groupName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.prefix !== undefined && opts.prefix !== null) {\n      postBody['prefix'] = opts.prefix\n    }\n    if (opts.keyCheck !== undefined && opts.keyCheck !== null) {\n      postBody['keyCheck'] = opts.keyCheck\n    }\n    if (opts.authType !== undefined && opts.authType !== null) {\n      postBody['authType'] = opts.authType\n    }\n    if (opts.prefixStrip !== undefined && opts.prefixStrip !== null) {\n      postBody['prefixStrip'] = opts.prefixStrip\n    }\n    if (opts.groupType !== undefined && opts.groupType !== null) {\n      postBody['groupType'] = opts.groupType\n    }\n    if (opts.jdsfName !== undefined && opts.jdsfName !== null) {\n      postBody['jdsfName'] = opts.jdsfName\n    }\n    if (opts.jdsfRegistryName !== undefined && opts.jdsfRegistryName !== null) {\n      postBody['jdsfRegistryName'] = opts.jdsfRegistryName\n    }\n    if (opts.jdsfId !== undefined && opts.jdsfId !== null) {\n      postBody['jdsfId'] = opts.jdsfId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyApiGroupAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除单个API分组\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteApiGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteApiGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling deleteApiGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteApiGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询分组\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - deployStatus - 发布状态，已发布：1，未发布：0\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param apiGroup apiGroups\n      * @param integer totalCount  查询的分组数目\n      */\n\n  describeIsDeployApiGroups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIsDeployApiGroups\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIsDeployApiGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups:isDeploy',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开通后端配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} [opts.backendConfigId] - 接口ID  optional\n      * @param {string} [opts.baseGroupId] - 分组ID  optional\n      * @param {string} opts.environment - 环境：test、preview、online\n      * @param {string} [opts.backendUrl] - 后端地址  optional\n      * @param {string} opts.backendServiceType - 后端服务类型：mock、HTTP/HTTPS\n      * @param {array} [opts.headerParams] - header参数列表  optional\n      * @param {array} [opts.queryParams] - query参数列表  optional\n      * @param {string} [opts.description] - 描述  optional\n      * @param {integer} [opts.createTime] - 发布日期，格式为毫秒级时间戳  optional\n      * @param {integer} opts.sort - 排序，赋值0时为默认的后端配置\n      * @param {integer} [opts.userSort] - 排序，用于展示使用  optional\n      * @param {string} [opts.jdsfId] - vpc网关id  optional\n      * @param {string} [opts.jdsfParam] - vpc后端地址  optional\n      * @param {string} [opts.jdsfRegion] - vpc网关所属region  optional\n      * @param {string} [opts.jdsfPin] - vpc网关创建者的pin  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string backendConfigId  主键Id\n      */\n\n  createBackendConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBackendConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling createBackendConfig\"\n      )\n    }\n    if (opts.environment === undefined || opts.environment === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.environment' when calling createBackendConfig\"\n      )\n    }\n    if (\n      opts.backendServiceType === undefined ||\n      opts.backendServiceType === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backendServiceType' when calling createBackendConfig\"\n      )\n    }\n    if (opts.sort === undefined || opts.sort === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sort' when calling createBackendConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.backendConfigId !== undefined && opts.backendConfigId !== null) {\n      postBody['backendConfigId'] = opts.backendConfigId\n    }\n    if (opts.baseGroupId !== undefined && opts.baseGroupId !== null) {\n      postBody['baseGroupId'] = opts.baseGroupId\n    }\n    if (opts.environment !== undefined && opts.environment !== null) {\n      postBody['environment'] = opts.environment\n    }\n    if (opts.backendUrl !== undefined && opts.backendUrl !== null) {\n      postBody['backendUrl'] = opts.backendUrl\n    }\n    if (\n      opts.backendServiceType !== undefined &&\n      opts.backendServiceType !== null\n    ) {\n      postBody['backendServiceType'] = opts.backendServiceType\n    }\n    if (opts.headerParams !== undefined && opts.headerParams !== null) {\n      postBody['headerParams'] = opts.headerParams\n    }\n    if (opts.queryParams !== undefined && opts.queryParams !== null) {\n      postBody['queryParams'] = opts.queryParams\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.createTime !== undefined && opts.createTime !== null) {\n      postBody['createTime'] = opts.createTime\n    }\n    if (opts.sort !== undefined && opts.sort !== null) {\n      postBody['sort'] = opts.sort\n    }\n    if (opts.userSort !== undefined && opts.userSort !== null) {\n      postBody['userSort'] = opts.userSort\n    }\n    if (opts.jdsfId !== undefined && opts.jdsfId !== null) {\n      postBody['jdsfId'] = opts.jdsfId\n    }\n    if (opts.jdsfParam !== undefined && opts.jdsfParam !== null) {\n      postBody['jdsfParam'] = opts.jdsfParam\n    }\n    if (opts.jdsfRegion !== undefined && opts.jdsfRegion !== null) {\n      postBody['jdsfRegion'] = opts.jdsfRegion\n    }\n    if (opts.jdsfPin !== undefined && opts.jdsfPin !== null) {\n      postBody['jdsfPin'] = opts.jdsfPin\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBackendConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/backendConfig',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定环境下的所有后端配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.environment - 环境：test、preview、online\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - sort - 路由排序，赋值0时为默认的后端配置\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param backendConfig backendConfigs\n      * @param integer totalCount  结果总数\n      */\n\n  describeBackendConfigs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackendConfigs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling describeBackendConfigs\"\n      )\n    }\n    if (opts.environment === undefined || opts.environment === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.environment' when calling describeBackendConfigs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      environment: opts.environment\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackendConfigs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/environment/{environment}/backendConfigs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询backendConfig\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.backendConfigId - backendConfigId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param backendConfig backendConfig\n      */\n\n  describeBackendConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackendConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling describeBackendConfig\"\n      )\n    }\n    if (opts.backendConfigId === undefined || opts.backendConfigId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backendConfigId' when calling describeBackendConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      backendConfigId: opts.backendConfigId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackendConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/backendConfig/{backendConfigId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改后端配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.backendConfigId - backendConfigId\n      * @param {string} [opts.baseGroupId] - 分组ID  optional\n      * @param {string} opts.environment - 环境：test、preview、online\n      * @param {string} [opts.backendUrl] - 后端地址  optional\n      * @param {string} opts.backendServiceType - 后端服务类型：mock、HTTP/HTTPS\n      * @param {array} [opts.headerParams] - header参数列表  optional\n      * @param {array} [opts.queryParams] - query参数列表  optional\n      * @param {string} [opts.description] - 描述  optional\n      * @param {integer} [opts.createTime] - 发布日期，格式为毫秒级时间戳  optional\n      * @param {integer} opts.sort - 排序，赋值0时为默认的后端配置\n      * @param {integer} [opts.userSort] - 排序，用于展示使用  optional\n      * @param {string} [opts.jdsfId] - vpc网关id  optional\n      * @param {string} [opts.jdsfParam] - vpc后端地址  optional\n      * @param {string} [opts.jdsfRegion] - vpc网关所属region  optional\n      * @param {string} [opts.jdsfPin] - vpc网关创建者的pin  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateBackendConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateBackendConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling updateBackendConfig\"\n      )\n    }\n    if (opts.backendConfigId === undefined || opts.backendConfigId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backendConfigId' when calling updateBackendConfig\"\n      )\n    }\n    if (opts.environment === undefined || opts.environment === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.environment' when calling updateBackendConfig\"\n      )\n    }\n    if (\n      opts.backendServiceType === undefined ||\n      opts.backendServiceType === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backendServiceType' when calling updateBackendConfig\"\n      )\n    }\n    if (opts.sort === undefined || opts.sort === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sort' when calling updateBackendConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.baseGroupId !== undefined && opts.baseGroupId !== null) {\n      postBody['baseGroupId'] = opts.baseGroupId\n    }\n    if (opts.environment !== undefined && opts.environment !== null) {\n      postBody['environment'] = opts.environment\n    }\n    if (opts.backendUrl !== undefined && opts.backendUrl !== null) {\n      postBody['backendUrl'] = opts.backendUrl\n    }\n    if (\n      opts.backendServiceType !== undefined &&\n      opts.backendServiceType !== null\n    ) {\n      postBody['backendServiceType'] = opts.backendServiceType\n    }\n    if (opts.headerParams !== undefined && opts.headerParams !== null) {\n      postBody['headerParams'] = opts.headerParams\n    }\n    if (opts.queryParams !== undefined && opts.queryParams !== null) {\n      postBody['queryParams'] = opts.queryParams\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.createTime !== undefined && opts.createTime !== null) {\n      postBody['createTime'] = opts.createTime\n    }\n    if (opts.sort !== undefined && opts.sort !== null) {\n      postBody['sort'] = opts.sort\n    }\n    if (opts.userSort !== undefined && opts.userSort !== null) {\n      postBody['userSort'] = opts.userSort\n    }\n    if (opts.jdsfId !== undefined && opts.jdsfId !== null) {\n      postBody['jdsfId'] = opts.jdsfId\n    }\n    if (opts.jdsfParam !== undefined && opts.jdsfParam !== null) {\n      postBody['jdsfParam'] = opts.jdsfParam\n    }\n    if (opts.jdsfRegion !== undefined && opts.jdsfRegion !== null) {\n      postBody['jdsfRegion'] = opts.jdsfRegion\n    }\n    if (opts.jdsfPin !== undefined && opts.jdsfPin !== null) {\n      postBody['jdsfPin'] = opts.jdsfPin\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      backendConfigId: opts.backendConfigId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateBackendConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/backendConfig/{backendConfigId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除后端配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.backendConfigId - backendConfigId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteBackendConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBackendConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling deleteBackendConfig\"\n      )\n    }\n    if (opts.backendConfigId === undefined || opts.backendConfigId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backendConfigId' when calling deleteBackendConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      backendConfigId: opts.backendConfigId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBackendConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/backendConfig/{backendConfigId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询部署列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {filter} [opts.filters] - isApiProduct - 是否API产品，精确匹配，1为是\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deployment deployments\n      */\n\n  describeDeployments (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeployments\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling describeDeployments\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeployments with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/deployments',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  发布版本\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.revision - 发布的修订版本号\n      * @param {string} opts.environment - 环境：test、preview、online\n      * @param {string} [opts.backendServiceType] - 后端服务类型：mock、unique、vpc  optional\n      * @param {string} [opts.backendUrl] - 后端地址  optional\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} [opts.jdsfName] - 微服务网关名称  optional\n      * @param {string} [opts.jdsfRegistryName] - 微服务注册中心ID  optional\n      * @param {string} [opts.jdsfId] - 微服务ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deploy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deploy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling deploy\"\n      )\n    }\n    if (opts.revision === undefined || opts.revision === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revision' when calling deploy\"\n      )\n    }\n    if (opts.environment === undefined || opts.environment === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.environment' when calling deploy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.revision !== undefined && opts.revision !== null) {\n      postBody['revision'] = opts.revision\n    }\n    if (opts.environment !== undefined && opts.environment !== null) {\n      postBody['environment'] = opts.environment\n    }\n    if (\n      opts.backendServiceType !== undefined &&\n      opts.backendServiceType !== null\n    ) {\n      postBody['backendServiceType'] = opts.backendServiceType\n    }\n    if (opts.backendUrl !== undefined && opts.backendUrl !== null) {\n      postBody['backendUrl'] = opts.backendUrl\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.jdsfName !== undefined && opts.jdsfName !== null) {\n      postBody['jdsfName'] = opts.jdsfName\n    }\n    if (opts.jdsfRegistryName !== undefined && opts.jdsfRegistryName !== null) {\n      postBody['jdsfRegistryName'] = opts.jdsfRegistryName\n    }\n    if (opts.jdsfId !== undefined && opts.jdsfId !== null) {\n      postBody['jdsfId'] = opts.jdsfId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deploy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/deployments',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询该版本的部署详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.deploymentId - 部署ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deployment apiGroup\n      */\n\n  describeDeployment (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeployment\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling describeDeployment\"\n      )\n    }\n    if (opts.deploymentId === undefined || opts.deploymentId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deploymentId' when calling describeDeployment\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      deploymentId: opts.deploymentId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeployment with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/deployments/{deploymentId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  下线\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.deploymentId - 部署ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  offline (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  offline\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling offline\"\n      )\n    }\n    if (opts.deploymentId === undefined || opts.deploymentId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deploymentId' when calling offline\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      deploymentId: opts.deploymentId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call offline with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/deployments/{deploymentId}:offline',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量下线\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} [opts.deploymentIds] - 要删除的部署ID集合，以,分隔  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer successCount  操作成功的资源个数\n      * @param errorItem failed\n      */\n\n  batchOffline (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  batchOffline\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling batchOffline\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deploymentIds !== undefined && opts.deploymentIds !== null) {\n      postBody['deploymentIds'] = opts.deploymentIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchOffline with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/deployments:offline',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询key列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {string} [opts.orderBy] - 排序类型  optional\n      * @param {string} [opts.userType] - 用户类型  optional\n      * @param {string} [opts.keyId] - 密钥Id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  total count\n      * @param keyInfo data\n      */\n\n  queryKeys (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryKeys\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.orderBy !== undefined && opts.orderBy !== null) {\n      queryParams['orderBy'] = opts.orderBy\n    }\n    if (opts.userType !== undefined && opts.userType !== null) {\n      queryParams['userType'] = opts.userType\n    }\n    if (opts.keyId !== undefined && opts.keyId !== null) {\n      queryParams['keyId'] = opts.keyId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryKeys with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/kms',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建key\n      * @param {Object} opts - parameters\n      * @param {string} [opts.keyName] - key 名称  optional\n      * @param {string} [opts.keyDesc] - key 描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string accessKey  生成的accessKey\n      * @param string secretKey  生成的secretKey\n      */\n\n  createKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.keyName !== undefined && opts.keyName !== null) {\n      postBody['keyName'] = opts.keyName\n    }\n    if (opts.keyDesc !== undefined && opts.keyDesc !== null) {\n      postBody['keyDesc'] = opts.keyDesc\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/kms',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重置key的acesskey和secretkey\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - keyId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param keyInfo keyInfo\n      */\n\n  resetKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resetKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling resetKey\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.keyId !== undefined && opts.keyId !== null) {\n      postBody['keyId'] = opts.keyId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resetKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/kms',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改key信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - keyid\n      * @param {string} [opts.keyName] - key 名称  optional\n      * @param {string} [opts.keyDesc]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling updateKey\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.keyId !== undefined && opts.keyId !== null) {\n      postBody['keyId'] = opts.keyId\n    }\n    if (opts.keyName !== undefined && opts.keyName !== null) {\n      postBody['keyName'] = opts.keyName\n    }\n    if (opts.keyDesc !== undefined && opts.keyDesc !== null) {\n      postBody['keyDesc'] = opts.keyDesc\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/kms',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询key详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - keyId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param keyInfo keyInfo\n      */\n\n  queryKeyInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryKeyInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling queryKeyInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryKeyInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/kms/{keyId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询流控策略列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - policyName - 策略名称，模糊匹配\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rateLimitPolicy rateLimitPolicys\n      * @param integer totalCount  查询的流控策略数目\n      */\n\n  queryRateLimitPolicies (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryRateLimitPolicies\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryRateLimitPolicies with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rateLimitPolicies',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建流控策略\n      * @param {Object} opts - parameters\n      * @param {rateLimitPolicyView} [opts.rateLimitPolicyView] - 流控策略详情  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string policyId  流控策略Id\n      */\n\n  createRateLimitPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createRateLimitPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (\n      opts.rateLimitPolicyView !== undefined &&\n      opts.rateLimitPolicyView !== null\n    ) {\n      postBody['rateLimitPolicyView'] = opts.rateLimitPolicyView\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRateLimitPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rateLimitPolicies',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  检查策略名是否重复\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyName\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string policyId  返回policyID\n      */\n\n  checkPolicyName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkPolicyName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyName === undefined || opts.policyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyName' when calling checkPolicyName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.policyName !== undefined && opts.policyName !== null) {\n      postBody['policyName'] = opts.policyName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkPolicyName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rateLimitPolicies:checkPolicyNameExist',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个流控策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 限流策略ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rateLimitPolicy rateLimitPolicy\n      */\n\n  queryRateLimitPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryRateLimitPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling queryRateLimitPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryRateLimitPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rateLimitPolicies/{policyId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改流控策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 限流策略ID\n      * @param {rateLimitPolicyView} [opts.rateLimitPolicyView] - 流控策略详情  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string policyId  流控策略Id\n      */\n\n  updateRateLimitPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateRateLimitPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling updateRateLimitPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.rateLimitPolicyView !== undefined &&\n      opts.rateLimitPolicyView !== null\n    ) {\n      postBody['rateLimitPolicyView'] = opts.rateLimitPolicyView\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateRateLimitPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rateLimitPolicies/{policyId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除单个流控策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 限流策略ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string policyId  已删除流控策略Id\n      */\n\n  deleteRateLimitPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRateLimitPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling deleteRateLimitPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRateLimitPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rateLimitPolicies/{policyId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询绑定部署详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 限流策略ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bindGroups bindGroups\n      */\n\n  queryBindGroupPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryBindGroupPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling queryBindGroupPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBindGroupPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rateLimitPolicies/{policyId}:bindGroup',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  绑定\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 限流策略ID\n      * @param {string} opts.deploymentIds - 待绑定的部署ids逗号隔开\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bindGroups bindGroups\n      */\n\n  bindGroupPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  bindGroupPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling bindGroupPolicy\"\n      )\n    }\n    if (opts.deploymentIds === undefined || opts.deploymentIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deploymentIds' when calling bindGroupPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deploymentIds !== undefined && opts.deploymentIds !== null) {\n      postBody['deploymentIds'] = opts.deploymentIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bindGroupPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rateLimitPolicies/{policyId}:bindGroup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可绑定部署列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 限流策略ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bindGroups bindGroups\n      */\n\n  queryPolicyGroupList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryPolicyGroupList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling queryPolicyGroupList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryPolicyGroupList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rateLimitPolicies/{policyId}:groupList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询修订版本列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - revision - 修订版本号，精确匹配\nenvironment - 发布环境，模糊匹配\nrevisionNote - 修订备注，精确匹配\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param revisionList revisions\n      * @param integer totalCount  查询的版本数目\n      */\n\n  describeRevisions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRevisions\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling describeRevisions\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRevisions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建修订版本\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} [opts.revision] - 修订版本号，如果创建版本时传回修订版本，此为必填项  optional\n      * @param {string} [opts.baseRevision] - 基于此版本，如果创建版本时传回修订版本，此为必填项  optional\n      * @param {string} [opts.revisionNote] - 修订备注  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string revision  新建的修订版本号\n      */\n\n  createRevision (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createRevision\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling createRevision\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.revision !== undefined && opts.revision !== null) {\n      postBody['revision'] = opts.revision\n    }\n    if (opts.baseRevision !== undefined && opts.baseRevision !== null) {\n      postBody['baseRevision'] = opts.baseRevision\n    }\n    if (opts.revisionNote !== undefined && opts.revisionNote !== null) {\n      postBody['revisionNote'] = opts.revisionNote\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRevision with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询分组内全部修订版本号\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param revisionList revisions\n      */\n\n  getRevisionIds (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRevisionIds\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling getRevisionIds\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRevisionIds with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revisions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  检查版本号是否重复,返回重复的版本号,如果没有返回空\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.revision - 版本号\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean isRepeate  新建修订版本号重复否\n      */\n\n  checkRevisionExist (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkRevisionExist\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling checkRevisionExist\"\n      )\n    }\n    if (opts.revision === undefined || opts.revision === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revision' when calling checkRevisionExist\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.revision !== undefined && opts.revision !== null) {\n      postBody['revision'] = opts.revision\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkRevisionExist with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision:checkExist',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询某版本对应的api\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.revisionId - 版本ID\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - revision - 修订版本号，模糊匹配\nenvironment - 发布环境，模糊匹配\nrevisionNote - 修订备注，模糊匹配\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param api apis\n      * @param integer totalCount  查询的版本数目\n      */\n\n  queryRevision (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryRevision\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling queryRevision\"\n      )\n    }\n    if (opts.revisionId === undefined || opts.revisionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revisionId' when calling queryRevision\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      revisionId: opts.revisionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryRevision with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision/{revisionId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改单个修订版本\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.revisionId - 版本ID\n      * @param {string} [opts.revisionNote] - 修订备注  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean updateRevision  修改修订版本成功否\n      */\n\n  modifyRevision (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyRevision\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling modifyRevision\"\n      )\n    }\n    if (opts.revisionId === undefined || opts.revisionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revisionId' when calling modifyRevision\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.revisionNote !== undefined && opts.revisionNote !== null) {\n      postBody['revisionNote'] = opts.revisionNote\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      revisionId: opts.revisionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyRevision with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision/{revisionId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除单个修订版本\n      * @param {Object} opts - parameters\n      * @param {string} opts.apiGroupId - 分组ID\n      * @param {string} opts.revisionId - 版本ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean deleteRevision  删除修订版本成功否\n      */\n\n  deleteRevision (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRevision\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling deleteRevision\"\n      )\n    }\n    if (opts.revisionId === undefined || opts.revisionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revisionId' when calling deleteRevision\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      apiGroupId: opts.apiGroupId,\n      revisionId: opts.revisionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRevision with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apiGroups/{apiGroupId}/revision/{revisionId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询密钥列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - description - 名称，模糊匹配\nsubscriptionKeyId - subscriptionKeyId，精确匹配\norderBy - 排序类型 desc asc\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subscriptionKey subscriptionKeys\n      * @param integer totalCount  查询的密钥数目\n      */\n\n  querySubscriptionKeys (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  querySubscriptionKeys\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call querySubscriptionKeys with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/subscriptionKeys',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建密钥\n      * @param {Object} opts - parameters\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} [opts.name] - 密钥名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string subscriptionKeyId  已创建密钥ID\n      */\n\n  createSubscriptionKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSubscriptionKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSubscriptionKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/subscriptionKeys',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个密钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.subscriptionKeyId - subscription key id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subscriptionKey subscriptionKey\n      */\n\n  querySubscriptionKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  querySubscriptionKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.subscriptionKeyId === undefined ||\n      opts.subscriptionKeyId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subscriptionKeyId' when calling querySubscriptionKey\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subscriptionKeyId: opts.subscriptionKeyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call querySubscriptionKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/subscriptionKeys/{subscriptionKeyId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新密钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.subscriptionKeyId - subscription key id\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} [opts.name] - 密钥名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string subscriptionKeyId  已更新密钥Id\n      */\n\n  updateSubscriptionKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateSubscriptionKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.subscriptionKeyId === undefined ||\n      opts.subscriptionKeyId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subscriptionKeyId' when calling updateSubscriptionKey\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subscriptionKeyId: opts.subscriptionKeyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateSubscriptionKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/subscriptionKeys/{subscriptionKeyId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除密钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.subscriptionKeyId - subscription key id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string subscriptionKeyId  已删除密钥Id\n      */\n\n  deleteSubscriptionKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSubscriptionKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.subscriptionKeyId === undefined ||\n      opts.subscriptionKeyId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subscriptionKeyId' when calling deleteSubscriptionKey\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subscriptionKeyId: opts.subscriptionKeyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSubscriptionKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/subscriptionKeys/{subscriptionKeyId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询密钥列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - accessKey - accesskey，精确匹配\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ucAccessKey accessKeys\n      * @param integer totalCount  查询的密钥数目\n      */\n\n  queryUcAccessKeys (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryUcAccessKeys\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryUcAccessKeys with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/ucAccessKeys',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  校验pin是否存在\n      * @param {Object} opts - parameters\n      * @param {string} opts.pin - 京东云pin\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  checkPin (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkPin\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pin === undefined || opts.pin === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pin' when calling checkPin\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      pin: opts.pin\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkPin with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/pins/{pin}:checkPin',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询domian列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {string} [opts.orderBy] - 排序类型  optional\n      * @param {string} opts.apiGroupId - api分组id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  total count\n      * @param domainInfo data\n      */\n\n  queryUserDomains (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryUserDomains\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling queryUserDomains\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.orderBy !== undefined && opts.orderBy !== null) {\n      queryParams['orderBy'] = opts.orderBy\n    }\n    if (opts.apiGroupId !== undefined && opts.apiGroupId !== null) {\n      queryParams['apiGroupId'] = opts.apiGroupId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryUserDomains with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/userdomain',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加用户域名\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 域名\n      * @param {string} [opts.protocol] - 协议  optional\n      * @param {string} opts.apiGroupId - api分组id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domainId  生成的domainId\n      */\n\n  createUserDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createUserDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling createUserDomain\"\n      )\n    }\n    if (opts.apiGroupId === undefined || opts.apiGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apiGroupId' when calling createUserDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.protocol !== undefined && opts.protocol !== null) {\n      postBody['protocol'] = opts.protocol\n    }\n    if (opts.apiGroupId !== undefined && opts.apiGroupId !== null) {\n      postBody['apiGroupId'] = opts.apiGroupId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createUserDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/userdomain',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除用户域名接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainIds - 要删除domain的id集合，以,分隔\n      * @param {string} [opts.apiGroupId] - api分组id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteUserDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteUserDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainIds === undefined || opts.domainIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainIds' when calling deleteUserDomain\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainIds !== undefined && opts.domainIds !== null) {\n      queryParams['domainIds'] = opts.domainIds\n    }\n    if (opts.apiGroupId !== undefined && opts.apiGroupId !== null) {\n      queryParams['apiGroupId'] = opts.apiGroupId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  apigateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteUserDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/userdomain',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.APIGATEWAY\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/asset/v1/asset.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * JDCLOUD asset API\n * API JDCLOUD asset API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'asset'\nService._services[serviceId] = true\n\n/**\n * asset service.\n * @version 0.0.3\n */\n\nclass ASSET extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'asset.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询账户金额（总金额、可用金额、冻结金额、可提现金额、提现中金额）\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string totalAmount  总金额：可用金额+冻结金额\n      * @param string availableAmount  可用金额\n      * @param string frozenAmount  冻结金额：提现失败、处理中或预占中金额\n      * @param string enableWithdrawAmount  可提现金额：排除对公充值金额总额后的充值总额，如果余额大于非对公充值总额,则为非对公充值总额，否则为余额（对公充值&#x3D;企业线下汇款+企业充值+活动充值金额）\n      * @param string withdrawingAmount  提现中金额：提现状态为处理中和预占中的金额\n      */\n\n  describeAccountAmount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAccountAmount\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  asset/0.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAccountAmount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/assets:describeAccountAmount',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置余额预警信息\n      * @param {Object} opts - parameters\n      * @param {balanceWarningInfoVo} opts.balanceWarningInfoVo\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      */\n\n  modifyBalanceWarningInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBalanceWarningInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.balanceWarningInfoVo === undefined ||\n      opts.balanceWarningInfoVo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.balanceWarningInfoVo' when calling modifyBalanceWarningInfo\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.balanceWarningInfoVo !== undefined &&\n      opts.balanceWarningInfoVo !== null\n    ) {\n      postBody['balanceWarningInfoVo'] = opts.balanceWarningInfoVo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  asset/0.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBalanceWarningInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/assets:modifyBalanceWarningInfo',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = ASSET\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/assistant/v1/assistant.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * LogConfig\n * 用户日志相关配置\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'assistant'\nService._services[serviceId] = true\n\n/**\n * assistant service.\n * @version 1.0.2\n */\n\nclass ASSISTANT extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'assistant.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *\n保存用户自定义命令。\n\n详细操作说明请参考帮助文档：[用户自定义命令概述](https://docs.jdcloud.com/cn/virtual-machines/assistant-overview)\n\n## 接口说明\n- 该接口用于保存用户自定义命令。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.commandName - 命令名称，长度为1\\~128个字符，只允许中文、数字、大小写字母、英文下划线（\\_）、连字符（-）及点（.）。\n\n      * @param {string} [opts.commandType] - 命令类型，可选值：shell和powershell，默认shell\n  optional\n      * @param {string} opts.commandContent - 以base64编码的命令内容，编码后长度小于36KB\n\n      * @param {integer} [opts.timeout] - 超时时间，取值范围：[10, 86400], 超过该时间后，尚未执行完的命令会置为失败。默认60s\n  optional\n      * @param {string} [opts.username] - 用户名，执行该命令时的用户身份。在linux上默认是root，windows上默认是administrator。长度小于256\n  optional\n      * @param {string} [opts.workdir] - 命令执行路径。在linux上默认是/root，windows上默认是C:\\Windows\\System32。长度小于256。\n  optional\n      * @param {string} [opts.commandDescription] - 命令描述，描述该命令详细信息，如功能、使用注意事项等。长度小于256。\n  optional\n      * @param {boolean} [opts.enableParameter] - 是否使用参数, 默认false，不使用参数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string commandId  命令Id。\n      */\n\n  createCommand (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createCommand\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.commandName === undefined || opts.commandName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.commandName' when calling createCommand\"\n      )\n    }\n    if (opts.commandContent === undefined || opts.commandContent === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.commandContent' when calling createCommand\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.commandName !== undefined && opts.commandName !== null) {\n      postBody['commandName'] = opts.commandName\n    }\n    if (opts.commandType !== undefined && opts.commandType !== null) {\n      postBody['commandType'] = opts.commandType\n    }\n    if (opts.commandContent !== undefined && opts.commandContent !== null) {\n      postBody['commandContent'] = opts.commandContent\n    }\n    if (opts.timeout !== undefined && opts.timeout !== null) {\n      postBody['timeout'] = opts.timeout\n    }\n    if (opts.username !== undefined && opts.username !== null) {\n      postBody['username'] = opts.username\n    }\n    if (opts.workdir !== undefined && opts.workdir !== null) {\n      postBody['workdir'] = opts.workdir\n    }\n    if (\n      opts.commandDescription !== undefined &&\n      opts.commandDescription !== null\n    ) {\n      postBody['commandDescription'] = opts.commandDescription\n    }\n    if (opts.enableParameter !== undefined && opts.enableParameter !== null) {\n      postBody['enableParameter'] = opts.enableParameter\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  assistant/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCommand with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/createCommand',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询用户自定义命令。\n\n详细操作说明请参考帮助文档：[用户自定义命令概述](https://docs.jdcloud.com/cn/virtual-machines/assistant-overview)\n\n## 接口说明\n- 该接口用于查询用户保存的自定义命令。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页数，默认是第一页，取值为 1\n  optional\n      * @param {integer} [opts.pageSize] - 每页命令数，默认为20，最大为100\n  optional\n      * @param {array} [opts.commandIds] - 命令Id，最多可传入100个命令Id\n  optional\n      * @param {array} [opts.commandNames] - 命令名称，长度为1\\~128个字符，只允许中文、数字、大小写字母、英文下划线（\\_）、连字符（-）及点（.）。最多可传入100个命令名称。\n  optional\n      * @param {array} [opts.commandTypes] - 命令类型，可选值：shell和powershell，默认shell\n  optional\n      * @param {string} [opts.sourceType] - 命令来源，可选值：jdcloud（官方）和self，默认self\n  optional\n      * @param {array} [opts.usernames] - 用户名，执行该命令时的用户身份。在linux上默认是root，windows上默认是administrator。长度小于256\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总的命令数，可以根据该字段来决定是否继续查找\n      * @param command commands\n      */\n\n  describeCommands (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCommands\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.commandIds !== undefined && opts.commandIds !== null) {\n      postBody['commandIds'] = opts.commandIds\n    }\n    if (opts.commandNames !== undefined && opts.commandNames !== null) {\n      postBody['commandNames'] = opts.commandNames\n    }\n    if (opts.commandTypes !== undefined && opts.commandTypes !== null) {\n      postBody['commandTypes'] = opts.commandTypes\n    }\n    if (opts.sourceType !== undefined && opts.sourceType !== null) {\n      postBody['sourceType'] = opts.sourceType\n    }\n    if (opts.usernames !== undefined && opts.usernames !== null) {\n      postBody['usernames'] = opts.usernames\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  assistant/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCommands with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeCommands',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n删除用户自定义命令。\n\n详细操作说明请参考帮助文档：[用户自定义命令概述](https://docs.jdcloud.com/cn/virtual-machines/assistant-overview)\n\n## 接口说明\n- 该接口用于删除用户自定义命令。\n\n      * @param {Object} opts - parameters\n      * @param {array} [opts.commandIds] - 用户创建的命令Id\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string commandId  命令Id。\n      */\n\n  deleteCommands (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteCommands\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.commandIds !== undefined && opts.commandIds !== null) {\n      postBody['commandIds'] = opts.commandIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  assistant/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCommands with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/deleteCommands',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n执行用户保存的自定义命令。\n\n详细操作说明请参考帮助文档：[用户自定义命令概述](https://docs.jdcloud.com/cn/virtual-machines/assistant-overview)\n\n## 接口说明\n- 该接口用于执行用户保存的自定义命令。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.commandId - 命令Id\n\n      * @param {array} [opts.instances] - 运行该命令的云主机，与tags查到云主机取并集，一次最多云主机数50\n  optional\n      * @param {array} [opts.tags] - 根据tags确定运行该命令的云主机，与指定instances云主机取并集，一次最多云主机数50\n  optional\n      * @param {string} [opts.execTime] - 配置运行该命令的时刻，格式&#x60;yyyy-MM-dd HH:mm:ss&#x60;。不传该参数，立即执行命令。默认为空，可配置的时间范围为&#x60;当前时间+10minute&#x60;~&#x60;当前时间+6month&#x60;。\n  optional\n      * @param {integer} [opts.timeout] - 超时时间，取值范围：[10, 86400], 超过该时间后，尚未执行完的命令会置为失败。默认60s\n  optional\n      * @param {string} [opts.username] - 用户名，执行该命令时的用户身份。在linux上默认是root，windows上默认是administrator。长度小于256\n  optional\n      * @param {string} [opts.workdir] - 命令执行路径，在linux上默认为用户的home目录：/root, 在windows上默认为：C:\\Windows\\system32\n  optional\n      * @param {string} [opts.windowsPassword] - 和用户名相匹配的密码，仅适用于windows系统\n  optional\n      * @param {boolean} [opts.enableParameter] - 脚本中是否启用参数，true：启用，false：不启用。\n  optional\n      * @param {array} [opts.parameters] - 用户自定义参数和对应的参数值，数量不超过20。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string invokeId  命令调用Id。\n      */\n\n  invokeCommand (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  invokeCommand\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.commandId === undefined || opts.commandId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.commandId' when calling invokeCommand\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.commandId !== undefined && opts.commandId !== null) {\n      postBody['commandId'] = opts.commandId\n    }\n    if (opts.instances !== undefined && opts.instances !== null) {\n      postBody['instances'] = opts.instances\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (opts.execTime !== undefined && opts.execTime !== null) {\n      postBody['execTime'] = opts.execTime\n    }\n    if (opts.timeout !== undefined && opts.timeout !== null) {\n      postBody['timeout'] = opts.timeout\n    }\n    if (opts.username !== undefined && opts.username !== null) {\n      postBody['username'] = opts.username\n    }\n    if (opts.workdir !== undefined && opts.workdir !== null) {\n      postBody['workdir'] = opts.workdir\n    }\n    if (opts.windowsPassword !== undefined && opts.windowsPassword !== null) {\n      postBody['windowsPassword'] = opts.windowsPassword\n    }\n    if (opts.enableParameter !== undefined && opts.enableParameter !== null) {\n      postBody['enableParameter'] = opts.enableParameter\n    }\n    if (opts.parameters !== undefined && opts.parameters !== null) {\n      postBody['parameters'] = opts.parameters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  assistant/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call invokeCommand with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invokeCommand',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询命令调用。\n\n详细操作说明请参考帮助文档：[用户自定义命令概述](https://docs.jdcloud.com/cn/virtual-machines/assistant-overview)\n\n## 接口说明\n- 该接口用于查询命令调用。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页数，默认是第一页，取值1\n  optional\n      * @param {integer} [opts.pageSize] - 每页大小，默认20, 最大100\n  optional\n      * @param {array} [opts.invokeIds] - 命令执行Id\n  optional\n      * @param {array} [opts.commandIds] - 命令Id\n  optional\n      * @param {array} [opts.status] - 命令执行状态\n  optional\n      * @param {array} [opts.commandNames] - 命令名字\n  optional\n      * @param {array} [opts.commandTypes] - 命令类型， shell or powershell\n  optional\n      * @param {array} [opts.userNames] - 命令执行用户\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  命令调用的总数\n      * @param invocation invocations\n      */\n\n  describeInvocations (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInvocations\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.invokeIds !== undefined && opts.invokeIds !== null) {\n      postBody['invokeIds'] = opts.invokeIds\n    }\n    if (opts.commandIds !== undefined && opts.commandIds !== null) {\n      postBody['commandIds'] = opts.commandIds\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.commandNames !== undefined && opts.commandNames !== null) {\n      postBody['commandNames'] = opts.commandNames\n    }\n    if (opts.commandTypes !== undefined && opts.commandTypes !== null) {\n      postBody['commandTypes'] = opts.commandTypes\n    }\n    if (opts.userNames !== undefined && opts.userNames !== null) {\n      postBody['userNames'] = opts.userNames\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  assistant/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInvocations with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeInvocations',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n配置用户日志信息。\n\n详细操作说明请参考帮助文档：[用户自定义命令概述](https://docs.jdcloud.com/cn/virtual-machines/assistant-overview)\n\n## 接口说明\n- 该接口用于配置用户日志信息。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.logset] - 用户日志集名字\n  optional\n      * @param {string} opts.logtopic - 用户日志主题名字\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLogConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addLogConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.logtopic === undefined || opts.logtopic === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.logtopic' when calling addLogConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.logset !== undefined && opts.logset !== null) {\n      postBody['logset'] = opts.logset\n    }\n    if (opts.logtopic !== undefined && opts.logtopic !== null) {\n      postBody['logtopic'] = opts.logtopic\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  assistant/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLogConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/addLogConfig',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = ASSISTANT\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/autotaskpolicy/v1/autotaskpolicy.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 配额\n * 与配额相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'autotaskpolicy'\nService._services[serviceId] = true\n\n/**\n * autotaskpolicy service.\n * @version 1.0.1\n */\n\nclass AUTOTASKPOLICY extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'autotaskpolicy.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  创建策略，不同策略类型有不同的规则，具体如下。\n- AutoImage: 自动创建镜像策略\n    - fireCondition\n        - 仅支持&quot;interval&quot;，执行周期仅支持&quot;小时/天/周&quot;，如: &quot;interval 7d&quot;\n        - 两次执行时间间隔需要大于12小时\n    - fireTime\n        - 触发时间，首次创建时距离当前时间必须在30分钟以后至1年以内。\n        - 若策略曾经执行过，再次修改该字段时必须满足距离上一次执行时间超过12小时\n    - execResource\n        - 哪些云主机需要制作镜像，可指定具体云主机ID列表，每个策略最多绑定100个。\n        - 仅支持云盘系统盘的虚机\n    - execConfig\n        - 配置规则例子:\n        - [{&quot;key&quot;:&quot;includeDeviceName&quot;,&quot;value&quot;:&quot;vdb,vdc&quot;},{&quot;key&quot;:&quot;imageLiveDays&quot;,&quot;10&quot;}]\n        - includeDeviceName说明：云主机中的哪些云盘需要制作镜像，可指定具体盘符列表，或指定为&quot;all&quot;。云主机中的vda系统盘不可改变，一定要参与制作镜像。\n        - imageLiveDays说明：镜像保留时间，以天为单位，范围1-36500。不指定则永久有效。\n\n      * @param {Object} opts - parameters\n      * @param {policySpec} opts.policySpec - 策略配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string policyId  策略ID\n      */\n\n  createPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policySpec === undefined || opts.policySpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policySpec' when calling createPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.policySpec !== undefined && opts.policySpec !== null) {\n      postBody['policySpec'] = opts.policySpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  autotaskpolicy/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/policy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新策略。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 策略ID\n      * @param {modifyPolicySpec} opts.policySpec - 策略配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling modifyPolicy\"\n      )\n    }\n    if (opts.policySpec === undefined || opts.policySpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policySpec' when calling modifyPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.policySpec !== undefined && opts.policySpec !== null) {\n      postBody['policySpec'] = opts.policySpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  autotaskpolicy/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/policy/{policyId}:modify',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询策略详情。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 策略ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param policy policy\n      */\n\n  describePolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling describePolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  autotaskpolicy/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/policy/{policyId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除策略。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 策略ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deletePolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deletePolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling deletePolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  autotaskpolicy/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deletePolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/policy/{policyId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询策略列表。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，最大100。  optional\n      * @param {filter} [opts.filters] - policyId - 策略ID，精确匹配，支持多个\npolicyState - 策略状态，精确匹配，支持多个\npolicyType - 策略类型，精确匹配，支持多个\npolicyName - 策略名称，模糊匹配，支持一个\nresourceId - 已关联的资源ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param policy policies\n      * @param number totalCount\n      */\n\n  describePolicies (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePolicies\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  autotaskpolicy/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePolicies with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/policies',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  策略跨区复制。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 策略ID\n      * @param {string} opts.targetRegion - 目标地域\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string policyId  策略ID\n      */\n\n  copyPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  copyPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling copyPolicy\"\n      )\n    }\n    if (opts.targetRegion === undefined || opts.targetRegion === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetRegion' when calling copyPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.targetRegion !== undefined && opts.targetRegion !== null) {\n      postBody['targetRegion'] = opts.targetRegion\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  autotaskpolicy/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call copyPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/policy/{policyId}:copy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启策略。\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 策略ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enablePolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enablePolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling enablePolicy\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  autotaskpolicy/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enablePolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/policy/{policyId}:enable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭策略。\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 策略ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disablePolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disablePolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling disablePolicy\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  autotaskpolicy/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disablePolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/policy/{policyId}:disable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关联资源。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 策略ID\n      * @param {resource} opts.execResource - 关联的资源\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  associateExecResource (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateExecResource\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling associateExecResource\"\n      )\n    }\n    if (opts.execResource === undefined || opts.execResource === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.execResource' when calling associateExecResource\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.execResource !== undefined && opts.execResource !== null) {\n      postBody['execResource'] = opts.execResource\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  autotaskpolicy/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateExecResource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/policy/{policyId}:associateExecResource',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  取消关联资源。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 策略ID\n      * @param {resource} opts.execResource - 取消关联的资源\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disassociateExecResource (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateExecResource\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling disassociateExecResource\"\n      )\n    }\n    if (opts.execResource === undefined || opts.execResource === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.execResource' when calling disassociateExecResource\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.execResource !== undefined && opts.execResource !== null) {\n      postBody['execResource'] = opts.execResource\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  autotaskpolicy/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateExecResource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/policy/{policyId}:disassociateExecResource',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = AUTOTASKPOLICY\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/baseanti/v1/baseanti.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * IP Resource APIs\n * Anti DDoS Basic IP Resource APIs\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'baseanti'\nService._services[serviceId] = true\n\n/**\n * baseanti service.\n * @version 1.3.0\n */\n\nclass BASEANTI extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'baseanti.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询攻击记录\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} opts.startTime - 开始时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} opts.endTime - 结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.ip] - 基础防护已防护的公网 IP, ip 不为空时, 查询 ip 对应的攻击记录, ip 为空时, 查询用户所有攻击记录&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeelasticipresources&#39;&gt;describeElasticIpResources&lt;/a&gt; 接口查询基础防护已防护的私有网络弹性公网 IP&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describecpsipresources&#39;&gt;describeCpsIpResources&lt;/a&gt; 接口查询基础防护已防护的云物理服务器公网IP 和 弹性公网 IP&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeccsipresources&#39;&gt;describeCcsIpResources&lt;/a&gt; 接口查询基础防护已防护的托管区公网 IP  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param attackLog dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describeAttackLogs (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeAttackLogs\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeAttackLogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(queryParams, super.buildArrayParam(opts.ip, 'ip'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAttackLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/attacklog',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  攻击情况统计\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} opts.endTime - 结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.ip] - 基础防护已防护的公网 IP, ip 不为空时, 统计 ip 对应的攻击情况, ip 为空时, 统计用户所有公网 IP 的攻击情况. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeelasticipresources&#39;&gt;describeElasticIpResources&lt;/a&gt; 接口查询基础防护已防护的私有网络弹性公网 IP. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describecpsipresources&#39;&gt;describeCpsIpResources&lt;/a&gt; 接口查询基础防护已防护的云物理服务器公网IP 和 弹性公网 IP. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeccsipresources&#39;&gt;describeCcsIpResources&lt;/a&gt; 接口查询基础防护已防护的托管区公网 IP  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer attackCount  攻击次数\n      * @param integer blackHoleCount  黑洞次数\n      * @param number peak  攻击流量峰值\n      * @param string unit  攻击流量单位\n      */\n\n  describeAttackStatistics (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeAttackStatistics\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeAttackStatistics\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(queryParams, super.buildArrayParam(opts.ip, 'ip'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAttackStatistics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeAttackStatistics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询各类型攻击次数\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} opts.endTime - 结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.ip] - 基础防护已防护的公网 IP, ip 不为空时, 查询 ip 对应的各类型攻击次数, ip 为空时, 查询用户所有公网 IP 的各类型攻击次数. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeelasticipresources&#39;&gt;describeElasticIpResources&lt;/a&gt; 接口查询基础防护已防护的私有网络弹性公网 IP. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describecpsipresources&#39;&gt;describeCpsIpResources&lt;/a&gt; 接口查询基础防护已防护的云物理服务器公网IP 和 弹性公网 IP. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeccsipresources&#39;&gt;describeCcsIpResources&lt;/a&gt; 接口查询基础防护已防护的托管区公网 IP  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param attackTypeCount dataList\n      */\n\n  describeAttackTypeCount (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeAttackTypeCount\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeAttackTypeCount\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(queryParams, super.buildArrayParam(opts.ip, 'ip'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAttackTypeCount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeAttackTypeCount',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询多个公网 IP 的监控流量, 支持 ipv4 和 ipv6\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} opts.endTime - 结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.ip] - 基础防护已防护的公网 IP. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeelasticipresources&#39;&gt;describeElasticIpResources&lt;/a&gt; 接口查询基础防护已防护的私有网络弹性公网 IP. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describecpsipresources&#39;&gt;describeCpsIpResources&lt;/a&gt; 接口查询基础防护已防护的云物理服务器公网IP 和 弹性公网 IP. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeccsipresources&#39;&gt;describeCcsIpResources&lt;/a&gt; 接口查询基础防护已防护的托管区公网 IP  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResourceFlow bps\n      * @param ipResourceFlow pps\n      */\n\n  describeIpMonitorFlow (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeIpMonitorFlow\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeIpMonitorFlow\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(queryParams, super.buildArrayParam(opts.ip, 'ip'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpMonitorFlow with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeIpMonitorFlow',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询基础防护已防护的公网 IP 的安全信息列表. 包括私有网络的弹性公网 IP(运营商级 NAT 保留地址除外), 云物理服务器的公网 IP 和弹性公网 IP. (已废弃, 建议使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeelasticipresources&#39;&gt;describeElasticIpResources&lt;/a&gt;, &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describecpsipresources&#39;&gt;describeCpsIpResources&lt;/a&gt; 接口)\n      * @param {Object} opts - parameters\n      * @param {string} [opts.ip] - IP 模糊匹配  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResource dataList\n      * @param integer totalCount\n      */\n\n  describeIpResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.ip !== undefined && opts.ip !== null) {\n      queryParams['ip'] = opts.ip\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ipResources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询基础防护已防护的私有网络的弹性公网 IP 的安全信息. 包括私有网络的弹性公网 IP(运营商级 NAT 保留地址除外)\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} [opts.ip] - IP 模糊匹配  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResource dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeElasticIpResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeElasticIpResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.ip !== undefined && opts.ip !== null) {\n      queryParams['ip'] = opts.ip\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeElasticIpResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIpResources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询基础防护已防护的云物理服务器公网 IP 的安全信息. 包括云物理服务器的公网 IP 和弹性公网 IP.\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} [opts.ip] - IP 模糊匹配  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResource dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeCpsIpResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCpsIpResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.ip !== undefined && opts.ip !== null) {\n      queryParams['ip'] = opts.ip\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCpsIpResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cpsIpResources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询基础防护已防护的托管区 IP 的安全信息\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} [opts.ip] - IP 模糊匹配  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResource dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeCcsIpResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCcsIpResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.ip !== undefined && opts.ip !== null) {\n      queryParams['ip'] = opts.ip\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCcsIpResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ccsIpResources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询基础防护已防护的Web应用防火墙 IP 的安全信息\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} [opts.ip] - IP 模糊匹配  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResource dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeWafIpResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWafIpResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.ip !== undefined && opts.ip !== null) {\n      queryParams['ip'] = opts.ip\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWafIpResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafIpResources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询公网 IP 安全信息, 仅支持 ipv4. (已废弃, 建议使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeipsafetyinfo&#39;&gt;describeIpSafetyInfo&lt;/a&gt; 接口)\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.ip - 基础防护已防护的公网 IP, 仅支持 ipv4 格式. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeelasticipresources&#39;&gt;describeElasticIpResources&lt;/a&gt; 接口查询基础防护已防护的私有网络弹性公网 IP&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describecpsipresources&#39;&gt;describeCpsIpResources&lt;/a&gt; 接口查询基础防护已防护的云物理服务器公网 IP 和 弹性公网 IP&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeccsipresources&#39;&gt;describeCcsIpResources&lt;/a&gt; 接口查询基础防护已防护的托管区公网 IP\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResourceInfo data\n      */\n\n  describeIpResourceInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpResourceInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.ip === undefined || opts.ip === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ip' when calling describeIpResourceInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      ip: opts.ip\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpResourceInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ipResources/{ip}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询基础防护已防护公网 IP 安全信息, 支持 ipv4 和 ipv6\n      * @param {Object} opts - parameters\n      * @param {string} opts.ip - 基础防护已防护公网 IP, 支持 ipv4 和 ipv6.\n&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeelasticipresources&#39;&gt;describeElasticIpResources&lt;/a&gt; 接口查询基础防护已防护的私有网络弹性公网 IP\n&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describecpsipresources&#39;&gt;describeCpsIpResources&lt;/a&gt; 接口查询基础防护已防护的云物理服务器公网IP 和 弹性公网 IP\n&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describewafipresources&#39;&gt;describeWafIpResources&lt;/a&gt; 接口查询基础防护已防护的Web应用防火墙 IP\n&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeccsipresources&#39;&gt;describeCcsIpResources&lt;/a&gt; 接口查询基础防护已防护的托管区公网 IP\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipSafetyInfo data\n      */\n\n  describeIpSafetyInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpSafetyInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.ip === undefined || opts.ip === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ip' when calling describeIpSafetyInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.ip !== undefined && opts.ip !== null) {\n      queryParams['ip'] = opts.ip\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpSafetyInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeIpSafetyInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置基础防护已防护公网 IP 的清洗阈值, 仅支持 ipv4. (已废弃, 建议使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/setipcleanthreshold&#39;&gt;setIpCleanThreshold&lt;/a&gt; 接口)\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.ip - 基础防护已防护的公网 IP, 仅支持 ipv4 格式. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeelasticipresources&#39;&gt;describeElasticIpResources&lt;/a&gt; 接口查询基础防护已防护的私有网络弹性公网 IP&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describecpsipresources&#39;&gt;describeCpsIpResources&lt;/a&gt; 接口查询基础防护已防护的云物理服务器公网 IP 和 弹性公网 IP&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeccsipresources&#39;&gt;describeCcsIpResources&lt;/a&gt; 接口查询基础防护已防护的托管区公网 IP\n      * @param {cleanThresholdSpec} opts.cleanThresholdSpec - 请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setCleanThreshold (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setCleanThreshold\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.ip === undefined || opts.ip === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ip' when calling setCleanThreshold\"\n      )\n    }\n    if (\n      opts.cleanThresholdSpec === undefined ||\n      opts.cleanThresholdSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cleanThresholdSpec' when calling setCleanThreshold\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.cleanThresholdSpec !== undefined &&\n      opts.cleanThresholdSpec !== null\n    ) {\n      postBody['cleanThresholdSpec'] = opts.cleanThresholdSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      ip: opts.ip\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setCleanThreshold with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ipResources/{ip}:setCleanThreshold',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置基础防护已防护公网 IP 的清洗阈值, 支持 ipv4 和 ipv6\n      * @param {Object} opts - parameters\n      * @param {ipCleanThresholdSpec} opts.ipCleanThresholdSpec - 请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  修改结果, 0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  setIpCleanThreshold (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setIpCleanThreshold\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.ipCleanThresholdSpec === undefined ||\n      opts.ipCleanThresholdSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipCleanThresholdSpec' when calling setIpCleanThreshold\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.ipCleanThresholdSpec !== undefined &&\n      opts.ipCleanThresholdSpec !== null\n    ) {\n      postBody['ipCleanThresholdSpec'] = opts.ipCleanThresholdSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setIpCleanThreshold with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/setIpCleanThreshold',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询公网 IP 可设置清洗阈值范围, 支持 ipv4 和 ipv6\n      * @param {Object} opts - parameters\n      * @param {string} opts.ip - 基础防护已防护公网 IP, 支持 ipv4 和 ipv6.\n&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeelasticipresources&#39;&gt;describeElasticIpResources&lt;/a&gt; 接口查询基础防护已防护的私有网络弹性公网 IP\n&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describecpsipresources&#39;&gt;describeCpsIpResources&lt;/a&gt; 接口查询基础防护已防护的云物理服务器公网IP 和 弹性公网 IP\n&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describewafipresources&#39;&gt;describeWafIpResources&lt;/a&gt; 接口查询基础防护已防护的Web应用防火墙 IP\n&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeccsipresources&#39;&gt;describeCcsIpResources&lt;/a&gt; 接口查询基础防护已防护的托管区公网 IP\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipCleanThresholdRange data\n      */\n\n  describeIpCleanThresholdRange (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpCleanThresholdRange\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.ip === undefined || opts.ip === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ip' when calling describeIpCleanThresholdRange\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.ip !== undefined && opts.ip !== null) {\n      queryParams['ip'] = opts.ip\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpCleanThresholdRange with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeIpCleanThresholdRange',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询公网 IP 的攻击记录, 仅支持 ipv4. (已废弃, 建议使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeattacklogs&#39;&gt;describeAttackLogs&lt;/a&gt; 接口)\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.ip - 基础防护已防护的公网 IP, 仅支持 ipv4 格式. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeelasticipresources&#39;&gt;describeElasticIpResources&lt;/a&gt; 接口查询基础防护已防护的私有网络弹性公网 IP&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describecpsipresources&#39;&gt;describeCpsIpResources&lt;/a&gt; 接口查询基础防护已防护的云物理服务器公网 IP 和 弹性公网 IP&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeccsipresources&#39;&gt;describeCcsIpResources&lt;/a&gt; 接口查询基础防护已防护的托管区公网 IP\n      * @param {integer} [opts.start] - 限制查询的开始范围  optional\n      * @param {integer} [opts.limit] - 限制查询的记录数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResourceProtectInfo dataList\n      */\n\n  describeIpResourceProtectInfo (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpResourceProtectInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.ip === undefined || opts.ip === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ip' when calling describeIpResourceProtectInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.start !== undefined && opts.start !== null) {\n      queryParams['start'] = opts.start\n    }\n    if (opts.limit !== undefined && opts.limit !== null) {\n      queryParams['limit'] = opts.limit\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      ip: opts.ip\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpResourceProtectInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ipResources/{ip}/protectInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询公网 IP 的 endTime 之前 15 分钟内监控流量, 仅支持 ipv4. (已废弃, 建议使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeipmonitorflow&#39;&gt;describeIpMonitorFlow&lt;/a&gt; 接口)\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.ip - 基础防护已防护的公网 IP, 仅支持 ipv4 格式. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeelasticipresources&#39;&gt;describeElasticIpResources&lt;/a&gt; 接口查询基础防护已防护的私有网络弹性公网 IP&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describecpsipresources&#39;&gt;describeCpsIpResources&lt;/a&gt; 接口查询基础防护已防护的云物理服务器公网 IP 和 弹性公网 IP&lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-basic/api/describeccsipresources&#39;&gt;describeCcsIpResources&lt;/a&gt; 接口查询基础防护已防护的托管区公网 IP\n      * @param {string} [opts.endTime] - 查询的结束时间, UTC时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ, 为空时查询当前时间之前 15 分钟内监控流量  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipResourceFlow bps\n      * @param ipResourceFlow pps\n      */\n\n  describeIpResourceFlow (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpResourceFlow\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.ip === undefined || opts.ip === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ip' when calling describeIpResourceFlow\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      ip: opts.ip\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  baseanti/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpResourceFlow with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ipResources/{ip}/monitorFlow',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = BASEANTI\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/bastion/v1/bastion.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * statistics\n * 堡垒机规格分布数量信息\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'bastion'\nService._services[serviceId] = true\n\n/**\n * bastion service.\n * @version 1.0.0\n */\n\nclass BASTION extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'bastion.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  批量查询堡垒机的信息，此接口支持分页查询，默认每页20条\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - bid - 应用ID，精确匹配\nname - 应用名，精确匹配\n  optional\n      * @param {sort} [opts.sorts] - createTime - 创建时间,asc（正序），desc（倒序）\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bastion bastions\n      * @param number totalCount\n      */\n\n  describeBastions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBastions\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bastion/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBastions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bastions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个堡垒机的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.bid - 堡垒机id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bastion bastion\n      */\n\n  describeBastion (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBastion\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bid === undefined || opts.bid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bid' when calling describeBastion\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bid: opts.bid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bastion/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBastion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bastion/{bid}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新堡垒机实例的描述信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.bid - 堡垒机id\n      * @param {string} opts.desc - 描述信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result\n      */\n\n  updateBastionDesc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateBastionDesc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bid === undefined || opts.bid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bid' when calling updateBastionDesc\"\n      )\n    }\n    if (opts.desc === undefined || opts.desc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.desc' when calling updateBastionDesc\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.desc !== undefined && opts.desc !== null) {\n      postBody['desc'] = opts.desc\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bid: opts.bid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bastion/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateBastionDesc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bastion/{bid}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取加密sign\n      * @param {Object} opts - parameters\n      * @param {string} [opts.pin] - 用户pin  optional\n      * @param {string} opts.bastionId - 堡垒机实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param sign sign\n      */\n\n  describeSign (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSign\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bastionId === undefined || opts.bastionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bastionId' when calling describeSign\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n    if (opts.bastionId !== undefined && opts.bastionId !== null) {\n      queryParams['bastionId'] = opts.bastionId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bastion/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSign with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/sign',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个堡垒机的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 堡垒机id\n      * @param {string} opts.instanceId - 资源id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance bastion\n      */\n\n  describeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstance\"\n      )\n    }\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bastion/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 堡垒机id\n      * @param {string} opts.instanceId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result  结果\n      */\n\n  deleteInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteInstance\"\n      )\n    }\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bastion/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开关零信任功能\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 堡垒机id\n      * @param {string} opts.instanceId\n      * @param {boolean} opts.status\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result  结果\n      */\n\n  setInstanceZeroEnable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setInstanceZeroEnable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling setInstanceZeroEnable\"\n      )\n    }\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling setInstanceZeroEnable\"\n      )\n    }\n    if (opts.status === undefined || opts.status === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.status' when calling setInstanceZeroEnable\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bastion/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setInstanceZeroEnable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceId}/zero',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置公网IP状态，true为开放，false为关闭\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 堡垒机id\n      * @param {string} opts.instanceId\n      * @param {boolean} opts.status\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result  结果\n      */\n\n  setInstancePublicAccess (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setInstancePublicAccess\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling setInstancePublicAccess\"\n      )\n    }\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling setInstancePublicAccess\"\n      )\n    }\n    if (opts.status === undefined || opts.status === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.status' when calling setInstancePublicAccess\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bastion/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setInstancePublicAccess with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceId}/publicAccess',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建指定配置实例\n      * @param {Object} opts - parameters\n      * @param {instanceSpec} opts.instanceSpec - 实例的相关配置\n      * @param {chargeSpec} [opts.chargeSpec] - 计费信息的相关配置  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string buyId  交易buyId\n      * @param source sourceIds\n      */\n\n  createInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n    if (opts.chargeSpec !== undefined && opts.chargeSpec !== null) {\n      postBody['chargeSpec'] = opts.chargeSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bastion/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  变更实例的配置,目前只允许升配\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.spec - 升配的规格\n      * @param {boolean} [opts.autoPay] - 自动付款  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string buyId  交易buyId\n      */\n\n  modifyInstanceSpec (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceSpec\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceSpec\"\n      )\n    }\n    if (opts.spec === undefined || opts.spec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.spec' when calling modifyInstanceSpec\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.spec !== undefined && opts.spec !== null) {\n      postBody['spec'] = opts.spec\n    }\n    if (opts.autoPay !== undefined && opts.autoPay !== null) {\n      postBody['autoPay'] = opts.autoPay\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bastion/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceSpec with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceSpec',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  变更实例到期或者恢复实例服务\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {integer} opts.status - 实例到期或者恢复实例服务 1:恢复实例服务 13:设置服务到期状态\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result\n      */\n\n  modifyInstanceExpireOrStart (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceExpireOrStart\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceExpireOrStart\"\n      )\n    }\n    if (opts.status === undefined || opts.status === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.status' when calling modifyInstanceExpireOrStart\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bastion/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceExpireOrStart with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceExpireOrStart',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个堡垒机的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.sourceId - sourceid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bastion bastion\n      */\n\n  describeSourceId (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSourceId\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.sourceId === undefined || opts.sourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sourceId' when calling describeSourceId\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.sourceId !== undefined && opts.sourceId !== null) {\n      queryParams['sourceId'] = opts.sourceId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bastion/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSourceId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/order/{sourceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取堡垒机有效信息\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - valid - 有效用户 1:0\nupgrade - 升配标志 1:0\n  optional\n      * @param {sort} [opts.sorts] - createTime - 创建时间,asc（正序），desc（倒序）\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param userPin pins\n      */\n\n  describePins (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePins\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bastion/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePins with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pins',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = BASTION\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/bgw/v1/bgw.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * instances\n * 续费查询实例信息接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'bgw'\nService._services[serviceId] = true\n\n/**\n * bgw service.\n * @version 1.3.1\n */\n\nclass BGW extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'bgw.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  修改VPN隧道管理状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpnTunnelId - VPN Tunnel ID\n      * @param {string} opts.adminStatus - 隧道管理状态, UP, DOWN\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyAdminStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyAdminStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpnTunnelId === undefined || opts.vpnTunnelId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpnTunnelId' when calling modifyAdminStatus\"\n      )\n    }\n    if (opts.adminStatus === undefined || opts.adminStatus === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.adminStatus' when calling modifyAdminStatus\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.adminStatus !== undefined && opts.adminStatus !== null) {\n      postBody['adminStatus'] = opts.adminStatus\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpnTunnelId: opts.vpnTunnelId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bgw/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyAdminStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpnTunnels/{vpnTunnelId}:adminStatus',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询连接列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - connectionIds - 连接ID列表，支持多个\nconnectionNames - 连接名称列表,支持多个\ntypes - 类型，取值：jcloud_hosted:托管连接、jcloud_partner:合作伙伴连接、jcloud:自助连接, 支持多个\nstatus - Connection状态,支持单个。取值为：待审核(Ordering)、待支付(Installation_Paying)、施工中(Pending)、等待确认(Confirming)、可用(Active)、不可用(InActive)、删除中(Deleting)、已删除(Deleted)、审核未通过(Rejected)\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param connection connections\n      * @param integer totalCount  总数量\n      */\n\n  describeConnections (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeConnections\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bgw/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeConnections with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/connections/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = BGW\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/billing/v1/billing.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 停删规则\n * 停删规则\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'billing'\nService._services[serviceId] = true\n\n/**\n * billing service.\n * @version 1.1.16\n */\n\nclass BILLING extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'billing.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询账单资源汇总数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 账期开始时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} opts.endTime - 账期结束时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} [opts.appCode] - 产品线代码  optional\n      * @param {string} [opts.serviceCode] - 产品代码  optional\n      * @param {array} [opts.resourceIds] - 资源单id列表,最多支持传入500个  optional\n      * @param {array} [opts.tags] - 标签,JSON格式:[{&quot;k1&quot;:&quot;v1&quot;},{&quot;k1&quot;:&quot;v2&quot;},{&quot;k2&quot;:&quot;&quot;}]\n示例:\n选择的标签为, 部门:广告部、部门:物流部、项目\n则传值为:[{&quot;部门&quot;:&quot;广告部&quot;},{&quot;部门&quot;:&quot;物流部&quot;},{&quot;项目&quot;:&quot;&quot;}]\n  optional\n      * @param {integer} [opts.pageIndex] - pageIndex 分页,默认从1开始  optional\n      * @param {integer} [opts.pageSize] - pageSize 每页查询数据条数,最多支持1000条  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination\n      * @param billSummary result\n      */\n\n  queryBillSummary (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryBillSummary\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling queryBillSummary\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling queryBillSummary\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.resourceIds !== undefined && opts.resourceIds !== null) {\n      postBody['resourceIds'] = opts.resourceIds\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      postBody['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  billing/1.1.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBillSummary with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/billSummary:list',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询账单明细数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 账期开始时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} opts.endTime - 账期结束时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} [opts.appCode] - 产品线代码  optional\n      * @param {string} [opts.serviceCode] - 产品代码  optional\n      * @param {integer} [opts.billingType] - 计费类型 1、按配置 2、按用量 3、包年包月 4、按次  optional\n      * @param {array} [opts.resourceIds] - 资源单id列表,最多支持传入500个  optional\n      * @param {array} [opts.tags] - 标签,JSON格式:[{&quot;k1&quot;:&quot;v1&quot;},{&quot;k1&quot;:&quot;v2&quot;},{&quot;k2&quot;:&quot;&quot;}]\n示例:\n选择的标签为, 部门:广告部、部门:物流部、项目\n则传值为:[{&quot;部门&quot;:&quot;广告部&quot;},{&quot;部门&quot;:&quot;物流部&quot;},{&quot;项目&quot;:&quot;&quot;}]\n  optional\n      * @param {integer} [opts.pageIndex] - pageIndex 分页,默认从1开始  optional\n      * @param {integer} [opts.pageSize] - pageSize 每页查询数据条数,最多支持1000条  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination\n      * @param billSummary result\n      */\n\n  queryBillDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryBillDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling queryBillDetail\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling queryBillDetail\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.billingType !== undefined && opts.billingType !== null) {\n      postBody['billingType'] = opts.billingType\n    }\n    if (opts.resourceIds !== undefined && opts.resourceIds !== null) {\n      postBody['resourceIds'] = opts.resourceIds\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      postBody['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  billing/1.1.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBillDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/billDetail:list',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询账单资源汇总数据V2版本\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 账期开始时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} opts.endTime - 账期结束时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} [opts.appCode] - 产品线代码  optional\n      * @param {string} [opts.serviceCode] - 产品代码  optional\n      * @param {array} [opts.resourceIds] - 资源单id列表,最多支持传入500个  optional\n      * @param {array} [opts.tags] - 标签,JSON格式:[{&quot;k1&quot;:&quot;v1&quot;},{&quot;k1&quot;:&quot;v2&quot;},{&quot;k2&quot;:&quot;&quot;}]\n示例:\n选择的标签为, 部门:广告部、部门:物流部、项目\n则传值为:[{&quot;部门&quot;:&quot;广告部&quot;},{&quot;部门&quot;:&quot;物流部&quot;},{&quot;项目&quot;:&quot;&quot;}]\n  optional\n      * @param {integer} [opts.pageIndex] - pageIndex 分页,默认从1开始  optional\n      * @param {integer} [opts.pageSize] - pageSize 每页查询数据条数,最多支持1000条  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination\n      * @param billSummaryV2 result\n      */\n\n  describeBillSummarys (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBillSummarys\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeBillSummarys\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeBillSummarys\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.resourceIds !== undefined && opts.resourceIds !== null) {\n      postBody['resourceIds'] = opts.resourceIds\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      postBody['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  billing/1.1.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBillSummarys with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeBillSummarys',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询账单明细数据V2版本\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 账期开始时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} opts.endTime - 账期结束时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} [opts.appCode] - 产品线代码  optional\n      * @param {string} [opts.serviceCode] - 产品代码  optional\n      * @param {integer} [opts.billingType] - 计费类型 1、按配置 2、按用量 3、包年包月 4、按次  optional\n      * @param {array} [opts.resourceIds] - 资源单id列表,最多支持传入500个  optional\n      * @param {array} [opts.tags] - 标签,JSON格式:[{&quot;k1&quot;:&quot;v1&quot;},{&quot;k1&quot;:&quot;v2&quot;},{&quot;k2&quot;:&quot;&quot;}]\n示例:\n选择的标签为, 部门:广告部、部门:物流部、项目\n则传值为:[{&quot;部门&quot;:&quot;广告部&quot;},{&quot;部门&quot;:&quot;物流部&quot;},{&quot;项目&quot;:&quot;&quot;}]\n  optional\n      * @param {integer} [opts.pageIndex] - pageIndex 分页,默认从1开始  optional\n      * @param {integer} [opts.pageSize] - pageSize 每页查询数据条数,最多支持1000条  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination\n      * @param billSummaryV2 result\n      */\n\n  describeBillDetails (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBillDetails\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeBillDetails\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeBillDetails\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.billingType !== undefined && opts.billingType !== null) {\n      postBody['billingType'] = opts.billingType\n    }\n    if (opts.resourceIds !== undefined && opts.resourceIds !== null) {\n      postBody['resourceIds'] = opts.resourceIds\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      postBody['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  billing/1.1.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBillDetails with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeBillDetails',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询计费项账单月汇总数据\n      * @param {Object} opts - parameters\n      * @param {integer} opts.billDate - 账期时间,不支持跨月查询。格式:yyyyMM\n      * @param {string} [opts.appCode] - 产品线代码  optional\n      * @param {string} [opts.serviceCode] - 产品代码  optional\n      * @param {string} [opts.region] - 地域编码，如：cn-north-1  optional\n      * @param {string} [opts.resourceId] - 资源单id  optional\n      * @param {integer} [opts.pageIndex] - pageIndex 分页,默认从1开始  optional\n      * @param {integer} [opts.pageSize] - pageSize 每页查询数据条数,最多支持1000条  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination\n      * @param formulaBillSummary result\n      */\n\n  describeFormulaSummaryList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeFormulaSummaryList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.billDate === undefined || opts.billDate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.billDate' when calling describeFormulaSummaryList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.billDate !== undefined && opts.billDate !== null) {\n      postBody['billDate'] = opts.billDate\n    }\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.region !== undefined && opts.region !== null) {\n      postBody['region'] = opts.region\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      postBody['resourceId'] = opts.resourceId\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      postBody['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  billing/1.1.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeFormulaSummaryList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeFormulaSummaryList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询分账账单天汇总数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 账期开始时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} opts.endTime - 账期结束时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} [opts.appCode] - 产品线代码  optional\n      * @param {string} [opts.serviceCode] - 产品代码  optional\n      * @param {array} [opts.subIds] - 拆分项ID列表,最多支持传入500个  optional\n      * @param {array} [opts.tags] - 标签,JSON格式:[{&quot;k1&quot;:&quot;v1&quot;},{&quot;k1&quot;:&quot;v2&quot;},{&quot;k2&quot;:&quot;&quot;}]\n示例:\n选择的标签为, 部门:广告部、部门:物流部、项目\n则传值为:[{&quot;部门&quot;:&quot;广告部&quot;},{&quot;部门&quot;:&quot;物流部&quot;},{&quot;项目&quot;:&quot;&quot;}]\n  optional\n      * @param {integer} [opts.pageIndex] - pageIndex 分页,默认从1开始  optional\n      * @param {integer} [opts.pageSize] - pageSize 每页查询数据条数,最多支持1000条  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination\n      * @param splitItemBillSummary result\n      */\n\n  querySplitItemDaySummary (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  querySplitItemDaySummary\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling querySplitItemDaySummary\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling querySplitItemDaySummary\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.subIds !== undefined && opts.subIds !== null) {\n      postBody['subIds'] = opts.subIds\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      postBody['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  billing/1.1.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call querySplitItemDaySummary with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/splitItemBillDaySummary:List',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询分账账单月汇总数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 账期开始时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} opts.endTime - 账期结束时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} [opts.appCode] - 产品线代码  optional\n      * @param {string} [opts.serviceCode] - 产品代码  optional\n      * @param {array} [opts.subIds] - 拆分项ID列表,最多支持传入500个  optional\n      * @param {array} [opts.tags] - 标签,JSON格式:[{&quot;k1&quot;:&quot;v1&quot;},{&quot;k1&quot;:&quot;v2&quot;},{&quot;k2&quot;:&quot;&quot;}]\n示例:\n选择的标签为, 部门:广告部、部门:物流部、项目\n则传值为:[{&quot;部门&quot;:&quot;广告部&quot;},{&quot;部门&quot;:&quot;物流部&quot;},{&quot;项目&quot;:&quot;&quot;}]\n  optional\n      * @param {integer} [opts.pageIndex] - pageIndex 分页,默认从1开始  optional\n      * @param {integer} [opts.pageSize] - pageSize 每页查询数据条数,最多支持1000条  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination\n      * @param splitItemBillSummary result\n      */\n\n  querySplitItemMonthSummary (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  querySplitItemMonthSummary\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling querySplitItemMonthSummary\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling querySplitItemMonthSummary\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.subIds !== undefined && opts.subIds !== null) {\n      postBody['subIds'] = opts.subIds\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      postBody['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  billing/1.1.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call querySplitItemMonthSummary with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/splitItemBillMonthSummary:List',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询账单资源天汇总数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 账期开始时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} opts.endTime - 账期结束时间,不支持跨月查询。格式:yyyy-MM-dd HH:mm:ss\n      * @param {string} [opts.appCode] - 产品线代码  optional\n      * @param {string} [opts.serviceCode] - 产品代码  optional\n      * @param {array} [opts.resourceIds] - 资源单id列表,最多支持传入500个  optional\n      * @param {array} [opts.tags] - 标签,JSON格式:[{&quot;k1&quot;:&quot;v1&quot;},{&quot;k1&quot;:&quot;v2&quot;},{&quot;k2&quot;:&quot;&quot;}]\n示例:\n选择的标签为, 部门:广告部、部门:物流部、项目\n则传值为:[{&quot;部门&quot;:&quot;广告部&quot;},{&quot;部门&quot;:&quot;物流部&quot;},{&quot;项目&quot;:&quot;&quot;}]\n  optional\n      * @param {integer} [opts.pageIndex] - pageIndex 分页,默认从1开始  optional\n      * @param {integer} [opts.pageSize] - pageSize 每页查询数据条数,最多支持1000条  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination\n      * @param billSummary result\n      */\n\n  queryBillDaySummary (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryBillDaySummary\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling queryBillDaySummary\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling queryBillDaySummary\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.resourceIds !== undefined && opts.resourceIds !== null) {\n      postBody['resourceIds'] = opts.resourceIds\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      postBody['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  billing/1.1.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBillDaySummary with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/billDaySummary:list',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询计费价格信息\n      * @param {Object} opts - parameters\n      * @param {integer} opts.cmd - 操作类型 1:新购 2:续费 3:变配\n      * @param {array} [opts.orderList] - 计算价格的订单  optional\n      * @param {string} [opts.operateTime] - 操作时间(格式为：yyyy-MM-dd HH:mm:ss)  optional\n      * @param {string} [opts.promotionInfo] - 1:折扣（不需要传） 2:免费活动3:付费活动 4:推荐码 5:会员价 [{&quot;promotionType&quot;:1,&quot;activityCode&quot;:123},{&quot;promotionType&quot;:2,&quot;activityCode&quot;:}]  optional\n      * @param {integer} [opts.clientType] - 客户端：1.PC端；2.移动端；  optional\n      * @param {integer} opts.packageCount - 批量购买时数量\n      * @param {integer} [opts.processType] - 临时升配时必传，3-临时升配  optional\n      * @param {integer} [opts.renewMode] - 续费方式 0：正常续费  1：续费至统一到期日，续费时必传  optional\n      * @param {integer} [opts.unifyExpireDay] - 续费统一到期日(1-28)，续费时必传  optional\n      * @param {integer} [opts.totalPriceRule] - 计算总价规则 1：计算预付费资源总价（计费类型为包年包月、按次） ；不传计算所有资源总价  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param number totalPrice  原价（6位）\n      * @param number totalPriceScale4  原价(6位，兼容之前4位保留字段)\n      * @param number discountedTotalPrice  应付金额（2位）\n      * @param number totalDiscount  折扣金额（6位）\n      * @param number afterFavorableTotalPrice  折扣后金额(6位)\n      * @param number eraseTotalPrice  抹零金额（6位）\n      * @param orderPriceDetail list\n      * @param number totalOriginalPrice  订单原价 包年时 一年原价为12个月价格，totalPrice为10个月价格（6位）\n      * @param string favorableInfos  参与优惠的明细\n      * @param string remark  备注\n      * @param number totalUnitPrice  各订单单价总和（6位）\n      * @param number refundTotalPrice  退款总金额\n      * @param number cashRefundTotalPrice  现金退款总金额\n      * @param number balanceRefundTotalPrice  余额退款总金额\n      * @param number couponRefundTotalPrice  代金券退款总金额\n      */\n\n  calculateTotalPrice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  calculateTotalPrice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cmd === undefined || opts.cmd === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cmd' when calling calculateTotalPrice\"\n      )\n    }\n    if (opts.packageCount === undefined || opts.packageCount === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.packageCount' when calling calculateTotalPrice\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.cmd !== undefined && opts.cmd !== null) {\n      postBody['cmd'] = opts.cmd\n    }\n    if (opts.orderList !== undefined && opts.orderList !== null) {\n      postBody['orderList'] = opts.orderList\n    }\n    if (opts.operateTime !== undefined && opts.operateTime !== null) {\n      postBody['operateTime'] = opts.operateTime\n    }\n    if (opts.promotionInfo !== undefined && opts.promotionInfo !== null) {\n      postBody['promotionInfo'] = opts.promotionInfo\n    }\n    if (opts.clientType !== undefined && opts.clientType !== null) {\n      postBody['clientType'] = opts.clientType\n    }\n    if (opts.packageCount !== undefined && opts.packageCount !== null) {\n      postBody['packageCount'] = opts.packageCount\n    }\n    if (opts.processType !== undefined && opts.processType !== null) {\n      postBody['processType'] = opts.processType\n    }\n    if (opts.renewMode !== undefined && opts.renewMode !== null) {\n      postBody['renewMode'] = opts.renewMode\n    }\n    if (opts.unifyExpireDay !== undefined && opts.unifyExpireDay !== null) {\n      postBody['unifyExpireDay'] = opts.unifyExpireDay\n    }\n    if (opts.totalPriceRule !== undefined && opts.totalPriceRule !== null) {\n      postBody['totalPriceRule'] = opts.totalPriceRule\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  billing/1.1.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call calculateTotalPrice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/calculateTotalPrice',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = BILLING\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/bri/v1/bri.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 页面测试检测接口\n * 京东云信用评分-OpenAPI页面测试检测接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'bri'\nService._services[serviceId] = true\n\n/**\n * bri service.\n * @version 1.1.0\n */\n\nclass BRI extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'bri.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  获取黑白名单列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.resourceType] - 数据类型，不传或者为空返回所有类型数据，ip-IP，phone-手机，addr-地址，card-身份，pin-账户，eid-设备  optional\n      * @param {string} [opts.bwType] - 数据类型，不传或者为空返回所有类型数据，列表类型，black-黑名单，white-白名单  optional\n      * @param {integer} [opts.size] - 页面大小，缺省为10  optional\n      * @param {integer} [opts.index] - 起始页，缺省为1  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总量\n      * @param integer index  分页-页码\n      * @param integer size  分页-每页大小\n      * @param bwcfg list\n      */\n\n  describeBWList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBWList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceType !== undefined && opts.resourceType !== null) {\n      queryParams['resourceType'] = opts.resourceType\n    }\n    if (opts.bwType !== undefined && opts.bwType !== null) {\n      queryParams['bwType'] = opts.bwType\n    }\n    if (opts.size !== undefined && opts.size !== null) {\n      queryParams['size'] = opts.size\n    }\n    if (opts.index !== undefined && opts.index !== null) {\n      queryParams['index'] = opts.index\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bri/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBWList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/blackwhite:list',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置黑白名单\n      * @param {Object} opts - parameters\n      * @param {bwcfgSet} opts.req - 黑白名单数据\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setBWList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setBWList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling setBWList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bri/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setBWList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/blackwhite:list',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除黑白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 黑白名单ID, 多个用逗号分隔\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  delBWList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  delBWList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling delBWList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      queryParams['id'] = opts.id\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bri/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call delBWList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/blackwhite:list',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取数据信用评分\n      * @param {Object} opts - parameters\n      * @param {} [opts.tasks] - 检测任务列表，包含一个或多个元素。每个元素是个结构体，最多可添加100元素，即最多对100个数据进行评分。每个元素的具体结构描述见creditTask。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param creditResult data\n      */\n\n  creditScore (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.tasks !== undefined && opts.tasks !== null) {\n      postBody['tasks'] = opts.tasks\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  bri/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call creditScore with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/creditScore:check',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = BRI\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/captcha/v1/captcha.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 运营后台类接口\n * 京东云验证码-OpenAPI应用管理类接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'captcha'\nService._services[serviceId] = true\n\n/**\n * captcha service.\n * @version 1.0.1\n */\n\nclass CAPTCHA extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'captcha.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  获取会话id\n      * @param {Object} opts - parameters\n      * @param {} [opts.appId] - 应用id  optional\n      * @param {} [opts.sceneId] - 场景id  optional\n      * @param {} [opts.secret] - 密钥，从界面获取  optional\n      * @param {} [opts.uuid] - uuid，ios客户端传openudid, android客户端传androidid, m, pc, wxapp客户端此值为空即可  optional\n      * @param {} [opts.ip] - 客户端ip  optional\n      * @param {} [opts.userAgent] - 客户端userAgent  optional\n      * @param {} [opts.fingerPrint] - 指纹，ios和android客户端(clientType)从sdk获取, m, pc, wxapp客户端此值为空即可  optional\n      * @param {} [opts.clientType] - 客户端类型, android, ios, pc, wxmapp, m  optional\n      * @param {} [opts.clientVersion] - 客户端版本，用户端app版本，可选  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param sessionDataResp data\n      */\n\n  getSessionId (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.sceneId !== undefined && opts.sceneId !== null) {\n      postBody['sceneId'] = opts.sceneId\n    }\n    if (opts.secret !== undefined && opts.secret !== null) {\n      postBody['secret'] = opts.secret\n    }\n    if (opts.uuid !== undefined && opts.uuid !== null) {\n      postBody['uuid'] = opts.uuid\n    }\n    if (opts.ip !== undefined && opts.ip !== null) {\n      postBody['ip'] = opts.ip\n    }\n    if (opts.userAgent !== undefined && opts.userAgent !== null) {\n      postBody['userAgent'] = opts.userAgent\n    }\n    if (opts.fingerPrint !== undefined && opts.fingerPrint !== null) {\n      postBody['fingerPrint'] = opts.fingerPrint\n    }\n    if (opts.clientType !== undefined && opts.clientType !== null) {\n      postBody['clientType'] = opts.clientType\n    }\n    if (opts.clientVersion !== undefined && opts.clientVersion !== null) {\n      postBody['clientVersion'] = opts.clientVersion\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  captcha/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSessionId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/captcha:getsessionid',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  验证verifyToken\n      * @param {Object} opts - parameters\n      * @param {} [opts.verifyToken] - 提交后台校验的token，客户端sdk获取  optional\n      * @param {} [opts.sessionId] - 验证码会话id，getsessionid返回  optional\n      * @param {} [opts.appId] - 应用id  optional\n      * @param {} [opts.sceneId] - 场景id  optional\n      * @param {} [opts.secret] - 密钥，从界面获取  optional\n      * @param {} [opts.ip] - 客户端ip  optional\n      * @param {} [opts.userAgent] - 客户端userAgent  optional\n      * @param {} [opts.clientType] - 客户端类型, 可选值: android, ios, pc, wxapp, m  optional\n      * @param {} [opts.clientVersion] - 客户端版本，用户端app版本，可选  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param verifyDataResp data\n      */\n\n  verifyToken (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.verifyToken !== undefined && opts.verifyToken !== null) {\n      postBody['verifyToken'] = opts.verifyToken\n    }\n    if (opts.sessionId !== undefined && opts.sessionId !== null) {\n      postBody['sessionId'] = opts.sessionId\n    }\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.sceneId !== undefined && opts.sceneId !== null) {\n      postBody['sceneId'] = opts.sceneId\n    }\n    if (opts.secret !== undefined && opts.secret !== null) {\n      postBody['secret'] = opts.secret\n    }\n    if (opts.ip !== undefined && opts.ip !== null) {\n      postBody['ip'] = opts.ip\n    }\n    if (opts.userAgent !== undefined && opts.userAgent !== null) {\n      postBody['userAgent'] = opts.userAgent\n    }\n    if (opts.clientType !== undefined && opts.clientType !== null) {\n      postBody['clientType'] = opts.clientType\n    }\n    if (opts.clientVersion !== undefined && opts.clientVersion !== null) {\n      postBody['clientVersion'] = opts.clientVersion\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  captcha/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call verifyToken with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/captcha:verifytoken',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = CAPTCHA\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/cdn/v1/cdn.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SCDN相关接口\n * Openapi For JCLOUD cdn\n *\n * OpenAPI spec version: v1\n * Contact: pid-cdn@jd.com\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'cdn'\nService._services[serviceId] = true\n\n/**\n * cdn service.\n * @version 0.10.47\n */\n\nclass CDN extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'cdn.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  批量域名查询日志\n      * @param {Object} opts - parameters\n      * @param {} [opts.domains]   optional\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.interval] - 时间间隔，取值(hour，day，fiveMin)，不传默认小时。  optional\n      * @param {} [opts.logType] - 日志类型，取值(log，zip,gz)，不传默认gz。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainsLog logs\n      */\n\n  queryDomainsLog (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.domains !== undefined && opts.domains !== null) {\n      postBody['domains'] = opts.domains\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.interval !== undefined && opts.interval !== null) {\n      postBody['interval'] = opts.interval\n    }\n    if (opts.logType !== undefined && opts.logType !== null) {\n      postBody['logType'] = opts.logType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDomainsLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/logs',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量域名查询日志-pin维度\n      * @param {Object} opts - parameters\n      * @param {} [opts.pin] - pin  optional\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.interval] - 时间间隔，取值(hour，day，fiveMin)，不传默认小时。  optional\n      * @param {} [opts.logType] - 日志类型，取值(log，zip,gz)，不传默认gz。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainsLog logs\n      */\n\n  queryDomainsLogForJd (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.interval !== undefined && opts.interval !== null) {\n      postBody['interval'] = opts.interval\n    }\n    if (opts.logType !== undefined && opts.logType !== null) {\n      postBody['logType'] = opts.logType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDomainsLogForJd with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/logsJd',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询日志\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.interval] - 时间间隔，取值(hour，day，fiveMin)，不传默认小时。  optional\n      * @param {} [opts.logType] - 日志类型，取值(log，zip,gz)，不传默认gz。  optional\n      * @param {} [opts.pageSize] - 页面大小，默认值10  optional\n      * @param {} [opts.pageNumber] - 分页页数，默认值1  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总的数量\n      * @param integer pageSize  页面大小\n      * @param integer pageNumber  页面页数\n      * @param domainLog urls\n      */\n\n  queryDomainLog (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryDomainLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.interval !== undefined && opts.interval !== null) {\n      queryParams['interval'] = opts.interval\n    }\n    if (opts.logType !== undefined && opts.logType !== null) {\n      queryParams['logType'] = opts.logType\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDomainLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/log',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置线上计费方式\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer allType  计费方式,取值[0,1],0:日流量计费,1:日峰值带宽计费.\n      * @param integer vip  vip(1:vip客户,0:普通客户)\n      */\n\n  queryOnlineBillingType (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryOnlineBillingType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/onlineBillingType',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置线上计费方式\n      * @param {Object} opts - parameters\n      * @param {} [opts.allType] - 计费方式,取值[0,1],0:日流量计费,1:日峰值带宽计费.  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setOnlineBillingType (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.allType !== undefined && opts.allType !== null) {\n      postBody['allType'] = opts.allType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setOnlineBillingType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/onlineBillingType',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  dash鉴权设置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.enableUrlAuth] - 是否开启鉴权[on,off]  optional\n      * @param {} [opts.authKey] - 鉴权key  optional\n      * @param {} [opts.age] - 鉴权时间戳过期时间，默认为0  optional\n      * @param {} [opts.encAlgorithm] - 鉴权参数加密算法，默认为md5且只支持md5  optional\n      * @param {} [opts.timeFormat] - 时间戳格式[hex,dec]  optional\n      * @param {} [opts.uriType] - 加密算法版本[dash,dashv2,video],默认dashv2  optional\n      * @param {} [opts.rule] - 鉴权key生成顺序  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId  任务的id\n      */\n\n  setAuthConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setAuthConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.enableUrlAuth !== undefined && opts.enableUrlAuth !== null) {\n      postBody['enableUrlAuth'] = opts.enableUrlAuth\n    }\n    if (opts.authKey !== undefined && opts.authKey !== null) {\n      postBody['authKey'] = opts.authKey\n    }\n    if (opts.age !== undefined && opts.age !== null) {\n      postBody['age'] = opts.age\n    }\n    if (opts.encAlgorithm !== undefined && opts.encAlgorithm !== null) {\n      postBody['encAlgorithm'] = opts.encAlgorithm\n    }\n    if (opts.timeFormat !== undefined && opts.timeFormat !== null) {\n      postBody['timeFormat'] = opts.timeFormat\n    }\n    if (opts.uriType !== undefined && opts.uriType !== null) {\n      postBody['uriType'] = opts.uriType\n    }\n    if (opts.rule !== undefined && opts.rule !== null) {\n      postBody['rule'] = opts.rule\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setAuthConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/setAuthConfig',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  回源鉴权设置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.enable] - 是否开启鉴权[on,off]  optional\n      * @param {} [opts.originRole] - 回源为主/备[master,slave]  optional\n      * @param {} [opts.authType] - 鉴权类型[oss,aws,tos],aws暂不支持  optional\n      * @param {} [opts.tosAuthInfo] - tos类型鉴权参数,authType为tos是不能为空  optional\n      * @param {} [opts.ossAuthInfo] - oss类型鉴权参数,authType为oss是不能为空  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId  任务的id\n      */\n\n  setSourceAuthConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setSourceAuthConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.enable !== undefined && opts.enable !== null) {\n      postBody['enable'] = opts.enable\n    }\n    if (opts.originRole !== undefined && opts.originRole !== null) {\n      postBody['originRole'] = opts.originRole\n    }\n    if (opts.authType !== undefined && opts.authType !== null) {\n      postBody['authType'] = opts.authType\n    }\n    if (opts.tosAuthInfo !== undefined && opts.tosAuthInfo !== null) {\n      postBody['tosAuthInfo'] = opts.tosAuthInfo\n    }\n    if (opts.ossAuthInfo !== undefined && opts.ossAuthInfo !== null) {\n      postBody['ossAuthInfo'] = opts.ossAuthInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setSourceAuthConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/setSourceAuthConfig',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  带宽查询接口\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.area] - 地域  optional\n      * @param {} [opts.isp] - 运营商  optional\n      * @param {} [opts.period] - 查询周期  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bandTrafficDataItem resultList\n      */\n\n  queryBand (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.area !== undefined && opts.area !== null) {\n      postBody['area'] = opts.area\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBand with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/bandQuery',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  分地域运营商带宽查询接口\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.area] - 地域  optional\n      * @param {} [opts.isp] - 运营商  optional\n      * @param {} [opts.period] - 查询周期  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bandTrafficWithAreaDataItem resultList\n      */\n\n  queryBandWithArea (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.area !== undefined && opts.area !== null) {\n      postBody['area'] = opts.area\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBandWithArea with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/bandQuery:areaIsp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名配置状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskStatus  任务状态,[success:成功,failed:失败,configuring:配置中]\n      */\n\n  queryDomainConfigStatus (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling queryDomainConfigStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDomainConfigStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{taskId}/status',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查找地域运营商列表\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param areaIspItem mainLand\n      * @param areaIspItem overseas\n      * @param areaIspItem isp\n      * @param areaIspItem gangaotai\n      * @param areaIspItem oceanica\n      * @param areaIspItem southAmerica\n      * @param areaIspItem northAmerica\n      * @param areaIspItem asia\n      * @param areaIspItem europe\n      */\n\n  queryAreaIspList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryAreaIspList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/console:areaIspList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查找地域运营商列表\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param areaIspItem mainLand\n      * @param areaIspItem overseas\n      * @param areaIspItem isp\n      * @param areaIspItem africa\n      * @param areaIspItem oceania\n      * @param areaIspItem southAmerica\n      * @param areaIspItem northAmerica\n      * @param areaIspItem asia\n      * @param areaIspItem europe\n      * @param areaIspItem midEast\n      */\n\n  queryAreaIspListV2 (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryAreaIspListV2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/console:areaIspListV2',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询封禁信息\n      * @param {Object} opts - parameters\n      * @param {} [opts.queryDomain] - 封禁域名,模糊查询  optional\n      * @param {} [opts.forbiddenUrl] - 封禁url,精确查询  optional\n      * @param {} [opts.pageNumber] - 页码数  optional\n      * @param {} [opts.pageSize] - 每页size  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总的数量\n      * @param forbiddenInfo list\n      */\n\n  queryForbiddenInfoList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.queryDomain !== undefined && opts.queryDomain !== null) {\n      postBody['queryDomain'] = opts.queryDomain\n    }\n    if (opts.forbiddenUrl !== undefined && opts.forbiddenUrl !== null) {\n      postBody['forbiddenUrl'] = opts.forbiddenUrl\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryForbiddenInfoList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/forbiddenInfo:query',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置封禁\n      * @param {Object} opts - parameters\n      * @param {} [opts.forbiddenType] - 封禁类型，domain 域名封禁,url url封禁  optional\n      * @param {} [opts.forbiddenDomain] - 封禁域名  optional\n      * @param {} [opts.forbiddenUrl] - 封禁url,多个以;隔开  optional\n      * @param {} [opts.reason] - 封禁原因  optional\n      * @param {} [opts.linkOther] - y,n y表示是，n表示否  optional\n      * @param {} [opts.shareCacheDomainFlag] - 是否同步操作共享缓存域名,0:仅操作本域名,1:同步操作共享缓存域名,默认为0  optional\n      * @param {} [opts.token] - 用于封禁前缀识别的URL,应为单个特殊字符，如：~  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createForbiddenInfo (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.forbiddenType !== undefined && opts.forbiddenType !== null) {\n      postBody['forbiddenType'] = opts.forbiddenType\n    }\n    if (opts.forbiddenDomain !== undefined && opts.forbiddenDomain !== null) {\n      postBody['forbiddenDomain'] = opts.forbiddenDomain\n    }\n    if (opts.forbiddenUrl !== undefined && opts.forbiddenUrl !== null) {\n      postBody['forbiddenUrl'] = opts.forbiddenUrl\n    }\n    if (opts.reason !== undefined && opts.reason !== null) {\n      postBody['reason'] = opts.reason\n    }\n    if (opts.linkOther !== undefined && opts.linkOther !== null) {\n      postBody['linkOther'] = opts.linkOther\n    }\n    if (\n      opts.shareCacheDomainFlag !== undefined &&\n      opts.shareCacheDomainFlag !== null\n    ) {\n      postBody['shareCacheDomainFlag'] = opts.shareCacheDomainFlag\n    }\n    if (opts.token !== undefined && opts.token !== null) {\n      postBody['token'] = opts.token\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createForbiddenInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/forbiddenInfo:create',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除封禁信息\n      * @param {Object} opts - parameters\n      * @param {} [opts.forbiddenType] - 封禁类型，domain 域名封禁,url url封禁  optional\n      * @param {} [opts.forbiddenDomain] - 封禁域名  optional\n      * @param {} [opts.forbiddenUrl] - 封禁url,多个以;隔开  optional\n      * @param {} [opts.shareCacheDomainFlag] - 是否同步操作共享缓存域名,0:仅操作本域名,1:同步操作共享缓存域名,默认为0  optional\n      * @param {} [opts.token] - 用于封禁前缀识别的URL,应为单个特殊字符，如：~  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId\n      */\n\n  deleteForbiddenInfo (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.forbiddenType !== undefined && opts.forbiddenType !== null) {\n      postBody['forbiddenType'] = opts.forbiddenType\n    }\n    if (opts.forbiddenDomain !== undefined && opts.forbiddenDomain !== null) {\n      postBody['forbiddenDomain'] = opts.forbiddenDomain\n    }\n    if (opts.forbiddenUrl !== undefined && opts.forbiddenUrl !== null) {\n      postBody['forbiddenUrl'] = opts.forbiddenUrl\n    }\n    if (\n      opts.shareCacheDomainFlag !== undefined &&\n      opts.shareCacheDomainFlag !== null\n    ) {\n      postBody['shareCacheDomainFlag'] = opts.shareCacheDomainFlag\n    }\n    if (opts.token !== undefined && opts.token !== null) {\n      postBody['token'] = opts.token\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteForbiddenInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/forbiddenInfo:delete',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询解封状态\n      * @param {Object} opts - parameters\n      * @param {string} [opts.domain] - 根据域名进行匹配  optional\n      * @param {string} [opts.url] - 根据url进行匹配  optional\n      * @param {string} [opts.taskId] - 解封的任务id  optional\n      * @param {integer} [opts.pageNumber] - pageNumber,默认值1  optional\n      * @param {integer} [opts.pageSize] - pageSize,最大值50,默认值10  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总的数量\n      * @param unForbiddenTaskItem tasks\n      */\n\n  queryUnForbiddenStatus (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domain !== undefined && opts.domain !== null) {\n      queryParams['domain'] = opts.domain\n    }\n    if (opts.url !== undefined && opts.url !== null) {\n      queryParams['url'] = opts.url\n    }\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      queryParams['taskId'] = opts.taskId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryUnForbiddenStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/unForbiddenStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询封禁解封信息\n      * @param {Object} opts - parameters\n      * @param {} [opts.queryDomain] - 封禁域名.queryDomain和taskId至少传入一个  optional\n      * @param {} [opts.taskId] - 任务id.queryDomain和taskId至少传入一个  optional\n      * @param {} [opts.forbiddenUrl] - 封禁url,精确查询  optional\n      * @param {} [opts.pageNumber] - 页码数  optional\n      * @param {} [opts.pageSize] - 每页size  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总的数量\n      * @param forbiddenInfoCommon list\n      */\n\n  queryForbiddenInfoListCommon (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.queryDomain !== undefined && opts.queryDomain !== null) {\n      postBody['queryDomain'] = opts.queryDomain\n    }\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n    if (opts.forbiddenUrl !== undefined && opts.forbiddenUrl !== null) {\n      postBody['forbiddenUrl'] = opts.forbiddenUrl\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryForbiddenInfoListCommon with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/forbiddenInfoCommon:query',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置封禁\n      * @param {Object} opts - parameters\n      * @param {} [opts.forbiddenType] - 封禁类型，domain:域名封禁,url:url封禁  optional\n      * @param {} [opts.forbiddenDomain] - 封禁域名  optional\n      * @param {} [opts.forbiddenUrl] - 封禁url,多个以;隔开。单url最大字符长度1024,以/开头，内容中不包含逗号.forbiddenType为url时需传入  optional\n      * @param {} [opts.reason] - 封禁原因  optional\n      * @param {} [opts.linkOther] - y,n y表示是，n表示否,默认n。forbiddenType为domain时可传入，若为y表示封禁该域名后，不允许添加该域名的根域名以及根域名下的所有子域名  optional\n      * @param {} [opts.shareCacheDomainFlag] - forbiddenType为url时可传入。即当forbiddenDomain为域名组共享缓存主域名时，是否同步操作共享缓存从域名下的url,0:仅操作本域名,1:同步操作共享缓存域名,默认为0。  optional\n      * @param {} [opts.token] - forbiddenType为url时有效。用于封禁前缀识别的URL,应为单个特殊字符，如：~  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId\n      */\n\n  createForbiddenInfoCommon (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.forbiddenType !== undefined && opts.forbiddenType !== null) {\n      postBody['forbiddenType'] = opts.forbiddenType\n    }\n    if (opts.forbiddenDomain !== undefined && opts.forbiddenDomain !== null) {\n      postBody['forbiddenDomain'] = opts.forbiddenDomain\n    }\n    if (opts.forbiddenUrl !== undefined && opts.forbiddenUrl !== null) {\n      postBody['forbiddenUrl'] = opts.forbiddenUrl\n    }\n    if (opts.reason !== undefined && opts.reason !== null) {\n      postBody['reason'] = opts.reason\n    }\n    if (opts.linkOther !== undefined && opts.linkOther !== null) {\n      postBody['linkOther'] = opts.linkOther\n    }\n    if (\n      opts.shareCacheDomainFlag !== undefined &&\n      opts.shareCacheDomainFlag !== null\n    ) {\n      postBody['shareCacheDomainFlag'] = opts.shareCacheDomainFlag\n    }\n    if (opts.token !== undefined && opts.token !== null) {\n      postBody['token'] = opts.token\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createForbiddenInfoCommon with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/forbiddenInfoCommon:create',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除封禁信息\n      * @param {Object} opts - parameters\n      * @param {} [opts.forbiddenType] - 封禁类型，domain:域名封禁,url:url封禁  optional\n      * @param {} [opts.forbiddenDomain] - 封禁域名  optional\n      * @param {} [opts.forbiddenUrl] - 封禁url,多个以;隔开。单url最大字符长度1024,以/开头，内容中不包含逗号.forbiddenType为url时需传入  optional\n      * @param {} [opts.shareCacheDomainFlag] - forbiddenType为url时有效。即当forbiddenDomain为域名组共享缓存主域名时，是否同步操作共享缓存从域名下的url,0:仅操作本域名,1:同步操作共享缓存域名,默认为0。  optional\n      * @param {} [opts.token] - forbiddenType为url时有效。用于封禁前缀识别的URL,应为单个特殊字符，如：~  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId\n      */\n\n  deleteForbiddenInfoCommon (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.forbiddenType !== undefined && opts.forbiddenType !== null) {\n      postBody['forbiddenType'] = opts.forbiddenType\n    }\n    if (opts.forbiddenDomain !== undefined && opts.forbiddenDomain !== null) {\n      postBody['forbiddenDomain'] = opts.forbiddenDomain\n    }\n    if (opts.forbiddenUrl !== undefined && opts.forbiddenUrl !== null) {\n      postBody['forbiddenUrl'] = opts.forbiddenUrl\n    }\n    if (\n      opts.shareCacheDomainFlag !== undefined &&\n      opts.shareCacheDomainFlag !== null\n    ) {\n      postBody['shareCacheDomainFlag'] = opts.shareCacheDomainFlag\n    }\n    if (opts.token !== undefined && opts.token !== null) {\n      postBody['token'] = opts.token\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteForbiddenInfoCommon with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/forbiddenInfoCommon:delete',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  预览证书\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.content]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string sigAlgName\n      * @param string issuer\n      * @param string startDate\n      * @param string endDate\n      * @param string user\n      * @param string sigHashAlgName\n      */\n\n  previewCertificate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling previewCertificate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.content !== undefined && opts.content !== null) {\n      postBody['content'] = opts.content\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call previewCertificate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/certificate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询默认http header头部参数列表\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string reqDefaultHttpHeaderKey\n      * @param string respDefaultHttpHeaderKey\n      */\n\n  queryDefaultHttpHeaderKey (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDefaultHttpHeaderKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/defaultHttpHeaderKey',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询ip黑白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain  域名\n      * @param string ips\n      * @param string status  黑名单状态,on:开启,off:关闭\n      * @param string whiteIps\n      */\n\n  queryIpBlackList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryIpBlackList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryIpBlackList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/ipBlackList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置ip黑名白单\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.ips] - ip名单,ips中url不能超过50条，中国境外/全球加速域名暂不支持传IP段  optional\n      * @param {} [opts.ipListType] - ip黑白名单类型，black:黑名单,white:白名单  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setIpBlackList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setIpBlackList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ips !== undefined && opts.ips !== null) {\n      postBody['ips'] = opts.ips\n    }\n    if (opts.ipListType !== undefined && opts.ipListType !== null) {\n      postBody['ipListType'] = opts.ipListType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setIpBlackList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/ipBlackList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置ip黑名单状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.status] - ip黑名单状态取值[on,off]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  operateIpBlackList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling operateIpBlackList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call operateIpBlackList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/ipBlackList:operate',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询自定义错误页面信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain  域名\n      * @param string enable  自定义错误页面开关(on:开启 off：关闭)\n      * @param errorPageConfigs customErrorPageInfos\n      */\n\n  queryCustomErrorPage (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryCustomErrorPage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryCustomErrorPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/customErrorPage',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置自定义错误页面信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.errorPageConfigs] - 自定义错误页面配置  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setCustomErrorPage (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setCustomErrorPage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.errorPageConfigs !== undefined && opts.errorPageConfigs !== null) {\n      postBody['errorPageConfigs'] = opts.errorPageConfigs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setCustomErrorPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/customErrorPage',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加缓存规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.weight] - 此条配置的权重值, 取值范围为1-10,1最大  optional\n      * @param {} [opts.ttl] - 缓存时间,单位秒，中国境内加速域名最长可配置2年，中国境外/全球加速域名最长可配置1年  optional\n      * @param {} [opts.contents] - 规则内容。其他类型只能以/或者.开头，如/a/b或.jpg  optional\n      * @param {} [opts.cacheType] - 缓存方式：0、不缓存，1自定义  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer configId  缓存规则配置ID\n      */\n\n  createCacheRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling createCacheRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.weight !== undefined && opts.weight !== null) {\n      postBody['weight'] = opts.weight\n    }\n    if (opts.ttl !== undefined && opts.ttl !== null) {\n      postBody['ttl'] = opts.ttl\n    }\n    if (opts.contents !== undefined && opts.contents !== null) {\n      postBody['contents'] = opts.contents\n    }\n    if (opts.cacheType !== undefined && opts.cacheType !== null) {\n      postBody['cacheType'] = opts.cacheType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCacheRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/cacheRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改缓存规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.weight] - 此条配置的权重值, 取值范围为1-10,1最大  optional\n      * @param {} [opts.ttl] - 缓存时间,单位秒，中国境内加速域名最长可配置2年，中国境外/全球加速域名最长可配置1年  optional\n      * @param {} [opts.contents] - 规则内容。其他类型只能以/或者.开头，如/a/b或.jpg  optional\n      * @param {} [opts.cacheType] - 缓存方式：0、不缓存，1自定义  optional\n      * @param {} [opts.configId] - 缓存规则配置ID  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateCacheRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling updateCacheRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.weight !== undefined && opts.weight !== null) {\n      postBody['weight'] = opts.weight\n    }\n    if (opts.ttl !== undefined && opts.ttl !== null) {\n      postBody['ttl'] = opts.ttl\n    }\n    if (opts.contents !== undefined && opts.contents !== null) {\n      postBody['contents'] = opts.contents\n    }\n    if (opts.cacheType !== undefined && opts.cacheType !== null) {\n      postBody['cacheType'] = opts.cacheType\n    }\n    if (opts.configId !== undefined && opts.configId !== null) {\n      postBody['configId'] = opts.configId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateCacheRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/cacheRule',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除缓存规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.configId] - 缓存规则配置ID  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCacheRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling deleteCacheRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.configId !== undefined && opts.configId !== null) {\n      queryParams['configId'] = opts.configId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCacheRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/cacheRule',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量添加缓存规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.cacheRules]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cacheVo data\n      */\n\n  setCacheRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setCacheRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.cacheRules !== undefined && opts.cacheRules !== null) {\n      postBody['cacheRules'] = opts.cacheRules\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setCacheRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/cacheRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询http header头\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.edgeType] - header生效节点，0边缘，1回源，2两者都  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain\n      * @param queryHttpHeaderResp headers\n      */\n\n  queryHttpHeader (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryHttpHeader\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.edgeType !== undefined && opts.edgeType !== null) {\n      queryParams['edgeType'] = opts.edgeType\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryHttpHeader with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/httpHeader',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加httpHeader\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.edgeType] - 0表示header在边缘生效，1表示header回源生效，2表示在边缘和回源都生效，该字段不传时默认header在边缘和回源都生效  optional\n      * @param {} [opts.headerType] - header类型[resp,req],resp：配置响应头，req：配置请求头  optional\n      * @param {} [opts.headerName] - header名，例如：Content-Disposition，可自定义，长度不能超过256个字符，不能包含中文字符，不能包含$和_，不支持设置如下头名：[&quot;Content-Length&quot;,&quot;Date&quot;,&quot;Host&quot;,&quot;Content-Encoding&quot;,&quot;If-Modified-Since&quot;,&quot;If-Range&quot;,&quot;Content-Type&quot;,&quot;Transfer-Encoding&quot;,&quot;Cache-Control&quot;,&quot;Last-Modified&quot;,&quot;Connection&quot;, &quot;Content-Range&quot;,&quot;ETag&quot;,&quot;Age&quot;,&quot;Authentication-Info&quot;,&quot;Proxy-Authenticate&quot;,&quot;Retry-After&quot;,&quot;Set-Cookie&quot;,&quot;Vary&quot;,&quot;Content-Location&quot;,&quot;Meter&quot;,&quot;Allow&quot;,&quot;Error&quot;,&quot;X-Trace&quot;, &quot;Proxy-Connection&quot;]  optional\n      * @param {} [opts.headerValue] - header值，不能包含($,_,#)，不能超过256个字符  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setHttpHeader (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setHttpHeader\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.edgeType !== undefined && opts.edgeType !== null) {\n      postBody['edgeType'] = opts.edgeType\n    }\n    if (opts.headerType !== undefined && opts.headerType !== null) {\n      postBody['headerType'] = opts.headerType\n    }\n    if (opts.headerName !== undefined && opts.headerName !== null) {\n      postBody['headerName'] = opts.headerName\n    }\n    if (opts.headerValue !== undefined && opts.headerValue !== null) {\n      postBody['headerValue'] = opts.headerValue\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setHttpHeader with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/httpHeader',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除httpHeader\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.edgeType] - 0表示header在边缘生效，1表示header回源生效，2表示在边缘和回源都生效，该字段不传时默认header在边缘和回源都生效  optional\n      * @param {} [opts.headerType] - header类型[resp,req]  optional\n      * @param {} [opts.headerName] - header名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteHttpHeader (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling deleteHttpHeader\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.edgeType !== undefined && opts.edgeType !== null) {\n      postBody['edgeType'] = opts.edgeType\n    }\n    if (opts.headerType !== undefined && opts.headerType !== null) {\n      postBody['headerType'] = opts.headerType\n    }\n    if (opts.headerName !== undefined && opts.headerName !== null) {\n      postBody['headerName'] = opts.headerName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteHttpHeader with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/httpHeader',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置视频拖拽\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.status] - 开关取值[on,off]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setVideoDraft (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setVideoDraft\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setVideoDraft with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/videoDraft',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置range参数\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.status] - 开关取值[on,off]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setRange (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setRange\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setRange with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/range',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置忽略参数\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.status] - 开关取值[on,off]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setIgnoreQueryString (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setIgnoreQueryString\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setIgnoreQueryString with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/ignoreQueryString',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置过滤参数\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.retainArgs] - 保留参数，多个用;隔开  optional\n      * @param {} [opts.status] - 忽略参数开关，取值：on or off  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setFilterArgs (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setFilterArgs\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.retainArgs !== undefined && opts.retainArgs !== null) {\n      postBody['retainArgs'] = opts.retainArgs\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setFilterArgs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/filterArgs:set',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询保留参数信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain  域名\n      * @param string retainArgs\n      * @param string ignoreQueryString  忽略参数开关\n      */\n\n  queryFilterArgs (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryFilterArgs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryFilterArgs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/filterArgs:query',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置userAgent信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain\n      * @param string userAgentType  userAgent类型,取值：block（黑名单）,allow（白名单）,默认为block\n      * @param string userAgentList\n      * @param string allowNoUserAgentHeader  是否允许空userAgent访问,默认为“on”\n      */\n\n  queryUserAgent (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryUserAgent\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryUserAgent with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/userAgentConfig',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置userAgent信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.userAgentType] - userAgent类型,取值：block（黑名单）,allow（白名单）,默认为block  optional\n      * @param {} [opts.userAgentList] - UA列表,如果userAgentList为空,则为全部删除  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setUserAgentConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setUserAgentConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.userAgentType !== undefined && opts.userAgentType !== null) {\n      postBody['userAgentType'] = opts.userAgentType\n    }\n    if (opts.userAgentList !== undefined && opts.userAgentList !== null) {\n      postBody['userAgentList'] = opts.userAgentList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setUserAgentConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/userAgentConfig',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询url鉴权\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer accesskeyType  鉴权类型，0表示无鉴权，1表示参数鉴权，2表示路径鉴权\n      * @param string accesskeyKey  密码，长度为8到32\n      * @param integer accesskeyKeep  是否是回源鉴权 0表示是 1表示否\n      */\n\n  queryAccesskeyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryAccesskeyConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryAccesskeyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/accesskeyConfig',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置url鉴权\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.accesskeyType] - 鉴权类型，0表示无鉴权，1表示参数鉴权，2表示路径鉴权  optional\n      * @param {} [opts.accesskeyKey] - 密码，长度为8到32  optional\n      * @param {} [opts.accesskeyKeep] - 是否是回源鉴权 0表示是 1表示否  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setAccesskeyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setAccesskeyConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accesskeyType !== undefined && opts.accesskeyType !== null) {\n      postBody['accesskeyType'] = opts.accesskeyType\n    }\n    if (opts.accesskeyKey !== undefined && opts.accesskeyKey !== null) {\n      postBody['accesskeyKey'] = opts.accesskeyKey\n    }\n    if (opts.accesskeyKeep !== undefined && opts.accesskeyKeep !== null) {\n      postBody['accesskeyKeep'] = opts.accesskeyKeep\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setAccesskeyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/accesskeyConfig',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置域名refer\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.referType] - refer类型，取值：block（黑名单），allow（白名单）默认为block  optional\n      * @param {} [opts.referList] - 逗号隔开的域名列表，如果referList传空则为删除，中国境内加速域名至多可配置400条，中国境外/全球加速域名至多可配置50条  optional\n      * @param {} [opts.allowNoReferHeader] - 是否允许空refer访问，默认为“on”  optional\n      * @param {} [opts.allowNullReferHeader] - 是否允许无ua访问，默认为“on”  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setRefer (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setRefer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.referType !== undefined && opts.referType !== null) {\n      postBody['referType'] = opts.referType\n    }\n    if (opts.referList !== undefined && opts.referList !== null) {\n      postBody['referList'] = opts.referList\n    }\n    if (\n      opts.allowNoReferHeader !== undefined &&\n      opts.allowNoReferHeader !== null\n    ) {\n      postBody['allowNoReferHeader'] = opts.allowNoReferHeader\n    }\n    if (\n      opts.allowNullReferHeader !== undefined &&\n      opts.allowNullReferHeader !== null\n    ) {\n      postBody['allowNullReferHeader'] = opts.allowNullReferHeader\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setRefer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/refer',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询源站监控信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain  域名\n      * @param integer cycle  探测周期，单位分钟\n      * @param string monitorPath  探测路径\n      * @param object httpRequestHeader  查询结果,类型为HashMap&lt;String, Object&gt;\n      */\n\n  queryMonitor (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryMonitor\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/monitor',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置源站监控信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.cycle] - 探测周期，取值1和5，单位为分钟  optional\n      * @param {} [opts.monitorPath] - 探测路径  optional\n      * @param {} [opts.httpRequestHeader] - http请求头  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer monitorId\n      */\n\n  setMonitor (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setMonitor\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.cycle !== undefined && opts.cycle !== null) {\n      postBody['cycle'] = opts.cycle\n    }\n    if (opts.monitorPath !== undefined && opts.monitorPath !== null) {\n      postBody['monitorPath'] = opts.monitorPath\n    }\n    if (\n      opts.httpRequestHeader !== undefined &&\n      opts.httpRequestHeader !== null\n    ) {\n      postBody['httpRequestHeader'] = opts.httpRequestHeader\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/monitor',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止源站监控\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopMonitor (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling stopMonitor\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/monitor:stop',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置源站信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.sourceType] - 回源类型只能是[ips,domain,oss]中的一种  optional\n      * @param {} [opts.backSourceType] - 回源方式,只能是[https,http]中的一种,默认http  optional\n      * @param {} [opts.accelerateRegion] - 加速区域,必须是[mainland,nonMainland,all]中的一种,分别代表大陆,海外+中国港澳台,全球  optional\n      * @param {} [opts.ipSource]   optional\n      * @param {} [opts.domainSource]   optional\n      * @param {} [opts.ossSource] - oss回源域名  optional\n      * @param {} [opts.defaultSourceHost] - 默认回源host  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId  任务id\n      */\n\n  setSource (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setSource\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sourceType !== undefined && opts.sourceType !== null) {\n      postBody['sourceType'] = opts.sourceType\n    }\n    if (opts.backSourceType !== undefined && opts.backSourceType !== null) {\n      postBody['backSourceType'] = opts.backSourceType\n    }\n    if (opts.accelerateRegion !== undefined && opts.accelerateRegion !== null) {\n      postBody['accelerateRegion'] = opts.accelerateRegion\n    }\n    if (opts.ipSource !== undefined && opts.ipSource !== null) {\n      postBody['ipSource'] = opts.ipSource\n    }\n    if (opts.domainSource !== undefined && opts.domainSource !== null) {\n      postBody['domainSource'] = opts.domainSource\n    }\n    if (opts.ossSource !== undefined && opts.ossSource !== null) {\n      postBody['ossSource'] = opts.ossSource\n    }\n    if (\n      opts.defaultSourceHost !== undefined &&\n      opts.defaultSourceHost !== null\n    ) {\n      postBody['defaultSourceHost'] = opts.defaultSourceHost\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setSource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/source',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  泛域名共享缓存\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.status] - 共享缓存只能是off或者on  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  operateShareCache (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling operateShareCache\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call operateShareCache with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/shareCache',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置http协议\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.httpType] - http类型,只能为http或者https,默认为http.当设为https时,需要调用“设置通讯协议”接口上传证书和私钥  optional\n      * @param {} [opts.certificate] - 用户证书,当Type为https时必须设置  optional\n      * @param {} [opts.rsaKey] - 证书私钥  optional\n      * @param {} [opts.jumpType] - 有三种类型：default、http、https  optional\n      * @param {} [opts.certFrom] - 证书来源有两种类型：default,ssl  optional\n      * @param {} [opts.sslCertId] - ssl证书id  optional\n      * @param {} [opts.syncToSsl] - 是否同步到ssl,boolean值，取值true或者false  optional\n      * @param {} [opts.certName] - syncToSsl是true时，certName是必填项  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId  任务taskId\n      */\n\n  setHttpType (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setHttpType\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.httpType !== undefined && opts.httpType !== null) {\n      postBody['httpType'] = opts.httpType\n    }\n    if (opts.certificate !== undefined && opts.certificate !== null) {\n      postBody['certificate'] = opts.certificate\n    }\n    if (opts.rsaKey !== undefined && opts.rsaKey !== null) {\n      postBody['rsaKey'] = opts.rsaKey\n    }\n    if (opts.jumpType !== undefined && opts.jumpType !== null) {\n      postBody['jumpType'] = opts.jumpType\n    }\n    if (opts.certFrom !== undefined && opts.certFrom !== null) {\n      postBody['certFrom'] = opts.certFrom\n    }\n    if (opts.sslCertId !== undefined && opts.sslCertId !== null) {\n      postBody['sslCertId'] = opts.sslCertId\n    }\n    if (opts.syncToSsl !== undefined && opts.syncToSsl !== null) {\n      postBody['syncToSsl'] = opts.syncToSsl\n    }\n    if (opts.certName !== undefined && opts.certName !== null) {\n      postBody['certName'] = opts.certName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setHttpType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/httpType',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询回源302跳转信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain\n      * @param string followRedirect\n      */\n\n  queryFollowRedirect (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryFollowRedirect\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryFollowRedirect with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/followRedirect',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置回源302跳转\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.status] - 开关取值[on,off]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setFollowRedirect (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setFollowRedirect\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setFollowRedirect with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/followRedirect',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询协议跟随回源\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain\n      * @param string followProtocolStatus\n      */\n\n  queryFollowSourceProtocol (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryFollowSourceProtocol\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryFollowSourceProtocol with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/followSourceProtocol',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置协议跟随回源\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.status] - 开关取值[on,off]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId  任务id\n      */\n\n  setFollowSourceProtocol (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setFollowSourceProtocol\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setFollowSourceProtocol with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/followSourceProtocol',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新域名配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.httpType] - http类型,只能为http或者https  optional\n      * @param {} [opts.backSourceType] - 回源类型  optional\n      * @param {} [opts.jumpType] - 有三种类型：default、http、https  optional\n      * @param {} [opts.jcdnTimeAnti] - dash鉴权相关配置  optional\n      * @param {} [opts.hdrCtrl] - 回源鉴权相关配置  optional\n      * @param {} [opts.toutiaoHeader] - 头条header配置  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId  任务taskId\n      */\n\n  setDomainConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setDomainConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.httpType !== undefined && opts.httpType !== null) {\n      postBody['httpType'] = opts.httpType\n    }\n    if (opts.backSourceType !== undefined && opts.backSourceType !== null) {\n      postBody['backSourceType'] = opts.backSourceType\n    }\n    if (opts.jumpType !== undefined && opts.jumpType !== null) {\n      postBody['jumpType'] = opts.jumpType\n    }\n    if (opts.jcdnTimeAnti !== undefined && opts.jcdnTimeAnti !== null) {\n      postBody['jcdnTimeAnti'] = opts.jcdnTimeAnti\n    }\n    if (opts.hdrCtrl !== undefined && opts.hdrCtrl !== null) {\n      postBody['hdrCtrl'] = opts.hdrCtrl\n    }\n    if (opts.toutiaoHeader !== undefined && opts.toutiaoHeader !== null) {\n      postBody['toutiaoHeader'] = opts.toutiaoHeader\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setDomainConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名的全部分类配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param configItem configItems\n      */\n\n  queryDomainAllConfigClassify (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryDomainAllConfigClassify\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDomainAllConfigClassify with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/queryDomainAllConfigClassify',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域名一键复制配置\n      * @param {Object} opts - parameters\n      * @param {} [opts.domain] - 源域名  optional\n      * @param {} [opts.copyDomains] - 待复制的域名列表,多个以&quot;,&quot;分隔,且不超过20个  optional\n      * @param {} [opts.configKeys] - 待复制的配置项名字,区分大小写.配置项的含义：originConfig：回源配置信息;refererConfig：referer防盗链;urlAuthConfig：URL鉴权;userAgentConfig：UA访问控制;ipBlackListConfig：IP黑名单;cacheConfig：缓存配置;schemeFollowOriConfig：协议跟随回源;oriFollowRedirectConfig：回源跟随302;filterParamsConfig：过滤参数;rangeConfig：range回源;videoDraftConfig：视频拖拽;httpsConfig：Https配置;httpHeaderConfig：HttpHeader设置;otherConfig：其他配置  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param errorEntity errorResult\n      */\n\n  executeDomainCopy (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.copyDomains !== undefined && opts.copyDomains !== null) {\n      postBody['copyDomains'] = opts.copyDomains\n    }\n    if (opts.configKeys !== undefined && opts.configKeys !== null) {\n      postBody['configKeys'] = opts.configKeys\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call executeDomainCopy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/executeDomainCopy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询异常码缓存时间\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain\n      * @param extraCacheTime extraCacheTimes\n      */\n\n  queryExtraCacheTime (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryExtraCacheTime\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryExtraCacheTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/extraCacheTime:query',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置异常码缓存时间\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.httpCode] - 异常状态码 [&quot;4xx&quot;,&quot;400&quot;, &quot;401&quot;,  &quot;402&quot;, &quot;404&quot;, &quot;405&quot;, &quot;406&quot;, &quot;407&quot;, &quot;408&quot;, &quot;409&quot;, &quot;410&quot;, &quot;411&quot;, &quot;412&quot;, &quot;413&quot;, &quot;414&quot;, &quot;415&quot;, &quot;416&quot;, &quot;417&quot;,  &quot;5xx&quot;,&quot;500&quot;, &quot;501&quot;, &quot;502&quot;, &quot;503&quot;, &quot;504&quot;, &quot;505&quot;]中的其中一个  optional\n      * @param {} [opts.cacheTime] - 缓存时间(单位:秒)  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setExtraCacheTime (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setExtraCacheTime\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.httpCode !== undefined && opts.httpCode !== null) {\n      postBody['httpCode'] = opts.httpCode\n    }\n    if (opts.cacheTime !== undefined && opts.cacheTime !== null) {\n      postBody['cacheTime'] = opts.cacheTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setExtraCacheTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/extraCacheTime:set',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除异常码缓存时间\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.httpCode] - 异常状态码 [&quot;4xx&quot;,&quot;400&quot;, &quot;401&quot;,  &quot;402&quot;, &quot;404&quot;, &quot;405&quot;, &quot;406&quot;, &quot;407&quot;, &quot;408&quot;, &quot;409&quot;, &quot;410&quot;, &quot;411&quot;, &quot;412&quot;, &quot;413&quot;, &quot;414&quot;, &quot;415&quot;, &quot;416&quot;, &quot;417&quot;,  &quot;5xx&quot;,&quot;500&quot;, &quot;501&quot;, &quot;502&quot;, &quot;503&quot;, &quot;504&quot;, &quot;505&quot;]中的其中一个  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteExtraCacheTime (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling deleteExtraCacheTime\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.httpCode !== undefined && opts.httpCode !== null) {\n      postBody['httpCode'] = opts.httpCode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteExtraCacheTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/extraCacheTime:delete',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量设置异常码缓存时间\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.content] - 状态码和过期时间，多个用英文分号分隔,如404:3;500:10;异常状态码 [&quot;4xx&quot;,&quot;400&quot;, &quot;401&quot;,  &quot;402&quot;, &quot;404&quot;, &quot;405&quot;, &quot;406&quot;, &quot;407&quot;, &quot;408&quot;, &quot;409&quot;, &quot;410&quot;, &quot;411&quot;, &quot;412&quot;, &quot;413&quot;, &quot;414&quot;, &quot;415&quot;, &quot;416&quot;, &quot;417&quot;,  &quot;5xx&quot;,&quot;500&quot;, &quot;501&quot;, &quot;502&quot;, &quot;503&quot;, &quot;504&quot;, &quot;505&quot;]中的其中一个,缓存时间(单位:秒)  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  batchSetExtraCacheTime (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling batchSetExtraCacheTime\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.content !== undefined && opts.content !== null) {\n      postBody['content'] = opts.content\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchSetExtraCacheTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/extraCacheTime:batchSet',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置gzip\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.status] - 开关取值[on,off]  optional\n      * @param {} [opts.gzipTypes] - gzip类型,如application/x-javascript,application/xml  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setGzip (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setGzip\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.gzipTypes !== undefined && opts.gzipTypes !== null) {\n      postBody['gzipTypes'] = opts.gzipTypes\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setGzip with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/gzip',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  回源改写配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.beforeRegex] - 回源改写之前的正则表达式  optional\n      * @param {} [opts.afterRegex] - 回源改写之后的正则表达式  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  configBackSourceRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling configBackSourceRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.beforeRegex !== undefined && opts.beforeRegex !== null) {\n      postBody['beforeRegex'] = opts.beforeRegex\n    }\n    if (opts.afterRegex !== undefined && opts.afterRegex !== null) {\n      postBody['afterRegex'] = opts.afterRegex\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call configBackSourceRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/configBackSourceRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询回源改写配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain  加速域名\n      * @param string beforeRegex  回源改写之前的正则表达式\n      * @param string afterRegex  回源改写之后的正则表达式\n      */\n\n  queryBackSourceRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryBackSourceRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBackSourceRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/queryBackSourceRule',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  URL改写配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.beforeRegex] - url改写之前的正则表达式  optional\n      * @param {} [opts.afterRegex] - url改写之后的正则表达式  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  configUrlRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling configUrlRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.beforeRegex !== undefined && opts.beforeRegex !== null) {\n      postBody['beforeRegex'] = opts.beforeRegex\n    }\n    if (opts.afterRegex !== undefined && opts.afterRegex !== null) {\n      postBody['afterRegex'] = opts.afterRegex\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call configUrlRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/configUrlRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询Url改写配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain  加速域名\n      * @param string beforeRegex  url改写之前的正则表达式\n      * @param string afterRegex  url改写之后的正则表达式\n      */\n\n  queryUrlRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryUrlRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryUrlRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/queryUrlRule',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  http2配置，中国境外/全球加速域名暂不支持该配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.status] - HTTP2功能开关，取值on/off  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  configHttp2 (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling configHttp2\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call configHttp2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/configHttp2',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询http2配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain  加速域名\n      * @param string status  HTTP2功能开关，取值on/off\n      */\n\n  queryHttp2 (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryHttp2\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryHttp2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/queryHttp2',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  多path回源配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.configs]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  configBackSourcePath (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling configBackSourcePath\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.configs !== undefined && opts.configs !== null) {\n      postBody['configs'] = opts.configs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call configBackSourcePath with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/configBackSourcePath',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询回源path\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain  加速域名\n      * @param configBackSourcePathItems configs  配置信息\n      */\n\n  queryBackSourcePath (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryBackSourcePath\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBackSourcePath with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/queryBackSourcePath',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置加速区域\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.accelerateRegion] - 加速区域,取值[mainland,nonMainland,all]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setAccelerateRegion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setAccelerateRegion\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accelerateRegion !== undefined && opts.accelerateRegion !== null) {\n      postBody['accelerateRegion'] = opts.accelerateRegion\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setAccelerateRegion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/accelerateRegion',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  回源改写批量配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.status] - on/off，若为off则数组需为空，若为on则数组不可为空  optional\n      * @param {} [opts.rules]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  configBackSourceRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling configBackSourceRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.rules !== undefined && opts.rules !== null) {\n      postBody['rules'] = opts.rules\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call configBackSourceRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/configBackSourceRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询回源改写批量配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain  加速域名\n      * @param string status  on/off\n      * @param backSourceRule rules  配置信息\n      */\n\n  queryBackSourceRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryBackSourceRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBackSourceRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/queryBackSourceRules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置回源OSS鉴权\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.status] - on/off，若为on则以下必传参数不可为空[accessKey,secretKey,bucket,domain2],若为off则以下参数均不能有值[accessKey,secretKey,bucket,suffix,domain2]  optional\n      * @param {} [opts.accessKey] - status 为on时必填  optional\n      * @param {} [opts.secretKey] - status 为on时必填  optional\n      * @param {} [opts.bucket] - oss桶名,status 为on时必填  optional\n      * @param {} [opts.suffix] - oss后缀,status 为on时选填  optional\n      * @param {} [opts.domain2] - status 为on时必填  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  configBackSourceOss (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling configBackSourceOss\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.accessKey !== undefined && opts.accessKey !== null) {\n      postBody['accessKey'] = opts.accessKey\n    }\n    if (opts.secretKey !== undefined && opts.secretKey !== null) {\n      postBody['secretKey'] = opts.secretKey\n    }\n    if (opts.bucket !== undefined && opts.bucket !== null) {\n      postBody['bucket'] = opts.bucket\n    }\n    if (opts.suffix !== undefined && opts.suffix !== null) {\n      postBody['suffix'] = opts.suffix\n    }\n    if (opts.domain2 !== undefined && opts.domain2 !== null) {\n      postBody['domain2'] = opts.domain2\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call configBackSourceOss with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/configBackSourceOss',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询回源OSS鉴权配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  on/off\n      * @param string bucket  oss桶名\n      * @param string suffix  oss后缀\n      * @param string domain2\n      */\n\n  queryBackSourceOss (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryBackSourceOss\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBackSourceOss with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/queryBackSourceOss',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域名限速\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.limitRate] - 限速值,单位为KB/s,取值范围[1,20480]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  speedLimit (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling speedLimit\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.limitRate !== undefined && opts.limitRate !== null) {\n      postBody['limitRate'] = opts.limitRate\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call speedLimit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/speedLimit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量添加域名ip黑名单\n      * @param {Object} opts - parameters\n      * @param {} [opts.operateDomainRange] - 可选值。表示域名操作范围，可指定为all代表操作该账号下全量域名,全量域名个数应&lt;&#x3D;单次可批量操作的域名个数(默认50)  optional\n      * @param {} [opts.domains] - 可选值。待操作的域名列表,个数默认限制50个。注意operateDomainRange和domains至少指定一个参数。operateDomainRange为all时该参数不生效.  optional\n      * @param {} [opts.ipList] - ip列表。最多50个  optional\n      * @param {} [opts.forbidTime] - 封禁时长，单位分钟。默认1440  optional\n      * @param {} [opts.action] - forbid or resume.代表封禁和解封。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  batchIpBlackList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (\n      opts.operateDomainRange !== undefined &&\n      opts.operateDomainRange !== null\n    ) {\n      postBody['operateDomainRange'] = opts.operateDomainRange\n    }\n    if (opts.domains !== undefined && opts.domains !== null) {\n      postBody['domains'] = opts.domains\n    }\n    if (opts.ipList !== undefined && opts.ipList !== null) {\n      postBody['ipList'] = opts.ipList\n    }\n    if (opts.forbidTime !== undefined && opts.forbidTime !== null) {\n      postBody['forbidTime'] = opts.forbidTime\n    }\n    if (opts.action !== undefined && opts.action !== null) {\n      postBody['action'] = opts.action\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchIpBlackList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/batchIpBlackList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置回源IP类型\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.backSourceIpVersion] - 回源IP类型，取值ipv4/ipv6/ipv46。ipv4：回源IP为ipv4；ipv6：ipv6优先；ipv46：ipv4/ipv6负载均衡  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  configBackSourceIpVersion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling configBackSourceIpVersion\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.backSourceIpVersion !== undefined &&\n      opts.backSourceIpVersion !== null\n    ) {\n      postBody['backSourceIpVersion'] = opts.backSourceIpVersion\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call configBackSourceIpVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/configBackSourceIpVersion',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询回源IP类型\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string backSourceIpVersion  回源IP类型，取值ipv4/ipv6/ipv46。ipv4：回源IP为ipv4；ipv6：ipv6优先；ipv46：ipv4/ipv6负载均衡\n      */\n\n  queryBackSourceIpVersion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryBackSourceIpVersion\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBackSourceIpVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/queryBackSourceIpVersion',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名组接口\n      * @param {Object} opts - parameters\n      * @param {string} [opts.shareCache] - 根据是否共享内存筛选  optional\n      * @param {integer} [opts.pageNumber] - pageNumber  optional\n      * @param {integer} [opts.pageSize] - pageSize  optional\n      * @param {string} [opts.primaryDomain] - 根据主域名模糊查询  optional\n      * @param {string} [opts.domainGroupName] - 根据域名组模糊查询  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param integer pageSize\n      * @param integer pageNumber\n      * @param domainGroupItem domainGroups\n      */\n\n  queryDomainGroupList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.shareCache !== undefined && opts.shareCache !== null) {\n      queryParams['shareCache'] = opts.shareCache\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.primaryDomain !== undefined && opts.primaryDomain !== null) {\n      queryParams['primaryDomain'] = opts.primaryDomain\n    }\n    if (opts.domainGroupName !== undefined && opts.domainGroupName !== null) {\n      queryParams['domainGroupName'] = opts.domainGroupName\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDomainGroupList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domainGroup',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名组详情\n      * @param {Object} opts - parameters\n      * @param {integer} opts.id - 域名组id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domains\n      * @param string primaryDomain  主域名\n      * @param string shareCache  是否共享缓存\n      * @param string domainGroupName  域名组名称\n      */\n\n  queryDomainGroupDetail (opts, callback) {\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling queryDomainGroupDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDomainGroupDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domainGroup/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询未分组域名\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domains\n      */\n\n  queryDomainsNotInGroup (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDomainsNotInGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domainGroup:notInGroup',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新域名组\n      * @param {Object} opts - parameters\n      * @param {integer} opts.id - 域名组id\n      * @param {} [opts.domains] - 域名组内域名，包含主域名  optional\n      * @param {} [opts.primaryDomain] - 主域名,开启共享缓存时必传  optional\n      * @param {} [opts.shareCache] - 是否共享内存，共享缓存仅对中国境内加速域名生效  optional\n      * @param {} [opts.domainGroupName]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateDomainGroup (opts, callback) {\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling updateDomainGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domains !== undefined && opts.domains !== null) {\n      postBody['domains'] = opts.domains\n    }\n    if (opts.primaryDomain !== undefined && opts.primaryDomain !== null) {\n      postBody['primaryDomain'] = opts.primaryDomain\n    }\n    if (opts.shareCache !== undefined && opts.shareCache !== null) {\n      postBody['shareCache'] = opts.shareCache\n    }\n    if (opts.domainGroupName !== undefined && opts.domainGroupName !== null) {\n      postBody['domainGroupName'] = opts.domainGroupName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateDomainGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domainGroup/{id}:update',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建域名组\n      * @param {Object} opts - parameters\n      * @param {} [opts.shareCache] - 是否共享内存，共享缓存仅对中国境内加速域名生效  optional\n      * @param {} [opts.primaryDomain] - 主域名,开启共享缓存时必传  optional\n      * @param {} [opts.domainGroupName] - 域名组名称  optional\n      * @param {} [opts.domains] - 域名组内域名包含主域名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createDomainGroup (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.shareCache !== undefined && opts.shareCache !== null) {\n      postBody['shareCache'] = opts.shareCache\n    }\n    if (opts.primaryDomain !== undefined && opts.primaryDomain !== null) {\n      postBody['primaryDomain'] = opts.primaryDomain\n    }\n    if (opts.domainGroupName !== undefined && opts.domainGroupName !== null) {\n      postBody['domainGroupName'] = opts.domainGroupName\n    }\n    if (opts.domains !== undefined && opts.domains !== null) {\n      postBody['domains'] = opts.domains\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDomainGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domainGroup:create',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量删除域名组\n      * @param {Object} opts - parameters\n      * @param {array} opts.ids\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  batchDeleteDomainGroup (opts, callback) {\n    opts = opts || {}\n\n    if (opts.ids === undefined || opts.ids === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ids' when calling batchDeleteDomainGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ids !== undefined && opts.ids !== null) {\n      postBody['ids'] = opts.ids\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchDeleteDomainGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domainGroup:batchDelete',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询加速域名接口\n      * @param {Object} opts - parameters\n      * @param {string} [opts.keyWord] - 根据关键字进行模糊匹配  optional\n      * @param {integer} [opts.pageNumber] - pageNumber,默认值1  optional\n      * @param {integer} [opts.pageSize] - pageSize,最大值50,默认值20  optional\n      * @param {string} [opts.status] - 根据域名状态查询, 可选值[offline, online, configuring, auditing, audit_reject]  optional\n      * @param {string} [opts.type] - 域名类型，(web:静态小文件，download:大文件加速，vod:视频加速，live:直播加速),不传查所有  optional\n      * @param {string} [opts.accelerateRegion] - 加速区域，(mainLand:中国大陆，nonMainLand:海外加港澳台，all:全球),不传为全球  optional\n      * @param {boolean} [opts.withThirdPartyStatus] - 筛选依据（false不需要查询, true 需要查询海外状态)默认false  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param integer pageSize\n      * @param integer pageNumber\n      * @param listDomainItem domains\n      */\n\n  getDomainList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.keyWord !== undefined && opts.keyWord !== null) {\n      queryParams['keyWord'] = opts.keyWord\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n    if (opts.accelerateRegion !== undefined && opts.accelerateRegion !== null) {\n      queryParams['accelerateRegion'] = opts.accelerateRegion\n    }\n    if (\n      opts.withThirdPartyStatus !== undefined &&\n      opts.withThirdPartyStatus !== null\n    ) {\n      queryParams['withThirdPartyStatus'] = opts.withThirdPartyStatus\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDomainList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  通过标签查询加速域名接口\n      * @param {Object} opts - parameters\n      * @param {string} [opts.keyWord] - 根据关键字进行模糊匹配，域名或者回源信息  optional\n      * @param {integer} [opts.pageNumber] - pageNumber,默认值为1  optional\n      * @param {integer} [opts.pageSize] - pageSize,默认值为20,最大值为50  optional\n      * @param {string} [opts.status] - 根据域名状态查询, 可选值[offline, online, configuring, auditing, audit_reject]  optional\n      * @param {string} [opts.type] - 域名类型，(web:静态小文件，download:大文件加速，vod:视频加速，live:直播加速),不传查所有  optional\n      * @param {string} [opts.accelerateRegion] - 加速区域，(mainLand:中国大陆，nonMainLand:海外加港澳台，all:全球),不传为全球  optional\n      * @param {integer} [opts.filterBy] - 筛选依据（0：根据域名筛选，1：根据回源信息筛选），默认按照域名进行筛选  optional\n      * @param {array} [opts.tagFilters] - 标签过滤条件  optional\n      * @param {boolean} [opts.withThirdPartyStatus] - 筛选依据（false不需要查询, true 需要查询海外状态)默认false  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param integer pageSize\n      * @param integer pageNumber\n      * @param listDomainItemByFilter domains\n      */\n\n  getDomainListByFilter (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.keyWord !== undefined && opts.keyWord !== null) {\n      postBody['keyWord'] = opts.keyWord\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      postBody['type'] = opts.type\n    }\n    if (opts.accelerateRegion !== undefined && opts.accelerateRegion !== null) {\n      postBody['accelerateRegion'] = opts.accelerateRegion\n    }\n    if (opts.filterBy !== undefined && opts.filterBy !== null) {\n      postBody['filterBy'] = opts.filterBy\n    }\n    if (opts.tagFilters !== undefined && opts.tagFilters !== null) {\n      postBody['tagFilters'] = opts.tagFilters\n    }\n    if (\n      opts.withThirdPartyStatus !== undefined &&\n      opts.withThirdPartyStatus !== null\n    ) {\n      postBody['withThirdPartyStatus'] = opts.withThirdPartyStatus\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDomainListByFilter with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain:query',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询加速域名详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string allStatus  null\n      * @param string allowNoReferHeader  是否允许空refer访问\n      * @param string allowNullReferHeader  null\n      * @param integer dailyBandWidth  日带宽（单位Mbps）\n      * @param string forbiddenType  封禁类型，取值：domain,url\n      * @param integer maxFileSize  最大单个文件大小（单位MB）\n      * @param integer minFileSize  最小单个文件大小（单位MB）\n      * @param integer sumFileSize  总文件大小（单位MB）\n      * @param integer avgFileSize  平均文件大小（单位MB）\n      * @param string referList\n      * @param string referType  refer类型，取值：block（黑名单），allow（白名单）\n      * @param string domain  域名\n      * @param string cname  为加速域名生成的一个CNAME域名，需要在域名解析服务商处将加速域名CNAME解析到该域名\n      * @param string archiveNo  域名备案号\n      * @param string type  域名加速类型，web表示图片及小文件加速\n      * @param string created  创建时间\n      * @param string modified  最后修改时间\n      * @param string status  加速域名运行状态 ，online 表示启用；offline表示停用；configuring表示配置中；configure_failed表示配置失败\n      * @param string auditStatus  域名审核状态，取值：0（未审核），1（审核通过），2（审核不通过）\n      * @param backSourceInfo source  null\n      * @param string sourceType  回源类型：取值 ips（IP列表），domain（域名）,oss（oss回源）\n      * @param string defaultSourceHost  默认的回源host\n      * @param string backSourceType  回源类型，只能为http（80端口回源）或者https（443端口回源），默认为http\n      * @param string httpType  http类型，只能为http或者https，默认为http。当设为https时，需要调用“设置通讯协议”接口上传证书和私钥\n      * @param string certificate  用户证书，当Type为https时必须设置\n      * @param string rsaKey  证书私钥\n      * @param string jumpType  跳转类型，有三种类型：default、http、https\n      * @param string certFrom  证书来源，取值：ssl,defalut\n      * @param string sslCertId  证书id\n      * @param string certName  证书名称\n      * @param string certType  证书类型\n      * @param string sslCertStartTime  证书开始时间\n      * @param string sslCertEndTime  证书结束时间\n      * @param string accelerateRegion  加速区域\n      * @param string txt  txt记录\n      * @param integer overseaStatus  海外状态(-1:不涉及海外加速,0:未激活,1:已激活,2:域名在cf不存在)\n      */\n\n  getDomainDetail (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling getDomainDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDomainDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建点播加速域名\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.sourceType] - 回源类型只能是[ips,domain,oss]中的一种  optional\n      * @param {} [opts.cdnType] - 点播域名的类型只能是[vod,download,web]中的一种  optional\n      * @param {} [opts.backSourceType] - 回源方式,只能是[https,http]中的一种,默认http  optional\n      * @param {} [opts.dailyBandWidth] - 日带宽(Mbps)  optional\n      * @param {} [opts.quaility] - 服务质量,只能是[good,general]中的一种,默认为good  optional\n      * @param {} [opts.maxFileSize]   optional\n      * @param {} [opts.minFileSize]   optional\n      * @param {} [opts.sumFileSize]   optional\n      * @param {} [opts.avgFileSize]   optional\n      * @param {} [opts.defaultSourceHost]   optional\n      * @param {} [opts.httpType]   optional\n      * @param {} [opts.ipSource]   optional\n      * @param {} [opts.domainSource]   optional\n      * @param {} [opts.ossSource]   optional\n      * @param {} [opts.accelerateRegion] - 加速区域:(mainLand:中国大陆，nonMainLand:海外加港澳台，all:全球)默认为中国大陆  optional\n      * @param {} [opts.tempInstId]   optional\n      * @param {} [opts.domainCnameTag] - cname标签,使用时通过queryDomainCnameTag接口获取  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling createDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sourceType !== undefined && opts.sourceType !== null) {\n      postBody['sourceType'] = opts.sourceType\n    }\n    if (opts.cdnType !== undefined && opts.cdnType !== null) {\n      postBody['cdnType'] = opts.cdnType\n    }\n    if (opts.backSourceType !== undefined && opts.backSourceType !== null) {\n      postBody['backSourceType'] = opts.backSourceType\n    }\n    if (opts.dailyBandWidth !== undefined && opts.dailyBandWidth !== null) {\n      postBody['dailyBandWidth'] = opts.dailyBandWidth\n    }\n    if (opts.quaility !== undefined && opts.quaility !== null) {\n      postBody['quaility'] = opts.quaility\n    }\n    if (opts.maxFileSize !== undefined && opts.maxFileSize !== null) {\n      postBody['maxFileSize'] = opts.maxFileSize\n    }\n    if (opts.minFileSize !== undefined && opts.minFileSize !== null) {\n      postBody['minFileSize'] = opts.minFileSize\n    }\n    if (opts.sumFileSize !== undefined && opts.sumFileSize !== null) {\n      postBody['sumFileSize'] = opts.sumFileSize\n    }\n    if (opts.avgFileSize !== undefined && opts.avgFileSize !== null) {\n      postBody['avgFileSize'] = opts.avgFileSize\n    }\n    if (\n      opts.defaultSourceHost !== undefined &&\n      opts.defaultSourceHost !== null\n    ) {\n      postBody['defaultSourceHost'] = opts.defaultSourceHost\n    }\n    if (opts.httpType !== undefined && opts.httpType !== null) {\n      postBody['httpType'] = opts.httpType\n    }\n    if (opts.ipSource !== undefined && opts.ipSource !== null) {\n      postBody['ipSource'] = opts.ipSource\n    }\n    if (opts.domainSource !== undefined && opts.domainSource !== null) {\n      postBody['domainSource'] = opts.domainSource\n    }\n    if (opts.ossSource !== undefined && opts.ossSource !== null) {\n      postBody['ossSource'] = opts.ossSource\n    }\n    if (opts.accelerateRegion !== undefined && opts.accelerateRegion !== null) {\n      postBody['accelerateRegion'] = opts.accelerateRegion\n    }\n    if (opts.tempInstId !== undefined && opts.tempInstId !== null) {\n      postBody['tempInstId'] = opts.tempInstId\n    }\n    if (opts.domainCnameTag !== undefined && opts.domainCnameTag !== null) {\n      postBody['domainCnameTag'] = opts.domainCnameTag\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除加速域名\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling deleteDomain\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名cname标签\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainType - 域名类型，取值范围web,download,vod,dynamic,live\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string cnameTags\n      */\n\n  queryDomainCnameTag (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainType === undefined || opts.domainType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainType' when calling queryDomainCnameTag\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainType !== undefined && opts.domainType !== null) {\n      queryParams['domainType'] = opts.domainType\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDomainCnameTag with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/queryDomainCnameTag',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动加速域名\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling startDomain\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}:start',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止加速域名\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling stopDomain\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}:stop',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询oss存储域名\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total\n      * @param object ossBuckets\n      */\n\n  queryOssBuckets (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryOssBuckets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/ossBuckets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建点播加速域名\n      * @param {Object} opts - parameters\n      * @param {} [opts.domains]   optional\n      * @param {} [opts.sourceType] - 回源类型只能是[ips,domain,oss]中的一种  optional\n      * @param {} [opts.cdnType] - 点播域名的类型只能是[vod,download,web]中的一种  optional\n      * @param {} [opts.backSourceType] - 回源方式,只能是[https,http]中的一种,默认http  optional\n      * @param {} [opts.dailyBandWidth] - 日带宽(Mbps)  optional\n      * @param {} [opts.quaility] - 服务质量,只能是[good,general]中的一种,默认为good  optional\n      * @param {} [opts.maxFileSize]   optional\n      * @param {} [opts.minFileSize]   optional\n      * @param {} [opts.sumFileSize]   optional\n      * @param {} [opts.avgFileSize]   optional\n      * @param {} [opts.defaultSourceHost]   optional\n      * @param {} [opts.httpType]   optional\n      * @param {} [opts.ipSource]   optional\n      * @param {} [opts.domainSource]   optional\n      * @param {} [opts.ossSource]   optional\n      * @param {} [opts.accelerateRegion] - 加速区域 (mainLand:中国大陆，nonMainLand:海外加港澳台，all:全球)默认为中国大陆  optional\n      * @param {} [opts.tempInstId]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  batchCreate (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.domains !== undefined && opts.domains !== null) {\n      postBody['domains'] = opts.domains\n    }\n    if (opts.sourceType !== undefined && opts.sourceType !== null) {\n      postBody['sourceType'] = opts.sourceType\n    }\n    if (opts.cdnType !== undefined && opts.cdnType !== null) {\n      postBody['cdnType'] = opts.cdnType\n    }\n    if (opts.backSourceType !== undefined && opts.backSourceType !== null) {\n      postBody['backSourceType'] = opts.backSourceType\n    }\n    if (opts.dailyBandWidth !== undefined && opts.dailyBandWidth !== null) {\n      postBody['dailyBandWidth'] = opts.dailyBandWidth\n    }\n    if (opts.quaility !== undefined && opts.quaility !== null) {\n      postBody['quaility'] = opts.quaility\n    }\n    if (opts.maxFileSize !== undefined && opts.maxFileSize !== null) {\n      postBody['maxFileSize'] = opts.maxFileSize\n    }\n    if (opts.minFileSize !== undefined && opts.minFileSize !== null) {\n      postBody['minFileSize'] = opts.minFileSize\n    }\n    if (opts.sumFileSize !== undefined && opts.sumFileSize !== null) {\n      postBody['sumFileSize'] = opts.sumFileSize\n    }\n    if (opts.avgFileSize !== undefined && opts.avgFileSize !== null) {\n      postBody['avgFileSize'] = opts.avgFileSize\n    }\n    if (\n      opts.defaultSourceHost !== undefined &&\n      opts.defaultSourceHost !== null\n    ) {\n      postBody['defaultSourceHost'] = opts.defaultSourceHost\n    }\n    if (opts.httpType !== undefined && opts.httpType !== null) {\n      postBody['httpType'] = opts.httpType\n    }\n    if (opts.ipSource !== undefined && opts.ipSource !== null) {\n      postBody['ipSource'] = opts.ipSource\n    }\n    if (opts.domainSource !== undefined && opts.domainSource !== null) {\n      postBody['domainSource'] = opts.domainSource\n    }\n    if (opts.ossSource !== undefined && opts.ossSource !== null) {\n      postBody['ossSource'] = opts.ossSource\n    }\n    if (opts.accelerateRegion !== undefined && opts.accelerateRegion !== null) {\n      postBody['accelerateRegion'] = opts.accelerateRegion\n    }\n    if (opts.tempInstId !== undefined && opts.tempInstId !== null) {\n      postBody['tempInstId'] = opts.tempInstId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchCreate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain:batchCreate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名配置信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string ignoreQueryString  忽略参数[on,off]\n      * @param string range  range参数[on,off]\n      * @param string httpType  httpType参数[on,off]\n      * @param string httpsCertificate  https证书\n      * @param string httpsRsaKey  rsa秘钥\n      * @param string httpsJumpType  跳转类型[default,http,https]\n      * @param string videoDraft  是否支持视频拖拽[on,off]\n      * @param string groupName  group\n      * @param integer shareId\n      * @param string shareName\n      * @param string jcdnTimeAnti\n      * @param string shareCache\n      * @param string isShareOpen\n      * @param string gzip  gzip参数[on,off]\n      * @param string gzipTypes\n      * @param cacheRule cacheRules\n      */\n\n  queryDomainConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryDomainConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDomainConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/config',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成域名txt记录\n      * @param {Object} opts - parameters\n      * @param {} [opts.domain] - 域名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string txt  生成的txt文本\n      */\n\n  generateDomainTxt (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generateDomainTxt with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/generateDomainTxt',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域名txt校验\n      * @param {Object} opts - parameters\n      * @param {} [opts.domain] - 域名  optional\n      * @param {} [opts.validateType] - 校验类型，dns or file  optional\n      * @param {} [opts.hostRecord] - 主机记录,dns验证方式时必传.值为_cdnautover  optional\n      * @param {} [opts.txt] - 主机记录值  optional\n      * @param {} [opts.url] - file验证方式时必传  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean pass  是否校验通过，true通过，false不通过\n      * @param string errMsg  不通过原因，仅校验不通过时有值\n      */\n\n  domainTxtValidate (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.validateType !== undefined && opts.validateType !== null) {\n      postBody['validateType'] = opts.validateType\n    }\n    if (opts.hostRecord !== undefined && opts.hostRecord !== null) {\n      postBody['hostRecord'] = opts.hostRecord\n    }\n    if (opts.txt !== undefined && opts.txt !== null) {\n      postBody['txt'] = opts.txt\n    }\n    if (opts.url !== undefined && opts.url !== null) {\n      postBody['url'] = opts.url\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call domainTxtValidate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domainTxtValidate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询模板实例列表接口\n      * @param {Object} opts - parameters\n      * @param {string} [opts.instName] - 根据关键字进行模糊匹配  optional\n      * @param {integer} [opts.pageNumber] - pageNumber,默认值1  optional\n      * @param {integer} [opts.pageSize] - pageSize,最大值50,默认值20  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param integer pageSize\n      * @param integer pageNumber\n      * @param listDomainTempItem instList\n      */\n\n  queryDomainTempInstList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instName !== undefined && opts.instName !== null) {\n      queryParams['instName'] = opts.instName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDomainTempInstList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domainTempInst:list',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询模板详情\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object proKeyMap  查询结果,类型为HashMap&lt;String, List&lt;String&gt;&gt;\n      */\n\n  queryDomainTempProKeys (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDomainTempProKeys with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domainTemp',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建修改模板实例\n      * @param {Object} opts - parameters\n      * @param {} [opts.tempId] - 模板id，预留字段  optional\n      * @param {} [opts.instId] - 模板实例id，修改时必传  optional\n      * @param {} [opts.instName] - 模板实例名称  optional\n      * @param {} [opts.instProInfoMap] - 查询结果,类型为Map&lt;String,Map&lt;String,Object&gt;&gt;  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyDomainTempInst (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.tempId !== undefined && opts.tempId !== null) {\n      postBody['tempId'] = opts.tempId\n    }\n    if (opts.instId !== undefined && opts.instId !== null) {\n      postBody['instId'] = opts.instId\n    }\n    if (opts.instName !== undefined && opts.instName !== null) {\n      postBody['instName'] = opts.instName\n    }\n    if (opts.instProInfoMap !== undefined && opts.instProInfoMap !== null) {\n      postBody['instProInfoMap'] = opts.instProInfoMap\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyDomainTempInst with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domainTempInst',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询模板实例详情\n      * @param {Object} opts - parameters\n      * @param {integer} opts.instId - 模板实例id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instName  模板实例名称\n      * @param string createTime  创建时间utc格式\n      * @param string updateTime  创建时间utc格式\n      * @param object instProInfoMap  查询结果,类型为Map&lt;String,Map&lt;String,Object&gt;&gt;\n      */\n\n  queryDomainTempInst (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling queryDomainTempInst\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instId: opts.instId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDomainTempInst with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domainTempInst/{instId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除修改模板实例\n      * @param {Object} opts - parameters\n      * @param {integer} opts.instId - 模板实例id\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  delDomainTempInstance (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling delDomainTempInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instId: opts.instId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call delDomainTempInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domainTempInst/{instId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询IP归属，适用于查询边缘节点，仅支持中国境内IP地址查询\n      * @param {Object} opts - parameters\n      * @param {} [opts.ips]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param checkWhetherIpBelongToJCloudItem ipList\n      */\n\n  checkWhetherIpBelongToJCloud (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.ips !== undefined && opts.ips !== null) {\n      postBody['ips'] = opts.ips\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkWhetherIpBelongToJCloud with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/ip:whetherBelongToJCloud',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个域名的全部调度ip\n      * @param {Object} opts - parameters\n      * @param {} [opts.domainList]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainSchedResultItem domainSchedResultItemList\n      */\n\n  queryServiceIp (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.domainList !== undefined && opts.domainList !== null) {\n      postBody['domainList'] = opts.domainList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryServiceIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/ip:queryServiceIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置直播域名回源信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.sourceType] - 回源类型只能为[ips,domain]中的一种  optional\n      * @param {} [opts.backSourceType]   optional\n      * @param {} [opts.defaultSourceHost] - 默认回源host  optional\n      * @param {} [opts.domainSource]   optional\n      * @param {} [opts.ipSource]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setLiveDomainBackSource (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setLiveDomainBackSource\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sourceType !== undefined && opts.sourceType !== null) {\n      postBody['sourceType'] = opts.sourceType\n    }\n    if (opts.backSourceType !== undefined && opts.backSourceType !== null) {\n      postBody['backSourceType'] = opts.backSourceType\n    }\n    if (\n      opts.defaultSourceHost !== undefined &&\n      opts.defaultSourceHost !== null\n    ) {\n      postBody['defaultSourceHost'] = opts.defaultSourceHost\n    }\n    if (opts.domainSource !== undefined && opts.domainSource !== null) {\n      postBody['domainSource'] = opts.domainSource\n    }\n    if (opts.ipSource !== undefined && opts.ipSource !== null) {\n      postBody['ipSource'] = opts.ipSource\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setLiveDomainBackSource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomain/{domain}/backSource',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置直播域名ip黑白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.ips] - ip名单,ips中url不能超过50条  optional\n      * @param {} [opts.ipListType] - ip黑白名单类型，black:黑名单,white:白名单  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setLiveDomainIpBlackList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setLiveDomainIpBlackList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ips !== undefined && opts.ips !== null) {\n      postBody['ips'] = opts.ips\n    }\n    if (opts.ipListType !== undefined && opts.ipListType !== null) {\n      postBody['ipListType'] = opts.ipListType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setLiveDomainIpBlackList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomain/{domain}/ipBlackList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置域名refer防盗链\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.referType] - refer类型，取值：block（黑名单），allow（白名单）默认为block  optional\n      * @param {} [opts.referList] - 逗号隔开的域名列表，如果referList传空则为删除  optional\n      * @param {} [opts.allowNoReferHeader] - 是否允许空refer访问，默认为“on”  optional\n      * @param {} [opts.allowNullReferHeader] - 是否允许无ua访问，默认为“on”  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setLiveDomainRefer (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setLiveDomainRefer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.referType !== undefined && opts.referType !== null) {\n      postBody['referType'] = opts.referType\n    }\n    if (opts.referList !== undefined && opts.referList !== null) {\n      postBody['referList'] = opts.referList\n    }\n    if (\n      opts.allowNoReferHeader !== undefined &&\n      opts.allowNoReferHeader !== null\n    ) {\n      postBody['allowNoReferHeader'] = opts.allowNoReferHeader\n    }\n    if (\n      opts.allowNullReferHeader !== undefined &&\n      opts.allowNullReferHeader !== null\n    ) {\n      postBody['allowNullReferHeader'] = opts.allowNullReferHeader\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setLiveDomainRefer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomain/{domain}/refer',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启或关闭ip黑名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.blackIpsEnable]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  operateLiveDomainIpBlackList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling operateLiveDomainIpBlackList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.blackIpsEnable !== undefined && opts.blackIpsEnable !== null) {\n      postBody['blackIpsEnable'] = opts.blackIpsEnable\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call operateLiveDomainIpBlackList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomain/{domain}/ipBlackList:operate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置直播域名回源host\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.sourceHost] - 默认回源host  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setLiveDomainBackSourceHost (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setLiveDomainBackSourceHost\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sourceHost !== undefined && opts.sourceHost !== null) {\n      postBody['sourceHost'] = opts.sourceHost\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setLiveDomainBackSourceHost with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomain/{domain}/backSourceHost',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置URL鉴权\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.accesskeyType] - url鉴权开启1关闭0  optional\n      * @param {} [opts.accesskeyKey] - url鉴权开启时必传  optional\n      * @param {} [opts.authLifeTime] - 开启时默认值为300s,关闭时为0  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setLiveDomainAccessKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setLiveDomainAccessKey\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accesskeyType !== undefined && opts.accesskeyType !== null) {\n      postBody['accesskeyType'] = opts.accesskeyType\n    }\n    if (opts.accesskeyKey !== undefined && opts.accesskeyKey !== null) {\n      postBody['accesskeyKey'] = opts.accesskeyKey\n    }\n    if (opts.authLifeTime !== undefined && opts.authLifeTime !== null) {\n      postBody['authLifeTime'] = opts.authLifeTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setLiveDomainAccessKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomain/{domain}/accesskeyConfig',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置转协议\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.certificate] - https证书,转https格式时必传  optional\n      * @param {} [opts.rsaKey] - https私钥，转https格式时必传  optional\n      * @param {} [opts.certFrom] - 证书来源有两种类型：default,ssl  optional\n      * @param {} [opts.sslCertId] - ssl证书id  optional\n      * @param {} [opts.syncToSsl] - 是否同步到ssl,boolean值，取值true或者false  optional\n      * @param {} [opts.certName] - syncToSsl是true时，certName是必填项  optional\n      * @param {} [opts.protocolConverts]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setProtocolConvert (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setProtocolConvert\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.certificate !== undefined && opts.certificate !== null) {\n      postBody['certificate'] = opts.certificate\n    }\n    if (opts.rsaKey !== undefined && opts.rsaKey !== null) {\n      postBody['rsaKey'] = opts.rsaKey\n    }\n    if (opts.certFrom !== undefined && opts.certFrom !== null) {\n      postBody['certFrom'] = opts.certFrom\n    }\n    if (opts.sslCertId !== undefined && opts.sslCertId !== null) {\n      postBody['sslCertId'] = opts.sslCertId\n    }\n    if (opts.syncToSsl !== undefined && opts.syncToSsl !== null) {\n      postBody['syncToSsl'] = opts.syncToSsl\n    }\n    if (opts.certName !== undefined && opts.certName !== null) {\n      postBody['certName'] = opts.certName\n    }\n    if (opts.protocolConverts !== undefined && opts.protocolConverts !== null) {\n      postBody['protocolConverts'] = opts.protocolConverts\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setProtocolConvert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomain/{domain}/protocolConvert',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除禁播流\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.deleteStreams] - 要删除的禁播流  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteForbiddenStream (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling deleteForbiddenStream\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deleteStreams !== undefined && opts.deleteStreams !== null) {\n      postBody['deleteStreams'] = opts.deleteStreams\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteForbiddenStream with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomain/{domain}/stream:unForbidden',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户推流域名app名/流名\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} [opts.app] - app名，传appName查询流名列表  optional\n      * @param {string} [opts.stream] - 流名模糊查询  optional\n      * @param {integer} [opts.limit] - 指定app/流名列表大小，默认50  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string streams\n      */\n\n  queryPushDomainORAppOrStream (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryPushDomainORAppOrStream\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.app !== undefined && opts.app !== null) {\n      queryParams['app'] = opts.app\n    }\n    if (opts.stream !== undefined && opts.stream !== null) {\n      queryParams['stream'] = opts.stream\n    }\n    if (opts.limit !== undefined && opts.limit !== null) {\n      queryParams['limit'] = opts.limit\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryPushDomainORAppOrStream with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomain/{domain}/stream:fuzzyQuery',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询ip黑白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain  域名\n      * @param string blackIps\n      * @param string whiteIps\n      */\n\n  queryLiveDomainIpBlackWhiteList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryLiveDomainIpBlackWhiteList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryLiveDomainIpBlackWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomain/{domain}/ipList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建直播域名\n      * @param {Object} opts - parameters\n      * @param {} [opts.playDomain] - 播放域名  optional\n      * @param {} [opts.publishDomain] - 创建推流域名时，必传推流域名  optional\n      * @param {} [opts.sourceType] - 回源类型只能是[ips,domain]中的一种  optional\n      * @param {} [opts.backHttpType]   optional\n      * @param {} [opts.defaultSourceHost] - 默认回源host  optional\n      * @param {} [opts.siteType] - 站点类型pull(拉流)push(推流)  optional\n      * @param {} [opts.backSourceType] - 回源类型，目前只能为rtmp  optional\n      * @param {} [opts.ipSource]   optional\n      * @param {} [opts.domainSource]   optional\n      * @param {} [opts.accelerateRegion] - 加速区域(mainLand:中国大陆，nonMainLand:海外加港澳台，all:全球)默认为中国大陆  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  batchCreateLiveDomain (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.playDomain !== undefined && opts.playDomain !== null) {\n      postBody['playDomain'] = opts.playDomain\n    }\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.sourceType !== undefined && opts.sourceType !== null) {\n      postBody['sourceType'] = opts.sourceType\n    }\n    if (opts.backHttpType !== undefined && opts.backHttpType !== null) {\n      postBody['backHttpType'] = opts.backHttpType\n    }\n    if (\n      opts.defaultSourceHost !== undefined &&\n      opts.defaultSourceHost !== null\n    ) {\n      postBody['defaultSourceHost'] = opts.defaultSourceHost\n    }\n    if (opts.siteType !== undefined && opts.siteType !== null) {\n      postBody['siteType'] = opts.siteType\n    }\n    if (opts.backSourceType !== undefined && opts.backSourceType !== null) {\n      postBody['backSourceType'] = opts.backSourceType\n    }\n    if (opts.ipSource !== undefined && opts.ipSource !== null) {\n      postBody['ipSource'] = opts.ipSource\n    }\n    if (opts.domainSource !== undefined && opts.domainSource !== null) {\n      postBody['domainSource'] = opts.domainSource\n    }\n    if (opts.accelerateRegion !== undefined && opts.accelerateRegion !== null) {\n      postBody['accelerateRegion'] = opts.accelerateRegion\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchCreateLiveDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomain:batchCreate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播域名详情v1\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domainType  域名类型\n      * @param string playDomain  播放域名\n      * @param string publishDomain  推流域名\n      * @param string originDomain  回源域名\n      * @param string createdTime  创建时间\n      * @param string cname  cname\n      * @param string siteType  站点类型推流push，拉流pull\n      * @param string status  域名状态\n      * @param backSourceInfo source  回源信息\n      * @param string sourceType  域名回源类型\n      * @param string backSourceType  回源类型目前只能未rtmp\n      * @param string videoType  视频格式 H.264\n      * @param string audioType  音频格式AAC\n      * @param string type  域名类型\n      * @param string defaultSourceHost  默认回源host\n      * @param string archiveNo  备案号\n      * @param string rtmpDomain  rtmpDomain\n      * @param string rtmpCname  rtmpCname\n      * @param string hdlDomain  hdlDomain\n      * @param string hdlCname  hdlCname\n      * @param string hlsDomain  hlsDomain\n      * @param string hlsCname  hlsCname\n      * @param string forwardCustomVhost  forwardCustomVhost\n      * @param string flvUrls\n      * @param string hlsUrls\n      * @param string rtmpUrls\n      * @param protocolConvert protocolConverts\n      * @param string certificate  https证书\n      * @param string rsaKey  https私钥\n      * @param integer accesskeyType  url鉴权开关\n      * @param string accesskeyKey  url鉴权key\n      * @param integer playAuthLifeTime  playAuthLifeTime\n      * @param integer authLifeTime  authLifeTime\n      * @param integer forwardAccessKeyType  转推鉴权开关\n      * @param string forwardPrivateKey  转推鉴权key\n      * @param integer originAccessKeyType  回源鉴权开关\n      * @param string originPrivateKey  回源鉴权key\n      * @param string allowApps\n      * @param string ips\n      * @param string blackIpsEnable  是否开启ip黑名单\n      * @param string externId  外部关联id\n      * @param string ignoreQueryString  ignoreQueryString\n      * @param string referType  referType\n      * @param string referList\n      * @param string allowNoReferHeader  允许无refer\n      * @param string allowNullReferHeader  允许空refer\n      * @param string publishNormalTimeout  推流中断超时时间(单位秒)\n      * @param string notifyCustomUrl  推断流通知Url\n      * @param string notifyCustomAuthKey  推断流通知key\n      * @param string certFrom  证书来源有两种类型：default,ssl\n      * @param string sslCertId  ssl证书id\n      * @param string certName  证书名称\n      * @param string certType  证书类型\n      * @param string sslCertStartTime\n      * @param string sslCertEndTime\n      * @param string accelerateRegion\n      */\n\n  queryLiveDomainDetail (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryLiveDomainDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryLiveDomainDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomain/{domain}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播域名app列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string apps\n      * @param string domain  域名\n      */\n\n  queryLiveDomainApps (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryLiveDomainApps\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryLiveDomainApps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomain/{domain}/app',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建直播预热任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.urlList] - 预热的URL  optional\n      * @param {} [opts.prefetchTime] - 预热时长  optional\n      * @param {} [opts.action] - 操作类型只能是[start,stop]中的一种  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createLiveDomainPrefecthTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.urlList !== undefined && opts.urlList !== null) {\n      postBody['urlList'] = opts.urlList\n    }\n    if (opts.prefetchTime !== undefined && opts.prefetchTime !== null) {\n      postBody['prefetchTime'] = opts.prefetchTime\n    }\n    if (opts.action !== undefined && opts.action !== null) {\n      postBody['action'] = opts.action\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createLiveDomainPrefecthTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/task:createLivePrefetchTask',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播预热任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.urlList] - 预热的URL  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param queryLivePrefetchItem result\n      */\n\n  queryLivePrefetchTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.urlList !== undefined && opts.urlList !== null) {\n      postBody['urlList'] = opts.urlList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryLivePrefetchTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/task:queryLivePrefetchTask',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  null\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean canIPType  true可以\n      */\n\n  queryPinCanIPType (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryPinCanIPType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/mix:queryPinCanIPType',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建预热任务接口\n      * @param {Object} opts - parameters\n      * @param {} [opts.tasks]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  batCreatePrefetchTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.tasks !== undefined && opts.tasks !== null) {\n      postBody['tasks'] = opts.tasks\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batCreatePrefetchTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/prefetchTask:batCreate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新预热任务接口\n      * @param {Object} opts - parameters\n      * @param {} [opts.url] - url  optional\n      * @param {} [opts.region] - 地区[huabei huadong dongbei huazhong huanan xinan xibei gangaotai]中的一个  optional\n      * @param {} [opts.isp] - 运营商[ct uni cm]中的一个,分别代表电信 联通 移动  optional\n      * @param {} [opts.copyNum] - 副本数,介于1-1000之间  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updatePrefetchTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.url !== undefined && opts.url !== null) {\n      postBody['url'] = opts.url\n    }\n    if (opts.region !== undefined && opts.region !== null) {\n      postBody['region'] = opts.region\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.copyNum !== undefined && opts.copyNum !== null) {\n      postBody['copyNum'] = opts.copyNum\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updatePrefetchTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/prefetchTask:update',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询预热任务接口\n      * @param {Object} opts - parameters\n      * @param {} [opts.url] - url  optional\n      * @param {} [opts.region] - 地区[huabei huadong dongbei huazhong huanan xinan xibei gangaotai]中的一个  optional\n      * @param {} [opts.isp] - 运营商[ct uni cm]中的一个,分别代表电信 联通 移动  optional\n      * @param {} [opts.status] - 查询状态 1:active维护预热中，2:表示purge中暂时停止预热  optional\n      * @param {} [opts.fileId] - 同url，系统内部url对应id（url和file_id同时存在时以url为准）  optional\n      * @param {} [opts.pageNumber] - 页码数,最小为1  optional\n      * @param {} [opts.pageSize] - 每页大小,默认10  optional\n      * @param {} [opts.taskType] - 1:代表控制台下发的预热任务2:代表热度计算下发的预热任务3:代表控制台、热度计算共同下发的任务  optional\n      * @param {} [opts.domain] - 域名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalNumber\n      * @param integer totalPage\n      * @param integer pageNumber\n      * @param integer pageSize\n      * @param prefetchTaskInfo taskList\n      */\n\n  queryPrefetchTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.url !== undefined && opts.url !== null) {\n      postBody['url'] = opts.url\n    }\n    if (opts.region !== undefined && opts.region !== null) {\n      postBody['region'] = opts.region\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.fileId !== undefined && opts.fileId !== null) {\n      postBody['fileId'] = opts.fileId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.taskType !== undefined && opts.taskType !== null) {\n      postBody['taskType'] = opts.taskType\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryPrefetchTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/prefetchTask:query',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止预热任务接口\n      * @param {Object} opts - parameters\n      * @param {} [opts.urls] - 待停止预热的url  optional\n      * @param {} [opts.region] - 地区[huabei huadong dongbei huazhong huanan xinan xibei gangaotai]中的一个  optional\n      * @param {} [opts.isp] - 运营商[ct uni cm]中的一个,分别代表电信 联通 移动  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopPrefetchTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.urls !== undefined && opts.urls !== null) {\n      postBody['urls'] = opts.urls\n    }\n    if (opts.region !== undefined && opts.region !== null) {\n      postBody['region'] = opts.region\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopPrefetchTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/prefetchTask:stop',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  操作刷新任务接口(包含创建、停止刷新任务)\n      * @param {Object} opts - parameters\n      * @param {} [opts.urls] - 待刷新的url  optional\n      * @param {} [opts.optType] - 操作类型:add代表创建刷新任务,stop代表停止刷新任务  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  operatePurgeTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.urls !== undefined && opts.urls !== null) {\n      postBody['urls'] = opts.urls\n    }\n    if (opts.optType !== undefined && opts.optType !== null) {\n      postBody['optType'] = opts.optType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call operatePurgeTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/purgeTask',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询刷新任务接口\n      * @param {Object} opts - parameters\n      * @param {} [opts.url] - url  optional\n      * @param {} [opts.status] - 查询状态 1:进行中 2:已完成  optional\n      * @param {} [opts.fileId] - 同url,系统内部url对应id（url和file_id同时存在时以url为准）  optional\n      * @param {} [opts.pageNumber] - 页码数,最小为1  optional\n      * @param {} [opts.pageSize] - 每页大小,默认10  optional\n      * @param {} [opts.domain] - 域名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalNumber\n      * @param integer totalPage\n      * @param integer pageNumber\n      * @param integer pageSize\n      * @param purgeTaskInfo taskList\n      */\n\n  queryPurgeTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.url !== undefined && opts.url !== null) {\n      postBody['url'] = opts.url\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.fileId !== undefined && opts.fileId !== null) {\n      postBody['fileId'] = opts.fileId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryPurgeTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/purgeTask:query',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户刷新预热封禁限额\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer dirAllCount  总的目录刷新上限\n      * @param integer dirUsedCount  已使用的目录刷新个数\n      * @param integer dirRemainedCount  剩余可用的目录刷新个数\n      * @param integer forbiddenUrlRemainedCount  剩余可封禁的URL个数\n      * @param integer forbiddenUrlUsedCount  已封禁的URL个数\n      * @param integer forbiddenUrlAllCount  总的封禁URL上限\n      * @param integer hasForbiddenDomainCount  已封禁的域名个数，即用户账号下对违法内容封禁的域名\n      * @param integer prefetchRemainedCount  剩余可用的预热URL个数\n      * @param integer prefetchAllCount  总的预热URL上限\n      * @param integer prefetchUsedCount  已使用的预热URL个数\n      * @param integer refreshAllCount  总的刷新URL上限\n      * @param integer refreshRemainedCount  剩余可用的刷新URL个数\n      * @param integer refreshUsedCount  已使用的刷新URL个数\n      * @param integer totalUserDomainQuota  总的用户域名数上限; 即针对账号下可添加域名的总个数\n      * @param integer usedUserDomainQuota  已使用的用户域名个数；即账号下已经添加的域名个数，包括停用域名、封禁域名等\n      * @param integer remainUserDomainQuota  剩余可配置的用户域名个数\n      */\n\n  queryCdnUserQuota (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryCdnUserQuota with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/user:quota',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据taskIds查询刷新预热任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.taskIds] - 查询的任务taskIds列表,最多能查10条  optional\n      * @param {} [opts.keyword] - url的模糊查询关键字  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param refreshTask tasks\n      */\n\n  queryRefreshTaskByIds (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.taskIds !== undefined && opts.taskIds !== null) {\n      postBody['taskIds'] = opts.taskIds\n    }\n    if (opts.keyword !== undefined && opts.keyword !== null) {\n      postBody['keyword'] = opts.keyword\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryRefreshTaskByIds with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/task:queryByIds',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置用户刷新预热限额\n      * @param {Object} opts - parameters\n      * @param {} [opts.subUsers] - 子账号，只有传值才会设置子账号，其余不传或传空是设置主账号  optional\n      * @param {} [opts.refreshCount] - 刷新个数，如果是首次设置，不传默认是2000；已经设置，再次设置是更新，不传表示不进行更新  optional\n      * @param {} [opts.prefetchCount] - 刷新个数，如果是首次设置，不传默认是2000；已经设置，再次设置是更新，不传表示不进行更新  optional\n      * @param {} [opts.dirCount] - 刷新个数，如果是首次设置，不传默认是50；已经设置，再次设置是更新，不传表示不进行更新  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setRefreshLimit (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.subUsers !== undefined && opts.subUsers !== null) {\n      postBody['subUsers'] = opts.subUsers\n    }\n    if (opts.refreshCount !== undefined && opts.refreshCount !== null) {\n      postBody['refreshCount'] = opts.refreshCount\n    }\n    if (opts.prefetchCount !== undefined && opts.prefetchCount !== null) {\n      postBody['prefetchCount'] = opts.prefetchCount\n    }\n    if (opts.dirCount !== undefined && opts.dirCount !== null) {\n      postBody['dirCount'] = opts.dirCount\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setRefreshLimit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/task:configLimit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户刷新预热限额\n      * @param {Object} opts - parameters\n      * @param {} [opts.subUsers] - 子账号，传哪些子账号就查哪些的，不传或传空默认返回所有子账号的额度  optional\n      * @param {} [opts.pageNumber] - 默认为1  optional\n      * @param {} [opts.pageSize] - 默认为10，最大100  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string user  主账号\n      * @param integer refreshCount  主账号刷新个数\n      * @param integer dirCount  主账号目录个数\n      * @param integer prefetchCount  主账号预热个数\n      * @param integer pageNumber  默认为1\n      * @param integer pageSize  默认为10，最大100\n      * @param integer total  默认为10，最大100\n      * @param subUserRefreshLimit subUserQuota\n      */\n\n  queryRefreshLimit (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.subUsers !== undefined && opts.subUsers !== null) {\n      postBody['subUsers'] = opts.subUsers\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryRefreshLimit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/task:queryLimit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据taskId查询刷新预热任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 域名组id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param refreshTask task\n      */\n\n  queryRefreshTaskById (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling queryRefreshTaskById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryRefreshTaskById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/task/{taskId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建刷新预热回调任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.taskType] - 刷新预热类型,(url:url刷新,dir:目录刷新,prefetch:预热)  optional\n      * @param {} [opts.urlItems]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer errorCount  失败任务的个数\n      * @param string taskId  任务的id\n      */\n\n  createRefreshTaskForCallback (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.taskType !== undefined && opts.taskType !== null) {\n      postBody['taskType'] = opts.taskType\n    }\n    if (opts.urlItems !== undefined && opts.urlItems !== null) {\n      postBody['urlItems'] = opts.urlItems\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRefreshTaskForCallback with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/task:createForCallback',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建刷新预热回调任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.taskType] - 刷新预热类型,(url:url刷新,dir:目录刷新,prefetch:预热)  optional\n      * @param {} [opts.urlItems]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer errorCount  失败任务的个数\n      * @param string taskId  任务的id\n      */\n\n  createRefreshTaskForCallbackV2 (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.taskType !== undefined && opts.taskType !== null) {\n      postBody['taskType'] = opts.taskType\n    }\n    if (opts.urlItems !== undefined && opts.urlItems !== null) {\n      postBody['urlItems'] = opts.urlItems\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRefreshTaskForCallbackV2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/task:createForCallbackV2',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询刷新预热任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.keyword] - url或者目录的模糊查询关键字  optional\n      * @param {} [opts.taskId] - 任务id  optional\n      * @param {} [opts.taskStatus] - null  optional\n      * @param {} [opts.taskType] - null  optional\n      * @param {} [opts.pageNumber] - 分页页数,默认值1  optional\n      * @param {} [opts.pageSize] - 分页页面大小,默认值50  optional\n      * @param {} [opts.accountType] - 查询的账号范围  optional\n      * @param {} [opts.subUsers] - 查询的子账号，多个用逗号隔开  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总的刷新预热条数.\n      * @param refreshTask tasks\n      */\n\n  queryRefreshTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.keyword !== undefined && opts.keyword !== null) {\n      queryParams['keyword'] = opts.keyword\n    }\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      queryParams['taskId'] = opts.taskId\n    }\n    if (opts.taskStatus !== undefined && opts.taskStatus !== null) {\n      queryParams['taskStatus'] = opts.taskStatus\n    }\n    if (opts.taskType !== undefined && opts.taskType !== null) {\n      queryParams['taskType'] = opts.taskType\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.accountType !== undefined && opts.accountType !== null) {\n      queryParams['accountType'] = opts.accountType\n    }\n    if (opts.subUsers !== undefined && opts.subUsers !== null) {\n      queryParams['subUsers'] = opts.subUsers\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryRefreshTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/task',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建刷新预热任务，\n      * @param {Object} opts - parameters\n      * @param {} [opts.taskType] - 刷新预热类型,(url:url刷新,dir:目录刷新,prefetch:预热)，中国境外/全球加速域名暂不支持预热功能  optional\n      * @param {} [opts.urls]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer errorCount  失败任务的个数\n      * @param string taskId  任务的id\n      */\n\n  createRefreshTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.taskType !== undefined && opts.taskType !== null) {\n      postBody['taskType'] = opts.taskType\n    }\n    if (opts.urls !== undefined && opts.urls !== null) {\n      postBody['urls'] = opts.urls\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRefreshTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/task',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网络防护层规则接口\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string switchStatus  网络防护层总开关，取值on,off，其中on开启，off关闭\n      * @param string srcNewConnLimitEnable  源新建连接限速，取值on,off，其中on开启，off关闭\n      * @param string dstNewConnLimitEnable  目的新建连接，取值on,off，其中on开启，off关闭\n      * @param integer datagramRangeMin  报文最小长度（包最小长度）,取值：1-1500\n      * @param integer datagramRangeMax  报文最大长度（包最大长度）,取值：1-1500\n      * @param integer srcNewConnLimitValue  源新建连接限速值，取值：0-4294967295\n      * @param integer dstNewConnLimitValue  目的新建连接限速值，取值：0-4294967295\n      * @param geoArea geoBlack\n      * @param string ipBlack\n      * @param string ipWhite\n      */\n\n  queryNetProtectionRules (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryNetProtectionRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/netProtectionRules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置网络防护层规则\n      * @param {Object} opts - parameters\n      * @param {} [opts.srcNewConnLimitEnable] - 源新建连接限速，取值on,off，其中on开启，off关闭  optional\n      * @param {} [opts.dstNewConnLimitEnable] - 目的新建连接，取值on,off，其中on开启，off关闭  optional\n      * @param {} [opts.datagramRangeMin] - 报文最小长度（包最小长度）,取值：1-1500  optional\n      * @param {} [opts.datagramRangeMax] - 报文最大长度（包最大长度）,取值：1-1500  optional\n      * @param {} [opts.dstNewConnLimitValue] - 目的新建连接限速值，取值：0-4294967295  optional\n      * @param {} [opts.srcNewConnLimitValue] - 源新建连接限速值，取值：0-4294967295  optional\n      * @param {} [opts.geoBlack] - 地域黑名单（GEO IP拦截）  optional\n      * @param {} [opts.ipBlack] - ip 黑名单  optional\n      * @param {} [opts.ipWhite] - ip 白名单  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setNetProtectionRules (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (\n      opts.srcNewConnLimitEnable !== undefined &&\n      opts.srcNewConnLimitEnable !== null\n    ) {\n      postBody['srcNewConnLimitEnable'] = opts.srcNewConnLimitEnable\n    }\n    if (\n      opts.dstNewConnLimitEnable !== undefined &&\n      opts.dstNewConnLimitEnable !== null\n    ) {\n      postBody['dstNewConnLimitEnable'] = opts.dstNewConnLimitEnable\n    }\n    if (opts.datagramRangeMin !== undefined && opts.datagramRangeMin !== null) {\n      postBody['datagramRangeMin'] = opts.datagramRangeMin\n    }\n    if (opts.datagramRangeMax !== undefined && opts.datagramRangeMax !== null) {\n      postBody['datagramRangeMax'] = opts.datagramRangeMax\n    }\n    if (\n      opts.dstNewConnLimitValue !== undefined &&\n      opts.dstNewConnLimitValue !== null\n    ) {\n      postBody['dstNewConnLimitValue'] = opts.dstNewConnLimitValue\n    }\n    if (\n      opts.srcNewConnLimitValue !== undefined &&\n      opts.srcNewConnLimitValue !== null\n    ) {\n      postBody['srcNewConnLimitValue'] = opts.srcNewConnLimitValue\n    }\n    if (opts.geoBlack !== undefined && opts.geoBlack !== null) {\n      postBody['geoBlack'] = opts.geoBlack\n    }\n    if (opts.ipBlack !== undefined && opts.ipBlack !== null) {\n      postBody['ipBlack'] = opts.ipBlack\n    }\n    if (opts.ipWhite !== undefined && opts.ipWhite !== null) {\n      postBody['ipWhite'] = opts.ipWhite\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setNetProtectionRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/netProtectionRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网络防护层规则\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string switchStatus  on:开启,off:关闭\n      */\n\n  queryNetProtectionRulesSwitch (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryNetProtectionRulesSwitch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/netProtectionSwitch',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置网络防护层规则总开关\n      * @param {Object} opts - parameters\n      * @param {} [opts.switchStatus] - on,off  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setNetProtectionRulesSwitch (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.switchStatus !== undefined && opts.switchStatus !== null) {\n      postBody['switchStatus'] = opts.switchStatus\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setNetProtectionRulesSwitch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/netProtectionSwitch',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询geo地域\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param geoArea geoBlack\n      */\n\n  queryGeoAreas (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryGeoAreas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/netProtectionGeoAreas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  攻击类型统计接口\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2019-08-16T06:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2019-08-16T07:00:00Z  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param attackTypeCount attackTypeCounts\n      */\n\n  queryAttackTypeCount (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryAttackTypeCount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/netProtectionData:attackTypeCount',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  DDOS攻击报表接口\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2019-08-16T06:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2019-08-16T07:00:00Z  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param protectData dataList\n      * @param string unit\n      */\n\n  queryDdosGraph (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDdosGraph with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/netProtectionData:ddosGraph',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  攻击记录查询\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2019-08-16T06:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2019-08-16T07:00:00Z  optional\n      * @param {} [opts.pageNumber] - 页码  optional\n      * @param {} [opts.pageSize] - 分页条数  optional\n      * @param {} [opts.sortField] - 排序字段，默认传avgbandwidth  optional\n      * @param {} [opts.sortRule] - 排序规则，默认是降序排序，传值asc或者desc  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer currentCount  记录数\n      * @param attackLogRecord dataList\n      * @param integer totalCount  总记录数\n      * @param integer totalPage  总页数\n      */\n\n  searchAttackLog (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.sortField !== undefined && opts.sortField !== null) {\n      postBody['sortField'] = opts.sortField\n    }\n    if (opts.sortRule !== undefined && opts.sortRule !== null) {\n      postBody['sortRule'] = opts.sortRule\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call searchAttackLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/netProtectionData:attackLog',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取所有上层节点的ip\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string ipList\n      */\n\n  getAllUpperNodeIpList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAllUpperNodeIpList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/serviceNode:getAllUpperNodeIpList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  配置服务通知接口\n      * @param {Object} opts - parameters\n      * @param {} [opts.id] - id 修改操作必传  optional\n      * @param {} [opts.noticeType] - 通知类型,取值[reportForm],reportForm:报表.  optional\n      * @param {} [opts.noticeWay] - 通知方式,取值[mail],mail:邮件.  optional\n      * @param {} [opts.noticeTo] - 通知接收人,多个用逗号隔开.  optional\n      * @param {} [opts.noticeCC] - 通知抄送人,多个用逗号隔开.  optional\n      * @param {} [opts.noticeContent] - 通知正文.  optional\n      * @param {} [opts.noticePeriod] - 通知周期,取值[daily,weekly,monthly].  optional\n      * @param {} [opts.noticeStatus] - 通知状态，取值[init,start,stop]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  configServiceNotice (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      postBody['id'] = opts.id\n    }\n    if (opts.noticeType !== undefined && opts.noticeType !== null) {\n      postBody['noticeType'] = opts.noticeType\n    }\n    if (opts.noticeWay !== undefined && opts.noticeWay !== null) {\n      postBody['noticeWay'] = opts.noticeWay\n    }\n    if (opts.noticeTo !== undefined && opts.noticeTo !== null) {\n      postBody['noticeTo'] = opts.noticeTo\n    }\n    if (opts.noticeCC !== undefined && opts.noticeCC !== null) {\n      postBody['noticeCC'] = opts.noticeCC\n    }\n    if (opts.noticeContent !== undefined && opts.noticeContent !== null) {\n      postBody['noticeContent'] = opts.noticeContent\n    }\n    if (opts.noticePeriod !== undefined && opts.noticePeriod !== null) {\n      postBody['noticePeriod'] = opts.noticePeriod\n    }\n    if (opts.noticeStatus !== undefined && opts.noticeStatus !== null) {\n      postBody['noticeStatus'] = opts.noticeStatus\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call configServiceNotice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/serviceNotice:config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户服务通知接口\n      * @param {Object} opts - parameters\n      * @param {string} [opts.noticeType] - 通知类型,取值[reportForm],reportForm:报表.  optional\n      * @param {string} [opts.noticeWay] - 通知方式,取值[mail],mail:邮件.  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param serviceNoticeItem notices\n      */\n\n  queryServiceNotice (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.noticeType !== undefined && opts.noticeType !== null) {\n      queryParams['noticeType'] = opts.noticeType\n    }\n    if (opts.noticeWay !== undefined && opts.noticeWay !== null) {\n      queryParams['noticeWay'] = opts.noticeWay\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryServiceNotice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/serviceNotice',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看证书列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 第几页，从1开始计数  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数目  optional\n      * @param {string} [opts.domain] - 域名，支持按照域名检索证书  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param sslCertModel certList\n      * @param integer totalCount  总数量\n      */\n\n  getSslCertList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      queryParams['domain'] = opts.domain\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSslCertList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/sslCert',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看证书详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.sslCertId - 证书 Id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param sslCertModelDetail sslCertModelDetail\n      */\n\n  getSslCertDetail (opts, callback) {\n    opts = opts || {}\n\n    if (opts.sslCertId === undefined || opts.sslCertId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sslCertId' when calling getSslCertDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      sslCertId: opts.sslCertId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSslCertDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/sslCert/{sslCertId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上传证书\n      * @param {Object} opts - parameters\n      * @param {string} opts.certName - 证书名称\n      * @param {string} opts.keyFile - 私钥\n      * @param {string} opts.certFile - 证书\n      * @param {string} [opts.aliasName] - 证书别名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string certId\n      * @param string digest  对私钥文件使用sha256算法计算的摘要信息\n      */\n\n  uploadCert (opts, callback) {\n    opts = opts || {}\n\n    if (opts.certName === undefined || opts.certName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certName' when calling uploadCert\"\n      )\n    }\n    if (opts.keyFile === undefined || opts.keyFile === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyFile' when calling uploadCert\"\n      )\n    }\n    if (opts.certFile === undefined || opts.certFile === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certFile' when calling uploadCert\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.certName !== undefined && opts.certName !== null) {\n      postBody['certName'] = opts.certName\n    }\n    if (opts.keyFile !== undefined && opts.keyFile !== null) {\n      postBody['keyFile'] = opts.keyFile\n    }\n    if (opts.certFile !== undefined && opts.certFile !== null) {\n      postBody['certFile'] = opts.certFile\n    }\n    if (opts.aliasName !== undefined && opts.aliasName !== null) {\n      postBody['aliasName'] = opts.aliasName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call uploadCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/sslCert:upload',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询统计数据，仅可查询中国境内的相关信息\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.fields] - 需要查询的字段  optional\n      * @param {} [opts.area] - 查询的区域，如beijing,shanghai。多个用逗号分隔  optional\n      * @param {} [opts.isp] - 查询的运营商，cmcc,cnc,ct，表示移动、联通、电信。多个用逗号分隔  optional\n      * @param {} [opts.period] - 时间粒度，可选值:[oneMin,fiveMin,followTime],followTime只会返回一个汇总后的数据  optional\n      * @param {} [opts.scheme] - 查询协议，可选值:[http,https,all],传空默认返回全部协议汇总后的数据  optional\n      * @param {} [opts.cacheType] - 查询节点层级，可选值:[all,edge,mid],默认查询all,edge边缘 mid中间  optional\n      * @param {} [opts.ipType] - 查询IP类型，可选值:[,ipv4,ipv6],默认查询all  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime\n      * @param string endTime\n      * @param string domain\n      * @param statisticsDataItem statistics\n      */\n\n  queryMixStatisticsData (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.fields !== undefined && opts.fields !== null) {\n      postBody['fields'] = opts.fields\n    }\n    if (opts.area !== undefined && opts.area !== null) {\n      postBody['area'] = opts.area\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.scheme !== undefined && opts.scheme !== null) {\n      postBody['scheme'] = opts.scheme\n    }\n    if (opts.cacheType !== undefined && opts.cacheType !== null) {\n      postBody['cacheType'] = opts.cacheType\n    }\n    if (opts.ipType !== undefined && opts.ipType !== null) {\n      postBody['ipType'] = opts.ipType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryMixStatisticsData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/statistics',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  分地区及运营商查询统计数据，仅可查询中国境内的相关信息\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.fields] - 需要查询的字段  optional\n      * @param {} [opts.area] - 查询的区域，如beijing,shanghai。多个用逗号分隔  optional\n      * @param {} [opts.isp] - 查询的运营商，cmcc,cnc,ct，表示移动、联通、电信。多个用逗号分隔  optional\n      * @param {} [opts.period] - 时间粒度，可选值:[oneMin,fiveMin,followTime],followTime只会返回一个汇总后的数据  optional\n      * @param {} [opts.cacheType] - 查询节点层级，可选值:[all,edge,mid],默认查询all,edge边缘 mid中间  optional\n      * @param {} [opts.ipType] - 查询IP类型，可选值:[,ipv4,ipv6],默认查询all  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime\n      * @param string endTime\n      * @param string domain\n      * @param statisticsWithAreaGroupDetail statistics\n      */\n\n  queryMixStatisticsWithAreaData (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.fields !== undefined && opts.fields !== null) {\n      postBody['fields'] = opts.fields\n    }\n    if (opts.area !== undefined && opts.area !== null) {\n      postBody['area'] = opts.area\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.cacheType !== undefined && opts.cacheType !== null) {\n      postBody['cacheType'] = opts.cacheType\n    }\n    if (opts.ipType !== undefined && opts.ipType !== null) {\n      postBody['ipType'] = opts.ipType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryMixStatisticsWithAreaData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/statistics:groupByArea',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询统计数据并进行汇总加和，仅可查询中国境内的相关信息\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.fields] - 需要查询的字段  optional\n      * @param {} [opts.area] - 查询的区域，如beijing,shanghai。多个用逗号分隔  optional\n      * @param {} [opts.isp] - 查询的运营商，cmcc,cnc,ct，表示移动、联通、电信。多个用逗号分隔  optional\n      * @param {} [opts.period] - 时间粒度，可选值:[oneMin,fiveMin,followTime],followTime只会返回一个汇总后的数据  optional\n      * @param {} [opts.groupBy] - 分组依据,只能按域名[domain]分组  optional\n      * @param {} [opts.cacheType] - 查询节点层级，可选值:[all,edge,mid],默认查询all,edge边缘 mid中间  optional\n      * @param {} [opts.ipType] - 查询IP类型，可选值:[,ipv4,ipv6],默认查询all  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime\n      * @param string endTime\n      * @param string domain\n      * @param statisticsGroupSumDataItem statistics\n      */\n\n  queryMixTrafficGroupSum (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.fields !== undefined && opts.fields !== null) {\n      postBody['fields'] = opts.fields\n    }\n    if (opts.area !== undefined && opts.area !== null) {\n      postBody['area'] = opts.area\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.groupBy !== undefined && opts.groupBy !== null) {\n      postBody['groupBy'] = opts.groupBy\n    }\n    if (opts.cacheType !== undefined && opts.cacheType !== null) {\n      postBody['cacheType'] = opts.cacheType\n    }\n    if (opts.ipType !== undefined && opts.ipType !== null) {\n      postBody['ipType'] = opts.ipType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryMixTrafficGroupSum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/statistics:groupSum',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询统计数据\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.subDomain] - 查询泛域名时，指定的子域名列表，多个用逗号分隔。非泛域名时，传入空即可  optional\n      * @param {} [opts.fields] - 需要查询的字段  optional\n      * @param {} [opts.area] - 查询的区域，如beijing,shanghai。多个用逗号分隔  optional\n      * @param {} [opts.isp] - 查询的运营商，cmcc,cnc,ct，表示移动、联通、电信。多个用逗号分隔  optional\n      * @param {} [opts.origin] - 是否查询回源统计信息。取值为true和false，默认为false。注意，如果查询回源信息，Fields的取值当前只支持oribandwidth，oripv，oricodestat三个，其余Fields忽略。  optional\n      * @param {} [opts.period] - 时间粒度，可选值:[oneMin,fiveMin,followTime],followTime只会返回一个汇总后的数据  optional\n      * @param {} [opts.abroad] - true 代表查询境外数据，默认false查询境内数据  optional\n      * @param {} [opts.cacheType] - 查询节点层级，可选值:[all,edge,mid],默认查询all,edge边缘 mid中间  optional\n      * @param {} [opts.ipType] - 查询IP类型，可选值:[,ipv4,ipv6],默认查询all  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime\n      * @param string endTime\n      * @param string domain\n      * @param statisticsDataItem statistics\n      */\n\n  queryStatisticsData (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.subDomain !== undefined && opts.subDomain !== null) {\n      postBody['subDomain'] = opts.subDomain\n    }\n    if (opts.fields !== undefined && opts.fields !== null) {\n      postBody['fields'] = opts.fields\n    }\n    if (opts.area !== undefined && opts.area !== null) {\n      postBody['area'] = opts.area\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.origin !== undefined && opts.origin !== null) {\n      postBody['origin'] = opts.origin\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.abroad !== undefined && opts.abroad !== null) {\n      postBody['abroad'] = opts.abroad\n    }\n    if (opts.cacheType !== undefined && opts.cacheType !== null) {\n      postBody['cacheType'] = opts.cacheType\n    }\n    if (opts.ipType !== undefined && opts.ipType !== null) {\n      postBody['ipType'] = opts.ipType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryStatisticsData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/vodStatistics',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  分地区及运营商查询统计数据\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.subDomain] - 查询泛域名时，指定的子域名列表，多个用逗号分隔。非泛域名时，传入空即可  optional\n      * @param {} [opts.fields] - 需要查询的字段  optional\n      * @param {} [opts.area] - 查询的区域，如beijing,shanghai。多个用逗号分隔  optional\n      * @param {} [opts.isp] - 查询的运营商，cmcc,cnc,ct，表示移动、联通、电信。多个用逗号分隔  optional\n      * @param {} [opts.origin] - 是否查询回源统计信息。取值为true和false，默认为false。注意，如果查询回源信息，Fields的取值当前只支持oribandwidth，oripv，oricodestat三个，其余Fields忽略  optional\n      * @param {} [opts.period] - 时间粒度，可选值:[oneMin,fiveMin,followTime],followTime只会返回一个汇总后的数据  optional\n      * @param {} [opts.groupBy] - 分组依据,可选值：[terminal,sdtfrom],如果为空，则只按area/isp进行group  optional\n      * @param {} [opts.scheme] - 查询协议，可选值:[http,https,all],传空默认返回全部协议汇总后的数据  optional\n      * @param {} [opts.abroad] - true 代表查询境外数据，默认false查询境内数据  optional\n      * @param {} [opts.cacheType] - 查询节点层级，可选值:[all,edge,mid],默认查询all,edge边缘 mid中间  optional\n      * @param {} [opts.ipType] - 查询IP类型，可选值:[,ipv4,ipv6],默认查询all  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime\n      * @param string endTime\n      * @param string domain\n      * @param statisticsWithAreaGroupDetail statistics\n      */\n\n  queryStatisticsDataGroupByArea (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.subDomain !== undefined && opts.subDomain !== null) {\n      postBody['subDomain'] = opts.subDomain\n    }\n    if (opts.fields !== undefined && opts.fields !== null) {\n      postBody['fields'] = opts.fields\n    }\n    if (opts.area !== undefined && opts.area !== null) {\n      postBody['area'] = opts.area\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.origin !== undefined && opts.origin !== null) {\n      postBody['origin'] = opts.origin\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.groupBy !== undefined && opts.groupBy !== null) {\n      postBody['groupBy'] = opts.groupBy\n    }\n    if (opts.scheme !== undefined && opts.scheme !== null) {\n      postBody['scheme'] = opts.scheme\n    }\n    if (opts.abroad !== undefined && opts.abroad !== null) {\n      postBody['abroad'] = opts.abroad\n    }\n    if (opts.cacheType !== undefined && opts.cacheType !== null) {\n      postBody['cacheType'] = opts.cacheType\n    }\n    if (opts.ipType !== undefined && opts.ipType !== null) {\n      postBody['ipType'] = opts.ipType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryStatisticsDataGroupByArea with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/vodStatistics:groupByArea',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询统计数据并进行汇总加和\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.subDomain] - 查询泛域名时，指定的子域名列表，多个用逗号分隔。非泛域名时，传入空即可  optional\n      * @param {} [opts.fields] - 需要查询的字段  optional\n      * @param {} [opts.area] - 查询的区域，如beijing,shanghai。多个用逗号分隔  optional\n      * @param {} [opts.isp] - 查询的运营商，cmcc,cnc,ct，表示移动、联通、电信。多个用逗号分隔  optional\n      * @param {} [opts.origin] - 是否查询回源统计信息。取值为true和false，默认为false。注意，如果查询回源信息，Fields的取值当前只支持oribandwidth，oripv，oricodestat三个，其余Fields忽略。  optional\n      * @param {} [opts.period] - 时间粒度，可选值:[oneMin,fiveMin,followTime],followTime只会返回一个汇总后的数据  optional\n      * @param {} [opts.groupBy] - 分组依据，可选值：[area,isp,domain,scheme]  optional\n      * @param {} [opts.abroad] - true 代表查询境外数据，默认false查询境内数据  optional\n      * @param {} [opts.cacheType] - 查询节点层级，可选值:[all,edge,mid],默认查询all,edge边缘 mid中间  optional\n      * @param {} [opts.ipType] - 查询IP类型，可选值:[,ipv4,ipv6],默认查询all  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime\n      * @param string endTime\n      * @param string domain\n      * @param statisticsGroupSumDataItem statistics\n      */\n\n  queryStatisticsDataGroupSum (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.subDomain !== undefined && opts.subDomain !== null) {\n      postBody['subDomain'] = opts.subDomain\n    }\n    if (opts.fields !== undefined && opts.fields !== null) {\n      postBody['fields'] = opts.fields\n    }\n    if (opts.area !== undefined && opts.area !== null) {\n      postBody['area'] = opts.area\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.origin !== undefined && opts.origin !== null) {\n      postBody['origin'] = opts.origin\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.groupBy !== undefined && opts.groupBy !== null) {\n      postBody['groupBy'] = opts.groupBy\n    }\n    if (opts.abroad !== undefined && opts.abroad !== null) {\n      postBody['abroad'] = opts.abroad\n    }\n    if (opts.cacheType !== undefined && opts.cacheType !== null) {\n      postBody['cacheType'] = opts.cacheType\n    }\n    if (opts.ipType !== undefined && opts.ipType !== null) {\n      postBody['ipType'] = opts.ipType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryStatisticsDataGroupSum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/vodStatistics:groupSum',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询统计数据\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.appName] - app名,查询的App名称，多个用逗号分隔。注意，传如多个AppName时，表示查询这些AppName的和值，即“或”的关系。默认为空，表示查询所有App  optional\n      * @param {} [opts.streamName] - 流名,查询的流名称，多个用逗号分隔。注意，传如多个StreamName时，表示查询这些StreamName的和值，即“或”的关系。默认为空，表示查询所有Stream  optional\n      * @param {} [opts.subDomain] - 子域名,查询泛域名时，指定的子域名列表，多个用逗号分隔。非泛域名时，传入空即可  optional\n      * @param {} [opts.fields] - 需要查询的字段  optional\n      * @param {} [opts.area] - 查询的区域，如beijing,shanghai。多个用逗号分隔  optional\n      * @param {} [opts.isp] - 查询的运营商，cmcc,cnc,ct，表示移动、联通、电信。多个用逗号分隔  optional\n      * @param {} [opts.reqMethod] - 当前取值范围(&quot;GET,HEAD,forward,forward-hls,ingest,play,publish,detour-ingest,Forward-Origin&quot;)  optional\n      * @param {} [opts.scheme] - 查询的流协议类型,取值范围：&quot;rtmp,hdl,hls&quot;，多个用逗号分隔，默认为空，表示查询所有协议。  optional\n      * @param {} [opts.cacheLevel] - cacheLevel,可选值：[L1,L2,L3]  optional\n      * @param {} [opts.period] - 时间粒度，可选值:[oneMin,fiveMin,followTime],followTime只会返回一个汇总后的数据  optional\n      * @param {} [opts.cacheType] - 查询节点层级，可选值:[all,edge,mid],默认查询all,edge边缘 mid中间  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime\n      * @param string endTime\n      * @param string domain\n      * @param statisticsDataItem statistics\n      */\n\n  queryLiveStatisticsData (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      postBody['streamName'] = opts.streamName\n    }\n    if (opts.subDomain !== undefined && opts.subDomain !== null) {\n      postBody['subDomain'] = opts.subDomain\n    }\n    if (opts.fields !== undefined && opts.fields !== null) {\n      postBody['fields'] = opts.fields\n    }\n    if (opts.area !== undefined && opts.area !== null) {\n      postBody['area'] = opts.area\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.reqMethod !== undefined && opts.reqMethod !== null) {\n      postBody['reqMethod'] = opts.reqMethod\n    }\n    if (opts.scheme !== undefined && opts.scheme !== null) {\n      postBody['scheme'] = opts.scheme\n    }\n    if (opts.cacheLevel !== undefined && opts.cacheLevel !== null) {\n      postBody['cacheLevel'] = opts.cacheLevel\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.cacheType !== undefined && opts.cacheType !== null) {\n      postBody['cacheType'] = opts.cacheType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryLiveStatisticsData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveStatistics',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  分地区及运营商查询统计数据\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.appName] - 查询的App名称，多个用逗号分隔。  optional\n      * @param {} [opts.fields] - 需要查询的字段  optional\n      * @param {} [opts.area] - 查询的区域，如beijing,shanghai。多个用逗号分隔  optional\n      * @param {} [opts.isp] - 查询的运营商，cmcc,cnc,ct，表示移动、联通、电信。多个用逗号分隔  optional\n      * @param {} [opts.streamName] - 查询的流名称，多个用逗号分隔。  optional\n      * @param {} [opts.period] - 时间粒度，可选值:[oneMin,fiveMin,followTime],followTime只会返回一个汇总后的数据  optional\n      * @param {} [opts.groupBy] - 分组依据,可选值：[appname,streamname]，如果为空，则只按area/isp进行group。  optional\n      * @param {} [opts.subDomain] - 查询泛域名时，指定的子域名列表，多个用逗号分隔。非泛域名时，传入空即可  optional\n      * @param {} [opts.scheme] - 查询的流协议，取值范围：&quot;rtmp,hdl,hls&quot;，多个用逗号分隔，默认为空，表示查询所有协议。  optional\n      * @param {} [opts.reqMethod] - 当前取值范围(&quot;GET,HEAD,forward,forward-hls,ingest,play,publish,detour-ingest,Forward-Origin&quot;)  optional\n      * @param {} [opts.cacheLevel] - cacheLevel，可选值：[L1,L2,L3]  optional\n      * @param {} [opts.cacheType] - 查询节点层级，可选值:[all,edge,mid],默认查询all,edge边缘 mid中间  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime\n      * @param string endTime\n      * @param string domain\n      * @param statisticsWithAreaGroupDetail statistics\n      */\n\n  queryLiveStatisticsAreaDataGroupBy (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.fields !== undefined && opts.fields !== null) {\n      postBody['fields'] = opts.fields\n    }\n    if (opts.area !== undefined && opts.area !== null) {\n      postBody['area'] = opts.area\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      postBody['streamName'] = opts.streamName\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.groupBy !== undefined && opts.groupBy !== null) {\n      postBody['groupBy'] = opts.groupBy\n    }\n    if (opts.subDomain !== undefined && opts.subDomain !== null) {\n      postBody['subDomain'] = opts.subDomain\n    }\n    if (opts.scheme !== undefined && opts.scheme !== null) {\n      postBody['scheme'] = opts.scheme\n    }\n    if (opts.reqMethod !== undefined && opts.reqMethod !== null) {\n      postBody['reqMethod'] = opts.reqMethod\n    }\n    if (opts.cacheLevel !== undefined && opts.cacheLevel !== null) {\n      postBody['cacheLevel'] = opts.cacheLevel\n    }\n    if (opts.cacheType !== undefined && opts.cacheType !== null) {\n      postBody['cacheType'] = opts.cacheType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryLiveStatisticsAreaDataGroupBy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveStatistics:groupByArea',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询统计数据并进行汇总加和\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.subDomain] - 查询泛域名时，指定的子域名列表，多个用逗号分隔。非泛域名时，传入空即可  optional\n      * @param {} [opts.appName] - 查询的App名称，多个用逗号分隔。  optional\n      * @param {} [opts.streamName] - 查询的流名称，多个用逗号分隔。  optional\n      * @param {} [opts.fields] - 需要查询的字段  optional\n      * @param {} [opts.area] - 查询的区域，如beijing,shanghai。多个用逗号分隔  optional\n      * @param {} [opts.isp] - 查询的运营商，cmcc,cnc,ct，表示移动、联通、电信。多个用逗号分隔  optional\n      * @param {} [opts.scheme] - 查询的流协议，取值范围：&quot;rtmp,hdl,hls&quot;，多个用逗号分隔，默认为空，表示查询所有协议。  optional\n      * @param {} [opts.period] - 时间粒度，可选值:[oneMin,fiveMin,followTime],followTime只会返回一个汇总后的数据  optional\n      * @param {} [opts.groupBy] - 分组依据，可选值：[appname,streamname,domain,area,isp,scheme]  optional\n      * @param {} [opts.reqMethod] - 当前取值范围(&quot;GET,HEAD,forward,forward-hls,ingest,play,publish,detour-ingest,Forward-Origin&quot;)  optional\n      * @param {} [opts.cacheLevel] - cacheLevel，可选值：[L1,L2,L3]  optional\n      * @param {} [opts.cacheType] - 查询节点层级，可选值:[all,edge,mid],默认查询all,edge边缘 mid中间  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime\n      * @param string endTime\n      * @param string domain\n      * @param statisticsGroupSumDataItem statistics\n      */\n\n  queryLiveTrafficGroupSum (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.subDomain !== undefined && opts.subDomain !== null) {\n      postBody['subDomain'] = opts.subDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      postBody['streamName'] = opts.streamName\n    }\n    if (opts.fields !== undefined && opts.fields !== null) {\n      postBody['fields'] = opts.fields\n    }\n    if (opts.area !== undefined && opts.area !== null) {\n      postBody['area'] = opts.area\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.scheme !== undefined && opts.scheme !== null) {\n      postBody['scheme'] = opts.scheme\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.groupBy !== undefined && opts.groupBy !== null) {\n      postBody['groupBy'] = opts.groupBy\n    }\n    if (opts.reqMethod !== undefined && opts.reqMethod !== null) {\n      postBody['reqMethod'] = opts.reqMethod\n    }\n    if (opts.cacheLevel !== undefined && opts.cacheLevel !== null) {\n      postBody['cacheLevel'] = opts.cacheLevel\n    }\n    if (opts.cacheType !== undefined && opts.cacheType !== null) {\n      postBody['cacheType'] = opts.cacheType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryLiveTrafficGroupSum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveStatistics:groupSum',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询TOP IP，仅可查询中国境内的相关信息\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.subDomain] - 待查询的子域名,查询泛域名时，指定的子域名列表，多个用逗号分隔。非泛域名时，传入空即可  optional\n      * @param {} [opts.size] - 查询的topN的条数，取值范围：1-100，默认为20  optional\n      * @param {} [opts.topBy] - 排序依据,当前可选：pv,flow, 分别表示按pv、按流量topN ip，默认为&quot;pv&quot;  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime\n      * @param string endTime\n      * @param string domain\n      * @param statisticsTopIpData ipData\n      */\n\n  queryStatisticsTopIp (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.subDomain !== undefined && opts.subDomain !== null) {\n      postBody['subDomain'] = opts.subDomain\n    }\n    if (opts.size !== undefined && opts.size !== null) {\n      postBody['size'] = opts.size\n    }\n    if (opts.topBy !== undefined && opts.topBy !== null) {\n      postBody['topBy'] = opts.topBy\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryStatisticsTopIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/statistics:topIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询TOP Url，仅可查询中国境内的相关信息\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.subDomain] - 待查询的子域名,查询泛域名时，指定的子域名列表，多个用逗号分隔。非泛域名时，传入空即可  optional\n      * @param {} [opts.size] - 查询的topN的条数，取值范围：1-100，默认为20  optional\n      * @param {} [opts.topBy] - 排序依据,当前可选：pv,flow，bandwidth, 分别表示按pv、按流量、按带宽topN url，默认为&quot;pv&quot;  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime\n      * @param string endTime\n      * @param string domain\n      * @param statisticsTopUrlData urlData\n      */\n\n  queryStatisticsTopUrl (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.subDomain !== undefined && opts.subDomain !== null) {\n      postBody['subDomain'] = opts.subDomain\n    }\n    if (opts.size !== undefined && opts.size !== null) {\n      postBody['size'] = opts.size\n    }\n    if (opts.topBy !== undefined && opts.topBy !== null) {\n      postBody['topBy'] = opts.topBy\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryStatisticsTopUrl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/statistics:topUrl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询目录带宽，仅有部分用户支持该功能\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名，该接口仅支持单域名查询  optional\n      * @param {} [opts.dirs] - 需要过滤的目录  optional\n      * @param {} [opts.regions] - 需要过滤的地区  optional\n      * @param {} [opts.cacheType] - 查询节点层级，可选值:[all,edge,mid],默认查询all,edge边缘 mid中间  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain\n      * @param dirBandwidthItem datas\n      */\n\n  queryDirBandwidth (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.dirs !== undefined && opts.dirs !== null) {\n      postBody['dirs'] = opts.dirs\n    }\n    if (opts.regions !== undefined && opts.regions !== null) {\n      postBody['regions'] = opts.regions\n    }\n    if (opts.cacheType !== undefined && opts.cacheType !== null) {\n      postBody['cacheType'] = opts.cacheType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDirBandwidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/statistics:queryDirBandwidth',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询目录基础统计数据，仅有部分用户支持该功能\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名，该接口仅支持单域名查询  optional\n      * @param {} [opts.dirs] - 需要过滤的目录  optional\n      * @param {} [opts.cacheType] - 查询节点层级，可选值:[all,edge,mid],默认查询all,edge边缘 mid中间  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain\n      * @param dirStatsItem datas\n      */\n\n  queryDirStatsData (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.dirs !== undefined && opts.dirs !== null) {\n      postBody['dirs'] = opts.dirs\n    }\n    if (opts.cacheType !== undefined && opts.cacheType !== null) {\n      postBody['cacheType'] = opts.cacheType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDirStatsData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/statistics:queryDirStatsData',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询定制的目录带宽，仅有部分用户支持该功能\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2020-12-07T16:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2020-12-07T16:20:00Z，开始时间和结束时间跨度 不能超过4个小时  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名，该接口仅支持单域名查询  optional\n      * @param {} [opts.dir] - 需要过滤的目录，以正斜线(/)开头，不填表示查询所有目录。查询目录同时需要以正斜线(/)结尾。 如:/path1/path2/path3/  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain\n      * @param flowItem data\n      */\n\n  queryCustomizedDirBandWidth (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.dir !== undefined && opts.dir !== null) {\n      postBody['dir'] = opts.dir\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryCustomizedDirBandWidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/statistics:queryCustomizedDirBandWidth',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  分页查询直播流数据接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.appName] - app名  optional\n      * @param {} [opts.streamName] - 流名  optional\n      * @param {} [opts.pageNum] - 页码，不传默认1  optional\n      * @param {} [opts.pageSize] - 页size,不传默认100,最大值1000  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total\n      * @param integer pageNum\n      * @param integer pageSize\n      * @param statisticsLiveStreamInfo streamInfoList\n      */\n\n  queryStreamInfo (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryStreamInfo\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      postBody['streamName'] = opts.streamName\n    }\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      postBody['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryStreamInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/liveStatistics:streamInfo',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询平均带宽\n      * @param {Object} opts - parameters\n      * @param {string} opts.starttime - 指定查询开始时间(格式:201906011000)，返回数据包含该时间点。\n      * @param {string} opts.stoptime - 指定查询结束时间(格式:201906011100)，返回数据不包含该时间点\n      * @param {string} [opts.clientid] - 按照设备ID查询设备带宽。  optional\n      * @param {integer} [opts.page] - 用于支持分页查询，默认为1，表示第几页。  optional\n      * @param {integer} [opts.size] - 用于支持分页查询，表示每页返回多少条数据，默认每页返回10条数据，size必须是10的整数倍，并且最大值是100。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param page page  分页信息\n      * @param queryAvgBandwidthGroup data\n      */\n\n  queryAvgBandwidthForPCdn (opts, callback) {\n    opts = opts || {}\n\n    if (opts.starttime === undefined || opts.starttime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.starttime' when calling queryAvgBandwidthForPCdn\"\n      )\n    }\n    if (opts.stoptime === undefined || opts.stoptime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stoptime' when calling queryAvgBandwidthForPCdn\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.starttime !== undefined && opts.starttime !== null) {\n      queryParams['starttime'] = opts.starttime\n    }\n    if (opts.stoptime !== undefined && opts.stoptime !== null) {\n      queryParams['stoptime'] = opts.stoptime\n    }\n    if (opts.clientid !== undefined && opts.clientid !== null) {\n      queryParams['clientid'] = opts.clientid\n    }\n    if (opts.page !== undefined && opts.page !== null) {\n      queryParams['page'] = opts.page\n    }\n    if (opts.size !== undefined && opts.size !== null) {\n      queryParams['size'] = opts.size\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryAvgBandwidthForPCdn with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/pcdn:queryAvgBandwidth',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询设备状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.macAddr - 查询dev的mac地址（如DCD87C047117）\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string macAddress  mac地址\n      * @param integer activeConnNum  活跃链接数量\n      * @param string startupTime  启动时间\n      * @param string cacheFree  指定缓存剩余空间，单位GB，float64，保留小数点后两位\n      * @param string diskFree  设备磁盘剩余空间，单位GB，float64，保留小数点后两位\n      * @param number cpuIdle  cpu idle百分比，float64，保留小数点后两位\n      * @param integer port  nginx对外访问端口\n      * @param number memFreePercent  内存剩余百分比， float64，保留小数点后两位\n      * @param string devId  内容管理中为设备分配的设备id\n      * @param string remoteIp  设备外网地址\n      * @param string region  设备所属区域，如huadong、huanan\n      * @param string isp  设备所属运营商，如ct、uni、cm\n      * @param string report  设备最近心跳上报\n      */\n\n  queryDeviceStatusForPCdn (opts, callback) {\n    opts = opts || {}\n\n    if (opts.macAddr === undefined || opts.macAddr === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.macAddr' when calling queryDeviceStatusForPCdn\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.macAddr !== undefined && opts.macAddr !== null) {\n      queryParams['macAddr'] = opts.macAddr\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDeviceStatusForPCdn with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/pcdn:queryDeviceStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  无线宝按条件查询的统计接口\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,时间戳  optional\n      * @param {} [opts.endTime] - 查询截止时间,时间戳  optional\n      * @param {} [opts.fields] - 查询的字段，取值范围(avgbandwidth,pv,flow)。多个用逗号分隔。默认为空，表示查询带宽流量  optional\n      * @param {} [opts.area]   optional\n      * @param {} [opts.isp]   optional\n      * @param {} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin”，分别表示1min，5min。默认为空，表示fiveMin  optional\n      * @param {} [opts.category] - 业务类型  optional\n      * @param {} [opts.macAddr] - 设备id  optional\n      * @param {} [opts.pluginPin] - 插件pin  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime  2020/07/30 10:30，查询起始时间\n      * @param string endTime  2020/07/30 11:00，查询截止时间\n      * @param statisticsDataItem statistics\n      */\n\n  queryJDBoxStatisticsData (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.fields !== undefined && opts.fields !== null) {\n      postBody['fields'] = opts.fields\n    }\n    if (opts.area !== undefined && opts.area !== null) {\n      postBody['area'] = opts.area\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.category !== undefined && opts.category !== null) {\n      postBody['category'] = opts.category\n    }\n    if (opts.macAddr !== undefined && opts.macAddr !== null) {\n      postBody['macAddr'] = opts.macAddr\n    }\n    if (opts.pluginPin !== undefined && opts.pluginPin !== null) {\n      postBody['pluginPin'] = opts.pluginPin\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryJDBoxStatisticsData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/jdBoxStatistics',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  无线宝按group查询的统计接口\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,时间戳  optional\n      * @param {} [opts.endTime] - 查询截止时间,时间戳  optional\n      * @param {} [opts.groupBy] - 取值范围：area，isp，pin ,mac_addr，category，多个用,隔开,多个维度的查询，必须要限制较短的时间间隔  optional\n      * @param {} [opts.fields] - 查询的字段，取值范围(avgbandwidth,pv,flow)。多个用逗号分隔。默认为空，表示查询带宽流量  optional\n      * @param {} [opts.area] - 区域  optional\n      * @param {} [opts.isp] - 运营商  optional\n      * @param {} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin”，分别表示1min，5min。默认为空，表示fiveMin  optional\n      * @param {} [opts.category] - 业务类型  optional\n      * @param {} [opts.macAddr] - 设备id  optional\n      * @param {} [opts.pluginPin] - 插件pin  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime  2021/01/19 10:30，查询起始时间\n      * @param string endTime  2021/01/19 11:00，查询截止时间\n      * @param statisticsDataItem statistics\n      */\n\n  queryJDBoxStatisticsDataWithGroup (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.groupBy !== undefined && opts.groupBy !== null) {\n      postBody['groupBy'] = opts.groupBy\n    }\n    if (opts.fields !== undefined && opts.fields !== null) {\n      postBody['fields'] = opts.fields\n    }\n    if (opts.area !== undefined && opts.area !== null) {\n      postBody['area'] = opts.area\n    }\n    if (opts.isp !== undefined && opts.isp !== null) {\n      postBody['isp'] = opts.isp\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.category !== undefined && opts.category !== null) {\n      postBody['category'] = opts.category\n    }\n    if (opts.macAddr !== undefined && opts.macAddr !== null) {\n      postBody['macAddr'] = opts.macAddr\n    }\n    if (opts.pluginPin !== undefined && opts.pluginPin !== null) {\n      postBody['pluginPin'] = opts.pluginPin\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryJDBoxStatisticsDataWithGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/jdBoxStatisticsWithGroup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询平均带宽\n      * @param {Object} opts - parameters\n      * @param {string} opts.starttime - 指定查询开始时间(格式:201906011000)，返回数据包含该时间点。\n      * @param {string} opts.stoptime - 指定查询结束时间(格式:201906011100)，返回数据不包含该时间点\n      * @param {string} opts.pluginPin - 插件pin,多个用,隔开\n      * @param {string} [opts.clientid] - 按照设备ID查询设备带宽,即macaddr,多个用,隔开  optional\n      * @param {integer} [opts.page] - 用于支持分页查询，默认为1，表示第几页。  optional\n      * @param {integer} [opts.size] - 用于支持分页查询，表示每页返回多少条数据，默认每页返回10条数据，size必须是10的整数倍，并且最大值是100。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param page page  分页信息\n      * @param queryAvgBandwidthGroup data\n      */\n\n  queryJBoxAvgBandwidth (opts, callback) {\n    opts = opts || {}\n\n    if (opts.starttime === undefined || opts.starttime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.starttime' when calling queryJBoxAvgBandwidth\"\n      )\n    }\n    if (opts.stoptime === undefined || opts.stoptime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stoptime' when calling queryJBoxAvgBandwidth\"\n      )\n    }\n    if (opts.pluginPin === undefined || opts.pluginPin === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pluginPin' when calling queryJBoxAvgBandwidth\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.starttime !== undefined && opts.starttime !== null) {\n      queryParams['starttime'] = opts.starttime\n    }\n    if (opts.stoptime !== undefined && opts.stoptime !== null) {\n      queryParams['stoptime'] = opts.stoptime\n    }\n    if (opts.pluginPin !== undefined && opts.pluginPin !== null) {\n      queryParams['pluginPin'] = opts.pluginPin\n    }\n    if (opts.clientid !== undefined && opts.clientid !== null) {\n      queryParams['clientid'] = opts.clientid\n    }\n    if (opts.page !== undefined && opts.page !== null) {\n      queryParams['page'] = opts.page\n    }\n    if (opts.size !== undefined && opts.size !== null) {\n      queryParams['size'] = opts.size\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryJBoxAvgBandwidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/jdbox:queryAvgBandwidth',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询WAF总开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string switchStatus  开关状态, on:开启,off:关闭\n      */\n\n  queryWafSwitch (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryWafSwitch\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryWafSwitch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafSwitch',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置WAF总开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.switchStatus] - 开关状态, on:开启,off:关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setWafSwitch (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setWafSwitch\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.switchStatus !== undefined && opts.switchStatus !== null) {\n      postBody['switchStatus'] = opts.switchStatus\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setWafSwitch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafSwitch',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询WAF总开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string switchStatus  开关状态, on:开启,off:关闭\n      */\n\n  queryWafWhiteRuleSwitch (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryWafWhiteRuleSwitch\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryWafWhiteRuleSwitch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafWhiteRuleSwitch',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置WAF白名单开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.switchStatus] - 开关状态, on:开启,off:关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setWafWhiteRuleSwitch (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setWafWhiteRuleSwitch\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.switchStatus !== undefined && opts.switchStatus !== null) {\n      postBody['switchStatus'] = opts.switchStatus\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setWafWhiteRuleSwitch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafWhiteRuleSwitch',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询WAF白名单规则列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} opts.ruleType - ruleType, valid values [ip, geo, uri]\n      * @param {string} [opts.id] - ruleId, defalut empty  optional\n      * @param {integer} [opts.pageSize] - page size , default 0 to query all  optional\n      * @param {integer} [opts.pageIndex] - page index , default 0 to query all  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param wafWhiteRuleModel rules\n      */\n\n  querywafWhiteRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling querywafWhiteRules\"\n      )\n    }\n    if (opts.ruleType === undefined || opts.ruleType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleType' when calling querywafWhiteRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      queryParams['ruleType'] = opts.ruleType\n    }\n    if (opts.id !== undefined && opts.id !== null) {\n      queryParams['id'] = opts.id\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call querywafWhiteRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafWhiteRules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新增一条白名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.ruleType] - 白名单类型， uri ip geo  optional\n      * @param {} [opts.matchOp] - 匹配模式,uri类型有效，0&#x3D;完全匹配  1&#x3D;前缀匹配 2&#x3D;包含 3&#x3D;正则 4&#x3D;大于 5&#x3D;后缀  optional\n      * @param {} [opts.val] - 匹配值  optional\n      * @param {} [opts.actions] - 后续处理 &quot;waf&quot; &quot;cc&quot; &quot;deny&quot;自由组合，空表示跳过后续所有阶段  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createWafWhiteRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling createWafWhiteRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      postBody['ruleType'] = opts.ruleType\n    }\n    if (opts.matchOp !== undefined && opts.matchOp !== null) {\n      postBody['matchOp'] = opts.matchOp\n    }\n    if (opts.val !== undefined && opts.val !== null) {\n      postBody['val'] = opts.val\n    }\n    if (opts.actions !== undefined && opts.actions !== null) {\n      postBody['actions'] = opts.actions\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createWafWhiteRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafWhiteRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改指定的白名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} opts.id - 需要修改的白名单ID\n      * @param {} [opts.ruleType] - 白名单类型， uri ip geo  optional\n      * @param {} [opts.matchOp] - 匹配模式,uri类型有效，0&#x3D;完全匹配  1&#x3D;前缀匹配 2&#x3D;包含 3&#x3D;正则 4&#x3D;大于 5&#x3D;后缀  optional\n      * @param {} [opts.val] - 匹配值  optional\n      * @param {} [opts.actions] - 后续处理 &quot;waf&quot; &quot;cc&quot; &quot;deny&quot;自由组合，空表示跳过后续所有阶段  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateWafWhiteRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling updateWafWhiteRule\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling updateWafWhiteRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      postBody['ruleType'] = opts.ruleType\n    }\n    if (opts.matchOp !== undefined && opts.matchOp !== null) {\n      postBody['matchOp'] = opts.matchOp\n    }\n    if (opts.val !== undefined && opts.val !== null) {\n      postBody['val'] = opts.val\n    }\n    if (opts.actions !== undefined && opts.actions !== null) {\n      postBody['actions'] = opts.actions\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateWafWhiteRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafWhiteRule/{id}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用WAF白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.ids]   optional\n      * @param {} [opts.ruleType]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableWafWhiteRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling enableWafWhiteRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ids !== undefined && opts.ids !== null) {\n      postBody['ids'] = opts.ids\n    }\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      postBody['ruleType'] = opts.ruleType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableWafWhiteRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafWhiteRule:enable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用WAF白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.ids]   optional\n      * @param {} [opts.ruleType]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableWafWhiteRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling disableWafWhiteRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ids !== undefined && opts.ids !== null) {\n      postBody['ids'] = opts.ids\n    }\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      postBody['ruleType'] = opts.ruleType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableWafWhiteRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafWhiteRule:disable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除WAF白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} opts.ids\n      * @param {string} opts.ruleType\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteWafWhiteRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling deleteWafWhiteRules\"\n      )\n    }\n    if (opts.ids === undefined || opts.ids === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ids' when calling deleteWafWhiteRules\"\n      )\n    }\n    if (opts.ruleType === undefined || opts.ruleType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleType' when calling deleteWafWhiteRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      queryParams['ruleType'] = opts.ruleType\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain,\n      ids: opts.ids\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteWafWhiteRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafWhiteRule/{ids}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询WAF黑名单开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string switchStatus  开关状态, on:开启,off:关闭\n      */\n\n  queryWafBlackRuleSwitch (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryWafBlackRuleSwitch\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryWafBlackRuleSwitch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafBlackRuleSwitch',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置WAF黑名单开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.switchStatus] - 开关状态, on:开启,off:关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setWafBlackRuleSwitch (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setWafBlackRuleSwitch\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.switchStatus !== undefined && opts.switchStatus !== null) {\n      postBody['switchStatus'] = opts.switchStatus\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setWafBlackRuleSwitch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafBlackRuleSwitch',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询WAF黑名单规则列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} opts.ruleType - ruleType, valid values [ip, geo, uri]\n      * @param {string} [opts.id] - ruleId, defalut empty  optional\n      * @param {integer} [opts.pageSize] - page size , default 0 to query all  optional\n      * @param {integer} [opts.pageIndex] - page index , default 0 to query all  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param wafBlackRuleModel rules\n      */\n\n  querywafBlackRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling querywafBlackRules\"\n      )\n    }\n    if (opts.ruleType === undefined || opts.ruleType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleType' when calling querywafBlackRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      queryParams['ruleType'] = opts.ruleType\n    }\n    if (opts.id !== undefined && opts.id !== null) {\n      queryParams['id'] = opts.id\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call querywafBlackRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafBlackRules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新增一条黑名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.ruleType] - 黑名单类型， uri ip geo  optional\n      * @param {} [opts.matchOp] - 匹配模式,uri类型有效，0&#x3D;完全匹配  1&#x3D;前缀匹配 2&#x3D;包含 3&#x3D;正则 4&#x3D;大于 5&#x3D;后缀  optional\n      * @param {} [opts.val] - 匹配值  optional\n      * @param {} [opts.atOp] - 1：forbidden，493封禁并返回自定义页面 2：redirect，302跳转 3： verify@captcha 4： verify@jscookie  optional\n      * @param {} [opts.atVal] - action为1时为自定义页面名称,空值或缺省值default为默认页面，2时为跳转url，其他时无效  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createWafBlackRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling createWafBlackRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      postBody['ruleType'] = opts.ruleType\n    }\n    if (opts.matchOp !== undefined && opts.matchOp !== null) {\n      postBody['matchOp'] = opts.matchOp\n    }\n    if (opts.val !== undefined && opts.val !== null) {\n      postBody['val'] = opts.val\n    }\n    if (opts.atOp !== undefined && opts.atOp !== null) {\n      postBody['atOp'] = opts.atOp\n    }\n    if (opts.atVal !== undefined && opts.atVal !== null) {\n      postBody['atVal'] = opts.atVal\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createWafBlackRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafBlackRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改指定的黑名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} opts.id - 需要修改的黑名单ID\n      * @param {} [opts.ruleType] - 黑名单类型， uri ip geo  optional\n      * @param {} [opts.matchOp] - 匹配模式,uri类型有效，0&#x3D;完全匹配  1&#x3D;前缀匹配 2&#x3D;包含 3&#x3D;正则 4&#x3D;大于 5&#x3D;后缀  optional\n      * @param {} [opts.val] - 匹配值  optional\n      * @param {} [opts.atOp] - 1：forbidden，493封禁并返回自定义页面 2：redirect，302跳转 3： verify@captcha 4： verify@jscookie  optional\n      * @param {} [opts.atVal] - action为1时为自定义页面名称,空值或缺省值default为默认页面，2时为跳转url，其他时无效  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateWafBlackRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling updateWafBlackRule\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling updateWafBlackRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      postBody['ruleType'] = opts.ruleType\n    }\n    if (opts.matchOp !== undefined && opts.matchOp !== null) {\n      postBody['matchOp'] = opts.matchOp\n    }\n    if (opts.val !== undefined && opts.val !== null) {\n      postBody['val'] = opts.val\n    }\n    if (opts.atOp !== undefined && opts.atOp !== null) {\n      postBody['atOp'] = opts.atOp\n    }\n    if (opts.atVal !== undefined && opts.atVal !== null) {\n      postBody['atVal'] = opts.atVal\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateWafBlackRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafBlackRule/{id}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用WAF黑名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.ids]   optional\n      * @param {} [opts.ruleType]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableWafBlackRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling enableWafBlackRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ids !== undefined && opts.ids !== null) {\n      postBody['ids'] = opts.ids\n    }\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      postBody['ruleType'] = opts.ruleType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableWafBlackRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafBlackRule:enable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用WAF黑名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.ids]   optional\n      * @param {} [opts.ruleType]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableWafBlackRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling disableWafBlackRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ids !== undefined && opts.ids !== null) {\n      postBody['ids'] = opts.ids\n    }\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      postBody['ruleType'] = opts.ruleType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableWafBlackRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafBlackRule:disable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除WAF黑名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} opts.ids\n      * @param {string} opts.ruleType\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteWafBlackRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling deleteWafBlackRules\"\n      )\n    }\n    if (opts.ids === undefined || opts.ids === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ids' when calling deleteWafBlackRules\"\n      )\n    }\n    if (opts.ruleType === undefined || opts.ruleType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleType' when calling deleteWafBlackRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      queryParams['ruleType'] = opts.ruleType\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain,\n      ids: opts.ids\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteWafBlackRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafBlackRule/{ids}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询CC 防护开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string switchStatus  开关状态, on:开启,off:关闭\n      */\n\n  queryCCProtectSwitch (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryCCProtectSwitch\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryCCProtectSwitch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/ccProtectSwitch',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置CC 防护开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.switchStatus] - 开关状态, on:开启,off:关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setCCProtectSwitch (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setCCProtectSwitch\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.switchStatus !== undefined && opts.switchStatus !== null) {\n      postBody['switchStatus'] = opts.switchStatus\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setCCProtectSwitch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/ccProtectSwitch',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询CC防护规则列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} [opts.id] - ruleId, defalut empty  optional\n      * @param {integer} [opts.pageSize] - page size , default 0 to query all  optional\n      * @param {integer} [opts.pageIndex] - page index , default 0 to query all  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param wafCCProtectRuleModel rules\n      */\n\n  queryCCProtectRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryCCProtectRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      queryParams['id'] = opts.id\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryCCProtectRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/ccProtectRules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新增一条CC防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.uri] - null  optional\n      * @param {} [opts.detectPeriod] - null  optional\n      * @param {} [opts.singleIpLimit] - null  optional\n      * @param {} [opts.blockType] - null  optional\n      * @param {} [opts.blockTime] - null  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createCCProtectRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling createCCProtectRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.uri !== undefined && opts.uri !== null) {\n      postBody['uri'] = opts.uri\n    }\n    if (opts.detectPeriod !== undefined && opts.detectPeriod !== null) {\n      postBody['detectPeriod'] = opts.detectPeriod\n    }\n    if (opts.singleIpLimit !== undefined && opts.singleIpLimit !== null) {\n      postBody['singleIpLimit'] = opts.singleIpLimit\n    }\n    if (opts.blockType !== undefined && opts.blockType !== null) {\n      postBody['blockType'] = opts.blockType\n    }\n    if (opts.blockTime !== undefined && opts.blockTime !== null) {\n      postBody['blockTime'] = opts.blockTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCCProtectRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/ccProtectRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改CC防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} opts.id - 需要修改的规则ID\n      * @param {} [opts.uri] - null  optional\n      * @param {} [opts.detectPeriod] - null  optional\n      * @param {} [opts.singleIpLimit] - null  optional\n      * @param {} [opts.blockType] - null  optional\n      * @param {} [opts.blockTime] - null  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateCCProtectRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling updateCCProtectRule\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling updateCCProtectRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.uri !== undefined && opts.uri !== null) {\n      postBody['uri'] = opts.uri\n    }\n    if (opts.detectPeriod !== undefined && opts.detectPeriod !== null) {\n      postBody['detectPeriod'] = opts.detectPeriod\n    }\n    if (opts.singleIpLimit !== undefined && opts.singleIpLimit !== null) {\n      postBody['singleIpLimit'] = opts.singleIpLimit\n    }\n    if (opts.blockType !== undefined && opts.blockType !== null) {\n      postBody['blockType'] = opts.blockType\n    }\n    if (opts.blockTime !== undefined && opts.blockTime !== null) {\n      postBody['blockTime'] = opts.blockTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateCCProtectRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/ccProtectRule/{id}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用CC防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.ids]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableCCProtectRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling enableCCProtectRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ids !== undefined && opts.ids !== null) {\n      postBody['ids'] = opts.ids\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableCCProtectRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/ccProtectRule:enable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用CC防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.ids]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableCCProtectRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling disableCCProtectRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ids !== undefined && opts.ids !== null) {\n      postBody['ids'] = opts.ids\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableCCProtectRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/ccProtectRule:disable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除ccProtectRule\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} opts.ids\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCCProtectRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling deleteCCProtectRule\"\n      )\n    }\n    if (opts.ids === undefined || opts.ids === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ids' when calling deleteCCProtectRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain,\n      ids: opts.ids\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCCProtectRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/ccProtectRule/{ids}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询web防护开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string switchStatus  开关状态, on:开启,off:关闭\n      */\n\n  queryWebProtectSwitch (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryWebProtectSwitch\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryWebProtectSwitch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafWebProtectSwitch',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置web防护开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.switchStatus] - 开关状态, on:开启,off:关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setWebProtectSwitch (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling setWebProtectSwitch\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.switchStatus !== undefined && opts.switchStatus !== null) {\n      postBody['switchStatus'] = opts.switchStatus\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setWebProtectSwitch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafWebProtectSwitch',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询web防护开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string wafMode  0：拦截模式 (阻断forbidden 493跳到自定义页面) ，1-检测模式(观察notice)\n      * @param integer wafLevel  规则策略等级 0为宽松, 1为正常, 2为严格\n      * @param string redirection  拦截模式跳转的自定义页面名称, 缺省或default返回默认页面\n      */\n\n  queryWebProtectSettings (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryWebProtectSettings\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryWebProtectSettings with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafWebProtectSettings',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置web防护开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {} [opts.wafMode] - 0：拦截模式 (阻断forbidden 493跳到自定义页面) ，1-检测模式(观察notice)  optional\n      * @param {} [opts.wafLevel] - 规则策略等级 0为宽松, 1为正常, 2为严格  optional\n      * @param {} [opts.redirection] - 拦截模式跳转的自定义页面名称, 缺省或default返回默认页面  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateWebProtectSettings (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling updateWebProtectSettings\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.wafMode !== undefined && opts.wafMode !== null) {\n      postBody['wafMode'] = opts.wafMode\n    }\n    if (opts.wafLevel !== undefined && opts.wafLevel !== null) {\n      postBody['wafLevel'] = opts.wafLevel\n    }\n    if (opts.redirection !== undefined && opts.redirection !== null) {\n      postBody['redirection'] = opts.redirection\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateWebProtectSettings with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafWebProtectSettings',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询waf地域信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.skipType - skipType, valid values [skip, deny]\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param wafRegionsModel china\n      * @param wafRegionsModel foreign\n      */\n\n  queryWafRegions (opts, callback) {\n    opts = opts || {}\n\n    if (opts.skipType === undefined || opts.skipType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.skipType' when calling queryWafRegions\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.skipType !== undefined && opts.skipType !== null) {\n      queryParams['skipType'] = opts.skipType\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryWafRegions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/wafRegions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询waf ip黑名单配置状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.domain - 用户域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean settingStatus  true or false, true:scdn的黑名单为打开状态，并至少存在一条ruleType&#x3D;ip的黑名单规则且为启用状态\n      */\n\n  queryIpBlackSettingStatus (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domain === undefined || opts.domain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domain' when calling queryIpBlackSettingStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domain: opts.domain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryIpBlackSettingStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domain/{domain}/wafIpBlackSettingStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询攻击来源\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param areaData areaDatas\n      */\n\n  wafQueryPvForAreaAndIp (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call wafQueryPvForAreaAndIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/wafPvForAreaAndIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询总请求量与攻击请求量\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pvItem pvs\n      * @param integer peakAttackPv\n      * @param integer peakTotalPv\n      */\n\n  wafQueryPv (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call wafQueryPv with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/wafPvStatistic',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询攻击记录详情\n      * @param {Object} opts - parameters\n      * @param {} [opts.startTime] - 查询起始时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.endTime] - 查询截止时间,UTC时间，格式为:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，示例:2018-10-21T10:00:00Z  optional\n      * @param {} [opts.domain] - 需要查询的域名, 必须为用户pin下有权限的域名  optional\n      * @param {} [opts.sortField] - 排序字段  optional\n      * @param {} [opts.sortRule] - 排序规则：desc，asc  optional\n      * @param {} [opts.pageNumber] - 页码，从1开始  optional\n      * @param {} [opts.pageSize] - 页大小，默认20  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string total\n      * @param attackDetail attackDetails\n      */\n\n  wafQueryAttackDetails (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      postBody['domain'] = opts.domain\n    }\n    if (opts.sortField !== undefined && opts.sortField !== null) {\n      postBody['sortField'] = opts.sortField\n    }\n    if (opts.sortRule !== undefined && opts.sortRule !== null) {\n      postBody['sortRule'] = opts.sortRule\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cdn/0.10.47'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call wafQueryAttackDetails with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/wafAttackDetails',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = CDN\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/censor/v1/censor.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 站点检测类接口\n * 京东云内容安全-OpenAPI站点检测类接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'censor'\nService._services[serviceId] = true\n\n/**\n * censor service.\n * @version 1.0.3\n */\n\nclass CENSOR extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'censor.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  提交音频异步检测任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.bizType] - 机审策略，eg: default  optional\n      * @param {} [opts.scenes] - 指定检测场景  optional\n      * @param {} [opts.tasks] - 检测任务列表，包含一个或多个元素。每个元素是个结构体，最多可添加10个元素，每个元素的具体结构描述见audioTask。  optional\n      * @param {} [opts.callback] - 异步检测结果回调通知您的URL，支持HTTP/HTTPS。该字段为空时，您必须定时检索检测结果。  optional\n      * @param {} [opts.seed] - 随机字符串，该值用于回调通知请求中的签名。当使用callback时，该字段必须提供。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param taskData data\n      */\n\n  asyncAudioScan (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.scenes !== undefined && opts.scenes !== null) {\n      postBody['scenes'] = opts.scenes\n    }\n    if (opts.tasks !== undefined && opts.tasks !== null) {\n      postBody['tasks'] = opts.tasks\n    }\n    if (opts.callback !== undefined && opts.callback !== null) {\n      postBody['callback'] = opts.callback\n    }\n    if (opts.seed !== undefined && opts.seed !== null) {\n      postBody['seed'] = opts.seed\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call asyncAudioScan with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/audio:asyncscan',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看音频异步检测结果\n      * @param {Object} opts - parameters\n      * @param {array} opts.taskIds\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param audioResult data\n      */\n\n  audioResults (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskIds === undefined || opts.taskIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskIds' when calling audioResults\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskIds !== undefined && opts.taskIds !== null) {\n      postBody['taskIds'] = opts.taskIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call audioResults with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/audio:results',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  提交音频异步检测任务V2\n      * @param {Object} opts - parameters\n      * @param {} [opts.bizType] - 业务bizType，请联系客户经理获取  optional\n      * @param {} [opts.url] - 最大长度512, 语音文件url  optional\n      * @param {} [opts.version] - 最大长度4，接口版本号，可选值 v3.5  optional\n      * @param {} [opts.title] - 最大长度512，文件标题  optional\n      * @param {} [opts.ip] - 最大长度32，用户IP地址  optional\n      * @param {} [opts.account] - 最大长度128，用户唯一标识，如果无需登录则为空  optional\n      * @param {} [opts.deviceId] - 最大长度128，用户设备 id，与设备画像库匹配，明文请转大写传入；MD5加密请明文转大写后MD5计算，再转大写传入，建议抄送  optional\n      * @param {} [opts.deviceType] - 用户设备id的类型，0:其他，10:IMEI，11:AndroidID，12:IDFA，13:IDFV，14:MAC ，20:IMEI_MD5，21:AndroidID_MD5，22:IDFA_MD5，23:IDFV_MD5，24:MAC_MD5  optional\n      * @param {} [opts.callback] - 最大长度2^16-1，数据回调参数，调用方根据业务情况自行设计，当调用离线结果获取接口时，该接口会原样返回该字段，详细见音频离线检测结果获取。作为数据处理标识，因此该字段应该设计为能唯一定位到该次请求的数据结构，如对用户的昵称进行检测，dataId可设为用户标识（用户ID），用户修改多次，每次请求数据的dataId可能一致，但是callback参数可以设计成定位该次请求的数据结构，比如callback字段设计成json，包含dataId和请求的时间戳等信息，当然如果不想做区分，也可以直接把callback设置成dataId的值。  optional\n      * @param {} [opts.callbackUrl] - 最大长度256，离线结果回调通知到客户的URL。主动回调数据接口超时时间设置为2s，为了保证顺利接收数据，需保证接收接口性能稳定并且保证幂等性。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param audioTaskData result\n      */\n\n  asyncAudioScanV2 (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.url !== undefined && opts.url !== null) {\n      postBody['url'] = opts.url\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.ip !== undefined && opts.ip !== null) {\n      postBody['ip'] = opts.ip\n    }\n    if (opts.account !== undefined && opts.account !== null) {\n      postBody['account'] = opts.account\n    }\n    if (opts.deviceId !== undefined && opts.deviceId !== null) {\n      postBody['deviceId'] = opts.deviceId\n    }\n    if (opts.deviceType !== undefined && opts.deviceType !== null) {\n      postBody['deviceType'] = opts.deviceType\n    }\n    if (opts.callback !== undefined && opts.callback !== null) {\n      postBody['callback'] = opts.callback\n    }\n    if (opts.callbackUrl !== undefined && opts.callbackUrl !== null) {\n      postBody['callbackUrl'] = opts.callbackUrl\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call asyncAudioScanV2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/audio:asyncscanv2',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  语音检测结果获取接口，获取离线处理的数据后，下次调用，不会再次返回之前获取过的离线数据。小于10s/20次，请求频率过快服务器会拒绝处理\n      * @param {Object} opts - parameters\n      * @param {} [opts.bizType] - 业务bizType，请联系客户经理获取  optional\n      * @param {} [opts.version] - 接口版本v1  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param audioAntispamResult antispam\n      * @param audioASRResult asr\n      * @param audioLanguageResult language\n      * @param audioVoiceResult voice\n      */\n\n  audioCallbackV2 (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call audioCallbackV2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/audio:callbackv2',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据taskid查询语音检测结果，小于10s/20次，请求频率过快服务器会拒绝处理\n      * @param {Object} opts - parameters\n      * @param {} [opts.bizType] - 业务bizType，请联系客户经理获取  optional\n      * @param {} [opts.version] - 接口版本v1  optional\n      * @param {} [opts.taskIds] - 要查询的taskId  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param audioAntispamResult result\n      */\n\n  audioResultsV2 (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n    if (opts.taskIds !== undefined && opts.taskIds !== null) {\n      postBody['taskIds'] = opts.taskIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call audioResultsV2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/audio:resultsv2',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除敏感库\n      * @param {Object} opts - parameters\n      * @param {string} opts.libId - 敏感库id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCensorLib (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteCensorLib\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.libId === undefined || opts.libId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.libId' when calling deleteCensorLib\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.libId !== undefined && opts.libId !== null) {\n      queryParams['libId'] = opts.libId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCensorLib with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/customCensorLib:custom',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除敏感库Item\n      * @param {Object} opts - parameters\n      * @param {string} opts.libId - 敏感库id\n      * @param {string} opts.itemId - itemId，支持多个，用&#39;,&#39;分隔，表示批量删除\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCensorLibItems (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteCensorLibItems\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.libId === undefined || opts.libId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.libId' when calling deleteCensorLibItems\"\n      )\n    }\n    if (opts.itemId === undefined || opts.itemId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.itemId' when calling deleteCensorLibItems\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.libId !== undefined && opts.libId !== null) {\n      queryParams['libId'] = opts.libId\n    }\n    if (opts.itemId !== undefined && opts.itemId !== null) {\n      queryParams['itemId'] = opts.itemId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCensorLibItems with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/customCensorLib:customItem',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  图片同步检测\n      * @param {Object} opts - parameters\n      * @param {} [opts.bizType] - 机审策略，eg: default  optional\n      * @param {} [opts.scenes] - 指定检测场景  optional\n      * @param {} [opts.tasks] - 检测任务列表，包含一个或多个元素。每个元素是个结构体，最多可添加10个元素，即最多对10段文本进行检测。每个元素的具体结构描述见ImageTask。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageResult data\n      */\n\n  imageScan (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.scenes !== undefined && opts.scenes !== null) {\n      postBody['scenes'] = opts.scenes\n    }\n    if (opts.tasks !== undefined && opts.tasks !== null) {\n      postBody['tasks'] = opts.tasks\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call imageScan with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/image:scan',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  提交图片异步检测任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.bizType] - 机审策略，eg: default  optional\n      * @param {} [opts.scenes] - 指定检测场景  optional\n      * @param {} [opts.tasks] - 检测任务列表，包含一个或多个元素。每个元素是个结构体，最多可添加10个元素，每个元素的具体结构描述见ImageTask。  optional\n      * @param {} [opts.callback] - 异步检测结果回调通知您的URL，支持HTTP/HTTPS。该字段为空时，您必须定时检索检测结果。  optional\n      * @param {} [opts.seed] - 随机字符串，该值用于回调通知请求中的签名。当使用callback时，该字段必须提供。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param taskData data\n      */\n\n  asyncImageScan (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.scenes !== undefined && opts.scenes !== null) {\n      postBody['scenes'] = opts.scenes\n    }\n    if (opts.tasks !== undefined && opts.tasks !== null) {\n      postBody['tasks'] = opts.tasks\n    }\n    if (opts.callback !== undefined && opts.callback !== null) {\n      postBody['callback'] = opts.callback\n    }\n    if (opts.seed !== undefined && opts.seed !== null) {\n      postBody['seed'] = opts.seed\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call asyncImageScan with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/image:asyncscan',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看图片异步检测结果\n      * @param {Object} opts - parameters\n      * @param {array} opts.taskIds\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageResult data\n      */\n\n  imageResults (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskIds === undefined || opts.taskIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskIds' when calling imageResults\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskIds !== undefined && opts.taskIds !== null) {\n      postBody['taskIds'] = opts.taskIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call imageResults with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/image:results',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  图片同步检测v2\n      * @param {Object} opts - parameters\n      * @param {} [opts.images] - 指定检测场景  optional\n      * @param {} [opts.version] - 接口版本v4.1  optional\n      * @param {} [opts.bizType] - 业务bizType，请联系客户经理获取  optional\n      * @param {} [opts.checkLabels] - 接口指定过检分类，可多选，过检分类列表：100：色情，110：性感低俗，200：广告，210：二维码，260：广告法，300：暴恐，400：违禁，500：涉政，800：恶心类，900：其他，1100：涉价值观响应结果  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageAntispamResult antispam\n      * @param oCRResult ocr\n      * @param faceResult face\n      * @param qualityResult quality\n      * @param logoResult logo\n      * @param sceneResult scene\n      */\n\n  imageScanV2 (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.images !== undefined && opts.images !== null) {\n      postBody['images'] = opts.images\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.checkLabels !== undefined && opts.checkLabels !== null) {\n      postBody['checkLabels'] = opts.checkLabels\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call imageScanV2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/image:scanv2',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除限制参数配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.limitId - 限制参数配置id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLimit (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteLimit\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.limitId === undefined || opts.limitId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.limitId' when calling deleteLimit\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.limitId !== undefined && opts.limitId !== null) {\n      queryParams['limitId'] = opts.limitId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLimit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/limit:limit',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  文本同步检测-检测文本中是否包含违规信息\n      * @param {Object} opts - parameters\n      * @param {} [opts.bizType] - 机审策略，eg: default  optional\n      * @param {} [opts.scenes] - 指定检测场景，固定值：antispam  optional\n      * @param {} [opts.tasks] - 检测任务列表，包含一个或多个元素。每个元素是个结构体，最多可添加10个元素，即最多对10段文本进行检测。每个元素的具体结构描述见TextTask。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param textResult data\n      */\n\n  textScan (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.scenes !== undefined && opts.scenes !== null) {\n      postBody['scenes'] = opts.scenes\n    }\n    if (opts.tasks !== undefined && opts.tasks !== null) {\n      postBody['tasks'] = opts.tasks\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call textScan with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/text:scan',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  文本同步检测-检测文本中是否包含违规信息\n      * @param {Object} opts - parameters\n      * @param {} [opts.scenes] - 指定检测场景，固定值：antispam  optional\n      * @param {} [opts.tasks] - 检测任务列表，包含一个或多个元素。每个元素是个结构体，最多可添加10个元素，即最多对10段文本进行检测。每个元素的具体结构描述见TextTask。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param textResult data\n      */\n\n  innerTextScan (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.scenes !== undefined && opts.scenes !== null) {\n      postBody['scenes'] = opts.scenes\n    }\n    if (opts.tasks !== undefined && opts.tasks !== null) {\n      postBody['tasks'] = opts.tasks\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call innerTextScan with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/text:innerscan',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  文本同步检测-检测文本中是否包含违规信息\n      * @param {Object} opts - parameters\n      * @param {} [opts.bizType] - 业务bizType，请联系客户经理获取  optional\n      * @param {} [opts.version] - 接口版本号，固定值 v4  optional\n      * @param {} [opts.checkLabels] - 可指定多个垃圾类别进行机器检测，多个垃圾类别以逗号分隔（&quot;100,200&quot;）  optional\n      * @param {} [opts.texts] - 1-100条文本数据。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param textResultDetailV2 result\n      */\n\n  textScanV2 (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n    if (opts.checkLabels !== undefined && opts.checkLabels !== null) {\n      postBody['checkLabels'] = opts.checkLabels\n    }\n    if (opts.texts !== undefined && opts.texts !== null) {\n      postBody['texts'] = opts.texts\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call textScanV2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/text:scanv2',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看文本疑似结果，小于10s/20次，请求频率过快服务器会拒绝处理\n      * @param {Object} opts - parameters\n      * @param {} [opts.bizType] - 业务bizType，请联系客户经理获取  optional\n      * @param {} [opts.version] - 接口版本v4  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param textResultDetailV2 result\n      */\n\n  textResultsV2 (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call textResultsV2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/text:resultsv2',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  提交视频异步检测任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.bizType] - 机审策略，eg: default  optional\n      * @param {} [opts.live] - 是否直播。默认为false，表示为普通视频检测；若是直播检测，该值必须传入true。  optional\n      * @param {} [opts.scenes] - 指定检测场景  optional\n      * @param {} [opts.audioScenes] - 视频中语音的检测场景  optional\n      * @param {} [opts.tasks] - 检测任务列表，包含一个或多个元素。每个元素是个结构体，最多可添加10个元素，每个元素的具体结构描述见videoTask。  optional\n      * @param {} [opts.callback] - 异步检测结果回调通知您的URL，支持HTTP/HTTPS。该字段为空时，您必须定时检索检测结果。  optional\n      * @param {} [opts.seed] - 随机字符串，该值用于回调通知请求中的签名。当使用callback时，该字段必须提供。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param taskData data\n      */\n\n  asyncVideoScan (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.live !== undefined && opts.live !== null) {\n      postBody['live'] = opts.live\n    }\n    if (opts.scenes !== undefined && opts.scenes !== null) {\n      postBody['scenes'] = opts.scenes\n    }\n    if (opts.audioScenes !== undefined && opts.audioScenes !== null) {\n      postBody['audioScenes'] = opts.audioScenes\n    }\n    if (opts.tasks !== undefined && opts.tasks !== null) {\n      postBody['tasks'] = opts.tasks\n    }\n    if (opts.callback !== undefined && opts.callback !== null) {\n      postBody['callback'] = opts.callback\n    }\n    if (opts.seed !== undefined && opts.seed !== null) {\n      postBody['seed'] = opts.seed\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call asyncVideoScan with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/video:asyncscan',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看视频异步检测结果\n      * @param {Object} opts - parameters\n      * @param {array} opts.taskIds\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param videoResult data\n      */\n\n  videoResults (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskIds === undefined || opts.taskIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskIds' when calling videoResults\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskIds !== undefined && opts.taskIds !== null) {\n      postBody['taskIds'] = opts.taskIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call videoResults with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/video:results',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  提交视频异步检测任务V2\n      * @param {Object} opts - parameters\n      * @param {} [opts.bizType] - 业务bizType，请联系客户经理获取  optional\n      * @param {} [opts.url] - 最大长度512, 点播视频地址  optional\n      * @param {} [opts.dataId] - 最大长度128，点播视频唯一标识  optional\n      * @param {} [opts.version] - 接口版本号，可选值 v3.2  optional\n      * @param {} [opts.title] - 最大长度512，视频名称  optional\n      * @param {} [opts.callback] - 最大长度512，数据回调参数，产品根据业务情况自行设计，当获取离线检测结果时，内容安全服务会返回该字段  optional\n      * @param {} [opts.callbackUrl] - 最大长度256，离线结果回调通知到客户的URL。主动回调数据接口超时时间设置为2s，为了保证顺利接收数据，需保证接收接口性能稳定并且保证幂等性。  optional\n      * @param {} [opts.uniqueKey] - 最大长度64，客户个性化视频唯一性标识，传入后，将以此值作为重复检测依据，若不传，默认以URL作为查重依据,如果重复提交会被拒绝，返回报错信息请求重复，以及原提交taskID值，具体返回请查看响应示例  optional\n      * @param {} [opts.scFrequency] - 最大长度64，客户个性化视频唯一性标识，传入后，将以此值作为重复检测依据，若不传，默认以URL作为查重依据,如果重复提交会被拒绝，返回报错信息请求重复，以及原提交taskID值，具体返回请查看响应示例  optional\n      * @param {} [opts.advancedFrequency] - 高级截帧设置，此项填写，默认截帧策略失效  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param videoTaskData result\n      */\n\n  asyncVideoScanV2 (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.url !== undefined && opts.url !== null) {\n      postBody['url'] = opts.url\n    }\n    if (opts.dataId !== undefined && opts.dataId !== null) {\n      postBody['dataId'] = opts.dataId\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.callback !== undefined && opts.callback !== null) {\n      postBody['callback'] = opts.callback\n    }\n    if (opts.callbackUrl !== undefined && opts.callbackUrl !== null) {\n      postBody['callbackUrl'] = opts.callbackUrl\n    }\n    if (opts.uniqueKey !== undefined && opts.uniqueKey !== null) {\n      postBody['uniqueKey'] = opts.uniqueKey\n    }\n    if (opts.scFrequency !== undefined && opts.scFrequency !== null) {\n      postBody['scFrequency'] = opts.scFrequency\n    }\n    if (\n      opts.advancedFrequency !== undefined &&\n      opts.advancedFrequency !== null\n    ) {\n      postBody['advancedFrequency'] = opts.advancedFrequency\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call asyncVideoScanV2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/video:asyncscanv2',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  视频检测结果获取接口，获取离线处理的数据后，下次调用，不会再次返回之前获取过的离线数据。小于10s/20次，请求频率过快服务器会拒绝处理\n      * @param {Object} opts - parameters\n      * @param {} [opts.bizType] - 业务bizType，请联系客户经理获取  optional\n      * @param {} [opts.version] - 接口版本v1  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param videoResultV2 result\n      */\n\n  videoCallbackV2 (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call videoCallbackV2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/video:callbackv2',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据taskid查询视频检测结果，小于10s/20次，请求频率过快服务器会拒绝处理\n      * @param {Object} opts - parameters\n      * @param {} [opts.bizType] - 业务bizType，请联系客户经理获取  optional\n      * @param {} [opts.version] - 接口版本v1  optional\n      * @param {} [opts.taskIds] - 要查询的taskId  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param videoResultV2 result\n      */\n\n  videoResultsV2 (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bizType !== undefined && opts.bizType !== null) {\n      postBody['bizType'] = opts.bizType\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n    if (opts.taskIds !== undefined && opts.taskIds !== null) {\n      postBody['taskIds'] = opts.taskIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  censor/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call videoResultsV2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/video:resultsv2',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = CENSOR\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/clickhouse/v1/clickhouse.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 白名单\n * 白名单相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'clickhouse'\nService._services[serviceId] = true\n\n/**\n * clickhouse service.\n * @version 0.4.0\n */\n\nclass CLICKHOUSE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'clickhouse.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询 Clickhouse account列表信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页;  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，用于查询列表的接口  optional\n      * @param {filter} [opts.filters] - accountStatus, 支持operator选项：eq\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param account accounts\n      * @param number totalCount\n      */\n\n  describeAccounts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAccounts\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAccounts\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAccounts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个Clickhouse账号\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.accountName - 账号名\n      * @param {string} opts.accountPassword - 密码\n      * @param {string} opts.privilege - 账号权限\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling createAccount\"\n      )\n    }\n    if (opts.accountPassword === undefined || opts.accountPassword === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountPassword' when calling createAccount\"\n      )\n    }\n    if (opts.privilege === undefined || opts.privilege === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.privilege' when calling createAccount\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountName !== undefined && opts.accountName !== null) {\n      postBody['accountName'] = opts.accountName\n    }\n    if (opts.accountPassword !== undefined && opts.accountPassword !== null) {\n      postBody['accountPassword'] = opts.accountPassword\n    }\n    if (opts.privilege !== undefined && opts.privilege !== null) {\n      postBody['privilege'] = opts.privilege\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一个Clickhouse实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.accountName - 账号名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling deleteAccount\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts/{accountName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改账号权限\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.accountName - 账号名称\n      * @param {string} [opts.privileges] - 账号的访问权限  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyPrivilege (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyPrivilege\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyPrivilege\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling modifyPrivilege\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.privileges !== undefined && opts.privileges !== null) {\n      postBody['privileges'] = opts.privileges\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyPrivilege with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts/{accountName}:modifyPrivilege',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重置数据库账号密码\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.accountName - 账号名称\n      * @param {string} [opts.accountPassword] - 新密码  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resetPassword (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resetPassword\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling resetPassword\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling resetPassword\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountPassword !== undefined && opts.accountPassword !== null) {\n      postBody['accountPassword'] = opts.accountPassword\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resetPassword with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts/{accountName}:resetPassword',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前用户可用的可用区\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string azs\n      */\n\n  azs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  azs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call azs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/azs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前用户售罄信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer engineStatus\n      * @param az orderableAZs\n      */\n\n  orderableInstanceType (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  orderableInstanceType\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call orderableInstanceType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/OrderableInstanceType',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个Clickhouse实例\n      * @param {Object} opts - parameters\n      * @param {clickhouseInstanceSpec} opts.instanceSpec - 新建实例规格\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId\n      * @param string orderId\n      * @param string buyId\n      */\n\n  createInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  Clickhouse实例变配\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} [opts.chNodeClass] - clickhouse实例规格  optional\n      * @param {} [opts.zkNodeClass] - zookeeper实例规格  optional\n      * @param {} [opts.chNodeStorageGB] - clickhouse实例磁盘大小(GB)  optional\n      * @param {} [opts.monitorNodeClass] - 监控实例规格  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId\n      * @param string orderId\n      * @param string buyId\n      */\n\n  modifyInstanceSpec (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceSpec\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceSpec\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.chNodeClass !== undefined && opts.chNodeClass !== null) {\n      postBody['chNodeClass'] = opts.chNodeClass\n    }\n    if (opts.zkNodeClass !== undefined && opts.zkNodeClass !== null) {\n      postBody['zkNodeClass'] = opts.zkNodeClass\n    }\n    if (opts.chNodeStorageGB !== undefined && opts.chNodeStorageGB !== null) {\n      postBody['chNodeStorageGB'] = opts.chNodeStorageGB\n    }\n    if (opts.monitorNodeClass !== undefined && opts.monitorNodeClass !== null) {\n      postBody['monitorNodeClass'] = opts.monitorNodeClass\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceSpec with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceSpec',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 Clickhouse 实例的详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param clickhouseInstanceAttributes clickhouseInstanceAttributes\n      */\n\n  describeInstanceAttributes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceAttributes\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceAttributes\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceAttributes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一个Clickhouse实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页;  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，用于查询列表的接口  optional\n      * @param {filter} [opts.filters] - 过滤参数，多个过滤参数之间的关系为“与”(and)\n支持以下属性的过滤：\ninstanceId, 支持operator选项：eq,ne\nresourceId, 支持operator选项：eq,ne\ninstanceName, 支持operator选项：eq,ne,like\ninstanceStatus, 支持operator选项：eq,ne\n  optional\n      * @param {tagFilter} [opts.tagFilters] - 资源标签  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instances\n      * @param integer totalCount\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(\n      queryParams,\n      super.buildTagFilterParam(opts.tagFilters, 'tagFilters')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:describeInstances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 node 可用规格\n      * @param {Object} opts - parameters\n      * @param {string} [opts.nodeType] - 节点类型 CH ZK Monitor  optional\n      * @param {string} [opts.nodeStorageType] - 存储类型： EBS_SSD  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param chSpec chSpec\n      * @param zkSpec zkSpec\n      * @param monitorSpec monitorSpec\n      */\n\n  describeNodeClasses (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNodeClasses\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.nodeType !== undefined && opts.nodeType !== null) {\n      queryParams['nodeType'] = opts.nodeType\n    }\n    if (opts.nodeStorageType !== undefined && opts.nodeStorageType !== null) {\n      queryParams['nodeStorageType'] = opts.nodeStorageType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNodeClasses with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:describeNodeClasses',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 Clickhouse 推荐规格\n      * @param {Object} opts - parameters\n      * @param {string} [opts.chNodeClass] - 计算节点规格  optional\n      * @param {integer} [opts.shardNum] - 分片数  optional\n      * @param {integer} [opts.replicaNum] - 副本数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string zkNodeClass\n      * @param integer zkNodeNum\n      * @param integer zkNodeCPU\n      * @param integer zkNodeMemoryGB\n      * @param integer zkNodeStorageGB\n      * @param string monitorNodeClass\n      * @param integer monitorNodeCPU\n      * @param integer monitorNodeMemoryGB\n      * @param integer monitorNodeStorageGB\n      */\n\n  describeDefaultConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDefaultConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.chNodeClass !== undefined && opts.chNodeClass !== null) {\n      queryParams['chNodeClass'] = opts.chNodeClass\n    }\n    if (opts.shardNum !== undefined && opts.shardNum !== null) {\n      queryParams['shardNum'] = opts.shardNum\n    }\n    if (opts.replicaNum !== undefined && opts.replicaNum !== null) {\n      queryParams['replicaNum'] = opts.replicaNum\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDefaultConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:describeDefaultConfig',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看实例当前的备份备份策略。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string podIds\n      */\n\n  describePodMap (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePodMap\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describePodMap\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePodMap with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describePodMap',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取某个实例下的所有节点对应的域名信息。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param shards shards\n      * @param integer shardNum  分片数量\n      * @param integer replicaNum  副本数\n      * @param string publicDomainName  实例公网域名\n      * @param string internalDomainName  实例内网域名\n      */\n\n  describeDomainNames (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDomainNames\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeDomainNames\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDomainNames with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeDomainNames',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  强行删除DRDS实例，包括包年包月未过期实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} opts.requestUser - 发出请求的运营后台的ERP账号\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteInstanceByForce (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstanceByForce\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteInstanceByForce\"\n      )\n    }\n    if (opts.requestUser === undefined || opts.requestUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.requestUser' when calling deleteInstanceByForce\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.requestUser !== undefined && opts.requestUser !== null) {\n      postBody['requestUser'] = opts.requestUser\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstanceByForce with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:deleteInstanceByForce',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例名称。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.instanceName - 实例名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceName\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling modifyInstanceName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceName',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  集群版本升级。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.targetVersion - 集群版本号\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  upgradeEngineVersion (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  upgradeEngineVersion\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling upgradeEngineVersion\"\n      )\n    }\n    if (opts.targetVersion === undefined || opts.targetVersion === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetVersion' when calling upgradeEngineVersion\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.targetVersion !== undefined && opts.targetVersion !== null) {\n      postBody['targetVersion'] = opts.targetVersion\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call upgradeEngineVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:upgradeEngineVersion',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭实例的外网访问功能。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.serviceType - 服务类型（database/monitor）\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableInternetAccess (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableInternetAccess\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableInternetAccess\"\n      )\n    }\n    if (opts.serviceType === undefined || opts.serviceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceType' when calling disableInternetAccess\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.serviceType !== undefined && opts.serviceType !== null) {\n      postBody['serviceType'] = opts.serviceType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableInternetAccess with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:disableInternetAccess',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启实例的外网访问功能。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.serviceType - 服务类型 (database/monitor)\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableInternetAccess (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableInternetAccess\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableInternetAccess\"\n      )\n    }\n    if (opts.serviceType === undefined || opts.serviceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceType' when calling enableInternetAccess\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.serviceType !== undefined && opts.serviceType !== null) {\n      postBody['serviceType'] = opts.serviceType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableInternetAccess with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:enableInternetAccess',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 Clickhouse 节点信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页;  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为50，取值范围：[50,100]，用于查询列表的接口  optional\n      * @param {filter} [opts.filters] - nodeStatus, 支持operator选项：eq ne\n  optional\n      * @param {sort} [opts.sorts] - nodeId - node序号\ncpuUtil - CPU使用率\nmemeryUtil - 内存使用率\ndiskUsage - 磁盘使用率\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param node nodes\n      * @param number totalCount\n      */\n\n  describeNodes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNodes\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeNodes\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNodes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/nodes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 Clickhouse 集群进度\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {integer} [opts.backendProgress] - 是否获取创建域名进度，0不需要，1需要  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer instanceReadyDomain  就绪的域名个数\n      * @param integer instanceTotalDomain  总域名个数\n      * @param integer instanceReadyNode  就绪的节点个数\n      * @param integer instanceTotalNode  总节点个数\n      */\n\n  describeProgress (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeProgress\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeProgress\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.backendProgress !== undefined && opts.backendProgress !== null) {\n      queryParams['backendProgress'] = opts.backendProgress\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProgress with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/progress',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据实例的的id，获取实例相关信息。\n      * @param {Object} opts - parameters\n      * @param {string} opts.resourceList - 资源id列表（多个以,分隔）\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceInfo data\n      */\n\n  selectDetailList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  selectDetailList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.resourceList === undefined || opts.resourceList === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceList' when calling selectDetailList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceList !== undefined && opts.resourceList !== null) {\n      queryParams['resourceList'] = opts.resourceList\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call selectDetailList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:selectDetailList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  内部查询实例状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean cloudStorageLock  当前实例是否已开启云盘扩容锁，如已开启，返回true，如未开启，返回false\n      * @param boolean parametersGroupLock  当前实例是否已开启参数组锁，如已开启，返回true，如未开启，返回false\n      */\n\n  internalDescribeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  internalDescribeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling internalDescribeInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call internalDescribeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:internalDescribeInstance',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启数据库的云盘扩容功能\n      * @param {Object} opts - parameters\n      * @param {string} opts.pin - pin\n      * @param {string} [opts.instanceId] - instanceId  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableCloudDiskCapacity (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableCloudDiskCapacity\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pin === undefined || opts.pin === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pin' when calling enableCloudDiskCapacity\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableCloudDiskCapacity with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cloudDiskCapacity:enableCloudDiskCapacity',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭数据库的云盘扩容功能\n      * @param {Object} opts - parameters\n      * @param {string} opts.pin - pin\n      * @param {string} [opts.instanceId] - instanceId  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableCloudDiskCapacity (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableCloudDiskCapacity\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pin === undefined || opts.pin === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pin' when calling disableCloudDiskCapacity\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableCloudDiskCapacity with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cloudDiskCapacity:disableCloudDiskCapacity',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  当实例欠费或者到期了，关闭Clickhouse实例的网络访问功能\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  detachNetwork (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  detachNetwork\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling detachNetwork\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call detachNetwork with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:detachNetwork',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  当实例不欠费了或者续费了，开启Clickhouse实例的网络访问功能。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  attachNetwork (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  attachNetwork\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling attachNetwork\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call attachNetwork with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:attachNetwork',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 Clickhouse audit列表信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页;  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，用于查询列表的接口  optional\n      * @param {string} [opts.startTime] - 开始时间  optional\n      * @param {string} [opts.endTime] - 结束时间  optional\n      * @param {string} [opts.segmentName] - 节点名称  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param auditLog auditResult\n      * @param number totalCount\n      */\n\n  describeAuditResult (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAuditResult\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAuditResult\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.segmentName !== undefined && opts.segmentName !== null) {\n      queryParams['segmentName'] = opts.segmentName\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAuditResult with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/audit:describeAuditResult',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 Clickhouse audit列表信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页;  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，用于查询列表的接口  optional\n      * @param {string} [opts.startTime] - 开始时间  optional\n      * @param {string} [opts.endTime] - 结束时间  optional\n      * @param {string} [opts.segmentName] - 节点名称  optional\n      * @param {string} [opts.queryTime] - 查询时间  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param slowLog slowlogResult\n      * @param number totalCount\n      */\n\n  describeSlowlogResult (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSlowlogResult\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeSlowlogResult\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.segmentName !== undefined && opts.segmentName !== null) {\n      queryParams['segmentName'] = opts.segmentName\n    }\n    if (opts.queryTime !== undefined && opts.queryTime !== null) {\n      queryParams['queryTime'] = opts.queryTime\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSlowlogResult with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/slowlog:describeSlowlogResult',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看JCHDB实例的配置参数。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID，唯一标识一个实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceParameter parameters\n      */\n\n  describeParameters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeParameters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeParameters\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeParameters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/parameters',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  提交并修改实例的配置参数。 参数修改后，需要重启才能生效。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID，唯一标识一个实例\n      * @param {} [opts.parameters] - 目前支持的参数 keep_alive_timeout、max_connections、max_partition_size_to_drop、max_table_size_to_drop、max_concurrent_queries、uncompressed_cache_size、mark_cache_size、use_uncompressed_cache、max_memory_usage、distributed_ddl_task_timeout、background_pool_size、max_memory_usage_for_all_queries、max_query_size、max_partitions_per_insert_block  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyParameters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyParameters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyParameters\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.parameters !== undefined && opts.parameters !== null) {\n      postBody['parameters'] = opts.parameters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyParameters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/parameters',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询k8s集群支持的集群外访问方式\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - vpcId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string exposeType  exposeType,目前支持的可选项：NodePort、LoadBalancer\n      */\n\n  describeExposeType (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeExposeType\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling describeExposeType\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcId: opts.vpcId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeExposeType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs/{vpcId}:describeExposeType',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看实例当前白名单。白名单是允许访问当前实例的IP/IP段列表，缺省情况下，白名单对本VPC开放。如果用户开启了外网访问的功能，还需要对外网的IP配置白名单。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID，唯一标识一个实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param whiteList whiteLists\n      */\n\n  describeWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeWhiteList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/whiteList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改允许访问实例的IP白名单。白名单是允许访问当前实例的IP/IP段列表，缺省情况下，白名单对本VPC开放。如果用户开启了外网访问的功能，还需要对外网的IP配置白名单。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID，唯一标识一个实例\n      * @param {string} opts.ips - IP或IP段，不同的IP/IP段之间用英文逗号分隔，例如0.0.0.0/0,192.168.0.10\n      * @param {string} opts.name - 白名单分组名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyWhiteList\"\n      )\n    }\n    if (opts.ips === undefined || opts.ips === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ips' when calling modifyWhiteList\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling modifyWhiteList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ips !== undefined && opts.ips !== null) {\n      postBody['ips'] = opts.ips\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/whiteList',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除白名单分组。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID，唯一标识一个实例\n      * @param {string} opts.name - 白名单分组名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteWhiteListGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteWhiteListGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteWhiteListGroup\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling deleteWhiteListGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteWhiteListGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/whiteList',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  增加白名单分组。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID，唯一标识一个实例\n      * @param {string} opts.name - 白名单分组名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addWhiteListGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addWhiteListGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling addWhiteListGroup\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling addWhiteListGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clickhouse/0.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addWhiteListGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/whiteList:addWhiteListGroup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = CLICKHOUSE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/cloudauth/v1/cloudauth.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 用户管理接口\n * 实名认证-用户管理接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'cloudauth'\nService._services[serviceId] = true\n\n/**\n * cloudauth service.\n * @version 1.0.16\n */\n\nclass CLOUDAUTH extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'cloudauth.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  个人实名认证\n      * @param {Object} opts - parameters\n      * @param {personalSpec} opts.personalSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  personalAuth (opts, callback) {\n    opts = opts || {}\n\n    if (opts.personalSpec === undefined || opts.personalSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.personalSpec' when calling personalAuth\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.personalSpec !== undefined && opts.personalSpec !== null) {\n      postBody['personalSpec'] = opts.personalSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call personalAuth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/personal',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  个人手机号三要素详版\n      * @param {Object} opts - parameters\n      * @param {personalMobileSpec} opts.personalMobileSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  personalMobile (opts, callback) {\n    opts = opts || {}\n\n    if (\n      opts.personalMobileSpec === undefined ||\n      opts.personalMobileSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.personalMobileSpec' when calling personalMobile\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.personalMobileSpec !== undefined &&\n      opts.personalMobileSpec !== null\n    ) {\n      postBody['personalMobileSpec'] = opts.personalMobileSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call personalMobile with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/detail:mobile3',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  个人银行卡三要素详版\n      * @param {Object} opts - parameters\n      * @param {personalBankcard} opts.personalSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  personalBankcard3Detail (opts, callback) {\n    opts = opts || {}\n\n    if (opts.personalSpec === undefined || opts.personalSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.personalSpec' when calling personalBankcard3Detail\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.personalSpec !== undefined && opts.personalSpec !== null) {\n      postBody['personalSpec'] = opts.personalSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call personalBankcard3Detail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/detail:bankcard3',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  个人银行卡三要素非身份证版\n      * @param {Object} opts - parameters\n      * @param {personalBankcardOther} opts.personalSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  personalBankcard3Other (opts, callback) {\n    opts = opts || {}\n\n    if (opts.personalSpec === undefined || opts.personalSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.personalSpec' when calling personalBankcard3Other\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.personalSpec !== undefined && opts.personalSpec !== null) {\n      postBody['personalSpec'] = opts.personalSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call personalBankcard3Other with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/other:bankcard3',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  个人银行卡四要素详版\n      * @param {Object} opts - parameters\n      * @param {personalBankcard} opts.personalSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  personalBankcard4Detail (opts, callback) {\n    opts = opts || {}\n\n    if (opts.personalSpec === undefined || opts.personalSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.personalSpec' when calling personalBankcard4Detail\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.personalSpec !== undefined && opts.personalSpec !== null) {\n      postBody['personalSpec'] = opts.personalSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call personalBankcard4Detail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/detail:bankcard4',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  个人银行卡四要素非身份证版\n      * @param {Object} opts - parameters\n      * @param {personalBankcardOther} opts.personalSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  personalBankcard4Other (opts, callback) {\n    opts = opts || {}\n\n    if (opts.personalSpec === undefined || opts.personalSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.personalSpec' when calling personalBankcard4Other\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.personalSpec !== undefined && opts.personalSpec !== null) {\n      postBody['personalSpec'] = opts.personalSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call personalBankcard4Other with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/other:bankcard4',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对公银行账户打款(随机小额)\n      * @param {Object} opts - parameters\n      * @param {accountInfo} opts.accountInfo\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  companyTransfer (opts, callback) {\n    opts = opts || {}\n\n    if (opts.accountInfo === undefined || opts.accountInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountInfo' when calling companyTransfer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountInfo !== undefined && opts.accountInfo !== null) {\n      postBody['accountInfo'] = opts.accountInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call companyTransfer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/company:transfer',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对公打款验证\n      * @param {Object} opts - parameters\n      * @param {checkInfo} opts.checkInfo\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  checkCompanyTransfer (opts, callback) {\n    opts = opts || {}\n\n    if (opts.checkInfo === undefined || opts.checkInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.checkInfo' when calling checkCompanyTransfer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.checkInfo !== undefined && opts.checkInfo !== null) {\n      postBody['checkInfo'] = opts.checkInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkCompanyTransfer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/company:check',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对公打款状态查询\n      * @param {Object} opts - parameters\n      * @param {string} opts.orderNumber - 订单号\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  queryCompanyTransfer (opts, callback) {\n    opts = opts || {}\n\n    if (opts.orderNumber === undefined || opts.orderNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.orderNumber' when calling queryCompanyTransfer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.orderNumber !== undefined && opts.orderNumber !== null) {\n      postBody['orderNumber'] = opts.orderNumber\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryCompanyTransfer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/company:transferStatus',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  企业基础信息核验\n      * @param {Object} opts - parameters\n      * @param {companyInfo} opts.companyInfo\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  checkCompanyInfo (opts, callback) {\n    opts = opts || {}\n\n    if (opts.companyInfo === undefined || opts.companyInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.companyInfo' when calling checkCompanyInfo\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.companyInfo !== undefined && opts.companyInfo !== null) {\n      postBody['companyInfo'] = opts.companyInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkCompanyInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/company:info',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  法人信息校验\n      * @param {Object} opts - parameters\n      * @param {legalPersonSpec} opts.legalPersonSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  checkLegalPerson (opts, callback) {\n    opts = opts || {}\n\n    if (opts.legalPersonSpec === undefined || opts.legalPersonSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.legalPersonSpec' when calling checkLegalPerson\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.legalPersonSpec !== undefined && opts.legalPersonSpec !== null) {\n      postBody['legalPersonSpec'] = opts.legalPersonSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkLegalPerson with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/company:legalPerson',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  法人信息校验(详版)\n      * @param {Object} opts - parameters\n      * @param {legalPersonSpec} opts.legalPersonSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  checkLegalPersonDetail (opts, callback) {\n    opts = opts || {}\n\n    if (opts.legalPersonSpec === undefined || opts.legalPersonSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.legalPersonSpec' when calling checkLegalPersonDetail\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.legalPersonSpec !== undefined && opts.legalPersonSpec !== null) {\n      postBody['legalPersonSpec'] = opts.legalPersonSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkLegalPersonDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/company:legalPersonDetail',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  企业三要素\n      * @param {Object} opts - parameters\n      * @param {companyInfo3Spec} opts.companyInfo3Spec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  checkCompanyInfo3 (opts, callback) {\n    opts = opts || {}\n\n    if (opts.companyInfo3Spec === undefined || opts.companyInfo3Spec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.companyInfo3Spec' when calling checkCompanyInfo3\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.companyInfo3Spec !== undefined && opts.companyInfo3Spec !== null) {\n      postBody['companyInfo3Spec'] = opts.companyInfo3Spec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkCompanyInfo3 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/company:info3',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询省份下城市编码\n      * @param {Object} opts - parameters\n      * @param {string} opts.provinceCode - 省份代码\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  认证结果true 成功, false 失败\n      * @param boolean hasException  是否有异常 true 有异常, false 无异常\n      * @param string code  认证结果状态码\n      * @param string message  认证结果\n      * @param string detail  字符串形式的查询结果，内容为json\n      */\n\n  queryCityList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.provinceCode === undefined || opts.provinceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.provinceCode' when calling queryCityList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.provinceCode !== undefined && opts.provinceCode !== null) {\n      queryParams['provinceCode'] = opts.provinceCode\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryCityList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/query:cityList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对公银行账户打款(随机小额)——简单版\n      * @param {Object} opts - parameters\n      * @param {accountInfoSimple} opts.accountInfo\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authInfo authInfo\n      */\n\n  companyTransferSimple (opts, callback) {\n    opts = opts || {}\n\n    if (opts.accountInfo === undefined || opts.accountInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountInfo' when calling companyTransferSimple\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountInfo !== undefined && opts.accountInfo !== null) {\n      postBody['accountInfo'] = opts.accountInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call companyTransferSimple with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/company:transferSimple',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询所有省份列表\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  认证结果true 成功, false 失败\n      * @param boolean hasException  是否有异常 true 有异常, false 无异常\n      * @param string code  认证结果状态码\n      * @param string message  认证结果\n      * @param string detail  字符串形式的查询结果，内容为json\n      */\n\n  queryProvinceList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryProvinceList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/query:provinceList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询所有支持的银行\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  认证结果true 成功, false 失败\n      * @param boolean hasException  是否有异常 true 有异常, false 无异常\n      * @param string code  认证结果状态码\n      * @param string message  认证结果\n      * @param string detail  字符串形式的查询结果，内容为json\n      */\n\n  queryBankList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBankList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/query:bankList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询城市下银行分行列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.bankCode - 银行代码\n      * @param {string} opts.cityCode - 城市代码\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  认证结果true 成功, false 失败\n      * @param boolean hasException  是否有异常 true 有异常, false 无异常\n      * @param string code  认证结果状态码\n      * @param string message  认证结果\n      * @param string detail  字符串形式的查询结果，内容为json\n      */\n\n  queryBankBranchList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.bankCode === undefined || opts.bankCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bankCode' when calling queryBankBranchList\"\n      )\n    }\n    if (opts.cityCode === undefined || opts.cityCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cityCode' when calling queryBankBranchList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.bankCode !== undefined && opts.bankCode !== null) {\n      queryParams['bankCode'] = opts.bankCode\n    }\n    if (opts.cityCode !== undefined && opts.cityCode !== null) {\n      queryParams['cityCode'] = opts.cityCode\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryBankBranchList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/query:bankBranchList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  个人身份证OCR\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageData - 身份证图像base64(支持base64编码后小于4M，分辨率不高于4096x4096的图像)\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param oCRInfo oCRInfo\n      */\n\n  iDCard (opts, callback) {\n    opts = opts || {}\n\n    if (opts.imageData === undefined || opts.imageData === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageData' when calling iDCard\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.imageData !== undefined && opts.imageData !== null) {\n      postBody['imageData'] = opts.imageData\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call iDCard with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/ocr:IDCard',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  银行卡OCR\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageData - 银行卡图像base64(支持base64编码后小于3M)\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bankCardOCRInfo bankCardOCRInfo\n      */\n\n  bankCardOCR (opts, callback) {\n    opts = opts || {}\n\n    if (opts.imageData === undefined || opts.imageData === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageData' when calling bankCardOCR\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.imageData !== undefined && opts.imageData !== null) {\n      postBody['imageData'] = opts.imageData\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bankCardOCR with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/ocr:BankCard',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  营业执照OCR\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageData - 营业执照图像base64(支持base64编码后小于3M)\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param businessOCRInfo businessOCRInfo\n      */\n\n  businessOCR (opts, callback) {\n    opts = opts || {}\n\n    if (opts.imageData === undefined || opts.imageData === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageData' when calling businessOCR\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.imageData !== undefined && opts.imageData !== null) {\n      postBody['imageData'] = opts.imageData\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call businessOCR with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/ocr:Business',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  H5活体检测获取采集页面链接\n      * @param {Object} opts - parameters\n      * @param {string} [opts.name] - 姓名（需要进行身份核验时传递此参数）  optional\n      * @param {string} [opts.idcard] - 身份证号（需要进行身份核验时传递此参数）  optional\n      * @param {string} opts.returnUrl - 采集结束后自动跳转的目标地址（须以http或https开头，长度不超过128字符）\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param aliveUrlInfo aliveUrlInfo\n      */\n\n  getAliveUrl (opts, callback) {\n    opts = opts || {}\n\n    if (opts.returnUrl === undefined || opts.returnUrl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.returnUrl' when calling getAliveUrl\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.idcard !== undefined && opts.idcard !== null) {\n      postBody['idcard'] = opts.idcard\n    }\n    if (opts.returnUrl !== undefined && opts.returnUrl !== null) {\n      postBody['returnUrl'] = opts.returnUrl\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAliveUrl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/alive:getUrl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  H5活体检测结果\n      * @param {Object} opts - parameters\n      * @param {string} opts.token - 检测token\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param aliveResultInfo aliveResultInfo\n      */\n\n  getAliveResult (opts, callback) {\n    opts = opts || {}\n\n    if (opts.token === undefined || opts.token === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.token' when calling getAliveResult\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.token !== undefined && opts.token !== null) {\n      postBody['token'] = opts.token\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAliveResult with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/alive:getResult',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  H5活体检测获取采集页面链接新版\n      * @param {Object} opts - parameters\n      * @param {string} [opts.name] - 姓名（需要进行身份核验时传递此参数）  optional\n      * @param {string} [opts.idcard] - 身份证号（需要进行身份核验时传递此参数）  optional\n      * @param {string} opts.returnUrl - 采集结束后自动跳转的目标地址（须以http或https开头，长度不超过128字符）\n      * @param {string} [opts.actions] - 指定动作，逗号隔开。（LookLeft 向左，LookRight 向右，OpenMouth 张嘴，BlinkEye 眨眼，ShakeHead 摇头，NodHead 点头）  optional\n      * @param {boolean} [opts.showFail] - 是否展示失败结果页面  optional\n      * @param {string} [opts.photo] - 自有源照片（不超过2M）  optional\n      * @param {integer} [opts.photoThresh] - 自有源照片对比通过阈值（0-1000）  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param aliveUrlInfo aliveUrlInfo\n      */\n\n  getAliveUrlNew (opts, callback) {\n    opts = opts || {}\n\n    if (opts.returnUrl === undefined || opts.returnUrl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.returnUrl' when calling getAliveUrlNew\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.idcard !== undefined && opts.idcard !== null) {\n      postBody['idcard'] = opts.idcard\n    }\n    if (opts.returnUrl !== undefined && opts.returnUrl !== null) {\n      postBody['returnUrl'] = opts.returnUrl\n    }\n    if (opts.actions !== undefined && opts.actions !== null) {\n      postBody['actions'] = opts.actions\n    }\n    if (opts.showFail !== undefined && opts.showFail !== null) {\n      postBody['showFail'] = opts.showFail\n    }\n    if (opts.photo !== undefined && opts.photo !== null) {\n      postBody['photo'] = opts.photo\n    }\n    if (opts.photoThresh !== undefined && opts.photoThresh !== null) {\n      postBody['photoThresh'] = opts.photoThresh\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAliveUrlNew with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/alive:getUrlNew',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  H5活体检测结果新版\n      * @param {Object} opts - parameters\n      * @param {string} opts.token - 检测token\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param aliveResultInfo aliveResultInfo\n      */\n\n  getAliveResultNew (opts, callback) {\n    opts = opts || {}\n\n    if (opts.token === undefined || opts.token === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.token' when calling getAliveResultNew\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.token !== undefined && opts.token !== null) {\n      postBody['token'] = opts.token\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAliveResultNew with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/alive:getResultNew',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  一键登录\n      * @param {Object} opts - parameters\n      * @param {string} opts.token - 移动端获取的token\n      * @param {string} [opts.userInformation] - 浏览器加密指纹（H5时必传）  optional\n      * @param {integer} opts.appType - 应用类型（1 ios应用；2 H5应用；3 安卓应用）\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string chargeFlag  1收费，0不收费\n      * @param string msisdn  手机号（AES加密，用对应appkey解密）\n      * @param string code  认证结果状态码\n      * @param string message  认证结果\n      */\n\n  oneClick (opts, callback) {\n    opts = opts || {}\n\n    if (opts.token === undefined || opts.token === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.token' when calling oneClick\"\n      )\n    }\n    if (opts.appType === undefined || opts.appType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appType' when calling oneClick\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.token !== undefined && opts.token !== null) {\n      postBody['token'] = opts.token\n    }\n    if (opts.userInformation !== undefined && opts.userInformation !== null) {\n      postBody['userInformation'] = opts.userInformation\n    }\n    if (opts.appType !== undefined && opts.appType !== null) {\n      postBody['appType'] = opts.appType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call oneClick with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/oneClick:login',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  失联地址识别状态查询\n      * @param {Object} opts - parameters\n      * @param {string} [opts.phoneNumber] - 手机号（手机号和身份证号不能同时为空）  optional\n      * @param {string} [opts.idNumber] - 身份证号（手机号和身份证号不能同时为空）  optional\n      * @param {string} [opts.address] - 详细地址  optional\n      * @param {string} opts.customerCode - 商户号\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string chargeFlag  1收费，0不收费\n      * @param string code  认证结果状态码\n      * @param string message  认证结果\n      * @param string taskId  taskId(查询地址时需要)\n      * @param string detail  描述详细信息\n      */\n\n  addressInfo (opts, callback) {\n    opts = opts || {}\n\n    if (opts.customerCode === undefined || opts.customerCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.customerCode' when calling addressInfo\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.phoneNumber !== undefined && opts.phoneNumber !== null) {\n      postBody['phoneNumber'] = opts.phoneNumber\n    }\n    if (opts.idNumber !== undefined && opts.idNumber !== null) {\n      postBody['idNumber'] = opts.idNumber\n    }\n    if (opts.address !== undefined && opts.address !== null) {\n      postBody['address'] = opts.address\n    }\n    if (opts.customerCode !== undefined && opts.customerCode !== null) {\n      postBody['customerCode'] = opts.customerCode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addressInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/address:info',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  失联地址识别结果\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - taskId(查询接口返回)\n      * @param {string} opts.customerCode - 商户号\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string code  认证结果状态码\n      * @param string message  认证结果\n      * @param data data  详细信息\n      */\n\n  addressDetail (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling addressDetail\"\n      )\n    }\n    if (opts.customerCode === undefined || opts.customerCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.customerCode' when calling addressDetail\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n    if (opts.customerCode !== undefined && opts.customerCode !== null) {\n      postBody['customerCode'] = opts.customerCode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addressDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/address:detail',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  手机号码状态查询\n      * @param {Object} opts - parameters\n      * @param {string} opts.mobile - 手机号码\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string code  认证结果状态码\n      * @param string message  认证结果描述\n      * @param string chargeFlag  是否收费：0不收费，1收费\n      * @param string area  归属地\n      * @param string operator  运营商\n      * @param string status  号码状态（1 正常 2 空号 3 通话中 4 不在网(空号) 5 关机 7 在网但不可用 13 停机 10 未知 9 服务器异常 12 不存在的号码）\n      * @param string mnpStatus  是否携号转网 1-是 0-否\n      */\n\n  mobileStatus (opts, callback) {\n    opts = opts || {}\n\n    if (opts.mobile === undefined || opts.mobile === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.mobile' when calling mobileStatus\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.mobile !== undefined && opts.mobile !== null) {\n      postBody['mobile'] = opts.mobile\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call mobileStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/mobile:status',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询服务开通状态\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string pin  用户pin\n      * @param integer status  当前服务状态(0 未开通 1 开通中 2 正常  3 停服 )\n      * @param string applyTime  申请开通服务时间\n      */\n\n  describeApplyStatus (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudauth/1.0.16'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeApplyStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/manage:applyStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = CLOUDAUTH\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/clouddnsservice/v1/clouddnsservice.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 实例信息\n * 云解析OpenAPI实例信息接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'clouddnsservice'\nService._services[serviceId] = true\n\n/**\n * clouddnsservice service.\n * @version 1.0.12\n */\n\nJDCloud.CLOUDDNSSERVICE = class CLOUDDNSSERVICE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'clouddnsservice.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查看用户在云解析服务下的操作记录\n      * @param {Object} opts - parameters\n      * @param {integer} opts.pageNumber - 分页参数，页的序号，默认是1\n      * @param {integer} opts.pageSize - 分页参数，每页含有的结果的数目，默认是10\n      * @param {string} opts.startTime - 记录的起始时间，格式：UTC时间例如2017-11-10T23:00:00Z\n      * @param {string} opts.endTime - 记录的终止时间，格式：UTC时间例如2017-11-10T23:00:00Z\n      * @param {string} [opts.keyWord] - 日志需要匹配的关键词  optional\n      * @param {boolean} [opts.success] - 日志里面的结果是成功还是失败  optional\n      * @param {integer} [opts.type] - 日志的类型  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param actionlog dataList\n      * @param integer currentCount  当前页的操作记录列表里的个数\n      * @param integer totalCount  所有操作记录的个数\n      * @param integer totalPage  操作记录列表按照分页参数一共的页数\n      */\n\n  getActionLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getActionLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling getActionLog\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling getActionLog\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling getActionLog\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling getActionLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.keyWord !== undefined && opts.keyWord !== null) {\n      queryParams['keyWord'] = opts.keyWord\n    }\n    if (opts.success !== undefined && opts.success !== null) {\n      queryParams['success'] = opts.success\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getActionLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/log/actionLog',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取用户所属的主域名列表。\n请在调用域名相关的接口之前，调用此接口获取相关的domainId和domainName。\n主域名的相关概念，请查阅&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/jd-cloud-dns/product-overview&quot;&gt;云解析文档&lt;/a&gt;\n\n      * @param {Object} opts - parameters\n      * @param {integer} opts.pageNumber - 分页查询时查询的每页的序号，起始值为1，默认为1\n      * @param {integer} opts.pageSize - 分页查询时设置的每页行数，默认为10\n      * @param {string} [opts.domainName] - 关键字，按照”%domainName%”模式匹配主域名  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domain dataList\n      * @param integer currentCount  当前页的域名列表里域名的个数\n      * @param integer totalCount  所有匹配的域名列表的个数\n      * @param integer totalPage  所有匹配的域名列表按照分页参数一共的页数\n      */\n\n  getDomains (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDomains\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling getDomains\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling getDomains\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDomains with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加主域名\n如何添加免费域名，详细情况请查阅&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/jd-cloud-dns/domainadd&quot;&gt;文档&lt;/a&gt;\n添加收费域名，请查阅&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/jd-cloud-dns/purchase-process&quot;&gt;文档&lt;/a&gt;，\n添加收费域名前，请确保用户的京东云账户有足够的资金支付，Openapi接口回返回订单号，可以用此订单号向计费系统查阅详情。\n\n      * @param {Object} opts - parameters\n      * @param {integer} opts.packId - 主域名的套餐类型, 0-&gt;免费 ,1-&gt;企业版, 2-&gt;高级版\n      * @param {string} opts.domainName - 要添加的主域名\n      * @param {integer} [opts.domainId] - 主域名的ID，升级套餐必填，请使用getDomains获取  optional\n      * @param {integer} [opts.buyType] - 1-&gt;新购买、3-&gt;升级，收费套餐的域名必填  optional\n      * @param {integer} [opts.timeSpan] - 取值1，2，3 ，含义：时长，收费套餐的域名必填  optional\n      * @param {integer} [opts.timeUnit] - 时间单位，收费套餐的域名必填，1：小时，2：天，3：月，4：年  optional\n      * @param {integer} [opts.billingType] - 计费类型，可以不传此参数。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainAdded data  新添加的的域名结构\n      * @param string order  添加收费版域名的订单号\n      */\n\n  addDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.packId === undefined || opts.packId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.packId' when calling addDomain\"\n      )\n    }\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling addDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.packId !== undefined && opts.packId !== null) {\n      postBody['packId'] = opts.packId\n    }\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      postBody['domainName'] = opts.domainName\n    }\n    if (opts.domainId !== undefined && opts.domainId !== null) {\n      postBody['domainId'] = opts.domainId\n    }\n    if (opts.buyType !== undefined && opts.buyType !== null) {\n      postBody['buyType'] = opts.buyType\n    }\n    if (opts.timeSpan !== undefined && opts.timeSpan !== null) {\n      postBody['timeSpan'] = opts.timeSpan\n    }\n    if (opts.timeUnit !== undefined && opts.timeUnit !== null) {\n      postBody['timeUnit'] = opts.timeUnit\n    }\n    if (opts.billingType !== undefined && opts.billingType !== null) {\n      postBody['billingType'] = opts.billingType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domainAdd',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除主域名\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 需要删除的主域名ID，请使用getDomains接口获取\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  delDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  delDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling delDomain\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainId !== undefined && opts.domainId !== null) {\n      queryParams['domainId'] = opts.domainId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call delDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domainDel',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改主域名\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 需要修改的主域名，请使用getDomains接口获取\n      * @param {integer} opts.id - 需要修改的主域名ID，请使用getDomains接口获取\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling updateDomain\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling updateDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      postBody['domainName'] = opts.domainName\n    }\n    if (opts.id !== undefined && opts.id !== null) {\n      postBody['id'] = opts.id\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domainUpdate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看主域名的解析次数\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {string} opts.domainName - 查询的主域名，，请使用getDomains接口获取\n      * @param {string} opts.start - 查询时间段的起始时间, UTC时间，例如2017-11-10T23:00:00Z\n      * @param {string} opts.end - 查询时间段的终止时间, UTC时间，例如2017-11-10T23:00:00Z\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer time\n      * @param integer traffic\n      */\n\n  getDomainQueryCount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDomainQueryCount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling getDomainQueryCount\"\n      )\n    }\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling getDomainQueryCount\"\n      )\n    }\n    if (opts.start === undefined || opts.start === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.start' when calling getDomainQueryCount\"\n      )\n    }\n    if (opts.end === undefined || opts.end === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.end' when calling getDomainQueryCount\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.start !== undefined && opts.start !== null) {\n      queryParams['start'] = opts.start\n    }\n    if (opts.end !== undefined && opts.end !== null) {\n      queryParams['end'] = opts.end\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDomainQueryCount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/queryCount',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看域名的查询流量\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {string} opts.domainName - 主域名，请使用getDomains接口获取\n      * @param {string} opts.start - 时间段的起始时间, UTC时间，例如2017-11-10T23:00:00Z\n      * @param {string} opts.end - 时间段的终止时间, UTC时间，例如2017-11-10T23:00:00Z\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer time\n      * @param string unit  数据序列的单位\n      * @param number traffic\n      */\n\n  getDomainQueryTraffic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDomainQueryTraffic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling getDomainQueryTraffic\"\n      )\n    }\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling getDomainQueryTraffic\"\n      )\n    }\n    if (opts.start === undefined || opts.start === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.start' when calling getDomainQueryTraffic\"\n      )\n    }\n    if (opts.end === undefined || opts.end === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.end' when calling getDomainQueryTraffic\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.start !== undefined && opts.start !== null) {\n      queryParams['start'] = opts.start\n    }\n    if (opts.end !== undefined && opts.end !== null) {\n      queryParams['end'] = opts.end\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDomainQueryTraffic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/queryTraffic',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询主域名的解析记录。\n在使用解析记录相关的接口之前，请调用此接口获取解析记录的列表。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {integer} [opts.pageNumber] - 当前页数，起始值为1，默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页查询时设置的每页行数, 默认为10  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rR dataList\n      * @param integer totalCount  所有解析记录的个数\n      * @param integer totalPage  所有解析记录的页数\n      * @param integer currentCount  当前页解析记录的个数\n      */\n\n  searchRR (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  searchRR\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling searchRR\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call searchRR with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/RR',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询云解析所有的基础解析线路。\n在使用解析线路的参数之前，请调用此接口获取解析线路的ID。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {integer} [opts.loadMode] - 展示方式，暂时不使用  optional\n      * @param {integer} opts.packId - 套餐ID，0-&gt;免费版 1-&gt;企业版 2-&gt;企业高级版\n      * @param {integer} opts.viewId - view ID，默认为-1\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param viewTree data\n      */\n\n  getViewTree (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getViewTree\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling getViewTree\"\n      )\n    }\n    if (opts.packId === undefined || opts.packId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.packId' when calling getViewTree\"\n      )\n    }\n    if (opts.viewId === undefined || opts.viewId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.viewId' when calling getViewTree\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.loadMode !== undefined && opts.loadMode !== null) {\n      queryParams['loadMode'] = opts.loadMode\n    }\n    if (opts.packId !== undefined && opts.packId !== null) {\n      queryParams['packId'] = opts.packId\n    }\n    if (opts.viewId !== undefined && opts.viewId !== null) {\n      queryParams['viewId'] = opts.viewId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getViewTree with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/viewTree',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加主域名的解析记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {addRR} opts.req - RR参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rR dataList  添加成功后的解析记录结果\n      */\n\n  addRR (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addRR\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling addRR\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling addRR\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addRR with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/RRAdd',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改主域名的某个解析记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {updateRR} opts.req - updateRR参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateRR (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateRR\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling updateRR\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling updateRR\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateRR with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/RRUpdate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用、停用、删除主域名下的解析记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {array} [opts.ids] - 需要操作的解析记录ID，请使用searchRR接口获取。  optional\n      * @param {string} opts.action - 操作类型，on-&gt;启用 off-&gt;停用 del-&gt;删除\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  operateRR (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  operateRR\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling operateRR\"\n      )\n    }\n    if (opts.action === undefined || opts.action === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.action' when calling operateRR\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ids !== undefined && opts.ids !== null) {\n      postBody['ids'] = opts.ids\n    }\n    if (opts.action !== undefined && opts.action !== null) {\n      postBody['action'] = opts.action\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call operateRR with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/RROperate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  同一个主域名下，批量新增或者批量更新导入解析记录。\n如果解析记录的ID为0，是新增解析记录，如果不为0，则是更新解析记录。\n\n      * @param {Object} opts - parameters\n      * @param {array} [opts.req] - 需要设置的解析记录列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  batchSetDnsResolve (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  batchSetDnsResolve\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchSetDnsResolve with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/BatchSetDnsResolve',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加主域名的自定义解析线路\n      * @param {Object} opts - parameters\n      * @param {addView} opts.req - 添加自定义线路的参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param userview data  添加成功后返回的自定义线路的结构\n      */\n\n  addUserView (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addUserView\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling addUserView\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addUserView with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/userview/addUserView',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除主域名的自定义解析线路\n      * @param {Object} opts - parameters\n      * @param {delView} opts.req - 删除自定义线路的参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  delUserView (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  delUserView\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling delUserView\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call delUserView with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/userview/delUserView',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询主域名的自定义解析线路\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 主域名ID\n      * @param {integer} opts.viewId - 自定义线路ID\n      * @param {string} [opts.viewName] - 自定义线路名称, 最多64个字符  optional\n      * @param {integer} opts.pageNumber - 分页参数，页的序号\n      * @param {integer} opts.pageSize - 分页参数，每页含有的结果的数目\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param userViewInput dataList\n      * @param integer currentCount  当前页的自定义线路列表里的个数\n      * @param integer totalCount  所有自定义线路列表的个数\n      * @param integer totalPage  所有自定义线路列表按照分页参数一共的页数\n      */\n\n  getUserView (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getUserView\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling getUserView\"\n      )\n    }\n    if (opts.viewId === undefined || opts.viewId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.viewId' when calling getUserView\"\n      )\n    }\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling getUserView\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling getUserView\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainId !== undefined && opts.domainId !== null) {\n      queryParams['domainId'] = opts.domainId\n    }\n    if (opts.viewId !== undefined && opts.viewId !== null) {\n      queryParams['viewId'] = opts.viewId\n    }\n    if (opts.viewName !== undefined && opts.viewName !== null) {\n      queryParams['viewName'] = opts.viewName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getUserView with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/userview/getUserView',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加主域名的自定义解析线路的IP段\n      * @param {Object} opts - parameters\n      * @param {addViewIP} opts.req - 添加域名的自定义解析线路的IP段的参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addUserViewIP (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addUserViewIP\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling addUserViewIP\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addUserViewIP with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/userview/addUserViewIP',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除主域名的自定义解析线路的IP段\n      * @param {Object} opts - parameters\n      * @param {delViewIP} opts.req - 删除域名的自定义解析线路的IP段的参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  delUserViewIP (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  delUserViewIP\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling delUserViewIP\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call delUserViewIP with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/userview/delUserViewIP',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询主域名的自定义解析线路的IP段\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 主域名ID\n      * @param {integer} opts.viewId - 自定义线路ID\n      * @param {string} [opts.viewName] - 自定义线路名称, 最多64个字符  optional\n      * @param {integer} opts.pageNumber - 分页参数，页的序号, 默认为1\n      * @param {integer} opts.pageSize - 分页参数，每页含有的结果的数目，默认为10\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string dataList\n      * @param integer currentCount  当前页的IP列表里的个数\n      * @param integer totalCount  IP列表里的IP段的个数\n      * @param integer totalPage  IP列表按照分页参数一共的页数\n      */\n\n  getUserViewIP (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getUserViewIP\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling getUserViewIP\"\n      )\n    }\n    if (opts.viewId === undefined || opts.viewId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.viewId' when calling getUserViewIP\"\n      )\n    }\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling getUserViewIP\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling getUserViewIP\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainId !== undefined && opts.domainId !== null) {\n      queryParams['domainId'] = opts.domainId\n    }\n    if (opts.viewId !== undefined && opts.viewId !== null) {\n      queryParams['viewId'] = opts.viewId\n    }\n    if (opts.viewName !== undefined && opts.viewName !== null) {\n      queryParams['viewName'] = opts.viewName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getUserViewIP with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/userview/getUserViewIP',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看主域名的监控项的配置以及状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {integer} [opts.pageIndex] - 当前页数，起始值为1，默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页查询时设置的每页行数  optional\n      * @param {string} [opts.searchValue] - 查询的值  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer currentCount  当前页面网站监控项的个数\n      * @param integer totalCount  所有网站监控项的个数\n      * @param integer totalPage  所有网站监控项的页数\n      * @param monitor dataList\n      */\n\n  getMonitor (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getMonitor\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling getMonitor\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.searchValue !== undefined && opts.searchValue !== null) {\n      queryParams['searchValue'] = opts.searchValue\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitor',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加子域名的监控项，默认把子域名的所有监控项都添加上监控\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {string} opts.subDomainName - 子域名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addMonitor (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addMonitor\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling addMonitor\"\n      )\n    }\n    if (opts.subDomainName === undefined || opts.subDomainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subDomainName' when calling addMonitor\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subDomainName !== undefined && opts.subDomainName !== null) {\n      postBody['subDomainName'] = opts.subDomainName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitorAdd',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子域名的可用监控对象\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {string} opts.subDomainName - 子域名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  getTargets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTargets\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling getTargets\"\n      )\n    }\n    if (opts.subDomainName === undefined || opts.subDomainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subDomainName' when calling getTargets\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.subDomainName !== undefined && opts.subDomainName !== null) {\n      queryParams['subDomainName'] = opts.subDomainName\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTargets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/getTargets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加子域名的某些特定监控对象为监控项\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {string} opts.subDomainName - 子域名\n      * @param {array} [opts.targets] - 子域名可用监控对象的数组  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addMonitorTarget (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addMonitorTarget\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling addMonitorTarget\"\n      )\n    }\n    if (opts.subDomainName === undefined || opts.subDomainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subDomainName' when calling addMonitorTarget\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subDomainName !== undefined && opts.subDomainName !== null) {\n      postBody['subDomainName'] = opts.subDomainName\n    }\n    if (opts.targets !== undefined && opts.targets !== null) {\n      postBody['targets'] = opts.targets\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addMonitorTarget with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitorAddTarget',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  监控项的操作集合，包括：删除，暂停，启动, 手动恢复, 手动切换\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {string} opts.action - 删除del, 暂停stop, 开启start, 手动恢复recover，手动切换switch\n      * @param {array} [opts.ids] - 监控项ID  optional\n      * @param {string} [opts.switchTarget] - 监控项的主机值, 手动切换时必填  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  operateMonitor (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  operateMonitor\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling operateMonitor\"\n      )\n    }\n    if (opts.action === undefined || opts.action === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.action' when calling operateMonitor\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.action !== undefined && opts.action !== null) {\n      postBody['action'] = opts.action\n    }\n    if (opts.ids !== undefined && opts.ids !== null) {\n      postBody['ids'] = opts.ids\n    }\n    if (opts.switchTarget !== undefined && opts.switchTarget !== null) {\n      postBody['switchTarget'] = opts.switchTarget\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call operateMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitorOperate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域名的监控项修改\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {updateMonitor} opts.updateMonitor - 监控项设置信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateMonitor (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateMonitor\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling updateMonitor\"\n      )\n    }\n    if (opts.updateMonitor === undefined || opts.updateMonitor === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.updateMonitor' when calling updateMonitor\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.updateMonitor !== undefined && opts.updateMonitor !== null) {\n      postBody['updateMonitor'] = opts.updateMonitor\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitorUpdate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  主域名的监控项的报警信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用getDomains接口获取。\n      * @param {integer} [opts.pageIndex] - 当前页数，起始值为1，默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页查询时设置的每页行数  optional\n      * @param {string} [opts.searchValue] - 关键字  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer currentCount  当前页面报警信息的个数\n      * @param integer totalCount  所有报警信息的个数\n      * @param integer totalPage  所有报警信息的页数\n      * @param monitorAlarmInfo dataList\n      */\n\n  getMonitorAlarmInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getMonitorAlarmInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling getMonitorAlarmInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.searchValue !== undefined && opts.searchValue !== null) {\n      queryParams['searchValue'] = opts.searchValue\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  clouddnsservice/1.0.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getMonitorAlarmInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitor/alarminfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.CLOUDDNSSERVICE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/cloudsign/v1/cloudsign.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * OLD合同模板管理接口\n * OLD合同模板管理接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'cloudsign'\nService._services[serviceId] = true\n\n/**\n * cloudsign service.\n * @version 2.0.9\n */\n\nclass CLOUDSIGN extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'cloudsign.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  获取已签章合同列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} [opts.contractTitle] - 合同标题  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param contractInfo contractList\n      * @param integer totalCount  合同数量\n      */\n\n  describeContractList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.contractTitle !== undefined && opts.contractTitle !== null) {\n      queryParams['contractTitle'] = opts.contractTitle\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeContractList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/contract',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  合同签章四种方式：\n1. 合同文件 + 印章文件：contractContent + stampContent\n2. 合同文件 + 印章ID：contractContent + stampId\n3. 模板ID + 印章文件：templateId + stampContent\n4. 模板ID + 印章ID：templateId + stampId\n\n      * @param {Object} opts - parameters\n      * @param {contractSpec} opts.contractSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string contractId  新签的合同ID\n      * @param string contractContent  新签的合同文件（base64）\n      */\n\n  signContract (opts, callback) {\n    opts = opts || {}\n\n    if (opts.contractSpec === undefined || opts.contractSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.contractSpec' when calling signContract\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.contractSpec !== undefined && opts.contractSpec !== null) {\n      postBody['contractSpec'] = opts.contractSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call signContract with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/contract',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  1. 下载已签章的合同\n2. 多个合同id用逗号分隔\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.contractId - 合同ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param contractInfo contractList\n      * @param integer totalCount  合同数量\n      */\n\n  downloadContracts (opts, callback) {\n    opts = opts || {}\n\n    if (opts.contractId === undefined || opts.contractId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.contractId' when calling downloadContracts\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      contractId: opts.contractId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call downloadContracts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/contract/{contractId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  验签已签章合同\n      * @param {Object} opts - parameters\n      * @param {string} opts.contractId - 合同ID\n      * @param {contractVerifySpec} opts.contractVerifySpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  验签是否成功，true 成功 false 失败\n      * @param string message  验证消息\n      * @param stampResult results\n      */\n\n  verifyContract (opts, callback) {\n    opts = opts || {}\n\n    if (opts.contractId === undefined || opts.contractId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.contractId' when calling verifyContract\"\n      )\n    }\n    if (\n      opts.contractVerifySpec === undefined ||\n      opts.contractVerifySpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.contractVerifySpec' when calling verifyContract\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.contractVerifySpec !== undefined &&\n      opts.contractVerifySpec !== null\n    ) {\n      postBody['contractVerifySpec'] = opts.contractVerifySpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      contractId: opts.contractId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call verifyContract with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/contract/{contractId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除已签章的合同 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.contractId - 合同ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteContract (opts, callback) {\n    opts = opts || {}\n\n    if (opts.contractId === undefined || opts.contractId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.contractId' when calling deleteContract\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      contractId: opts.contractId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteContract with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/contract/{contractId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取已签章合同列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} [opts.contractTitle] - 合同标题  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param contractInfo contractList\n      * @param integer totalCount  合同数量\n      */\n\n  describeContractList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.contractTitle !== undefined && opts.contractTitle !== null) {\n      queryParams['contractTitle'] = opts.contractTitle\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeContractList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqContract:describeContractList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  合同签章四种方式：\n1. 合同文件 + 印章文件：contractContent + stampContent\n2. 合同文件 + 印章ID：contractContent + stampId\n3. 模板ID + 印章文件：templateId + stampContent\n4. 模板ID + 印章ID：templateId + stampId\n\n      * @param {Object} opts - parameters\n      * @param {contractSpec} opts.contractSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      * @param string message\n      * @param string code\n      * @param string contractId  新签的合同ID\n      * @param string contractContent  新签的合同文件（base64）\n      */\n\n  signContract (opts, callback) {\n    opts = opts || {}\n\n    if (opts.contractSpec === undefined || opts.contractSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.contractSpec' when calling signContract\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.contractSpec !== undefined && opts.contractSpec !== null) {\n      postBody['contractSpec'] = opts.contractSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call signContract with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqContract:signContract',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  验签已签章合同\n      * @param {Object} opts - parameters\n      * @param {string} opts.contractId - 合同ID\n      * @param {contractVerifySpec} opts.contractVerifySpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  验签是否成功，true 成功 false 失败\n      * @param string message  验证消息\n      * @param string code\n      * @param stampResult results\n      */\n\n  verifyContract (opts, callback) {\n    opts = opts || {}\n\n    if (opts.contractId === undefined || opts.contractId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.contractId' when calling verifyContract\"\n      )\n    }\n    if (\n      opts.contractVerifySpec === undefined ||\n      opts.contractVerifySpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.contractVerifySpec' when calling verifyContract\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.contractVerifySpec !== undefined &&\n      opts.contractVerifySpec !== null\n    ) {\n      postBody['contractVerifySpec'] = opts.contractVerifySpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      contractId: opts.contractId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call verifyContract with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqContract/{contractId}:verifyContract',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  1. 下载已签章的合同\n2. 多个合同id用逗号分隔\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.contractId - 合同ID\n      * @param {string} opts.contractId - 合同ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param contractInfo contractList\n      * @param integer totalCount  合同数量\n      */\n\n  downloadContracts (opts, callback) {\n    opts = opts || {}\n\n    if (opts.contractId === undefined || opts.contractId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.contractId' when calling downloadContracts\"\n      )\n    }\n    if (opts.contractId === undefined || opts.contractId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.contractId' when calling downloadContracts\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.contractId !== undefined && opts.contractId !== null) {\n      queryParams['contractId'] = opts.contractId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      contractId: opts.contractId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call downloadContracts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqContract/{contractId}:downloadContracts',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除已签章合同 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.contractId - 合同ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除是否成功，true 成功 false 失败\n      * @param string message\n      * @param string code\n      */\n\n  deleteContract (opts, callback) {\n    opts = opts || {}\n\n    if (opts.contractId === undefined || opts.contractId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.contractId' when calling deleteContract\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      contractId: opts.contractId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteContract with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqContract/{contractId}:deleteContract',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  单证据链存证接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.businessId - 业务流水号\n      * @param {string} opts.file - 存证数据json字符串的Base64\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string code\n      * @param string message\n      * @param boolean success\n      * @param saveEvidenceResp data\n      */\n\n  saveEvidence (opts, callback) {\n    opts = opts || {}\n\n    if (opts.businessId === undefined || opts.businessId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.businessId' when calling saveEvidence\"\n      )\n    }\n    if (opts.file === undefined || opts.file === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.file' when calling saveEvidence\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.businessId !== undefined && opts.businessId !== null) {\n      postBody['businessId'] = opts.businessId\n    }\n    if (opts.file !== undefined && opts.file !== null) {\n      postBody['file'] = opts.file\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call saveEvidence with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/evidence:evidenceSave',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  多证据链存证接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.businessId - 业务流水号\n      * @param {string} opts.file - 存证数据json字符串的Base64\n      * @param {string} [opts.businessCode] - 证据链代码  optional\n      * @param {string} [opts.lender] - 资方信息（借钱传：ZY；票据传 PJ_SHOUXIN--授信,PJ_JIEKUAN--借款）  optional\n      * @param {string} [opts.messageId] - 请求流水号  optional\n      * @param {string} [opts.evidenceType] - 业务类型（JIEQIAN–借钱；PIAOJU--票据）  optional\n      * @param {string} [opts.messageDate] - 请求时间  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string code\n      * @param string message\n      * @param boolean success\n      * @param saveEvidenceResp data\n      */\n\n  saveMultiEvidence (opts, callback) {\n    opts = opts || {}\n\n    if (opts.businessId === undefined || opts.businessId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.businessId' when calling saveMultiEvidence\"\n      )\n    }\n    if (opts.file === undefined || opts.file === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.file' when calling saveMultiEvidence\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.businessId !== undefined && opts.businessId !== null) {\n      postBody['businessId'] = opts.businessId\n    }\n    if (opts.file !== undefined && opts.file !== null) {\n      postBody['file'] = opts.file\n    }\n    if (opts.businessCode !== undefined && opts.businessCode !== null) {\n      postBody['businessCode'] = opts.businessCode\n    }\n    if (opts.lender !== undefined && opts.lender !== null) {\n      postBody['lender'] = opts.lender\n    }\n    if (opts.messageId !== undefined && opts.messageId !== null) {\n      postBody['messageId'] = opts.messageId\n    }\n    if (opts.evidenceType !== undefined && opts.evidenceType !== null) {\n      postBody['evidenceType'] = opts.evidenceType\n    }\n    if (opts.messageDate !== undefined && opts.messageDate !== null) {\n      postBody['messageDate'] = opts.messageDate\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call saveMultiEvidence with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/evidence:evidenceMultisave',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  单证据链取证接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.businessId - 业务流水号\n      * @param {string} opts.evidenceId - 存证编号\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string code\n      * @param string message\n      * @param boolean success\n      * @param getEvidenceResp data\n      */\n\n  getEvidence (opts, callback) {\n    opts = opts || {}\n\n    if (opts.businessId === undefined || opts.businessId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.businessId' when calling getEvidence\"\n      )\n    }\n    if (opts.evidenceId === undefined || opts.evidenceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.evidenceId' when calling getEvidence\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.businessId !== undefined && opts.businessId !== null) {\n      queryParams['businessId'] = opts.businessId\n    }\n    if (opts.evidenceId !== undefined && opts.evidenceId !== null) {\n      queryParams['evidenceId'] = opts.evidenceId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getEvidence with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/evidence:evidenceGetEvidence',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  带主体标记的取证接口\n      * @param {Object} opts - parameters\n      * @param {string} [opts.businessId] - 业务流水号  optional\n      * @param {string} [opts.evidenceId] - 存证编号  optional\n      * @param {string} [opts.applicantIdType] - 申请取证主体的ID类型  optional\n      * @param {string} [opts.applicantIdNum] - 申请取证主体的ID  optional\n      * @param {string} [opts.messageId] - 请求流水号  optional\n      * @param {string} [opts.evidenceType] - 业务类型  optional\n      * @param {string} [opts.messageDate] - 请求时间  optional\n      * @param {string} [opts.evidenceMessageId] - 存证时的请求流水  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string code\n      * @param string message\n      * @param boolean success\n      * @param getEvidenceResp data\n      */\n\n  getMultiEvidence (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.businessId !== undefined && opts.businessId !== null) {\n      queryParams['businessId'] = opts.businessId\n    }\n    if (opts.evidenceId !== undefined && opts.evidenceId !== null) {\n      queryParams['evidenceId'] = opts.evidenceId\n    }\n    if (opts.applicantIdType !== undefined && opts.applicantIdType !== null) {\n      queryParams['applicantIdType'] = opts.applicantIdType\n    }\n    if (opts.applicantIdNum !== undefined && opts.applicantIdNum !== null) {\n      queryParams['applicantIdNum'] = opts.applicantIdNum\n    }\n    if (opts.messageId !== undefined && opts.messageId !== null) {\n      queryParams['messageId'] = opts.messageId\n    }\n    if (opts.evidenceType !== undefined && opts.evidenceType !== null) {\n      queryParams['evidenceType'] = opts.evidenceType\n    }\n    if (opts.messageDate !== undefined && opts.messageDate !== null) {\n      queryParams['messageDate'] = opts.messageDate\n    }\n    if (\n      opts.evidenceMessageId !== undefined &&\n      opts.evidenceMessageId !== null\n    ) {\n      queryParams['evidenceMessageId'] = opts.evidenceMessageId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getMultiEvidence with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/evidence:evidenceGetmulti',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取存证报告接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.businessId - 业务流水号\n      * @param {string} [opts.chainCode] - 业务代码  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string code\n      * @param string message\n      * @param boolean success\n      * @param evidenceFile data  存证报告文件\n      */\n\n  getSaveReport (opts, callback) {\n    opts = opts || {}\n\n    if (opts.businessId === undefined || opts.businessId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.businessId' when calling getSaveReport\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.businessId !== undefined && opts.businessId !== null) {\n      queryParams['businessId'] = opts.businessId\n    }\n    if (opts.chainCode !== undefined && opts.chainCode !== null) {\n      queryParams['chainCode'] = opts.chainCode\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSaveReport with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/evidence:evidenceGetSaveReport',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询服务开通状态\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string pin  用户pin\n      * @param integer usedCapacity  已用存储容量\n      * @param integer status  当前服务状态(0 未开通 1 开通中 2 正常 3 停服)\n      * @param boolean contractSaving  是否开启合同托管\n      * @param string kmsKeyId  签章系统所用的托管密钥\n      * @param string applyTime  申请开通服务时间\n      */\n\n  describeApplyStatus (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeApplyStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/manage:applyStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用合同存管\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableContractSave (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableContractSave with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/manage:enableContractSave',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用合同存管\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableContractSave (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableContractSave with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/manage:disableContractSave',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  签章系统加密密钥 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {} [opts.keyId] - KmsKeyId  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setKmsKeyId (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.keyId !== undefined && opts.keyId !== null) {\n      postBody['keyId'] = opts.keyId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setKmsKeyId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/manage:setKmsKeyId',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  申请证书\n      * @param {Object} opts - parameters\n      * @param {certSpec} opts.certSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      * @param string message\n      * @param string code\n      * @param certResp data\n      */\n\n  applyCert (opts, callback) {\n    opts = opts || {}\n\n    if (opts.certSpec === undefined || opts.certSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certSpec' when calling applyCert\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.certSpec !== undefined && opts.certSpec !== null) {\n      postBody['certSpec'] = opts.certSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call applyCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqCert:applyCert',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新证书\n      * @param {Object} opts - parameters\n      * @param {renewCertSpec} opts.renewCertSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      * @param string message\n      * @param string code\n      * @param certResp data\n      */\n\n  renewCert (opts, callback) {\n    opts = opts || {}\n\n    if (opts.renewCertSpec === undefined || opts.renewCertSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.renewCertSpec' when calling renewCert\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.renewCertSpec !== undefined && opts.renewCertSpec !== null) {\n      postBody['renewCertSpec'] = opts.renewCertSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call renewCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqCert:renewCert',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  变更证书\n      * @param {Object} opts - parameters\n      * @param {updateCertSpec} opts.updateCertSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      * @param string message\n      * @param string code\n      * @param certResp data\n      */\n\n  updateCert (opts, callback) {\n    opts = opts || {}\n\n    if (opts.updateCertSpec === undefined || opts.updateCertSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.updateCertSpec' when calling updateCert\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.updateCertSpec !== undefined && opts.updateCertSpec !== null) {\n      postBody['updateCertSpec'] = opts.updateCertSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqCert:updateCert',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  吊销证书\n      * @param {Object} opts - parameters\n      * @param {revokeCertSpec} opts.revokeCertSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  吊销是否成功，true 成功 false 失败\n      * @param string message\n      * @param string code\n      */\n\n  revokeCert (opts, callback) {\n    opts = opts || {}\n\n    if (opts.revokeCertSpec === undefined || opts.revokeCertSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revokeCertSpec' when calling revokeCert\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.revokeCertSpec !== undefined && opts.revokeCertSpec !== null) {\n      postBody['revokeCertSpec'] = opts.revokeCertSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call revokeCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqCert:revokeCert',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取已申请证书列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} [opts.caType] - 证书渠道  optional\n      * @param {string} [opts.name] - 个人用户姓名或企业名  optional\n      * @param {string} [opts.serialNo] - 证书序列号  optional\n      * @param {string} [opts.keyAlg] - 证书算法  optional\n      * @param {integer} [opts.certStatus] - 证书状态  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param certInfo certList\n      * @param integer totalCount  证书数量\n      */\n\n  describeCertList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.caType !== undefined && opts.caType !== null) {\n      queryParams['caType'] = opts.caType\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.serialNo !== undefined && opts.serialNo !== null) {\n      queryParams['serialNo'] = opts.serialNo\n    }\n    if (opts.keyAlg !== undefined && opts.keyAlg !== null) {\n      queryParams['keyAlg'] = opts.keyAlg\n    }\n    if (opts.certStatus !== undefined && opts.certStatus !== null) {\n      queryParams['certStatus'] = opts.certStatus\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCertList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqCert:list',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取印章列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} [opts.stampName] - 印章名称  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param stampInfo stampList\n      * @param integer totalCount  印章数量\n      * @param integer pageNumber  页码,默认为1\n      * @param integer pageSize  分页大小, 默认为10, 取值范围[10, 100]\n      */\n\n  describeStampList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.stampName !== undefined && opts.stampName !== null) {\n      queryParams['stampName'] = opts.stampName\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStampList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqStamp:describeStampList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上传印章\n      * @param {Object} opts - parameters\n      * @param {stampSpec} [opts.stampSpec]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string stampId  印章ID\n      */\n\n  uploadStamp (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.stampSpec !== undefined && opts.stampSpec !== null) {\n      postBody['stampSpec'] = opts.stampSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call uploadStamp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqStamp:uploadStamp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  此接口仅供前端使用\n1. 下载印章\n2. 多个印章id用逗号分隔\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.stampId - 印章ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  downloadStamps (opts, callback) {\n    opts = opts || {}\n\n    if (opts.stampId === undefined || opts.stampId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stampId' when calling downloadStamps\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      stampId: opts.stampId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call downloadStamps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqStamp/{stampId}:downloadStamps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  此接口仅供api使用\n1. 下载印章\n2. 多个印章id用逗号分隔\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.stampId - 印章ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param stampInfo stampList\n      */\n\n  downloadStampsNew (opts, callback) {\n    opts = opts || {}\n\n    if (opts.stampId === undefined || opts.stampId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stampId' when calling downloadStampsNew\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      stampId: opts.stampId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call downloadStampsNew with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqStampApi/{stampId}:downloadStamps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除印章 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.stampId - 印章ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteStamp (opts, callback) {\n    opts = opts || {}\n\n    if (opts.stampId === undefined || opts.stampId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stampId' when calling deleteStamp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      stampId: opts.stampId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteStamp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqStamp/{stampId}:deleteStamp',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  编辑印章 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} [opts.stampId] - 印章ID  optional\n      * @param {string} [opts.stampName] - 印章名称  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  true 成功 false 失败\n      * @param string message  响应消息\n      * @param string code  状态码\n      */\n\n  editStamp (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.stampId !== undefined && opts.stampId !== null) {\n      postBody['stampId'] = opts.stampId\n    }\n    if (opts.stampName !== undefined && opts.stampName !== null) {\n      postBody['stampName'] = opts.stampName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call editStamp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqStamp:editStamp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取印章日志列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {string} opts.stampId - 印章ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  true 成功 false 失败\n      * @param string message  响应消息\n      * @param string code  状态码\n      * @param pageStampHistoryResp data\n      */\n\n  describeStampHistoryList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.stampId === undefined || opts.stampId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stampId' when calling describeStampHistoryList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.stampId !== undefined && opts.stampId !== null) {\n      queryParams['stampId'] = opts.stampId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStampHistoryList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqStamphistory:describeStampHistoryList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取合同模板列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} [opts.templateNameOrTitle] - 合同模板名称或者标题  optional\n      * @param {string} [opts.templateType] - 模板类型 pdf,word,pdf-auto(不传查所有类型)  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param templateInfo templateList\n      * @param integer totalCount  合同模板数量\n      * @param integer pageNumber  页码，默认为1\n      * @param integer pageSize  分页大小, 默认为10, 取值范围[10, 100]\n      */\n\n  describeTemplateList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (\n      opts.templateNameOrTitle !== undefined &&\n      opts.templateNameOrTitle !== null\n    ) {\n      queryParams['templateNameOrTitle'] = opts.templateNameOrTitle\n    }\n    if (opts.templateType !== undefined && opts.templateType !== null) {\n      queryParams['templateType'] = opts.templateType\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTemplateList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqTemplate:describeTemplateList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上传合同模板\n      * @param {Object} opts - parameters\n      * @param {templateSpec} [opts.templateSpec]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string templateId  模板ID\n      */\n\n  uploadTemplate (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.templateSpec !== undefined && opts.templateSpec !== null) {\n      postBody['templateSpec'] = opts.templateSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call uploadTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqTemplate:uploadTemplate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  此接口仅供前端使用\n1. 下载合同模板\n2. 多个合同id用逗号分隔\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 合同模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  downloadTemplates (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling downloadTemplates\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call downloadTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqTemplate/{templateId}:downloadTemplates',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  此接口仅供api使用\n1. 下载合同模板\n2. 多个合同id用逗号分隔\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 合同模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param templateInfo templateList\n      */\n\n  downloadTemplatesNew (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling downloadTemplatesNew\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call downloadTemplatesNew with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqTemplateApi/{templateId}:downloadTemplates',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除合同模板 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 合同模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling deleteTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqTemplate/{templateId}:deleteTemplate',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  填充合同模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 合同模板ID\n      * @param {paddingSpec} opts.paddingSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string templateId  模板ID\n      */\n\n  paddingTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling paddingTemplate\"\n      )\n    }\n    if (opts.paddingSpec === undefined || opts.paddingSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.paddingSpec' when calling paddingTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.paddingSpec !== undefined && opts.paddingSpec !== null) {\n      postBody['paddingSpec'] = opts.paddingSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call paddingTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smqTemplate/{templateId}:paddingTemplate',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取印章列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} [opts.stampName] - 印章名称  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param stampInfo stampList\n      * @param integer totalCount  印章数量\n      * @param integer pageNumber  页码,默认为1\n      * @param integer pageSize  分页大小, 默认为10, 取值范围[10, 100]\n      */\n\n  describeStampList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.stampName !== undefined && opts.stampName !== null) {\n      queryParams['stampName'] = opts.stampName\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStampList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/stamp',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上传印章\n      * @param {Object} opts - parameters\n      * @param {stampSpec} opts.stampSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string stampId  印章ID\n      */\n\n  uploadStamp (opts, callback) {\n    opts = opts || {}\n\n    if (opts.stampSpec === undefined || opts.stampSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stampSpec' when calling uploadStamp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.stampSpec !== undefined && opts.stampSpec !== null) {\n      postBody['stampSpec'] = opts.stampSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call uploadStamp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/stamp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  1. 下载印章\n2. 多个印章id用逗号分隔\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.stampId - 印章ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  downloadStamps (opts, callback) {\n    opts = opts || {}\n\n    if (opts.stampId === undefined || opts.stampId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stampId' when calling downloadStamps\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      stampId: opts.stampId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call downloadStamps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/stamp/{stampId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除印章 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.stampId - 印章ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteStamp (opts, callback) {\n    opts = opts || {}\n\n    if (opts.stampId === undefined || opts.stampId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stampId' when calling deleteStamp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      stampId: opts.stampId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteStamp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/stamp/{stampId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取合同模板列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} [opts.templateNameOrTitle] - 合同模板名称或者标题  optional\n      * @param {string} [opts.templateType] - 模板类型 pdf,word,pdf-auto(不传查所有类型)  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param templateInfo templateList\n      * @param integer totalCount  合同模板数量\n      * @param integer pageNumber  页码，默认为1\n      * @param integer pageSize  分页大小, 默认为10, 取值范围[10, 100]\n      */\n\n  describeTemplateList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (\n      opts.templateNameOrTitle !== undefined &&\n      opts.templateNameOrTitle !== null\n    ) {\n      queryParams['templateNameOrTitle'] = opts.templateNameOrTitle\n    }\n    if (opts.templateType !== undefined && opts.templateType !== null) {\n      queryParams['templateType'] = opts.templateType\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTemplateList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/template',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上传合同模板\n      * @param {Object} opts - parameters\n      * @param {templateSpec} opts.templateSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string templateId  模板ID\n      */\n\n  uploadTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateSpec === undefined || opts.templateSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateSpec' when calling uploadTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.templateSpec !== undefined && opts.templateSpec !== null) {\n      postBody['templateSpec'] = opts.templateSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call uploadTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/template',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  1. 下载合同模板\n2. 多个合同id用逗号分隔\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 合同模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  downloadTemplates (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling downloadTemplates\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call downloadTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/template/{templateId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  填充合同模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 合同模板ID\n      * @param {paddingSpec} opts.paddingSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string templateId  填充完成的合同模板ID\n      */\n\n  paddingTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling paddingTemplate\"\n      )\n    }\n    if (opts.paddingSpec === undefined || opts.paddingSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.paddingSpec' when calling paddingTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.paddingSpec !== undefined && opts.paddingSpec !== null) {\n      postBody['paddingSpec'] = opts.paddingSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call paddingTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/template/{templateId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除合同模板 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 合同模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling deleteTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cloudsign/2.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/template/{templateId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = CLOUDSIGN\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/compile/v1/compile.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * code api\n * API related to build\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'compile'\nService._services[serviceId] = true\n\n/**\n * compile service.\n * @version 0.2.0\n */\n\nJDCloud.COMPILE = class COMPILE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'compile.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  创建Demo\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param job job\n      */\n\n  createDemo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDemo\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  compile/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDemo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/demo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询获取编译任务列表，并显示最后一次编译的一些信息\n/v2/regions/cn-south-1/jobs/?sorts.1.name&#x3D;status&amp;sorts.1.direction&#x3D;asc&amp;pageNumber&#x3D;1&amp;pageSize&#x3D;10&amp;filters.1.name&#x3D;name&amp;filters.1.values.1&#x3D;我的job\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - 编译任务名  optional\n      * @param {sort} [opts.sorts] - 对某一列排序  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param simpleJob jobs\n      * @param string requestId\n      */\n\n  getJobs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getJobs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, this.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  compile/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getJobs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jobs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新建构建任务\n      * @param {Object} opts - parameters\n      * @param {jobRequest} [opts.data]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string id  构建任务的uuid\n      * @param string codeRepoUrlLabel  项目所有者/项目名称\n      * @param boolean result  构建成功则是true\n      */\n\n  createJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.data !== undefined && opts.data !== null) {\n      postBody['data'] = opts.data\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  compile/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jobs',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量删除编译任务\n      * @param {Object} opts - parameters\n      * @param {string} [opts.jobIds] - 待删除job的UUID列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result  true表示删除成功，false表示删除失败\n      * @param string ids\n      */\n\n  deleteJobs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteJobs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, this.buildArrayParam(opts.jobIds, 'jobIds'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  compile/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteJobs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jobs',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据id获取构建任务的配置信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - Job uuid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param job job\n      */\n\n  getJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getJob\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  compile/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jobs/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新编译任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - job uuid\n      * @param {jobRequest} [opts.data]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string id  构建任务uuid\n      * @param string codeRepoUrlLabel  项目所有者/项目名称\n      * @param boolean result  更新成功则是true\n      */\n\n  updateJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling updateJob\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.data !== undefined && opts.data !== null) {\n      postBody['data'] = opts.data\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  compile/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jobs/{id}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一个编译任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 编译任务uuid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean commitresult  提交任务是否成功\n      */\n\n  deleteJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteJob\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  compile/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jobs/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据id启动一个编译任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - Job uuid\n      * @param {} [opts.category] - 类型branch/commit/tag  optional\n      * @param {} [opts.branch] - 类型对应的值  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean commitresult  提交任务是否成功\n      * @param string buildUuid  提交运行的构建任务的uuid\n      */\n\n  startJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling startJob\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.category !== undefined && opts.category !== null) {\n      postBody['category'] = opts.category\n    }\n    if (opts.branch !== undefined && opts.branch !== null) {\n      postBody['branch'] = opts.branch\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  compile/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jobs/{id}:start',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询构建任务执行日志\n      * @param {Object} opts - parameters\n      * @param {string} opts.jobid - job uuid\n      * @param {string} opts.id - 构建任务uuid\n      * @param {integer} [opts.offsetNumber] - 查询日志的偏移量, 默认为0  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string log\n      * @param integer offsetNumber\n      */\n\n  getBuildLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getBuildLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.jobid === undefined || opts.jobid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jobid' when calling getBuildLog\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getBuildLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.offsetNumber !== undefined && opts.offsetNumber !== null) {\n      queryParams['offsetNumber'] = opts.offsetNumber\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      jobid: opts.jobid,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  compile/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getBuildLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jobs/{jobid}/builds/{id}/log',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询构建任务执行的状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.jobid - job uuid\n      * @param {string} opts.id - 构建任务uuid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string name  执行任务的job名称\n      * @param integer createdAt  开始执行构建的时间\n      * @param string status  执行构建的状态\n      * @param number completionRate  执行构建完成的百分比\n      */\n\n  getBuildStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getBuildStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.jobid === undefined || opts.jobid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jobid' when calling getBuildStatus\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getBuildStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      jobid: opts.jobid,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  compile/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getBuildStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jobs/{jobid}/builds/{id}/status',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成带有效期的包地址\n      * @param {Object} opts - parameters\n      * @param {string} opts.jobid - job uuid\n      * @param {string} opts.id - 构建任务uuid\n      * @param {integer} [opts.expires] - 过期时间，单位秒， 默认1800秒  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string url\n      * @param string token\n      */\n\n  getExternalLink (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getExternalLink\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.jobid === undefined || opts.jobid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jobid' when calling getExternalLink\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getExternalLink\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.expires !== undefined && opts.expires !== null) {\n      queryParams['expires'] = opts.expires\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      jobid: opts.jobid,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  compile/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getExternalLink with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jobs/{jobid}/builds/{id}/externalLink',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止构建任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.jobid - job uuid\n      * @param {string} opts.id - 构建任务uuid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string id\n      * @param boolean result\n      */\n\n  stopBuild (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopBuild\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.jobid === undefined || opts.jobid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jobid' when calling stopBuild\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling stopBuild\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      jobid: opts.jobid,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  compile/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopBuild with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jobs/{jobid}/builds/{id}:stop',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.COMPILE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/containerregistry/v1/containerregistry.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Repository\n * 容器镜像仓库相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'containerregistry'\nService._services[serviceId] = true\n\n/**\n * containerregistry service.\n * @version 1.0.1\n */\n\nJDCloud.CONTAINERREGISTRY = class CONTAINERREGISTRY extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'containerregistry.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  &lt;p&gt;申请12小时有效期的令牌。 使用&lt;code&gt;docker&lt;/code&gt; CLI push和pull镜像。&lt;/p&gt;\n&lt;p&gt;&lt;code&gt;authorizationToken&lt;/code&gt;为每个registry返回一个base64编码的字符串，解码后&lt;code&gt;docker login&lt;/code&gt;命令\n可完成指定registry的鉴权。JCR CLI提供&lt;code&gt;jcr get-login&lt;/code&gt;进行认证处理。&lt;/p&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {integer} [opts.expiredAfterHours] - issue新token的过期时间, 可选参数为新生成令牌的过期时间，最大值为24小时，最小值为1小时，为空则默认为12小时过期时间。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string authorizationToken\n      * @param string loginCmdLine\n      * @param string expiresAt\n      */\n\n  getAuthorizationToken (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getAuthorizationToken\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling getAuthorizationToken\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.expiredAfterHours !== undefined &&\n      opts.expiredAfterHours !== null\n    ) {\n      postBody['expiredAfterHours'] = opts.expiredAfterHours\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAuthorizationToken with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}:getAuthorizationToken',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  &lt;p&gt;批量查询令牌。&lt;/p&gt;\n&lt;p&gt;暂时不支持分页和过滤条件。&lt;/p&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - token - 令牌 ID，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authorizationData authorizationTokens\n      * @param number totalCount\n      */\n\n  describeAuthorizationTokens (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAuthorizationTokens\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling describeAuthorizationTokens\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAuthorizationTokens with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}/tokens',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  释放用户 registry 的 token。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {string} [opts.authorizationToken] - 准备释放的 token ID，功能为指定token释放。  optional\n      * @param {boolean} [opts.forceAll] - true 表示强制删除用户当前registry下所有有效token的标志；false 表示删除所有有效token。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  releaseAuthorizationToken (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  releaseAuthorizationToken\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling releaseAuthorizationToken\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.authorizationToken !== undefined &&\n      opts.authorizationToken !== null\n    ) {\n      postBody['authorizationToken'] = opts.authorizationToken\n    }\n    if (opts.forceAll !== undefined && opts.forceAll !== null) {\n      postBody['forceAll'] = opts.forceAll\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call releaseAuthorizationToken with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}:releaseAuthorizationToken',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  返回指定repository中images的元数据，包括image size, image tags和creation date。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - registryName - 镜像仓储名称\nrepositoryName - 镜像库名称\nimageDigest - 镜像哈希值\nimageTag - 镜像标签\ntagStatus - 打标TAGGED或没打标UNTAGGED\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageDetail imageDetails\n      * @param number totalCount\n      */\n\n  describeImages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeImages\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeImages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/images',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除镜像\nimageDigest imageTag imageTagStatus 三者只能且必须传一个。\n可根据Tag状态删除Image，例如删除所有tagged的镜像。\ndigest和tag唯一表征单个镜像，其中imageDigest为sha256哈希，image manifest的digest。\n例如 sha256:examplee6d1e504117a17000003d3753086354a38375961f2e665416ef4b1b2f；image使用的tag, 如  &quot;precise&quot;\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {string} opts.repositoryName - 镜像仓库表名称\n      * @param {string} [opts.imageDigest] - sha256哈希，image manifest的digest.  optional\n      * @param {string} [opts.imageTag] - image使用的tag  optional\n      * @param {string} [opts.imageTagStatus] - 枚举中的一个值，如 tagged 和 untagged.  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling deleteImage\"\n      )\n    }\n    if (opts.repositoryName === undefined || opts.repositoryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.repositoryName' when calling deleteImage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.imageDigest !== undefined && opts.imageDigest !== null) {\n      postBody['imageDigest'] = opts.imageDigest\n    }\n    if (opts.imageTag !== undefined && opts.imageTag !== null) {\n      postBody['imageTag'] = opts.imageTag\n    }\n    if (opts.imageTagStatus !== undefined && opts.imageTagStatus !== null) {\n      postBody['imageTagStatus'] = opts.imageTagStatus\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName,\n      repositoryName: opts.repositoryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}/repositories/{repositoryName}:deleteImage',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询配额\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - resourceTypes - 资源类型，暂时只支持 [registry, repository]，支持同时查询两种配额。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quotas\n      */\n\n  describeQuotas (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuotas\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuotas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/quotas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询指定用户下所有 registry 详情。\n暂不支持 filter.\n\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param registry registries\n      */\n\n  describeRegistries (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRegistries\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRegistries with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  通过参数创建注册表。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 用户定义的registry名称。&lt;br&gt; DNS兼容registry名称规则如下：\n &lt;br&gt; 不可为空，且不能超过32字符 &lt;br&gt; 以小写字母开始和结尾，支持使用小写字母、数字、中划线(-)\n\n      * @param {string} [opts.description] - 注册表描述，&lt;a href&#x3D;&quot;https://www.jdcloud.com/help/detail/3870/isCatalog/1&quot;&gt;参考公共参数规范&lt;/a&gt;。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param registry registry\n      */\n\n  createRegistry (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createRegistry\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling createRegistry\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.registryName !== undefined && opts.registryName !== null) {\n      postBody['registryName'] = opts.registryName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRegistry with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定用户下某个 registry 详情。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param registry registry\n      */\n\n  describeRegistry (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRegistry\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling describeRegistry\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRegistry with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定用户下某个 registry.\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRegistry (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRegistry\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling deleteRegistry\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRegistry with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定注册表名称是否已经存在以及是否符合命名规范。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 待验证的注册表名。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  表示用户指定的注册表是否通过校验， 0 通过 1 名称为空 2 不符合规范 3 重名\n      * @param string reason  code字段非零时，给出详细原因。\n      */\n\n  checkRegistryName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkRegistryName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling checkRegistryName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.registryName !== undefined && opts.registryName !== null) {\n      postBody['registryName'] = opts.registryName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkRegistryName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries:checkRegistryName',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  通过参数创建镜像仓库。\n仓库名称可以分解为多个路径名，每个名称必须至少包含一个小写字母数字，考虑URL规范。\n支持包含段划线或者下划线进行分割，但不允许点&#39;.&#39;，多个路径名之间通过(&quot;/&quot;)连接，总长度不超过256个字符，当前只支持二级目录。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {string} opts.repositoryName - 镜像仓库名称。\n可以专有模式如默认命名空间nginx-web-app；或者和命名空间一起将多个仓库聚集在一起如 project-a/nginx-web-app。\n\n      * @param {string} [opts.description] - 注册表描述，&lt;a href&#x3D;&quot;https://www.jdcloud.com/help/detail/3870/isCatalog/1&quot;&gt;参考公共参数规范&lt;/a&gt;。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param repositoryShort repository\n      */\n\n  createRepository (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createRepository\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling createRepository\"\n      )\n    }\n    if (opts.repositoryName === undefined || opts.repositoryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.repositoryName' when calling createRepository\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.repositoryName !== undefined && opts.repositoryName !== null) {\n      postBody['repositoryName'] = opts.repositoryName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRepository with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}/repositories',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  描述用户指定 registry 下的 repository.\n\n      * @param {Object} opts - parameters\n      * @param {array} [opts.filters] - name - 仓库名称，模糊匹配，支持单个\n  optional\n      * @param {string} [opts.registryName] - 注册表名  optional\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param repository repositories\n      * @param number totalCount\n      */\n\n  describeRepositories (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRepositories\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n    if (opts.registryName !== undefined && opts.registryName !== null) {\n      postBody['registryName'] = opts.registryName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRepositories with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/listRepositories',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定用户下某个镜像仓库.\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {string} opts.repositoryName - 镜像仓库名称\n      * @param {boolean} [opts.force] - 是否强制删除有镜像的镜像仓库  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRepository (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRepository\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling deleteRepository\"\n      )\n    }\n    if (opts.repositoryName === undefined || opts.repositoryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.repositoryName' when calling deleteRepository\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.force !== undefined && opts.force !== null) {\n      queryParams['force'] = opts.force\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName,\n      repositoryName: opts.repositoryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRepository with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}/repositories/{repositoryName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定镜像仓库名称是否已经存在以及是否符合命名规范。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名。\n      * @param {string} opts.repositoryName - 待验证的镜像仓库名。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  表示用户指定的镜像仓库名是否通过校验， 0 通过 1 名称为空 2 不符合规范 3 重名\n      * @param string reason  code字段非零时，给出详细原因。\n      */\n\n  checkRepositoryName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkRepositoryName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling checkRepositoryName\"\n      )\n    }\n    if (opts.repositoryName === undefined || opts.repositoryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.repositoryName' when calling checkRepositoryName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.registryName !== undefined && opts.registryName !== null) {\n      postBody['registryName'] = opts.registryName\n    }\n    if (opts.repositoryName !== undefined && opts.repositoryName !== null) {\n      postBody['repositoryName'] = opts.repositoryName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  containerregistry/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkRepositoryName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/repositories:checkRepositoryName',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.CONTAINERREGISTRY\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/cp/v1/cp.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Partner UserAuth Management\n * Partner UserAuth Management API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'cp'\nService._services[serviceId] = true\n\n/**\n * cp service.\n * @version 0.2.5\n */\n\nclass CP extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'cp.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  createPartner\n      * @param {Object} opts - parameters\n      * @param {} [opts.pin] - 用户pin  optional\n      * @param {} [opts.authProvider] - 实名认证类型  optional\n      * @param {} [opts.roleName] - 角色名称  optional\n      * @param {} [opts.policyNames] - 策略名称  optional\n      * @param {} [opts.assumeRolePolicyDocument] - assumeRolePolicyDocument  optional\n      * @param {} [opts.roleDescription] - 角色描述信息  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string pin  客户京东云账号的唯一标识\n      * @param string partnerId  合作伙伴ID\n      */\n\n  createPartner (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.authProvider !== undefined && opts.authProvider !== null) {\n      postBody['authProvider'] = opts.authProvider\n    }\n    if (opts.roleName !== undefined && opts.roleName !== null) {\n      postBody['roleName'] = opts.roleName\n    }\n    if (opts.policyNames !== undefined && opts.policyNames !== null) {\n      postBody['policyNames'] = opts.policyNames\n    }\n    if (\n      opts.assumeRolePolicyDocument !== undefined &&\n      opts.assumeRolePolicyDocument !== null\n    ) {\n      postBody['assumeRolePolicyDocument'] = opts.assumeRolePolicyDocument\n    }\n    if (opts.roleDescription !== undefined && opts.roleDescription !== null) {\n      postBody['roleDescription'] = opts.roleDescription\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cp/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createPartner with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/partner',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  usercpcheck\n      * @param {Object} opts - parameters\n      * @param {userCpCheckInfo} opts.userCpCheckInfo\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean check  true-存在关联关系，false-不存在关联关系\n      * @param string userId  合作伙伴用户的userId\n      */\n\n  usercpcheck (opts, callback) {\n    opts = opts || {}\n\n    if (opts.userCpCheckInfo === undefined || opts.userCpCheckInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userCpCheckInfo' when calling usercpcheck\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.userCpCheckInfo !== undefined && opts.userCpCheckInfo !== null) {\n      postBody['userCpCheckInfo'] = opts.userCpCheckInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cp/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call usercpcheck with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/usercpcheck',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  setUserGrace\n      * @param {Object} opts - parameters\n      * @param {} [opts.pin] - 用户pin  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  true-设置成功， false-设置失败\n      */\n\n  setUserGrace (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cp/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setUserGrace with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/provider:graceSetting',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  getUserGrace\n      * @param {Object} opts - parameters\n      * @param {} [opts.pin] - 用户pin  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer periodResGraceDays  包周期宽限期天数\n      * @param integer periodResRetentionDays  包周期资源保留期天数\n      * @param integer onDemandResGraceDays  按需资源宽限期天数\n      */\n\n  getUserGrace (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cp/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getUserGrace with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/provider:graceInfo',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  partnerToken\n      * @param {Object} opts - parameters\n      * @param {string} opts.partnerId - 合作伙伴ID\n      * @param {partnerToken} opts.partnerToken\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string token  token\n      * @param string tokenOriginResult  置换aksk所用token的原始数据\n      * @param string partnerId  合作伙伴id\n      * @param integer tokenType  1- 合作伙伴token 2-合作伙伴用户token\n      * @param string expiresAt  token过期时间 示例 2022-06-24T12:09:58.888000Z, 响应参数为UTC时间格式，北京时间为UTC+8小时。如返回： 2020-01-08T02:56:19.587000Z  北京时间：2020-01-08 10:56:19.587\n      * @param string issuedAt  token下发时间 示例 2022-06-24T12:09:58.888000Z, 响应参数为UTC时间格式，北京时间为UTC+8小时。如返回： 2020-01-08T02:56:19.587000Z  北京时间：2020-01-08 10:56:19.587\n      */\n\n  partnerToken (opts, callback) {\n    opts = opts || {}\n\n    if (opts.partnerId === undefined || opts.partnerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.partnerId' when calling partnerToken\"\n      )\n    }\n    if (opts.partnerToken === undefined || opts.partnerToken === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.partnerToken' when calling partnerToken\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.partnerToken !== undefined && opts.partnerToken !== null) {\n      postBody['partnerToken'] = opts.partnerToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      partnerId: opts.partnerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cp/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call partnerToken with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/partner/{partnerId}/token',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  partnerStsToken\n      * @param {Object} opts - parameters\n      * @param {string} opts.partnerId - 合作伙伴ID\n      * @param {partnerStsToken} opts.partnerStsToken\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string access  AK\n      * @param string secret  SK\n      * @param string securitytoken  securitytoken是将所获的AK、SK等信息进行加密后的字符串。\n      * @param string expiresAt  AK/SK和securitytoken的过期时间。响应参数为UTC时间格式，北京时间为UTC+8小时。如返回： 2020-01-08T02:56:19.587000Z  北京时间：2020-01-08 10:56:19.587\n      * @param string issuedAt  token下发时间\n      */\n\n  partnerStsToken (opts, callback) {\n    opts = opts || {}\n\n    if (opts.partnerId === undefined || opts.partnerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.partnerId' when calling partnerStsToken\"\n      )\n    }\n    if (opts.partnerStsToken === undefined || opts.partnerStsToken === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.partnerStsToken' when calling partnerStsToken\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.partnerStsToken !== undefined && opts.partnerStsToken !== null) {\n      postBody['partnerStsToken'] = opts.partnerStsToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      partnerId: opts.partnerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cp/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call partnerStsToken with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/partner/{partnerId}/ststoken',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  checkUser\n      * @param {Object} opts - parameters\n      * @param {string} opts.partnerId - 合作伙伴ID\n      * @param {checkUserInfo} opts.checkUserInfo\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer status  0-该注册方式不存在，1-该注册方式已存在\n      */\n\n  checkUser (opts, callback) {\n    opts = opts || {}\n\n    if (opts.partnerId === undefined || opts.partnerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.partnerId' when calling checkUser\"\n      )\n    }\n    if (opts.checkUserInfo === undefined || opts.checkUserInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.checkUserInfo' when calling checkUser\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.checkUserInfo !== undefined && opts.checkUserInfo !== null) {\n      postBody['checkUserInfo'] = opts.checkUserInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      partnerId: opts.partnerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cp/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/partner/{partnerId}/user:checkUserInfo',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  sendVerificationCode\n      * @param {Object} opts - parameters\n      * @param {string} opts.partnerId - 合作伙伴ID\n      * @param {sendVerificationCodeInfo} opts.sendVerificationCodeInfo\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  sendVerificationCode (opts, callback) {\n    opts = opts || {}\n\n    if (opts.partnerId === undefined || opts.partnerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.partnerId' when calling sendVerificationCode\"\n      )\n    }\n    if (\n      opts.sendVerificationCodeInfo === undefined ||\n      opts.sendVerificationCodeInfo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sendVerificationCodeInfo' when calling sendVerificationCode\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.sendVerificationCodeInfo !== undefined &&\n      opts.sendVerificationCodeInfo !== null\n    ) {\n      postBody['sendVerificationCodeInfo'] = opts.sendVerificationCodeInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      partnerId: opts.partnerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cp/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call sendVerificationCode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/partner/{partnerId}/user:sendVerificationCode',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  createUser\n      * @param {Object} opts - parameters\n      * @param {string} opts.partnerId - 合作伙伴ID\n      * @param {createUserInfo} opts.createUserInfo\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string pin  客户京东云账号的唯一标识\n      * @param string userId  第三方系统的用户唯一标识，该标识的具体值由伙伴分配。\n      * @param string roleJrn  客户授权给合作伙伴使用的角色标识（Role&#39;s JDCloud Resource Name)，合作伙伴可以代入此角色，执行角色权限范围内的用户资源操作\n      * @param string accessKey  用户的accessKey\n      * @param string secretkey  用户secretKey\n      */\n\n  createUser (opts, callback) {\n    opts = opts || {}\n\n    if (opts.partnerId === undefined || opts.partnerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.partnerId' when calling createUser\"\n      )\n    }\n    if (opts.createUserInfo === undefined || opts.createUserInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createUserInfo' when calling createUser\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.createUserInfo !== undefined && opts.createUserInfo !== null) {\n      postBody['createUserInfo'] = opts.createUserInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      partnerId: opts.partnerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cp/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/partner/{partnerId}/user:createUser',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询合作伙伴下的用户列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.partnerId - 合作伙伴ID\n      * @param {string} [opts.pin] - 用户pin  optional\n      * @param {string} [opts.mobilePhone] - 用户用手机注册时的手机号，手机号包括国家码，以00开头，格式：00XX-XXXXXXXX。  optional\n      * @param {string} [opts.email] - 用户用邮箱注册时的邮箱  optional\n      * @param {integer} [opts.pageNumber] - 页码，默认1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认50，取值范围[10, 100]  optional\n      * @param {string} [opts.cooperationStartTime] - 按关联时间查询时，起始UTC时间。格式为：yyyy-MM-dd&#39;T&#39;HH:mm:ss。  optional\n      * @param {string} [opts.cooperationEndTime] - 按关联时间查询时，截止UTC时间。格式为：yyyy-MM-dd&#39;T&#39;HH:mm:ss。  optional\n      * @param {integer} [opts.status] - 按用户状态查询，0-全部(默认)，1-正常，-1-禁用  optional\n      * @param {integer} [opts.sort] - 排序规则：0-关联时间倒序排序(默认)，1-关联时间顺序排序  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总用户数\n      * @param partnerUserInfo users\n      */\n\n  listPartnerUsers (opts, callback) {\n    opts = opts || {}\n\n    if (opts.partnerId === undefined || opts.partnerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.partnerId' when calling listPartnerUsers\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n    if (opts.mobilePhone !== undefined && opts.mobilePhone !== null) {\n      queryParams['mobilePhone'] = opts.mobilePhone\n    }\n    if (opts.email !== undefined && opts.email !== null) {\n      queryParams['email'] = opts.email\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (\n      opts.cooperationStartTime !== undefined &&\n      opts.cooperationStartTime !== null\n    ) {\n      queryParams['cooperationStartTime'] = opts.cooperationStartTime\n    }\n    if (\n      opts.cooperationEndTime !== undefined &&\n      opts.cooperationEndTime !== null\n    ) {\n      queryParams['cooperationEndTime'] = opts.cooperationEndTime\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.sort !== undefined && opts.sort !== null) {\n      queryParams['sort'] = opts.sort\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      partnerId: opts.partnerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cp/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listPartnerUsers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/partner/{partnerId}/users',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  合作伙伴添加用户实名\n      * @param {Object} opts - parameters\n      * @param {string} opts.partnerId - 合作伙伴ID\n      * @param {string} opts.userId - 合作伙伴用户ID\n      * @param {userAuthInfo} opts.userAuthInfo\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createUserAuth (opts, callback) {\n    opts = opts || {}\n\n    if (opts.partnerId === undefined || opts.partnerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.partnerId' when calling createUserAuth\"\n      )\n    }\n    if (opts.userId === undefined || opts.userId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userId' when calling createUserAuth\"\n      )\n    }\n    if (opts.userAuthInfo === undefined || opts.userAuthInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userAuthInfo' when calling createUserAuth\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.userAuthInfo !== undefined && opts.userAuthInfo !== null) {\n      postBody['userAuthInfo'] = opts.userAuthInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      partnerId: opts.partnerId,\n      userId: opts.userId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cp/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createUserAuth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/partner/{partnerId}/user/{userId}:createUserAuth',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = CP\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/cps/v1/cps.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Cloud-Physical-Server\n * 云物理服务器私有网络操作相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'cps'\nService._services[serviceId] = true\n\n/**\n * cps service.\n * @version 2.4.3\n */\n\nclass CPS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'cps.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询别名IP列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.subnetId] - 子网ID  optional\n      * @param {string} [opts.instanceId] - 实例ID  optional\n      * @param {string} [opts.cidr] - CIDR段，模糊搜索  optional\n      * @param {filter} [opts.filters] - aliasIpId - 别名IP id&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param aliasIp aliasIps\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeAliasIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAliasIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      queryParams['subnetId'] = opts.subnetId\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.cidr !== undefined && opts.cidr !== null) {\n      queryParams['cidr'] = opts.cidr\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAliasIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/aliasIps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加别名IP\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {aliasIpSpec} opts.aliasIpSpec - 别名IP配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param aliasIpSuccessInfo successList\n      * @param aliasIpErrorInfo errorList\n      */\n\n  createAliasIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAliasIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.aliasIpSpec === undefined || opts.aliasIpSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aliasIpSpec' when calling createAliasIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.aliasIpSpec !== undefined && opts.aliasIpSpec !== null) {\n      postBody['aliasIpSpec'] = opts.aliasIpSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAliasIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/aliasIps',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除别名IP\n      * @param {Object} opts - parameters\n      * @param {string} opts.aliasIpId - 别名IP ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteAliasIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAliasIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.aliasIpId === undefined || opts.aliasIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aliasIpId' when calling deleteAliasIp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      queryParams['clientToken'] = opts.clientToken\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      aliasIpId: opts.aliasIpId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAliasIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/aliasIps/{aliasIpId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询证书列表&lt;br/&gt;\n支持分页查询，默认每页20条&lt;br/&gt;\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.name] - 证书名称  optional\n      * @param {filter} [opts.filters] - certId - 证书ID，精确匹配，支持多个&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cert certs\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeCerts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCerts\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCerts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/certs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建证书\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {certSpec} opts.certSpec - 弹性公网IP配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string certId  证书ID\n      */\n\n  createCert (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createCert\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.certSpec === undefined || opts.certSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certSpec' when calling createCert\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.certSpec !== undefined && opts.certSpec !== null) {\n      postBody['certSpec'] = opts.certSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/certs',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询证书详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.certId - 证书ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cert cert  证书详细信息\n      */\n\n  describeCert (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCert\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.certId === undefined || opts.certId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certId' when calling describeCert\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      certId: opts.certId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/certs/{certId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除证书\n      * @param {Object} opts - parameters\n      * @param {string} opts.certId - 证书ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  removeCert (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  removeCert\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.certId === undefined || opts.certId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certId' when calling removeCert\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      certId: opts.certId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/certs/{certId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改证书名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.certId - 证书ID\n      * @param {string} [opts.name] - 证书名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string certId  证书ID\n      * @param string name  证书名称\n      * @param string certificate  证书内容\n      * @param string createTime  创建时间\n      * @param integer listenerCount  证书关联监听器数量\n      */\n\n  modifyCert (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyCert\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.certId === undefined || opts.certId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certId' when calling modifyCert\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      certId: opts.certId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/certs/{certId}:modifyCert',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询弹性公网IP列表&lt;br/&gt;\n支持分页查询，默认每页20条&lt;br/&gt;\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.status] - 弹性公网IP状态，取值范围：associate、disassociate  optional\n      * @param {string} [opts.includeLB] - 是否包含负载均衡  optional\n      * @param {string} [opts.chargeMode] - 支付模式，取值为：prepaid_by_duration表示预付费，postpaid_by_duration表示按配置后付费  optional\n      * @param {string} [opts.instanceId] - 实例Id  optional\n      * @param {string} [opts.subnetId] - 子网Id  optional\n      * @param {filter} [opts.filters] - elasticIpId - 弹性公网IPID，精确匹配，支持多个&lt;br/&gt;\nelasticIp - 弹性公网IP，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param elasticIp elasticIps\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeElasticIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeElasticIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.includeLB !== undefined && opts.includeLB !== null) {\n      queryParams['includeLB'] = opts.includeLB\n    }\n    if (opts.chargeMode !== undefined && opts.chargeMode !== null) {\n      queryParams['chargeMode'] = opts.chargeMode\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      queryParams['subnetId'] = opts.subnetId\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeElasticIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  申请弹性公网IP\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {elasticIpSpec} opts.elasticIpSpec - 弹性公网IP配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string elasticIpIds\n      */\n\n  applyElasticIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  applyElasticIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.elasticIpSpec === undefined || opts.elasticIpSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpSpec' when calling applyElasticIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.elasticIpSpec !== undefined && opts.elasticIpSpec !== null) {\n      postBody['elasticIpSpec'] = opts.elasticIpSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call applyElasticIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询弹性公网IP详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.elasticIpId - 弹性公网IPID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param elasticIp elasticIp  弹性公网IP详细信息\n      */\n\n  describeElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling describeElasticIp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      elasticIpId: opts.elasticIpId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps/{elasticIpId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改弹性公网IP带宽\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.elasticIpId - 弹性公网IPID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {integer} opts.bandwidth - 带宽，单位Mbps，取值范围[1,200]\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  修改带宽是否成功\n      */\n\n  modifyElasticIpBandwidth (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyElasticIpBandwidth\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling modifyElasticIpBandwidth\"\n      )\n    }\n    if (opts.bandwidth === undefined || opts.bandwidth === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidth' when calling modifyElasticIpBandwidth\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.bandwidth !== undefined && opts.bandwidth !== null) {\n      postBody['bandwidth'] = opts.bandwidth\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      elasticIpId: opts.elasticIpId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyElasticIpBandwidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps/{elasticIpId}:modifyElasticIpBandwidth',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询EIP名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.elasticIpId - 弹性公网IPID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string name  EIP名称\n      */\n\n  describeElasticIpName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeElasticIpName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling describeElasticIpName\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      elasticIpId: opts.elasticIpId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeElasticIpName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIp/{elasticIpId}:describeElasticIpName',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询云物理服务器实例类型\n      * @param {Object} opts - parameters\n      * @param {string} [opts.az] - 可用区，精确匹配  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deviceType deviceTypes\n      */\n\n  describeDeviceTypes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeviceTypes\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.az !== undefined && opts.az !== null) {\n      queryParams['az'] = opts.az\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeviceTypes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/deviceTypes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询云物理服务器支持的操作系统\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceType - 实例类型，可调用接口（describeDeviceTypes）获取指定地域的实例类型，例如：cps.c.normal\n      * @param {string} [opts.osType] - 操作系统类型，取值范围：CentOS、Ubuntu、Windows  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param os oss\n      */\n\n  describeOS (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeOS\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.deviceType === undefined || opts.deviceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceType' when calling describeOS\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceType !== undefined && opts.deviceType !== null) {\n      queryParams['deviceType'] = opts.deviceType\n    }\n    if (opts.osType !== undefined && opts.osType !== null) {\n      queryParams['osType'] = opts.osType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeOS with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/os',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询某种实例类型的云物理服务器支持的RAID类型，可查询系统盘RAID类型和数据盘RAID类型\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceType - 实例类型，可调用（describeDeviceTypes）接口获取指定地域的实例类型，例如：cps.c.normal\n      * @param {string} [opts.volumeType] - 磁盘类型，取值范围：system、data  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param raid raids\n      */\n\n  describeDeviceRaids (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeviceRaids\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.deviceType === undefined || opts.deviceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceType' when calling describeDeviceRaids\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceType !== undefined && opts.deviceType !== null) {\n      queryParams['deviceType'] = opts.deviceType\n    }\n    if (opts.volumeType !== undefined && opts.volumeType !== null) {\n      queryParams['volumeType'] = opts.volumeType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeviceRaids with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/raids',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单台云物理服务器详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instance\n      */\n\n  describeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询云物理服务器详细信息&lt;br/&gt;\n支持分页查询，默认每页20条&lt;br/&gt;\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.az] - 可用区，精确匹配  optional\n      * @param {string} [opts.name] - 云物理服务器名称，支持模糊匹配  optional\n      * @param {string} [opts.networkType] - 网络类型，精确匹配，支持basic（基础网络）、vpc（私有网络）、retail（零售中台网络）  optional\n      * @param {string} [opts.deviceType] - 实例类型，精确匹配，调用接口（describeDeviceTypes）获取实例类型  optional\n      * @param {string} [opts.subnetId] - 子网ID  optional\n      * @param {string} [opts.keypairId] - 密钥对ID  optional\n      * @param {string} [opts.enableInternet] - 是否启用外网, yes、no  optional\n      * @param {string} [opts.privateIp] - 内网ip  optional\n      * @param {string} [opts.interfaceMode] - 实例网卡类型：bond（网卡bond）、dual（双网卡）  optional\n      * @param {filter} [opts.filters] - instanceId - 云物理服务器ID，精确匹配，支持多个&lt;br/&gt;\nstatus - 云物理服务器状态，参考云物理服务器状态，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instances\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.az !== undefined && opts.az !== null) {\n      queryParams['az'] = opts.az\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.networkType !== undefined && opts.networkType !== null) {\n      queryParams['networkType'] = opts.networkType\n    }\n    if (opts.deviceType !== undefined && opts.deviceType !== null) {\n      queryParams['deviceType'] = opts.deviceType\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      queryParams['subnetId'] = opts.subnetId\n    }\n    if (opts.keypairId !== undefined && opts.keypairId !== null) {\n      queryParams['keypairId'] = opts.keypairId\n    }\n    if (opts.enableInternet !== undefined && opts.enableInternet !== null) {\n      queryParams['enableInternet'] = opts.enableInternet\n    }\n    if (opts.privateIp !== undefined && opts.privateIp !== null) {\n      queryParams['privateIp'] = opts.privateIp\n    }\n    if (opts.interfaceMode !== undefined && opts.interfaceMode !== null) {\n      queryParams['interfaceMode'] = opts.interfaceMode\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一台或多台指定配置的云物理服务器&lt;br/&gt;\n- 地域与可用区&lt;br/&gt;\n  - 调用接口（describeRegiones）获取云物理服务器支持的地域与可用区&lt;br/&gt;\n- 实例类型&lt;br/&gt;\n  - 调用接口（describeDeviceTypes）获取物理实例类型列表&lt;br/&gt;\n  - 不能使用已下线、或已售馨的实例类型&lt;br/&gt;\n- 操作系统&lt;br/&gt;\n  - 可调用接口（describeOS）获取云物理服务器支持的操作系统列表&lt;br/&gt;\n- 存储&lt;br/&gt;\n  - 数据盘多种RAID可选，可调用接口（describeDeviceRaids）获取服务器支持的RAID列表&lt;br/&gt;\n- 网络&lt;br/&gt;\n  - 网络类型目前支持basic、vpc&lt;br/&gt;\n  - 线路目前只支持bgp&lt;br/&gt;\n  - 支持不启用外网，如果启用外网，带宽范围[1,200] 单位Mbps&lt;br/&gt;\n- 其他&lt;br/&gt;\n  - 购买时长，可按年或月购买：月取值范围[1,9], 年取值范围[1,3]&lt;br/&gt;\n  - 密码设置参考公共参数规范&lt;br/&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {instanceSpec} opts.instanceSpec - 描述云物理服务器配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceIds\n      */\n\n  createInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstances\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询云物理服务器名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string name  云物理服务器名称\n      */\n\n  describeInstanceName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceName\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeInstanceName',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  申请IPv6地址\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} [opts.ipv6Address] - IPv6地址  optional\n      * @param {string} opts.subnetId - 子网ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string ipv6Address  IPv6地址\n      */\n\n  assignIpv6Address (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  assignIpv6Address\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling assignIpv6Address\"\n      )\n    }\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling assignIpv6Address\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.ipv6Address !== undefined && opts.ipv6Address !== null) {\n      postBody['ipv6Address'] = opts.ipv6Address\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call assignIpv6Address with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:assignIpv6Address',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改云物理服务器部分信息，包括名称、描述\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} [opts.name] - 云物理服务器名称  optional\n      * @param {string} [opts.description] - 云物理服务器描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string name  云物理服务器名称\n      * @param string description  云物理服务器描述\n      */\n\n  modifyInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个云物理服务器已安装的RAID信息，包括系统盘RAID信息和数据盘RAID信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string sysRaidTypeId  系统盘RAID类型ID\n      * @param string sysRaidType  系统盘RAID类型\n      * @param string dataRaidTypeId  数据盘RAID类型ID\n      * @param string dataRaidType  数据盘RAID类型\n      */\n\n  describeInstanceRaid (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceRaid\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceRaid\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceRaid with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeInstanceRaid',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个云物理服务器硬件监控信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean cpus  CPU状态是否正常\n      * @param boolean mems  内存状态是否正常\n      * @param boolean disks  硬盘状态是否正常\n      * @param boolean nics  网卡状态是否正常\n      */\n\n  describeInstanceStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeInstanceStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重启单台云物理服务器，只能重启running状态的服务器 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  重启操作是否成功\n      */\n\n  restartInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restartInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling restartInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restartInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:restartInstance',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对单台云物理服务器执行关机操作，只能停止running状态的服务器 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  关机操作是否成功\n      */\n\n  stopInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling stopInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:stopInstance',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对单台云物理服务器执行开机操作，只能启动stopped状态的服务器\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  开机操作是否成功\n      */\n\n  startInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling startInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:startInstance',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量重启云物理服务器，只能重启running状态的服务器 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {array} [opts.instanceIds] - 资源id列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  重启操作是否成功\n      */\n\n  restartInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restartInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceIds !== undefined && opts.instanceIds !== null) {\n      postBody['instanceIds'] = opts.instanceIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restartInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:restartInstances',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量关闭云物理服务器，只能停止running状态的服务器 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {array} [opts.instanceIds] - 资源id列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  关机操作是否成功\n      */\n\n  stopInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceIds !== undefined && opts.instanceIds !== null) {\n      postBody['instanceIds'] = opts.instanceIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:stopInstances',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量开启云物理服务器，只能启动stopped状态的服务器\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {array} [opts.instanceIds] - 资源id列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  开机操作是否成功\n      */\n\n  startInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceIds !== undefined && opts.instanceIds !== null) {\n      postBody['instanceIds'] = opts.instanceIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:startInstances',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重装云物理服务器，只能重装stopped状态的服务器&lt;br/&gt;\n- 可调用接口（describeOS）获取云物理服务器支持的操作系统列表\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {reinstallInstanceSpec} opts.instanceSpec - 云物理服务器配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  重装操作是否成功\n      */\n\n  reinstallInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  reinstallInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling reinstallInstance\"\n      )\n    }\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling reinstallInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call reinstallInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:reinstallInstance',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  升级云物理服务器外网带宽，只能操作running或者stopped状态的服务器&lt;br/&gt;\n- 不支持未启用外网的服务器升级带宽\n- 外网带宽不支持降级\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {integer} opts.bandwidth - 外网带宽，单位Mbps，取值范围[1,200]\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  升级带宽是否成功\n      */\n\n  modifyBandwidth (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBandwidth\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyBandwidth\"\n      )\n    }\n    if (opts.bandwidth === undefined || opts.bandwidth === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidth' when calling modifyBandwidth\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.bandwidth !== undefined && opts.bandwidth !== null) {\n      postBody['bandwidth'] = opts.bandwidth\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBandwidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyBandwidth',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  绑定弹性公网IP\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.elasticIpId - 弹性公网IPID\n      * @param {string} [opts.targetIp] - 私有IP  optional\n      * @param {string} [opts.subnetId] - 主网口或辅网口的子网ID，多网口实例必填  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  绑定结果\n      */\n\n  associateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling associateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling associateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n    if (opts.targetIp !== undefined && opts.targetIp !== null) {\n      postBody['targetIp'] = opts.targetIp\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:associateElasticIp',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  解绑弹性公网IP\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.elasticIpId - 弹性公网IPId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  解绑结果\n      */\n\n  disassociateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disassociateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling disassociateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:disassociateElasticIp',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重置云物理服务器密码\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.password - 密码\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  重置结果\n      */\n\n  resetPassword (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resetPassword\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling resetPassword\"\n      )\n    }\n    if (opts.password === undefined || opts.password === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.password' when calling resetPassword\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.password !== undefined && opts.password !== null) {\n      postBody['password'] = opts.password\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resetPassword with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:resetPassword',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可用的私有IP列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {string} opts.subnetId - 主网口或者辅网口的子网id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string availablePrivateIps\n      */\n\n  describeAvailablePrivateIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAvailablePrivateIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAvailablePrivateIp\"\n      )\n    }\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling describeAvailablePrivateIp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      queryParams['subnetId'] = opts.subnetId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAvailablePrivateIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/availablePrivateIps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询云物理服务器监控信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {integer} [opts.startTime] - 开始时间的时间戳，格式：1562915166551  optional\n      * @param {integer} [opts.endTime] - 结束时间的时间戳，格式：1562915166551  optional\n      * @param {filter} [opts.filters] - metric - 监控指标，精确匹配，支持多个，具体如下&lt;br/&gt;\ncps.cpu.util - CPU使用率&lt;br/&gt;\ncps.memory.util - 内存使用率&lt;br/&gt;\ncps.memory.used - 内存使用量&lt;br/&gt;\ncps.disk.used - 磁盘使用量&lt;br/&gt;\ncps.disk.util - 磁盘使用率&lt;br/&gt;\ncps.disk.bytes.read - 磁盘读流量&lt;br/&gt;\ncps.disk.bytes.write - 磁盘写流量&lt;br/&gt;\ncps.disk.counts.read - 磁盘读IOPS&lt;br/&gt;\ncps.disk.counts.write - 磁盘写IOPS&lt;br/&gt;\ncps.network.bytes.ingress - 网卡进流量&lt;br/&gt;\ncps.network.bytes.egress - 网卡出流量&lt;br/&gt;\ncps.network.packets.ingress - 网络进包量&lt;br/&gt;\ncps.network.packets.egress - 网络出包量&lt;br/&gt;\ncps.avg.load1 - CPU平均负载1min&lt;br/&gt;\ncps.avg.load5 - CPU平均负载5min&lt;br/&gt;\ncps.avg.load15 - CPU平均负载15min&lt;br/&gt;\ncps.tcp.connect.total - TCP总连接数&lt;br/&gt;\ncps.tcp.connect.established - TCP正常连接数&lt;br/&gt;\ncps.process.total - 总进程数\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metricData metricDatas\n      */\n\n  describeInstanceMonitorInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceMonitorInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceMonitorInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceMonitorInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/monitor',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询云物理服务器监控报警日志信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云物理服务器ID\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param eventLog eventLogs\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeEventLogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeEventLogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeEventLogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeEventLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/describeEventLogs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询IPv6地址例详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.ipv6AddressId - IPv6地址ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipv6Address ipv6Address  IPv6地址详细信息\n      */\n\n  describeIpv6Address (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpv6Address\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.ipv6AddressId === undefined || opts.ipv6AddressId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipv6AddressId' when calling describeIpv6Address\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      ipv6AddressId: opts.ipv6AddressId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpv6Address with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ipv6Addresses/{ipv6AddressId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询IPv6地址列表&lt;br/&gt;\n支持分页查询，默认每页20条&lt;br/&gt;\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.ipv6GatewayId] - IPv6网关ID  optional\n      * @param {string} [opts.ipv6Address] - IPv6地址  optional\n      * @param {boolean} [opts.enableInternet] - 是否已开通公网  optional\n      * @param {filter} [opts.filters] - ipv6AddressId - IPv6地址ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipv6Address ipv6Addresses\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeIpv6Addresses (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpv6Addresses\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.ipv6GatewayId !== undefined && opts.ipv6GatewayId !== null) {\n      queryParams['ipv6GatewayId'] = opts.ipv6GatewayId\n    }\n    if (opts.ipv6Address !== undefined && opts.ipv6Address !== null) {\n      queryParams['ipv6Address'] = opts.ipv6Address\n    }\n    if (opts.enableInternet !== undefined && opts.enableInternet !== null) {\n      queryParams['enableInternet'] = opts.enableInternet\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpv6Addresses with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ipv6Addresses',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  申请IPv6地址带宽\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {ipv6AddressSpec} opts.ipv6AddressSpec - IPv6地址配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string ipv6AddressIds\n      */\n\n  assignIpv6AddressesBandwidth (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  assignIpv6AddressesBandwidth\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.ipv6AddressSpec === undefined || opts.ipv6AddressSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipv6AddressSpec' when calling assignIpv6AddressesBandwidth\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.ipv6AddressSpec !== undefined && opts.ipv6AddressSpec !== null) {\n      postBody['ipv6AddressSpec'] = opts.ipv6AddressSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call assignIpv6AddressesBandwidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ipv6Addresses',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改IPv6公网带宽\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.ipv6AddressId - IPv6地址ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {integer} opts.bandwidth - 带宽，单位Mbps，取值范围[1,200]\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  修改带宽是否成功\n      */\n\n  modifyIpv6AddressBandwidth (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyIpv6AddressBandwidth\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.ipv6AddressId === undefined || opts.ipv6AddressId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipv6AddressId' when calling modifyIpv6AddressBandwidth\"\n      )\n    }\n    if (opts.bandwidth === undefined || opts.bandwidth === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidth' when calling modifyIpv6AddressBandwidth\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.bandwidth !== undefined && opts.bandwidth !== null) {\n      postBody['bandwidth'] = opts.bandwidth\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      ipv6AddressId: opts.ipv6AddressId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyIpv6AddressBandwidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ipv6Addresses/{ipv6AddressId}:modifyIpv6AddressBandwidth',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询IPv6网关实例列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.ipv6GatewayName] - IPv6网关名称  optional\n      * @param {filter} [opts.filters] - ipv6GatewayId - IPv6网关实例ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipv6Gateway ipv6Gateways\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeIpv6Gateways (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpv6Gateways\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.ipv6GatewayName !== undefined && opts.ipv6GatewayName !== null) {\n      queryParams['ipv6GatewayName'] = opts.ipv6GatewayName\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpv6Gateways with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ipv6Gateways',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询IPv6网关实例详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.ipv6GatewayId - IPv6网关ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipv6Gateway ipv6Gateway  IPv6网关实例详细信息\n      */\n\n  describeIpv6Gateway (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpv6Gateway\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.ipv6GatewayId === undefined || opts.ipv6GatewayId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipv6GatewayId' when calling describeIpv6Gateway\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      ipv6GatewayId: opts.ipv6GatewayId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpv6Gateway with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ipv6Gateways/{ipv6GatewayId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改IPv6网关实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.ipv6GatewayId - IPv6网关ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} [opts.ipv6GatewayName] - IPv6网关实例名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipv6Gateway ipv6Gateway  IPv6网关实例详细信息\n      */\n\n  modifyIpv6Gateway (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyIpv6Gateway\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.ipv6GatewayId === undefined || opts.ipv6GatewayId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipv6GatewayId' when calling modifyIpv6Gateway\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.ipv6GatewayName !== undefined && opts.ipv6GatewayName !== null) {\n      postBody['ipv6GatewayName'] = opts.ipv6GatewayName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      ipv6GatewayId: opts.ipv6GatewayId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyIpv6Gateway with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ipv6Gateways/{ipv6GatewayId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询密钥对列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.name] - 密钥对名称  optional\n      * @param {filter} [opts.filters] - keypairId  - 密钥对ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param keypair keypairs\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeKeypairs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeKeypairs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeKeypairs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建密钥对\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.name - 密钥对名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string keypairId  密钥对id\n      * @param string region  地域\n      * @param string name  密钥对名称\n      * @param string publicKey  公钥\n      * @param string fingerPrint  指纹\n      * @param string createTime  创建时间\n      * @param string updateTime  更新时间\n      * @param string privateKey  私钥\n      */\n\n  createKeypairs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createKeypairs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createKeypairs\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createKeypairs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  导入密钥对\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.name - 密钥对名称\n      * @param {string} opts.publicKey - 公钥\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string keypairId  密钥对id\n      * @param string region  地域\n      * @param string name  密钥对名称\n      * @param string publicKey  公钥\n      * @param string fingerPrint  指纹\n      * @param string createTime  创建时间\n      * @param string updateTime  更新时间\n      */\n\n  importKeypairs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  importKeypairs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling importKeypairs\"\n      )\n    }\n    if (opts.publicKey === undefined || opts.publicKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publicKey' when calling importKeypairs\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.publicKey !== undefined && opts.publicKey !== null) {\n      postBody['publicKey'] = opts.publicKey\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call importKeypairs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs:import',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询密钥对详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.keypairId - 密钥对ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param keypair keypair  密钥对详细信息\n      */\n\n  describeKeypair (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeKeypair\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keypairId === undefined || opts.keypairId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keypairId' when calling describeKeypair\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      keypairId: opts.keypairId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeKeypair with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs/{keypairId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除密钥对\n      * @param {Object} opts - parameters\n      * @param {string} opts.keypairId - 密钥对ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteKeypairs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteKeypairs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keypairId === undefined || opts.keypairId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keypairId' when calling deleteKeypairs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      keypairId: opts.keypairId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteKeypairs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs/{keypairId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询监听器\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.name] - 名称  optional\n      * @param {string} [opts.loadBalancerId] - 负载均衡实例ID，精确匹配  optional\n      * @param {filter} [opts.filters] - listenerId - 监听器ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listener listeners\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeListeners (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeListeners\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.loadBalancerId !== undefined && opts.loadBalancerId !== null) {\n      queryParams['loadBalancerId'] = opts.loadBalancerId\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeListeners with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建监听器\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {listenerSpec} opts.listenerSpec - 监听器配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string listenerId  监听器ID\n      */\n\n  createListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listenerSpec === undefined || opts.listenerSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerSpec' when calling createListener\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.listenerSpec !== undefined && opts.listenerSpec !== null) {\n      postBody['listenerSpec'] = opts.listenerSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改监听器\n      * @param {Object} opts - parameters\n      * @param {string} opts.listenerId - 监听器ID\n      * @param {string} [opts.algorithm] - 调度算法  optional\n      * @param {string} [opts.stickySession] - 会话保持  optional\n      * @param {string} [opts.realIp] - 是否获取真实ip，取值范围on|off  optional\n      * @param {string} [opts.name] - 名称  optional\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} [opts.healthCheck] - 健康检查  optional\n      * @param {integer} [opts.healthCheckTimeout] - 健康检查响应的最大超时时间  optional\n      * @param {integer} [opts.healthCheckInterval] - 健康检查响应的最大间隔时间  optional\n      * @param {integer} [opts.healthyThreshold] - 健康检查结果为success的阈值  optional\n      * @param {integer} [opts.unhealthyThreshold] - 健康检查结果为fail的阈值  optional\n      * @param {string} [opts.serverGroupId] - 服务器组id  optional\n      * @param {integer} [opts.stickySessionTimeout] - 会话保持超时时间，单位s  optional\n      * @param {string} [opts.cookieType] - 会话类型，植入Cookie or 重写Cookie  optional\n      * @param {string} [opts.healthCheckUri] - 检查路径  optional\n      * @param {string} [opts.healthCheckHttpCode] - 正常态码，要使用的Http状态码  optional\n      * @param {string} [opts.certificateId] - 证书ID  optional\n      * @param {array} [opts.headers] - 获取HTTP头字段：X-Forwarded-For、X-Forwarded-Proto、X- Forwarded-Port、X-Forwarded-LBIP  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listener listener  监听器详细信息\n      */\n\n  modifyListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listenerId === undefined || opts.listenerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerId' when calling modifyListener\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.algorithm !== undefined && opts.algorithm !== null) {\n      postBody['algorithm'] = opts.algorithm\n    }\n    if (opts.stickySession !== undefined && opts.stickySession !== null) {\n      postBody['stickySession'] = opts.stickySession\n    }\n    if (opts.realIp !== undefined && opts.realIp !== null) {\n      postBody['realIp'] = opts.realIp\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.healthCheck !== undefined && opts.healthCheck !== null) {\n      postBody['healthCheck'] = opts.healthCheck\n    }\n    if (\n      opts.healthCheckTimeout !== undefined &&\n      opts.healthCheckTimeout !== null\n    ) {\n      postBody['healthCheckTimeout'] = opts.healthCheckTimeout\n    }\n    if (\n      opts.healthCheckInterval !== undefined &&\n      opts.healthCheckInterval !== null\n    ) {\n      postBody['healthCheckInterval'] = opts.healthCheckInterval\n    }\n    if (opts.healthyThreshold !== undefined && opts.healthyThreshold !== null) {\n      postBody['healthyThreshold'] = opts.healthyThreshold\n    }\n    if (\n      opts.unhealthyThreshold !== undefined &&\n      opts.unhealthyThreshold !== null\n    ) {\n      postBody['unhealthyThreshold'] = opts.unhealthyThreshold\n    }\n    if (opts.serverGroupId !== undefined && opts.serverGroupId !== null) {\n      postBody['serverGroupId'] = opts.serverGroupId\n    }\n    if (\n      opts.stickySessionTimeout !== undefined &&\n      opts.stickySessionTimeout !== null\n    ) {\n      postBody['stickySessionTimeout'] = opts.stickySessionTimeout\n    }\n    if (opts.cookieType !== undefined && opts.cookieType !== null) {\n      postBody['cookieType'] = opts.cookieType\n    }\n    if (opts.healthCheckUri !== undefined && opts.healthCheckUri !== null) {\n      postBody['healthCheckUri'] = opts.healthCheckUri\n    }\n    if (\n      opts.healthCheckHttpCode !== undefined &&\n      opts.healthCheckHttpCode !== null\n    ) {\n      postBody['healthCheckHttpCode'] = opts.healthCheckHttpCode\n    }\n    if (opts.certificateId !== undefined && opts.certificateId !== null) {\n      postBody['certificateId'] = opts.certificateId\n    }\n    if (opts.headers !== undefined && opts.headers !== null) {\n      postBody['headers'] = opts.headers\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      listenerId: opts.listenerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners/{listenerId}:modifyListenerAttributes',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询监听器详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.listenerId - 监听器ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listener listener  监听器详细信息\n      */\n\n  describeListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listenerId === undefined || opts.listenerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerId' when calling describeListener\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      listenerId: opts.listenerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners/{listenerId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除监听器\n      * @param {Object} opts - parameters\n      * @param {string} opts.listenerId - 监听器ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listenerId === undefined || opts.listenerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerId' when calling deleteListener\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      listenerId: opts.listenerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners/{listenerId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启监听器\n      * @param {Object} opts - parameters\n      * @param {string} opts.listenerId - 监听器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  开启监听器是否成功\n      */\n\n  startListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listenerId === undefined || opts.listenerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerId' when calling startListener\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      listenerId: opts.listenerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners/{listenerId}:startListener',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭监听器\n      * @param {Object} opts - parameters\n      * @param {string} opts.listenerId - 监听器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  关闭监听器是否成功\n      */\n\n  stopListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listenerId === undefined || opts.listenerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerId' when calling stopListener\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      listenerId: opts.listenerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners/{listenerId}:stopListener',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询负载均衡实例列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.status] - 状态  optional\n      * @param {string} [opts.name] - 名称  optional\n      * @param {string} [opts.vpcId] - 私有网络ID，精确匹配  optional\n      * @param {boolean} [opts.bindEip] - 是否绑定eip  optional\n      * @param {filter} [opts.filters] - loadBalancerId - 负载均衡实例ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param loadBalancer loadBalancers\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeLoadBalancers (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeLoadBalancers\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      queryParams['vpcId'] = opts.vpcId\n    }\n    if (opts.bindEip !== undefined && opts.bindEip !== null) {\n      queryParams['bindEip'] = opts.bindEip\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLoadBalancers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/slbs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建负载均衡实例\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {loadBalancerSpec} opts.loadBalancerSpec - 负载均衡配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string loadBalancerId  负载均衡实例ID\n      */\n\n  createLoadBalancer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createLoadBalancer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerSpec === undefined || opts.loadBalancerSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerSpec' when calling createLoadBalancer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.loadBalancerSpec !== undefined && opts.loadBalancerSpec !== null) {\n      postBody['loadBalancerSpec'] = opts.loadBalancerSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createLoadBalancer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/slbs',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改负载均衡实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - 负载均衡实例ID\n      * @param {string} [opts.name] - 名称  optional\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param loadBalancer loadBalancer  负载均衡实例详细信息\n      */\n\n  modifyLoadBalancer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyLoadBalancer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling modifyLoadBalancer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyLoadBalancer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/slbs/{loadBalancerId}:modifyLoadBalancerAttributes',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询负载均衡实例详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - 负载均衡实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param loadBalancer loadBalancer  负载均衡实例详细信息\n      */\n\n  describeLoadBalancer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeLoadBalancer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling describeLoadBalancer\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLoadBalancer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/slbs/{loadBalancerId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启负载均衡实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - 负载均衡实例ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  开启负载均衡实例是否成功\n      */\n\n  startLoadBalancer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startLoadBalancer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling startLoadBalancer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startLoadBalancer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/slbs/{loadBalancerId}:startLoadBalancer',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭负载均衡实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - 负载均衡实例ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  关闭负载均衡实例是否成功\n      */\n\n  stopLoadBalancer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopLoadBalancer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling stopLoadBalancer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopLoadBalancer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/slbs/{loadBalancerId}:stopLoadBalancer',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  绑定弹性公网IP\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - 负载均衡实例ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.elasticIpId - 弹性公网IPId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  绑定结果\n      */\n\n  associateElasticIpLB (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateElasticIpLB\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling associateElasticIpLB\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling associateElasticIpLB\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateElasticIpLB with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/slbs/{loadBalancerId}:associateElasticIp',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  解绑弹性公网IP\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - 负载均衡实例ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.elasticIpId - 弹性公网IPId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  解绑结果\n      */\n\n  disassociateElasticIpLB (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateElasticIpLB\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling disassociateElasticIpLB\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling disassociateElasticIpLB\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateElasticIpLB with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/slbs/{loadBalancerId}:disassociateElasticIp',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询SLB名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - 负载均衡实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string name  SLB名称\n      */\n\n  describeSlbsName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSlbsName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling describeSlbsName\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSlbsName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/slbs/{loadBalancerId}:describeSlbsName',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询云物理服务器地域列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.networkType] - 网络类型basic（基础网络）、vpc（私有网络）、retail（零售中台网络）, 默认basic  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param region regions\n      */\n\n  describeRegiones (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.networkType !== undefined && opts.networkType !== null) {\n      queryParams['networkType'] = opts.networkType\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRegiones with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询负载均衡地域列表\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param region regions\n      */\n\n  describeCPSLBRegions (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCPSLBRegions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/cpslbRegions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询路由表详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.routeTableId - 路由表ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param routeTable routeTable  路由表详细信息\n      */\n\n  describeRouteTable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRouteTable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.routeTableId === undefined || opts.routeTableId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.routeTableId' when calling describeRouteTable\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      routeTableId: opts.routeTableId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRouteTable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/routeTables/{routeTableId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询路由表列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.name] - 名称  optional\n      * @param {string} [opts.vpcId] - 私有网络ID，精确匹配  optional\n      * @param {filter} [opts.filters] - routeTableId - 路由表ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param routeTable routeTables\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeRouteTables (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRouteTables\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      queryParams['vpcId'] = opts.vpcId\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRouteTables with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/routeTables',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询次要CIDR列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - 子网ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param secondaryCidr secondaryCidrs\n      */\n\n  describeSecondaryCidrs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSecondaryCidrs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling describeSecondaryCidrs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      queryParams['subnetId'] = opts.subnetId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecondaryCidrs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secondaryCidrs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加次要CIDR\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {secondaryCidrSpec} opts.secondaryCidrSpec - 次要cidr配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string secondaryCidrId  次要cidr的ID\n      */\n\n  createSecondaryCidr (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSecondaryCidr\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.secondaryCidrSpec === undefined ||\n      opts.secondaryCidrSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secondaryCidrSpec' when calling createSecondaryCidr\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (\n      opts.secondaryCidrSpec !== undefined &&\n      opts.secondaryCidrSpec !== null\n    ) {\n      postBody['secondaryCidrSpec'] = opts.secondaryCidrSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSecondaryCidr with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secondaryCidrs',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除次要CIDR\n      * @param {Object} opts - parameters\n      * @param {string} opts.secondaryCidrId - 次要CIDR ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteSecondaryCidr (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSecondaryCidr\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.secondaryCidrId === undefined || opts.secondaryCidrId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secondaryCidrId' when calling deleteSecondaryCidr\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      queryParams['clientToken'] = opts.clientToken\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      secondaryCidrId: opts.secondaryCidrId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSecondaryCidr with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secondaryCidrs/{secondaryCidrId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询后端服务器列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.serverGroupId - 服务器组ID\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.listenerId] - 监听器Id  optional\n      * @param {filter} [opts.filters] - serverId - 后端服务器ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param server servers\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeServers (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeServers\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serverGroupId === undefined || opts.serverGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serverGroupId' when calling describeServers\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.listenerId !== undefined && opts.listenerId !== null) {\n      queryParams['listenerId'] = opts.listenerId\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      serverGroupId: opts.serverGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeServers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverGroups/{serverGroupId}/servers',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加后端服务器\n      * @param {Object} opts - parameters\n      * @param {string} opts.serverGroupId - 服务器组ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {array} [opts.serverSpec] - 后端服务器配置  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string serverIds\n      */\n\n  addServers (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addServers\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serverGroupId === undefined || opts.serverGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serverGroupId' when calling addServers\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.serverSpec !== undefined && opts.serverSpec !== null) {\n      postBody['serverSpec'] = opts.serverSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serverGroupId: opts.serverGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addServers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverGroups/{serverGroupId}/servers',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改后端服务器\n      * @param {Object} opts - parameters\n      * @param {string} opts.serverGroupId - 服务器组ID\n      * @param {string} opts.serverId - 后端服务器ID\n      * @param {integer} [opts.weight] - 权重  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string serverId  后端服务器ID\n      * @param string instanceId  后端云物理服务器ID\n      * @param string privateIp  内网Ip\n      * @param integer port  端口\n      * @param integer weight  后端云物理服务器权重\n      */\n\n  modifyServer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyServer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serverGroupId === undefined || opts.serverGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serverGroupId' when calling modifyServer\"\n      )\n    }\n    if (opts.serverId === undefined || opts.serverId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serverId' when calling modifyServer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.weight !== undefined && opts.weight !== null) {\n      postBody['weight'] = opts.weight\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serverGroupId: opts.serverGroupId,\n      serverId: opts.serverId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyServer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverGroups/{serverGroupId}/servers/{serverId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  移除后端服务器\n      * @param {Object} opts - parameters\n      * @param {string} opts.serverGroupId - 服务器组ID\n      * @param {string} opts.serverId - 后端服务器ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  removeServer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  removeServer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serverGroupId === undefined || opts.serverGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serverGroupId' when calling removeServer\"\n      )\n    }\n    if (opts.serverId === undefined || opts.serverId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serverId' when calling removeServer\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serverGroupId: opts.serverGroupId,\n      serverId: opts.serverId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeServer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverGroups/{serverGroupId}/servers/{serverId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询虚拟服务器组列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.name] - 名称  optional\n      * @param {string} [opts.loadBalancerId] - 负载均衡ID  optional\n      * @param {filter} [opts.filters] - serverGroupId   - 虚拟服务器组ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param serverGroup serverGroups\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeServerGroups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeServerGroups\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.loadBalancerId !== undefined && opts.loadBalancerId !== null) {\n      queryParams['loadBalancerId'] = opts.loadBalancerId\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeServerGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverGroups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建虚拟服务器组\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {serverGroupSpec} opts.serverGroupSpec - 虚拟服务器组配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string serverGroupId  服务器组ID\n      */\n\n  createServerGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createServerGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serverGroupSpec === undefined || opts.serverGroupSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serverGroupSpec' when calling createServerGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.serverGroupSpec !== undefined && opts.serverGroupSpec !== null) {\n      postBody['serverGroupSpec'] = opts.serverGroupSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createServerGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverGroups',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询虚拟服务器组\n      * @param {Object} opts - parameters\n      * @param {string} opts.serverGroupId - 服务器组ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param serverGroup serverGroup  服务器组详细信息\n      */\n\n  describeServerGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeServerGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serverGroupId === undefined || opts.serverGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serverGroupId' when calling describeServerGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serverGroupId: opts.serverGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeServerGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverGroups/{serverGroupId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改虚拟服务器组\n      * @param {Object} opts - parameters\n      * @param {string} opts.serverGroupId - 服务器组ID\n      * @param {string} [opts.name] - 名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string loadBalancerId  负载均衡ID\n      * @param string serverGroupId  服务器组ID\n      * @param string name  名称\n      */\n\n  modifyServerGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyServerGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serverGroupId === undefined || opts.serverGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serverGroupId' when calling modifyServerGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serverGroupId: opts.serverGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyServerGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverGroups/{serverGroupId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除虚拟服务器组\n      * @param {Object} opts - parameters\n      * @param {string} opts.serverGroupId - 服务器组ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteServerGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteServerGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serverGroupId === undefined || opts.serverGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serverGroupId' when calling deleteServerGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serverGroupId: opts.serverGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteServerGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverGroups/{serverGroupId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询基础网络子网\n      * @param {Object} opts - parameters\n      * @param {string} opts.az - 可用区, 如cn-east-1a；可调用接口（describeRegiones）获取云物理服务器在该地域支持的可用区\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subnet subnet  子网详细信息\n      */\n\n  describeBasicSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBasicSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.az === undefined || opts.az === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.az' when calling describeBasicSubnet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.az !== undefined && opts.az !== null) {\n      queryParams['az'] = opts.az\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBasicSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnet',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子网列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.az] - 可用区，精确匹配  optional\n      * @param {string} [opts.name] - 子网名称  optional\n      * @param {string} [opts.vpcId] - 私有网络ID，精确匹配  optional\n      * @param {filter} [opts.filters] - subnetId - 子网ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subnet subnets\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeSubnets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSubnets\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.az !== undefined && opts.az !== null) {\n      queryParams['az'] = opts.az\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      queryParams['vpcId'] = opts.vpcId\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubnets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建子网\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {subnetSpec} opts.subnetSpec - 子网配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string subnetId  子网ID\n      */\n\n  createSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetSpec === undefined || opts.subnetSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetSpec' when calling createSubnet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.subnetSpec !== undefined && opts.subnetSpec !== null) {\n      postBody['subnetSpec'] = opts.subnetSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  申请IPv6网段\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - 子网ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} [opts.ipv6Cidr] - 子网IPv6 CIDR  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  申请操作是否成功\n      */\n\n  assignIpv6Cidr (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  assignIpv6Cidr\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling assignIpv6Cidr\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.ipv6Cidr !== undefined && opts.ipv6Cidr !== null) {\n      postBody['ipv6Cidr'] = opts.ipv6Cidr\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subnetId: opts.subnetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call assignIpv6Cidr with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets/{subnetId}:assignIpv6Cidr',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子网详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - 子网ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subnet subnet  子网详细信息\n      */\n\n  describeSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling describeSubnet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subnetId: opts.subnetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets/{subnetId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改子网\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - 子网ID\n      * @param {string} [opts.name] - 名称  optional\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subnet subnet  子网详细信息\n      */\n\n  modifySubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifySubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling modifySubnet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subnetId: opts.subnetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifySubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets/{subnetId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除子网\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - 子网ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling deleteSubnet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      queryParams['clientToken'] = opts.clientToken\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      subnetId: opts.subnetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets/{subnetId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询私有网络详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - 私有网络ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpc vpc  私有网络详细信息\n      */\n\n  describeVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling describeVpc\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcId: opts.vpcId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs/{vpcId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改私有网络\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - 私有网络ID\n      * @param {string} [opts.name] - 名称  optional\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpc vpc  私有网络详细信息\n      */\n\n  modifyVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling modifyVpc\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcId: opts.vpcId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs/{vpcId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除私有网络\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - 私有网络ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling deleteVpc\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      queryParams['clientToken'] = opts.clientToken\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      vpcId: opts.vpcId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs/{vpcId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询私有网络列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.name] - 私有网络名称  optional\n      * @param {filter} [opts.filters] - vpcId - 私有网络ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpc vpcs\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeVpcs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVpcs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVpcs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建私有网络\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {vpcSpec} opts.vpcSpec - 子网配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string vpcId  私有网络ID\n      */\n\n  createVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcSpec === undefined || opts.vpcSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcSpec' when calling createVpc\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.vpcSpec !== undefined && opts.vpcSpec !== null) {\n      postBody['vpcSpec'] = opts.vpcSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  申请开通IPv6网关\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - 私有网络ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  申请操作是否成功\n      */\n\n  assignIpv6Gateway (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  assignIpv6Gateway\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling assignIpv6Gateway\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcId: opts.vpcId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cps/2.4.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call assignIpv6Gateway with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs/{vpcId}:assignIpv6Gateway',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = CPS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/cr/v1/cr.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Repository\n * 容器镜像仓库相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'cr'\nService._services[serviceId] = true\n\n/**\n * cr service.\n * @version 0.2.0\n */\n\nJDCloud.CR = class CR extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'cr.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  &lt;p&gt;申请12小时有效期的令牌。 使用&lt;code&gt;docker&lt;/code&gt; CLI push和pull镜像。&lt;/p&gt;\n&lt;p&gt;&lt;code&gt;authorizationToken&lt;/code&gt;为每个registry返回一个base64编码的字符串，解码后&lt;code&gt;docker login&lt;/code&gt;命令\n可完成指定registry的鉴权。JCR CLI提供&lt;code&gt;jcr get-login&lt;/code&gt;进行认证处理。&lt;/p&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {integer} [opts.expiredAfterHours] - issue新token的过期时间, 可选参数为新生成令牌的过期时间，最大值为24小时，最小值为1小时，为空则默认为12小时过期时间。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string authorizationToken\n      * @param string loginCmdLine\n      * @param string expiresAt\n      */\n\n  getAuthorizationToken (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getAuthorizationToken\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling getAuthorizationToken\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.expiredAfterHours !== undefined &&\n      opts.expiredAfterHours !== null\n    ) {\n      postBody['expiredAfterHours'] = opts.expiredAfterHours\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAuthorizationToken with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}:getAuthorizationToken',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  &lt;p&gt;批量查询令牌。&lt;/p&gt;\n&lt;p&gt;暂时不支持分页和过滤条件。&lt;/p&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - token - 令牌 ID，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param authorizationData authorizationTokens\n      * @param number totalCount\n      */\n\n  describeAuthorizationTokens (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAuthorizationTokens\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling describeAuthorizationTokens\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAuthorizationTokens with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}/tokens',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  释放用户 registry 的 token。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {string} [opts.authorizationToken] - 准备释放的 token ID，功能为指定token释放。  optional\n      * @param {boolean} [opts.forceAll] - true 表示强制删除用户当前registry下所有有效token的标志；false 表示删除所有有效token。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  releaseAuthorizationToken (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  releaseAuthorizationToken\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling releaseAuthorizationToken\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.authorizationToken !== undefined &&\n      opts.authorizationToken !== null\n    ) {\n      postBody['authorizationToken'] = opts.authorizationToken\n    }\n    if (opts.forceAll !== undefined && opts.forceAll !== null) {\n      postBody['forceAll'] = opts.forceAll\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call releaseAuthorizationToken with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}:releaseAuthorizationToken',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  返回指定repository中images的元数据，包括image size, image tags和creation date。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - registryName - 镜像仓储名称\nrepositoryName - 镜像库名称\nimageDigest - 镜像哈希值\nimageTag - 镜像标签\ntagStatus - 打标TAGGED或没打标UNTAGGED\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageDetail imageDetails\n      * @param number totalCount\n      */\n\n  describeImages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeImages\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeImages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/images',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除镜像\nimageDigest imageTag imageTagStatus 三者只能且必须传一个。\n可根据Tag状态删除Image，例如删除所有tagged的镜像。\ndigest和tag唯一表征单个镜像，其中imageDigest为sha256哈希，image manifest的digest。\n例如 sha256:examplee6d1e504117a17000003d3753086354a38375961f2e665416ef4b1b2f；image使用的tag, 如  &quot;precise&quot;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {string} opts.repositoryName - 镜像仓库表名称\n      * @param {string} [opts.imageDigest] - sha256哈希，image manifest的digest.  optional\n      * @param {string} [opts.imageTag] - image使用的tag  optional\n      * @param {string} [opts.imageTagStatus] - 枚举中的一个值，如 tagged 和 untagged.  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling deleteImage\"\n      )\n    }\n    if (opts.repositoryName === undefined || opts.repositoryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.repositoryName' when calling deleteImage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.imageDigest !== undefined && opts.imageDigest !== null) {\n      postBody['imageDigest'] = opts.imageDigest\n    }\n    if (opts.imageTag !== undefined && opts.imageTag !== null) {\n      postBody['imageTag'] = opts.imageTag\n    }\n    if (opts.imageTagStatus !== undefined && opts.imageTagStatus !== null) {\n      postBody['imageTagStatus'] = opts.imageTagStatus\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName,\n      repositoryName: opts.repositoryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}/repositories/{repositoryName}:deleteImage',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询配额\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - resourceTypes - 资源类型，暂时只支持 [registry, repository]，支持同时查询两种配额。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quotas\n      */\n\n  describeQuotas (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuotas\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuotas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/quotas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询指定用户下所有 registry 详情。\n暂不支持 filter.\n\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param registry registries\n      */\n\n  describeRegistries (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRegistries\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRegistries with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  通过参数创建注册表。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 用户定义的registry名称。&lt;br&gt; DNS兼容registry名称规则如下：\n &lt;br&gt; 不可为空，且不能超过32字符 &lt;br&gt; 以小写字母开始和结尾，支持使用小写字母、数字、中划线(-)\n\n      * @param {string} [opts.description] - 注册表描述，&lt;a href&#x3D;&quot;https://www.jdcloud.com/help/detail/3870/isCatalog/1&quot;&gt;参考公共参数规范&lt;/a&gt;。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param registry registry\n      */\n\n  createRegistry (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createRegistry\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling createRegistry\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.registryName !== undefined && opts.registryName !== null) {\n      postBody['registryName'] = opts.registryName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRegistry with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定用户下某个 registry 详情。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param registry registry\n      */\n\n  describeRegistry (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRegistry\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling describeRegistry\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRegistry with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定用户下某个 registry.\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRegistry (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRegistry\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling deleteRegistry\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRegistry with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定注册表名称是否已经存在以及是否符合命名规范。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 待验证的注册表名。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  表示用户指定的注册表是否通过校验， 0 通过 1 名称为空 2 不符合规范 3 重名\n      * @param string reason  code字段非零时，给出详细原因。\n      */\n\n  checkRegistryName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkRegistryName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling checkRegistryName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.registryName !== undefined && opts.registryName !== null) {\n      postBody['registryName'] = opts.registryName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkRegistryName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries:checkRegistryName',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  通过参数创建镜像仓库。\n仓库名称可以分解为多个路径名，每个名称必须至少包含一个小写字母数字，考虑URL规范。\n支持包含段划线或者下划线进行分割，但不允许点&#39;.&#39;，多个路径名之间通过(&quot;/&quot;)连接，总长度不超过256个字符，当前只支持二级目录。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {string} opts.repositoryName - 镜像仓库名称。\n可以专有模式如默认命名空间nginx-web-app；或者和命名空间一起将多个仓库聚集在一起如 project-a/nginx-web-app。\n\n      * @param {string} [opts.description] - 注册表描述，&lt;a href&#x3D;&quot;https://www.jdcloud.com/help/detail/3870/isCatalog/1&quot;&gt;参考公共参数规范&lt;/a&gt;。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param repositoryShort repository\n      */\n\n  createRepository (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createRepository\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling createRepository\"\n      )\n    }\n    if (opts.repositoryName === undefined || opts.repositoryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.repositoryName' when calling createRepository\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.repositoryName !== undefined && opts.repositoryName !== null) {\n      postBody['repositoryName'] = opts.repositoryName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRepository with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}/repositories',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  描述用户指定 registry 下的 repository.\n\n      * @param {Object} opts - parameters\n      * @param {array} [opts.filters] - name - 仓库名称，模糊匹配，支持单个\n  optional\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param repository repositories\n      * @param number totalCount\n      */\n\n  describeRepositories (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRepositories\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRepositories with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/listRepositories',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定用户下某个镜像仓库.\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名称\n      * @param {string} opts.repositoryName - 镜像仓库名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRepository (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRepository\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling deleteRepository\"\n      )\n    }\n    if (opts.repositoryName === undefined || opts.repositoryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.repositoryName' when calling deleteRepository\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      registryName: opts.registryName,\n      repositoryName: opts.repositoryName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRepository with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/registries/{registryName}/repositories/{repositoryName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定镜像仓库名称是否已经存在以及是否符合命名规范。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.registryName - 注册表名。\n      * @param {string} opts.repositoryName - 待验证的镜像仓库名。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  表示用户指定的镜像仓库名是否通过校验， 0 通过 1 名称为空 2 不符合规范 3 重名\n      * @param string reason  code字段非零时，给出详细原因。\n      */\n\n  checkRepositoryName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkRepositoryName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.registryName === undefined || opts.registryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.registryName' when calling checkRepositoryName\"\n      )\n    }\n    if (opts.repositoryName === undefined || opts.repositoryName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.repositoryName' when calling checkRepositoryName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.registryName !== undefined && opts.registryName !== null) {\n      postBody['registryName'] = opts.registryName\n    }\n    if (opts.repositoryName !== undefined && opts.repositoryName !== null) {\n      postBody['repositoryName'] = opts.repositoryName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  cr/0.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkRepositoryName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/repositories:checkRepositoryName',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.CR\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/datastar/v1/datastar.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 大屏数据查询接口\n * 陕西苹果大屏数据查询接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'datastar'\nService._services[serviceId] = true\n\n/**\n * datastar service.\n * @version 1.0.6\n */\n\nJDCloud.DATASTAR = class DATASTAR extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'datastar.cn-south-1.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  根据区域、行业、一级指标、二级指标、起始时间等条件查询数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.region - 查询区域，比如某某省或某某市（可选区域以最终授权为准）\n      * @param {string} opts.industry - 查询行业，比如某个水果或者农作物（可选行业以最终授权为准）\n      * @param {string} opts.startDate - 查询起始时间，格式如下：yyyy-MM-dd\n      * @param {string} opts.endDate - 查询结束时间，格式如下：yyyy-MM-dd\n      * @param {string} opts.firstIndex - 数据对应的第一级分析指标（可选一级指标以最终授权为准）\n      * @param {string} [opts.secondIndex] - 数据对应的第二级分析指标，如不填写，则默认把一级指标下的所有二级指标都查询出来（可选二级指标以最终授权为准）  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  true为成功，false为失败\n      * @param string message  描述信息\n      * @param regionIndustryDataList data  查询数据结果\n      */\n\n  getLargeScreenData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getLargeScreenData\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.region === undefined || opts.region === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.region' when calling getLargeScreenData\"\n      )\n    }\n    if (opts.industry === undefined || opts.industry === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.industry' when calling getLargeScreenData\"\n      )\n    }\n    if (opts.startDate === undefined || opts.startDate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startDate' when calling getLargeScreenData\"\n      )\n    }\n    if (opts.endDate === undefined || opts.endDate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endDate' when calling getLargeScreenData\"\n      )\n    }\n    if (opts.firstIndex === undefined || opts.firstIndex === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.firstIndex' when calling getLargeScreenData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.region !== undefined && opts.region !== null) {\n      queryParams['region'] = opts.region\n    }\n    if (opts.industry !== undefined && opts.industry !== null) {\n      queryParams['industry'] = opts.industry\n    }\n    if (opts.startDate !== undefined && opts.startDate !== null) {\n      queryParams['startDate'] = opts.startDate\n    }\n    if (opts.endDate !== undefined && opts.endDate !== null) {\n      queryParams['endDate'] = opts.endDate\n    }\n    if (opts.firstIndex !== undefined && opts.firstIndex !== null) {\n      queryParams['firstIndex'] = opts.firstIndex\n    }\n    if (opts.secondIndex !== undefined && opts.secondIndex !== null) {\n      queryParams['secondIndex'] = opts.secondIndex\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  datastar/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getLargeScreenData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/largeScreen/getData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.DATASTAR\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/dbaudit/v1/dbaudit.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Rule Interface\n * Rule Interface\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'dbaudit'\nService._services[serviceId] = true\n\n/**\n * dbaudit service.\n * @version 1.0.2\n */\n\nclass DBAUDIT extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'dbaudit.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  获取数据库审计agent主机列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - hostId: 云主机ID，精确匹配，支持多个  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param agentInfo list\n      */\n\n  describeAgentList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAgentList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAgentList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/agents',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  安装数据库审计agent\n      * @param {Object} opts - parameters\n      * @param {agentSpec} opts.agentSpec - 数据库审计agent配置信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string message  安装信息\n      */\n\n  installAgent (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  installAgent\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agentSpec === undefined || opts.agentSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agentSpec' when calling installAgent\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.agentSpec !== undefined && opts.agentSpec !== null) {\n      postBody['agentSpec'] = opts.agentSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call installAgent with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/agents',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  配置数据库审计信息\n      * @param {Object} opts - parameters\n      * @param {auditConfig} opts.auditConfig - 数据库审计信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setAuditConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setAuditConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.auditConfig === undefined || opts.auditConfig === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.auditConfig' when calling setAuditConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.auditConfig !== undefined && opts.auditConfig !== null) {\n      postBody['auditConfig'] = opts.auditConfig\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setAuditConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/agents',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取数据库审计agent审计的数据库列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.agentId - agentId\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} [opts.nameFilter] - 检索的数据库名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param auditInfo auditInfo\n      */\n\n  describeAgentDatabases (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAgentDatabases\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agentId === undefined || opts.agentId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agentId' when calling describeAgentDatabases\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.nameFilter !== undefined && opts.nameFilter !== null) {\n      queryParams['nameFilter'] = opts.nameFilter\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      agentId: opts.agentId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAgentDatabases with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/agents/{agentId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改agent资源限额,支持多个agentId,英文逗号分隔\n      * @param {Object} opts - parameters\n      * @param {string} opts.agentId - agentId\n      * @param {integer} [opts.limitStatus] - 是否限制 0 不限制 1 限制(cpuLimit/memLimit必填)  optional\n      * @param {integer} [opts.cpuLimit] - cpu使用限制（1%-50%）  optional\n      * @param {integer} [opts.memLimit] - 内存占用限额（1%-50%）  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modyfyAgentLimits (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modyfyAgentLimits\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agentId === undefined || opts.agentId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agentId' when calling modyfyAgentLimits\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.limitStatus !== undefined && opts.limitStatus !== null) {\n      postBody['limitStatus'] = opts.limitStatus\n    }\n    if (opts.cpuLimit !== undefined && opts.cpuLimit !== null) {\n      postBody['cpuLimit'] = opts.cpuLimit\n    }\n    if (opts.memLimit !== undefined && opts.memLimit !== null) {\n      postBody['memLimit'] = opts.memLimit\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      agentId: opts.agentId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modyfyAgentLimits with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/agents/{agentId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  卸载agent，支持批量，多个ID用英文逗号分隔\n      * @param {Object} opts - parameters\n      * @param {string} opts.agentId - agentId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  uninstallAgent (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  uninstallAgent\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agentId === undefined || opts.agentId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agentId' when calling uninstallAgent\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      agentId: opts.agentId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call uninstallAgent with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/agents/{agentId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改网卡信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.databaseId - 数据库ID\n      * @param {string} opts.agentId - agentId\n      * @param {array} [opts.netCards] - 网卡信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modyfyAuditNetCards (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modyfyAuditNetCards\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.databaseId === undefined || opts.databaseId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.databaseId' when calling modyfyAuditNetCards\"\n      )\n    }\n    if (opts.agentId === undefined || opts.agentId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agentId' when calling modyfyAuditNetCards\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.netCards !== undefined && opts.netCards !== null) {\n      postBody['netCards'] = opts.netCards\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      databaseId: opts.databaseId,\n      agentId: opts.agentId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modyfyAuditNetCards with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/agents/{agentId}/database/{databaseId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  取消对该数据库的审计，支持批量，多个ID用英文逗号分隔\n      * @param {Object} opts - parameters\n      * @param {string} opts.databaseId - 数据库ID\n      * @param {string} opts.agentId - agentId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteAuditFromAgent (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAuditFromAgent\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.databaseId === undefined || opts.databaseId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.databaseId' when calling deleteAuditFromAgent\"\n      )\n    }\n    if (opts.agentId === undefined || opts.agentId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agentId' when calling deleteAuditFromAgent\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      databaseId: opts.databaseId,\n      agentId: opts.agentId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAuditFromAgent with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/agents/{agentId}/database/{databaseId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取数据库列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string insDomain  Agent域名\n      * @param integer totalCount  总数量\n      * @param database list\n      */\n\n  describeDatabases (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDatabases\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling describeDatabases\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDatabases with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/databases',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新建数据库配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {databaseSpec} opts.databaseSpec - 数据库配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addDatabase (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addDatabase\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling addDatabase\"\n      )\n    }\n    if (opts.databaseSpec === undefined || opts.databaseSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.databaseSpec' when calling addDatabase\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.databaseSpec !== undefined && opts.databaseSpec !== null) {\n      postBody['databaseSpec'] = opts.databaseSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addDatabase with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/databases',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用数据库的双向审计\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.dbId - 数据库ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableAuditResponse (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableAuditResponse\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling enableAuditResponse\"\n      )\n    }\n    if (opts.dbId === undefined || opts.dbId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbId' when calling enableAuditResponse\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      dbId: opts.dbId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableAuditResponse with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/databases/{dbId}/auditResponse:enable',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用数据库的双向审计\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.dbId - 数据库ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableAuditResponse (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableAuditResponse\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling disableAuditResponse\"\n      )\n    }\n    if (opts.dbId === undefined || opts.dbId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbId' when calling disableAuditResponse\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      dbId: opts.dbId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableAuditResponse with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/databases/{dbId}/auditResponse:disable',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取数据库详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.dbId - 数据库ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param databaseDetail databaseDetail\n      */\n\n  describeDatabase (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDatabase\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling describeDatabase\"\n      )\n    }\n    if (opts.dbId === undefined || opts.dbId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbId' when calling describeDatabase\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      dbId: opts.dbId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDatabase with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/databases/{dbId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改数据库描述或配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.dbId - 数据库ID\n      * @param {databaseSpec} opts.databaseSpec\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateDatabase (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateDatabase\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling updateDatabase\"\n      )\n    }\n    if (opts.dbId === undefined || opts.dbId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbId' when calling updateDatabase\"\n      )\n    }\n    if (opts.databaseSpec === undefined || opts.databaseSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.databaseSpec' when calling updateDatabase\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.databaseSpec !== undefined && opts.databaseSpec !== null) {\n      postBody['databaseSpec'] = opts.databaseSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      dbId: opts.dbId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateDatabase with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/databases/{dbId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除数据库配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.dbId - 数据库ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDatabase (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDatabase\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling deleteDatabase\"\n      )\n    }\n    if (opts.dbId === undefined || opts.dbId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbId' when calling deleteDatabase\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      dbId: opts.dbId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDatabase with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/databases/{dbId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取数据库审计实例列表\npageNumber: 页码\npageSize: 每页数量\nnameFilter: 按名称查询\nfilters: 按instanceId 查询，只支持eq，单个instanceId匹配\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} [opts.nameFilter] - 列表过滤条件：数据库审计名称  optional\n      * @param {filter} [opts.filters] - 按instanceId 过滤  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param instanceAbstract list\n      */\n\n  describeInstanceList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.nameFilter !== undefined && opts.nameFilter !== null) {\n      queryParams['nameFilter'] = opts.nameFilter\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取数据库审计实例详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceAbstract instanceAbstract\n      */\n\n  describeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling describeInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改数据库审计实例名称和描述\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} [opts.insName] - 实例名称  optional\n      * @param {string} [opts.insDesc] - 实例描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling modifyInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.insName !== undefined && opts.insName !== null) {\n      postBody['insName'] = opts.insName\n    }\n    if (opts.insDesc !== undefined && opts.insDesc !== null) {\n      postBody['insDesc'] = opts.insDesc\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}:modifyInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取此实例的所有IP白名单列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string ipWhileList\n      * @param integer totalCount  IP白名单记录的数量\n      */\n\n  describeIpWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling describeIpWhiteList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ipwhitelist',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加一条IP白名单记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.cidr - IP白名单记录，支持掩码\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addIpWhiteItem (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addIpWhiteItem\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling addIpWhiteItem\"\n      )\n    }\n    if (opts.cidr === undefined || opts.cidr === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cidr' when calling addIpWhiteItem\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.cidr !== undefined && opts.cidr !== null) {\n      postBody['cidr'] = opts.cidr\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addIpWhiteItem with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ipwhitelist',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一条IP白名单记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.cidr - IP白名单记录，支持掩码\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteIpWhiteItem (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteIpWhiteItem\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling deleteIpWhiteItem\"\n      )\n    }\n    if (opts.cidr === undefined || opts.cidr === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cidr' when calling deleteIpWhiteItem\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.cidr !== undefined && opts.cidr !== null) {\n      queryParams['cidr'] = opts.cidr\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteIpWhiteItem with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ipwhitelist',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取审计日志列表\n时间范围[0-180天]\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} [opts.startTime] - 按照时间范围过滤，开始时间  optional\n      * @param {string} [opts.endTime] - 按照时间范围过滤，结束时间  optional\n      * @param {string} [opts.dbId] - 按照数据库Id过滤  optional\n      * @param {string} [opts.riskLevel] - 按照风险级别过滤: 0-&gt;无风险，1-&gt;低风险，2-&gt;中风险，3-&gt;高风险，4-&gt;致命风险，空字符串查询所有  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数\n      * @param auditLogAbstract list\n      */\n\n  describeAuditLogList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAuditLogList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling describeAuditLogList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbId !== undefined && opts.dbId !== null) {\n      queryParams['dbId'] = opts.dbId\n    }\n    if (opts.riskLevel !== undefined && opts.riskLevel !== null) {\n      queryParams['riskLevel'] = opts.riskLevel\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAuditLogList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/logs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看审计日志详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.logId - 审计日志ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param auditLogDetail auditLogDetail\n      */\n\n  describeAuditLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAuditLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling describeAuditLog\"\n      )\n    }\n    if (opts.logId === undefined || opts.logId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.logId' when calling describeAuditLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      logId: opts.logId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAuditLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/logs/{logId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取敏感信息遮蔽规则列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.dbId - 数据库ID\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数\n      * @param maskRuleDetail list\n      */\n\n  describeMaskRuleList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMaskRuleList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling describeMaskRuleList\"\n      )\n    }\n    if (opts.dbId === undefined || opts.dbId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbId' when calling describeMaskRuleList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      dbId: opts.dbId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMaskRuleList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/databases/{dbId}/maskRules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加敏感信息遮蔽规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.dbId - 数据库ID\n      * @param {maskRuleSpec} opts.maskRuleSpec - 敏感信息遮蔽规则\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addMaskRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addMaskRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling addMaskRule\"\n      )\n    }\n    if (opts.dbId === undefined || opts.dbId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbId' when calling addMaskRule\"\n      )\n    }\n    if (opts.maskRuleSpec === undefined || opts.maskRuleSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.maskRuleSpec' when calling addMaskRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.maskRuleSpec !== undefined && opts.maskRuleSpec !== null) {\n      postBody['maskRuleSpec'] = opts.maskRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      dbId: opts.dbId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addMaskRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/databases/{dbId}/maskRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  编辑敏感信息遮蔽规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.maskRuleId - 敏感信息遮蔽规则ID\n      * @param {string} opts.dbId - 数据库ID\n      * @param {maskRuleSpec} opts.maskRuleSpec - 敏感信息遮蔽规则\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyMask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyMask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling modifyMask\"\n      )\n    }\n    if (opts.maskRuleId === undefined || opts.maskRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.maskRuleId' when calling modifyMask\"\n      )\n    }\n    if (opts.dbId === undefined || opts.dbId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbId' when calling modifyMask\"\n      )\n    }\n    if (opts.maskRuleSpec === undefined || opts.maskRuleSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.maskRuleSpec' when calling modifyMask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.maskRuleSpec !== undefined && opts.maskRuleSpec !== null) {\n      postBody['maskRuleSpec'] = opts.maskRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      maskRuleId: opts.maskRuleId,\n      dbId: opts.dbId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyMask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/databases/{dbId}/maskRules/{maskRuleId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除敏感信息遮蔽规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.maskRuleId - 敏感信息遮蔽规则ID\n      * @param {string} opts.dbId - 数据库ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteMask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteMask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling deleteMask\"\n      )\n    }\n    if (opts.maskRuleId === undefined || opts.maskRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.maskRuleId' when calling deleteMask\"\n      )\n    }\n    if (opts.dbId === undefined || opts.dbId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbId' when calling deleteMask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      maskRuleId: opts.maskRuleId,\n      dbId: opts.dbId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteMask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/databases/{dbId}/maskRules/{maskRuleId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取任务列表\n一次性任务报表时间范围[0-30天]\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param taskInfo list\n      */\n\n  describeTaskList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTaskList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTaskList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tasks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建任务报表\n      * @param {Object} opts - parameters\n      * @param {taskSpec} opts.taskSpec - 报表配置信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId  创建的任务ID\n      */\n\n  createTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskSpec === undefined || opts.taskSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskSpec' when calling createTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskSpec !== undefined && opts.taskSpec !== null) {\n      postBody['taskSpec'] = opts.taskSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tasks',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动报表任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务ID\n      * @param {taskOpts} opts.taskOpts - 报表配置信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling startTask\"\n      )\n    }\n    if (opts.taskOpts === undefined || opts.taskOpts === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskOpts' when calling startTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskOpts !== undefined && opts.taskOpts !== null) {\n      postBody['taskOpts'] = opts.taskOpts\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tasks/{taskId}:start',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止报表任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务ID\n      * @param {taskOpts} opts.taskOpts - 报表配置信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling stopTask\"\n      )\n    }\n    if (opts.taskOpts === undefined || opts.taskOpts === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskOpts' when calling stopTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskOpts !== undefined && opts.taskOpts !== null) {\n      postBody['taskOpts'] = opts.taskOpts\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tasks/{taskId}:stop',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取任务下的报表列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务ID\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param reportInfo list\n      */\n\n  describeReportList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeReportList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling describeReportList\"\n      )\n    }\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeReportList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeReportList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tasks/{taskId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改任务的配置信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务ID\n      * @param {taskSpec} opts.taskSpec - 报表更新信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling modifyTask\"\n      )\n    }\n    if (opts.taskSpec === undefined || opts.taskSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskSpec' when calling modifyTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskSpec !== undefined && opts.taskSpec !== null) {\n      postBody['taskSpec'] = opts.taskSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tasks/{taskId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除此任务，如果任务下有报表，需要首先删除任务下的报表才能删除此任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务ID\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling deleteTask\"\n      )\n    }\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteTask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tasks/{taskId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  下载此任务报表\n      * @param {Object} opts - parameters\n      * @param {string} opts.reportId - 报表ID\n      * @param {string} opts.taskId - 任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  downloadReport (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  downloadReport\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.reportId === undefined || opts.reportId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.reportId' when calling downloadReport\"\n      )\n    }\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling downloadReport\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      reportId: opts.reportId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call downloadReport with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tasks/{taskId}/report/{reportId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除此任务报表\n      * @param {Object} opts - parameters\n      * @param {string} opts.reportId - 报表ID\n      * @param {string} opts.taskId - 任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteReport (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteReport\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.reportId === undefined || opts.reportId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.reportId' when calling deleteReport\"\n      )\n    }\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling deleteReport\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      reportId: opts.reportId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteReport with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tasks/{taskId}/report/{reportId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取规则组列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} [opts.dbId] - 数据库ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param ruleGroup list\n      */\n\n  describeRuleGroups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRuleGroups\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling describeRuleGroups\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.dbId !== undefined && opts.dbId !== null) {\n      queryParams['dbId'] = opts.dbId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRuleGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ruleGroups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新增规则组\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {ruleGroup} opts.ruleGroup - 规则组详情\n      * @param {string} [opts.dbId] - 数据库ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ruleGroup ruleGroup\n      */\n\n  addRuleGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addRuleGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling addRuleGroup\"\n      )\n    }\n    if (opts.ruleGroup === undefined || opts.ruleGroup === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleGroup' when calling addRuleGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ruleGroup !== undefined && opts.ruleGroup !== null) {\n      postBody['ruleGroup'] = opts.ruleGroup\n    }\n    if (opts.dbId !== undefined && opts.dbId !== null) {\n      postBody['dbId'] = opts.dbId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addRuleGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ruleGroups',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取规则组内规则列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.ruleGroupId - 规则组ID\n      * @param {string} [opts.dbId] - 数据库ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param rule list\n      */\n\n  describeRuleGroupRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRuleGroupRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling describeRuleGroupRules\"\n      )\n    }\n    if (opts.ruleGroupId === undefined || opts.ruleGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleGroupId' when calling describeRuleGroupRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.dbId !== undefined && opts.dbId !== null) {\n      queryParams['dbId'] = opts.dbId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      ruleGroupId: opts.ruleGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRuleGroupRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ruleGroups/{ruleGroupId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新增规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.ruleGroupId - 规则组ID\n      * @param {string} [opts.dbId] - 数据库ID  optional\n      * @param {rule} opts.rule - 规则详情\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling addRule\"\n      )\n    }\n    if (opts.ruleGroupId === undefined || opts.ruleGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleGroupId' when calling addRule\"\n      )\n    }\n    if (opts.rule === undefined || opts.rule === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.rule' when calling addRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dbId !== undefined && opts.dbId !== null) {\n      postBody['dbId'] = opts.dbId\n    }\n    if (opts.rule !== undefined && opts.rule !== null) {\n      postBody['rule'] = opts.rule\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      ruleGroupId: opts.ruleGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ruleGroups/{ruleGroupId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除规则组\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.ruleGroupId - 规则组ID\n      * @param {string} [opts.dbId] - 数据库ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRuleGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRuleGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling deleteRuleGroup\"\n      )\n    }\n    if (opts.ruleGroupId === undefined || opts.ruleGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleGroupId' when calling deleteRuleGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.dbId !== undefined && opts.dbId !== null) {\n      queryParams['dbId'] = opts.dbId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      ruleGroupId: opts.ruleGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRuleGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ruleGroups/{ruleGroupId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取规则详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.ruleGroupId - 规则组ID\n      * @param {string} opts.ruleId - 规则ID\n      * @param {string} [opts.dbId] - 数据库ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rule rule\n      */\n\n  describeRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling describeRule\"\n      )\n    }\n    if (opts.ruleGroupId === undefined || opts.ruleGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleGroupId' when calling describeRule\"\n      )\n    }\n    if (opts.ruleId === undefined || opts.ruleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleId' when calling describeRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.dbId !== undefined && opts.dbId !== null) {\n      queryParams['dbId'] = opts.dbId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      ruleGroupId: opts.ruleGroupId,\n      ruleId: opts.ruleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ruleGroups/{ruleGroupId}/rule/{ruleId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  编辑规则组内的规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.ruleGroupId - 规则组ID\n      * @param {string} opts.ruleId - 规则ID\n      * @param {rule} opts.rule - 规则详情\n      * @param {string} [opts.dbId] - 数据库ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling modifyRule\"\n      )\n    }\n    if (opts.ruleGroupId === undefined || opts.ruleGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleGroupId' when calling modifyRule\"\n      )\n    }\n    if (opts.ruleId === undefined || opts.ruleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleId' when calling modifyRule\"\n      )\n    }\n    if (opts.rule === undefined || opts.rule === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.rule' when calling modifyRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.rule !== undefined && opts.rule !== null) {\n      postBody['rule'] = opts.rule\n    }\n    if (opts.dbId !== undefined && opts.dbId !== null) {\n      postBody['dbId'] = opts.dbId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      ruleGroupId: opts.ruleGroupId,\n      ruleId: opts.ruleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ruleGroups/{ruleGroupId}/rule/{ruleId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.ruleGroupId - 规则组ID\n      * @param {string} opts.ruleId - 规则ID\n      * @param {string} [opts.dbId] - 数据库ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling deleteRule\"\n      )\n    }\n    if (opts.ruleGroupId === undefined || opts.ruleGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleGroupId' when calling deleteRule\"\n      )\n    }\n    if (opts.ruleId === undefined || opts.ruleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleId' when calling deleteRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.dbId !== undefined && opts.dbId !== null) {\n      queryParams['dbId'] = opts.dbId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      ruleGroupId: opts.ruleGroupId,\n      ruleId: opts.ruleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ruleGroups/{ruleGroupId}/rule/{ruleId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用规则组\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.ruleGroupId - 规则组ID\n      * @param {string} [opts.dbId] - 数据库ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableRuleGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableRuleGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling enableRuleGroup\"\n      )\n    }\n    if (opts.ruleGroupId === undefined || opts.ruleGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleGroupId' when calling enableRuleGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dbId !== undefined && opts.dbId !== null) {\n      postBody['dbId'] = opts.dbId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      ruleGroupId: opts.ruleGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableRuleGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ruleGroups/{ruleGroupId}:enable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用规则组\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.ruleGroupId - 规则组ID\n      * @param {string} [opts.dbId] - 数据库ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableRuleGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableRuleGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling disableRuleGroup\"\n      )\n    }\n    if (opts.ruleGroupId === undefined || opts.ruleGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleGroupId' when calling disableRuleGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dbId !== undefined && opts.dbId !== null) {\n      postBody['dbId'] = opts.dbId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      ruleGroupId: opts.ruleGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableRuleGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ruleGroups/{ruleGroupId}:disable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  下发规则组到指定dbIds\n      * @param {Object} opts - parameters\n      * @param {string} opts.insId - 审计实例ID\n      * @param {string} opts.ruleGroupId - 规则组ID\n      * @param {string} opts.dbIds - 数据库ID(多个用英文逗号分隔)\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deployRuleGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deployRuleGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.insId === undefined || opts.insId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.insId' when calling deployRuleGroup\"\n      )\n    }\n    if (opts.ruleGroupId === undefined || opts.ruleGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleGroupId' when calling deployRuleGroup\"\n      )\n    }\n    if (opts.dbIds === undefined || opts.dbIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbIds' when calling deployRuleGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dbIds !== undefined && opts.dbIds !== null) {\n      postBody['dbIds'] = opts.dbIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      insId: opts.insId,\n      ruleGroupId: opts.ruleGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbaudit/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deployRuleGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{insId}/ruleGroups/{ruleGroupId}:deploy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = DBAUDIT\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/dbs/v2/dbs.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 数据库备份服务\n * 数据库备份服务接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'dbs'\nService._services[serviceId] = true\n\n/**\n * dbs service.\n * @version 2.0.0\n */\n\nclass DBS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'dbs.jdcloud-api.com'\n    options.basePath = '/v2' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  Agent 注册接口\n      * @param {Object} opts - parameters\n      * @param {string} [opts.ip] - agent的IP  optional\n      * @param {string} opts.mac - agent的 MAC\n      * @param {string} [opts.hostname] - agent的hostname  optional\n      * @param {string} opts.stat - agent的状态\n      * @param {string} [opts.ver] - agent的版本号  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string createTime\n      * @param string hostname\n      * @param string id\n      * @param string ip  agent取到的出口ip\n      * @param string lastActiveTime  上次心跳汇报时间\n      * @param string name  用户自定义别名\n      * @param string stat  状态:idle,offline,deleted,executing\n      * @param string updateTime\n      * @param string version  版本号\n      */\n\n  agentRegister (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  agentRegister\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.mac === undefined || opts.mac === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.mac' when calling agentRegister\"\n      )\n    }\n    if (opts.stat === undefined || opts.stat === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stat' when calling agentRegister\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ip !== undefined && opts.ip !== null) {\n      postBody['ip'] = opts.ip\n    }\n    if (opts.mac !== undefined && opts.mac !== null) {\n      postBody['mac'] = opts.mac\n    }\n    if (opts.hostname !== undefined && opts.hostname !== null) {\n      postBody['hostname'] = opts.hostname\n    }\n    if (opts.stat !== undefined && opts.stat !== null) {\n      postBody['stat'] = opts.stat\n    }\n    if (opts.ver !== undefined && opts.ver !== null) {\n      postBody['ver'] = opts.ver\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call agentRegister with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/agent',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取agent的任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.agentId - Agent ID\n      * @param {string} [opts.stat] - agent的状态  optional\n      * @param {string} opts.mac - agent的MAC地址\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param agentTasks tasks\n      */\n\n  agentTasks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  agentTasks\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agentId === undefined || opts.agentId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agentId' when calling agentTasks\"\n      )\n    }\n    if (opts.mac === undefined || opts.mac === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.mac' when calling agentTasks\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.stat !== undefined && opts.stat !== null) {\n      queryParams['stat'] = opts.stat\n    }\n    if (opts.mac !== undefined && opts.mac !== null) {\n      queryParams['mac'] = opts.mac\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      agentId: opts.agentId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call agentTasks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/manage/{agentId}/tasks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取agent的备份计划\n      * @param {Object} opts - parameters\n      * @param {string} opts.agentId - Agent ID\n      * @param {string} opts.mac - agent的MAC地址\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param agentPlan plans\n      */\n\n  agentPlans (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  agentPlans\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agentId === undefined || opts.agentId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agentId' when calling agentPlans\"\n      )\n    }\n    if (opts.mac === undefined || opts.mac === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.mac' when calling agentPlans\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.mac !== undefined && opts.mac !== null) {\n      queryParams['mac'] = opts.mac\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      agentId: opts.agentId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call agentPlans with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/manage/{agentId}/plans',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上报任务的状态\n      * @param {Object} opts - parameters\n      * @param {object} opts.agent\n      * @param {string} opts.taskType\n      * @param {string} [opts.planId]   optional\n      * @param {integer} opts.progress\n      * @param {string} [opts.startTime]   optional\n      * @param {string} [opts.endTime]   optional\n      * @param {boolean} [opts.success]   optional\n      * @param {string} [opts.errorMessage]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string id\n      */\n\n  reportTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  reportTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agent === undefined || opts.agent === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agent' when calling reportTask\"\n      )\n    }\n    if (opts.taskType === undefined || opts.taskType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskType' when calling reportTask\"\n      )\n    }\n    if (opts.progress === undefined || opts.progress === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.progress' when calling reportTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.agent !== undefined && opts.agent !== null) {\n      postBody['agent'] = opts.agent\n    }\n    if (opts.taskType !== undefined && opts.taskType !== null) {\n      postBody['taskType'] = opts.taskType\n    }\n    if (opts.planId !== undefined && opts.planId !== null) {\n      postBody['planId'] = opts.planId\n    }\n    if (opts.progress !== undefined && opts.progress !== null) {\n      postBody['progress'] = opts.progress\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.success !== undefined && opts.success !== null) {\n      postBody['success'] = opts.success\n    }\n    if (opts.errorMessage !== undefined && opts.errorMessage !== null) {\n      postBody['errorMessage'] = opts.errorMessage\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call reportTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/task',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改任务状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - Task ID\n      * @param {integer} opts.progress\n      * @param {string} [opts.startTime]   optional\n      * @param {string} [opts.endTime]   optional\n      * @param {boolean} opts.success\n      * @param {string} [opts.errorMessage]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean ok\n      */\n\n  modifyTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling modifyTask\"\n      )\n    }\n    if (opts.progress === undefined || opts.progress === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.progress' when calling modifyTask\"\n      )\n    }\n    if (opts.success === undefined || opts.success === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.success' when calling modifyTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.progress !== undefined && opts.progress !== null) {\n      postBody['progress'] = opts.progress\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.success !== undefined && opts.success !== null) {\n      postBody['success'] = opts.success\n    }\n    if (opts.errorMessage !== undefined && opts.errorMessage !== null) {\n      postBody['errorMessage'] = opts.errorMessage\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/task/{taskId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上传备份文件信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.planId\n      * @param {string} opts.backupType\n      * @param {string} opts.dataSourceId\n      * @param {integer} opts.isManual - 0代表自动备份 1代表的是手动触发备份\n      * @param {string} opts.filename\n      * @param {string} opts.extInfo\n      * @param {string} opts.path\n      * @param {integer} opts.size\n      * @param {integer} [opts.srcSize]   optional\n      * @param {string} opts.storageType\n      * @param {string} opts.taskId\n      * @param {string} [opts.binlogStartTime]   optional\n      * @param {string} [opts.binlogEndTime]   optional\n      * @param {integer} [opts.binlogStartPos]   optional\n      * @param {integer} [opts.binlogEndPos]   optional\n      * @param {string} [opts.version]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string id\n      */\n\n  backupFile (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  backupFile\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.planId === undefined || opts.planId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.planId' when calling backupFile\"\n      )\n    }\n    if (opts.backupType === undefined || opts.backupType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupType' when calling backupFile\"\n      )\n    }\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling backupFile\"\n      )\n    }\n    if (opts.isManual === undefined || opts.isManual === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.isManual' when calling backupFile\"\n      )\n    }\n    if (opts.filename === undefined || opts.filename === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.filename' when calling backupFile\"\n      )\n    }\n    if (opts.extInfo === undefined || opts.extInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.extInfo' when calling backupFile\"\n      )\n    }\n    if (opts.path === undefined || opts.path === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.path' when calling backupFile\"\n      )\n    }\n    if (opts.size === undefined || opts.size === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.size' when calling backupFile\"\n      )\n    }\n    if (opts.storageType === undefined || opts.storageType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.storageType' when calling backupFile\"\n      )\n    }\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling backupFile\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.planId !== undefined && opts.planId !== null) {\n      postBody['planId'] = opts.planId\n    }\n    if (opts.backupType !== undefined && opts.backupType !== null) {\n      postBody['backupType'] = opts.backupType\n    }\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.isManual !== undefined && opts.isManual !== null) {\n      postBody['isManual'] = opts.isManual\n    }\n    if (opts.filename !== undefined && opts.filename !== null) {\n      postBody['filename'] = opts.filename\n    }\n    if (opts.extInfo !== undefined && opts.extInfo !== null) {\n      postBody['extInfo'] = opts.extInfo\n    }\n    if (opts.path !== undefined && opts.path !== null) {\n      postBody['path'] = opts.path\n    }\n    if (opts.size !== undefined && opts.size !== null) {\n      postBody['size'] = opts.size\n    }\n    if (opts.srcSize !== undefined && opts.srcSize !== null) {\n      postBody['srcSize'] = opts.srcSize\n    }\n    if (opts.storageType !== undefined && opts.storageType !== null) {\n      postBody['storageType'] = opts.storageType\n    }\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n    if (opts.binlogStartTime !== undefined && opts.binlogStartTime !== null) {\n      postBody['binlogStartTime'] = opts.binlogStartTime\n    }\n    if (opts.binlogEndTime !== undefined && opts.binlogEndTime !== null) {\n      postBody['binlogEndTime'] = opts.binlogEndTime\n    }\n    if (opts.binlogStartPos !== undefined && opts.binlogStartPos !== null) {\n      postBody['binlogStartPos'] = opts.binlogStartPos\n    }\n    if (opts.binlogEndPos !== undefined && opts.binlogEndPos !== null) {\n      postBody['binlogEndPos'] = opts.binlogEndPos\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call backupFile with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupFile',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上报预检查结果\n      * @param {Object} opts - parameters\n      * @param {object} opts.plan\n      * @param {string} opts.checkItem - 预检查任务项\n      * @param {boolean} opts.success - 是否成功\n      * @param {string} [opts.errorMessages] - 错误信息，仅sucess为false时返回  optional\n      * @param {string} opts.startTime\n      * @param {string} opts.endTime\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string jobId\n      */\n\n  reportPrecheck (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  reportPrecheck\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.plan === undefined || opts.plan === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.plan' when calling reportPrecheck\"\n      )\n    }\n    if (opts.checkItem === undefined || opts.checkItem === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.checkItem' when calling reportPrecheck\"\n      )\n    }\n    if (opts.success === undefined || opts.success === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.success' when calling reportPrecheck\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling reportPrecheck\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling reportPrecheck\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.plan !== undefined && opts.plan !== null) {\n      postBody['plan'] = opts.plan\n    }\n    if (opts.checkItem !== undefined && opts.checkItem !== null) {\n      postBody['checkItem'] = opts.checkItem\n    }\n    if (opts.success !== undefined && opts.success !== null) {\n      postBody['success'] = opts.success\n    }\n    if (opts.errorMessages !== undefined && opts.errorMessages !== null) {\n      postBody['errorMessages'] = opts.errorMessages\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call reportPrecheck with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/precheckPlan',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询已经注册的所有的 DBS agent\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，且为10的整数倍  optional\n      * @param {filter} [opts.filters] - 过滤参数，多个过滤参数之间的关系为“与”(and)\n支持以下属性的过滤：\nhostName, 支持operator选项：eq, like\nhostIP, 支持operator选项：eq, like\n  optional\n      * @param {sort} [opts.sorts] - 排序参数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param agent dbsAgents\n      */\n\n  describeAgents (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAgents\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAgents with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/agents',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 agent 详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.agentId - Agent ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param agentAttributes agentAttributes\n      */\n\n  describeAgentAttributes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAgentAttributes\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.agentId === undefined || opts.agentId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.agentId' when calling describeAgentAttributes\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      agentId: opts.agentId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAgentAttributes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/agents/{agentId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询备份计划概要\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，且为10的整数倍  optional\n      * @param {filter} [opts.filters] - 过滤参数，多个过滤参数之间的关系为“与”(and)\n支持以下属性的过滤：\ninstanceId, 支持operator选项：eq\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param backupPlan backupPlans\n      */\n\n  describeBackupPlans (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackupPlans\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackupPlans with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建备份计划\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 备份计划名称，支持中文、数字、大小写字母、英文下划线“_”、减号“-”，且不少于2字符不超过64字符\n      * @param {string} opts.servicePackage - DBS服务包类型是枚举值， dbs.common.package 表示基础服务包，不含备份流量\n      * @param {chargeSpec} opts.chargeSpec - 购买规格\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string buyId\n      * @param string orderNubmer\n      * @param string backupPlanId\n      */\n\n  createBackupPlan (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBackupPlan\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createBackupPlan\"\n      )\n    }\n    if (opts.servicePackage === undefined || opts.servicePackage === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.servicePackage' when calling createBackupPlan\"\n      )\n    }\n    if (opts.chargeSpec === undefined || opts.chargeSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.chargeSpec' when calling createBackupPlan\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.servicePackage !== undefined && opts.servicePackage !== null) {\n      postBody['servicePackage'] = opts.servicePackage\n    }\n    if (opts.chargeSpec !== undefined && opts.chargeSpec !== null) {\n      postBody['chargeSpec'] = opts.chargeSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBackupPlan with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询备份计划详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param backupPlanAttributes backupPlanAttributes\n      */\n\n  describeBackupPlanAttributes (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackupPlanAttributes\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling describeBackupPlanAttributes\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackupPlanAttributes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除备份计划\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteBackupPlan (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBackupPlan\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling deleteBackupPlan\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBackupPlan with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询预检查任务详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  预检查任务状态\n      * @param integer progress  预检查任务进度\n      * @param precheckPlan preCheckDetails\n      */\n\n  describePreCheck (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePreCheck\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling describePreCheck\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePreCheck with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:describePreCheck',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  初始化备份策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} opts.sourceEngine - 引擎类型 MySQL5  MySQL8  MariaDB  Percona\n      * @param {string} opts.backupType - 备份方式，支持物理备份或逻辑备份\n      * @param {boolean} [opts.enableBackupLogs] - 是否开启日志备份；true：开启；false：关闭  optional\n      * @param {integer} [opts.logBackupRetentionPeriod] - 日志备份保存天数，支持7-3650 天，默认7天  optional\n      * @param {integer} [opts.fullBackupRetentionPeriod] - 全量备份保存天数，支持7-3650 天，默认7天  optional\n      * @param {backupSchedule} opts.fullBackupSchedule - 全量备份的备份周期\n      * @param {sourceEndpoint} opts.sourceEndpoint - 备份目标的详细信息\n      * @param {backupObjects} [opts.backupObjects] - 逻辑备份中要备份的对象的信息，物理备份无须该信息  optional\n      * @param {boolean} opts.createNewEndpoint - 是否开启日志备份；true：开启；false：关闭\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  initBackupPlan (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  initBackupPlan\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling initBackupPlan\"\n      )\n    }\n    if (opts.sourceEngine === undefined || opts.sourceEngine === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sourceEngine' when calling initBackupPlan\"\n      )\n    }\n    if (opts.backupType === undefined || opts.backupType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupType' when calling initBackupPlan\"\n      )\n    }\n    if (\n      opts.fullBackupSchedule === undefined ||\n      opts.fullBackupSchedule === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fullBackupSchedule' when calling initBackupPlan\"\n      )\n    }\n    if (opts.sourceEndpoint === undefined || opts.sourceEndpoint === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sourceEndpoint' when calling initBackupPlan\"\n      )\n    }\n    if (\n      opts.createNewEndpoint === undefined ||\n      opts.createNewEndpoint === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createNewEndpoint' when calling initBackupPlan\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sourceEngine !== undefined && opts.sourceEngine !== null) {\n      postBody['sourceEngine'] = opts.sourceEngine\n    }\n    if (opts.backupType !== undefined && opts.backupType !== null) {\n      postBody['backupType'] = opts.backupType\n    }\n    if (opts.enableBackupLogs !== undefined && opts.enableBackupLogs !== null) {\n      postBody['enableBackupLogs'] = opts.enableBackupLogs\n    }\n    if (\n      opts.logBackupRetentionPeriod !== undefined &&\n      opts.logBackupRetentionPeriod !== null\n    ) {\n      postBody['logBackupRetentionPeriod'] = opts.logBackupRetentionPeriod\n    }\n    if (\n      opts.fullBackupRetentionPeriod !== undefined &&\n      opts.fullBackupRetentionPeriod !== null\n    ) {\n      postBody['fullBackupRetentionPeriod'] = opts.fullBackupRetentionPeriod\n    }\n    if (\n      opts.fullBackupSchedule !== undefined &&\n      opts.fullBackupSchedule !== null\n    ) {\n      postBody['fullBackupSchedule'] = opts.fullBackupSchedule\n    }\n    if (opts.sourceEndpoint !== undefined && opts.sourceEndpoint !== null) {\n      postBody['sourceEndpoint'] = opts.sourceEndpoint\n    }\n    if (opts.backupObjects !== undefined && opts.backupObjects !== null) {\n      postBody['backupObjects'] = opts.backupObjects\n    }\n    if (\n      opts.createNewEndpoint !== undefined &&\n      opts.createNewEndpoint !== null\n    ) {\n      postBody['createNewEndpoint'] = opts.createNewEndpoint\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call initBackupPlan with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:initBackupPlan',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  手动触发逻辑备份\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createLogicalBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createLogicalBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling createLogicalBackup\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createLogicalBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:createLogicalBackup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  手动触发物理备份\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createPhysicalBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createPhysicalBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling createPhysicalBackup\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createPhysicalBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:createPhysicalBackup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询所有的binlog备份结果\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，且为10的整数倍  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param binlogBackup binlogBackups\n      */\n\n  describeBinlogBackups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBinlogBackups\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling describeBinlogBackups\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBinlogBackups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:describeBinlogBackups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询所有的逻辑备份结果\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，且为10的整数倍  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param logicalBackups logicalBackups\n      */\n\n  describeLogicalBackups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeLogicalBackups\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling describeLogicalBackups\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLogicalBackups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:describeLogicalBackups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询所有的物理备份结果\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，且为10的整数倍  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param physicalBackups physicalBackups\n      */\n\n  describePhysicalBackups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePhysicalBackups\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling describePhysicalBackups\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePhysicalBackups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:describePhysicalBackups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取超过保留时长即需要删除的备份文件\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} opts.backupType - 备份的类型\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param shouldDelBackups shouldDelBackups\n      */\n\n  getShouldDelBackups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getShouldDelBackups\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling getShouldDelBackups\"\n      )\n    }\n    if (opts.backupType === undefined || opts.backupType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupType' when calling getShouldDelBackups\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.backupType !== undefined && opts.backupType !== null) {\n      queryParams['backupType'] = opts.backupType\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getShouldDelBackups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:shouldDelBackups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置超过保留时长的备份文件的状态为已删除\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} [opts.backupType]   optional\n      * @param {integer} [opts.totalCount]   optional\n      * @param {array} [opts.backupFiles]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean ok\n      */\n\n  updateShouldDelBackups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateShouldDelBackups\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling updateShouldDelBackups\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.backupType !== undefined && opts.backupType !== null) {\n      postBody['backupType'] = opts.backupType\n    }\n    if (opts.totalCount !== undefined && opts.totalCount !== null) {\n      postBody['totalCount'] = opts.totalCount\n    }\n    if (opts.backupFiles !== undefined && opts.backupFiles !== null) {\n      postBody['backupFiles'] = opts.backupFiles\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateShouldDelBackups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:shouldDelBackups',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取该备份计划最近备份成功的 binlog 文件\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param backupBriefInfo lastBackupBinlog\n      */\n\n  getLastBackupBinlog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getLastBackupBinlog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling getLastBackupBinlog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getLastBackupBinlog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:getLastBackupBinlog',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询当前备份计划下最近1年的恢复任务，按创建任务时间倒序排列\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，且为10的整数倍  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param restoreTask restoreTasks\n      */\n\n  describeRestoreTasks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRestoreTasks\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling describeRestoreTasks\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRestoreTasks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:describeRestoreTasks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据逻辑备份进行全量恢复\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} opts.backupId - 用于恢复的备份Id，仅限于本备份计划生成的备份\n      * @param {restoreSourceEndpoint} opts.sourceEndpoint - 备份实例的数据源信息\n      * @param {boolean} opts.createNewEndpoint - 是否是新建数据源；true：是；false：不是\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restoreLogicalBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restoreLogicalBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling restoreLogicalBackup\"\n      )\n    }\n    if (opts.backupId === undefined || opts.backupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupId' when calling restoreLogicalBackup\"\n      )\n    }\n    if (opts.sourceEndpoint === undefined || opts.sourceEndpoint === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sourceEndpoint' when calling restoreLogicalBackup\"\n      )\n    }\n    if (\n      opts.createNewEndpoint === undefined ||\n      opts.createNewEndpoint === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createNewEndpoint' when calling restoreLogicalBackup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.backupId !== undefined && opts.backupId !== null) {\n      postBody['backupId'] = opts.backupId\n    }\n    if (opts.sourceEndpoint !== undefined && opts.sourceEndpoint !== null) {\n      postBody['sourceEndpoint'] = opts.sourceEndpoint\n    }\n    if (\n      opts.createNewEndpoint !== undefined &&\n      opts.createNewEndpoint !== null\n    ) {\n      postBody['createNewEndpoint'] = opts.createNewEndpoint\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restoreLogicalBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:restoreLogicalBackup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物理备份进行全量恢复\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} opts.backupId - 用于恢复的备份Id，仅限于本备份计划生成的备份\n      * @param {restoreSourceEndpoint} opts.sourceEndpoint - 备份实例的数据源信息\n      * @param {boolean} opts.createNewEndpoint - 是否是新建数据源；true：是；false：不是\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restorePhysicalBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restorePhysicalBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling restorePhysicalBackup\"\n      )\n    }\n    if (opts.backupId === undefined || opts.backupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupId' when calling restorePhysicalBackup\"\n      )\n    }\n    if (opts.sourceEndpoint === undefined || opts.sourceEndpoint === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sourceEndpoint' when calling restorePhysicalBackup\"\n      )\n    }\n    if (\n      opts.createNewEndpoint === undefined ||\n      opts.createNewEndpoint === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createNewEndpoint' when calling restorePhysicalBackup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.backupId !== undefined && opts.backupId !== null) {\n      postBody['backupId'] = opts.backupId\n    }\n    if (opts.sourceEndpoint !== undefined && opts.sourceEndpoint !== null) {\n      postBody['sourceEndpoint'] = opts.sourceEndpoint\n    }\n    if (\n      opts.createNewEndpoint !== undefined &&\n      opts.createNewEndpoint !== null\n    ) {\n      postBody['createNewEndpoint'] = opts.createNewEndpoint\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restorePhysicalBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:restorePhysicalBackup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  将数据库实例根据物理备份和binlog备份恢复到指定的时间点。\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} opts.restoreTime - 数据库实例要恢复到的时间点，UTC时间格式：YYYY-MM-DDTHH:mm:ssZ\n      * @param {restoreSourceEndpoint} opts.sourceEndpoint - 备份实例的数据源信息\n      * @param {boolean} opts.createNewEndpoint - 是否是新建数据源；true：是；false：不是\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restoreToTime (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restoreToTime\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling restoreToTime\"\n      )\n    }\n    if (opts.restoreTime === undefined || opts.restoreTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restoreTime' when calling restoreToTime\"\n      )\n    }\n    if (opts.sourceEndpoint === undefined || opts.sourceEndpoint === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sourceEndpoint' when calling restoreToTime\"\n      )\n    }\n    if (\n      opts.createNewEndpoint === undefined ||\n      opts.createNewEndpoint === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createNewEndpoint' when calling restoreToTime\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.restoreTime !== undefined && opts.restoreTime !== null) {\n      postBody['restoreTime'] = opts.restoreTime\n    }\n    if (opts.sourceEndpoint !== undefined && opts.sourceEndpoint !== null) {\n      postBody['sourceEndpoint'] = opts.sourceEndpoint\n    }\n    if (\n      opts.createNewEndpoint !== undefined &&\n      opts.createNewEndpoint !== null\n    ) {\n      postBody['createNewEndpoint'] = opts.createNewEndpoint\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restoreToTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:restoreToTime',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除手动触发生成的备份文件\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} opts.backupId - 备份文件ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling deleteBackup\"\n      )\n    }\n    if (opts.backupId === undefined || opts.backupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupId' when calling deleteBackup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId,\n      backupId: opts.backupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}/backup/{backupId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改备份策略之逻辑备份的库表\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} [opts.database] - 数据库名称  optional\n      * @param {array} [opts.objects] - 表名, 如果不填或者为空，表示对整个数据库进行备份  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyBackupObjects (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBackupObjects\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling modifyBackupObjects\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.database !== undefined && opts.database !== null) {\n      postBody['database'] = opts.database\n    }\n    if (opts.objects !== undefined && opts.objects !== null) {\n      postBody['objects'] = opts.objects\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBackupObjects with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:modifyBackupObjects',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改备份策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} [opts.fullBackupPeriod] - 周期类型，目前仅支持weekly  optional\n      * @param {array} [opts.fullBackupDays] - 进行全量备份的日期, 备份周期为 weekly 时可以取 0-6 分别对应的是周日到周六  optional\n      * @param {string} [opts.fullBackupStartTime] - 全量备份的开始时间，精确到分,UTC时间格式，例如：23:30Z  optional\n      * @param {integer} [opts.fullBackupRetentionPeriod] - 全量备份保存天数，支持7-3650 天，默认7天  optional\n      * @param {integer} [opts.logBackupRetentionPeriod] - 日志备份保存天数，支持7-3650 天，默认7天  optional\n      * @param {boolean} [opts.enableBackupLogs] - 是否开启日志备份；true：开启；false：关闭  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyBackupPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBackupPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling modifyBackupPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.fullBackupPeriod !== undefined && opts.fullBackupPeriod !== null) {\n      postBody['fullBackupPeriod'] = opts.fullBackupPeriod\n    }\n    if (opts.fullBackupDays !== undefined && opts.fullBackupDays !== null) {\n      postBody['fullBackupDays'] = opts.fullBackupDays\n    }\n    if (\n      opts.fullBackupStartTime !== undefined &&\n      opts.fullBackupStartTime !== null\n    ) {\n      postBody['fullBackupStartTime'] = opts.fullBackupStartTime\n    }\n    if (\n      opts.fullBackupRetentionPeriod !== undefined &&\n      opts.fullBackupRetentionPeriod !== null\n    ) {\n      postBody['fullBackupRetentionPeriod'] = opts.fullBackupRetentionPeriod\n    }\n    if (\n      opts.logBackupRetentionPeriod !== undefined &&\n      opts.logBackupRetentionPeriod !== null\n    ) {\n      postBody['logBackupRetentionPeriod'] = opts.logBackupRetentionPeriod\n    }\n    if (opts.enableBackupLogs !== undefined && opts.enableBackupLogs !== null) {\n      postBody['enableBackupLogs'] = opts.enableBackupLogs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBackupPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:modifyBackupPolicy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改备份策略之数据源的账号密码等\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} [opts.accountName] - 源数据库的账号  optional\n      * @param {string} [opts.password] - 源数据库的密码  optional\n      * @param {engineRelatedConfig} [opts.engineRelatedConfig] - 不同数据库引擎独有的配置参数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifySourceEndpoint (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifySourceEndpoint\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling modifySourceEndpoint\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountName !== undefined && opts.accountName !== null) {\n      postBody['accountName'] = opts.accountName\n    }\n    if (opts.password !== undefined && opts.password !== null) {\n      postBody['password'] = opts.password\n    }\n    if (\n      opts.engineRelatedConfig !== undefined &&\n      opts.engineRelatedConfig !== null\n    ) {\n      postBody['engineRelatedConfig'] = opts.engineRelatedConfig\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifySourceEndpoint with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:modifySourceEndpoint',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动备份计划\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startBackupPlan (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startBackupPlan\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling startBackupPlan\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startBackupPlan with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:startBackupPlan',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止备份计划\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupPlanId - 备份计划ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopBackupPlan (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopBackupPlan\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupPlanId === undefined || opts.backupPlanId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPlanId' when calling stopBackupPlan\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupPlanId: opts.backupPlanId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dbs/2.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopBackupPlan with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupPlans/{backupPlanId}:stopBackupPlan',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = DBS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/dcap/v1/dcap.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * UserPackage\n * 敏感数据保护-用户套餐相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'dcap'\nService._services[serviceId] = true\n\n/**\n * dcap service.\n * @version 1.0.1\n */\n\nclass DCAP extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'dcap.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  敏感数据分级列表\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param levelSpec list\n      * @param integer totalCount  总数量\n      */\n\n  describeLevelList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLevelList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/level',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改敏感数据分级策略\n      * @param {Object} opts - parameters\n      * @param {integer} opts.levelId - 分级 ID\n      * @param {levelSpec} opts.levelSpec - 敏感数据分级描述\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyLevel (opts, callback) {\n    opts = opts || {}\n\n    if (opts.levelId === undefined || opts.levelId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.levelId' when calling modifyLevel\"\n      )\n    }\n    if (opts.levelSpec === undefined || opts.levelSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.levelSpec' when calling modifyLevel\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.levelSpec !== undefined && opts.levelSpec !== null) {\n      postBody['levelSpec'] = opts.levelSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      levelId: opts.levelId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyLevel with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/level/{levelId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  敏感数据分类列表\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param categoryDesc list\n      */\n\n  describeCategoryList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCategoryList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/category',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加敏感数据分类\n      * @param {Object} opts - parameters\n      * @param {categorySpec} opts.categorySpec - 敏感数据分类描述\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addCategory (opts, callback) {\n    opts = opts || {}\n\n    if (opts.categorySpec === undefined || opts.categorySpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.categorySpec' when calling addCategory\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.categorySpec !== undefined && opts.categorySpec !== null) {\n      postBody['categorySpec'] = opts.categorySpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addCategory with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/category',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改敏感数据分类名称\n      * @param {Object} opts - parameters\n      * @param {integer} opts.categoryId - 分类 ID\n      * @param {categorySpec} opts.categorySpec - 敏感数据分类描述\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyCategory (opts, callback) {\n    opts = opts || {}\n\n    if (opts.categoryId === undefined || opts.categoryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.categoryId' when calling modifyCategory\"\n      )\n    }\n    if (opts.categorySpec === undefined || opts.categorySpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.categorySpec' when calling modifyCategory\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.categorySpec !== undefined && opts.categorySpec !== null) {\n      postBody['categorySpec'] = opts.categorySpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      categoryId: opts.categoryId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyCategory with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/category/{categoryId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除敏感数据分类\n      * @param {Object} opts - parameters\n      * @param {integer} opts.categoryId - 分类 ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCategory (opts, callback) {\n    opts = opts || {}\n\n    if (opts.categoryId === undefined || opts.categoryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.categoryId' when calling deleteCategory\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      categoryId: opts.categoryId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCategory with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/category/{categoryId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取敏感数据类型列表\n      * @param {Object} opts - parameters\n      * @param {integer} opts.categoryId - 分类 ID\n      * @param {integer} opts.pageNumber - 页码；默认为1\n      * @param {integer} opts.pageSize - 分页大小；默认为10；取值范围[10, 100]\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dataTypeDesc list\n      * @param integer totalCount  敏感数据类型总数量\n      */\n\n  describeDataTypeList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.categoryId === undefined || opts.categoryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.categoryId' when calling describeDataTypeList\"\n      )\n    }\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling describeDataTypeList\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeDataTypeList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      categoryId: opts.categoryId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDataTypeList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/category/{categoryId}/dataType',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  增加敏感数据类型\n      * @param {Object} opts - parameters\n      * @param {integer} opts.categoryId - 分类 ID\n      * @param {dataTypeSpec} opts.dataType - 新增敏感数据类型描述\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createDataType (opts, callback) {\n    opts = opts || {}\n\n    if (opts.categoryId === undefined || opts.categoryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.categoryId' when calling createDataType\"\n      )\n    }\n    if (opts.dataType === undefined || opts.dataType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataType' when calling createDataType\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dataType !== undefined && opts.dataType !== null) {\n      postBody['dataType'] = opts.dataType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      categoryId: opts.categoryId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDataType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/category/{categoryId}/dataType',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改敏感数据类型\n      * @param {Object} opts - parameters\n      * @param {integer} opts.categoryId - 分类 ID\n      * @param {string} opts.typeId - 敏感数据类型ID\n      * @param {dataTypeSpec} opts.dataType - 敏感数据类型描述\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyDataType (opts, callback) {\n    opts = opts || {}\n\n    if (opts.categoryId === undefined || opts.categoryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.categoryId' when calling modifyDataType\"\n      )\n    }\n    if (opts.typeId === undefined || opts.typeId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.typeId' when calling modifyDataType\"\n      )\n    }\n    if (opts.dataType === undefined || opts.dataType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataType' when calling modifyDataType\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dataType !== undefined && opts.dataType !== null) {\n      postBody['dataType'] = opts.dataType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      categoryId: opts.categoryId,\n      typeId: opts.typeId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyDataType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/category/{categoryId}/dataType/{typeId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除敏感数据类型\n      * @param {Object} opts - parameters\n      * @param {integer} opts.categoryId - 分类 ID\n      * @param {string} opts.typeId - 敏感数据类型ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDataType (opts, callback) {\n    opts = opts || {}\n\n    if (opts.categoryId === undefined || opts.categoryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.categoryId' when calling deleteDataType\"\n      )\n    }\n    if (opts.typeId === undefined || opts.typeId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.typeId' when calling deleteDataType\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      categoryId: opts.categoryId,\n      typeId: opts.typeId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDataType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/category/{categoryId}/dataType/{typeId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取数据源列表\n      * @param {Object} opts - parameters\n      * @param {integer} opts.pageNumber - 页码；默认为1\n      * @param {integer} opts.pageSize - 分页大小；默认为10；取值范围[10, 100]\n      * @param {filter} [opts.filters] - &quot;dataSourceId: 数据源ID，字符串数组，精确匹配&quot;\n&quot;dataSourceName: 数据源名称，字符串，模糊匹配&quot;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dataSourceDesc list\n      * @param integer totalCount  总数量\n      */\n\n  describeDataSourceList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDataSourceList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling describeDataSourceList\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeDataSourceList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDataSourceList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加数据源\n      * @param {Object} opts - parameters\n      * @param {dataSourceSpec} opts.dataSourceSpec - 添加数据源需要的信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string dataSourceId  新建的数据源ID\n      */\n\n  createDataSource (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDataSource\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceSpec === undefined || opts.dataSourceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceSpec' when calling createDataSource\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dataSourceSpec !== undefined && opts.dataSourceSpec !== null) {\n      postBody['dataSourceSpec'] = opts.dataSourceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDataSource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取数据源详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dataSourceDesc dataSourceDesc\n      */\n\n  describeDataSource (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDataSource\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling describeDataSource\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDataSource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新数据源名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {string} opts.dataSourceName - 数据源名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateDataSourceName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateDataSourceName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling updateDataSourceName\"\n      )\n    }\n    if (opts.dataSourceName === undefined || opts.dataSourceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceName' when calling updateDataSourceName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dataSourceName !== undefined && opts.dataSourceName !== null) {\n      postBody['dataSourceName'] = opts.dataSourceName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateDataSourceName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除数据源\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDataSource (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDataSource\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling deleteDataSource\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDataSource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置数据源的密钥及加密算法\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {kmsSpec} opts.kmsSpec - 添加数据源需要的信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setDataSourceKms (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setDataSourceKms\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling setDataSourceKms\"\n      )\n    }\n    if (opts.kmsSpec === undefined || opts.kmsSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.kmsSpec' when calling setDataSourceKms\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.kmsSpec !== undefined && opts.kmsSpec !== null) {\n      postBody['kmsSpec'] = opts.kmsSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setDataSourceKms with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}:setKms',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成DDL语句\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string ddl  DDL语句\n      */\n\n  generateDataSourceDDL (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generateDataSourceDDL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling generateDataSourceDDL\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generateDataSourceDDL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}:generateDDL',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取元数据-表 列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {integer} opts.pageNumber - 页码；默认为1\n      * @param {integer} opts.pageSize - 分页大小；默认为10；取值范围[10, 100]\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string list  表名称\n      * @param integer totalCount  总数量\n      */\n\n  describeDataSourceTableList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDataSourceTableList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling describeDataSourceTableList\"\n      )\n    }\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling describeDataSourceTableList\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeDataSourceTableList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDataSourceTableList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}/tables',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建表\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {string} opts.tableName - 表名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createDataSourceTable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDataSourceTable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling createDataSourceTable\"\n      )\n    }\n    if (opts.tableName === undefined || opts.tableName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tableName' when calling createDataSourceTable\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.tableName !== undefined && opts.tableName !== null) {\n      postBody['tableName'] = opts.tableName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDataSourceTable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}/tables',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取元数据-表-字段 列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {string} opts.tableName - 表-名称\n      * @param {integer} opts.pageNumber - 页码；默认为1\n      * @param {integer} opts.pageSize - 分页大小；默认为10；取值范围[10, 100]\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param fieldDesc list\n      * @param integer totalCount  总数量\n      */\n\n  describeDataSourceTableFieldList (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDataSourceTableFieldList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling describeDataSourceTableFieldList\"\n      )\n    }\n    if (opts.tableName === undefined || opts.tableName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tableName' when calling describeDataSourceTableFieldList\"\n      )\n    }\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling describeDataSourceTableFieldList\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeDataSourceTableFieldList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId,\n      tableName: opts.tableName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDataSourceTableFieldList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}/tables/{tableName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新建数据源-表-字段\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {string} opts.tableName - 表-名称\n      * @param {fieldSpec} opts.fieldSpec - 新建字段需要的信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createDataSourceTableField (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDataSourceTableField\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling createDataSourceTableField\"\n      )\n    }\n    if (opts.tableName === undefined || opts.tableName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tableName' when calling createDataSourceTableField\"\n      )\n    }\n    if (opts.fieldSpec === undefined || opts.fieldSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fieldSpec' when calling createDataSourceTableField\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.fieldSpec !== undefined && opts.fieldSpec !== null) {\n      postBody['fieldSpec'] = opts.fieldSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId,\n      tableName: opts.tableName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDataSourceTableField with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}/tables/{tableName}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除数据源-表\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {string} opts.tableName - 表-名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDataSourceTable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDataSourceTable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling deleteDataSourceTable\"\n      )\n    }\n    if (opts.tableName === undefined || opts.tableName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tableName' when calling deleteDataSourceTable\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId,\n      tableName: opts.tableName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDataSourceTable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}/tables/{tableName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取元数据-表-字段\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {string} opts.tableName - 表-名称\n      * @param {string} opts.fieldName - 字段-名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param fieldDesc fieldDesc\n      */\n\n  describeDataSourceTableField (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDataSourceTableField\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling describeDataSourceTableField\"\n      )\n    }\n    if (opts.tableName === undefined || opts.tableName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tableName' when calling describeDataSourceTableField\"\n      )\n    }\n    if (opts.fieldName === undefined || opts.fieldName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fieldName' when calling describeDataSourceTableField\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId,\n      tableName: opts.tableName,\n      fieldName: opts.fieldName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDataSourceTableField with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}/tables/{tableName}/fields/{fieldName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  配置数据源-表-字段 列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {string} opts.tableName - 表-名称\n      * @param {string} opts.fieldName - 字段-名称\n      * @param {fieldSpec} opts.fieldSpec - 配置字段需要的信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyDataSourceTableField (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyDataSourceTableField\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling modifyDataSourceTableField\"\n      )\n    }\n    if (opts.tableName === undefined || opts.tableName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tableName' when calling modifyDataSourceTableField\"\n      )\n    }\n    if (opts.fieldName === undefined || opts.fieldName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fieldName' when calling modifyDataSourceTableField\"\n      )\n    }\n    if (opts.fieldSpec === undefined || opts.fieldSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fieldSpec' when calling modifyDataSourceTableField\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.fieldSpec !== undefined && opts.fieldSpec !== null) {\n      postBody['fieldSpec'] = opts.fieldSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId,\n      tableName: opts.tableName,\n      fieldName: opts.fieldName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyDataSourceTableField with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}/tables/{tableName}/fields/{fieldName}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除数据源-表-字段\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {string} opts.tableName - 表-名称\n      * @param {string} opts.fieldName - 字段-名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDataSourceTableField (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDataSourceTableField\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling deleteDataSourceTableField\"\n      )\n    }\n    if (opts.tableName === undefined || opts.tableName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tableName' when calling deleteDataSourceTableField\"\n      )\n    }\n    if (opts.fieldName === undefined || opts.fieldName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fieldName' when calling deleteDataSourceTableField\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId,\n      tableName: opts.tableName,\n      fieldName: opts.fieldName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDataSourceTableField with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}/tables/{tableName}/fields/{fieldName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改字段标签,不传则清空标签\n      * @param {Object} opts - parameters\n      * @param {string} opts.dataSourceId - 数据源 ID\n      * @param {string} opts.tableName - 表-名称\n      * @param {string} opts.fieldName - 字段-名称\n      * @param {fieldTagSpec} [opts.fieldTagSpec] - 配置字段标签需要的信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param fieldTagDesc fieldTagDesc\n      */\n\n  modifyDataSourceTableFieldTag (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyDataSourceTableFieldTag\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataSourceId === undefined || opts.dataSourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataSourceId' when calling modifyDataSourceTableFieldTag\"\n      )\n    }\n    if (opts.tableName === undefined || opts.tableName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tableName' when calling modifyDataSourceTableFieldTag\"\n      )\n    }\n    if (opts.fieldName === undefined || opts.fieldName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fieldName' when calling modifyDataSourceTableFieldTag\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.fieldTagSpec !== undefined && opts.fieldTagSpec !== null) {\n      postBody['fieldTagSpec'] = opts.fieldTagSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dataSourceId: opts.dataSourceId,\n      tableName: opts.tableName,\n      fieldName: opts.fieldName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyDataSourceTableFieldTag with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataSources/{dataSourceId}/tables/{tableName}/fields/{fieldName}/tag',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取实例列表\n      * @param {Object} opts - parameters\n      * @param {integer} opts.pageNumber - 页码；默认为1\n      * @param {integer} opts.pageSize - 分页大小；默认为10；取值范围[10, 100]\n      * @param {filter} [opts.filters] - &quot;instanceId: 实例ID，字符串数组，精确匹配&quot;\n&quot;instanceName: 实例名称，字符串，模糊匹配&quot;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceDesc list\n      * @param integer totalCount  总数量\n      */\n\n  describeInstanceList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling describeInstanceList\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeInstanceList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建实例\n      * @param {Object} opts - parameters\n      * @param {instanceSpec} opts.instanceSpec - 创建实例的基本信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId  创建的实例ID\n      */\n\n  createInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取实例详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceDesc instanceDesc\n      */\n\n  describeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} opts.instanceName\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceName\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling modifyInstanceName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除实例 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置实例的访问凭证 AK+SK\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} opts.accessKey\n      * @param {string} opts.secretKey\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setInstanceAccessKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setInstanceAccessKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling setInstanceAccessKey\"\n      )\n    }\n    if (opts.accessKey === undefined || opts.accessKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKey' when calling setInstanceAccessKey\"\n      )\n    }\n    if (opts.secretKey === undefined || opts.secretKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretKey' when calling setInstanceAccessKey\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accessKey !== undefined && opts.accessKey !== null) {\n      postBody['accessKey'] = opts.accessKey\n    }\n    if (opts.secretKey !== undefined && opts.secretKey !== null) {\n      postBody['secretKey'] = opts.secretKey\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setInstanceAccessKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:setAccessKey',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置透传模式\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {boolean} opts.byPassMode\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setInstanceByPassMode (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setInstanceByPassMode\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling setInstanceByPassMode\"\n      )\n    }\n    if (opts.byPassMode === undefined || opts.byPassMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.byPassMode' when calling setInstanceByPassMode\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.byPassMode !== undefined && opts.byPassMode !== null) {\n      postBody['byPassMode'] = opts.byPassMode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setInstanceByPassMode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:setByPass',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  插件获取配置文件\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} opts.appUuid\n      * @param {string} opts.appAddr\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string configuration  配置文件\n      */\n\n  describeInstanceConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceConfig\"\n      )\n    }\n    if (opts.appUuid === undefined || opts.appUuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appUuid' when calling describeInstanceConfig\"\n      )\n    }\n    if (opts.appAddr === undefined || opts.appAddr === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appAddr' when calling describeInstanceConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.appUuid !== undefined && opts.appUuid !== null) {\n      queryParams['appUuid'] = opts.appUuid\n    }\n    if (opts.appAddr !== undefined && opts.appAddr !== null) {\n      queryParams['appAddr'] = opts.appAddr\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:config',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取应用列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {integer} opts.pageNumber - 页码；默认为1\n      * @param {integer} opts.pageSize - 分页大小；默认为10；取值范围[10, 100]\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param appDesc list\n      * @param integer totalCount  总数量\n      */\n\n  describeAppList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAppList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAppList\"\n      )\n    }\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling describeAppList\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeAppList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAppList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/applications',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取此实例的所有IP白名单列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string list\n      * @param integer totalCount  IP白名单数量\n      */\n\n  describeIpWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeIpWhiteList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ipWhite',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加一条IP白名单记录，CIDR 格式\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} opts.cidr - IP白名单记录，支持掩码\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addIpWhiteItem (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addIpWhiteItem\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling addIpWhiteItem\"\n      )\n    }\n    if (opts.cidr === undefined || opts.cidr === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cidr' when calling addIpWhiteItem\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.cidr !== undefined && opts.cidr !== null) {\n      postBody['cidr'] = opts.cidr\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addIpWhiteItem with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ipWhite',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一条IP白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} opts.cidr - IP白名单记录，支持掩码\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteIpWhiteItem (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteIpWhiteItem\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteIpWhiteItem\"\n      )\n    }\n    if (opts.cidr === undefined || opts.cidr === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cidr' when calling deleteIpWhiteItem\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.cidr !== undefined && opts.cidr !== null) {\n      queryParams['cidr'] = opts.cidr\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dcap/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteIpWhiteItem with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ipWhite',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = DCAP\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/deploy/v1/deploy.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 依赖\n * 云部署依赖相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'deploy'\nService._services[serviceId] = true\n\n/**\n * deploy service.\n * @version 1.0.0\n */\n\nJDCloud.DEPLOY = class DEPLOY extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'deploy.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  批量查询应用的信息，此接口支持分页查询，默认每页20条\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - appId - 应用ID，精确匹配\nappName - 应用名，精确匹配\nplatform - 部署平台，精确匹配\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param app apps\n      * @param number totalCount\n      */\n\n  describeApps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeApps\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  deploy/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeApps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个应用的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - App Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param app app\n      */\n\n  describeApp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeApp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeApp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  deploy/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeApp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/app/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建部署任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupId - 部署组ID，部署组的唯一标识\n      * @param {string} [opts.desc] - 描述  optional\n      * @param {integer} opts.deploySource - 部署来源：1url，2云编译，3云存储\n      * @param {string} [opts.deployCmd] - 部署操作  optional\n      * @param {integer} [opts.cmdSource] - 1使用输入的操作，2使用程序自带操作  optional\n      * @param {integer} [opts.cmdType] - 部署操作展示格式：1form,2ymal  optional\n      * @param {integer} [opts.productType] - 项目类型 1tomcat,2  optional\n      * @param {string} [opts.downloadUrl] - 下载url  optional\n      * @param {string} [opts.md5] - md5  optional\n      * @param {string} [opts.compileProject] - 云编译项目名  optional\n      * @param {string} [opts.compileSeries] - 云编译构建序号  optional\n      * @param {string} [opts.ossSpace] - 云存储空间  optional\n      * @param {string} [opts.ossDir] - 云存储目录  optional\n      * @param {integer} [opts.fileType] - 文件类型：1.tar，2.zip,3.tar.gz  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string deployId  上线单ID\n      */\n\n  createDeploy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDeploy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.groupId === undefined || opts.groupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupId' when calling createDeploy\"\n      )\n    }\n    if (opts.deploySource === undefined || opts.deploySource === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deploySource' when calling createDeploy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.groupId !== undefined && opts.groupId !== null) {\n      postBody['groupId'] = opts.groupId\n    }\n    if (opts.desc !== undefined && opts.desc !== null) {\n      postBody['desc'] = opts.desc\n    }\n    if (opts.deploySource !== undefined && opts.deploySource !== null) {\n      postBody['deploySource'] = opts.deploySource\n    }\n    if (opts.deployCmd !== undefined && opts.deployCmd !== null) {\n      postBody['deployCmd'] = opts.deployCmd\n    }\n    if (opts.cmdSource !== undefined && opts.cmdSource !== null) {\n      postBody['cmdSource'] = opts.cmdSource\n    }\n    if (opts.cmdType !== undefined && opts.cmdType !== null) {\n      postBody['cmdType'] = opts.cmdType\n    }\n    if (opts.productType !== undefined && opts.productType !== null) {\n      postBody['productType'] = opts.productType\n    }\n    if (opts.downloadUrl !== undefined && opts.downloadUrl !== null) {\n      postBody['downloadUrl'] = opts.downloadUrl\n    }\n    if (opts.md5 !== undefined && opts.md5 !== null) {\n      postBody['md5'] = opts.md5\n    }\n    if (opts.compileProject !== undefined && opts.compileProject !== null) {\n      postBody['compileProject'] = opts.compileProject\n    }\n    if (opts.compileSeries !== undefined && opts.compileSeries !== null) {\n      postBody['compileSeries'] = opts.compileSeries\n    }\n    if (opts.ossSpace !== undefined && opts.ossSpace !== null) {\n      postBody['ossSpace'] = opts.ossSpace\n    }\n    if (opts.ossDir !== undefined && opts.ossDir !== null) {\n      postBody['ossDir'] = opts.ossDir\n    }\n    if (opts.fileType !== undefined && opts.fileType !== null) {\n      postBody['fileType'] = opts.fileType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  deploy/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDeploy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deploy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个部署任务详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.deployId - Deploy Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deploy deploy\n      */\n\n  describeDeploy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeploy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.deployId === undefined || opts.deployId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deployId' when calling describeDeploy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      deployId: opts.deployId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  deploy/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeploy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deploy/{deployId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询部署组的信息，此接口支持分页查询，默认每页20条\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - appId - 应用ID，精确匹配\ngroupId - 部署组ID，精确匹配\ngroupName - 部署组名，精确匹配\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param group groups\n      * @param number totalCount\n      */\n\n  describeGroups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeGroups\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  deploy/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/groups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个部署组的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupId - Group Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param group group\n      */\n\n  describeGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.groupId === undefined || opts.groupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupId' when calling describeGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      groupId: opts.groupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  deploy/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/group/{groupId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.DEPLOY\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/detection/v2/detection.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SiteMonitor APIs\n * 站点监控相关接口，提供创建、查询、修改、删除站点监控等功能\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'detection'\nService._services[serviceId] = true\n\n/**\n * detection service.\n * @version 2.0.1\n */\n\nJDCloud.DETECTION = class DETECTION extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'detection.jdcloud-api.com'\n    options.basePath = '/v2' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询可用性监控agent状态\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - agent id列表\nuuid - agent id，精确匹配，支持多个  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param agentStatus items\n      */\n\n  describeAgentStatus (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAgentStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/amAgentStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看可用性监控任务的监控数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.resourceId - 资源的uuid\n      * @param {string} [opts.startTime] - 查询时间范围的开始时间， UTC时间，格式：2016-12-11T00:00:00+0800（早于30d时，将被重置为30d）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.endTime] - 查询时间范围的结束时间， UTC时间，格式：2016-12-11T00:00:00+0800（为空时，将由startTime与timeInterval计算得出）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.timeInterval] - 时间间隔：1h，6h，12h，1d，3d，7d，14d，固定时间间隔，timeInterval 与 endTime 至少填一项  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metricData metricDatas\n      */\n\n  describeMetricDataAm (opts, callback) {\n    opts = opts || {}\n\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling describeMetricDataAm\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      queryParams['timeInterval'] = opts.timeInterval\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMetricDataAm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/amMetricData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建可用性监控任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.clientToken - 幂等性校验参数,最长36位\n      * @param {createProbeTaskParam} opts.createProbeTaskSpec\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean suc  是否创建成功\n      * @param string taskId  创建成功的规则id列表\n      */\n\n  createProbeTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.clientToken === undefined || opts.clientToken === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clientToken' when calling createProbeTask\"\n      )\n    }\n    if (\n      opts.createProbeTaskSpec === undefined ||\n      opts.createProbeTaskSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createProbeTaskSpec' when calling createProbeTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (\n      opts.createProbeTaskSpec !== undefined &&\n      opts.createProbeTaskSpec !== null\n    ) {\n      postBody['createProbeTaskSpec'] = opts.createProbeTaskSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createProbeTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/probeTask',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除可用性监控任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.probeTaskIDs - 探测任务的task_id,多个taskId用|分隔\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean suc  可用性监控任务是否删除成功\n      */\n\n  deleteProbeTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.probeTaskIDs === undefined || opts.probeTaskIDs === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.probeTaskIDs' when calling deleteProbeTask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.probeTaskIDs !== undefined && opts.probeTaskIDs !== null) {\n      queryParams['probeTaskIDs'] = opts.probeTaskIDs\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteProbeTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/probeTask',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可用性监控任务信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.probeTaskID - 探测任务的task_id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param probe probes\n      * @param string address  探测地址\n      * @param string createTime  创建时间\n      * @param boolean deleted  是否被删除\n      * @param boolean enable  是否启用\n      * @param integer frequency  探测频率，单位秒\n      * @param string httpBody  http探测的body\n      * @param keyValue httpCookie\n      * @param keyValue httpHeader\n      * @param integer httpType  http探测方式\n      * @param string name  探测任务 名称\n      * @param string pin  pin\n      * @param integer port  探测端口\n      * @param integer probeType  探测类型1:http、2:telnet\n      * @param string targetId  探测对象的uid(http探测方法无uid)\n      * @param string targetRegion  探测对象所在region，redis或RDS所在region\n      * @param string taskId  探测任务 id\n      * @param integer taskType  任务类型、1:url/ip、2:RDS、3:redis\n      * @param integer timeout  探测超时时间，单位秒\n      * @param string updateTime  更新时间\n      */\n\n  describeProbeTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.probeTaskID === undefined || opts.probeTaskID === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.probeTaskID' when calling describeProbeTask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      probeTaskID: opts.probeTaskID\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProbeTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/probeTask/{probeTaskID}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改可用性监控任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.probeTaskID - 探测任务的task_id\n      * @param {string} [opts.httpBody] - http body：选择探测类型为1&#x3D;http时有效，最长不超过1024字节  optional\n      * @param {array} [opts.httpCookie] - http cookie：选择探测类型为1&#x3D;http时有效，最大允许20个key、value对，最长不超过1024字节  optional\n      * @param {array} [opts.httpHeader] - http header：选择探测类型为1&#x3D;http时有效，最大允许20个key、value对，最长不超过1024字节  optional\n      * @param {integer} [opts.httpType] - http探测方法,可选值：1:get、2:post、3:head  optional\n      * @param {string} [opts.name] - task名称，不允许重复，长度不超过32字符，只允许中英文、数字、下划线_、中划线-, [0-9][a-z] [A-Z] [- _ ]  optional\n      * @param {array} [opts.probes] - 探测源（发起对探测目标探测的云主机，需安装相应的agent才能探测）  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean suc  是否更新成功\n      */\n\n  updateProbeTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.probeTaskID === undefined || opts.probeTaskID === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.probeTaskID' when calling updateProbeTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.httpBody !== undefined && opts.httpBody !== null) {\n      postBody['httpBody'] = opts.httpBody\n    }\n    if (opts.httpCookie !== undefined && opts.httpCookie !== null) {\n      postBody['httpCookie'] = opts.httpCookie\n    }\n    if (opts.httpHeader !== undefined && opts.httpHeader !== null) {\n      postBody['httpHeader'] = opts.httpHeader\n    }\n    if (opts.httpType !== undefined && opts.httpType !== null) {\n      postBody['httpType'] = opts.httpType\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.probes !== undefined && opts.probes !== null) {\n      postBody['probes'] = opts.probes\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      probeTaskID: opts.probeTaskID\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateProbeTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/probeTask/{probeTaskID}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可用性监控任务的指定探测源的异常探测历史\n      * @param {Object} opts - parameters\n      * @param {string} opts.probeTaskID - 可用性监控task_id, id长度(0,50]\n      * @param {string} opts.probeID - 探测源id，  id长度（0,50]\n      * @param {string} [opts.startTime] - 查询时间范围的开始时间， UTC时间，格式：2016-12-11T00:00:00+0800（默认为当前时间往前三天，早于3d时，将被重置为3d）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.endTime] - 查询时间范围的结束时间， UTC时间，格式：2016-12-11T00:00:00+0800（为空时，默认为当前时间）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param event events\n      * @param string name  探测源名称\n      * @param string uuid  探测源uuid\n      */\n\n  describeProbeHistory (opts, callback) {\n    opts = opts || {}\n\n    if (opts.probeTaskID === undefined || opts.probeTaskID === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.probeTaskID' when calling describeProbeHistory\"\n      )\n    }\n    if (opts.probeID === undefined || opts.probeID === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.probeID' when calling describeProbeHistory\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      probeTaskID: opts.probeTaskID,\n      probeID: opts.probeID\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProbeHistory with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/probeTask/{probeTaskID}/probe/{probeID}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可用性监控任务的探测源列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.probeTaskID - 探测任务的task_id\n      * @param {filter} [opts.filters] - 自定义标签  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param probeInfo probeList\n      */\n\n  discribeProbes (opts, callback) {\n    opts = opts || {}\n\n    if (opts.probeTaskID === undefined || opts.probeTaskID === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.probeTaskID' when calling discribeProbes\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      probeTaskID: opts.probeTaskID\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call discribeProbes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/probeTask/{probeTaskID}/probeList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用、禁用可用性监控任务\n      * @param {Object} opts - parameters\n      * @param {boolean} [opts.enabled] - 默认：禁用； true：启用，false：禁用  optional\n      * @param {array} [opts.taskId] - 要启用或禁用的探测任务的task_id列表，列表长度[1，100)  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean suc  可用性监控任务 【启用｜禁用】 是否成功\n      */\n\n  probeTaskEnable (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call probeTaskEnable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/probeTask:switch',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可用性监控任务列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 当前所在页，默认为1  optional\n      * @param {integer} [opts.pageSize] - 页面大小，默认为20；取值范围[1, 100]  optional\n      * @param {string} [opts.name] - 根据探测任务的名称查询，支持模糊查询  optional\n      * @param {integer} [opts.type] - 根据探测任务的类型查询，1、http 2、telnet  optional\n      * @param {string} [opts.timeInterval] - 查询的可用率、响应时间的时间间隔，为空时默认查询最新点,最大不超过30天，支持分钟级别,小时级别，天级别，例如：1m、1h、1d  optional\n      * @param {boolean} [opts.withStats] - 是否查询可用率、响应时间  optional\n      * @param {boolean} [opts.withDeleted] - 是否包含被删除的task  optional\n      * @param {integer} [opts.enabled] - 任务状态：1为启用，0为禁用。默认为查所有的  optional\n      * @param {filter} [opts.filters] - taskId - taskId，精确匹配，支持多个\nname - task名称或探测地址，糊模匹配，支持单个  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer numberPages  总页数\n      * @param integer numberRecords  总记录数\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  分页大小\n      * @param taskInfo taskInfo\n      * @param integer totalCount  该用户的总task个数，不受查询的筛选条件影响\n      */\n\n  describeProbeTasks (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      queryParams['timeInterval'] = opts.timeInterval\n    }\n    if (opts.withStats !== undefined && opts.withStats !== null) {\n      queryParams['withStats'] = opts.withStats\n    }\n    if (opts.withDeleted !== undefined && opts.withDeleted !== null) {\n      queryParams['withDeleted'] = opts.withDeleted\n    }\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      queryParams['enabled'] = opts.enabled\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProbeTasks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/probeTaskList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取站点监控任务信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.nameOrAddr]   optional\n      * @param {string} [opts.name]   optional\n      * @param {string} [opts.taskType]   optional\n      * @param {integer} [opts.pageNumber]   optional\n      * @param {integer} [opts.pageSize]   optional\n      * @param {string} [opts.withStats]   optional\n      * @param {string} [opts.withDeleted] - 1:包含删除对象，默认：0  optional\n      * @param {string} [opts.timeInterval] - 查询的可用率、响应时间的时间间隔，最大不超过30天，支持分钟级别,小时级别，天级别，例如：1m、1h、1d  optional\n      * @param {filter} [opts.filters] - name为&#39;id&#39; - 站点监控id  optional\n      * @param {string} [opts.id]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param siteMonitor list\n      * @param integer total\n      */\n\n  getSiteMonitor (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.nameOrAddr !== undefined && opts.nameOrAddr !== null) {\n      queryParams['nameOrAddr'] = opts.nameOrAddr\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.taskType !== undefined && opts.taskType !== null) {\n      queryParams['taskType'] = opts.taskType\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.withStats !== undefined && opts.withStats !== null) {\n      queryParams['withStats'] = opts.withStats\n    }\n    if (opts.withDeleted !== undefined && opts.withDeleted !== null) {\n      queryParams['withDeleted'] = opts.withDeleted\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      queryParams['timeInterval'] = opts.timeInterval\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, this.buildArrayParam(opts.id, 'id'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSiteMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/siteMonitor',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建站点监控任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.address - 地址\n      * @param {string} [opts.advanceChecked]   optional\n      * @param {integer} [opts.createdTime]   optional\n      * @param {integer} opts.cycle - 探测频率\n      * @param {string} [opts.defaultSource]   optional\n      * @param {siteMonitorDnsOption} [opts.dnsOption]   optional\n      * @param {string} [opts.enabled]   optional\n      * @param {siteMonitorFtpOption} [opts.ftpOption]   optional\n      * @param {integer} [opts.hawkeyeId]   optional\n      * @param {siteMonitorHttpOption} [opts.httpOption]   optional\n      * @param {string} [opts.id]   optional\n      * @param {string} [opts.isDeleted]   optional\n      * @param {string} opts.name - 任务名称\n      * @param {string} [opts.pin]   optional\n      * @param {siteMonitorPingOption} [opts.pingOption]   optional\n      * @param {siteMonitorPop3Option} [opts.pop3Option]   optional\n      * @param {string} [opts.port] - 端口  optional\n      * @param {siteMonitorSmtpOption} [opts.smtpOption]   optional\n      * @param {array} [opts.source] - 探测源  optional\n      * @param {object} [opts.stats]   optional\n      * @param {string} opts.taskType - 任务类型，可选值：HTTP、PING 、TCP 、UDP、DNS、SMTP、POP3和FTP\n      * @param {siteMonitorTcpOption} [opts.tcpOption]   optional\n      * @param {siteMonitorUdpOption} [opts.udpOption]   optional\n      * @param {integer} [opts.updatedTime]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string id\n      */\n\n  createSiteMonitor (opts, callback) {\n    opts = opts || {}\n\n    if (opts.address === undefined || opts.address === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.address' when calling createSiteMonitor\"\n      )\n    }\n    if (opts.cycle === undefined || opts.cycle === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cycle' when calling createSiteMonitor\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createSiteMonitor\"\n      )\n    }\n    if (opts.taskType === undefined || opts.taskType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskType' when calling createSiteMonitor\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.address !== undefined && opts.address !== null) {\n      postBody['address'] = opts.address\n    }\n    if (opts.advanceChecked !== undefined && opts.advanceChecked !== null) {\n      postBody['advanceChecked'] = opts.advanceChecked\n    }\n    if (opts.createdTime !== undefined && opts.createdTime !== null) {\n      postBody['createdTime'] = opts.createdTime\n    }\n    if (opts.cycle !== undefined && opts.cycle !== null) {\n      postBody['cycle'] = opts.cycle\n    }\n    if (opts.defaultSource !== undefined && opts.defaultSource !== null) {\n      postBody['defaultSource'] = opts.defaultSource\n    }\n    if (opts.dnsOption !== undefined && opts.dnsOption !== null) {\n      postBody['dnsOption'] = opts.dnsOption\n    }\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n    if (opts.ftpOption !== undefined && opts.ftpOption !== null) {\n      postBody['ftpOption'] = opts.ftpOption\n    }\n    if (opts.hawkeyeId !== undefined && opts.hawkeyeId !== null) {\n      postBody['hawkeyeId'] = opts.hawkeyeId\n    }\n    if (opts.httpOption !== undefined && opts.httpOption !== null) {\n      postBody['httpOption'] = opts.httpOption\n    }\n    if (opts.id !== undefined && opts.id !== null) {\n      postBody['id'] = opts.id\n    }\n    if (opts.isDeleted !== undefined && opts.isDeleted !== null) {\n      postBody['isDeleted'] = opts.isDeleted\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.pingOption !== undefined && opts.pingOption !== null) {\n      postBody['pingOption'] = opts.pingOption\n    }\n    if (opts.pop3Option !== undefined && opts.pop3Option !== null) {\n      postBody['pop3Option'] = opts.pop3Option\n    }\n    if (opts.port !== undefined && opts.port !== null) {\n      postBody['port'] = opts.port\n    }\n    if (opts.smtpOption !== undefined && opts.smtpOption !== null) {\n      postBody['smtpOption'] = opts.smtpOption\n    }\n    if (opts.source !== undefined && opts.source !== null) {\n      postBody['source'] = opts.source\n    }\n    if (opts.stats !== undefined && opts.stats !== null) {\n      postBody['stats'] = opts.stats\n    }\n    if (opts.taskType !== undefined && opts.taskType !== null) {\n      postBody['taskType'] = opts.taskType\n    }\n    if (opts.tcpOption !== undefined && opts.tcpOption !== null) {\n      postBody['tcpOption'] = opts.tcpOption\n    }\n    if (opts.udpOption !== undefined && opts.udpOption !== null) {\n      postBody['udpOption'] = opts.udpOption\n    }\n    if (opts.updatedTime !== undefined && opts.updatedTime !== null) {\n      postBody['updatedTime'] = opts.updatedTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSiteMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/siteMonitor',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改站点监控任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.address - 地址\n      * @param {string} [opts.advanceChecked]   optional\n      * @param {integer} [opts.createdTime]   optional\n      * @param {integer} opts.cycle - 探测频率\n      * @param {string} [opts.defaultSource]   optional\n      * @param {siteMonitorDnsOption} [opts.dnsOption]   optional\n      * @param {string} [opts.enabled]   optional\n      * @param {siteMonitorFtpOption} [opts.ftpOption]   optional\n      * @param {integer} [opts.hawkeyeId]   optional\n      * @param {siteMonitorHttpOption} [opts.httpOption]   optional\n      * @param {string} [opts.id]   optional\n      * @param {string} [opts.isDeleted]   optional\n      * @param {string} opts.name - 任务名称\n      * @param {string} [opts.pin]   optional\n      * @param {siteMonitorPingOption} [opts.pingOption]   optional\n      * @param {siteMonitorPop3Option} [opts.pop3Option]   optional\n      * @param {string} [opts.port] - 端口  optional\n      * @param {siteMonitorSmtpOption} [opts.smtpOption]   optional\n      * @param {array} [opts.source] - 探测源  optional\n      * @param {object} [opts.stats]   optional\n      * @param {string} opts.taskType - 任务类型，可选值：HTTP、PING 、TCP 、UDP、DNS、SMTP、POP3和FTP\n      * @param {siteMonitorTcpOption} [opts.tcpOption]   optional\n      * @param {siteMonitorUdpOption} [opts.udpOption]   optional\n      * @param {integer} [opts.updatedTime]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean suc\n      */\n\n  updateSiteMonitor (opts, callback) {\n    opts = opts || {}\n\n    if (opts.address === undefined || opts.address === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.address' when calling updateSiteMonitor\"\n      )\n    }\n    if (opts.cycle === undefined || opts.cycle === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cycle' when calling updateSiteMonitor\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling updateSiteMonitor\"\n      )\n    }\n    if (opts.taskType === undefined || opts.taskType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskType' when calling updateSiteMonitor\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.address !== undefined && opts.address !== null) {\n      postBody['address'] = opts.address\n    }\n    if (opts.advanceChecked !== undefined && opts.advanceChecked !== null) {\n      postBody['advanceChecked'] = opts.advanceChecked\n    }\n    if (opts.createdTime !== undefined && opts.createdTime !== null) {\n      postBody['createdTime'] = opts.createdTime\n    }\n    if (opts.cycle !== undefined && opts.cycle !== null) {\n      postBody['cycle'] = opts.cycle\n    }\n    if (opts.defaultSource !== undefined && opts.defaultSource !== null) {\n      postBody['defaultSource'] = opts.defaultSource\n    }\n    if (opts.dnsOption !== undefined && opts.dnsOption !== null) {\n      postBody['dnsOption'] = opts.dnsOption\n    }\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n    if (opts.ftpOption !== undefined && opts.ftpOption !== null) {\n      postBody['ftpOption'] = opts.ftpOption\n    }\n    if (opts.hawkeyeId !== undefined && opts.hawkeyeId !== null) {\n      postBody['hawkeyeId'] = opts.hawkeyeId\n    }\n    if (opts.httpOption !== undefined && opts.httpOption !== null) {\n      postBody['httpOption'] = opts.httpOption\n    }\n    if (opts.id !== undefined && opts.id !== null) {\n      postBody['id'] = opts.id\n    }\n    if (opts.isDeleted !== undefined && opts.isDeleted !== null) {\n      postBody['isDeleted'] = opts.isDeleted\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.pingOption !== undefined && opts.pingOption !== null) {\n      postBody['pingOption'] = opts.pingOption\n    }\n    if (opts.pop3Option !== undefined && opts.pop3Option !== null) {\n      postBody['pop3Option'] = opts.pop3Option\n    }\n    if (opts.port !== undefined && opts.port !== null) {\n      postBody['port'] = opts.port\n    }\n    if (opts.smtpOption !== undefined && opts.smtpOption !== null) {\n      postBody['smtpOption'] = opts.smtpOption\n    }\n    if (opts.source !== undefined && opts.source !== null) {\n      postBody['source'] = opts.source\n    }\n    if (opts.stats !== undefined && opts.stats !== null) {\n      postBody['stats'] = opts.stats\n    }\n    if (opts.taskType !== undefined && opts.taskType !== null) {\n      postBody['taskType'] = opts.taskType\n    }\n    if (opts.tcpOption !== undefined && opts.tcpOption !== null) {\n      postBody['tcpOption'] = opts.tcpOption\n    }\n    if (opts.udpOption !== undefined && opts.udpOption !== null) {\n      postBody['udpOption'] = opts.udpOption\n    }\n    if (opts.updatedTime !== undefined && opts.updatedTime !== null) {\n      postBody['updatedTime'] = opts.updatedTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateSiteMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/siteMonitor',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除站点监控任务\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - name为&#39;list&#39; - 站点监控id  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean suc\n      */\n\n  deleteSiteMonitor (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSiteMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/siteMonitor',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启停站点监控任务\n      * @param {Object} opts - parameters\n      * @param {array} [opts.list]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean suc\n      */\n\n  enableSiteMonitor (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.list !== undefined && opts.list !== null) {\n      postBody['list'] = opts.list\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableSiteMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/siteMonitor:switch',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  检测站点监控地址是否有效\n      * @param {Object} opts - parameters\n      * @param {string} [opts.address]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean suc\n      */\n\n  validateSiteMonitorAddress (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.address !== undefined && opts.address !== null) {\n      queryParams['address'] = opts.address\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call validateSiteMonitorAddress with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/siteMonitorAddress:validate',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取站点监控数据\n      * @param {Object} opts - parameters\n      * @param {string} [opts.id]   optional\n      * @param {string} [opts.startTime]   optional\n      * @param {string} [opts.endTime]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param statsItem metricData\n      * @param statsItem resTime\n      * @param statsItem successRatio\n      */\n\n  getSiteMonitorDataPoints (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      queryParams['id'] = opts.id\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSiteMonitorDataPoints with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/siteMonitorDataPoints',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取站点监控探针列表\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ispLocation all\n      * @param ispLocation limited\n      */\n\n  getSiteMonitorSource (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSiteMonitorSource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/siteMonitorSource',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  测试站点监控参数\n      * @param {Object} opts - parameters\n      * @param {string} opts.address - 地址\n      * @param {string} [opts.advanceChecked]   optional\n      * @param {integer} [opts.createdTime]   optional\n      * @param {integer} opts.cycle - 探测频率\n      * @param {string} [opts.defaultSource]   optional\n      * @param {siteMonitorDnsOption} [opts.dnsOption]   optional\n      * @param {string} [opts.enabled]   optional\n      * @param {siteMonitorFtpOption} [opts.ftpOption]   optional\n      * @param {integer} [opts.hawkeyeId]   optional\n      * @param {siteMonitorHttpOption} [opts.httpOption]   optional\n      * @param {string} [opts.id]   optional\n      * @param {string} [opts.isDeleted]   optional\n      * @param {string} opts.name - 任务名称\n      * @param {string} [opts.pin]   optional\n      * @param {siteMonitorPingOption} [opts.pingOption]   optional\n      * @param {siteMonitorPop3Option} [opts.pop3Option]   optional\n      * @param {string} [opts.port] - 端口  optional\n      * @param {siteMonitorSmtpOption} [opts.smtpOption]   optional\n      * @param {array} [opts.source] - 探测源  optional\n      * @param {object} [opts.stats]   optional\n      * @param {string} opts.taskType - 任务类型，可选值：HTTP、PING 、TCP 、UDP、DNS、SMTP、POP3和FTP\n      * @param {siteMonitorTcpOption} [opts.tcpOption]   optional\n      * @param {siteMonitorUdpOption} [opts.udpOption]   optional\n      * @param {integer} [opts.updatedTime]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string error  错误信息\n      * @param string msg  提示信息\n      * @param integer status  状态码\n      */\n\n  testSiteMonitor (opts, callback) {\n    opts = opts || {}\n\n    if (opts.address === undefined || opts.address === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.address' when calling testSiteMonitor\"\n      )\n    }\n    if (opts.cycle === undefined || opts.cycle === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cycle' when calling testSiteMonitor\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling testSiteMonitor\"\n      )\n    }\n    if (opts.taskType === undefined || opts.taskType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskType' when calling testSiteMonitor\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.address !== undefined && opts.address !== null) {\n      postBody['address'] = opts.address\n    }\n    if (opts.advanceChecked !== undefined && opts.advanceChecked !== null) {\n      postBody['advanceChecked'] = opts.advanceChecked\n    }\n    if (opts.createdTime !== undefined && opts.createdTime !== null) {\n      postBody['createdTime'] = opts.createdTime\n    }\n    if (opts.cycle !== undefined && opts.cycle !== null) {\n      postBody['cycle'] = opts.cycle\n    }\n    if (opts.defaultSource !== undefined && opts.defaultSource !== null) {\n      postBody['defaultSource'] = opts.defaultSource\n    }\n    if (opts.dnsOption !== undefined && opts.dnsOption !== null) {\n      postBody['dnsOption'] = opts.dnsOption\n    }\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n    if (opts.ftpOption !== undefined && opts.ftpOption !== null) {\n      postBody['ftpOption'] = opts.ftpOption\n    }\n    if (opts.hawkeyeId !== undefined && opts.hawkeyeId !== null) {\n      postBody['hawkeyeId'] = opts.hawkeyeId\n    }\n    if (opts.httpOption !== undefined && opts.httpOption !== null) {\n      postBody['httpOption'] = opts.httpOption\n    }\n    if (opts.id !== undefined && opts.id !== null) {\n      postBody['id'] = opts.id\n    }\n    if (opts.isDeleted !== undefined && opts.isDeleted !== null) {\n      postBody['isDeleted'] = opts.isDeleted\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.pingOption !== undefined && opts.pingOption !== null) {\n      postBody['pingOption'] = opts.pingOption\n    }\n    if (opts.pop3Option !== undefined && opts.pop3Option !== null) {\n      postBody['pop3Option'] = opts.pop3Option\n    }\n    if (opts.port !== undefined && opts.port !== null) {\n      postBody['port'] = opts.port\n    }\n    if (opts.smtpOption !== undefined && opts.smtpOption !== null) {\n      postBody['smtpOption'] = opts.smtpOption\n    }\n    if (opts.source !== undefined && opts.source !== null) {\n      postBody['source'] = opts.source\n    }\n    if (opts.stats !== undefined && opts.stats !== null) {\n      postBody['stats'] = opts.stats\n    }\n    if (opts.taskType !== undefined && opts.taskType !== null) {\n      postBody['taskType'] = opts.taskType\n    }\n    if (opts.tcpOption !== undefined && opts.tcpOption !== null) {\n      postBody['tcpOption'] = opts.tcpOption\n    }\n    if (opts.udpOption !== undefined && opts.udpOption !== null) {\n      postBody['udpOption'] = opts.udpOption\n    }\n    if (opts.updatedTime !== undefined && opts.updatedTime !== null) {\n      postBody['updatedTime'] = opts.updatedTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call testSiteMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/testSiteMonitor',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.DETECTION\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/detection/v3/detection.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Task related APIs\n * 云拔测-任务相关接口\n *\n * OpenAPI spec version: v3\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'detection'\nService._services[serviceId] = true\n\n/**\n * detection service.\n * @version 3.0.0\n */\n\nclass DETECTION extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'detection.jdcloud-api.com'\n    options.basePath = '/v3' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询任务列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.taskId] - 任务Id  optional\n      * @param {string} [opts.taskName] - 任务名称 模糊匹配  optional\n      * @param {string} [opts.taskUrl] - 任务地址 模糊匹配  optional\n      * @param {integer} [opts.taskType] - 任务类型 1、协议 2、网络  optional\n      * @param {integer} [opts.protocolType] - 协议类型 1、TCP 2、UDP 3、SMTP 4、HTTP_HTTPS 5、FTP  optional\n      * @param {integer} [opts.taskClassify] - 任务类别 1、定时拨测 2、即时拨测 默认定时拨测  optional\n      * @param {integer} [opts.taskGroupId] - 任务组ID  optional\n      * @param {integer} opts.pageIndex - 当前页码 需大于等于1\n      * @param {integer} opts.pageSize - 每页大小 取值范围1到100\n      * @param {integer} [opts.status] - 任务状态 0开启 1禁用  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      * @param string message\n      * @param integer total\n      * @param task data\n      */\n\n  queryTasks (opts, callback) {\n    opts = opts || {}\n\n    if (opts.pageIndex === undefined || opts.pageIndex === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageIndex' when calling queryTasks\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling queryTasks\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      queryParams['taskId'] = opts.taskId\n    }\n    if (opts.taskName !== undefined && opts.taskName !== null) {\n      queryParams['taskName'] = opts.taskName\n    }\n    if (opts.taskUrl !== undefined && opts.taskUrl !== null) {\n      queryParams['taskUrl'] = opts.taskUrl\n    }\n    if (opts.taskType !== undefined && opts.taskType !== null) {\n      queryParams['taskType'] = opts.taskType\n    }\n    if (opts.protocolType !== undefined && opts.protocolType !== null) {\n      queryParams['protocolType'] = opts.protocolType\n    }\n    if (opts.taskClassify !== undefined && opts.taskClassify !== null) {\n      queryParams['taskClassify'] = opts.taskClassify\n    }\n    if (opts.taskGroupId !== undefined && opts.taskGroupId !== null) {\n      queryParams['taskGroupId'] = opts.taskGroupId\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/3.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryTasks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/tasks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网络类型任务拨测结果\n      * @param {Object} opts - parameters\n      * @param {integer} opts.taskId - 任务Id\n      * @param {integer} opts.startTime - 开始时间 时间戳 需小于当前时间\n      * @param {integer} opts.endTime - 结束时间 时间戳 需大于开始时间\n      * @param {integer} opts.pageIndex - 当前页码 需大于等于1\n      * @param {integer} opts.pageSize - 每页大小 取值范围1到500\n      * @param {integer} [opts.status] - 结果状态 0成功 1失败  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      * @param string message\n      * @param integer total\n      * @param net data\n      */\n\n  queryNetworkMonitorResults (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling queryNetworkMonitorResults\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling queryNetworkMonitorResults\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling queryNetworkMonitorResults\"\n      )\n    }\n    if (opts.pageIndex === undefined || opts.pageIndex === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageIndex' when calling queryNetworkMonitorResults\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling queryNetworkMonitorResults\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      queryParams['taskId'] = opts.taskId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/3.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryNetworkMonitorResults with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/netMonitorResult',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询协议类型任务拨测结果\n      * @param {Object} opts - parameters\n      * @param {integer} opts.taskId - 任务Id\n      * @param {integer} opts.startTime - 开始时间 时间戳 需小于当前时间\n      * @param {integer} opts.endTime - 结束时间 时间戳 需大于开始时间\n      * @param {integer} opts.pageIndex - 当前页码 需大于等于1\n      * @param {integer} opts.pageSize - 每页大小 取值范围1到500\n      * @param {integer} [opts.status] - 结果状态 0成功 1失败  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      * @param string message\n      * @param integer total\n      * @param protocol data\n      */\n\n  queryProtocolMonitorResults (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling queryProtocolMonitorResults\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling queryProtocolMonitorResults\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling queryProtocolMonitorResults\"\n      )\n    }\n    if (opts.pageIndex === undefined || opts.pageIndex === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageIndex' when calling queryProtocolMonitorResults\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling queryProtocolMonitorResults\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      queryParams['taskId'] = opts.taskId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/3.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryProtocolMonitorResults with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/protocolMonitorResult',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询协议类型任务平均指标数据\n      * @param {Object} opts - parameters\n      * @param {integer} opts.taskId - 任务Id\n      * @param {integer} opts.startTime - 开始时间 时间戳 需小于当前时间\n      * @param {integer} opts.endTime - 结束时间 时间戳 需大于开始时间\n      * @param {integer} [opts.duration] - 数据点间隔时间(分钟)，可选5/10/15/30/60/120/180/240/300/480/720，默认为任务调度周期，需大于任务调度周期  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      * @param string message\n      * @param protocolMetric data\n      */\n\n  queryProtocolAvgMetrics (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling queryProtocolAvgMetrics\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling queryProtocolAvgMetrics\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling queryProtocolAvgMetrics\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      queryParams['taskId'] = opts.taskId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.duration !== undefined && opts.duration !== null) {\n      queryParams['duration'] = opts.duration\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/3.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryProtocolAvgMetrics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/protocolAvgMetrics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网络类型任务平均值指标数据\n      * @param {Object} opts - parameters\n      * @param {integer} opts.taskId - 任务Id\n      * @param {integer} opts.startTime - 开始时间 时间戳 需小于当前时间\n      * @param {integer} opts.endTime - 结束时间 时间戳 需大于开始时间\n      * @param {integer} [opts.duration] - 数据点间隔时间(分钟)，可选5/10/15/30/60/120/180/240/300/480/720，默认为任务调度周期，需大于任务调度周期  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      * @param string message\n      * @param netMetric data\n      */\n\n  queryNetworkAvgMetrics (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling queryNetworkAvgMetrics\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling queryNetworkAvgMetrics\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling queryNetworkAvgMetrics\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      queryParams['taskId'] = opts.taskId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.duration !== undefined && opts.duration !== null) {\n      queryParams['duration'] = opts.duration\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/3.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryNetworkAvgMetrics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/netAvgMetrics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询任务成功率指标数据\n      * @param {Object} opts - parameters\n      * @param {integer} opts.taskId - 任务Id\n      * @param {integer} opts.startTime - 开始时间 时间戳 需小于当前时间\n      * @param {integer} opts.endTime - 结束时间 时间戳 需大于开始时间\n      * @param {integer} [opts.duration] - 数据点间隔时间(分钟)，可选5/10/15/30/60/120/180/240/300/480/720，默认为任务调度周期，需大于任务调度周期  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      * @param string message\n      * @param successRateMetric data\n      */\n\n  querySuccessRateMetric (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling querySuccessRateMetric\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling querySuccessRateMetric\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling querySuccessRateMetric\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      queryParams['taskId'] = opts.taskId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.duration !== undefined && opts.duration !== null) {\n      queryParams['duration'] = opts.duration\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  detection/3.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call querySuccessRateMetric with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/successRateMetric',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = DETECTION\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/dh/v1/dh.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Quota\n * 与配额相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'dh'\nService._services[serviceId] = true\n\n/**\n * dh service.\n * @version 1.1.3\n */\n\nclass DH extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'dh.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询专有宿主机列表。&lt;br&gt;\n此接口支持分页查询，默认每页20条。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - dedicatedHostId - 专有宿主机ID，精确匹配，支持多个\naz - 可用区，精确匹配，支持多个\nstatus - 专有宿主机状态，精确匹配，支持多个，&lt;a href&#x3D;&quot;http://docs.jdcloud.com/dedicated-hosts/api/dh_status&quot;&gt;参考专有宿主机状态&lt;/a&gt;\nname - 专有宿主机名称，模糊匹配，支持单个\ndedicatedPoolId - 专有宿主机池ID，精确匹配，支持多个\ndedicatedHostType - 专有宿主机机型，精确匹配，支持多个\n  optional\n      * @param {tagFilter} [opts.tags] - Tag筛选条件。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dedicatedHost dedicatedHosts\n      * @param number totalCount\n      */\n\n  describeDedicatedHosts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDedicatedHosts\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dh/1.1.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDedicatedHosts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dedicatedHosts',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一台或多台指定机型的专有宿主机。&lt;br&gt;\n创建专有宿主机必须指定专有宿主机池。\n\n      * @param {Object} opts - parameters\n      * @param {dedicatedHostSpec} opts.dedicatedHostSpec - 描述专有宿主机配置\n\n      * @param {string} [opts.deployPolicy] - 是否支持AZ内专有宿主机强制均衡，默认为preferred--非强制，取值[preferred--非强制,required--强制]\n  optional\n      * @param {integer} [opts.maxCount] - 购买云主机的数量；取值范围：[1,100]，默认为1。\n  optional\n      * @param {string} [opts.clientToken] - 用于保证请求的幂等性。由客户端生成，长度不能超过64个字符。\n  optional\n      * @param {boolean} [opts.enableCpuTopology] - 是否开启cpu拓扑，true:开启，false:关闭，只有宿主机是非超卖模式，且没有资源的时候才能开启；开启后，该宿主机上的虚机可以配置cpu拓扑和NUMA映射等。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string dedicatedHostIds\n      */\n\n  allocDedicatedHosts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  allocDedicatedHosts\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.dedicatedHostSpec === undefined ||\n      opts.dedicatedHostSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dedicatedHostSpec' when calling allocDedicatedHosts\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.dedicatedHostSpec !== undefined &&\n      opts.dedicatedHostSpec !== null\n    ) {\n      postBody['dedicatedHostSpec'] = opts.dedicatedHostSpec\n    }\n    if (opts.deployPolicy !== undefined && opts.deployPolicy !== null) {\n      postBody['deployPolicy'] = opts.deployPolicy\n    }\n    if (opts.maxCount !== undefined && opts.maxCount !== null) {\n      postBody['maxCount'] = opts.maxCount\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (\n      opts.enableCpuTopology !== undefined &&\n      opts.enableCpuTopology !== null\n    ) {\n      postBody['enableCpuTopology'] = opts.enableCpuTopology\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dh/1.1.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call allocDedicatedHosts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dedicatedHosts',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  释放按配置计费、或包年包月已到期的单个专有宿主机。不能释放没有计费信息的专有宿主机。&lt;br&gt;\n专有宿主机状态必须为可用&lt;b&gt;available&lt;/b&gt;、不可用&lt;b&gt;unavailable&lt;/b&gt;、维护中&lt;b&gt;under-assessment&lt;/b&gt;，同时专有宿主机上必须没有云主机实例才可删除。&lt;br&gt;\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.dedicatedHostId - 专有宿主机ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  releaseDedicatedHost (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  releaseDedicatedHost\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dedicatedHostId === undefined || opts.dedicatedHostId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dedicatedHostId' when calling releaseDedicatedHost\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dedicatedHostId: opts.dedicatedHostId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dh/1.1.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call releaseDedicatedHost with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dedicatedHost/{dedicatedHostId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改专有宿主机部分属性，包括名称、描述。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.dedicatedHostId - 专有宿主机ID\n      * @param {string} [opts.name] - 名称，&lt;a href&#x3D;&quot;http://docs.jdcloud.com/virtual-machines/api/general_parameters&quot;&gt;参考公共参数规范&lt;/a&gt;。  optional\n      * @param {string} [opts.description] - 描述，&lt;a href&#x3D;&quot;http://docs.jdcloud.com/virtual-machines/api/general_parameters&quot;&gt;参考公共参数规范&lt;/a&gt;。  optional\n      * @param {boolean} [opts.enableCpuTopology] - 是否开启cpu拓扑，true:开启，false:关闭，只有宿主机是非超卖模式，且没有资源的时候才能开启；开启后，该宿主机上的虚机可以配置cpu拓扑和NUMA映射等。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyDedicatedHostAttribute (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyDedicatedHostAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dedicatedHostId === undefined || opts.dedicatedHostId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dedicatedHostId' when calling modifyDedicatedHostAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (\n      opts.enableCpuTopology !== undefined &&\n      opts.enableCpuTopology !== null\n    ) {\n      postBody['enableCpuTopology'] = opts.enableCpuTopology\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dedicatedHostId: opts.dedicatedHostId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dh/1.1.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyDedicatedHostAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dedicatedHost/{dedicatedHostId}:modifyAttribute',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询专有宿主机机型。\n\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - dedicatedHostType - 专有宿主机机型，精确匹配，支持多个\naz - 可用区，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param hostType dedicatedHostTypes\n      * @param number totalCount\n      */\n\n  describeDedicatedHostType (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDedicatedHostType\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dh/1.1.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDedicatedHostType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dedicatedHostType',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询专有宿主机池列表\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - dedicatedPoolId - 专有宿主机池ID，精确匹配，支持多个\nname - 专有宿主机名称，模糊匹配，支持单个\ndedicatedHostType - 专有宿主机机型，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dedicatedPool dedicatedPools\n      * @param number totalCount\n      */\n\n  describeDedicatedPools (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDedicatedPools\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dh/1.1.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDedicatedPools with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dedicatedPools',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  申请专有宿主机池。&lt;br&gt;\n专有宿主机池为专有宿主机的集合，为用户提供独享且跨机架的宿主机资源池，基于资源独享及故障隔离实现业务安全、高可用部署。&lt;br&gt;\n申请宿主机池需要指定机器类型，目前每一个专有宿主机池只能指定一种机器类型。可供选用的机器类型有通用性，内存性，高频计算型及GPU型。&lt;br&gt;\ndeployPolicy表示是否强制池中专有宿主机在每个AZ内数量均衡。可选值为prefered和required，默认为prefered。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.dedicatedHostType] - 支持的专有宿主机机型，每个专有宿主机池只能且必须指定一个专有宿主机机型\n  optional\n      * @param {string} [opts.name] - 专有宿主机池名称\n  optional\n      * @param {array} [opts.az] - 指定专有宿主机池支持的可用区，可指定多个。\n  optional\n      * @param {string} [opts.description] - 专有宿主机池的描述信息。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string dedicatedPoolId\n      */\n\n  allocDedicatedPool (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  allocDedicatedPool\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (\n      opts.dedicatedHostType !== undefined &&\n      opts.dedicatedHostType !== null\n    ) {\n      postBody['dedicatedHostType'] = opts.dedicatedHostType\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.az !== undefined && opts.az !== null) {\n      postBody['az'] = opts.az\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dh/1.1.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call allocDedicatedPool with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dedicatedPools',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改专有宿主机池属性，包括名称、描述和可用区。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.dedicatedPoolId - 专有宿主机ID\n      * @param {string} [opts.name] - 名称，&lt;a href&#x3D;&quot;http://docs.jdcloud.com/virtual-machines/api/general_parameters&quot;&gt;参考公共参数规范&lt;/a&gt;。  optional\n      * @param {string} [opts.description] - 描述，&lt;a href&#x3D;&quot;http://docs.jdcloud.com/virtual-machines/api/general_parameters&quot;&gt;参考公共参数规范&lt;/a&gt;。  optional\n      * @param {array} [opts.az] - 指定宿主机池申请专有宿主机时默认继承的可用区。&lt;br&gt;\n修改可用区时旧可用区必须是新可用区的子集，即可用区只能添加，不能减少。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyDedicatedPoolAttribute (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyDedicatedPoolAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dedicatedPoolId === undefined || opts.dedicatedPoolId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dedicatedPoolId' when calling modifyDedicatedPoolAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.az !== undefined && opts.az !== null) {\n      postBody['az'] = opts.az\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dedicatedPoolId: opts.dedicatedPoolId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dh/1.1.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyDedicatedPoolAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dedicatedPool/{dedicatedPoolId}:modifyAttribute',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  释放单个专有宿主机池。&lt;br&gt;\n专有宿主机池中必须没有专有宿主机时才可释放。\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.dedicatedPoolId - 专有宿主机ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  releaseDedicatedPool (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  releaseDedicatedPool\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dedicatedPoolId === undefined || opts.dedicatedPoolId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dedicatedPoolId' when calling releaseDedicatedPool\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dedicatedPoolId: opts.dedicatedPoolId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dh/1.1.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call releaseDedicatedPool with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dedicatedPool/{dedicatedPoolId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询配额，支持的类型：专有宿主机、专有宿主机池。\n\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - resourceTypes - 资源类型，支持多个[dedicatedHost，dedicatedPool]\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quotas\n      */\n\n  describeQuotas (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuotas\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dh/1.1.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuotas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dhQuotas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = DH\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/disk/v1/disk.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 售罄相关接口\n * 查询售罄情况\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'disk'\nService._services[serviceId] = true\n\n/**\n * disk service.\n * @version 0.12.8\n */\n\nclass DISK extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'disk.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  -   查询您已经创建的云硬盘。\n-   filters多个过滤条件之间是逻辑与(AND)，每个条件内部的多个取值是逻辑或(OR)\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - diskId - 云硬盘ID，精确匹配，支持多个\ndiskType - 云硬盘类型，精确匹配，支持多个，取值为 ssd,premium-hdd,ssd.io1,ssd.gp1,hdd.std1\ninstanceId - 云硬盘所挂载主机的ID，精确匹配，支持多个\ninstanceType - 云硬盘所挂载主机的类型，精确匹配，支持多个\nstatus - 云硬盘状态，精确匹配，支持多个\naz - 可用区，精确匹配，支持多个\nname - 云硬盘名称，模糊匹配，支持单个\nmultiAttach - 云硬盘是否多点挂载，精确匹配，支持单个\nencrypted - 云硬盘是否加密，精确匹配，支持单个\npolicyId - 绑定policyId的云硬盘，精确匹配，支持多个\nnotPolicyId - 未绑定policyId的云硬盘，精确匹配，支持多个\n  optional\n      * @param {tagFilter} [opts.tags] - Tag筛选条件  optional\n      * @param {sort} [opts.orders] - name - 排序字段，只支持create_time和trash_time字段\ndirection - 排序规则\n  optional\n      * @param {string} [opts.resourceGroupIds] - 资源组筛选条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param disk disks\n      * @param integer totalCount  查询的云硬盘数目\n      */\n\n  describeDisks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDisks\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n    Object.assign(queryParams, super.buildSortParam(opts.orders, 'orders'))\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.resourceGroupIds, 'resourceGroupIds')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDisks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/disks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   创建一块或多块按配置或者按使用时长付费的云硬盘。\n-   云硬盘类型包括高效云盘(premium-hdd)、SSD云盘(ssd)、通用型SSD(ssd.gp1)、性能型SSD(ssd.io1)、容量型HDD(hdd.std1)。\n-   计费方式默认为按配置付费。\n-   创建完成后，云硬盘状态为 available。\n-   可选参数快照 ID用于从快照创建新盘。\n-   批量创建时，云硬盘的命名为 硬盘名称-数字，例如 myDisk-1，myDisk-2。\n-   maxCount为最大努力，不保证一定能达到maxCount。\n-   userTags 为创建云盘时打的标签\n\n      * @param {Object} opts - parameters\n      * @param {diskSpec} opts.diskSpec - 创建云硬盘规格\n      * @param {integer} opts.maxCount - 购买实例数量；取值范围：[1,100]\n      * @param {array} [opts.userTags] - 用户标签,默认为空;tag标签的限制：每个资源最多允许绑定 10 个不同的标签，同一资源每个标签“键”上只能存在1个标签“值”；标签键/值只支持中文、数字、大小写字母、空格及特殊符号_.:/&#x3D;+-@;当无tags时,reps结果返回中tagmsg为空  optional\n      * @param {string} opts.clientToken - 幂等性校验参数\n      * @param {string} [opts.resourceGroupId] - 资源组ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param policyDiskRelationOpResult policyRelations\n      * @param string diskIds\n      * @param string tagmsg  标签结果信息\n      */\n\n  createDisks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDisks\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.diskSpec === undefined || opts.diskSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.diskSpec' when calling createDisks\"\n      )\n    }\n    if (opts.maxCount === undefined || opts.maxCount === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.maxCount' when calling createDisks\"\n      )\n    }\n    if (opts.clientToken === undefined || opts.clientToken === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clientToken' when calling createDisks\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.diskSpec !== undefined && opts.diskSpec !== null) {\n      postBody['diskSpec'] = opts.diskSpec\n    }\n    if (opts.maxCount !== undefined && opts.maxCount !== null) {\n      postBody['maxCount'] = opts.maxCount\n    }\n    if (opts.userTags !== undefined && opts.userTags !== null) {\n      postBody['userTags'] = opts.userTags\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.resourceGroupId !== undefined && opts.resourceGroupId !== null) {\n      postBody['resourceGroupId'] = opts.resourceGroupId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDisks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/disks',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询某一块云硬盘的信息详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.diskId - 云硬盘ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param disk disk\n      */\n\n  describeDisk (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDisk\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.diskId === undefined || opts.diskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.diskId' when calling describeDisk\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      diskId: opts.diskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDisk with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/disks/{diskId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改云硬盘的名字或描述信息，名字或描述信息至少要指定一个。\n      * @param {Object} opts - parameters\n      * @param {string} opts.diskId - 云硬盘ID\n      * @param {string} [opts.name] - 云硬盘名称，只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符。  optional\n      * @param {string} [opts.description] - 云硬盘描述，允许输入UTF-8编码下的全部字符，不超过256字符。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyDiskAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyDiskAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.diskId === undefined || opts.diskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.diskId' when calling modifyDiskAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      diskId: opts.diskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyDiskAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/disks/{diskId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   删除一块按配置计费的云硬盘，云盘类型包括高效云盘、SSD云盘、通用型SSD、性能型SSD和容量型HDD。\n-   删除云盘时，云盘的状态必须为 待挂载（Available）。\n-   云盘被删除后，云硬盘快照可以被保留。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.diskId - 云硬盘ID\n      * @param {boolean} [opts.putInRecycleBin] - true 加入回收站 false 或者不传直接删除  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDisk (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDisk\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.diskId === undefined || opts.diskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.diskId' when calling deleteDisk\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.putInRecycleBin !== undefined && opts.putInRecycleBin !== null) {\n      queryParams['putInRecycleBin'] = opts.putInRecycleBin\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      diskId: opts.diskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDisk with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/disks/{diskId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   仅可对制作快照的源硬盘进行数据恢复操作。\n-   仅源硬盘处于可用状态时才能使用快照进行数据恢复操作。\n-   云硬盘恢复后，当前数据将被清除，请您谨慎操作。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.diskId - 云硬盘ID\n      * @param {string} opts.snapshotId - 用于恢复云盘的快照ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restoreDisk (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restoreDisk\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.diskId === undefined || opts.diskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.diskId' when calling restoreDisk\"\n      )\n    }\n    if (opts.snapshotId === undefined || opts.snapshotId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.snapshotId' when calling restoreDisk\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.snapshotId !== undefined && opts.snapshotId !== null) {\n      postBody['snapshotId'] = opts.snapshotId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      diskId: opts.diskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restoreDisk with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/disks/{diskId}:restore',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   扩容云硬盘到指定大小，云硬盘状态必须为 available。\n-   当云硬盘正在创建快照时，不允许扩容。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.diskId - 云硬盘ID\n      * @param {integer} opts.diskSizeGB - 扩容后的云硬盘大小，单位为GiB\n      * @param {integer} [opts.iops] - 修改ssd.io1型云硬盘的iops数量，当且仅当ssd.io1型的云盘类型有效，步长是10; 默认iops为云硬盘原有iops值  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  extendDisk (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  extendDisk\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.diskId === undefined || opts.diskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.diskId' when calling extendDisk\"\n      )\n    }\n    if (opts.diskSizeGB === undefined || opts.diskSizeGB === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.diskSizeGB' when calling extendDisk\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.diskSizeGB !== undefined && opts.diskSizeGB !== null) {\n      postBody['diskSizeGB'] = opts.diskSizeGB\n    }\n    if (opts.iops !== undefined && opts.iops !== null) {\n      postBody['iops'] = opts.iops\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      diskId: opts.diskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call extendDisk with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/disks/{diskId}:extend',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   查询您已经创建的云硬盘。\n-   filters多个过滤条件之间是逻辑与(AND)，每个条件内部的多个取值是逻辑或(OR)\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {array} [opts.tags] - Tag筛选条件  optional\n      * @param {array} [opts.filterGroups] - diskId - 云硬盘ID，精确匹配，支持多个\ndiskType - 云硬盘类型，精确匹配，支持多个，取值为 ssd,premium-hdd,ssd.io1,ssd.gp1,hdd.std1\ninstanceId - 云硬盘所挂载主机的ID，精确匹配，支持多个\ninstanceType - 云硬盘所挂载主机的类型，精确匹配，支持多个\nstatus - 可用区，精确匹配，支持多个\naz - 云硬盘状态，精确匹配，支持多个\nname - 云硬盘名称，模糊匹配，支持单个\nmultiAttach - 云硬盘是否多点挂载，精确匹配，支持单个\nencrypted - 云硬盘是否加密，精确匹配，支持单个\npolicyId - 绑定policyId的云硬盘，精确匹配，支持多个\nnotPolicyId - 未绑定policyId的云硬盘，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param disk disks\n      * @param integer totalCount  查询的云硬盘数目\n      */\n\n  describeVolumesIgnoreServiceCode (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVolumesIgnoreServiceCode\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (opts.filterGroups !== undefined && opts.filterGroups !== null) {\n      postBody['filterGroups'] = opts.filterGroups\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVolumesIgnoreServiceCode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/disks:ignoreServiceCode',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   从回收站中恢复云盘，云盘的状态必须为in-recyclebin。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.diskId - 云硬盘ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  recoverDisk (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  recoverDisk\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.diskId === undefined || opts.diskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.diskId' when calling recoverDisk\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      diskId: opts.diskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call recoverDisk with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/disks/{diskId}:recover',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询云硬盘和快照资源的配额\n      * @param {Object} opts - parameters\n      * @param {string} opts.type - 资源类型  disk：用户能创建的云盘的配额  snapshot： 用户能创建的快照的配额 snapshot_policy： 用户能创建的快照策略的配额\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quota\n      */\n\n  describeQuota (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuota\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.type === undefined || opts.type === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.type' when calling describeQuota\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuota with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/quotas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询云硬盘快照列表，filters多个过滤条件之间是逻辑与(AND)，每个条件内部的多个取值是逻辑或(OR)\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {string} [opts.snapshotSource] - 查找快照的类型，可以为private，others，shared，默认为private  optional\n      * @param {filter} [opts.filters] - snapshotId - 云硬盘快照ID，支持多个\ndiskId - 生成快照的云硬盘ID，支持多个\nstatus - 快照状态，精确匹配，支持多个,取值为 creating、available、copying、deleting、error_create、error_delete\nname - 快照名称，模糊匹配，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshot snapshots\n      * @param integer totalCount  查询的快照数目\n      */\n\n  describeSnapshots (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSnapshots\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.snapshotSource !== undefined && opts.snapshotSource !== null) {\n      queryParams['snapshotSource'] = opts.snapshotSource\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSnapshots with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshots',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   为指定云硬盘创建快照，新生成的快照的状态为creating。\n-   同一地域下单用户快照的配额为15块。\n-   为保证数据完整性，请您在创建快照之前，停止对云硬盘进行写入操作，以保证快照数据的完整性。\n-   在执行创建快照前，建议您对云硬盘进行卸载操作，创建快照后再重新挂载到云主机上。\n-   手动快照的生命周期独立于云硬盘，请您及时删除不需要的快照。\n-   创建快照所需时间取决于云硬盘容量的大小，云硬盘容量越大耗时越长。\n\n      * @param {Object} opts - parameters\n      * @param {snapshotSpec} opts.snapshotSpec - 创建快照规格\n      * @param {string} opts.clientToken - 幂等性校验参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string snapshotId  创建的快照ID\n      */\n\n  createSnapshot (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSnapshot\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.snapshotSpec === undefined || opts.snapshotSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.snapshotSpec' when calling createSnapshot\"\n      )\n    }\n    if (opts.clientToken === undefined || opts.clientToken === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clientToken' when calling createSnapshot\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.snapshotSpec !== undefined && opts.snapshotSpec !== null) {\n      postBody['snapshotSpec'] = opts.snapshotSpec\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSnapshot with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshots',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   删除云硬盘快照:快照状态必须为 available 或 error 状态。\n-   快照独立于云硬盘生命周期，删除快照不会对创建快照的云硬盘有任何影响。\n-   快照删除后不可恢复，请谨慎操作。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.snapshotIds] - 快照ID列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param delSnapshot snapshots\n      * @param integer successCount  删除快照成功的数量\n      * @param integer failedCount  删除快照成功的数量\n      */\n\n  deleteSnapshots (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSnapshots\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.snapshotIds, 'snapshotIds')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSnapshots with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshots',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询云硬盘快照信息详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.snapshotId - 快照ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshot snapshot\n      */\n\n  describeSnapshot (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSnapshot\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.snapshotId === undefined || opts.snapshotId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.snapshotId' when calling describeSnapshot\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      snapshotId: opts.snapshotId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSnapshot with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshots/{snapshotId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改快照的名字或描述信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.snapshotId - 快照ID\n      * @param {string} [opts.name] - 快照名称  optional\n      * @param {string} [opts.description] - 快照描述  optional\n      * @param {string} [opts.expireTime] - 快照过期时间，三者至少指定一个  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifySnapshotAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifySnapshotAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.snapshotId === undefined || opts.snapshotId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.snapshotId' when calling modifySnapshotAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.expireTime !== undefined && opts.expireTime !== null) {\n      postBody['expireTime'] = opts.expireTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      snapshotId: opts.snapshotId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifySnapshotAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshots/{snapshotId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   删除单个云硬盘快照:快照状态必须为 available 或 error 状态。\n-   快照独立于云硬盘生命周期，删除快照不会对创建快照的云硬盘有任何影响。\n-   快照删除后不可恢复，请谨慎操作。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.snapshotId - 快照ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSnapshot (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSnapshot\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.snapshotId === undefined || opts.snapshotId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.snapshotId' when calling deleteSnapshot\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      snapshotId: opts.snapshotId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSnapshot with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshots/{snapshotId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询快照容量\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotCapacity capacities\n      */\n\n  describeSnapshotsCapacity (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSnapshotsCapacity\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSnapshotsCapacity with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshots:capacity',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询快照链的快照个数和快照总容量\n      * @param {Object} opts - parameters\n      * @param {string} [opts.diskId] - 云硬盘ID  optional\n      * @param {string} [opts.snapshotId] - 快照ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object snapshotChain\n      */\n\n  describeSnapshotChain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSnapshotChain\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.diskId !== undefined && opts.diskId !== null) {\n      queryParams['diskId'] = opts.diskId\n    }\n    if (opts.snapshotId !== undefined && opts.snapshotId !== null) {\n      queryParams['snapshotId'] = opts.snapshotId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSnapshotChain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshots:chain',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建快照策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 策略名称\n      * @param {integer} opts.interval - 策略执行周期，单位:秒，不小于12小时\n      * @param {string} opts.effectiveTime - 策略生效时间，格式&#x60;YYYY-MM-DDTHH:mm:ss+xx:xx&#x60;。如&#x60;2020-02-02T20:02:00+08:00&#x60;\n      * @param {integer} opts.snapshotLifecycle - 快照保留时间，单位:秒，0:表示不删除\n      * @param {contactInfo} [opts.contactInfo] - 联系人信息  optional\n      * @param {integer} opts.status - 策略状态。1:启用 2:禁用\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string id  是否发送短信。0:不发送 1:发送\n      * @param string name  是否发送短信。0:不发送 1:发送\n      * @param string pin  用户pin\n      * @param integer interval  策略执行间隔，单位:秒\n      * @param string effectiveTime  策略生效时间。格式&#x60;YYYY-MM-DDTHH:mm:ss+xx:xx&#x60;。如&#x60;2020-02-02T20:02:00+08:00&#x60;\n      * @param string lastTriggerTime  策略上次执行时间。格式&#x60;YYYY-MM-DDTHH:mm:ss+xx:xx&#x60;。如&#x60;2020-02-02T20:02:00+08:00&#x60;\n      * @param string nextTriggerTime  策略下次执行时间。格式&#x60;YYYY-MM-DDTHH:mm:ss+xx:xx&#x60;。如&#x60;2020-02-02T20:02:00+08:00&#x60;\n      * @param integer snapshotLifecycle  快照保留时间。单位:秒。0：永久保留\n      * @param contactInfo contactInfo  联系人信息\n      * @param string createTime  策略下次执行时间。格式&#x60;YYYY-MM-DDTHH:mm:ss+xx:xx&#x60;。如&#x60;2020-02-02T20:02:00+08:00&#x60;\n      * @param string updateTime  策略下次执行时间。格式&#x60;YYYY-MM-DDTHH:mm:ss+xx:xx&#x60;。如&#x60;2020-02-02T20:02:00+08:00&#x60;\n      * @param integer status  策略状态。1：启用 2：禁用\n      * @param integer diskCount  策略绑定的disk数量\n      */\n\n  createSnapshotPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSnapshotPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createSnapshotPolicy\"\n      )\n    }\n    if (opts.interval === undefined || opts.interval === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.interval' when calling createSnapshotPolicy\"\n      )\n    }\n    if (opts.effectiveTime === undefined || opts.effectiveTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.effectiveTime' when calling createSnapshotPolicy\"\n      )\n    }\n    if (\n      opts.snapshotLifecycle === undefined ||\n      opts.snapshotLifecycle === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.snapshotLifecycle' when calling createSnapshotPolicy\"\n      )\n    }\n    if (opts.status === undefined || opts.status === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.status' when calling createSnapshotPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.interval !== undefined && opts.interval !== null) {\n      postBody['interval'] = opts.interval\n    }\n    if (opts.effectiveTime !== undefined && opts.effectiveTime !== null) {\n      postBody['effectiveTime'] = opts.effectiveTime\n    }\n    if (\n      opts.snapshotLifecycle !== undefined &&\n      opts.snapshotLifecycle !== null\n    ) {\n      postBody['snapshotLifecycle'] = opts.snapshotLifecycle\n    }\n    if (opts.contactInfo !== undefined && opts.contactInfo !== null) {\n      postBody['contactInfo'] = opts.contactInfo\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSnapshotPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshotPolicy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改快照策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 策略ID\n      * @param {string} opts.name - 策略名称\n      * @param {integer} opts.interval - 策略执行周期，单位:秒，不小于12小时\n      * @param {string} opts.effectiveTime - 策略生效时间，格式&#x60;YYYY-MM-DDTHH:mm:ss+xx:xx&#x60;。如&#x60;2020-02-02T20:02:00+08:00&#x60;\n      * @param {integer} opts.snapshotLifecycle - 快照保留时间，单位:秒，0:表示不删除\n      * @param {contactInfo} [opts.contactInfo] - 联系人信息  optional\n      * @param {integer} opts.status - 策略状态。1:启用 2:禁用\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string id  是否发送短信。0:不发送 1:发送\n      * @param string name  是否发送短信。0:不发送 1:发送\n      * @param string pin  用户pin\n      * @param integer interval  策略执行间隔，单位:秒\n      * @param string effectiveTime  策略生效时间。格式&#x60;YYYY-MM-DDTHH:mm:ss+xx:xx&#x60;。如&#x60;2020-02-02T20:02:00+08:00&#x60;\n      * @param string lastTriggerTime  策略上次执行时间。格式&#x60;YYYY-MM-DDTHH:mm:ss+xx:xx&#x60;。如&#x60;2020-02-02T20:02:00+08:00&#x60;\n      * @param string nextTriggerTime  策略下次执行时间。格式&#x60;YYYY-MM-DDTHH:mm:ss+xx:xx&#x60;。如&#x60;2020-02-02T20:02:00+08:00&#x60;\n      * @param integer snapshotLifecycle  快照保留时间。单位:秒。0：永久保留\n      * @param contactInfo contactInfo  联系人信息\n      * @param string createTime  策略下次执行时间。格式&#x60;YYYY-MM-DDTHH:mm:ss+xx:xx&#x60;。如&#x60;2020-02-02T20:02:00+08:00&#x60;\n      * @param string updateTime  策略下次执行时间。格式&#x60;YYYY-MM-DDTHH:mm:ss+xx:xx&#x60;。如&#x60;2020-02-02T20:02:00+08:00&#x60;\n      * @param integer status  策略状态。1：启用 2：禁用\n      * @param integer diskCount  策略绑定的disk数量\n      */\n\n  updateSnapshotPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateSnapshotPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling updateSnapshotPolicy\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling updateSnapshotPolicy\"\n      )\n    }\n    if (opts.interval === undefined || opts.interval === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.interval' when calling updateSnapshotPolicy\"\n      )\n    }\n    if (opts.effectiveTime === undefined || opts.effectiveTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.effectiveTime' when calling updateSnapshotPolicy\"\n      )\n    }\n    if (\n      opts.snapshotLifecycle === undefined ||\n      opts.snapshotLifecycle === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.snapshotLifecycle' when calling updateSnapshotPolicy\"\n      )\n    }\n    if (opts.status === undefined || opts.status === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.status' when calling updateSnapshotPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.interval !== undefined && opts.interval !== null) {\n      postBody['interval'] = opts.interval\n    }\n    if (opts.effectiveTime !== undefined && opts.effectiveTime !== null) {\n      postBody['effectiveTime'] = opts.effectiveTime\n    }\n    if (\n      opts.snapshotLifecycle !== undefined &&\n      opts.snapshotLifecycle !== null\n    ) {\n      postBody['snapshotLifecycle'] = opts.snapshotLifecycle\n    }\n    if (opts.contactInfo !== undefined && opts.contactInfo !== null) {\n      postBody['contactInfo'] = opts.contactInfo\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateSnapshotPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshotPolicy/{policyId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除快照策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyId - 策略ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSnapshotPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSnapshotPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.policyId === undefined || opts.policyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyId' when calling deleteSnapshotPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      policyId: opts.policyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSnapshotPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshotPolicy/{policyId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询快照策略\n      * @param {Object} opts - parameters\n      * @param {string} [opts.name] - 策略名称,默认为空  optional\n      * @param {array} [opts.policyId] - 策略ID,默认为空  optional\n      * @param {array} [opts.status] - 策略状态。1: 启用 2：禁用  optional\n      * @param {orderItem} [opts.order] - 排序字段，只支持create_time和update_time字段  optional\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotPolicy policies\n      * @param integer totalCount  查询的快照策略数目\n      */\n\n  describeSnapshotPolicies (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSnapshotPolicies\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.policyId !== undefined && opts.policyId !== null) {\n      postBody['policyId'] = opts.policyId\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.order !== undefined && opts.order !== null) {\n      postBody['order'] = opts.order\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSnapshotPolicies with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshotPolicies:describe',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   查询您已经创建的快照策略。\n-   filters多个过滤条件之间是逻辑与(AND)，每个条件内部的多个取值是逻辑或(OR)\n\n      * @param {Object} opts - parameters\n      * @param {array} [opts.filterGroups] - 过滤条件  optional\n      * @param {orderItem} [opts.order] - 排序字段，只支持create_time和update_time字段  optional\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotPolicy policies\n      * @param integer totalCount  查询的快照策略数目\n      */\n\n  describeSnapPolices (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSnapPolices\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.filterGroups !== undefined && opts.filterGroups !== null) {\n      postBody['filterGroups'] = opts.filterGroups\n    }\n    if (opts.order !== undefined && opts.order !== null) {\n      postBody['order'] = opts.order\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSnapPolices with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapPolicies:describe',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  绑定/解绑快照策略与磁盘关系\n      * @param {Object} opts - parameters\n      * @param {array} [opts.relations] - 绑定/解绑操作  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param policyDiskRelationOpResult opResults\n      */\n\n  applySnapshotPolicies (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  applySnapshotPolicies\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.relations !== undefined && opts.relations !== null) {\n      postBody['relations'] = opts.relations\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call applySnapshotPolicies with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshotPolicies:apply',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询快照策略与磁盘绑定关系\n      * @param {Object} opts - parameters\n      * @param {array} [opts.diskId] - 磁盘ID  optional\n      * @param {array} [opts.diskRegion] - 磁盘地域ID  optional\n      * @param {array} [opts.policyId] - 策略ID  optional\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数量\n      * @param descSnapshotRelationsData relationResults\n      */\n\n  describeSnapshotPolicyDiskRelations (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSnapshotPolicyDiskRelations\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.diskId !== undefined && opts.diskId !== null) {\n      postBody['diskId'] = opts.diskId\n    }\n    if (opts.diskRegion !== undefined && opts.diskRegion !== null) {\n      postBody['diskRegion'] = opts.diskRegion\n    }\n    if (opts.policyId !== undefined && opts.policyId !== null) {\n      postBody['policyId'] = opts.policyId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSnapshotPolicyDiskRelations with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/snapshotPolicyDiskRelations:describe',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询云硬盘售罄情况列表\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param soldout soldout\n      * @param integer totalCount  查询的可用区售罄情况数目\n      */\n\n  describeSoldout (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSoldout\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  disk/0.12.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSoldout with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/soldout',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = DISK\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/dms/v1/dms.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * DmsView\n * 视图相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'dms'\nService._services[serviceId] = true\n\n/**\n * dms service.\n * @version 1.4.0\n */\n\nclass DMS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'dms.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  校验当前的用户是否允许访问DMS控制台\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string strResult  允许访问\n      */\n\n  dmsConsoleCheck (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call dmsConsoleCheck with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/console:check',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生产创建事件SQL语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id。  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.eventName] - 事件名称。  optional\n      * @param {} [opts.eventComment] - 注释。  optional\n      * @param {} [opts.eventStatus] - 状态，ENABLED,DISABLED, SLAVESIDE_DISABLED。  optional\n      * @param {} [opts.isPreserve] - 完成后是否保存。  optional\n      * @param {} [opts.eventDefinition] - 事件定义。  optional\n      * @param {} [opts.eventType] - 调度方式，ONE_TIME,RECURRING。  optional\n      * @param {} [opts.executeAt] - 执行一次的时间。  optional\n      * @param {} [opts.intervalValue] - 循环执行时间隔时间的值。  optional\n      * @param {} [opts.intervalField] - 循环执行时间隔时间的单位，YEAR,QUARTER,MONTH,WEEK,DAY,HOUR,MINUTE,SECOND,YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND,MINUTE_SECOND。  optional\n      * @param {} [opts.starts] - 循环执行开始时间。  optional\n      * @param {} [opts.ends] - 循环执行结束时间。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalCreateEvent (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalCreateEvent\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.eventName !== undefined && opts.eventName !== null) {\n      postBody['eventName'] = opts.eventName\n    }\n    if (opts.eventComment !== undefined && opts.eventComment !== null) {\n      postBody['eventComment'] = opts.eventComment\n    }\n    if (opts.eventStatus !== undefined && opts.eventStatus !== null) {\n      postBody['eventStatus'] = opts.eventStatus\n    }\n    if (opts.isPreserve !== undefined && opts.isPreserve !== null) {\n      postBody['isPreserve'] = opts.isPreserve\n    }\n    if (opts.eventDefinition !== undefined && opts.eventDefinition !== null) {\n      postBody['eventDefinition'] = opts.eventDefinition\n    }\n    if (opts.eventType !== undefined && opts.eventType !== null) {\n      postBody['eventType'] = opts.eventType\n    }\n    if (opts.executeAt !== undefined && opts.executeAt !== null) {\n      postBody['executeAt'] = opts.executeAt\n    }\n    if (opts.intervalValue !== undefined && opts.intervalValue !== null) {\n      postBody['intervalValue'] = opts.intervalValue\n    }\n    if (opts.intervalField !== undefined && opts.intervalField !== null) {\n      postBody['intervalField'] = opts.intervalField\n    }\n    if (opts.starts !== undefined && opts.starts !== null) {\n      postBody['starts'] = opts.starts\n    }\n    if (opts.ends !== undefined && opts.ends !== null) {\n      postBody['ends'] = opts.ends\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalCreateEvent with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/event:generalCreate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成修改事件sql语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id。  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.originEventName] - 原始事件名称。  optional\n      * @param {} [opts.eventName] - 新事件名称。  optional\n      * @param {} [opts.eventComment] - 注释。  optional\n      * @param {} [opts.eventStatus] - 状态，ENABLED,DISABLED, SLAVESIDE_DISABLED。  optional\n      * @param {} [opts.isPreserve] - 完成后是否保存。  optional\n      * @param {} [opts.eventDefinition] - 事件定义。  optional\n      * @param {} [opts.eventType] - 调度方式，ONE_TIME,RECURRING。  optional\n      * @param {} [opts.executeAt] - 执行一次的时间。  optional\n      * @param {} [opts.intervalValue] - 循环执行时间隔时间的值。  optional\n      * @param {} [opts.intervalField] - 循环执行时间隔时间的单位，YEAR,QUARTER,MONTH,WEEK,DAY,HOUR,MINUTE,SECOND,YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND,MINUTE_SECOND。  optional\n      * @param {} [opts.starts] - 循环执行开始时间。  optional\n      * @param {} [opts.ends] - 循环执行结束时间。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalAlterEvent (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalAlterEvent\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.originEventName !== undefined && opts.originEventName !== null) {\n      postBody['originEventName'] = opts.originEventName\n    }\n    if (opts.eventName !== undefined && opts.eventName !== null) {\n      postBody['eventName'] = opts.eventName\n    }\n    if (opts.eventComment !== undefined && opts.eventComment !== null) {\n      postBody['eventComment'] = opts.eventComment\n    }\n    if (opts.eventStatus !== undefined && opts.eventStatus !== null) {\n      postBody['eventStatus'] = opts.eventStatus\n    }\n    if (opts.isPreserve !== undefined && opts.isPreserve !== null) {\n      postBody['isPreserve'] = opts.isPreserve\n    }\n    if (opts.eventDefinition !== undefined && opts.eventDefinition !== null) {\n      postBody['eventDefinition'] = opts.eventDefinition\n    }\n    if (opts.eventType !== undefined && opts.eventType !== null) {\n      postBody['eventType'] = opts.eventType\n    }\n    if (opts.executeAt !== undefined && opts.executeAt !== null) {\n      postBody['executeAt'] = opts.executeAt\n    }\n    if (opts.intervalValue !== undefined && opts.intervalValue !== null) {\n      postBody['intervalValue'] = opts.intervalValue\n    }\n    if (opts.intervalField !== undefined && opts.intervalField !== null) {\n      postBody['intervalField'] = opts.intervalField\n    }\n    if (opts.starts !== undefined && opts.starts !== null) {\n      postBody['starts'] = opts.starts\n    }\n    if (opts.ends !== undefined && opts.ends !== null) {\n      postBody['ends'] = opts.ends\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalAlterEvent with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/event:generalAlter',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成删除事件sql语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.eventName] - 事件名称。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalDropEvent (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalDropEvent\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.eventName !== undefined && opts.eventName !== null) {\n      postBody['eventName'] = opts.eventName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalDropEvent with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/event:generalDrop',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取事件详情，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.eventName] - 事件名称。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string dbName  数据库名称。\n      * @param string eventName  事件名称。\n      * @param string eventComment  注释。\n      * @param string eventStatus  状态，ENABLED,DISABLED, SLAVESIDE_DISABLED。\n      * @param boolean isPreserve  完成后是否保存。\n      * @param string eventDefinition  事件定义。\n      * @param string eventType  调度方式，ONE_TIME,RECURRING。\n      * @param string executeAt  执行一次的时间。\n      * @param string intervalValue  循环执行时间隔时间的值。\n      * @param string intervalField  循环执行时间隔时间的单位，YEAR,QUARTER,MONTH,WEEK,DAY,HOUR,MINUTE,SECOND,YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND,MINUTE_SECOND。\n      * @param string starts  循环执行开始时间。\n      * @param string ends  循环执行结束时间。\n      */\n\n  eventInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  eventInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.eventName !== undefined && opts.eventName !== null) {\n      postBody['eventName'] = opts.eventName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call eventInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/event:info',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建导入文件任务，支持Stardb\n      * @param {Object} opts - parameters\n      * @param {} [opts.filename] - 文件名称  optional\n      * @param {} [opts.totalSize] - 文件总大小  optional\n      * @param {} [opts.chunkSize] - 文件分片大小  optional\n      * @param {} [opts.totalChunks] - 文件分片数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string uploadId  导入文件任务id\n      */\n\n  createImportFileTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createImportFileTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.filename !== undefined && opts.filename !== null) {\n      postBody['filename'] = opts.filename\n    }\n    if (opts.totalSize !== undefined && opts.totalSize !== null) {\n      postBody['totalSize'] = opts.totalSize\n    }\n    if (opts.chunkSize !== undefined && opts.chunkSize !== null) {\n      postBody['chunkSize'] = opts.chunkSize\n    }\n    if (opts.totalChunks !== undefined && opts.totalChunks !== null) {\n      postBody['totalChunks'] = opts.totalChunks\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createImportFileTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/importFileTask:create',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上传文件，支持Stardb，只支持前端页面使用\n      * @param {Object} opts - parameters\n      * @param {} [opts.taskId] - 上传文件任务id  optional\n      * @param {} [opts.chunkNumber] - 上传文件分片号  optional\n      * @param {} [opts.identifier] - 分片文件MD5  optional\n      * @param {} [opts.file] - 分片文件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param uploadImportFileResult uploadImportFileResult\n      */\n\n  uploadImportFileTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  uploadImportFileTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n    if (opts.chunkNumber !== undefined && opts.chunkNumber !== null) {\n      postBody['chunkNumber'] = opts.chunkNumber\n    }\n    if (opts.identifier !== undefined && opts.identifier !== null) {\n      postBody['identifier'] = opts.identifier\n    }\n    if (opts.file !== undefined && opts.file !== null) {\n      postBody['file'] = opts.file\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call uploadImportFileTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/importFileTask:upload',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建数据变更工单，支持Stardb\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据库id  optional\n      * @param {} [opts.dbName] - 数据库名称  optional\n      * @param {} [opts.taskPlanTypeEnum] - 执行方式，AUTO(&quot;AUTO&quot;, 0), BY_CREATOR(&quot;BY_CREATOR&quot;, 1)  optional\n      * @param {} [opts.dbaApproveTypeEnum] - DBA审批方式，AUTO(&quot;AUTO&quot;, 0), MANUAL(&quot;MANUAL&quot;, 1)  optional\n      * @param {} [opts.memo] - 申请原因  optional\n      * @param {} [opts.sqlText] - SQL文本，变更SQL选择文本时，必填  optional\n      * @param {} [opts.sqlFileTaskId] - SQL附件导入任务Id  optional\n      * @param {} [opts.rollbackSqlText] - 回滚SQL文本，选填  optional\n      * @param {} [opts.rollbackFileTaskId] - 回滚SQL附件导入任务Id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string flowId  工单id\n      */\n\n  createDataFlow (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDataFlow\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.taskPlanTypeEnum !== undefined && opts.taskPlanTypeEnum !== null) {\n      postBody['taskPlanTypeEnum'] = opts.taskPlanTypeEnum\n    }\n    if (\n      opts.dbaApproveTypeEnum !== undefined &&\n      opts.dbaApproveTypeEnum !== null\n    ) {\n      postBody['dbaApproveTypeEnum'] = opts.dbaApproveTypeEnum\n    }\n    if (opts.memo !== undefined && opts.memo !== null) {\n      postBody['memo'] = opts.memo\n    }\n    if (opts.sqlText !== undefined && opts.sqlText !== null) {\n      postBody['sqlText'] = opts.sqlText\n    }\n    if (opts.sqlFileTaskId !== undefined && opts.sqlFileTaskId !== null) {\n      postBody['sqlFileTaskId'] = opts.sqlFileTaskId\n    }\n    if (opts.rollbackSqlText !== undefined && opts.rollbackSqlText !== null) {\n      postBody['rollbackSqlText'] = opts.rollbackSqlText\n    }\n    if (\n      opts.rollbackFileTaskId !== undefined &&\n      opts.rollbackFileTaskId !== null\n    ) {\n      postBody['rollbackFileTaskId'] = opts.rollbackFileTaskId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDataFlow with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dataFlow:create',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建结构变更工单，支持Stardb\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据库id  optional\n      * @param {} [opts.dbName] - 数据库名称  optional\n      * @param {} [opts.taskPlanTypeEnum] - 执行方式，AUTO(&quot;AUTO&quot;, 0), BY_CREATOR(&quot;BY_CREATOR&quot;, 1)  optional\n      * @param {} [opts.dbaApproveTypeEnum] - DBA审批方式，AUTO(&quot;AUTO&quot;, 0), MANUAL(&quot;MANUAL&quot;, 1)  optional\n      * @param {} [opts.memo] - 申请原因  optional\n      * @param {} [opts.sqlText] - SQL文本，变更SQL选择文本时，必填  optional\n      * @param {} [opts.sqlFileTaskId] - SQL附件导入任务Id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string flowId  工单id\n      */\n\n  createStructureFlow (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createStructureFlow\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.taskPlanTypeEnum !== undefined && opts.taskPlanTypeEnum !== null) {\n      postBody['taskPlanTypeEnum'] = opts.taskPlanTypeEnum\n    }\n    if (\n      opts.dbaApproveTypeEnum !== undefined &&\n      opts.dbaApproveTypeEnum !== null\n    ) {\n      postBody['dbaApproveTypeEnum'] = opts.dbaApproveTypeEnum\n    }\n    if (opts.memo !== undefined && opts.memo !== null) {\n      postBody['memo'] = opts.memo\n    }\n    if (opts.sqlText !== undefined && opts.sqlText !== null) {\n      postBody['sqlText'] = opts.sqlText\n    }\n    if (opts.sqlFileTaskId !== undefined && opts.sqlFileTaskId !== null) {\n      postBody['sqlFileTaskId'] = opts.sqlFileTaskId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createStructureFlow with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/structureFlow:create',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建数据导出工单，支持Stardb\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据库id  optional\n      * @param {} [opts.dbName] - 数据库名称  optional\n      * @param {} [opts.taskPlanTypeEnum] - 执行方式，AUTO(&quot;AUTO&quot;, 0), BY_CREATOR(&quot;BY_CREATOR&quot;, 1)  optional\n      * @param {} [opts.dbaApproveTypeEnum] - DBA审批方式，AUTO(&quot;AUTO&quot;, 0), MANUAL(&quot;MANUAL&quot;, 1)  optional\n      * @param {} [opts.memo] - 申请原因  optional\n      * @param {} [opts.exportTypeEnum] - 导出类型， RESULT_SET(&quot;RESULT_SET&quot;, 0), DB(&quot;DB&quot;, 1)  optional\n      * @param {} [opts.exportFileTypeEnum] - 导出格式，CSV(&quot;CSV&quot;, 0), SQL(&quot;SQL&quot;, 1)  optional\n      * @param {} [opts.rowsNum] - 影响行数，导出类型为结果集导出时，必填  optional\n      * @param {} [opts.ignoreError] - 是否跳过检验，导出类型为结果集导出时，必填  optional\n      * @param {} [opts.ignoreReason] - 跳过检验原因，ignoreError为true时，必填  optional\n      * @param {} [opts.exportSqlText] - 导出SQL文本，导出类型为结果集导出时，必填  optional\n      * @param {} [opts.tableFilters] - 导出表及过滤条件，为空时导出全部表。导出类型为数据库导出时，必填  optional\n      * @param {} [opts.exportContentTypeEnum] - 导出内容，DATA(&quot;DATA&quot;, 0), STRUCT(&quot;STRUCT&quot;, 1), STRUCT_DATA(&quot;STRUCT_DATA&quot;, 2)，导出类型为数据库导出时，必填  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string flowId  工单id\n      */\n\n  createExportFlow (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createExportFlow\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.taskPlanTypeEnum !== undefined && opts.taskPlanTypeEnum !== null) {\n      postBody['taskPlanTypeEnum'] = opts.taskPlanTypeEnum\n    }\n    if (\n      opts.dbaApproveTypeEnum !== undefined &&\n      opts.dbaApproveTypeEnum !== null\n    ) {\n      postBody['dbaApproveTypeEnum'] = opts.dbaApproveTypeEnum\n    }\n    if (opts.memo !== undefined && opts.memo !== null) {\n      postBody['memo'] = opts.memo\n    }\n    if (opts.exportTypeEnum !== undefined && opts.exportTypeEnum !== null) {\n      postBody['exportTypeEnum'] = opts.exportTypeEnum\n    }\n    if (\n      opts.exportFileTypeEnum !== undefined &&\n      opts.exportFileTypeEnum !== null\n    ) {\n      postBody['exportFileTypeEnum'] = opts.exportFileTypeEnum\n    }\n    if (opts.rowsNum !== undefined && opts.rowsNum !== null) {\n      postBody['rowsNum'] = opts.rowsNum\n    }\n    if (opts.ignoreError !== undefined && opts.ignoreError !== null) {\n      postBody['ignoreError'] = opts.ignoreError\n    }\n    if (opts.ignoreReason !== undefined && opts.ignoreReason !== null) {\n      postBody['ignoreReason'] = opts.ignoreReason\n    }\n    if (opts.exportSqlText !== undefined && opts.exportSqlText !== null) {\n      postBody['exportSqlText'] = opts.exportSqlText\n    }\n    if (opts.tableFilters !== undefined && opts.tableFilters !== null) {\n      postBody['tableFilters'] = opts.tableFilters\n    }\n    if (\n      opts.exportContentTypeEnum !== undefined &&\n      opts.exportContentTypeEnum !== null\n    ) {\n      postBody['exportContentTypeEnum'] = opts.exportContentTypeEnum\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createExportFlow with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/exportFlow:create',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  任务执行，支持Stardb\n      * @param {Object} opts - parameters\n      * @param {} [opts.flowOrderUniqId] - 流程id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startFlow (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startFlow\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.flowOrderUniqId !== undefined && opts.flowOrderUniqId !== null) {\n      postBody['flowOrderUniqId'] = opts.flowOrderUniqId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startFlow with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/flow:start',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生产创建函数过程SQL语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id。  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.functionName] - 函数名称。  optional\n      * @param {} [opts.functionSecurity] - 安全性，DEFAULT(&quot;DEFAULT&quot;, 1),DEFINER(&quot;DEFINER&quot;, 2), INVOKER(&quot;INVOKER&quot;, 3);  optional\n      * @param {} [opts.dataAccess] - 数据访问，DEFAULT(&quot;DEFAULT&quot;, 1),NO_SQL(&quot;NO_SQL&quot;, 2), CONTAINS_SQL(&quot;CONTAINS_SQL&quot;, 3), READS_SQL_DATA(&quot;READS_SQL_DATA&quot;, 4), MODIFIES_SQL_DATA(&quot;MODIFIES_SQL_DATA&quot;, 5);  optional\n      * @param {} [opts.deterministic] - 确定性。  optional\n      * @param {} [opts.definitionSql] - 函数定义SQL。  optional\n      * @param {} [opts.parameters] - 参数列表。  optional\n      * @param {} [opts.definer] - 定义者。  optional\n      * @param {} [opts.comment] - 注释。  optional\n      * @param {} [opts.returnType] - 返回值类型，TINYINT(&quot;TINYINT&quot;, 0), SMALLINT(&quot;SMALLINT&quot;, 1), MEDIUMINT(&quot;MEDIUMINT&quot;, 2), INT(&quot;INT&quot;, 3), BIGINT(&quot;BIGINT&quot;, 4), INTEGER(&quot;INTEGER&quot;, 5), FLOAT(&quot;FLOAT&quot;, 6), DOUBLE(&quot;DOUBLE&quot;, 7), REAL(&quot;REAL&quot;, 8), DECIMAL(&quot;DECIMAL&quot;, 9), CHAR(&quot;CHAR&quot;, 10), VARCHAR(&quot;VARCHAR&quot;, 11), TINYTEXT(&quot;TINYTEXT&quot;, 12), TEXT(&quot;TEXT&quot;, 13), MEDIUMTEXT(&quot;MEDIUMTEXT&quot;, 14), LONGTEXT(&quot;LONGTEXT&quot;, 15), DATE(&quot;DATE&quot;, 16), DATETIME(&quot;DATETIME&quot;, 17), TIMESTAMP(&quot;TIMESTAMP&quot;, 18), TIME(&quot;TIME&quot;, 19), YEAR(&quot;YEAR&quot;, 19), BINARY(&quot;BINARY&quot;, 20), VARBINARY(&quot;VARBINARY&quot;, 21), TINYBLOB(&quot;TINYBLOB&quot;, 22), BLOB(&quot;BLOB&quot;, 23), MEDIUMBLOB(&quot;MEDIUMBLOB&quot;, 24), LONGBLOB(&quot;LONGBLOB&quot;, 25);  optional\n      * @param {} [opts.returnLength] - 返回值长度。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalCreateFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalCreateFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.functionName !== undefined && opts.functionName !== null) {\n      postBody['functionName'] = opts.functionName\n    }\n    if (opts.functionSecurity !== undefined && opts.functionSecurity !== null) {\n      postBody['functionSecurity'] = opts.functionSecurity\n    }\n    if (opts.dataAccess !== undefined && opts.dataAccess !== null) {\n      postBody['dataAccess'] = opts.dataAccess\n    }\n    if (opts.deterministic !== undefined && opts.deterministic !== null) {\n      postBody['deterministic'] = opts.deterministic\n    }\n    if (opts.definitionSql !== undefined && opts.definitionSql !== null) {\n      postBody['definitionSql'] = opts.definitionSql\n    }\n    if (opts.parameters !== undefined && opts.parameters !== null) {\n      postBody['parameters'] = opts.parameters\n    }\n    if (opts.definer !== undefined && opts.definer !== null) {\n      postBody['definer'] = opts.definer\n    }\n    if (opts.comment !== undefined && opts.comment !== null) {\n      postBody['comment'] = opts.comment\n    }\n    if (opts.returnType !== undefined && opts.returnType !== null) {\n      postBody['returnType'] = opts.returnType\n    }\n    if (opts.returnLength !== undefined && opts.returnLength !== null) {\n      postBody['returnLength'] = opts.returnLength\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalCreateFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/function:generalCreate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成修改函数sql语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id。  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.functionName] - 函数名称。  optional\n      * @param {} [opts.originFunctionName] - 函数名称。  optional\n      * @param {} [opts.functionSecurity] - 安全性，DEFAULT(&quot;DEFAULT&quot;, 1),DEFINER(&quot;DEFINER&quot;, 2), INVOKER(&quot;INVOKER&quot;, 3);  optional\n      * @param {} [opts.dataAccess] - 数据访问，DEFAULT(&quot;DEFAULT&quot;, 1),NO_SQL(&quot;NO_SQL&quot;, 2), CONTAINS_SQL(&quot;CONTAINS_SQL&quot;, 3), READS_SQL_DATA(&quot;READS_SQL_DATA&quot;, 4), MODIFIES_SQL_DATA(&quot;MODIFIES_SQL_DATA&quot;, 5);  optional\n      * @param {} [opts.deterministic] - 确定性。  optional\n      * @param {} [opts.definitionSql] - 函数定义SQL。  optional\n      * @param {} [opts.completeSql] - 函数定义SQL。  optional\n      * @param {} [opts.parameters] - 参数列表。  optional\n      * @param {} [opts.definer] - 定义者。  optional\n      * @param {} [opts.comment] - 注释。  optional\n      * @param {} [opts.returnType] - 返回值类型，TINYINT(&quot;TINYINT&quot;, 0), SMALLINT(&quot;SMALLINT&quot;, 1), MEDIUMINT(&quot;MEDIUMINT&quot;, 2), INT(&quot;INT&quot;, 3), BIGINT(&quot;BIGINT&quot;, 4), INTEGER(&quot;INTEGER&quot;, 5), FLOAT(&quot;FLOAT&quot;, 6), DOUBLE(&quot;DOUBLE&quot;, 7), REAL(&quot;REAL&quot;, 8), DECIMAL(&quot;DECIMAL&quot;, 9), CHAR(&quot;CHAR&quot;, 10), VARCHAR(&quot;VARCHAR&quot;, 11), TINYTEXT(&quot;TINYTEXT&quot;, 12), TEXT(&quot;TEXT&quot;, 13), MEDIUMTEXT(&quot;MEDIUMTEXT&quot;, 14), LONGTEXT(&quot;LONGTEXT&quot;, 15), DATE(&quot;DATE&quot;, 16), DATETIME(&quot;DATETIME&quot;, 17), TIMESTAMP(&quot;TIMESTAMP&quot;, 18), TIME(&quot;TIME&quot;, 19), YEAR(&quot;YEAR&quot;, 19), BINARY(&quot;BINARY&quot;, 20), VARBINARY(&quot;VARBINARY&quot;, 21), TINYBLOB(&quot;TINYBLOB&quot;, 22), BLOB(&quot;BLOB&quot;, 23), MEDIUMBLOB(&quot;MEDIUMBLOB&quot;, 24), LONGBLOB(&quot;LONGBLOB&quot;, 25);  optional\n      * @param {} [opts.returnLength] - 返回值长度。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalAlterFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalAlterFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.functionName !== undefined && opts.functionName !== null) {\n      postBody['functionName'] = opts.functionName\n    }\n    if (\n      opts.originFunctionName !== undefined &&\n      opts.originFunctionName !== null\n    ) {\n      postBody['originFunctionName'] = opts.originFunctionName\n    }\n    if (opts.functionSecurity !== undefined && opts.functionSecurity !== null) {\n      postBody['functionSecurity'] = opts.functionSecurity\n    }\n    if (opts.dataAccess !== undefined && opts.dataAccess !== null) {\n      postBody['dataAccess'] = opts.dataAccess\n    }\n    if (opts.deterministic !== undefined && opts.deterministic !== null) {\n      postBody['deterministic'] = opts.deterministic\n    }\n    if (opts.definitionSql !== undefined && opts.definitionSql !== null) {\n      postBody['definitionSql'] = opts.definitionSql\n    }\n    if (opts.completeSql !== undefined && opts.completeSql !== null) {\n      postBody['completeSql'] = opts.completeSql\n    }\n    if (opts.parameters !== undefined && opts.parameters !== null) {\n      postBody['parameters'] = opts.parameters\n    }\n    if (opts.definer !== undefined && opts.definer !== null) {\n      postBody['definer'] = opts.definer\n    }\n    if (opts.comment !== undefined && opts.comment !== null) {\n      postBody['comment'] = opts.comment\n    }\n    if (opts.returnType !== undefined && opts.returnType !== null) {\n      postBody['returnType'] = opts.returnType\n    }\n    if (opts.returnLength !== undefined && opts.returnLength !== null) {\n      postBody['returnLength'] = opts.returnLength\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalAlterFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/function:generalAlter',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成删除函数sql语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.functionName] - 函数名称。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalDropFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalDropFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.functionName !== undefined && opts.functionName !== null) {\n      postBody['functionName'] = opts.functionName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalDropFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/function:generalDrop',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取函数列表，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.filter] - 过滤条件。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string functionNames  函数名称\n      */\n\n  functionList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  functionList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.filter !== undefined && opts.filter !== null) {\n      postBody['filter'] = opts.filter\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call functionList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/function:list',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取函数详情，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.functionName] - 函数名称。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string dbName  数据库名称。\n      * @param string functionName  函数名称。\n      * @param string functionSecurity  安全性，DEFAULT(&quot;DEFAULT&quot;, 1),DEFINER(&quot;DEFINER&quot;, 2), INVOKER(&quot;INVOKER&quot;, 3);\n      * @param string dataAccess  数据访问，DEFAULT(&quot;DEFAULT&quot;, 1),NO_SQL(&quot;NO_SQL&quot;, 2), CONTAINS_SQL(&quot;CONTAINS_SQL&quot;, 3), READS_SQL_DATA(&quot;READS_SQL_DATA&quot;, 4), MODIFIES_SQL_DATA(&quot;MODIFIES_SQL_DATA&quot;, 5);\n      * @param boolean deterministic  确定性。\n      * @param string definitionSql  函数定义SQL。\n      * @param string completeSql  创建存储过程定义完整SQL。\n      * @param parameter parameters\n      * @param string definer  定义者。\n      * @param string comment  注释。\n      * @param string returnType  返回值类型，TINYINT(&quot;TINYINT&quot;, 0), SMALLINT(&quot;SMALLINT&quot;, 1), MEDIUMINT(&quot;MEDIUMINT&quot;, 2), INT(&quot;INT&quot;, 3), BIGINT(&quot;BIGINT&quot;, 4), INTEGER(&quot;INTEGER&quot;, 5), FLOAT(&quot;FLOAT&quot;, 6), DOUBLE(&quot;DOUBLE&quot;, 7), REAL(&quot;REAL&quot;, 8), DECIMAL(&quot;DECIMAL&quot;, 9), CHAR(&quot;CHAR&quot;, 10), VARCHAR(&quot;VARCHAR&quot;, 11), TINYTEXT(&quot;TINYTEXT&quot;, 12), TEXT(&quot;TEXT&quot;, 13), MEDIUMTEXT(&quot;MEDIUMTEXT&quot;, 14), LONGTEXT(&quot;LONGTEXT&quot;, 15), DATE(&quot;DATE&quot;, 16), DATETIME(&quot;DATETIME&quot;, 17), TIMESTAMP(&quot;TIMESTAMP&quot;, 18), TIME(&quot;TIME&quot;, 19), YEAR(&quot;YEAR&quot;, 19), BINARY(&quot;BINARY&quot;, 20), VARBINARY(&quot;VARBINARY&quot;, 21), TINYBLOB(&quot;TINYBLOB&quot;, 22), BLOB(&quot;BLOB&quot;, 23), MEDIUMBLOB(&quot;MEDIUMBLOB&quot;, 24), LONGBLOB(&quot;LONGBLOB&quot;, 25);\n      * @param integer returnLength  返回值长度。\n      * @param integer returnDecimal  返回值精度。\n      */\n\n  functionInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  functionInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.functionName !== undefined && opts.functionName !== null) {\n      postBody['functionName'] = opts.functionName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call functionInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/function:info',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  调用函数，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.functionName] - 函数名称。  optional\n      * @param {} [opts.parameters] - 参数。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string returnValue  返回值\n      * @param object outArgs  输出参数返回值\n      */\n\n  functionInvoke (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  functionInvoke\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.functionName !== undefined && opts.functionName !== null) {\n      postBody['functionName'] = opts.functionName\n    }\n    if (opts.parameters !== undefined && opts.parameters !== null) {\n      postBody['parameters'] = opts.parameters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call functionInvoke with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/function:invoke',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成建表语句sql，支持Mysql，Stardb，OpenGauss\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名  optional\n      * @param {} [opts.tableName] - 表名  optional\n      * @param {} [opts.metaTableInfo] - 表元信息。  optional\n      * @param {} [opts.columnInfos] - 列信息。  optional\n      * @param {} [opts.indexInfos] - 索引信息。  optional\n      * @param {} [opts.extraTableInfo] - 分表信息，stardb数据源中使用。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string strResult  生成sql\n      */\n\n  generalCreateTableSql (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalCreateTableSql\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.tableName !== undefined && opts.tableName !== null) {\n      postBody['tableName'] = opts.tableName\n    }\n    if (opts.metaTableInfo !== undefined && opts.metaTableInfo !== null) {\n      postBody['metaTableInfo'] = opts.metaTableInfo\n    }\n    if (opts.columnInfos !== undefined && opts.columnInfos !== null) {\n      postBody['columnInfos'] = opts.columnInfos\n    }\n    if (opts.indexInfos !== undefined && opts.indexInfos !== null) {\n      postBody['indexInfos'] = opts.indexInfos\n    }\n    if (opts.extraTableInfo !== undefined && opts.extraTableInfo !== null) {\n      postBody['extraTableInfo'] = opts.extraTableInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalCreateTableSql with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/createSql:general',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成修改表结构语句sql，支持Mysql，Stardb\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源Id  optional\n      * @param {} [opts.dbName] - 数据库名  optional\n      * @param {} [opts.tableName] - 表名  optional\n      * @param {} [opts.metaTableInfo] - 表元信息。  optional\n      * @param {} [opts.columnInfos] - 列信息。  optional\n      * @param {} [opts.indexInfos] - 索引信息。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string strResult  生成sql\n      */\n\n  generalAlterTableSql (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalAlterTableSql\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.tableName !== undefined && opts.tableName !== null) {\n      postBody['tableName'] = opts.tableName\n    }\n    if (opts.metaTableInfo !== undefined && opts.metaTableInfo !== null) {\n      postBody['metaTableInfo'] = opts.metaTableInfo\n    }\n    if (opts.columnInfos !== undefined && opts.columnInfos !== null) {\n      postBody['columnInfos'] = opts.columnInfos\n    }\n    if (opts.indexInfos !== undefined && opts.indexInfos !== null) {\n      postBody['indexInfos'] = opts.indexInfos\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalAlterTableSql with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/alterSql:general',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前实例用户查询sql历史\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.pageNumber] - 显示数据的页码，取值范围：[1,∞)。pageNumber为Null时，返回所有数据页码；超过总页数时，无数据。  optional\n      * @param {} [opts.pageSize] - 每页显示的数据条数，用于查询列表的接口。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer count  历史sql总量\n      * @param dmsHistorySql historySqls\n      */\n\n  historySql (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  historySql\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call historySql with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/historySql',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前实例用户查询导入数据sql历史\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称  optional\n      * @param {} [opts.pageNumber] - 显示数据的页码，取值范围：[1,∞)。pageNumber为Null时，返回所有数据页码；超过总页数时，无数据。  optional\n      * @param {} [opts.pageSize] - 每页显示的数据条数，用于查询列表的接口。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer count  历史sql总量\n      * @param historySql historySqls\n      */\n\n  historyImportData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  historyImportData\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call historyImportData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/historyImportData',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户实例\n      * @param {Object} opts - parameters\n      * @param {} [opts.instanceQueryTypeEnum] - 查询分类方式：LOGIN_STATUS，DB_TYPE。  optional\n      * @param {} [opts.instanceStatus] - 实例状态，参见[枚举参数定义](../Enum-Definitions/Enum-Definitions.md)。  optional\n      * @param {} [opts.dbInfoEnum] - 数据库类型：MYSQL_INS，DRDS_INS  optional\n      * @param {} [opts.pageNumber] - 显示数据的页码，取值范围：[1,∞)。pageNumber为Null时，返回所有数据页码；超过总页数时，无数据。  optional\n      * @param {} [opts.pageSize] - 每页显示的数据条数，用于查询列表的接口。  optional\n      * @param {} [opts.uniqId] - 实例Id。  optional\n      * @param {} [opts.dbName] - 打开数据库名称。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceQueryTypeEnum  查询分类方式：LOGIN_STATUS，DB_TYPE。\n      * @param dmsInstance loginedInstance\n      * @param dmsInstance unloginedInstance\n      * @param dmsInstance noNeedLoginInstance\n      * @param dmsInstance rdsIntance\n      * @param dmsInstance drdsIntance\n      */\n\n  queryInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (\n      opts.instanceQueryTypeEnum !== undefined &&\n      opts.instanceQueryTypeEnum !== null\n    ) {\n      postBody['instanceQueryTypeEnum'] = opts.instanceQueryTypeEnum\n    }\n    if (opts.instanceStatus !== undefined && opts.instanceStatus !== null) {\n      postBody['instanceStatus'] = opts.instanceStatus\n    }\n    if (opts.dbInfoEnum !== undefined && opts.dbInfoEnum !== null) {\n      postBody['dbInfoEnum'] = opts.dbInfoEnum\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.uniqId !== undefined && opts.uniqId !== null) {\n      postBody['uniqId'] = opts.uniqId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:query',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  打开实例\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  open (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  open\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call open with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance:open',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  rds，drds登录实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - rds，drds的实例id。\n      * @param {} [opts.dbType] - 数据源类型，CDS(&quot;CDS&quot;, 1), MYSQL(&quot;MYSQL&quot;, 2), ORACLE(&quot;ORACLE&quot;, 3), SQLSERVER(&quot;SQLSERVER&quot;, 4), CDSMYSQL(&quot;CDSMYSQL&quot;, 5), CDSORACLE(&quot;CDSORACLE&quot;, 6), CDSSQLSERVER(&quot;CDSSQLSERVER&quot;, 7), DATACENTER(&quot;DATACENTER&quot;, 8), HBASE(&quot;Hbase&quot;,9),MONGODB(&quot;MongoDb&quot;,10),ES(&quot;ES&quot;,11), MYSQL_INS(&quot;MYSQL_INS&quot;,12), DRDS_INS(&quot;DRDS_INS&quot;,13), STARDB_INS(&quot;STARDB_INS&quot;,14), STARDB_PROXY_INS(&quot;STARDB_PROXY_INS&quot;,15), CLICK_HOUSE_INS(&quot;CLICK_HOUSE_INS&quot;,16), TIDB_INS(&quot;TIDB_INS&quot;,17), OPEN_GAUSS_INS(&quot;OPEN_GAUSS_INS&quot;,18), SS_OPEN_GAUSS_INS(&quot;SS_OPEN_GAUSS_INS&quot;,19);  optional\n      * @param {} [opts.addrMode] - CLASSIC(&quot;CLASSIC&quot;, 0), RDS(&quot;RDS&quot;, 1), ECS(&quot;ECS&quot;, 2), VPC(&quot;VPC&quot;, 3), 当前只支持rds模式。  optional\n      * @param {} [opts.dbUser] - 数据库用户名。  optional\n      * @param {} [opts.dbPassword] - 数据库用户密码。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  login (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  login\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling login\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      postBody['dbType'] = opts.dbType\n    }\n    if (opts.addrMode !== undefined && opts.addrMode !== null) {\n      postBody['addrMode'] = opts.addrMode\n    }\n    if (opts.dbUser !== undefined && opts.dbUser !== null) {\n      postBody['dbUser'] = opts.dbUser\n    }\n    if (opts.dbPassword !== undefined && opts.dbPassword !== null) {\n      postBody['dbPassword'] = opts.dbPassword\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call login with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:login',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  退出登录\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  logout (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  logout\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call logout with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance:logout',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户数据类型实例\n      * @param {Object} opts - parameters\n      * @param {} [opts.dbType] - 数据源类型，CDS(&quot;CDS&quot;, 1), MYSQL(&quot;MYSQL&quot;, 2), ORACLE(&quot;ORACLE&quot;, 3), SQLSERVER(&quot;SQLSERVER&quot;, 4), CDSMYSQL(&quot;CDSMYSQL&quot;, 5), CDSORACLE(&quot;CDSORACLE&quot;, 6), CDSSQLSERVER(&quot;CDSSQLSERVER&quot;, 7), DATACENTER(&quot;DATACENTER&quot;, 8), HBASE(&quot;Hbase&quot;,9),MONGODB(&quot;MongoDb&quot;,10),ES(&quot;ES&quot;,11), MYSQL_INS(&quot;MYSQL_INS&quot;,12), DRDS_INS(&quot;DRDS_INS&quot;,13), STARDB_INS(&quot;STARDB_INS&quot;,14), STARDB_PROXY_INS(&quot;STARDB_PROXY_INS&quot;,15), CLICK_HOUSE_INS(&quot;CLICK_HOUSE_INS&quot;,16), TIDB_INS(&quot;TIDB_INS&quot;,17), OPEN_GAUSS_INS(&quot;OPEN_GAUSS_INS&quot;,18), SS_OPEN_GAUSS_INS(&quot;SS_OPEN_GAUSS_INS&quot;,19);  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string regionId  查询分类方式：LOGIN_STATUS，DB_TYPE。\n      * @param integer dbType  数据库类型。\n      * @param dmsInstance loginedInstance\n      * @param dmsInstance unloginedInstance\n      */\n\n  queryTypeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryTypeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      postBody['dbType'] = opts.dbType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryTypeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/typeInstances:query',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  校验用户是否有实例权限\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  checkInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling checkInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:check',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取表元数据，支持Mysql，Stardb，Tidb，ClickHouse\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 库名。  optional\n      * @param {} [opts.tableName] - 表名。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsTableStruct dmsTableStruct\n      */\n\n  tableInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  tableInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.tableName !== undefined && opts.tableName !== null) {\n      postBody['tableName'] = opts.tableName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call tableInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/consoleTableInfo',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取数据库实例的库列表，支持Mysql，Stardb，Tidb，ClickHouse\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string databaseNames  数据库名称\n      */\n\n  databaseList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  databaseList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call databaseList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/consoleDbList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取数据库中的表列表，支持Mysql，Stardb，Tidb，ClickHouse\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string tableNames  表名称\n      */\n\n  tableList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  tableList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call tableList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/consoleTableList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取sql中建表语句，表中列信息，支持Mysql，Stardb，Tidb，ClickHouse\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称  optional\n      * @param {} [opts.sqls] - sql语句  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsTableStruct dmsTableStructs\n      */\n\n  sqlTableInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  sqlTableInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.sqls !== undefined && opts.sqls !== null) {\n      postBody['sqls'] = opts.sqls\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call sqlTableInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/sqlTableInfo',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取Dms域名，仅供前端使用\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object domains  区域到域名映射，例{&quot;cn-north-1&quot;:&quot;http://10.222.49.154:8080&quot;, &quot;cn-east-1&quot;:&quot;http://10.222.49.154:8080&quot;}。\n      */\n\n  getDmsDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDmsDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDmsDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/getDmsDomain',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取Dms域名，仅供前端使用\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object domains  区域到域名映射，例{&quot;cn-north-1&quot;:&quot;http://10.222.49.154:8080&quot;, &quot;cn-east-1&quot;:&quot;http://10.222.49.154:8080&quot;}。\n      */\n\n  getDmsDomains (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDmsDomains with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/getDmsDomain',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取操作对应控制台功能\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer count  操作类型总量\n      * @param dmsOperationType dmsOperationTypes\n      */\n\n  queryOperationType (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryOperationType\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryOperationType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/operationType:query',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取操作日志列表\n      * @param {Object} opts - parameters\n      * @param {} [opts.supType] - 操作类型  optional\n      * @param {} [opts.type] - 对应控制台功能  optional\n      * @param {} [opts.pin] - 操作人  optional\n      * @param {} [opts.instanceId] - 实例id  optional\n      * @param {} [opts.dbName] - 数据库名称  optional\n      * @param {} [opts.startTime] - 起始时间(UTC)  optional\n      * @param {} [opts.endTime] - 结束时间(UTC)  optional\n      * @param {} [opts.pageNumber] - 显示数据的页码，取值范围：[1,∞)。pageNumber为Null时，返回所有数据页码；超过总页数时，无数据。  optional\n      * @param {} [opts.pageSize] - 每页显示的数据条数，用于查询列表的接口。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer count  操作日志总量\n      * @param dmsOperationLog operationLogs\n      */\n\n  queryOperationLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryOperationLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.supType !== undefined && opts.supType !== null) {\n      postBody['supType'] = opts.supType\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      postBody['type'] = opts.type\n    }\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryOperationLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/operationLog:query',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取操作详情\n      * @param {Object} opts - parameters\n      * @param {integer} opts.operationId - 操作id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsOperationLog dmsOperationLog\n      */\n\n  operationDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  operationDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.operationId === undefined || opts.operationId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.operationId' when calling operationDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      operationId: opts.operationId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call operationDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/operationDetail/{operationId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前实例用户收藏sql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.pageNumber] - 显示数据的页码，取值范围：[1,∞)。pageNumber为Null时，返回所有数据页码；超过总页数时，无数据。  optional\n      * @param {} [opts.pageSize] - 每页显示的数据条数，用于查询列表的接口。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer count  收藏sql总量\n      * @param personalSql personalSqls\n      */\n\n  queryPersonalSqls (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryPersonalSqls\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryPersonalSqls with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/personalSql:query',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  收藏sql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.sqlStr] - 收藏的sql语句。  optional\n      * @param {} [opts.hint] - 备注。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string strResult  返回消息\n      */\n\n  addPersonalSql (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addPersonalSql\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.sqlStr !== undefined && opts.sqlStr !== null) {\n      postBody['sqlStr'] = opts.sqlStr\n    }\n    if (opts.hint !== undefined && opts.hint !== null) {\n      postBody['hint'] = opts.hint\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addPersonalSql with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/personalSql:add',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除收藏sql\n      * @param {Object} opts - parameters\n      * @param {} [opts.id] - 主键id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deletePersonalSql (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deletePersonalSql\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      postBody['id'] = opts.id\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deletePersonalSql with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/personalSql:delete',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新收藏sql\n      * @param {Object} opts - parameters\n      * @param {} [opts.id] - 主键id  optional\n      * @param {} [opts.hint] - sql备注  optional\n      * @param {} [opts.sqlStr] - sql内容  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updatePersonalSql (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updatePersonalSql\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      postBody['id'] = opts.id\n    }\n    if (opts.hint !== undefined && opts.hint !== null) {\n      postBody['hint'] = opts.hint\n    }\n    if (opts.sqlStr !== undefined && opts.sqlStr !== null) {\n      postBody['sqlStr'] = opts.sqlStr\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updatePersonalSql with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/personalSql:update',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生产创建存储过程SQL语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id。  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.procedureName] - 存储过程名称。  optional\n      * @param {} [opts.procedureSecurity] - 安全性，DEFAULT(&quot;DEFAULT&quot;, 1),DEFINER(&quot;DEFINER&quot;, 2), INVOKER(&quot;INVOKER&quot;, 3);  optional\n      * @param {} [opts.dataAccess] - 数据访问，DEFAULT(&quot;DEFAULT&quot;, 1),NO_SQL(&quot;NO_SQL&quot;, 2), CONTAINS_SQL(&quot;CONTAINS_SQL&quot;, 3), READS_SQL_DATA(&quot;READS_SQL_DATA&quot;, 4), MODIFIES_SQL_DATA(&quot;MODIFIES_SQL_DATA&quot;, 5);  optional\n      * @param {} [opts.deterministic] - 确定性。  optional\n      * @param {} [opts.definitionSql] - 存储过程定义SQL。  optional\n      * @param {} [opts.parameters] - 参数列表。  optional\n      * @param {} [opts.definer] - 定义者。  optional\n      * @param {} [opts.comment] - 注释。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalCreateProcedure (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalCreateProcedure\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.procedureName !== undefined && opts.procedureName !== null) {\n      postBody['procedureName'] = opts.procedureName\n    }\n    if (\n      opts.procedureSecurity !== undefined &&\n      opts.procedureSecurity !== null\n    ) {\n      postBody['procedureSecurity'] = opts.procedureSecurity\n    }\n    if (opts.dataAccess !== undefined && opts.dataAccess !== null) {\n      postBody['dataAccess'] = opts.dataAccess\n    }\n    if (opts.deterministic !== undefined && opts.deterministic !== null) {\n      postBody['deterministic'] = opts.deterministic\n    }\n    if (opts.definitionSql !== undefined && opts.definitionSql !== null) {\n      postBody['definitionSql'] = opts.definitionSql\n    }\n    if (opts.parameters !== undefined && opts.parameters !== null) {\n      postBody['parameters'] = opts.parameters\n    }\n    if (opts.definer !== undefined && opts.definer !== null) {\n      postBody['definer'] = opts.definer\n    }\n    if (opts.comment !== undefined && opts.comment !== null) {\n      postBody['comment'] = opts.comment\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalCreateProcedure with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/procedure:generalCreate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成修改存储过程sql语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.originProcedureName] - 原存储过程名称。  optional\n      * @param {} [opts.procedureName] - 存储过程名称。  optional\n      * @param {} [opts.definer] - 定义者。  optional\n      * @param {} [opts.procedureSecurity] - 安全性，DEFAULT(&quot;DEFAULT&quot;, 1),DEFINER(&quot;DEFINER&quot;, 2), INVOKER(&quot;INVOKER&quot;, 3);  optional\n      * @param {} [opts.dataAccess] - 数据访问，DEFAULT(&quot;DEFAULT&quot;, 1),NO_SQL(&quot;NO_SQL&quot;, 2), CONTAINS_SQL(&quot;CONTAINS_SQL&quot;, 3), READS_SQL_DATA(&quot;READS_SQL_DATA&quot;, 4), MODIFIES_SQL_DATA(&quot;MODIFIES_SQL_DATA&quot;, 5);  optional\n      * @param {} [opts.deterministic] - 确定性。  optional\n      * @param {} [opts.definitionSql] - 存储过程定义SQL。  optional\n      * @param {} [opts.completeSql] - 创建存储过程定义完整SQL。  optional\n      * @param {} [opts.parameters] - 参数列表。  optional\n      * @param {} [opts.comment] - 注释  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalAlterProcedure (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalAlterProcedure\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (\n      opts.originProcedureName !== undefined &&\n      opts.originProcedureName !== null\n    ) {\n      postBody['originProcedureName'] = opts.originProcedureName\n    }\n    if (opts.procedureName !== undefined && opts.procedureName !== null) {\n      postBody['procedureName'] = opts.procedureName\n    }\n    if (opts.definer !== undefined && opts.definer !== null) {\n      postBody['definer'] = opts.definer\n    }\n    if (\n      opts.procedureSecurity !== undefined &&\n      opts.procedureSecurity !== null\n    ) {\n      postBody['procedureSecurity'] = opts.procedureSecurity\n    }\n    if (opts.dataAccess !== undefined && opts.dataAccess !== null) {\n      postBody['dataAccess'] = opts.dataAccess\n    }\n    if (opts.deterministic !== undefined && opts.deterministic !== null) {\n      postBody['deterministic'] = opts.deterministic\n    }\n    if (opts.definitionSql !== undefined && opts.definitionSql !== null) {\n      postBody['definitionSql'] = opts.definitionSql\n    }\n    if (opts.completeSql !== undefined && opts.completeSql !== null) {\n      postBody['completeSql'] = opts.completeSql\n    }\n    if (opts.parameters !== undefined && opts.parameters !== null) {\n      postBody['parameters'] = opts.parameters\n    }\n    if (opts.comment !== undefined && opts.comment !== null) {\n      postBody['comment'] = opts.comment\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalAlterProcedure with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/procedure:generalAlter',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成删除存储过程sql语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.procedureName] - 存储过程名称。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalDropProcedure (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalDropProcedure\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.procedureName !== undefined && opts.procedureName !== null) {\n      postBody['procedureName'] = opts.procedureName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalDropProcedure with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/procedure:generalDrop',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取存储过程列表，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.filter] - 过滤条件。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string procedureNames  存储过程名称\n      */\n\n  procedureList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  procedureList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.filter !== undefined && opts.filter !== null) {\n      postBody['filter'] = opts.filter\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call procedureList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/procedure:list',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取存储过程详情，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.procedureName] - 存储过程名称。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string dbName  数据库名称。\n      * @param string procedureName  存储过程名称。\n      * @param string definer  定义者。\n      * @param string procedureSecurity  安全性，DEFAULT(&quot;DEFAULT&quot;, 1),DEFINER(&quot;DEFINER&quot;, 2), INVOKER(&quot;INVOKER&quot;, 3);\n      * @param string dataAccess  数据访问，DEFAULT(&quot;DEFAULT&quot;, 1),NO_SQL(&quot;NO_SQL&quot;, 2), CONTAINS_SQL(&quot;CONTAINS_SQL&quot;, 3), READS_SQL_DATA(&quot;READS_SQL_DATA&quot;, 4), MODIFIES_SQL_DATA(&quot;MODIFIES_SQL_DATA&quot;, 5);\n      * @param boolean deterministic  确定性。\n      * @param string definitionSql  存储过程定义SQL。\n      * @param string completeSql  创建存储过程定义完整SQL。\n      * @param parameter parameters\n      * @param string comment  注释\n      */\n\n  procedureInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  procedureInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.procedureName !== undefined && opts.procedureName !== null) {\n      postBody['procedureName'] = opts.procedureName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call procedureInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/procedure:info',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  执行存储过程，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.procedureName] - 存储过程名称。  optional\n      * @param {} [opts.parameters] - 参数。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object returnValue  格式：{key:value}\n      */\n\n  procedureInvoke (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  procedureInvoke\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.procedureName !== undefined && opts.procedureName !== null) {\n      postBody['procedureName'] = opts.procedureName\n    }\n    if (opts.parameters !== undefined && opts.parameters !== null) {\n      postBody['parameters'] = opts.parameters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call procedureInvoke with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/procedure:invoke',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取视图列表，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.filter] - 过滤条件。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string viewNames  视图名称\n      * @param string procedureNames  存储过程名称\n      * @param string functionNames  函数名称\n      * @param string triggerNames  触发器名称\n      * @param string eventNames  事件名称\n      */\n\n  programList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  programList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.filter !== undefined && opts.filter !== null) {\n      postBody['filter'] = opts.filter\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call programList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/program:list',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  执行编程对象sql，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.dmsSqls] - SQL列表。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  exeProgram (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  exeProgram\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.dmsSqls !== undefined && opts.dmsSqls !== null) {\n      postBody['dmsSqls'] = opts.dmsSqls\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call exeProgram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/program:exe',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  执行计划，支持Mysql，Stardb\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称  optional\n      * @param {} [opts.sqls] - sql语句。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSqlResult dmsSqlResults\n      */\n\n  consoleExplain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  consoleExplain\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.sqls !== undefined && opts.sqls !== null) {\n      postBody['sqls'] = opts.sqls\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call consoleExplain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/console:explain',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  执行sql语句，支持Mysql，Stardb，Tidb，ClickHouse\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称  optional\n      * @param {} [opts.sqls] - sql语句。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSqlResult dmsSqlResults\n      */\n\n  consoleSql (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  consoleSql\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.sqls !== undefined && opts.sqls !== null) {\n      postBody['sqls'] = opts.sqls\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call consoleSql with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/console:exeSql',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成数据，支持Mysql，Stardb\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称  optional\n      * @param {} [opts.tableName] - 表名。  optional\n      * @param {} [opts.count] - 生成数据行数。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSqlsResult dmsSqlsResult\n      */\n\n  consoleGeneralData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  consoleGeneralData\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.tableName !== undefined && opts.tableName !== null) {\n      postBody['tableName'] = opts.tableName\n    }\n    if (opts.count !== undefined && opts.count !== null) {\n      postBody['count'] = opts.count\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call consoleGeneralData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/console:generalData',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  sql格式化，支持Mysql，Stardb\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.sqlStr] - 需要格式化的sql  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string strResult  格式化后的SQL\n      */\n\n  formatSql (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  formatSql\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.sqlStr !== undefined && opts.sqlStr !== null) {\n      postBody['sqlStr'] = opts.sqlStr\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call formatSql with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/sql:format',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量建表，支持Stardb\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称  optional\n      * @param {} [opts.createTableInfos] - 查询结果。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSqlsResult dmsSqlsResult\n      */\n\n  createTableBatch (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createTableBatch\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.createTableInfos !== undefined && opts.createTableInfos !== null) {\n      postBody['createTableInfos'] = opts.createTableInfos\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createTableBatch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/console:createTableBatch',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取批量建表sql，仅供前端使用，支持Stardb，OpenGauss\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称  optional\n      * @param {} [opts.createTableInfos] - 查询结果。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string strResult  格式化后的SQL\n      */\n\n  getCreateTableBatchSql (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getCreateTableBatchSql\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.createTableInfos !== undefined && opts.createTableInfos !== null) {\n      postBody['createTableInfos'] = opts.createTableInfos\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getCreateTableBatchSql with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/console:getCreateTableBatchSql',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建Sql任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.planTime] - 计划开始执行时间，stardb数据源固定为空。  optional\n      * @param {} [opts.sqls] - 执行SQL。  optional\n      * @param {} [opts.taskTypeEnum] - 任务类型:DDL, DML  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer intResult  任务id\n      */\n\n  createOnlineSqlTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createOnlineSqlTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.planTime !== undefined && opts.planTime !== null) {\n      postBody['planTime'] = opts.planTime\n    }\n    if (opts.sqls !== undefined && opts.sqls !== null) {\n      postBody['sqls'] = opts.sqls\n    }\n    if (opts.taskTypeEnum !== undefined && opts.taskTypeEnum !== null) {\n      postBody['taskTypeEnum'] = opts.taskTypeEnum\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createOnlineSqlTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/sqltask:create',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动Sql任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.taskId] - 任务id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startOnlineSqlTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startOnlineSqlTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startOnlineSqlTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/sqltask:start',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  暂停Sql任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.taskId] - 任务id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  suspendOnlineSqlTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  suspendOnlineSqlTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call suspendOnlineSqlTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/sqltask:suspend',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重启Sql任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.taskId] - 任务id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restartOnlineSqlTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restartOnlineSqlTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restartOnlineSqlTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/sqltask:restart',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询任务状态\n      * @param {Object} opts - parameters\n      * @param {} [opts.taskId] - 任务id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer id  主键id。\n      * @param integer dataSourceId  数据源id。\n      * @param string dbName  数据库名称。\n      * @param string taskType  任务类型，DDL， DML。\n      * @param string planTime  计划时间。\n      * @param boolean transaction  是否为事务。\n      * @param boolean parallel  是否为并行执行。\n      * @param boolean ignoreError  是否忽略错误。\n      * @param string runStatus  运行状态。CREATE(&quot;CREATE&quot;, 1),RUNNING(&quot;RUNNING&quot;, 2), SUCCESS(&quot;SUCCESS&quot;, 3), FAILED(&quot;FAILED&quot;, 4), SUSPEND(&quot;SUSPEND&quot;, 5);\n      * @param string createdDate  创建日期。\n      * @param string finishDate  结束日期。\n      * @param string createUser  创建用户。\n      * @param string status  状态0有效，1无效。\n      * @param string message  执行消息。\n      * @param string runIp  运行ip。\n      */\n\n  onlineSqlTaskQuery (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  onlineSqlTaskQuery\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call onlineSqlTaskQuery with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/sqltask:query',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询sql子任务状态\n      * @param {Object} opts - parameters\n      * @param {} [opts.taskId] - 任务id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsOnlineSubSqlTask dmsOnlineSubSqlTasks\n      */\n\n  onlineSubSqlTaskQuery (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  onlineSubSqlTaskQuery\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call onlineSubSqlTaskQuery with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subsqltask:query',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询sql子任务状态\n      * @param {Object} opts - parameters\n      * @param {} [opts.taskId] - dms任务id  optional\n      * @param {} [opts.proxyTaskId] - proxy任务id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsOnlineProxySubTask dmsOnlineProxySubTasks\n      */\n\n  onlineProxySubTaskQuery (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  onlineProxySubTaskQuery\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n    if (opts.proxyTaskId !== undefined && opts.proxyTaskId !== null) {\n      postBody['proxyTaskId'] = opts.proxyTaskId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call onlineProxySubTaskQuery with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/proxysubtask:query',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成创建触发器SQL语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id。  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.triggerName] - 触发器名称。  optional\n      * @param {} [opts.triggerTiming] - 触发时机，BEFORE(&quot;BEFORE&quot;, 1),AFTER(&quot;AFTER&quot;, 2)。  optional\n      * @param {} [opts.triggerEvent] - 激活触发器的事件，INSERT(&quot;INSERT&quot;, 1),UPDATE(&quot;UPDATE&quot;, 2), DELETE(&quot;DELETE&quot;, 3)。  optional\n      * @param {} [opts.triggerTable] - 触发表。  optional\n      * @param {} [opts.triggerStatement] - 触发器定义。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalCreateTrigger (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalCreateTrigger\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.triggerName !== undefined && opts.triggerName !== null) {\n      postBody['triggerName'] = opts.triggerName\n    }\n    if (opts.triggerTiming !== undefined && opts.triggerTiming !== null) {\n      postBody['triggerTiming'] = opts.triggerTiming\n    }\n    if (opts.triggerEvent !== undefined && opts.triggerEvent !== null) {\n      postBody['triggerEvent'] = opts.triggerEvent\n    }\n    if (opts.triggerTable !== undefined && opts.triggerTable !== null) {\n      postBody['triggerTable'] = opts.triggerTable\n    }\n    if (opts.triggerStatement !== undefined && opts.triggerStatement !== null) {\n      postBody['triggerStatement'] = opts.triggerStatement\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalCreateTrigger with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/trigger:generalCreate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成修改触发器sql语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.originTriggerName] - 原触发器名称。  optional\n      * @param {} [opts.triggerName] - 触发器名称。  optional\n      * @param {} [opts.triggerTiming] - 触发时机，BEFORE(&quot;BEFORE&quot;, 1),AFTER(&quot;AFTER&quot;, 2)。  optional\n      * @param {} [opts.triggerEvent] - 激活触发器的事件，INSERT(&quot;INSERT&quot;, 1),UPDATE(&quot;UPDATE&quot;, 2), DELETE(&quot;DELETE&quot;, 3)。  optional\n      * @param {} [opts.triggerTable] - 触发表。  optional\n      * @param {} [opts.triggerStatement] - 触发器定义。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalAlterTrigger (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalAlterTrigger\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (\n      opts.originTriggerName !== undefined &&\n      opts.originTriggerName !== null\n    ) {\n      postBody['originTriggerName'] = opts.originTriggerName\n    }\n    if (opts.triggerName !== undefined && opts.triggerName !== null) {\n      postBody['triggerName'] = opts.triggerName\n    }\n    if (opts.triggerTiming !== undefined && opts.triggerTiming !== null) {\n      postBody['triggerTiming'] = opts.triggerTiming\n    }\n    if (opts.triggerEvent !== undefined && opts.triggerEvent !== null) {\n      postBody['triggerEvent'] = opts.triggerEvent\n    }\n    if (opts.triggerTable !== undefined && opts.triggerTable !== null) {\n      postBody['triggerTable'] = opts.triggerTable\n    }\n    if (opts.triggerStatement !== undefined && opts.triggerStatement !== null) {\n      postBody['triggerStatement'] = opts.triggerStatement\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalAlterTrigger with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/trigger:generalAlter',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成删除触发器sql语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.triggerName] - 触发器名称。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalDropTrigger (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalDropTrigger\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.triggerName !== undefined && opts.triggerName !== null) {\n      postBody['triggerName'] = opts.triggerName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalDropTrigger with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/trigger:generalDrop',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取触发器列表，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.filter] - 过滤条件。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string triggerNames  触发器名称\n      */\n\n  triggerList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  triggerList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.filter !== undefined && opts.filter !== null) {\n      postBody['filter'] = opts.filter\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call triggerList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/trigger:list',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取触发器详情，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.triggerName] - 触发器名称。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string dbName  数据库名称。\n      * @param string triggerName  存储过程名称。\n      * @param string triggerTiming  触发时机，BEFORE(&quot;BEFORE&quot;, 1),AFTER(&quot;AFTER&quot;, 2)。\n      * @param string triggerEvent  激活触发器的事件，INSERT(&quot;INSERT&quot;, 1),UPDATE(&quot;UPDATE&quot;, 2), DELETE(&quot;DELETE&quot;, 3)。\n      * @param string triggerTable  触发表\n      * @param string triggerStatement  触发器定义。\n      */\n\n  triggerInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  triggerInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.triggerName !== undefined && opts.triggerName !== null) {\n      postBody['triggerName'] = opts.triggerName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call triggerInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/trigger:info',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  用户管理列表\n      * @param {Object} opts - parameters\n      * @param {} [opts.activeStatus] - 查询的用户状态(启用(true),禁用(false))  optional\n      * @param {} [opts.role] - 查询的用户角色,枚举值(Admin(&quot;Admin&quot;,&quot;管理员&quot;),DBA(&quot;DBA&quot;,&quot;DBA&quot;),StructureReadOnly(&quot;StructureReadOnly&quot;,&quot;结构只读&quot;),Normal(&quot;Normal&quot;,&quot;普通用户&quot;))  optional\n      * @param {} [opts.loginDateStart] - 查询的用户登录开始时间(yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39;Z&#39;)  optional\n      * @param {} [opts.loginDateEnd] - 查询的用户登录结束时间(yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39;Z&#39;)  optional\n      * @param {} [opts.username] - 查询用户的用户名称  optional\n      * @param {} [opts.pageNumber] - 显示数据的页码，取值范围：[1,∞)。pageNumber为Null时，返回所有数据页码；超过总页数时，无数据。  optional\n      * @param {} [opts.pageSize] - 每页显示的数据条数，用于查询列表的接口。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer count  符合条件的用户的总数\n      * @param dmsUserVO dmsUserVOList\n      */\n\n  queryUserList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.activeStatus !== undefined && opts.activeStatus !== null) {\n      postBody['activeStatus'] = opts.activeStatus\n    }\n    if (opts.role !== undefined && opts.role !== null) {\n      postBody['role'] = opts.role\n    }\n    if (opts.loginDateStart !== undefined && opts.loginDateStart !== null) {\n      postBody['loginDateStart'] = opts.loginDateStart\n    }\n    if (opts.loginDateEnd !== undefined && opts.loginDateEnd !== null) {\n      postBody['loginDateEnd'] = opts.loginDateEnd\n    }\n    if (opts.username !== undefined && opts.username !== null) {\n      postBody['username'] = opts.username\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryUserList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/management:queryUserList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取主账号下未同步的子账号数据\n      * @param {Object} opts - parameters\n      * @param {} [opts.pageNumber] - 第几页,不传的话会将当前所有的未同步的账号都同步过来  optional\n      * @param {} [opts.pageSize] - 页大小。  optional\n      * @param {} [opts.keyword] - 关键字。  optional\n      * @param {} [opts.sort] - 排序规则：0-创建时间顺序排序，1-创建时间倒序排序。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  子账号总数量\n      * @param dmsSubUserVO subUserList\n      */\n\n  queryUserNotSync (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.keyword !== undefined && opts.keyword !== null) {\n      postBody['keyword'] = opts.keyword\n    }\n    if (opts.sort !== undefined && opts.sort !== null) {\n      postBody['sort'] = opts.sort\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryUserNotSync with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/management:queryUserNotSync',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  同步子账号\n      * @param {Object} opts - parameters\n      * @param {} [opts.dmsSyncSubUserVOList] - 同步的子账号的列表信息  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  syncSubUser (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (\n      opts.dmsSyncSubUserVOList !== undefined &&\n      opts.dmsSyncSubUserVOList !== null\n    ) {\n      postBody['dmsSyncSubUserVOList'] = opts.dmsSyncSubUserVOList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call syncSubUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/management:syncSubUser',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新用户信息\n      * @param {Object} opts - parameters\n      * @param {} [opts.pin] - 被更新用户的pin信息  optional\n      * @param {} [opts.phone] - 用户手机号码  optional\n      * @param {} [opts.email] - 用户邮箱  optional\n      * @param {} [opts.roleList] - 用户角色列表信息  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateUserInfo (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.phone !== undefined && opts.phone !== null) {\n      postBody['phone'] = opts.phone\n    }\n    if (opts.email !== undefined && opts.email !== null) {\n      postBody['email'] = opts.email\n    }\n    if (opts.roleList !== undefined && opts.roleList !== null) {\n      postBody['roleList'] = opts.roleList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateUserInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/management:updateUserInfo',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用/禁用用户\n      * @param {Object} opts - parameters\n      * @param {} [opts.dmsUserEnableVOList] - 启用/禁用的用户列表信息  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableUser (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (\n      opts.dmsUserEnableVOList !== undefined &&\n      opts.dmsUserEnableVOList !== null\n    ) {\n      postBody['dmsUserEnableVOList'] = opts.dmsUserEnableVOList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/management:enableUser',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除用户\n      * @param {Object} opts - parameters\n      * @param {} [opts.dmsUserDeleteList] - 删除用户的pin信息  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteUser (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (\n      opts.dmsUserDeleteList !== undefined &&\n      opts.dmsUserDeleteList !== null\n    ) {\n      postBody['dmsUserDeleteList'] = opts.dmsUserDeleteList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/management:deleteUser',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取用户信息\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean isMaster  是否是主账号\n      * @param string username  用户名\n      * @param string pin  用户pin\n      * @param string masterPin  用户主账号pin\n      * @param integer accountId  用户账号Id\n      * @param string roleList\n      */\n\n  getUserInfo (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getUserInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/management:getUserInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  用户授权信息列表\n      * @param {Object} opts - parameters\n      * @param {} [opts.instanceId] - 实例ID  optional\n      * @param {} [opts.instanceName] - 实例名称  optional\n      * @param {} [opts.pin] - 用户账号  optional\n      * @param {} [opts.showNormal] - 是否只显示生效中的授权信息  optional\n      * @param {} [opts.releaseStatus] - 是否只显示释放的记录,true展示释放权限的记录  optional\n      * @param {} [opts.pageNumber] - 显示数据的页码，取值范围：[1,∞)。pageNumber为Null时，返回所有数据页码；超过总页数时，无数据。  optional\n      * @param {} [opts.pageSize] - 每页显示的数据条数，用于查询列表的接口。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer count  符合条件的用户的总数\n      * @param boolean isAdmin  如果为真则表示这个账号默认就拥有所有的实例登录权限\n      * @param dmsPrivilegeVO dmsPrivilegeVOList\n      */\n\n  queryPrivilegeList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.showNormal !== undefined && opts.showNormal !== null) {\n      postBody['showNormal'] = opts.showNormal\n    }\n    if (opts.releaseStatus !== undefined && opts.releaseStatus !== null) {\n      postBody['releaseStatus'] = opts.releaseStatus\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryPrivilegeList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/management:queryPrivilegeList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看当前用户授权信息列表\n      * @param {Object} opts - parameters\n      * @param {} [opts.instanceId] - 实例ID  optional\n      * @param {} [opts.instanceName] - 实例名称  optional\n      * @param {} [opts.showNormal] - 是否只显示生效中的授权信息  optional\n      * @param {} [opts.releaseStatus] - 是否只显示释放的记录,true展示释放权限的记录  optional\n      * @param {} [opts.pageNumber] - 显示数据的页码，取值范围：[1,∞)。pageNumber为Null时，返回所有数据页码；超过总页数时，无数据。  optional\n      * @param {} [opts.pageSize] - 每页显示的数据条数，用于查询列表的接口。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer count  符合条件的用户的总数\n      * @param boolean isAdmin  如果为真则表示这个账号默认就拥有所有的实例登录权限\n      * @param dmsPrivilegeVO dmsPrivilegeVOList\n      */\n\n  queryPrivilegeSelfList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n    if (opts.showNormal !== undefined && opts.showNormal !== null) {\n      postBody['showNormal'] = opts.showNormal\n    }\n    if (opts.releaseStatus !== undefined && opts.releaseStatus !== null) {\n      postBody['releaseStatus'] = opts.releaseStatus\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryPrivilegeSelfList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/management:queryPrivilegeSelfList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  释放权限\n      * @param {Object} opts - parameters\n      * @param {} [opts.idList] - 授权实例记录对应的主键ID  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  releasePrivilege (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.idList !== undefined && opts.idList !== null) {\n      postBody['idList'] = opts.idList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call releasePrivilege with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/management:releasePrivilege',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  实例授权\n      * @param {Object} opts - parameters\n      * @param {} [opts.pinList] - 用户pin列表信息  optional\n      * @param {} [opts.privilegeName] - 权限名称,枚举值：PrivilegeLogin(实例登录权限)  optional\n      * @param {} [opts.expireDate] - 授权过期时间(yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39;Z&#39;)  optional\n      * @param {} [opts.dmsPrivilegeInstanceParamList] - 授权实例的信息，主要包括用户实例ID和实例名称  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  authPrivilege (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pinList !== undefined && opts.pinList !== null) {\n      postBody['pinList'] = opts.pinList\n    }\n    if (opts.privilegeName !== undefined && opts.privilegeName !== null) {\n      postBody['privilegeName'] = opts.privilegeName\n    }\n    if (opts.expireDate !== undefined && opts.expireDate !== null) {\n      postBody['expireDate'] = opts.expireDate\n    }\n    if (\n      opts.dmsPrivilegeInstanceParamList !== undefined &&\n      opts.dmsPrivilegeInstanceParamList !== null\n    ) {\n      postBody['dmsPrivilegeInstanceParamList'] =\n        opts.dmsPrivilegeInstanceParamList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call authPrivilege with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/management:authPrivilege',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改权限到期时间\n      * @param {Object} opts - parameters\n      * @param {} [opts.idList] - 授权实例记录对应的主键ID  optional\n      * @param {} [opts.expireDate] - 授权过期时间(yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39;Z&#39;)  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyPrivilegeExpireDate (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.idList !== undefined && opts.idList !== null) {\n      postBody['idList'] = opts.idList\n    }\n    if (opts.expireDate !== undefined && opts.expireDate !== null) {\n      postBody['expireDate'] = opts.expireDate\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyPrivilegeExpireDate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/management:modifyPrivilegeExpireDate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生产创建视图SQL语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id。  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.viewName] - 视图名称。  optional\n      * @param {} [opts.viewAlgorithm] - 视图算法，DEFAULT(&quot;DEFAULT&quot;, 1),UNDEFINED(&quot;UNDEFINED&quot;, 2), MERGE(&quot;MERGE&quot;, 3), TEMPTABLE(&quot;TEMPTABLE&quot;, 4);  optional\n      * @param {} [opts.definer] - 定义者。  optional\n      * @param {} [opts.viewSecurity] - 安全性，DEFAULT(&quot;DEFAULT&quot;, 1),DEFINER(&quot;DEFINER&quot;, 2), INVOKER(&quot;INVOKER&quot;, 3);  optional\n      * @param {} [opts.viewCheckOption] - 检查选项，DEFAULT(&quot;DEFAULT&quot;, 1),LOCAL(&quot;LOCAL&quot;, 2), CASCADED(&quot;CASCADED&quot;, 3);;  optional\n      * @param {} [opts.definitionSql] - 视图定义。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalCreateView (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalCreateView\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.viewName !== undefined && opts.viewName !== null) {\n      postBody['viewName'] = opts.viewName\n    }\n    if (opts.viewAlgorithm !== undefined && opts.viewAlgorithm !== null) {\n      postBody['viewAlgorithm'] = opts.viewAlgorithm\n    }\n    if (opts.definer !== undefined && opts.definer !== null) {\n      postBody['definer'] = opts.definer\n    }\n    if (opts.viewSecurity !== undefined && opts.viewSecurity !== null) {\n      postBody['viewSecurity'] = opts.viewSecurity\n    }\n    if (opts.viewCheckOption !== undefined && opts.viewCheckOption !== null) {\n      postBody['viewCheckOption'] = opts.viewCheckOption\n    }\n    if (opts.definitionSql !== undefined && opts.definitionSql !== null) {\n      postBody['definitionSql'] = opts.definitionSql\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalCreateView with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/view:generalCreate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成修改视图sql语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.viewName] - 视图名称。  optional\n      * @param {} [opts.originViewName] - 原始视图名称。  optional\n      * @param {} [opts.viewAlgorithm] - 视图算法，DEFAULT(&quot;DEFAULT&quot;, 1),UNDEFINED(&quot;UNDEFINED&quot;, 2), MERGE(&quot;MERGE&quot;, 3), TEMPTABLE(&quot;TEMPTABLE&quot;, 4);  optional\n      * @param {} [opts.definer] - 定义者。  optional\n      * @param {} [opts.viewSecurity] - 安全性，DEFAULT(&quot;DEFAULT&quot;, 1),DEFINER(&quot;DEFINER&quot;, 2), INVOKER(&quot;INVOKER&quot;, 3);  optional\n      * @param {} [opts.viewCheckOption] - 检查选项，DEFAULT(&quot;DEFAULT&quot;, 1),LOCAL(&quot;LOCAL&quot;, 2), CASCADED(&quot;CASCADED&quot;, 3);;  optional\n      * @param {} [opts.definitionSql] - 视图定义。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalAlterView (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalAlterView\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.viewName !== undefined && opts.viewName !== null) {\n      postBody['viewName'] = opts.viewName\n    }\n    if (opts.originViewName !== undefined && opts.originViewName !== null) {\n      postBody['originViewName'] = opts.originViewName\n    }\n    if (opts.viewAlgorithm !== undefined && opts.viewAlgorithm !== null) {\n      postBody['viewAlgorithm'] = opts.viewAlgorithm\n    }\n    if (opts.definer !== undefined && opts.definer !== null) {\n      postBody['definer'] = opts.definer\n    }\n    if (opts.viewSecurity !== undefined && opts.viewSecurity !== null) {\n      postBody['viewSecurity'] = opts.viewSecurity\n    }\n    if (opts.viewCheckOption !== undefined && opts.viewCheckOption !== null) {\n      postBody['viewCheckOption'] = opts.viewCheckOption\n    }\n    if (opts.definitionSql !== undefined && opts.definitionSql !== null) {\n      postBody['definitionSql'] = opts.definitionSql\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalAlterView with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/view:generalAlter',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成删除视图sql语句，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.viewName] - 视图名称。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dmsSql dmsSqls\n      */\n\n  generalDropView (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  generalDropView\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.viewName !== undefined && opts.viewName !== null) {\n      postBody['viewName'] = opts.viewName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generalDropView with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/view:generalDrop',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取视图详情，支持Mysql\n      * @param {Object} opts - parameters\n      * @param {} [opts.dataSourceId] - 数据源id  optional\n      * @param {} [opts.dbName] - 数据库名称。  optional\n      * @param {} [opts.viewName] - 视图名称。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string dbName  数据库名称。\n      * @param string viewName  视图名称。\n      * @param string definer  定义者。\n      * @param string viewAlgorithm  算法。\n      * @param string viewCheckOption  检查选项。\n      * @param string viewSecurity  安全性。\n      * @param string definitionSql  视图定义。\n      */\n\n  viewInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  viewInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.dataSourceId !== undefined && opts.dataSourceId !== null) {\n      postBody['dataSourceId'] = opts.dataSourceId\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.viewName !== undefined && opts.viewName !== null) {\n      postBody['viewName'] = opts.viewName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call viewInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/view:info',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = DMS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/domain/v1/domain.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Domain-Template\n * 域名模板相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'domain'\nService._services[serviceId] = true\n\n/**\n * domain service.\n * @version 1.0.0\n */\n\nclass DOMAIN extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'domain.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  检查域名是否可以注册\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 要检查的域名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param checkDomain data  检查域名的返回结果\n      */\n\n  checkDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling checkDomain\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/domain:check',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名的whois信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 要检查的域名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainWhoisInfo data  域名Whois返回结果\n      */\n\n  queryWhoisInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryWhoisInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling queryWhoisInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryWhoisInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/domain:whoisInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户的域名信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 要注册的域名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainInfo data  域名信息返回结果\n      */\n\n  domainInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  domainInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling domainInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call domainInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/domain',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域名注册\n域名注册前，请确保用户的京东云账户有足够的资金支付，Openapi接口回返回订单号，可以用此订单号向计费系统查阅详情\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 域名\n      * @param {integer} opts.term - 注册年限，最多10年\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainOrder data  域名购买返回结果，后续需要调用订单支付接口\n      */\n\n  createDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling createDomain\"\n      )\n    }\n    if (opts.term === undefined || opts.term === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.term' when calling createDomain\"\n      )\n    }\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling createDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      postBody['domainName'] = opts.domainName\n    }\n    if (opts.term !== undefined && opts.term !== null) {\n      postBody['term'] = opts.term\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/domain',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  针对用户的域名进行续费\n域名续费前，请确保用户的京东云账户有足够的资金支付，Openapi接口回返回订单号，可以用此订单号向计费系统查阅详情\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 域名\n      * @param {integer} opts.term - 续费年限，最多10年\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainOrder data  域名续费返回结果，后续需要调用订单支付接口\n      */\n\n  renewDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  renewDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling renewDomain\"\n      )\n    }\n    if (opts.term === undefined || opts.term === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.term' when calling renewDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      postBody['domainName'] = opts.domainName\n    }\n    if (opts.term !== undefined && opts.term !== null) {\n      postBody['term'] = opts.term\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call renewDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/renew',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域名转入状态查询\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 要转入的域名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer transferInState  转入状态：0转入失败 1验证邮箱 2转入处理中 3转入成功\n      */\n\n  transferinDomainState (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  transferinDomainState\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling transferinDomainState\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call transferinDomainState with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/transferin',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  用于提交域名转入操作\n要转入域名前，请确保用户的京东云账户有足够的资金支付，Openapi接口回返回订单号，可以用此订单号向计费系统查阅详情\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 域名\n      * @param {string} opts.passWord - 域名转移密码\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainOrder data  域名转入返回结果，后续需要调用订单支付接口，待支付完成后，查询域名转入进度\n      */\n\n  transferinDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  transferinDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling transferinDomain\"\n      )\n    }\n    if (opts.passWord === undefined || opts.passWord === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.passWord' when calling transferinDomain\"\n      )\n    }\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling transferinDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      postBody['domainName'] = opts.domainName\n    }\n    if (opts.passWord !== undefined && opts.passWord !== null) {\n      postBody['passWord'] = opts.passWord\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call transferinDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/transferin',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据域名修改域名对应的 DNS 信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 要修改的域名\n      * @param {array} [opts.dns] - 要修改的DNS,个数要求再2个-6个之间  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyDns (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyDns\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling modifyDns\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      postBody['domainName'] = opts.domainName\n    }\n    if (opts.dns !== undefined && opts.dns !== null) {\n      postBody['dns'] = opts.dns\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyDns with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/domain:dns',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  通过已实名的信息模板，完成域名的快速过户\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 要修改的域名\n      * @param {integer} opts.templateId - 要过户的模板ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  domainTemplateAssigned (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  domainTemplateAssigned\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling domainTemplateAssigned\"\n      )\n    }\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling domainTemplateAssigned\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      postBody['domainName'] = opts.domainName\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call domainTemplateAssigned with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/domain:assigned',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域名锁定，设置域名状态为禁止转移\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 要修改的域名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  domainLock (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  domainLock\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling domainLock\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      postBody['domainName'] = opts.domainName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call domainLock with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/domain:lock',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域名解锁，，取消域名禁止转移的状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 要修改的域名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  domainUnLock (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  domainUnLock\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling domainUnLock\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      postBody['domainName'] = opts.domainName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call domainUnLock with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/domain:unlock',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取转移密码，用于域名转移注册商转出获取域名转移密码\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 要修改的域名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string passWord  获取的转移密码，如果转移密码为空，则表示邮件已发送至域名对应的模板中的邮箱中\n      */\n\n  getDomainTransferOutPassWord (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDomainTransferOutPassWord\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling getDomainTransferOutPassWord\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDomainTransferOutPassWord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/domain:transferOut',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建域名信息模板\n      * @param {Object} opts - parameters\n      * @param {string} [opts.userNameCh] - 联系人姓名(中文),必填,必须含有中文,只允许输入特殊字符(.,、·()()-&quot;&quot;“”/\\&#39;),最多可输入64 字符  optional\n      * @param {string} [opts.userNameEn1] - 联系人姓(英文),必填,必须含有英文,只允许输入特殊字符(.,、·()()-&quot;&quot;“”/\\&#39;),最多可输入64 字符  optional\n      * @param {string} [opts.userNameEn2] - 联系人名(英文),必填,必须含有英文,只允许输入特殊字符(.,、·()()-&quot;&quot;“”/\\&#39;),最多可输入64 字符  optional\n      * @param {string} [opts.ownerNameCh] - 域名所有者或所有者单位名称(中文),必填,必须含有中文,只允许输入特殊字符(.,、·()()-&quot;&quot;“”/\\&#39;),最多可输入64 字符  optional\n      * @param {string} [opts.ownerNameEn] - 域名所有者或所有者单位名称(英文),必填,必须含有中文,只允许输入特殊字符(.,、·()()-&quot;&quot;“”/\\&#39;),最多可输入64 字符  optional\n      * @param {string} [opts.nationCodeCh] - 国家及地区（中文）  optional\n      * @param {string} [opts.nationCodeEn] - 国家及地区（英文）  optional\n      * @param {string} [opts.provinceCodeCh] - 省份（中文）  optional\n      * @param {string} [opts.provinceCodeEn] - 省份（英文）  optional\n      * @param {string} [opts.cityCodeCh] - 城市（中文）  optional\n      * @param {string} [opts.cityCodeEn] - 城市（英文）  optional\n      * @param {string} [opts.addressCh] - 通信地址（中文）  optional\n      * @param {string} [opts.addressEn] - 通信地址（英文）  optional\n      * @param {string} [opts.zipCode] - 邮编 6位数字  optional\n      * @param {string} [opts.phone] - 联系电话，国家区号-地区区号(或手机号码前3位)-电话号码（或手机号码后8位) 例:86-138-12345678  optional\n      * @param {string} [opts.fax] - 传真，国家区号-地区区号(或手机号码前3位)-电话号码（或手机号码后8位) 例:86-138-12345678  optional\n      * @param {string} [opts.email] - 邮件  optional\n      * @param {integer} [opts.ownerType] - 所有者类型  1个人 2企业  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer templateId  模板Id\n      */\n\n  createTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.userNameCh !== undefined && opts.userNameCh !== null) {\n      postBody['userNameCh'] = opts.userNameCh\n    }\n    if (opts.userNameEn1 !== undefined && opts.userNameEn1 !== null) {\n      postBody['userNameEn1'] = opts.userNameEn1\n    }\n    if (opts.userNameEn2 !== undefined && opts.userNameEn2 !== null) {\n      postBody['userNameEn2'] = opts.userNameEn2\n    }\n    if (opts.ownerNameCh !== undefined && opts.ownerNameCh !== null) {\n      postBody['ownerNameCh'] = opts.ownerNameCh\n    }\n    if (opts.ownerNameEn !== undefined && opts.ownerNameEn !== null) {\n      postBody['ownerNameEn'] = opts.ownerNameEn\n    }\n    if (opts.nationCodeCh !== undefined && opts.nationCodeCh !== null) {\n      postBody['nationCodeCh'] = opts.nationCodeCh\n    }\n    if (opts.nationCodeEn !== undefined && opts.nationCodeEn !== null) {\n      postBody['nationCodeEn'] = opts.nationCodeEn\n    }\n    if (opts.provinceCodeCh !== undefined && opts.provinceCodeCh !== null) {\n      postBody['provinceCodeCh'] = opts.provinceCodeCh\n    }\n    if (opts.provinceCodeEn !== undefined && opts.provinceCodeEn !== null) {\n      postBody['provinceCodeEn'] = opts.provinceCodeEn\n    }\n    if (opts.cityCodeCh !== undefined && opts.cityCodeCh !== null) {\n      postBody['cityCodeCh'] = opts.cityCodeCh\n    }\n    if (opts.cityCodeEn !== undefined && opts.cityCodeEn !== null) {\n      postBody['cityCodeEn'] = opts.cityCodeEn\n    }\n    if (opts.addressCh !== undefined && opts.addressCh !== null) {\n      postBody['addressCh'] = opts.addressCh\n    }\n    if (opts.addressEn !== undefined && opts.addressEn !== null) {\n      postBody['addressEn'] = opts.addressEn\n    }\n    if (opts.zipCode !== undefined && opts.zipCode !== null) {\n      postBody['zipCode'] = opts.zipCode\n    }\n    if (opts.phone !== undefined && opts.phone !== null) {\n      postBody['phone'] = opts.phone\n    }\n    if (opts.fax !== undefined && opts.fax !== null) {\n      postBody['fax'] = opts.fax\n    }\n    if (opts.email !== undefined && opts.email !== null) {\n      postBody['email'] = opts.email\n    }\n    if (opts.ownerType !== undefined && opts.ownerType !== null) {\n      postBody['ownerType'] = opts.ownerType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/template',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名信息模板\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param templateInfo data  模板信息返回结果\n      */\n\n  queryTemplateInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryTemplateInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling queryTemplateInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryTemplateInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/template/{templateId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改域名信息模板\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} [opts.nationCodeCh] - 国家及地区（中文）  optional\n      * @param {string} [opts.nationCodeEn] - 国家及地区（英文）中国：china  optional\n      * @param {string} [opts.provinceCodeCh] - 省份（中文）  optional\n      * @param {string} [opts.provinceCodeEn] - 省份（英文）  optional\n      * @param {string} [opts.cityCodeCh] - 城市（中文）  optional\n      * @param {string} [opts.cityCodeEn] - 城市（英文）  optional\n      * @param {string} [opts.addressCh] - 通信地址（中文）  optional\n      * @param {string} [opts.addressEn] - 通信地址（英文）  optional\n      * @param {string} [opts.zipCode] - 邮编 6位数字  optional\n      * @param {string} [opts.phone] - 联系电话，国家区号-地区区号(或手机号码前3位)-电话号码（或手机号码后8位) 例:86-138-12345678  optional\n      * @param {string} [opts.fax] - 传真，国家区号-地区区号(或手机号码前3位)-电话号码（或手机号码后8位) 例:86-138-12345678  optional\n      * @param {string} [opts.email] - 邮件  optional\n      * @param {integer} [opts.ownerType] - 所有者类型  1个人 2企业  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer templateId  模板Id\n      */\n\n  modifyTemplateInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyTemplateInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling modifyTemplateInfo\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.nationCodeCh !== undefined && opts.nationCodeCh !== null) {\n      postBody['nationCodeCh'] = opts.nationCodeCh\n    }\n    if (opts.nationCodeEn !== undefined && opts.nationCodeEn !== null) {\n      postBody['nationCodeEn'] = opts.nationCodeEn\n    }\n    if (opts.provinceCodeCh !== undefined && opts.provinceCodeCh !== null) {\n      postBody['provinceCodeCh'] = opts.provinceCodeCh\n    }\n    if (opts.provinceCodeEn !== undefined && opts.provinceCodeEn !== null) {\n      postBody['provinceCodeEn'] = opts.provinceCodeEn\n    }\n    if (opts.cityCodeCh !== undefined && opts.cityCodeCh !== null) {\n      postBody['cityCodeCh'] = opts.cityCodeCh\n    }\n    if (opts.cityCodeEn !== undefined && opts.cityCodeEn !== null) {\n      postBody['cityCodeEn'] = opts.cityCodeEn\n    }\n    if (opts.addressCh !== undefined && opts.addressCh !== null) {\n      postBody['addressCh'] = opts.addressCh\n    }\n    if (opts.addressEn !== undefined && opts.addressEn !== null) {\n      postBody['addressEn'] = opts.addressEn\n    }\n    if (opts.zipCode !== undefined && opts.zipCode !== null) {\n      postBody['zipCode'] = opts.zipCode\n    }\n    if (opts.phone !== undefined && opts.phone !== null) {\n      postBody['phone'] = opts.phone\n    }\n    if (opts.fax !== undefined && opts.fax !== null) {\n      postBody['fax'] = opts.fax\n    }\n    if (opts.email !== undefined && opts.email !== null) {\n      postBody['email'] = opts.email\n    }\n    if (opts.ownerType !== undefined && opts.ownerType !== null) {\n      postBody['ownerType'] = opts.ownerType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyTemplateInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/template/{templateId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除域名信息模板\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer templateId  模板Id\n      */\n\n  deleteTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling deleteTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/template/{templateId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名信息模板实名认证状态\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer certificateState  实名认证状态 0未实名认证 1已实名认证 2审核中 3审核失败 4实名资料上传注册局失败\n      * @param string certificateUnpassReason  实名认证失败原因\n      */\n\n  certificateTemplateState (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  certificateTemplateState\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling certificateTemplateState\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call certificateTemplateState with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/template/{templateId}/certificate',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域名信息模板实名认证\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} opts.identityNo - 所有人证件号码\n      * @param {string} opts.identityType - 注册人证件类型\n1.个人\n  (1)身份证 SFZ\n2.企业\n  (1)组织机构代码证 ORG\n  (2)工商营业执照 YYZZ\n  (3)统一社会信用代码证书 TYDMZ\n  (4)部队代号 BDDH\n  (5)军队单位对外有偿服务许可证 JDXKZ\n  (6)事业单位法人证书 SYZS\n  (7)社会团体法人登记证书 STDJZ\n  (8)宗教活动场所登记证 ZJDJZ\n  (9)民办非企业单位登记证书 MBDJZ\n  (10)基金会法人登记证书 JJDJZ\n  (11)律师事务所执业许可证 LSXKZ\n  (12)登记证 GWLYDJZ\n  (13)司法鉴定许可证 SFXKZ\n  (14)社会服务机构登记证书 SHFWJGZ\n  (15)民办学校办学许可证 MBXXXKZ\n  (16)医疗机构执业许可证 YLJGXKZ\n\n      * @param {string} opts.file - 所有人证件，jpg 图片的 base64 编码，必填（大小 55KB~1MB）\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer templateId  模板Id\n      */\n\n  certificateTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  certificateTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling certificateTemplate\"\n      )\n    }\n    if (opts.identityNo === undefined || opts.identityNo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identityNo' when calling certificateTemplate\"\n      )\n    }\n    if (opts.identityType === undefined || opts.identityType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identityType' when calling certificateTemplate\"\n      )\n    }\n    if (opts.file === undefined || opts.file === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.file' when calling certificateTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.identityNo !== undefined && opts.identityNo !== null) {\n      postBody['identityNo'] = opts.identityNo\n    }\n    if (opts.identityType !== undefined && opts.identityType !== null) {\n      postBody['identityType'] = opts.identityType\n    }\n    if (opts.file !== undefined && opts.file !== null) {\n      postBody['file'] = opts.file\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domain/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call certificateTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/template/{templateId}/certificate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = DOMAIN\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/domainservice/v2/domainservice.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 实例信息\n * 云解析OpenAPI实例信息接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'domainservice'\nService._services[serviceId] = true\n\n/**\n * domainservice service.\n * @version 2.0.3\n */\n\nJDCloud.DOMAINSERVICE = class DOMAINSERVICE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'domainservice.jdcloud-api.com'\n    options.basePath = '/v2' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查看用户在云解析服务下的操作记录\n      * @param {Object} opts - parameters\n      * @param {integer} opts.pageNumber - 分页参数，页的序号，默认是1\n      * @param {integer} opts.pageSize - 分页参数，每页含有的结果的数目，默认是10\n      * @param {string} opts.startTime - 记录的起始时间，格式：UTC时间例如2017-11-10T23:00:00Z\n      * @param {string} opts.endTime - 记录的终止时间，格式：UTC时间例如2017-11-10T23:00:00Z\n      * @param {string} [opts.keyWord] - 日志需要匹配的关键词  optional\n      * @param {boolean} [opts.success] - 日志里面的结果是成功还是失败  optional\n      * @param {integer} [opts.type] - 日志的类型  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param actionlog dataList\n      * @param integer currentCount  当前页的操作记录列表里的个数\n      * @param integer totalCount  所有操作记录的个数\n      * @param integer totalPage  操作记录列表按照分页参数一共的页数\n      */\n\n  describeActionLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeActionLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling describeActionLog\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeActionLog\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeActionLog\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeActionLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.keyWord !== undefined && opts.keyWord !== null) {\n      queryParams['keyWord'] = opts.keyWord\n    }\n    if (opts.success !== undefined && opts.success !== null) {\n      queryParams['success'] = opts.success\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeActionLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/actionLog',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取用户所属的主域名列表。\n请在调用域名相关的接口之前，调用此接口获取相关的domainId和domainName。\n主域名的相关概念，请查阅&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/jd-cloud-dns/product-overview&quot;&gt;云解析文档&lt;/a&gt;\n\n      * @param {Object} opts - parameters\n      * @param {integer} opts.pageNumber - 分页查询时查询的每页的序号，起始值为1，默认为1\n      * @param {integer} opts.pageSize - 分页查询时设置的每页行数，默认为10\n      * @param {string} [opts.domainName] - 关键字，按照”%domainName%”模式匹配主域名  optional\n      * @param {integer} [opts.domainId] - 域名ID。不为0时，只查此domainId的域名  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainInfo dataList\n      * @param integer currentCount  当前页的域名列表里域名的个数\n      * @param integer totalCount  所有匹配的域名列表的个数\n      * @param integer totalPage  所有匹配的域名列表按照分页参数一共的页数\n      */\n\n  describeDomains (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDomains\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling describeDomains\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeDomains\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.domainId !== undefined && opts.domainId !== null) {\n      queryParams['domainId'] = opts.domainId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDomains with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加主域名\n如何添加免费域名，详细情况请查阅&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/jd-cloud-dns/domainadd&quot;&gt;文档&lt;/a&gt;\n添加收费域名，请查阅&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/jd-cloud-dns/purchase-process&quot;&gt;文档&lt;/a&gt;，\n添加收费域名前，请确保用户的京东云账户有足够的资金支付，Openapi接口回返回订单号，可以用此订单号向计费系统查阅详情。\n\n      * @param {Object} opts - parameters\n      * @param {integer} opts.packId - 主域名的套餐类型, 免费:0 企业版:1 企业高级版:2\n      * @param {string} opts.domainName - 要添加的主域名\n      * @param {integer} [opts.domainId] - 主域名的ID，升级套餐必填，请使用describeDomains获取  optional\n      * @param {integer} [opts.buyType] - 新购买:1、升级:3，收费套餐的域名必填  optional\n      * @param {integer} [opts.timeSpan] - 取值1，2，3 ，含义：时长，收费套餐的域名必填  optional\n      * @param {integer} [opts.timeUnit] - 时间单位，收费套餐的域名必填，1：小时，2：天，3：月，4：年  optional\n      * @param {integer} [opts.billingType] - 计费类型，可以不传此参数。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainAdded data  新添加的的域名结构\n      * @param string order  添加收费版域名的订单号\n      */\n\n  createDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.packId === undefined || opts.packId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.packId' when calling createDomain\"\n      )\n    }\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling createDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.packId !== undefined && opts.packId !== null) {\n      postBody['packId'] = opts.packId\n    }\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      postBody['domainName'] = opts.domainName\n    }\n    if (opts.domainId !== undefined && opts.domainId !== null) {\n      postBody['domainId'] = opts.domainId\n    }\n    if (opts.buyType !== undefined && opts.buyType !== null) {\n      postBody['buyType'] = opts.buyType\n    }\n    if (opts.timeSpan !== undefined && opts.timeSpan !== null) {\n      postBody['timeSpan'] = opts.timeSpan\n    }\n    if (opts.timeUnit !== undefined && opts.timeUnit !== null) {\n      postBody['timeUnit'] = opts.timeUnit\n    }\n    if (opts.billingType !== undefined && opts.billingType !== null) {\n      postBody['billingType'] = opts.billingType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改主域名\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {string} opts.domainName - 需要修改的主域名，请使用describeDomains接口获取\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling modifyDomain\"\n      )\n    }\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling modifyDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      postBody['domainName'] = opts.domainName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除主域名\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling deleteDomain\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看主域名的解析次数\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {string} opts.domainName - 查询的主域名，请使用describeDomains接口获取\n      * @param {string} opts.start - 查询时间段的起始时间, UTC时间格式，例如2017-11-10T23:00:00Z\n      * @param {string} opts.end - 查询时间段的终止时间, UTC时间格式，例如2017-11-10T23:00:00Z\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer time\n      * @param integer traffic\n      */\n\n  describeDomainQueryCount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDomainQueryCount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling describeDomainQueryCount\"\n      )\n    }\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling describeDomainQueryCount\"\n      )\n    }\n    if (opts.start === undefined || opts.start === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.start' when calling describeDomainQueryCount\"\n      )\n    }\n    if (opts.end === undefined || opts.end === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.end' when calling describeDomainQueryCount\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.start !== undefined && opts.start !== null) {\n      queryParams['start'] = opts.start\n    }\n    if (opts.end !== undefined && opts.end !== null) {\n      queryParams['end'] = opts.end\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDomainQueryCount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/queryCount',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看域名的查询流量\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {string} opts.domainName - 主域名，请使用describeDomains接口获取\n      * @param {string} opts.start - 时间段的起始时间, UTC时间格式，例如2017-11-10T23:00:00Z\n      * @param {string} opts.end - 时间段的终止时间, UTC时间格式，例如2017-11-10T23:00:00Z\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer time\n      * @param string unit  数据序列的单位\n      * @param number traffic\n      */\n\n  describeDomainQueryTraffic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDomainQueryTraffic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling describeDomainQueryTraffic\"\n      )\n    }\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling describeDomainQueryTraffic\"\n      )\n    }\n    if (opts.start === undefined || opts.start === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.start' when calling describeDomainQueryTraffic\"\n      )\n    }\n    if (opts.end === undefined || opts.end === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.end' when calling describeDomainQueryTraffic\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.start !== undefined && opts.start !== null) {\n      queryParams['start'] = opts.start\n    }\n    if (opts.end !== undefined && opts.end !== null) {\n      queryParams['end'] = opts.end\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDomainQueryTraffic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/queryTraffic',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询主域名的解析记录。\n在使用解析记录相关的接口之前，请调用此接口获取解析记录的列表。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {integer} [opts.pageNumber] - 当前页数，起始值为1，默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页查询时设置的每页行数, 默认为10  optional\n      * @param {string} [opts.search] - 关键字，按照”%search%”模式匹配解析记录的主机记录  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rRInfo dataList\n      * @param integer totalCount  所有解析记录的个数\n      * @param integer totalPage  所有解析记录的页数\n      * @param integer currentCount  当前页解析记录的个数\n      */\n\n  describeResourceRecord (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeResourceRecord\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling describeResourceRecord\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.search !== undefined && opts.search !== null) {\n      queryParams['search'] = opts.search\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeResourceRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/ResourceRecord',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加主域名的解析记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {addRR} opts.req - RR参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rR dataList  添加成功后的解析记录结果\n      */\n\n  createResourceRecord (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createResourceRecord\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling createResourceRecord\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling createResourceRecord\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createResourceRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/ResourceRecord',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改主域名的某个解析记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {string} opts.resourceRecordId - 解析记录ID，请使用describeResourceRecord接口获取。\n      * @param {updateRR} opts.req - updateRR参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyResourceRecord (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyResourceRecord\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling modifyResourceRecord\"\n      )\n    }\n    if (opts.resourceRecordId === undefined || opts.resourceRecordId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceRecordId' when calling modifyResourceRecord\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling modifyResourceRecord\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId,\n      resourceRecordId: opts.resourceRecordId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyResourceRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/ResourceRecord/{resourceRecordId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除主域名下的解析记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {string} opts.resourceRecordId - 解析记录ID，请使用describeResourceRecord接口获取。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteResourceRecord (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteResourceRecord\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling deleteResourceRecord\"\n      )\n    }\n    if (opts.resourceRecordId === undefined || opts.resourceRecordId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceRecordId' when calling deleteResourceRecord\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId,\n      resourceRecordId: opts.resourceRecordId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteResourceRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/ResourceRecord/{resourceRecordId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用、停用主域名下的解析记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {string} opts.resourceRecordId - 解析记录ID，请使用describeResourceRecord接口获取。\n      * @param {string} opts.action - 要修改的状态，enable:启用 disable:停用\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyResourceRecordStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyResourceRecordStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling modifyResourceRecordStatus\"\n      )\n    }\n    if (opts.resourceRecordId === undefined || opts.resourceRecordId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceRecordId' when calling modifyResourceRecordStatus\"\n      )\n    }\n    if (opts.action === undefined || opts.action === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.action' when calling modifyResourceRecordStatus\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.action !== undefined && opts.action !== null) {\n      postBody['action'] = opts.action\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId,\n      resourceRecordId: opts.resourceRecordId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyResourceRecordStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/ResourceRecord/{resourceRecordId}/status',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询云解析所有的基础解析线路。\n在使用解析线路的参数之前，请调用此接口获取解析线路的ID。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {integer} [opts.loadMode] - 展示方式，暂时不使用  optional\n      * @param {integer} opts.packId - 套餐ID，0-&gt;免费版 1-&gt;企业版 2-&gt;企业高级版\n      * @param {integer} opts.viewId - view ID，默认为-1\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param viewTree data\n      */\n\n  describeViewTree (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeViewTree\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling describeViewTree\"\n      )\n    }\n    if (opts.packId === undefined || opts.packId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.packId' when calling describeViewTree\"\n      )\n    }\n    if (opts.viewId === undefined || opts.viewId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.viewId' when calling describeViewTree\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.loadMode !== undefined && opts.loadMode !== null) {\n      queryParams['loadMode'] = opts.loadMode\n    }\n    if (opts.packId !== undefined && opts.packId !== null) {\n      queryParams['packId'] = opts.packId\n    }\n    if (opts.viewId !== undefined && opts.viewId !== null) {\n      queryParams['viewId'] = opts.viewId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeViewTree with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/viewTree',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  同一个主域名下，批量新增或者批量更新导入解析记录。\n如果解析记录的ID为0，是新增解析记录，如果不为0，则是更新解析记录。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {array} [opts.req] - 需要设置的解析记录列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  batchSetResourceRecords (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  batchSetResourceRecords\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling batchSetResourceRecords\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchSetResourceRecords with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/BatchSetResourceRecords',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询主域名的自定义解析线路\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {integer} opts.viewId - 自定义线路ID\n      * @param {string} [opts.viewName] - 自定义线路名称, 最多64个字节，允许：数字、字母、下划线，-，中文  optional\n      * @param {integer} opts.pageNumber - 分页参数，页的序号\n      * @param {integer} opts.pageSize - 分页参数，每页含有的结果的数目\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param userViewInput dataList\n      * @param integer currentCount  当前页的自定义线路列表里的个数\n      * @param integer totalCount  所有自定义线路列表的个数\n      * @param integer totalPage  所有自定义线路列表按照分页参数一共的页数\n      */\n\n  describeUserView (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeUserView\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling describeUserView\"\n      )\n    }\n    if (opts.viewId === undefined || opts.viewId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.viewId' when calling describeUserView\"\n      )\n    }\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling describeUserView\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeUserView\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.viewId !== undefined && opts.viewId !== null) {\n      queryParams['viewId'] = opts.viewId\n    }\n    if (opts.viewName !== undefined && opts.viewName !== null) {\n      queryParams['viewName'] = opts.viewName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUserView with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/UserView',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加主域名的自定义解析线路\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {addView} opts.req - 添加自定义线路的参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param userview data  添加成功后返回的自定义线路的结构\n      */\n\n  createUserView (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createUserView\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling createUserView\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling createUserView\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createUserView with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/UserView',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除主域名的自定义解析线路\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {delView} opts.req - 删除自定义线路的参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteUserView (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteUserView\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling deleteUserView\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling deleteUserView\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteUserView with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/DeleteUserView',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询主域名的自定义解析线路的IP段\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {integer} opts.viewId - 自定义线路ID\n      * @param {string} [opts.viewName] - 自定义线路名称, 最多64个字节，允许：数字、字母、下划线，-，中文  optional\n      * @param {integer} opts.pageNumber - 分页参数，页的序号, 默认为1\n      * @param {integer} opts.pageSize - 分页参数，每页含有的结果的数目，默认为10\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string dataList\n      * @param integer currentCount  当前页的IP列表里的个数\n      * @param integer totalCount  IP列表里的IP段的个数\n      * @param integer totalPage  IP列表按照分页参数一共的页数\n      */\n\n  describeUserViewIP (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeUserViewIP\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling describeUserViewIP\"\n      )\n    }\n    if (opts.viewId === undefined || opts.viewId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.viewId' when calling describeUserViewIP\"\n      )\n    }\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling describeUserViewIP\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeUserViewIP\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.viewId !== undefined && opts.viewId !== null) {\n      queryParams['viewId'] = opts.viewId\n    }\n    if (opts.viewName !== undefined && opts.viewName !== null) {\n      queryParams['viewName'] = opts.viewName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUserViewIP with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/UserViewIP',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加主域名的自定义解析线路的IP段\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {addViewIP} opts.req - 添加域名的自定义解析线路的IP段的参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createUserViewIP (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createUserViewIP\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling createUserViewIP\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling createUserViewIP\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createUserViewIP with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/UserViewIP',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除主域名的自定义解析线路的IP段\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {delViewIP} opts.req - 删除域名的自定义解析线路的IP段的参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteUserViewIP (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteUserViewIP\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling deleteUserViewIP\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling deleteUserViewIP\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteUserViewIP with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/DeleteUserViewIP',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看主域名的监控项的配置以及状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {integer} [opts.pageIndex] - 当前页数，起始值为1，默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页查询时设置的每页行数  optional\n      * @param {string} [opts.searchValue] - 查询的值  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer currentCount  当前页面网站监控项的个数\n      * @param integer totalCount  所有网站监控项的个数\n      * @param integer totalPage  所有网站监控项的页数\n      * @param monitor dataList\n      */\n\n  describeMonitor (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMonitor\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling describeMonitor\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.searchValue !== undefined && opts.searchValue !== null) {\n      queryParams['searchValue'] = opts.searchValue\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitor',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加子域名的监控项，默认把子域名的所有监控项都添加上监控\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {string} opts.subDomainName - 子域名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createMonitor (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createMonitor\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling createMonitor\"\n      )\n    }\n    if (opts.subDomainName === undefined || opts.subDomainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subDomainName' when calling createMonitor\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subDomainName !== undefined && opts.subDomainName !== null) {\n      postBody['subDomainName'] = opts.subDomainName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitor',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域名的监控项修改\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {updateMonitor} opts.updateMonitor - 监控项设置信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyMonitor (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyMonitor\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling modifyMonitor\"\n      )\n    }\n    if (opts.updateMonitor === undefined || opts.updateMonitor === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.updateMonitor' when calling modifyMonitor\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.updateMonitor !== undefined && opts.updateMonitor !== null) {\n      postBody['updateMonitor'] = opts.updateMonitor\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitor',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子域名的可用监控对象\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {string} opts.subDomainName - 子域名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  describeMonitorTarget (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMonitorTarget\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling describeMonitorTarget\"\n      )\n    }\n    if (opts.subDomainName === undefined || opts.subDomainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subDomainName' when calling describeMonitorTarget\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.subDomainName !== undefined && opts.subDomainName !== null) {\n      queryParams['subDomainName'] = opts.subDomainName\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMonitorTarget with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitorTarget',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加子域名的某些特定监控对象为监控项\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {string} opts.subDomainName - 子域名\n      * @param {array} [opts.targets] - 子域名可用监控对象的数组  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createMonitorTarget (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createMonitorTarget\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling createMonitorTarget\"\n      )\n    }\n    if (opts.subDomainName === undefined || opts.subDomainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subDomainName' when calling createMonitorTarget\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subDomainName !== undefined && opts.subDomainName !== null) {\n      postBody['subDomainName'] = opts.subDomainName\n    }\n    if (opts.targets !== undefined && opts.targets !== null) {\n      postBody['targets'] = opts.targets\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createMonitorTarget with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitorTarget',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  监控项的操作集合，包括：暂停，启动, 手动恢复, 手动切换\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {string} opts.monitorId - 监控项ID，请使用describeMonitor接口获取。\n      * @param {string} opts.action - 暂停stop, 开启start, 手动恢复recover，手动切换switch，手动恢复和手动切换时候不支持批量操作\n      * @param {string} [opts.switchTarget] - 监控项的主机值, 手动切换时必填  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyMonitorStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyMonitorStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling modifyMonitorStatus\"\n      )\n    }\n    if (opts.monitorId === undefined || opts.monitorId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.monitorId' when calling modifyMonitorStatus\"\n      )\n    }\n    if (opts.action === undefined || opts.action === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.action' when calling modifyMonitorStatus\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.action !== undefined && opts.action !== null) {\n      postBody['action'] = opts.action\n    }\n    if (opts.switchTarget !== undefined && opts.switchTarget !== null) {\n      postBody['switchTarget'] = opts.switchTarget\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId,\n      monitorId: opts.monitorId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyMonitorStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitor/{monitorId}/status',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  监控项的删除\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {string} opts.monitorId - 监控项ID，请使用describeMonitor接口获取。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteMonitor (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteMonitor\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling deleteMonitor\"\n      )\n    }\n    if (opts.monitorId === undefined || opts.monitorId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.monitorId' when calling deleteMonitor\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId,\n      monitorId: opts.monitorId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteMonitor with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitor/{monitorId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  主域名的监控项的报警信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainId - 域名ID，请使用describeDomains接口获取。\n      * @param {integer} [opts.pageIndex] - 当前页数，起始值为1，默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页查询时设置的每页行数  optional\n      * @param {string} [opts.searchValue] - 关键字  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer currentCount  当前页面报警信息的个数\n      * @param integer totalCount  所有报警信息的个数\n      * @param integer totalPage  所有报警信息的页数\n      * @param monitorAlarmInfo dataList\n      */\n\n  describeMonitorAlarm (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMonitorAlarm\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling describeMonitorAlarm\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.searchValue !== undefined && opts.searchValue !== null) {\n      queryParams['searchValue'] = opts.searchValue\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  domainservice/2.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMonitorAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/{domainId}/monitorAlarm',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.DOMAINSERVICE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/dts/v2/dts.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 数据传输服务\n * 数据传输服务相关接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'dts'\nService._services[serviceId] = true\n\n/**\n * dts service.\n * @version 2.2.0\n */\n\nclass DTS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'dts.jdcloud-api.com'\n    options.basePath = '/v2' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  批量操作数据传输任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.operateType] - 操作类型：start - 启动任务，stop - 停止任务，delete - 删除任务，resume - 恢复任务，suspend - 暂停任务  optional\n      * @param {} [opts.ids] - 任务ID列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object details\n      * @param string orderId  订单ID\n      */\n\n  batchOperateTasks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  batchOperateTasks\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.operateType !== undefined && opts.operateType !== null) {\n      postBody['operateType'] = opts.operateType\n    }\n    if (opts.ids !== undefined && opts.ids !== null) {\n      postBody['ids'] = opts.ids\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchOperateTasks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dtsbatch',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询数据传输任务信息\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1，取值范围：-1，[1,∞)；-1时返回全部页码。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[1, 100]  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {tagFilter} [opts.tagFilters] - Tag筛选条件  optional\n      * @param {sort} [opts.sorts] - createTime - 创建时间,asc（正序），desc（倒序）\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transmissionTask dts\n      * @param integer totalCount  总记录数\n      */\n\n  describeTransmissionTasks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTransmissionTasks\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(\n      queryParams,\n      super.buildTagFilterParam(opts.tagFilters, 'tagFilters')\n    )\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTransmissionTasks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建数据传输任务\n      * @param {Object} opts - parameters\n      * @param {} [opts.transmissionMethod] - 实例类型，取值为：Sync：同步、Subscribe：订阅、Migration：迁移、DisasterRecovery 灾备，默认取值为：Sync  optional\n      * @param {} [opts.topology] - 数据传输拓扑，支持：oneway - 单向数据传输、bidirectional - 双向数据传输，默认取值为：oneway  optional\n      * @param {} opts.vpc - 数据传输实例所属VPC。\n      * @param {} opts.subnet - 数据传输实例所属子网。\n      * @param {} [opts.availableZone] - 数据传输实例所属可用区，可选  optional\n      * @param {} opts.instanceClass - 数据传输实例规格，支持：dts.m1.medium、dts.m1.large、dts.m1.xlarge\n      * @param {} opts.chargeSpec - 计费方式，数据传输支持包年包月、按配置计费。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string id  任务ID\n      * @param string orderId  订单ID\n      */\n\n  createTransmissionTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createTransmissionTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpc === undefined || opts.vpc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpc' when calling createTransmissionTask\"\n      )\n    }\n    if (opts.subnet === undefined || opts.subnet === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnet' when calling createTransmissionTask\"\n      )\n    }\n    if (opts.instanceClass === undefined || opts.instanceClass === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceClass' when calling createTransmissionTask\"\n      )\n    }\n    if (opts.chargeSpec === undefined || opts.chargeSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.chargeSpec' when calling createTransmissionTask\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.transmissionMethod !== undefined &&\n      opts.transmissionMethod !== null\n    ) {\n      postBody['transmissionMethod'] = opts.transmissionMethod\n    }\n    if (opts.topology !== undefined && opts.topology !== null) {\n      postBody['topology'] = opts.topology\n    }\n    if (opts.vpc !== undefined && opts.vpc !== null) {\n      postBody['vpc'] = opts.vpc\n    }\n    if (opts.subnet !== undefined && opts.subnet !== null) {\n      postBody['subnet'] = opts.subnet\n    }\n    if (opts.availableZone !== undefined && opts.availableZone !== null) {\n      postBody['availableZone'] = opts.availableZone\n    }\n    if (opts.instanceClass !== undefined && opts.instanceClass !== null) {\n      postBody['instanceClass'] = opts.instanceClass\n    }\n    if (opts.chargeSpec !== undefined && opts.chargeSpec !== null) {\n      postBody['chargeSpec'] = opts.chargeSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createTransmissionTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询数据传输任务信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transmissionTaskAttribute dts\n      */\n\n  describeTransmissionTaskAttributes (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTransmissionTaskAttributes\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling describeTransmissionTaskAttributes\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTransmissionTaskAttributes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除数据传输任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteTransmissionTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteTransmissionTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling deleteTransmissionTask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTransmissionTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取预检查结果\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  任务状态\n      * @param object items\n      */\n\n  describePreCheckResult (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePreCheckResult\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling describePreCheckResult\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePreCheckResult with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}/precheck',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  预检查传输任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  preCheckTransmissionTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  preCheckTransmissionTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling preCheckTransmissionTask\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call preCheckTransmissionTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}/precheck',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  跳过预检查项目\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {string} opts.itemName - 跳过的项目名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  数据传输任务状态\n      * @param preCheckItem items\n      */\n\n  skipPreCheckItem (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  skipPreCheckItem\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling skipPreCheckItem\"\n      )\n    }\n    if (opts.itemName === undefined || opts.itemName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.itemName' when calling skipPreCheckItem\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId,\n      itemName: opts.itemName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call skipPreCheckItem with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}/precheck/{itemName}/skip',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  配置数据传输任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {} [opts.transmissionMode] - 传输任务模式：可选值：structureInitialization、dataInitialization、dataSynchronization，分别对应结构初始化，全量数据初始化，增量数据传输  optional\n      * @param {} [opts.destExecutionStrategy] - 目标端执行策略，对于目标MySQL，支持：覆盖写入 mysql-replace-engine，冲突检测 conflict-detect-engine  optional\n      * @param {} [opts.options] - 任务设置  optional\n      * @param {} opts.transmissionObject - 待传输的对象\n      * @param {} opts.taskName - 任务名称，名称只支持中文、数字、大小写字母及英文下划线“_”及中划线“-”，不超过32字符\n      * @param {} opts.source - 源端连接信息\n      * @param {} opts.destination - 目标端连接信息\n      * @param {} [opts.checkPoint] - 增量数据传输的启动位点  optional\n      * @param {} [opts.customOptions] - 任务自定义设置  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string id  任务ID\n      */\n\n  configureTransmissionTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  configureTransmissionTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling configureTransmissionTask\"\n      )\n    }\n    if (\n      opts.transmissionObject === undefined ||\n      opts.transmissionObject === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.transmissionObject' when calling configureTransmissionTask\"\n      )\n    }\n    if (opts.taskName === undefined || opts.taskName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskName' when calling configureTransmissionTask\"\n      )\n    }\n    if (opts.source === undefined || opts.source === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.source' when calling configureTransmissionTask\"\n      )\n    }\n    if (opts.destination === undefined || opts.destination === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.destination' when calling configureTransmissionTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.transmissionMode !== undefined && opts.transmissionMode !== null) {\n      postBody['transmissionMode'] = opts.transmissionMode\n    }\n    if (\n      opts.destExecutionStrategy !== undefined &&\n      opts.destExecutionStrategy !== null\n    ) {\n      postBody['destExecutionStrategy'] = opts.destExecutionStrategy\n    }\n    if (opts.options !== undefined && opts.options !== null) {\n      postBody['options'] = opts.options\n    }\n    if (\n      opts.transmissionObject !== undefined &&\n      opts.transmissionObject !== null\n    ) {\n      postBody['transmissionObject'] = opts.transmissionObject\n    }\n    if (opts.taskName !== undefined && opts.taskName !== null) {\n      postBody['taskName'] = opts.taskName\n    }\n    if (opts.source !== undefined && opts.source !== null) {\n      postBody['source'] = opts.source\n    }\n    if (opts.destination !== undefined && opts.destination !== null) {\n      postBody['destination'] = opts.destination\n    }\n    if (opts.checkPoint !== undefined && opts.checkPoint !== null) {\n      postBody['checkPoint'] = opts.checkPoint\n    }\n    if (opts.customOptions !== undefined && opts.customOptions !== null) {\n      postBody['customOptions'] = opts.customOptions\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call configureTransmissionTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}/configure',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动数据传输任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startTransmissionTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startTransmissionTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling startTransmissionTask\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startTransmissionTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}/start',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止数据传输任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopTransmissionTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopTransmissionTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling stopTransmissionTask\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopTransmissionTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}/stop',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  暂停数据传输任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  suspendTransmissionTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  suspendTransmissionTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling suspendTransmissionTask\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call suspendTransmissionTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}/suspend',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  继续数据传输任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resumeTransmissionTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resumeTransmissionTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling resumeTransmissionTask\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resumeTransmissionTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}/resume',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改数据传输任务名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {} [opts.name] - 任务名称，名称只支持中文、数字、大小写字母及英文下划线“_”及中划线“-”，不超过32字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyTransmissionTaskName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyTransmissionTaskName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling modifyTransmissionTaskName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyTransmissionTaskName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}/rename',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询数据传输对象信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object transmissionObject\n      */\n\n  describeTransmissionObject (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTransmissionObject\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling describeTransmissionObject\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTransmissionObject with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}/transmissionobject',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询数据传输日志信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param logDetail details\n      * @param integer totalCount  总数\n      */\n\n  describeTransmissionLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTransmissionLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling describeTransmissionLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTransmissionLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}/log',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  测试连接\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {} opts.endpoint - 实例信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param connectivityTestResult items\n      */\n\n  connectivityTest (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  connectivityTest\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling connectivityTest\"\n      )\n    }\n    if (opts.endpoint === undefined || opts.endpoint === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endpoint' when calling connectivityTest\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.endpoint !== undefined && opts.endpoint !== null) {\n      postBody['endpoint'] = opts.endpoint\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call connectivityTest with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dts/{taskId}/connectivitytest',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取云实例列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceType - 实例类型\n      * @param {string} [opts.instanceRegion] - 实例地域  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cloudInstanceSpec instances  实例信息\n      */\n\n  listCloudInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listCloudInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceType === undefined || opts.instanceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceType' when calling listCloudInstances\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceRegion !== undefined && opts.instanceRegion !== null) {\n      queryParams['instanceRegion'] = opts.instanceRegion\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceType: opts.instanceType\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listCloudInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cloudinstance/{instanceType}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取云实例详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceType - 实例类型\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} [opts.instanceRegion] - 实例地域  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cloudInstanceSpec instance  实例信息\n      */\n\n  getCloudInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getCloudInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceType === undefined || opts.instanceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceType' when calling getCloudInstance\"\n      )\n    }\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling getCloudInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceRegion !== undefined && opts.instanceRegion !== null) {\n      queryParams['instanceRegion'] = opts.instanceRegion\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceType: opts.instanceType,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getCloudInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cloudinstance/{instanceType}/id/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取Schema列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.endpointId - DTS连接模板ID\n      * @param {} [opts.taskId] - 订阅任务ID，配置订阅任务时，此项必填。  optional\n      * @param {} [opts.databaseName] - 数据库名称，此项选填。  optional\n      * @param {} opts.endpoint - 实例信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param schema schemas\n      */\n\n  listSchemas (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listSchemas\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.endpointId === undefined || opts.endpointId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endpointId' when calling listSchemas\"\n      )\n    }\n    if (opts.endpoint === undefined || opts.endpoint === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endpoint' when calling listSchemas\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n    if (opts.databaseName !== undefined && opts.databaseName !== null) {\n      postBody['databaseName'] = opts.databaseName\n    }\n    if (opts.endpoint !== undefined && opts.endpoint !== null) {\n      postBody['endpoint'] = opts.endpoint\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      endpointId: opts.endpointId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSchemas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/endpoint/{endpointId}/schema',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取Table列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.endpointId - DTS连接模板ID\n      * @param {} [opts.taskId] - 数据传输任务ID  optional\n      * @param {} [opts.databaseName] - 数据库名称，此项选填。  optional\n      * @param {} [opts.schemaName] - 模式名称，此项选填。  optional\n      * @param {} opts.endpoint - 连接模板信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param table tables\n      */\n\n  listTables (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listTables\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.endpointId === undefined || opts.endpointId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endpointId' when calling listTables\"\n      )\n    }\n    if (opts.endpoint === undefined || opts.endpoint === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endpoint' when calling listTables\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n    if (opts.databaseName !== undefined && opts.databaseName !== null) {\n      postBody['databaseName'] = opts.databaseName\n    }\n    if (opts.schemaName !== undefined && opts.schemaName !== null) {\n      postBody['schemaName'] = opts.schemaName\n    }\n    if (opts.endpoint !== undefined && opts.endpoint !== null) {\n      postBody['endpoint'] = opts.endpoint\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      endpointId: opts.endpointId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listTables with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/endpoint/{endpointId}/table',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取Topic列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.endpointId - DTS连接模板ID\n      * @param {} [opts.taskId] - 数据传输任务ID  optional\n      * @param {} opts.endpoint - 连接模板信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param topic tables\n      */\n\n  listTopics (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listTopics\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.endpointId === undefined || opts.endpointId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endpointId' when calling listTopics\"\n      )\n    }\n    if (opts.endpoint === undefined || opts.endpoint === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endpoint' when calling listTopics\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n    if (opts.endpoint !== undefined && opts.endpoint !== null) {\n      postBody['endpoint'] = opts.endpoint\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      endpointId: opts.endpointId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listTopics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/endpoint/{endpointId}/topic',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取Table详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.endpointId - DTS连接模板ID\n      * @param {string} opts.tableName - table名称\n      * @param {} [opts.taskId] - 数据传输任务ID  optional\n      * @param {} [opts.databaseName] - 数据库名称，此项选填。  optional\n      * @param {} [opts.schemaName] - 模式名称，此项选填。  optional\n      * @param {} [opts.tableName] - 表名称，此项必填。  optional\n      * @param {} opts.endpoint - 连接模板信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param table table\n      */\n\n  getTable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.endpointId === undefined || opts.endpointId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endpointId' when calling getTable\"\n      )\n    }\n    if (opts.tableName === undefined || opts.tableName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tableName' when calling getTable\"\n      )\n    }\n    if (opts.endpoint === undefined || opts.endpoint === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endpoint' when calling getTable\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n    if (opts.databaseName !== undefined && opts.databaseName !== null) {\n      postBody['databaseName'] = opts.databaseName\n    }\n    if (opts.schemaName !== undefined && opts.schemaName !== null) {\n      postBody['schemaName'] = opts.schemaName\n    }\n    if (opts.tableName !== undefined && opts.tableName !== null) {\n      postBody['tableName'] = opts.tableName\n    }\n    if (opts.endpoint !== undefined && opts.endpoint !== null) {\n      postBody['endpoint'] = opts.endpoint\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      endpointId: opts.endpointId,\n      tableName: opts.tableName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/endpoint/{endpointId}/table/{tableName}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  实例规格列表。\n      * @param {Object} opts - parameters\n      * @param {string} [opts.transmissionMethod] - 传输任务类型：Migration（迁移）、Sync（同步）、Subscribe（订阅）、DisasterRecovery（灾备）  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceClass instanceClass\n      */\n\n  listInstanceClasses (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listInstanceClasses\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (\n      opts.transmissionMethod !== undefined &&\n      opts.transmissionMethod !== null\n    ) {\n      queryParams['transmissionMethod'] = opts.transmissionMethod\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listInstanceClasses with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceclass',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  任务传输进度列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1，取值范围：-1，[1,∞)；-1时返回全部页码。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[1, 100]  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {sort} [opts.sorts] - createTime - 创建时间,asc（正序），desc（倒序）\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param taskProgress progress\n      * @param integer totalCount  总记录数\n      */\n\n  listTaskProgress (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listTaskProgress\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listTaskProgress with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/taskprogress',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  任务传输进度详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - DTS数据传输任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param taskProgress progress\n      */\n\n  getTaskProgress (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTaskProgress\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling getTaskProgress\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTaskProgress with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/taskprogress/{taskId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取Process\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 获取Process列表的资源ID\n      * @param {string} [opts.resourceType] - 获取Process列表的资源类型  optional\n      * @param {integer} [opts.pageNumber] - 页码；默认为1，取值范围：-1，[1,∞)；-1时返回全部页码。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[1, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param process process\n      * @param integer totalCount  总记录数\n      */\n\n  listProcesses (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listProcesses\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling listProcesses\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      queryParams['id'] = opts.id\n    }\n    if (opts.resourceType !== undefined && opts.resourceType !== null) {\n      queryParams['resourceType'] = opts.resourceType\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  dts/2.2.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listProcesses with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/process',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = DTS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/edcps/v1/edcps.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Distributed-Cloud-Physical-Server\n * 分布式云物理服务器私有网络操作相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'edcps'\nService._services[serviceId] = true\n\n/**\n * edcps service.\n * @version 1.3.0\n */\n\nclass EDCPS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'edcps.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询别名IP列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.subnetId] - 子网ID  optional\n      * @param {string} [opts.instanceId] - 实例ID  optional\n      * @param {string} [opts.cidr] - CIDR段，模糊搜索  optional\n      * @param {filter} [opts.filters] - aliasIpId - 别名IP id&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param aliasIp aliasIps\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeAliasIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAliasIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      queryParams['subnetId'] = opts.subnetId\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.cidr !== undefined && opts.cidr !== null) {\n      queryParams['cidr'] = opts.cidr\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAliasIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/aliasIps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加别名IP\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {aliasIpSpec} opts.aliasIpSpec - 别名IP配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param aliasIpSuccessInfo successList\n      * @param aliasIpErrorInfo errorList\n      */\n\n  createAliasIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAliasIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.aliasIpSpec === undefined || opts.aliasIpSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aliasIpSpec' when calling createAliasIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.aliasIpSpec !== undefined && opts.aliasIpSpec !== null) {\n      postBody['aliasIpSpec'] = opts.aliasIpSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAliasIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/aliasIps',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除别名IP\n      * @param {Object} opts - parameters\n      * @param {string} opts.aliasIpId - 别名IP ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteAliasIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAliasIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.aliasIpId === undefined || opts.aliasIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aliasIpId' when calling deleteAliasIp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      queryParams['clientToken'] = opts.clientToken\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      aliasIpId: opts.aliasIpId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAliasIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/aliasIps/{aliasIpId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询弹性公网IP列表&lt;br/&gt;\n支持分页查询，默认每页20条&lt;br/&gt;\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.name] - 共享带宽名称  optional\n      * @param {filter} [opts.filters] - bandwidthPackageId - 共享带宽ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bandwidthPackage bandwidthPackages\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeBandwidthPackages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBandwidthPackages\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBandwidthPackages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  申请共享带宽\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {bandwidthPackageSpec} opts.bandwidthPackageSpec - 共享带宽配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string bandwidthPackageIds\n      */\n\n  applyBandwidthPackages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  applyBandwidthPackages\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.bandwidthPackageSpec === undefined ||\n      opts.bandwidthPackageSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthPackageSpec' when calling applyBandwidthPackages\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (\n      opts.bandwidthPackageSpec !== undefined &&\n      opts.bandwidthPackageSpec !== null\n    ) {\n      postBody['bandwidthPackageSpec'] = opts.bandwidthPackageSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call applyBandwidthPackages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询共享带宽详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.bandwidthPackageId - 共享带宽ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bandwidthPackage bandwidthPackage  共享带宽详细信息\n      */\n\n  describeBandwidthPackage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBandwidthPackage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.bandwidthPackageId === undefined ||\n      opts.bandwidthPackageId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthPackageId' when calling describeBandwidthPackage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bandwidthPackageId: opts.bandwidthPackageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBandwidthPackage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/{bandwidthPackageId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改共享带宽\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bandwidthPackageId - 共享带宽ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} [opts.name] - 名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bandwidthPackage bandwidthPackage  共享带宽详细信息\n      */\n\n  modifyBandwidthPackage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBandwidthPackage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.bandwidthPackageId === undefined ||\n      opts.bandwidthPackageId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthPackageId' when calling modifyBandwidthPackage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bandwidthPackageId: opts.bandwidthPackageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBandwidthPackage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/{bandwidthPackageId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除共享带宽\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bandwidthPackageId - 共享带宽ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteBandwidthPackage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBandwidthPackage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.bandwidthPackageId === undefined ||\n      opts.bandwidthPackageId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthPackageId' when calling deleteBandwidthPackage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      queryParams['clientToken'] = opts.clientToken\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      bandwidthPackageId: opts.bandwidthPackageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBandwidthPackage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/{bandwidthPackageId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改共享带宽的带宽\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bandwidthPackageId - 共享带宽ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {integer} opts.bandwidth - 带宽，单位Mbps，取值范围[1,10240]\n      * @param {integer} [opts.extraUplinkBandwidth] - 额外上行带宽，单位Mbps，取值范围[0,10240]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  修改带宽是否成功\n      */\n\n  modifyBandwidthPackageBandwidth (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBandwidthPackageBandwidth\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.bandwidthPackageId === undefined ||\n      opts.bandwidthPackageId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthPackageId' when calling modifyBandwidthPackageBandwidth\"\n      )\n    }\n    if (opts.bandwidth === undefined || opts.bandwidth === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidth' when calling modifyBandwidthPackageBandwidth\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.bandwidth !== undefined && opts.bandwidth !== null) {\n      postBody['bandwidth'] = opts.bandwidth\n    }\n    if (\n      opts.extraUplinkBandwidth !== undefined &&\n      opts.extraUplinkBandwidth !== null\n    ) {\n      postBody['extraUplinkBandwidth'] = opts.extraUplinkBandwidth\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bandwidthPackageId: opts.bandwidthPackageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBandwidthPackageBandwidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/{bandwidthPackageId}:modifyBandwidthPackageBandwidth',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加共享带宽IP\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bandwidthPackageId - 共享带宽ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {array} [opts.elasticIpIds] - 弹性公网IP ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  添加结果\n      */\n\n  addBandwidthPackageIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addBandwidthPackageIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.bandwidthPackageId === undefined ||\n      opts.bandwidthPackageId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthPackageId' when calling addBandwidthPackageIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.elasticIpIds !== undefined && opts.elasticIpIds !== null) {\n      postBody['elasticIpIds'] = opts.elasticIpIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bandwidthPackageId: opts.bandwidthPackageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addBandwidthPackageIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/{bandwidthPackageId}:addBandwidthPackageIp',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  移除共享带宽IP\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bandwidthPackageId - 共享带宽ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.elasticIpId - 弹性公网IP Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  解绑结果\n      */\n\n  removeBandwidthPackageIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  removeBandwidthPackageIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.bandwidthPackageId === undefined ||\n      opts.bandwidthPackageId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthPackageId' when calling removeBandwidthPackageIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling removeBandwidthPackageIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bandwidthPackageId: opts.bandwidthPackageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeBandwidthPackageIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/{bandwidthPackageId}:removeBandwidthPackageIp',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询共享带宽库存\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string region  地域\n      * @param integer availableBandwidth  可用带宽库存\n      * @param integer availableExtraUplinkBandwidth  可用额外上行带宽库存\n      */\n\n  describeBandwidthPackageStock (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBandwidthPackageStock\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBandwidthPackageStock with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackageStock',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询弹性公网IP列表&lt;br/&gt;\n支持分页查询，默认每页20条&lt;br/&gt;\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.status] - 弹性公网IP状态，取值范围：associate、disassociate  optional\n      * @param {string} [opts.hasJoinBandwidthPackage] - 弹性公网IP是否加入共享带宽，取值范围：yes、no  optional\n      * @param {string} [opts.chargeMode] - 支付模式，取值为：prepaid_by_duration表示预付费，postpaid_by_duration表示按配置后付费  optional\n      * @param {string} [opts.instanceId] - 实例Id  optional\n      * @param {string} [opts.subnetId] - 子网Id  optional\n      * @param {filter} [opts.filters] - elasticIpId - 弹性公网IPID，精确匹配，支持多个&lt;br/&gt;\nelasticIp - 弹性公网IP，精确匹配，支持多个&lt;br/&gt;\nbandwidthPackageId - 共享带宽ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param elasticIp elasticIps\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeElasticIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeElasticIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (\n      opts.hasJoinBandwidthPackage !== undefined &&\n      opts.hasJoinBandwidthPackage !== null\n    ) {\n      queryParams['hasJoinBandwidthPackage'] = opts.hasJoinBandwidthPackage\n    }\n    if (opts.chargeMode !== undefined && opts.chargeMode !== null) {\n      queryParams['chargeMode'] = opts.chargeMode\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      queryParams['subnetId'] = opts.subnetId\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeElasticIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  申请弹性公网IP\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {elasticIpSpec} opts.elasticIpSpec - 弹性公网IP配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string elasticIpIds\n      */\n\n  applyElasticIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  applyElasticIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.elasticIpSpec === undefined || opts.elasticIpSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpSpec' when calling applyElasticIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.elasticIpSpec !== undefined && opts.elasticIpSpec !== null) {\n      postBody['elasticIpSpec'] = opts.elasticIpSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call applyElasticIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询弹性公网IP详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.elasticIpId - 弹性公网IPID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param elasticIp elasticIp  弹性公网IP详细信息\n      */\n\n  describeElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling describeElasticIp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      elasticIpId: opts.elasticIpId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps/{elasticIpId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除弹性公网IP\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.elasticIpId - 弹性公网IPID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteelasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteelasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling deleteelasticIp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      queryParams['clientToken'] = opts.clientToken\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      elasticIpId: opts.elasticIpId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteelasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps/{elasticIpId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改弹性公网IP带宽\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.elasticIpId - 弹性公网IPID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {integer} opts.bandwidth - 带宽，单位Mbps，取值范围[1,10240]\n      * @param {integer} [opts.extraUplinkBandwidth] - 额外上行带宽，单位Mbps，取值范围[0,10240]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  修改带宽是否成功\n      */\n\n  modifyElasticIpBandwidth (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyElasticIpBandwidth\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling modifyElasticIpBandwidth\"\n      )\n    }\n    if (opts.bandwidth === undefined || opts.bandwidth === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidth' when calling modifyElasticIpBandwidth\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.bandwidth !== undefined && opts.bandwidth !== null) {\n      postBody['bandwidth'] = opts.bandwidth\n    }\n    if (\n      opts.extraUplinkBandwidth !== undefined &&\n      opts.extraUplinkBandwidth !== null\n    ) {\n      postBody['extraUplinkBandwidth'] = opts.extraUplinkBandwidth\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      elasticIpId: opts.elasticIpId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyElasticIpBandwidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps/{elasticIpId}:modifyElasticIpBandwidth',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询弹性公网IP库存\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string region  地域\n      * @param integer available  可用弹性公网IP库存\n      * @param integer availableBandwidth  可用带宽库存\n      * @param integer availableExtraUplinkBandwidth  可用额外上行带宽库存\n      */\n\n  describeElasticIpStock (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeElasticIpStock\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeElasticIpStock with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIpStock',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询分布式云物理服务器实例类型\n      * @param {Object} opts - parameters\n      * @param {string} [opts.az] - 可用区，精确匹配  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deviceType deviceTypes\n      */\n\n  describeDeviceTypes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeviceTypes\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.az !== undefined && opts.az !== null) {\n      queryParams['az'] = opts.az\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeviceTypes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/deviceTypes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询分布式云物理服务器支持的操作系统\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceType - 实例类型，可调用接口（describeDeviceTypes）获取指定地域的实例类型，例如：edcps.c.normal1\n      * @param {string} [opts.osType] - 操作系统类型，取值范围：CentOS、Ubuntu  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param os oss\n      */\n\n  describeOS (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeOS\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.deviceType === undefined || opts.deviceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceType' when calling describeOS\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceType !== undefined && opts.deviceType !== null) {\n      queryParams['deviceType'] = opts.deviceType\n    }\n    if (opts.osType !== undefined && opts.osType !== null) {\n      queryParams['osType'] = opts.osType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeOS with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/os',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询某种实例类型的分布式云物理服务器支持的RAID类型，可查询系统盘RAID类型和数据盘RAID类型\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceType - 实例类型，可调用（describeDeviceTypes）接口获取指定地域的实例类型，例如：edcps.c.normal1\n      * @param {string} [opts.volumeType] - 磁盘类型，取值范围：system、data  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param raid raids\n      */\n\n  describeDeviceRaids (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeviceRaids\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.deviceType === undefined || opts.deviceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceType' when calling describeDeviceRaids\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceType !== undefined && opts.deviceType !== null) {\n      queryParams['deviceType'] = opts.deviceType\n    }\n    if (opts.volumeType !== undefined && opts.volumeType !== null) {\n      queryParams['volumeType'] = opts.volumeType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeviceRaids with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/raids',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询分布式云物理服务器库存\n      * @param {Object} opts - parameters\n      * @param {string} [opts.deviceType] - 实例类型，调用接口（describeDeviceTypes）获取实例类型  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceStock devicesStock\n      */\n\n  describeDeviceStock (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeviceStock\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceType !== undefined && opts.deviceType !== null) {\n      queryParams['deviceType'] = opts.deviceType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeviceStock with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/deviceStock',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单台分布式云物理服务器详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instance\n      */\n\n  describeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除单台云物理物理服务器，只能删除运行running、停止stopped、错误error状态的服务器&lt;br/&gt;\n不能删除没有计费信息的服务器&lt;br/&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      queryParams['clientToken'] = opts.clientToken\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询分布式云物理服务器详细信息&lt;br/&gt;\n支持分页查询，默认每页20条&lt;br/&gt;\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.az] - 可用区，精确匹配  optional\n      * @param {string} [opts.name] - 分布式云物理服务器名称，支持模糊匹配  optional\n      * @param {string} [opts.networkType] - 网络类型，精确匹配，支持vpc  optional\n      * @param {string} [opts.deviceType] - 实例类型，精确匹配，调用接口（describeDeviceTypes）获取实例类型  optional\n      * @param {string} [opts.subnetId] - 子网ID  optional\n      * @param {string} [opts.enableInternet] - 是否启用外网, yes/no  optional\n      * @param {string} [opts.privateIp] - 主网口内网ip  optional\n      * @param {string} [opts.extensionPrivateIp] - 辅网口内网ip  optional\n      * @param {string} [opts.keypairId] - 密钥对id  optional\n      * @param {string} [opts.interfaceMode] - 网口模式 单网口:bond,双网口:dual  optional\n      * @param {filter} [opts.filters] - instanceId - 分布式云物理服务器ID，精确匹配，支持多个&lt;br/&gt;\nstatus - 分布式云物理服务器状态，参考分布式云物理服务器状态，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instances\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.az !== undefined && opts.az !== null) {\n      queryParams['az'] = opts.az\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.networkType !== undefined && opts.networkType !== null) {\n      queryParams['networkType'] = opts.networkType\n    }\n    if (opts.deviceType !== undefined && opts.deviceType !== null) {\n      queryParams['deviceType'] = opts.deviceType\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      queryParams['subnetId'] = opts.subnetId\n    }\n    if (opts.enableInternet !== undefined && opts.enableInternet !== null) {\n      queryParams['enableInternet'] = opts.enableInternet\n    }\n    if (opts.privateIp !== undefined && opts.privateIp !== null) {\n      queryParams['privateIp'] = opts.privateIp\n    }\n    if (\n      opts.extensionPrivateIp !== undefined &&\n      opts.extensionPrivateIp !== null\n    ) {\n      queryParams['extensionPrivateIp'] = opts.extensionPrivateIp\n    }\n    if (opts.keypairId !== undefined && opts.keypairId !== null) {\n      queryParams['keypairId'] = opts.keypairId\n    }\n    if (opts.interfaceMode !== undefined && opts.interfaceMode !== null) {\n      queryParams['interfaceMode'] = opts.interfaceMode\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一台或多台指定配置的分布式云物理服务器&lt;br/&gt;\n- 地域与可用区&lt;br/&gt;\n  - 调用接口（queryEdCPSRegions）获取分布式云物理服务器支持的地域与可用区&lt;br/&gt;\n- 实例类型&lt;br/&gt;\n  - 调用接口（describeDeviceTypes）获取物理实例类型列表&lt;br/&gt;\n  - 不能使用已下线、或已售馨的实例类型&lt;br/&gt;\n- 操作系统&lt;br/&gt;\n  - 可调用接口（describeOS）获取分布式云物理服务器支持的操作系统列表&lt;br/&gt;\n- 存储&lt;br/&gt;\n  - 数据盘多种RAID可选，可调用接口（describeDeviceRaids）获取服务器支持的RAID列表&lt;br/&gt;\n- 网络&lt;br/&gt;\n  - 网络类型目前支持vpc&lt;br/&gt;\n  - 线路目前支持联通un、电信ct、移动cm&lt;br/&gt;\n  - 支持不启用外网，如果启用外网，带宽范围[1,200] 单位Mbps&lt;br/&gt;\n- 其他&lt;br/&gt;\n  - 购买时长，可按年或月购买：月取值范围[1,9], 年取值范围[1,3]&lt;br/&gt;\n  - 密码设置参考公共参数规范&lt;br/&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {instanceSpec} opts.instanceSpec - 描述分布式云物理服务器配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceIds\n      */\n\n  createInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstances\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询分布式云物理服务器名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string name  分布式云物理服务器名称\n      */\n\n  describeInstanceName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceName\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeInstanceName',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改分布式云物理服务器部分信息，包括名称、描述\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} [opts.name] - 分布式云物理服务器名称  optional\n      * @param {string} [opts.description] - 分布式云物理服务器描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string name  分布式云物理服务器名称\n      * @param string description  分布式云物理服务器描述\n      */\n\n  modifyInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个分布式云物理服务器已安装的RAID信息，包括系统盘RAID信息和数据盘RAID信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string sysRaidTypeId  系统盘RAID类型ID\n      * @param string sysRaidType  系统盘RAID类型\n      * @param string dataRaidTypeId  数据盘RAID类型ID\n      * @param string dataRaidType  数据盘RAID类型\n      */\n\n  describeInstanceRaid (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceRaid\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceRaid\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceRaid with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeInstanceRaid',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个分布式云物理服务器硬件监控信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean cpus  CPU状态是否正常\n      * @param boolean mems  内存状态是否正常\n      * @param boolean disks  硬盘状态是否正常\n      * @param boolean nics  网卡状态是否正常\n      */\n\n  describeInstanceStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeInstanceStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重启单台分布式云物理服务器，只能重启running状态的服务器 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  重启操作是否成功\n      */\n\n  restartInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restartInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling restartInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restartInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:restartInstance',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对单台分布式云物理服务器执行关机操作，只能停止running状态的服务器 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  关机操作是否成功\n      */\n\n  stopInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling stopInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:stopInstance',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对单台分布式云物理服务器执行开机操作，只能启动stopped状态的服务器\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  开机操作是否成功\n      */\n\n  startInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling startInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:startInstance',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重装分布式云物理服务器，只能重装stopped状态的服务器&lt;br/&gt;\n- 可调用接口（describeOS）获取分布式云物理服务器支持的操作系统列表\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {reinstallInstanceSpec} opts.instanceSpec - 分布式云物理服务器配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  重装操作是否成功\n      */\n\n  reinstallInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  reinstallInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling reinstallInstance\"\n      )\n    }\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling reinstallInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call reinstallInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:reinstallInstance',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  绑定弹性公网IP\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.elasticIpId - 弹性公网IPID\n      * @param {string} [opts.targetIp] - 私有IP  optional\n      * @param {string} [opts.subnetId] - 主网口或辅网口的子网ID，多网口实例必填  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  绑定结果\n      */\n\n  associateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling associateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling associateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n    if (opts.targetIp !== undefined && opts.targetIp !== null) {\n      postBody['targetIp'] = opts.targetIp\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:associateElasticIp',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  解绑弹性公网IP\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.elasticIpId - 弹性公网IPId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  解绑结果\n      */\n\n  disassociateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disassociateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling disassociateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:disassociateElasticIp',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重置分布式云物理服务器密码\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.password - 密码\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  重置结果\n      */\n\n  resetPassword (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resetPassword\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling resetPassword\"\n      )\n    }\n    if (opts.password === undefined || opts.password === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.password' when calling resetPassword\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.password !== undefined && opts.password !== null) {\n      postBody['password'] = opts.password\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resetPassword with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:resetPassword',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可用的私有IP列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 分布式云物理服务器ID\n      * @param {string} opts.subnetId - 主网口或者辅网口的子网id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string availablePrivateIps\n      */\n\n  describeAvailablePrivateIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAvailablePrivateIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAvailablePrivateIp\"\n      )\n    }\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling describeAvailablePrivateIp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      queryParams['subnetId'] = opts.subnetId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAvailablePrivateIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/availablePrivateIps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询密钥对列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.name] - 密钥对名称  optional\n      * @param {filter} [opts.filters] - keypairId  - 密钥对ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param keypair keypairs\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeKeypairs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeKeypairs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeKeypairs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建密钥对\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.name - 密钥对名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string keypairId  密钥对id\n      * @param string region  地域\n      * @param string name  密钥对名称\n      * @param string publicKey  公钥\n      * @param string fingerPrint  指纹\n      * @param string createTime  创建时间\n      * @param string updateTime  更新时间\n      * @param string privateKey  私钥\n      */\n\n  createKeypairs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createKeypairs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createKeypairs\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createKeypairs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  导入密钥对\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.name - 密钥对名称\n      * @param {string} opts.publicKey - 公钥\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string keypairId  密钥对id\n      * @param string region  地域\n      * @param string name  密钥对名称\n      * @param string publicKey  公钥\n      * @param string fingerPrint  指纹\n      * @param string createTime  创建时间\n      * @param string updateTime  更新时间\n      */\n\n  importKeypairs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  importKeypairs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling importKeypairs\"\n      )\n    }\n    if (opts.publicKey === undefined || opts.publicKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publicKey' when calling importKeypairs\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.publicKey !== undefined && opts.publicKey !== null) {\n      postBody['publicKey'] = opts.publicKey\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call importKeypairs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs:import',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询密钥对详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.keypairId - 密钥对ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param keypair keypair  密钥对详细信息\n      */\n\n  describeKeypair (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeKeypair\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keypairId === undefined || opts.keypairId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keypairId' when calling describeKeypair\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      keypairId: opts.keypairId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeKeypair with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs/{keypairId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除密钥对\n      * @param {Object} opts - parameters\n      * @param {string} opts.keypairId - 密钥对ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteKeypairs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteKeypairs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keypairId === undefined || opts.keypairId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keypairId' when calling deleteKeypairs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      keypairId: opts.keypairId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteKeypairs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs/{keypairId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询链路类型\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param lineType lineType  链路类型信息\n      */\n\n  describeLineTypes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeLineTypes\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLineTypes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/lineTypes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询分布式分布式云物理服务器地域列表\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param region regions\n      */\n\n  describeEdCPSRegions (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeEdCPSRegions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/edgeRegions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询次要CIDR列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - 子网ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param secondaryCidr secondaryCidrs\n      */\n\n  describeSecondaryCidrs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSecondaryCidrs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling describeSecondaryCidrs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      queryParams['subnetId'] = opts.subnetId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecondaryCidrs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secondaryCidrs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加次要CIDR\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {secondaryCidrSpec} opts.secondaryCidrSpec - 次要cidr配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string secondaryCidrId  次要cidr的ID\n      */\n\n  createSecondaryCidr (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSecondaryCidr\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.secondaryCidrSpec === undefined ||\n      opts.secondaryCidrSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secondaryCidrSpec' when calling createSecondaryCidr\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (\n      opts.secondaryCidrSpec !== undefined &&\n      opts.secondaryCidrSpec !== null\n    ) {\n      postBody['secondaryCidrSpec'] = opts.secondaryCidrSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSecondaryCidr with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secondaryCidrs',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除次要CIDR\n      * @param {Object} opts - parameters\n      * @param {string} opts.secondaryCidrId - 次要CIDR ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteSecondaryCidr (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSecondaryCidr\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.secondaryCidrId === undefined || opts.secondaryCidrId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secondaryCidrId' when calling deleteSecondaryCidr\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      queryParams['clientToken'] = opts.clientToken\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      secondaryCidrId: opts.secondaryCidrId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSecondaryCidr with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secondaryCidrs/{secondaryCidrId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子网列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.az] - 可用区，精确匹配  optional\n      * @param {string} [opts.name] - 子网名称  optional\n      * @param {string} [opts.vpcId] - 私有网络ID，精确匹配  optional\n      * @param {filter} [opts.filters] - subnetId - 子网ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subnet subnets\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeSubnets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSubnets\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.az !== undefined && opts.az !== null) {\n      queryParams['az'] = opts.az\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      queryParams['vpcId'] = opts.vpcId\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubnets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建子网\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {subnetSpec} opts.subnetSpec - 子网配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string subnetId  子网ID\n      */\n\n  createSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetSpec === undefined || opts.subnetSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetSpec' when calling createSubnet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.subnetSpec !== undefined && opts.subnetSpec !== null) {\n      postBody['subnetSpec'] = opts.subnetSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子网详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - 子网ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subnet subnet  子网详细信息\n      */\n\n  describeSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling describeSubnet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subnetId: opts.subnetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets/{subnetId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改子网\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - 子网ID\n      * @param {string} [opts.name] - 名称  optional\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subnet subnet  子网详细信息\n      */\n\n  modifySubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifySubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling modifySubnet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subnetId: opts.subnetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifySubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets/{subnetId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除子网\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - 子网ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling deleteSubnet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      queryParams['clientToken'] = opts.clientToken\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      subnetId: opts.subnetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets/{subnetId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询私有网络详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - 私有网络ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpc vpc  私有网络详细信息\n      */\n\n  describeVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling describeVpc\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcId: opts.vpcId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs/{vpcId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改私有网络\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - 私有网络ID\n      * @param {string} [opts.name] - 名称  optional\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpc vpc  私有网络详细信息\n      */\n\n  modifyVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling modifyVpc\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcId: opts.vpcId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs/{vpcId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除私有网络\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - 私有网络ID\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling deleteVpc\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      queryParams['clientToken'] = opts.clientToken\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      vpcId: opts.vpcId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs/{vpcId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询私有网络列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.name] - 私有网络名称  optional\n      * @param {filter} [opts.filters] - vpcId - 私有网络ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpc vpcs\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeVpcs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVpcs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVpcs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建私有网络\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {vpcSpec} opts.vpcSpec - 子网配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string vpcId  私有网络ID\n      */\n\n  createVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcSpec === undefined || opts.vpcSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcSpec' when calling createVpc\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.vpcSpec !== undefined && opts.vpcSpec !== null) {\n      postBody['vpcSpec'] = opts.vpcSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  edcps/1.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = EDCPS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/eid/v1/eid.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 页面测试检测接口\n * 京东云信用评分-OpenAPI页面测试检测接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'eid'\nService._services[serviceId] = true\n\n/**\n * eid service.\n * @version 1.0.0\n */\n\nclass EID extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'bio-web.jdcloud.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  获取设备评分\n      * @param {Object} opts - parameters\n      * @param {} [opts.tasks] - 检测任务列表，包含一个或多个元素。每个元素是个结构体，最多可添加100元素，即最多对100个设备数据进行评分。每个元素的具体结构描述见creditTask。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param eidScoreResult data\n      */\n\n  eidScore (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.tasks !== undefined && opts.tasks !== null) {\n      postBody['tasks'] = opts.tasks\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  eid/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call eidScore with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/eidScore:check',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  策略下发\n      * @param {Object} opts - parameters\n      * @param {string} [opts.data]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  vttok (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.data !== undefined && opts.data !== null) {\n      postBody['data'] = opts.data\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  eid/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call vttok with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/sdk:vttok',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设备信息上报\n      * @param {Object} opts - parameters\n      * @param {string} [opts.data]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  device (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.data !== undefined && opts.data !== null) {\n      postBody['data'] = opts.data\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  eid/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call device with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/sdk:device',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = EID\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/elite/v1/elite.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * elite云存服务相关接口\n * elite云存服务相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'elite'\nService._services[serviceId] = true\n\n/**\n * elite service.\n * @version 1.0.8\n */\n\nJDCloud.ELITE = class ELITE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'elite.cn-south-1.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询交付信息接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.orderNumber - 订单号\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  true为成功，false为失败\n      * @param string message  描述信息\n      * @param queryDeliveryInfoResultVo data  查询数据结果\n      */\n\n  jdxQueryDeliveryInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  jdxQueryDeliveryInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.orderNumber === undefined || opts.orderNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.orderNumber' when calling jdxQueryDeliveryInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.orderNumber !== undefined && opts.orderNumber !== null) {\n      queryParams['orderNumber'] = opts.orderNumber\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  elite/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call jdxQueryDeliveryInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jdxQueryDeliveryInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上报订单\n      * @param {Object} opts - parameters\n      * @param {reportOrderInfo} opts.reportOrderInfo - 上报订单信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  true为成功，false为失败\n      * @param string message  描述信息\n      */\n\n  jdxReportOrder (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  jdxReportOrder\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.reportOrderInfo === undefined || opts.reportOrderInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.reportOrderInfo' when calling jdxReportOrder\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.reportOrderInfo !== undefined && opts.reportOrderInfo !== null) {\n      postBody['reportOrderInfo'] = opts.reportOrderInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  elite/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call jdxReportOrder with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jdxReportOrder',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  下单接口\n      * @param {Object} opts - parameters\n      * @param {createOrderInfo} opts.createOrderInfo - 下单信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  true为成功，false为失败\n      * @param string message  描述信息\n      * @param createOrderResultVo data  下单后生成的订单号\n      */\n\n  jdxCreateOrder (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  jdxCreateOrder\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.createOrderInfo === undefined || opts.createOrderInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createOrderInfo' when calling jdxCreateOrder\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.createOrderInfo !== undefined && opts.createOrderInfo !== null) {\n      postBody['createOrderInfo'] = opts.createOrderInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  elite/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call jdxCreateOrder with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jdxCreateOrder',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询价格\n      * @param {Object} opts - parameters\n      * @param {queryPriceParam} opts.queryPriceParam - 查询价格参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  true为成功，false为失败\n      * @param string message  描述信息\n      * @param queryPriceResultVo data  查询数据结果\n      */\n\n  jdxQueryPrice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  jdxQueryPrice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.queryPriceParam === undefined || opts.queryPriceParam === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryPriceParam' when calling jdxQueryPrice\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryPriceParam !== undefined && opts.queryPriceParam !== null) {\n      postBody['queryPriceParam'] = opts.queryPriceParam\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  elite/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call jdxQueryPrice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jdxQueryPrice',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  输出商品接口\n      * @param {Object} opts - parameters\n      * @param {integer} opts.pageNo - 页码（最小1）\n      * @param {integer} opts.pageSize - 每页记录数（最小10，最大100）\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  true为成功，false为失败\n      * @param string message  描述信息\n      * @param jdxProductVoListData data  查询数据结果\n      */\n\n  jdxQueryProduct (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  jdxQueryProduct\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pageNo === undefined || opts.pageNo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNo' when calling jdxQueryProduct\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling jdxQueryProduct\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNo !== undefined && opts.pageNo !== null) {\n      queryParams['pageNo'] = opts.pageNo\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  elite/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call jdxQueryProduct with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jdxQueryProduct',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  分页查询交付单信息\n      * @param {Object} opts - parameters\n      * @param {integer} opts.pageNo - 页码（最小1）\n      * @param {integer} opts.pageSize - 每页记录数（最小10，最大100）\n      * @param {string} [opts.deliverNumber] - 交付单号  optional\n      * @param {integer} [opts.deliverStatus] - 交付状态  optional\n      * @param {string} [opts.createDtStart] - 交付单创建起始时间，格式：yyyy-MM-dd HH:mm:ss  optional\n      * @param {string} [opts.createDtEnd] - 交付单创建结束时间，格式：yyyy-MM-dd HH:mm:ss  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  true为成功，false为失败\n      * @param string message  描述信息\n      * @param productServiceVoListData data  查询数据结果\n      */\n\n  listSaleService (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listSaleService\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pageNo === undefined || opts.pageNo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNo' when calling listSaleService\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling listSaleService\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNo !== undefined && opts.pageNo !== null) {\n      queryParams['pageNo'] = opts.pageNo\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.deliverNumber !== undefined && opts.deliverNumber !== null) {\n      queryParams['deliverNumber'] = opts.deliverNumber\n    }\n    if (opts.deliverStatus !== undefined && opts.deliverStatus !== null) {\n      queryParams['deliverStatus'] = opts.deliverStatus\n    }\n    if (opts.createDtStart !== undefined && opts.createDtStart !== null) {\n      queryParams['createDtStart'] = opts.createDtStart\n    }\n    if (opts.createDtEnd !== undefined && opts.createDtEnd !== null) {\n      queryParams['createDtEnd'] = opts.createDtEnd\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  elite/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSaleService with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/listSaleService',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据交付单号查询交付单信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.deliverNumber - 交付单号\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  true为成功，false为失败\n      * @param string message  描述信息\n      * @param productServiceVo data  查询数据结果\n      */\n\n  getSaleServiceByDeliverNumber (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getSaleServiceByDeliverNumber\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.deliverNumber === undefined || opts.deliverNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deliverNumber' when calling getSaleServiceByDeliverNumber\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deliverNumber !== undefined && opts.deliverNumber !== null) {\n      queryParams['deliverNumber'] = opts.deliverNumber\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  elite/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSaleServiceByDeliverNumber with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/getSaleServiceByDeliverNumber',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  确认交付\n      * @param {Object} opts - parameters\n      * @param {confirmDeliveryInfo} opts.confirmDeliveryInfo - 交付信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  true为成功，false为失败\n      * @param string message  描述信息\n      */\n\n  confirmSaleServiceDelivery (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  confirmSaleServiceDelivery\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.confirmDeliveryInfo === undefined ||\n      opts.confirmDeliveryInfo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.confirmDeliveryInfo' when calling confirmSaleServiceDelivery\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.confirmDeliveryInfo !== undefined &&\n      opts.confirmDeliveryInfo !== null\n    ) {\n      postBody['confirmDeliveryInfo'] = opts.confirmDeliveryInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  elite/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call confirmSaleServiceDelivery with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/confirmSaleServiceDelivery',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取云存服务信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.buyerPin - 购买用户pin\n      * @param {string} opts.businessData - 业务数据，与下单时的业务数据一致\n      * @param {boolean} [opts.queryAll] - 是否查询全部，如果传入false，则只查询当前时间有效的，否则查询所有的  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  true为成功，false为失败\n      * @param string message  描述信息\n      * @param storeServiceVo data  查询数据结果\n      */\n\n  getStoreService (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getStoreService\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.buyerPin === undefined || opts.buyerPin === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.buyerPin' when calling getStoreService\"\n      )\n    }\n    if (opts.businessData === undefined || opts.businessData === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.businessData' when calling getStoreService\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.buyerPin !== undefined && opts.buyerPin !== null) {\n      queryParams['buyerPin'] = opts.buyerPin\n    }\n    if (opts.businessData !== undefined && opts.businessData !== null) {\n      queryParams['businessData'] = opts.businessData\n    }\n    if (opts.queryAll !== undefined && opts.queryAll !== null) {\n      queryParams['queryAll'] = opts.queryAll\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  elite/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getStoreService with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/getStoreService',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.ELITE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/es/v1/es.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ES Snapshot API\n * es快照创建、查询，自动快照的设置、查询接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'es'\nService._services[serviceId] = true\n\n/**\n * es service.\n * @version 1.0.1\n */\n\nJDCloud.ES = class ES extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'es.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  关闭自定义字典。同时清除用户已上传的字典\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId  实例ID\n      */\n\n  disableDicts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableDicts\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableDicts\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  es/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableDicts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/dicts',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询es实例列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码，默认1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认10  optional\n      * @param {filter} [opts.filters] - 过滤条件：\ninstanceId -实例Id，精确匹配，支持多个\ninstanceVersion -实例版本，精确匹配，支持单个\nazId -azId，精确匹配，支持单个\ninstanceName - 实例名称，模糊匹配，支持单个\ninstanceStatus - 实例状态，精确匹配，支持多个(running：运行，error：错误，creating：创建中，changing：变配中，stop：已停止，processing：处理中)\nchargeMode - 计费类型，按配置postpaid_by_duration或者包年包月prepaid_by_duration\n  optional\n      * @param {tagFilter} [opts.tagFilters] - 标签过滤条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instances\n      * @param integer totalCount  es实例总数\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(\n      queryParams,\n      super.buildTagFilterParam(opts.tagFilters, 'tagFilters')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  es/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个指定配置的es实例\n      * @param {Object} opts - parameters\n      * @param {instanceSpec} opts.instance - es实例的相关配置\n      * @param {chargeSpec} [opts.charge] - 计费信息的相关配置，es只有prepaid_by_duration和postpaid_by_duration 2种计费模式  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string orderNum  订单编号\n      * @param string instanceId  es实例编号\n      */\n\n  createInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instance === undefined || opts.instance === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instance' when calling createInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instance !== undefined && opts.instance !== null) {\n      postBody['instance'] = opts.instance\n    }\n    if (opts.charge !== undefined && opts.charge !== null) {\n      postBody['charge'] = opts.charge\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  es/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询es实例的详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instance  es实例详细信息\n      */\n\n  describeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  es/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除按配置计费或包年包月已到期的es实例，包年包月未到期不可删除。\n状态为创建中和变配中的不可删除。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  es/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  变更es实例的配置，实例为running状态才可变更配置，每次只能变更一种且不可与原来的相同。\n实例配置（cpu核数、内存、磁盘容量、节点数量）目前只允许变大\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} [opts.nodeClass] - data节点规格  optional\n      * @param {integer} [opts.nodeDiskGB] - data节点磁盘  optional\n      * @param {integer} [opts.nodeCount] - data节点数  optional\n      * @param {string} [opts.masterClass] - master节点规格  optional\n      * @param {string} [opts.coordinatingClass] - coordinating节点规格  optional\n      * @param {integer} [opts.coordinatingCount] - coordinating节点数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string orderNum  订单编号\n      * @param string instanceId  es实例编号\n      */\n\n  modifyInstanceSpec (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceSpec\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceSpec\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.nodeClass !== undefined && opts.nodeClass !== null) {\n      postBody['nodeClass'] = opts.nodeClass\n    }\n    if (opts.nodeDiskGB !== undefined && opts.nodeDiskGB !== null) {\n      postBody['nodeDiskGB'] = opts.nodeDiskGB\n    }\n    if (opts.nodeCount !== undefined && opts.nodeCount !== null) {\n      postBody['nodeCount'] = opts.nodeCount\n    }\n    if (opts.masterClass !== undefined && opts.masterClass !== null) {\n      postBody['masterClass'] = opts.masterClass\n    }\n    if (\n      opts.coordinatingClass !== undefined &&\n      opts.coordinatingClass !== null\n    ) {\n      postBody['coordinatingClass'] = opts.coordinatingClass\n    }\n    if (\n      opts.coordinatingCount !== undefined &&\n      opts.coordinatingCount !== null\n    ) {\n      postBody['coordinatingCount'] = opts.coordinatingCount\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  es/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceSpec with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceSpec',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.ES\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/fc/v1/fc.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Trigger\n * Trigger 相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'fc'\nService._services[serviceId] = true\n\n/**\n * fc service.\n * @version 1.0.2\n */\n\nclass FC extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'fc.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  批量查询 function 的详细信息&lt;br&gt;\n此接口支持分页查询，默认每页20条。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - Service Name\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - name - 实例名称，模糊匹配，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param function functions\n      * @param number totalCount\n      */\n\n  describeFunctions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeFunctions\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling describeFunctions\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeFunctions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}/functions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建函数\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - Service Name\n      * @param {functionSpec} opts.functionSpec - 函数 创建参数\n      * @param {string} [opts.clientToken] - 保证请求幂等性的字符串；最大长度64个ASCII字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string functionName\n      */\n\n  createFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling createFunction\"\n      )\n    }\n    if (opts.functionSpec === undefined || opts.functionSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionSpec' when calling createFunction\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.functionSpec !== undefined && opts.functionSpec !== null) {\n      postBody['functionSpec'] = opts.functionSpec\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}/functions',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个 函数 的详细信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - Service Name\n      * @param {string} opts.functionName - Function Name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param function function\n      */\n\n  describeFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling describeFunction\"\n      )\n    }\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling describeFunction\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}/functions/{functionName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改 function\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - Service Name\n      * @param {string} opts.functionName - Function Name\n      * @param {code} [opts.code] - 修改后的代码  optional\n      * @param {integer} [opts.timeout] - 修改后的超时时间  optional\n      * @param {string} [opts.runtime] - 修改后的运行时语言  optional\n      * @param {string} [opts.handler] - 修改后的函数执行入口  optional\n      * @param {string} [opts.description] - 修改后的描述  optional\n      * @param {array} [opts.envs] - 修改后的环境变量  optional\n      * @param {number} [opts.cpu] - 修改后的cpu  optional\n      * @param {integer} [opts.memorySize] - 修改后的内存  optional\n      * @param {integer} [opts.diskSize] - 修改后的磁盘  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling updateFunction\"\n      )\n    }\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling updateFunction\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.code !== undefined && opts.code !== null) {\n      postBody['code'] = opts.code\n    }\n    if (opts.timeout !== undefined && opts.timeout !== null) {\n      postBody['timeout'] = opts.timeout\n    }\n    if (opts.runtime !== undefined && opts.runtime !== null) {\n      postBody['runtime'] = opts.runtime\n    }\n    if (opts.handler !== undefined && opts.handler !== null) {\n      postBody['handler'] = opts.handler\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.envs !== undefined && opts.envs !== null) {\n      postBody['envs'] = opts.envs\n    }\n    if (opts.cpu !== undefined && opts.cpu !== null) {\n      postBody['cpu'] = opts.cpu\n    }\n    if (opts.memorySize !== undefined && opts.memorySize !== null) {\n      postBody['memorySize'] = opts.memorySize\n    }\n    if (opts.diskSize !== undefined && opts.diskSize !== null) {\n      postBody['diskSize'] = opts.diskSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}/functions/{functionName}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除function\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - Service Name\n      * @param {string} opts.functionName - Function Name\n      * @param {boolean} [opts.deleteTrigger] - 触发器是否随函数删除  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling deleteFunction\"\n      )\n    }\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling deleteFunction\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deleteTrigger !== undefined && opts.deleteTrigger !== null) {\n      queryParams['deleteTrigger'] = opts.deleteTrigger\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}/functions/{functionName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个 function 的代码地址\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - Service Name\n      * @param {string} opts.functionName - Function Name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string checkSum  函数部署包的 SHA256 哈希\n      * @param string url  代码地址\n      */\n\n  describeFunctionCode (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeFunctionCode\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling describeFunctionCode\"\n      )\n    }\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling describeFunctionCode\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeFunctionCode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}/functions/{functionName}/code',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取所有的runtime\n\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string runtimes\n      * @param integer totalCount  总数量\n      */\n\n  describeRuntimes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRuntimes\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRuntimes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/runtimes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  触发函数执行\n\n可以添加header参数 &#x60;x-fc-invocation-type&#x60;指定调用方式。\n- Async 异步调用\n- Sync 同步调用（暂不支持）\n\n异步调用函数时，请求会立即返回 requestId。 &lt;br&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - Service Name\n      * @param {string} opts.functionName - Function Name\n      * @param {string} [opts.body] - 事件信息，以json格式表示，会在函数执行时作为参数传入，默认为{}  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  invokeFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  invokeFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling invokeFunction\"\n      )\n    }\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling invokeFunction\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.body !== undefined && opts.body !== null) {\n      postBody['body'] = opts.body\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call invokeFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}/functions/{functionName}/invocations',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询 instanceTypes 的详细信息&lt;br&gt;&#x60;\n此接口支持分页查询，默认每页20条。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - cpu - vCpu，支持多个\nmemorySize: - 内存，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceType instanceTypes\n      * @param number totalCount\n      */\n\n  describeInstanceTypes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceTypes\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceTypes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceTypes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询 service 的详细信息&lt;br&gt;\n此接口支持分页查询，默认每页20条。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - name - 服务名称，模糊匹配，支持单个\nserviceId - 服务 ID, 精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param service services\n      * @param number totalCount\n      */\n\n  describeServices (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeServices\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeServices with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建服务\n\n      * @param {Object} opts - parameters\n      * @param {serviceSpec} opts.serviceSpec - 服务 创建参数\n      * @param {string} [opts.clientToken] - 保证请求幂等性的字符串；最大长度64个ASCII字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string serviceName\n      */\n\n  createService (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createService\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceSpec === undefined || opts.serviceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceSpec' when calling createService\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.serviceSpec !== undefined && opts.serviceSpec !== null) {\n      postBody['serviceSpec'] = opts.serviceSpec\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createService with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个 service 的详细信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - Service Name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param service service\n      */\n\n  describeService (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeService\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling describeService\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeService with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改 service\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - Service Name\n      * @param {string} [opts.description] - 修改后的描述  optional\n      * @param {logConfig} [opts.logConfig] - 修改后的日志配置，不修改的话传空值，关闭日志集logTopicUid传空值。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateService (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateService\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling updateService\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.logConfig !== undefined && opts.logConfig !== null) {\n      postBody['logConfig'] = opts.logConfig\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateService with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除service\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - Service Name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteService (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteService\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling deleteService\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteService with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取函数下所有触发器的详细信息。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - 服务名称。\n      * @param {string} opts.functionName - 函数名称。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param trigger triggers\n      * @param integer totalCount\n      */\n\n  describeTriggers (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTriggers\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling describeTriggers\"\n      )\n    }\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling describeTriggers\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTriggers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}/functions/{functionName}/triggers',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建触发器。\n目前支持的触发器类型有：\n- oss\n\n## 注意事项\n- 一个函数下最多同时存在10个触发器。\n- oss类型触发器会在对应的bucket中添加一个事件通知，若该bucket中已存在相同事件类型的事件通知，触发器可能无法生效。\n- 创建多个相同类型的oss触发器，当对应的事件发生时，只有一个触发器会被调用。\n- 若人为修改或删除了bucket中的事件通知，可能导致oss触发器失效。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - 服务名称。\n      * @param {string} opts.functionName - 函数名称。\n      * @param {triggerSpec} opts.triggerSpec - 触发器创建参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string triggerName\n      */\n\n  createTrigger (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createTrigger\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling createTrigger\"\n      )\n    }\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling createTrigger\"\n      )\n    }\n    if (opts.triggerSpec === undefined || opts.triggerSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.triggerSpec' when calling createTrigger\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.triggerSpec !== undefined && opts.triggerSpec !== null) {\n      postBody['triggerSpec'] = opts.triggerSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createTrigger with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}/functions/{functionName}/triggers',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个触发器的详细信息。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - 服务名称。\n      * @param {string} opts.functionName - 函数名称。\n      * @param {string} opts.triggerName - 触发器名称。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param trigger trigger\n      */\n\n  describeTrigger (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTrigger\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling describeTrigger\"\n      )\n    }\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling describeTrigger\"\n      )\n    }\n    if (opts.triggerName === undefined || opts.triggerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.triggerName' when calling describeTrigger\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName,\n      functionName: opts.functionName,\n      triggerName: opts.triggerName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTrigger with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}/functions/{functionName}/triggers/{triggerName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改触发器配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - 服务名称。\n      * @param {string} opts.functionName - 函数名称。\n      * @param {string} opts.triggerName - 触发器名称。\n      * @param {string} [opts.description] - 修改后的描述  optional\n      * @param {string} [opts.triggerConfig] - 修改后的配置  optional\n      * @param {boolean} [opts.enable] - 是否启用或禁用触发器，默认为不更改触发器状态  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateTrigger (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateTrigger\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling updateTrigger\"\n      )\n    }\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling updateTrigger\"\n      )\n    }\n    if (opts.triggerName === undefined || opts.triggerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.triggerName' when calling updateTrigger\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.triggerConfig !== undefined && opts.triggerConfig !== null) {\n      postBody['triggerConfig'] = opts.triggerConfig\n    }\n    if (opts.enable !== undefined && opts.enable !== null) {\n      postBody['enable'] = opts.enable\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName,\n      functionName: opts.functionName,\n      triggerName: opts.triggerName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateTrigger with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}/functions/{functionName}/triggers/{triggerName}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除触发器。\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceName - 服务名称。\n      * @param {string} opts.functionName - 函数名称。\n      * @param {string} opts.triggerName - 触发器名称。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteTrigger (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteTrigger\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceName === undefined || opts.serviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceName' when calling deleteTrigger\"\n      )\n    }\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling deleteTrigger\"\n      )\n    }\n    if (opts.triggerName === undefined || opts.triggerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.triggerName' when calling deleteTrigger\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceName: opts.serviceName,\n      functionName: opts.functionName,\n      triggerName: opts.triggerName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  fc/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTrigger with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/services/{serviceName}/functions/{functionName}/triggers/{triggerName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = FC\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/flowlog/v1/flowlog.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Quota\n * 配额的相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'flowlog'\nService._services[serviceId] = true\n\n/**\n * flowlog service.\n * @version 1.1.0\n */\n\nclass FLOWLOG extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'flowlog.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  本接口用于查询流日志资源列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] -  flowLogStatus - 流日志状态，支持单个\n  flowLogType - 流日志类型，支持单个\n  flowLogIds - 流日志ID，支持多个\n  flowLogNames - 流日志名称，模糊查询支持单个，精确查询支持多个\n  storageId - 流日志的存储服务ID，支持单个\n  collectResourceIds - 流日志的采集资源ID列表，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param flowLog flowLogs\n      * @param number totalCount  总数量\n      */\n\n  describeFlowLogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeFlowLogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  flowlog/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeFlowLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/flowLogs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  本接口用于创建流日志资源\n      * @param {Object} opts - parameters\n      * @param {string} opts.flowLogName - 流日志名称，只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符\n      * @param {string} [opts.description] - 描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} opts.flowLogType - 流日志类型\nPORT：采集资源可为云主机、弹性网卡\n\n      * @param {array} [opts.collectResources] - 采集资源列表  optional\n      * @param {string} [opts.collectTrafficType] - 采集流量类型\nALL：记录指定资源的全部流量\nACCEPT：记录指定资源被安全组、网络ACL均接受的流量\nREJECT：记录指定资源被安全组或网络ACL拒绝的流量\n  optional\n      * @param {integer} [opts.collectInterval] - 流日志采集时间间隔。单位：分钟。取值：1、5、10  optional\n      * @param {string} [opts.storageType] - 流日志的存储服务类型，支持存储到日志服务，日志服务取值：LOG  optional\n      * @param {string} opts.storageRegionId - 流日志的存储服务所在地域，如日志服务所属地域，如cn-north-1\n      * @param {string} opts.storageId - 流日志的存储服务ID\n若storageType &#x3D; LOG时，值取日志主题ID，如logtopic-xxxx\n当flowLogType &#x3D; PORT时，值需取 templateUID &#x3D; eniflowlogs 的日志主题ID\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string flowLogId  流日志ID\n      */\n\n  createFlowLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createFlowLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.flowLogName === undefined || opts.flowLogName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.flowLogName' when calling createFlowLog\"\n      )\n    }\n    if (opts.flowLogType === undefined || opts.flowLogType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.flowLogType' when calling createFlowLog\"\n      )\n    }\n    if (opts.storageRegionId === undefined || opts.storageRegionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.storageRegionId' when calling createFlowLog\"\n      )\n    }\n    if (opts.storageId === undefined || opts.storageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.storageId' when calling createFlowLog\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.flowLogName !== undefined && opts.flowLogName !== null) {\n      postBody['flowLogName'] = opts.flowLogName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.flowLogType !== undefined && opts.flowLogType !== null) {\n      postBody['flowLogType'] = opts.flowLogType\n    }\n    if (opts.collectResources !== undefined && opts.collectResources !== null) {\n      postBody['collectResources'] = opts.collectResources\n    }\n    if (\n      opts.collectTrafficType !== undefined &&\n      opts.collectTrafficType !== null\n    ) {\n      postBody['collectTrafficType'] = opts.collectTrafficType\n    }\n    if (opts.collectInterval !== undefined && opts.collectInterval !== null) {\n      postBody['collectInterval'] = opts.collectInterval\n    }\n    if (opts.storageType !== undefined && opts.storageType !== null) {\n      postBody['storageType'] = opts.storageType\n    }\n    if (opts.storageRegionId !== undefined && opts.storageRegionId !== null) {\n      postBody['storageRegionId'] = opts.storageRegionId\n    }\n    if (opts.storageId !== undefined && opts.storageId !== null) {\n      postBody['storageId'] = opts.storageId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  flowlog/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createFlowLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/flowLogs',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  本接口用于查询流日志资源详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.flowLogId - 流日志ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param flowLog flowLog  流日志信息\n      */\n\n  describeFlowLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeFlowLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.flowLogId === undefined || opts.flowLogId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.flowLogId' when calling describeFlowLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      flowLogId: opts.flowLogId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  flowlog/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeFlowLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/flowLogs/{flowLogId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  本接口用于修改流日志资源，包括流日志的名称、描述、采集时间间隔\n      * @param {Object} opts - parameters\n      * @param {string} opts.flowLogId - 流日志ID\n      * @param {string} [opts.flowLogName] - 流日志名称，只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符  optional\n      * @param {string} [opts.description] - 描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {integer} [opts.collectInterval] - 流日志采集时间间隔。单位：分钟。取值：1、5、10  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyFlowLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyFlowLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.flowLogId === undefined || opts.flowLogId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.flowLogId' when calling modifyFlowLog\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.flowLogName !== undefined && opts.flowLogName !== null) {\n      postBody['flowLogName'] = opts.flowLogName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.collectInterval !== undefined && opts.collectInterval !== null) {\n      postBody['collectInterval'] = opts.collectInterval\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      flowLogId: opts.flowLogId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  flowlog/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyFlowLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/flowLogs/{flowLogId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  本接口用于删除流日志，删除前请先停止流日志（stopFlowlog）\n      * @param {Object} opts - parameters\n      * @param {string} opts.flowLogId - 流日志ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteFlowLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteFlowLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.flowLogId === undefined || opts.flowLogId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.flowLogId' when calling deleteFlowLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      flowLogId: opts.flowLogId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  flowlog/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteFlowLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/flowLogs/{flowLogId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  本接口用于启动采集流日志\n      * @param {Object} opts - parameters\n      * @param {string} opts.flowLogId - 流日志ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startFlowLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startFlowLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.flowLogId === undefined || opts.flowLogId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.flowLogId' when calling startFlowLog\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      flowLogId: opts.flowLogId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  flowlog/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startFlowLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/flowLogs/{flowLogId}:startFlowLog',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  本接口用于停止采集流日志\n      * @param {Object} opts - parameters\n      * @param {string} opts.flowLogId - 流日志ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopFlowLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopFlowLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.flowLogId === undefined || opts.flowLogId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.flowLogId' when calling stopFlowLog\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      flowLogId: opts.flowLogId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  flowlog/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopFlowLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/flowLogs/{flowLogId}:stopFlowLog',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  本接口用于添加需要采集流日志的资源\n      * @param {Object} opts - parameters\n      * @param {string} opts.flowLogId - 流日志ID\n      * @param {array} [opts.collectResources] - 采集资源列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addCollectResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addCollectResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.flowLogId === undefined || opts.flowLogId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.flowLogId' when calling addCollectResources\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.collectResources !== undefined && opts.collectResources !== null) {\n      postBody['collectResources'] = opts.collectResources\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      flowLogId: opts.flowLogId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  flowlog/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addCollectResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/flowLogs/{flowLogId}:addCollectResources',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  本接口用于移除流日志的采集资源\n      * @param {Object} opts - parameters\n      * @param {string} opts.flowLogId - 流日志ID\n      * @param {array} [opts.collectResourceIds] - 采集资源ID列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removeCollectResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  removeCollectResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.flowLogId === undefined || opts.flowLogId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.flowLogId' when calling removeCollectResources\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.collectResourceIds !== undefined &&\n      opts.collectResourceIds !== null\n    ) {\n      postBody['collectResourceIds'] = opts.collectResourceIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      flowLogId: opts.flowLogId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  flowlog/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeCollectResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/flowLogs/{flowLogId}:removeCollectResources',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  本接口用于查询流日志采集的资源列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.flowLogId - 流日志ID\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {array} [opts.filters] - collectResourceType：采集的资源类型，支持单个\ncollectResourceIds： 流日志采集的资源ID，支持多个\nvpcId：采集资源所属私有网络（VPC）的ID，支持单个\nsubnetId：采集资源所属子网的ID，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param collectResource collectResources\n      * @param number totalCount  总数量\n      */\n\n  describeCollectResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCollectResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.flowLogId === undefined || opts.flowLogId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.flowLogId' when calling describeCollectResources\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      flowLogId: opts.flowLogId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  flowlog/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCollectResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/flowLogs/{flowLogId}:describeCollectResources',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询配额信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.type - 资源类型，取值范围：flowLog、flowLogResource\n      * @param {string} [opts.parentResourceId] - type为flowLog不设置,\nflowLogResource设置为flowLogId\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quota\n      */\n\n  describeQuota (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuota\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.type === undefined || opts.type === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.type' when calling describeQuota\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n    if (opts.parentResourceId !== undefined && opts.parentResourceId !== null) {\n      queryParams['parentResourceId'] = opts.parentResourceId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  flowlog/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuota with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/quotas/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = FLOWLOG\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/function/v1/function.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Function OpenAPI\n *\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'function'\nService._services[serviceId] = true\n\n/**\n * function service.\n * @version 1.0.3\n */\n\nJDCloud.FUNCTION = class FUNCTION extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'function.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询别名列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 别名所属函数名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param alias data\n      */\n\n  listAlias (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listAlias\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling listAlias\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listAlias with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}/aliases',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建别名\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 别名所属函数名称\n      * @param {string} opts.aliasName - 别名名称\n      * @param {string} [opts.description] - 别名描述信息  optional\n      * @param {string} [opts.version] - 别名对应的版本名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param alias data\n      */\n\n  createAlias (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAlias\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling createAlias\"\n      )\n    }\n    if (opts.aliasName === undefined || opts.aliasName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aliasName' when calling createAlias\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.aliasName !== undefined && opts.aliasName !== null) {\n      postBody['aliasName'] = opts.aliasName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAlias with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}/aliases',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询别名详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 别名所属函数名称\n      * @param {string} opts.aliasName - 别名名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param alias data\n      */\n\n  getAlias (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getAlias\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling getAlias\"\n      )\n    }\n    if (opts.aliasName === undefined || opts.aliasName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aliasName' when calling getAlias\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName,\n      aliasName: opts.aliasName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAlias with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}/aliases/{aliasName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新别名\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 别名所属函数名称\n      * @param {string} opts.aliasName - 别名名称\n      * @param {string} opts.description - 别名描述信息\n      * @param {string} opts.version - 别名对应版本\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param alias data\n      */\n\n  updateAlias (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateAlias\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling updateAlias\"\n      )\n    }\n    if (opts.aliasName === undefined || opts.aliasName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aliasName' when calling updateAlias\"\n      )\n    }\n    if (opts.description === undefined || opts.description === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.description' when calling updateAlias\"\n      )\n    }\n    if (opts.version === undefined || opts.version === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.version' when calling updateAlias\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName,\n      aliasName: opts.aliasName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateAlias with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}/aliases/{aliasName}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除别名\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 别名所属函数名称\n      * @param {string} opts.aliasName - 别名名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteAlias (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAlias\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling deleteAlias\"\n      )\n    }\n    if (opts.aliasName === undefined || opts.aliasName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aliasName' when calling deleteAlias\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName,\n      aliasName: opts.aliasName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAlias with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}/aliases/{aliasName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询函数列表\n      * @param {Object} opts - parameters\n      * @param {boolean} opts.listAll - 是否返回所有函数\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {filter} [opts.filters] - functionId -函数ID，精确匹配，支持多个\nfunctionName  - 函数名称，模糊匹配，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listFunctionResult data\n      */\n\n  listFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listAll === undefined || opts.listAll === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listAll' when calling listFunction\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.listAll !== undefined && opts.listAll !== null) {\n      queryParams['listAll'] = opts.listAll\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建函数\n      * @param {Object} opts - parameters\n      * @param {string} [opts.name] - 函数名称  optional\n      * @param {string} [opts.description] - 函数描述信息  optional\n      * @param {string} [opts.entrance] - 函数入口，格式为入口文件.入口函数名  optional\n      * @param {integer} [opts.memory] - 函数运行最大内存  optional\n      * @param {string} [opts.runTime] - 函数运行环境  optional\n      * @param {integer} [opts.overTime] - 函数运行超时时间  optional\n      * @param {string} [opts.version] - 函数版本，默认为LATEST  optional\n      * @param {code} [opts.code] - 函数代码包  optional\n      * @param {env} [opts.environment] - 函数运行时环境变量  optional\n      * @param {string} [opts.logSetId] - 函数指定的日志集Id  optional\n      * @param {string} [opts.logTopicId] - 函数指定的日志主题Id  optional\n      * @param {string} [opts.vpcId] - 函数配置的VPCId  optional\n      * @param {string} [opts.subnetId] - 函数配置的子网Id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param function data\n      */\n\n  createFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.entrance !== undefined && opts.entrance !== null) {\n      postBody['entrance'] = opts.entrance\n    }\n    if (opts.memory !== undefined && opts.memory !== null) {\n      postBody['memory'] = opts.memory\n    }\n    if (opts.runTime !== undefined && opts.runTime !== null) {\n      postBody['runTime'] = opts.runTime\n    }\n    if (opts.overTime !== undefined && opts.overTime !== null) {\n      postBody['overTime'] = opts.overTime\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n    if (opts.code !== undefined && opts.code !== null) {\n      postBody['code'] = opts.code\n    }\n    if (opts.environment !== undefined && opts.environment !== null) {\n      postBody['environment'] = opts.environment\n    }\n    if (opts.logSetId !== undefined && opts.logSetId !== null) {\n      postBody['logSetId'] = opts.logSetId\n    }\n    if (opts.logTopicId !== undefined && opts.logTopicId !== null) {\n      postBody['logTopicId'] = opts.logTopicId\n    }\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      postBody['vpcId'] = opts.vpcId\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询函数详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 函数名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param function data\n      */\n\n  getFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling getFunction\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新函数\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 函数名称\n      * @param {string} [opts.description] - 函数描述信息  optional\n      * @param {string} [opts.entrance] - 函数入口，格式为入口文件.入口函数名  optional\n      * @param {integer} [opts.memory] - 函数运行最大内存  optional\n      * @param {string} [opts.runTime] - 函数运行环境  optional\n      * @param {integer} [opts.overTime] - 函数运行超时时间  optional\n      * @param {string} [opts.version] - 函数版本  optional\n      * @param {code} [opts.code] - 函数代码包  optional\n      * @param {env} [opts.environment] - 函数运行时环境变量  optional\n      * @param {string} [opts.logSetId] - 函数指定的日志集Id  optional\n      * @param {string} [opts.logTopicId] - 函数指定的日志主题Id  optional\n      * @param {string} [opts.vpcId] - 函数配置的VPCId  optional\n      * @param {string} [opts.subnetId] - 函数配置的子网Id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param function data\n      */\n\n  updateFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling updateFunction\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.entrance !== undefined && opts.entrance !== null) {\n      postBody['entrance'] = opts.entrance\n    }\n    if (opts.memory !== undefined && opts.memory !== null) {\n      postBody['memory'] = opts.memory\n    }\n    if (opts.runTime !== undefined && opts.runTime !== null) {\n      postBody['runTime'] = opts.runTime\n    }\n    if (opts.overTime !== undefined && opts.overTime !== null) {\n      postBody['overTime'] = opts.overTime\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n    if (opts.code !== undefined && opts.code !== null) {\n      postBody['code'] = opts.code\n    }\n    if (opts.environment !== undefined && opts.environment !== null) {\n      postBody['environment'] = opts.environment\n    }\n    if (opts.logSetId !== undefined && opts.logSetId !== null) {\n      postBody['logSetId'] = opts.logSetId\n    }\n    if (opts.logTopicId !== undefined && opts.logTopicId !== null) {\n      postBody['logTopicId'] = opts.logTopicId\n    }\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      postBody['vpcId'] = opts.vpcId\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除函数\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 函数名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling deleteFunction\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  控制台测试执行函数\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 函数名称\n      * @param {string} opts.versionName - 版本名称\n      * @param {string} opts.event - 执行函数的输入事件\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param functionInvokeResult data\n      */\n\n  invoke (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  invoke\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling invoke\"\n      )\n    }\n    if (opts.versionName === undefined || opts.versionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.versionName' when calling invoke\"\n      )\n    }\n    if (opts.event === undefined || opts.event === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.event' when calling invoke\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.event !== undefined && opts.event !== null) {\n      postBody['event'] = opts.event\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName,\n      versionName: opts.versionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call invoke with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}/versions/{versionName}:invoke',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  异步测试执行函数\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 函数名称\n      * @param {string} opts.versionName - 版本名称\n      * @param {string} opts.event - 异步执行函数的输入事件\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  asyncInvoke (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  asyncInvoke\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling asyncInvoke\"\n      )\n    }\n    if (opts.versionName === undefined || opts.versionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.versionName' when calling asyncInvoke\"\n      )\n    }\n    if (opts.event === undefined || opts.event === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.event' when calling asyncInvoke\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.event !== undefined && opts.event !== null) {\n      postBody['event'] = opts.event\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName,\n      versionName: opts.versionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call asyncInvoke with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}/versions/{versionName}:asyncinvoke',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取触发器详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 函数名称\n      * @param {string} opts.versionName - 版本名称\n      * @param {string} opts.triggerId - 触发器Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param trigger data\n      */\n\n  getTrigger (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTrigger\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling getTrigger\"\n      )\n    }\n    if (opts.versionName === undefined || opts.versionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.versionName' when calling getTrigger\"\n      )\n    }\n    if (opts.triggerId === undefined || opts.triggerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.triggerId' when calling getTrigger\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.triggerId !== undefined && opts.triggerId !== null) {\n      queryParams['triggerId'] = opts.triggerId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName,\n      versionName: opts.versionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTrigger with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}/versions/{versionName}:gettrigger',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询版本列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 函数名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param functionSpec data\n      */\n\n  listVersion (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listVersion\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling listVersion\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}/versions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建版本\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 函数名称\n      * @param {string} [opts.description] - 版本描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param function data\n      */\n\n  createVersion (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVersion\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling createVersion\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}/versions',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取版本详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 函数名称\n      * @param {string} opts.versionName - 版本名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param function data\n      */\n\n  getVersion (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVersion\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling getVersion\"\n      )\n    }\n    if (opts.versionName === undefined || opts.versionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.versionName' when calling getVersion\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName,\n      versionName: opts.versionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}/versions/{versionName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除版本\n      * @param {Object} opts - parameters\n      * @param {string} opts.functionName - 函数名称\n      * @param {string} opts.versionName - 版本名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVersion (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVersion\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.functionName === undefined || opts.functionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionName' when calling deleteVersion\"\n      )\n    }\n    if (opts.versionName === undefined || opts.versionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.versionName' when calling deleteVersion\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      functionName: opts.functionName,\n      versionName: opts.versionName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  function/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/functions/{functionName}/versions/{versionName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.FUNCTION\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/gcs/v1/gcs.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * GPU-Computing-Service\n * GPU算力服务网盘相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'gcs'\nService._services[serviceId] = true\n\n/**\n * gcs service.\n * @version 1.0.1\n */\n\nclass GCS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'gcs.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询作品列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {filter} [opts.filters] - artId 作品ID，精确匹配，支持多个\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param art arts\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeArts (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeArts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/arts',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询作品详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.artId - 作品ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param art art  作品详细信息\n      */\n\n  describeArt (opts, callback) {\n    opts = opts || {}\n\n    if (opts.artId === undefined || opts.artId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.artId' when calling describeArt\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      artId: opts.artId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeArt with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/arts/{artId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例名称\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.instanceName - nick name，用户自定义\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  操作是否成功\n      */\n\n  modifyInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstance\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling modifyInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/modifyInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建多个GPU容器实例\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {instanceSpec} opts.instanceSpec - GPU容器实例配置\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceIds\n      * @param string buyId  和instanceIds不会同时有值\n      */\n\n  createInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstances\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/createInstances',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询GPU容器实例列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[20, 100]  optional\n      * @param {string} [opts.az] - 可用区  optional\n      * @param {string} [opts.namespace] - 名称空间  optional\n      * @param {string} [opts.instanceId] - gcs uuid  optional\n      * @param {string} [opts.instanceName] - 实例名称  optional\n      * @param {string} [opts.status] - 运行状态：running|stopped|creating  optional\n      * @param {string} [opts.channel] - 订单渠道：aidc(默认)|yunding  optional\n      * @param {string} [opts.ids] - instance id list 逗号分隔  optional\n      * @param {filter} [opts.filters] - 容器实例ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance list\n      * @param integer pageNumber  页码；默认为1\n      * @param integer pageSize  分页大小；默认为20；取值范围[20, 100]\n      * @param integer totalCount  查询结果总数\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.az !== undefined && opts.az !== null) {\n      queryParams['az'] = opts.az\n    }\n    if (opts.namespace !== undefined && opts.namespace !== null) {\n      queryParams['namespace'] = opts.namespace\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      queryParams['instanceName'] = opts.instanceName\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.channel !== undefined && opts.channel !== null) {\n      queryParams['channel'] = opts.channel\n    }\n    if (opts.ids !== undefined && opts.ids !== null) {\n      queryParams['ids'] = opts.ids\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeInstances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询GPU容器实例详情\n      * @param {Object} opts - parameters\n      * @param {string} [opts.instanceId] - 实例ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instance  GPU容器实例详细信息\n      */\n\n  describeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeInstance',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  彻底删除一个GPU容器实例，包含其相关的一切资源配置信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} [opts.instanceId] - 实例ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  删除操作是否成功\n      */\n\n  deleteInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      queryParams['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/deleteInstance',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  资源到期或续费后，处理停机、重启\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  操作是否成功\n      */\n\n  startInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling startInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/startInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  资源到期或续费后，处理停机、重启\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} [opts.operType] - 操作类型，定时关机 timer  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  操作是否成功\n      */\n\n  stopInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling stopInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.operType !== undefined && opts.operType !== null) {\n      postBody['operType'] = opts.operType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/stopInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  实例规格升降配，即：无卡开机/有卡开机\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.chargeItem - 山海计费项\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  操作是否成功\n      */\n\n  modifyInstanceSpec (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceSpec\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceSpec\"\n      )\n    }\n    if (opts.chargeItem === undefined || opts.chargeItem === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.chargeItem' when calling modifyInstanceSpec\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.chargeItem !== undefined && opts.chargeItem !== null) {\n      postBody['chargeItem'] = opts.chargeItem\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceSpec with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/modifyInstanceSpec',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  定时关机\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.stopTime - 关机时间，格式：2024-09-04 14:22:00\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  操作是否成功\n      */\n\n  stopInstanceTimer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopInstanceTimer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling stopInstanceTimer\"\n      )\n    }\n    if (opts.stopTime === undefined || opts.stopTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stopTime' when calling stopInstanceTimer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.stopTime !== undefined && opts.stopTime !== null) {\n      postBody['stopTime'] = opts.stopTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopInstanceTimer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/stopInstanceTimer',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  取消定时关机\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  操作是否成功\n      */\n\n  stopInstanceTimerCancle (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopInstanceTimerCancle\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling stopInstanceTimerCancle\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopInstanceTimerCancle with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/stopInstanceTimerCancle',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改密码\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.az - az\n      * @param {string} opts.password - 新密码，为空则自动生成10位随机字符串\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  操作是否成功\n      */\n\n  modifyInstanceSecret (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceSecret\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceSecret\"\n      )\n    }\n    if (opts.az === undefined || opts.az === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.az' when calling modifyInstanceSecret\"\n      )\n    }\n    if (opts.password === undefined || opts.password === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.password' when calling modifyInstanceSecret\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.az !== undefined && opts.az !== null) {\n      postBody['az'] = opts.az\n    }\n    if (opts.password !== undefined && opts.password !== null) {\n      postBody['password'] = opts.password\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/modifyInstanceSecret',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  实例重置镜像\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.imageId - 镜像ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  操作是否成功\n      */\n\n  modifyInstanceImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceImage\"\n      )\n    }\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling modifyInstanceImage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.imageId !== undefined && opts.imageId !== null) {\n      postBody['imageId'] = opts.imageId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/modifyInstanceImage',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  返回订单列表不分页\n      * @param {Object} opts - parameters\n      * @param {string} [opts.instanceId] - GCS系统资源实例ID  optional\n      * @param {string} [opts.orderNumber] - 主订单编号  optional\n      * @param {string} [opts.subOrderNumber] - 子订单编号  optional\n      * @param {string} [opts.orderType] - 订单类型：1-新购|2-续费|3-配置变更  optional\n      * @param {string} [opts.taskId] - 主单打包id号  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param orderInfo list\n      */\n\n  describeOrderInfos (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeOrderInfos\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.orderNumber !== undefined && opts.orderNumber !== null) {\n      queryParams['orderNumber'] = opts.orderNumber\n    }\n    if (opts.subOrderNumber !== undefined && opts.subOrderNumber !== null) {\n      queryParams['subOrderNumber'] = opts.subOrderNumber\n    }\n    if (opts.orderType !== undefined && opts.orderType !== null) {\n      queryParams['orderType'] = opts.orderType\n    }\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      queryParams['taskId'] = opts.taskId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeOrderInfos with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeOrderInfos',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询GPU算力服务地域列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.region] - 返回一个指定region下的地域信息，比如：cn-north-1  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param region regions\n      */\n\n  describeRegions (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.region !== undefined && opts.region !== null) {\n      queryParams['region'] = opts.region\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRegions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询SKU可用库存数量\n      * @param {Object} opts - parameters\n      * @param {string} [opts.skuId] - sku id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param skuStock stock  SKU可用库存详情\n      */\n\n  describeStock (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeStock\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.skuId !== undefined && opts.skuId !== null) {\n      queryParams['skuId'] = opts.skuId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStock with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeStock',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改网盘，当前仅支持开通网盘\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientToken] - 由客户端生成，用于保证请求的幂等性，长度不能超过36个字符；&lt;br/&gt;\n如果多个请求使用了相同的clientToken，只会执行第一个请求，之后的请求直接返回第一个请求的结果&lt;br/&gt;\n  optional\n      * @param {string} [opts.az] - 可用区名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  开通操作是否成功\n      */\n\n  modifyNetDisk (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyNetDisk\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.az !== undefined && opts.az !== null) {\n      postBody['az'] = opts.az\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyNetDisk with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/modifyNetDisk',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网盘信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.az] - 可用区名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string open  已开通 yes,否则 no\n      * @param integer bytesUsed  用量数值，单位Byte\n      * @param integer bytesQuota  总量数值，单位Byte\n      * @param string namespace  命名空间\n      * @param string netdiskId  网盘UUID\n      * @param string az  可用区\n      * @param string pvcName  网盘pvc名称\n      * @param string netType  网盘类型 ceph\n      * @param string pvPath  网盘挂载路径\n      * @param string netVolumeName  网盘在网络存储中地址\n      * @param string netVolumePath  网盘在网络存储中物理路径\n      * @param integer storage  网盘大小，G\n      */\n\n  describeNetDisk (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNetDisk\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.az !== undefined && opts.az !== null) {\n      queryParams['az'] = opts.az\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  gcs/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNetDisk with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeNetDisk',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = GCS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/httpdns/v1/httpdns.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 域名\n * httpdns OpenAPI域名接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'httpdns'\nService._services[serviceId] = true\n\n/**\n * httpdns service.\n * @version 1.0.0\n */\n\nJDCloud.HTTPDNS = class HTTPDNS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'httpdns.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询用户名下httpdns的账户ID\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param accountId data  查询得到的账户ID结构\n      */\n\n  getAccountId (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getAccountId\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  httpdns/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAccountId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/account',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建httpdns账户\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param account data  开户成功后得到的账户结构\n      */\n\n  createAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  httpdns/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/account/createAccount',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询httpdns账户的基本信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param account data  查询得到的账户结构\n      */\n\n  getAccountInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getAccountInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  httpdns/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAccountInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/accountInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建，启用，禁用httpdns服务密钥\n      * @param {Object} opts - parameters\n      * @param {} [opts.action] - 操作类型, create创建, enable启用, disable禁用  optional\n      * @param {} [opts.key] - 操作的密钥  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  operateKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  operateKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.action !== undefined && opts.action !== null) {\n      postBody['action'] = opts.action\n    }\n    if (opts.key !== undefined && opts.key !== null) {\n      postBody['key'] = opts.key\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  httpdns/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call operateKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/account/operateKey',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询使用httpdns服务的域名\n      * @param {Object} opts - parameters\n      * @param {integer} opts.pageIndex - 当前页数，起始值为1\n      * @param {integer} opts.pageSize - 分页查询时设置的每页行数\n      * @param {string} [opts.domainName] - 关键字，按照”%domainName%”模式搜索域名  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainData data  分页查询返回的域名数据结构\n      */\n\n  getDomains (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDomains\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pageIndex === undefined || opts.pageIndex === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageIndex' when calling getDomains\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling getDomains\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  httpdns/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDomains with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加域名。&lt;br&gt;\n可以添加顶级域名除外的多级域名。\n\n      * @param {Object} opts - parameters\n      * @param {array} opts.domainNames - 需要添加的域名数组\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addDomains (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addDomains\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainNames === undefined || opts.domainNames === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainNames' when calling addDomains\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domainNames !== undefined && opts.domainNames !== null) {\n      postBody['domainNames'] = opts.domainNames\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  httpdns/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addDomains with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/addDomain',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除域名\n      * @param {Object} opts - parameters\n      * @param {array} opts.domainNames - 需要删除的域名数组\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  delDomains (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  delDomains\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.domainNames === undefined || opts.domainNames === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainNames' when calling delDomains\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domainNames !== undefined && opts.domainNames !== null) {\n      postBody['domainNames'] = opts.domainNames\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  httpdns/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call delDomains with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/domain/delDomain',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.HTTPDNS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/hufu/v1/hufu.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * hufu-wx\n * 虎符商业化相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'hufu'\nService._services[serviceId] = true\n\n/**\n * hufu service.\n * @version 1.0.7\n */\n\nclass HUFU extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'hufu.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  发布版本\n      * @param {Object} opts - parameters\n      * @param {integer} opts.sceneId - 场景ID\n      * @param {string} opts.revision - 发布的修订版本号\n      * @param {string} opts.environment - 环境：test、preview、online\n      * @param {string} [opts.backendServiceType] - 后端服务类型：mock、unique、vpc  optional\n      * @param {string} [opts.backendUrl] - 后端地址  optional\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} [opts.jdsfName] - 微服务网关名称  optional\n      * @param {string} [opts.jdsfRegistryName] - 微服务注册中心ID  optional\n      * @param {string} [opts.jdsfId] - 微服务ID  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deploy (opts, callback) {\n    opts = opts || {}\n\n    if (opts.sceneId === undefined || opts.sceneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sceneId' when calling deploy\"\n      )\n    }\n    if (opts.revision === undefined || opts.revision === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.revision' when calling deploy\"\n      )\n    }\n    if (opts.environment === undefined || opts.environment === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.environment' when calling deploy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.revision !== undefined && opts.revision !== null) {\n      postBody['revision'] = opts.revision\n    }\n    if (opts.environment !== undefined && opts.environment !== null) {\n      postBody['environment'] = opts.environment\n    }\n    if (\n      opts.backendServiceType !== undefined &&\n      opts.backendServiceType !== null\n    ) {\n      postBody['backendServiceType'] = opts.backendServiceType\n    }\n    if (opts.backendUrl !== undefined && opts.backendUrl !== null) {\n      postBody['backendUrl'] = opts.backendUrl\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.jdsfName !== undefined && opts.jdsfName !== null) {\n      postBody['jdsfName'] = opts.jdsfName\n    }\n    if (opts.jdsfRegistryName !== undefined && opts.jdsfRegistryName !== null) {\n      postBody['jdsfRegistryName'] = opts.jdsfRegistryName\n    }\n    if (opts.jdsfId !== undefined && opts.jdsfId !== null) {\n      postBody['jdsfId'] = opts.jdsfId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      sceneId: opts.sceneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  hufu/1.0.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deploy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/scenes/{sceneId}/deployments',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询该版本的部署详情\n      * @param {Object} opts - parameters\n      * @param {integer} opts.sceneId - 场景ID\n      * @param {string} opts.deploymentId - 部署ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deployment apiGroup\n      */\n\n  describeDeployment (opts, callback) {\n    opts = opts || {}\n\n    if (opts.sceneId === undefined || opts.sceneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sceneId' when calling describeDeployment\"\n      )\n    }\n    if (opts.deploymentId === undefined || opts.deploymentId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deploymentId' when calling describeDeployment\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      sceneId: opts.sceneId,\n      deploymentId: opts.deploymentId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  hufu/1.0.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeployment with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/scenes/{sceneId}/deployments/{deploymentId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  加密\n      * @param {Object} opts - parameters\n      * @param {string} [opts.plaintext] - 明文  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string ciphertext  密文\n      */\n\n  encrypt (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.plaintext !== undefined && opts.plaintext !== null) {\n      postBody['plaintext'] = opts.plaintext\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  hufu/1.0.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call encrypt with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/encrypt',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  加密\n      * @param {Object} opts - parameters\n      * @param {string} [opts.cipher] - 密文  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean encryptData  是否是虎符密文\n      */\n\n  isEncryptData (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.cipher !== undefined && opts.cipher !== null) {\n      postBody['cipher'] = opts.cipher\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  hufu/1.0.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call isEncryptData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/isEncryptData',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询access日志\n      * @param {Object} opts - parameters\n      * @param {string} [opts.call_pin] - 调用者pin  optional\n      * @param {string} [opts.response_status] - 响应码  optional\n      * @param {string} [opts.api_name] - api名称  optional\n      * @param {string} [opts.access_key] - 调用者accessKey  optional\n      * @param {string} [opts.host] - 请求虎符网关的域名  optional\n      * @param {string} opts.startTime - 开始时间，utc格式，例如：2020-05-19T00:00:05+0800\n      * @param {string} opts.endTime - 结束时间，utc格式，例如：2020-05-19T00:00:05+0800\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param accessLog data\n      * @param integer total\n      */\n\n  queryAccessLog (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling queryAccessLog\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling queryAccessLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.call_pin !== undefined && opts.call_pin !== null) {\n      queryParams['call_pin'] = opts.call_pin\n    }\n    if (opts.response_status !== undefined && opts.response_status !== null) {\n      queryParams['response_status'] = opts.response_status\n    }\n    if (opts.api_name !== undefined && opts.api_name !== null) {\n      queryParams['api_name'] = opts.api_name\n    }\n    if (opts.access_key !== undefined && opts.access_key !== null) {\n      queryParams['access_key'] = opts.access_key\n    }\n    if (opts.host !== undefined && opts.host !== null) {\n      queryParams['host'] = opts.host\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  hufu/1.0.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryAccessLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/access',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = HUFU\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/iam/v1/iam.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * User Management\n * User Management API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iam'\nService._services[serviceId] = true\n\n/**\n * iam service.\n * @version 0.3.6\n */\n\nclass IAM extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'iam.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  启用子用户AccessKey &lt;br&gt;, 启用后accessKey 的状态变成 1 &lt;b&gt;启用&lt;/b&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.subUser - 子用户名称\n      * @param {string} opts.accessKey - accessKey\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableSubUserAccessKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling enableSubUserAccessKey\"\n      )\n    }\n    if (opts.accessKey === undefined || opts.accessKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKey' when calling enableSubUserAccessKey\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      subUser: opts.subUser,\n      accessKey: opts.accessKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableSubUserAccessKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUser/{subUser}/accessKey/{accessKey}:enable',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用子用户的AccessKey &lt;br&gt;, 禁用后accessKey 的状态变成 0 &lt;b&gt;禁用&lt;/b&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.subUser - 子用户名称\n      * @param {string} opts.accessKey - accessKey\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableSubUserAccessKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling disableSubUserAccessKey\"\n      )\n    }\n    if (opts.accessKey === undefined || opts.accessKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKey' when calling disableSubUserAccessKey\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      subUser: opts.subUser,\n      accessKey: opts.accessKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableSubUserAccessKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUser/{subUser}/accessKey/{accessKey}:disable',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除子用户的AccessKey\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.subUser - 子用户名称\n      * @param {string} opts.accessKey - accessKey\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSubUserAccessKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling deleteSubUserAccessKey\"\n      )\n    }\n    if (opts.accessKey === undefined || opts.accessKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKey' when calling deleteSubUserAccessKey\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      subUser: opts.subUser,\n      accessKey: opts.accessKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSubUserAccessKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUser/{subUser}/accessKey/{accessKey}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建用户组, &lt;br&gt;\n可访问&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/iam/group-management&quot;&gt;用户组管理&lt;/a&gt;了解更多&lt;br&gt;\n\n      * @param {Object} opts - parameters\n      * @param {createGroupInfo} opts.createGroupInfo\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param createGroupRes group  用户组信息\n      */\n\n  createGroup (opts, callback) {\n    opts = opts || {}\n\n    if (opts.createGroupInfo === undefined || opts.createGroupInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createGroupInfo' when calling createGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.createGroupInfo !== undefined && opts.createGroupInfo !== null) {\n      postBody['createGroupInfo'] = opts.createGroupInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/group',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户组详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupName - 用户组名称\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param groupDetail group  用户组信息\n      */\n\n  describeGroup (opts, callback) {\n    opts = opts || {}\n\n    if (opts.groupName === undefined || opts.groupName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupName' when calling describeGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      groupName: opts.groupName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/group/{groupName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改用户组\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupName - 用户组名称\n      * @param {updateGroupInfo} opts.updateGroupInfo\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateGroup (opts, callback) {\n    opts = opts || {}\n\n    if (opts.groupName === undefined || opts.groupName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupName' when calling updateGroup\"\n      )\n    }\n    if (opts.updateGroupInfo === undefined || opts.updateGroupInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.updateGroupInfo' when calling updateGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.updateGroupInfo !== undefined && opts.updateGroupInfo !== null) {\n      postBody['updateGroupInfo'] = opts.updateGroupInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      groupName: opts.groupName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/group/{groupName}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除用户组\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupName - 用户组名称\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteGroup (opts, callback) {\n    opts = opts || {}\n\n    if (opts.groupName === undefined || opts.groupName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupName' when calling deleteGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      groupName: opts.groupName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/group/{groupName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户组内的子用户列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupName - 用户组名称\n      * @param {integer} [opts.pageNumber] - 页码，默认1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认50，取值范围[10, 100]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  用户总数\n      * @param subUserInfo subUsers\n      */\n\n  describeGroupSubUsers (opts, callback) {\n    opts = opts || {}\n\n    if (opts.groupName === undefined || opts.groupName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupName' when calling describeGroupSubUsers\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      groupName: opts.groupName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeGroupSubUsers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/group/{groupName}/subUsers',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户组列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码，默认1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认50，取值范围[10, 100]  optional\n      * @param {string} [opts.keyword] - 关键字  optional\n      * @param {integer} [opts.sort] - 排序规则：0-创建时间顺序排序，1-创建时间倒序排序  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总数\n      * @param group groups\n      */\n\n  describeGroups (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.keyword !== undefined && opts.keyword !== null) {\n      queryParams['keyword'] = opts.keyword\n    }\n    if (opts.sort !== undefined && opts.sort !== null) {\n      queryParams['sort'] = opts.sort\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/groups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  列举用户组的策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupName - 用户组名称\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总数\n      * @param policy policies\n      */\n\n  describeAttachedGroupPolicies (opts, callback) {\n    opts = opts || {}\n\n    if (opts.groupName === undefined || opts.groupName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupName' when calling describeAttachedGroupPolicies\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      groupName: opts.groupName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAttachedGroupPolicies with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/group/{groupName}/policies',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  列举用户组的策略的资源组列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupName - 用户组名称\n      * @param {string} opts.policyID - 策略ID\n      * @param {string} [opts.filterBindResGroup] - 滤绑定策略资源组：&quot;Deny&quot; 不允许，Allow 允许，空情况默认不允许，兼容历史数据  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总数\n      * @param resourceGroup policies\n      */\n\n  describeAttachedGroupPoliciesScope (opts, callback) {\n    opts = opts || {}\n\n    if (opts.groupName === undefined || opts.groupName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupName' when calling describeAttachedGroupPoliciesScope\"\n      )\n    }\n    if (opts.policyID === undefined || opts.policyID === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyID' when calling describeAttachedGroupPoliciesScope\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.policyID !== undefined && opts.policyID !== null) {\n      queryParams['policyID'] = opts.policyID\n    }\n    if (\n      opts.filterBindResGroup !== undefined &&\n      opts.filterBindResGroup !== null\n    ) {\n      queryParams['filterBindResGroup'] = opts.filterBindResGroup\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      groupName: opts.groupName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAttachedGroupPoliciesScope with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/group/{groupName}/policiesScope',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为用户组解绑策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupName - 用户组名称\n      * @param {string} opts.policyName - 策略名称\n      * @param {string} [opts.scopeId] - 资源组id  optional\n      * @param {string} [opts.allowDetachAddPolicy] - 允许解除策略：&quot;Deny&quot; 不允许，Allow 允许，空情况默认允许，兼容历史数据  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  detachGroupPolicy (opts, callback) {\n    opts = opts || {}\n\n    if (opts.groupName === undefined || opts.groupName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupName' when calling detachGroupPolicy\"\n      )\n    }\n    if (opts.policyName === undefined || opts.policyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyName' when calling detachGroupPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.policyName !== undefined && opts.policyName !== null) {\n      queryParams['policyName'] = opts.policyName\n    }\n    if (opts.scopeId !== undefined && opts.scopeId !== null) {\n      queryParams['scopeId'] = opts.scopeId\n    }\n    if (\n      opts.allowDetachAddPolicy !== undefined &&\n      opts.allowDetachAddPolicy !== null\n    ) {\n      queryParams['allowDetachAddPolicy'] = opts.allowDetachAddPolicy\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      groupName: opts.groupName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call detachGroupPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/group/{groupName}:detachGroupPolicy',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为用户组绑定策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupName - 用户组名称\n      * @param {string} opts.policyName - 策略名称\n      * @param {string} [opts.scopeId] - 资源组id  optional\n      * @param {string} [opts.allowAddPolicy] - 允许添加策略绑定：&quot;Deny&quot; 不允许，Allow 允许，空情况默认允许，兼容历史数据  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  attachGroupPolicy (opts, callback) {\n    opts = opts || {}\n\n    if (opts.groupName === undefined || opts.groupName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupName' when calling attachGroupPolicy\"\n      )\n    }\n    if (opts.policyName === undefined || opts.policyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyName' when calling attachGroupPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.policyName !== undefined && opts.policyName !== null) {\n      postBody['policyName'] = opts.policyName\n    }\n    if (opts.scopeId !== undefined && opts.scopeId !== null) {\n      postBody['scopeId'] = opts.scopeId\n    }\n    if (opts.allowAddPolicy !== undefined && opts.allowAddPolicy !== null) {\n      postBody['allowAddPolicy'] = opts.allowAddPolicy\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      groupName: opts.groupName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call attachGroupPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/group/{groupName}:attachGroupPolicy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  将子用户从组中删除\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupName - 用户组名称\n      * @param {string} opts.subUser - 子用户名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removeSubUserFromGroup (opts, callback) {\n    opts = opts || {}\n\n    if (opts.groupName === undefined || opts.groupName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupName' when calling removeSubUserFromGroup\"\n      )\n    }\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling removeSubUserFromGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.subUser !== undefined && opts.subUser !== null) {\n      queryParams['subUser'] = opts.subUser\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      groupName: opts.groupName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeSubUserFromGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/group/{groupName}:removeSubUserFromGroup',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加子用户到用户组中\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupName - 用户组名称\n      * @param {string} opts.subUser - 子用户名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addSubUserToGroup (opts, callback) {\n    opts = opts || {}\n\n    if (opts.groupName === undefined || opts.groupName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupName' when calling addSubUserToGroup\"\n      )\n    }\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling addSubUserToGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subUser !== undefined && opts.subUser !== null) {\n      postBody['subUser'] = opts.subUser\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      groupName: opts.groupName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addSubUserToGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/group/{groupName}:addSubUserToGroup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  初始化虚拟MFA设备\n      * @param {Object} opts - parameters\n      * @param {string} [opts.boundAccount] - 初始化的账号（目前支持：默认不填的情况表示为自己初始化，填写子用户名表示为子用户化初始)  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param virtualMFADevice virtualMFADevice\n      */\n\n  createVirtualMFADevice (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.boundAccount !== undefined && opts.boundAccount !== null) {\n      postBody['boundAccount'] = opts.boundAccount\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVirtualMFADevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/virtualMFADevice',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询虚拟MFA设备状态\n      * @param {Object} opts - parameters\n      * @param {string} [opts.queriedAccount] - 被查询的账号（目前支持：默认不填的情况表示查询自己，填写子用户名表示查询子用户)  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer status  0-关闭，1-启用\n      */\n\n  describeVirtualMFA (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.queriedAccount !== undefined && opts.queriedAccount !== null) {\n      queryParams['queriedAccount'] = opts.queriedAccount\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVirtualMFA with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/virtualMFA',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  绑定虚拟MFA设备\n      * @param {Object} opts - parameters\n      * @param {string} [opts.boundAccount] - 被绑定的账号（目前支持：默认不填的情况表示给自己绑定，填写子用户名表示主账号给子用户绑定)  optional\n      * @param {string} opts.authenticationCode1 - 第一组动态密码（连续的两组）\n      * @param {string} opts.authenticationCode2 - 第二组动态密码（连续的两组）\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  bindMFADevice (opts, callback) {\n    opts = opts || {}\n\n    if (\n      opts.authenticationCode1 === undefined ||\n      opts.authenticationCode1 === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.authenticationCode1' when calling bindMFADevice\"\n      )\n    }\n    if (\n      opts.authenticationCode2 === undefined ||\n      opts.authenticationCode2 === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.authenticationCode2' when calling bindMFADevice\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.boundAccount !== undefined && opts.boundAccount !== null) {\n      postBody['boundAccount'] = opts.boundAccount\n    }\n    if (\n      opts.authenticationCode1 !== undefined &&\n      opts.authenticationCode1 !== null\n    ) {\n      postBody['authenticationCode1'] = opts.authenticationCode1\n    }\n    if (\n      opts.authenticationCode2 !== undefined &&\n      opts.authenticationCode2 !== null\n    ) {\n      postBody['authenticationCode2'] = opts.authenticationCode2\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bindMFADevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/virtualMFADevice:bind',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  绑定虚拟MFA设备（一组动态密码）\n      * @param {Object} opts - parameters\n      * @param {string} [opts.boundAccount] - 被绑定的账号（目前支持：默认不填的情况表示给自己绑定，填写子用户名表示主账号给子用户绑定)  optional\n      * @param {string} opts.authenticationCode - 一组动态密码\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  bindMFADeviceByOneCode (opts, callback) {\n    opts = opts || {}\n\n    if (\n      opts.authenticationCode === undefined ||\n      opts.authenticationCode === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.authenticationCode' when calling bindMFADeviceByOneCode\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.boundAccount !== undefined && opts.boundAccount !== null) {\n      postBody['boundAccount'] = opts.boundAccount\n    }\n    if (\n      opts.authenticationCode !== undefined &&\n      opts.authenticationCode !== null\n    ) {\n      postBody['authenticationCode'] = opts.authenticationCode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bindMFADeviceByOneCode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/virtualMFADevice:bindByOneCode',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  解绑虚拟MFA设备\n      * @param {Object} opts - parameters\n      * @param {string} [opts.unboundAccount] - 被解绑的账号（目前支持：默认不填的情况表示给自己解绑，填写子用户名表示为子用户解绑)  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  unbindMFADevice (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.unboundAccount !== undefined && opts.unboundAccount !== null) {\n      queryParams['unboundAccount'] = opts.unboundAccount\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call unbindMFADevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/virtualMFADevice:unbind',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新建组织用户关联关系\n      * @param {Object} opts - parameters\n      * @param {string} opts.orgId - 组织ID\n      * @param {addOrganizationUserRelationInfo} opts.addOrganizationUserRelationInfo - 新建组织用户关联子用户关系参数\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addOrganizationUserRelation (opts, callback) {\n    opts = opts || {}\n\n    if (opts.orgId === undefined || opts.orgId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.orgId' when calling addOrganizationUserRelation\"\n      )\n    }\n    if (\n      opts.addOrganizationUserRelationInfo === undefined ||\n      opts.addOrganizationUserRelationInfo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.addOrganizationUserRelationInfo' when calling addOrganizationUserRelation\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.addOrganizationUserRelationInfo !== undefined &&\n      opts.addOrganizationUserRelationInfo !== null\n    ) {\n      postBody['addOrganizationUserRelationInfo'] =\n        opts.addOrganizationUserRelationInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      orgId: opts.orgId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addOrganizationUserRelation with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/organization/{orgId}/userRelation:add',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建策略 &lt;br&gt;\n关于策略的详细介绍，可以查询&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/iam/policy-overview&quot;&gt;策略概览&lt;/a&gt; &lt;br&gt;\n\n      * @param {Object} opts - parameters\n      * @param {createPermissionInfo} opts.createPermissionInfo - 权限信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createPermission (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createPermission\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.createPermissionInfo === undefined ||\n      opts.createPermissionInfo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createPermissionInfo' when calling createPermission\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.createPermissionInfo !== undefined &&\n      opts.createPermissionInfo !== null\n    ) {\n      postBody['createPermissionInfo'] = opts.createPermissionInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createPermission with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/permission',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询策略详情\n      * @param {Object} opts - parameters\n      * @param {integer} opts.permissionId - 权限id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param permission permission  权限信息\n      */\n\n  describePermissionDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePermissionDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.permissionId === undefined || opts.permissionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.permissionId' when calling describePermissionDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      permissionId: opts.permissionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePermissionDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/permission/{permissionId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改策略\n      * @param {Object} opts - parameters\n      * @param {integer} opts.permissionId - 权限id\n      * @param {updatePermissionInfo} opts.updatePermissionInfo - 权限信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updatePermission (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updatePermission\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.permissionId === undefined || opts.permissionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.permissionId' when calling updatePermission\"\n      )\n    }\n    if (\n      opts.updatePermissionInfo === undefined ||\n      opts.updatePermissionInfo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.updatePermissionInfo' when calling updatePermission\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.updatePermissionInfo !== undefined &&\n      opts.updatePermissionInfo !== null\n    ) {\n      postBody['updatePermissionInfo'] = opts.updatePermissionInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      permissionId: opts.permissionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updatePermission with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/permission/{permissionId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询策略列表\n      * @param {Object} opts - parameters\n      * @param {integer} opts.pageNumber - 页码\n      * @param {integer} opts.pageSize - 每页显示数目\n      * @param {string} [opts.keyword] - 关键字  optional\n      * @param {integer} opts.queryType - 权限类型,0-全部，1-系统权限，2-自定义权限\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总数\n      * @param permission permissions\n      */\n\n  describePermissions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePermissions\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling describePermissions\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describePermissions\"\n      )\n    }\n    if (opts.queryType === undefined || opts.queryType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryType' when calling describePermissions\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.keyword !== undefined && opts.keyword !== null) {\n      queryParams['keyword'] = opts.keyword\n    }\n    if (opts.queryType !== undefined && opts.queryType !== null) {\n      queryParams['queryType'] = opts.queryType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePermissions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/permissions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子用户策略列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.subUser - 子用户用户名\n      * @param {integer} opts.pageNumber - 页码\n      * @param {integer} opts.pageSize - 每页显示数目\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总数\n      * @param permission permissions\n      */\n\n  describeSubUserPermissions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSubUserPermissions\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling describeSubUserPermissions\"\n      )\n    }\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling describeSubUserPermissions\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeSubUserPermissions\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      subUser: opts.subUser\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubUserPermissions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subUser/{subUser}/permisssions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为子用户绑定策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.subUser - 子用户用户名\n      * @param {addPermissionsInfo} opts.addPermissionsInfo - 权限信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addPermissionsToSubUser (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addPermissionsToSubUser\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling addPermissionsToSubUser\"\n      )\n    }\n    if (\n      opts.addPermissionsInfo === undefined ||\n      opts.addPermissionsInfo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.addPermissionsInfo' when calling addPermissionsToSubUser\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.addPermissionsInfo !== undefined &&\n      opts.addPermissionsInfo !== null\n    ) {\n      postBody['addPermissionsInfo'] = opts.addPermissionsInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subUser: opts.subUser\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addPermissionsToSubUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subUser/{subUser}/permisssions',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为子用户解绑策略\n      * @param {Object} opts - parameters\n      * @param {integer} opts.permissionId - 权限id\n      * @param {string} opts.subUser - 子用户用户名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removePermissionOfSubUser (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  removePermissionOfSubUser\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.permissionId === undefined || opts.permissionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.permissionId' when calling removePermissionOfSubUser\"\n      )\n    }\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling removePermissionOfSubUser\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      permissionId: opts.permissionId,\n      subUser: opts.subUser\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removePermissionOfSubUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subUser/{subUser}/permissions/{permissionId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建策略, &lt;br&gt;\n访问 &lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/iam/policy-overview&quot;&gt;策略管理&lt;/a&gt; 了解更多内容 &lt;br&gt;\n\n      * @param {Object} opts - parameters\n      * @param {createPolicyInfo} opts.createPolicyInfo - 策略信息\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param policy policy  策略信息\n      */\n\n  createPolicy (opts, callback) {\n    opts = opts || {}\n\n    if (opts.createPolicyInfo === undefined || opts.createPolicyInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createPolicyInfo' when calling createPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.createPolicyInfo !== undefined && opts.createPolicyInfo !== null) {\n      postBody['createPolicyInfo'] = opts.createPolicyInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/policy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询策略详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyName - 策略名称\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param policyDetail policy  权限策略信息\n      * @param policyEdition defaultPolicyEdition  权限策略的默认版本信息\n      */\n\n  describePolicy (opts, callback) {\n    opts = opts || {}\n\n    if (opts.policyName === undefined || opts.policyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyName' when calling describePolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      policyName: opts.policyName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/policy/{policyName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改权限策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyName - 策略名称\n      * @param {updatePolicyInfo} opts.updatePolicyInfo - 策略文档信息\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updatePolicy (opts, callback) {\n    opts = opts || {}\n\n    if (opts.policyName === undefined || opts.policyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyName' when calling updatePolicy\"\n      )\n    }\n    if (opts.updatePolicyInfo === undefined || opts.updatePolicyInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.updatePolicyInfo' when calling updatePolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.updatePolicyInfo !== undefined && opts.updatePolicyInfo !== null) {\n      postBody['updatePolicyInfo'] = opts.updatePolicyInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      policyName: opts.policyName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updatePolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/policy/{policyName}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyName - 策略名称\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deletePolicy (opts, callback) {\n    opts = opts || {}\n\n    if (opts.policyName === undefined || opts.policyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyName' when calling deletePolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      policyName: opts.policyName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deletePolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/policy/{policyName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改策略描述\n      * @param {Object} opts - parameters\n      * @param {string} opts.policyName - 策略名称\n      * @param {updatePolicyDescriptionInfo} opts.updatePolicyDescriptionInfo - 策略描述信息\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updatePolicyDescription (opts, callback) {\n    opts = opts || {}\n\n    if (opts.policyName === undefined || opts.policyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyName' when calling updatePolicyDescription\"\n      )\n    }\n    if (\n      opts.updatePolicyDescriptionInfo === undefined ||\n      opts.updatePolicyDescriptionInfo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.updatePolicyDescriptionInfo' when calling updatePolicyDescription\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.updatePolicyDescriptionInfo !== undefined &&\n      opts.updatePolicyDescriptionInfo !== null\n    ) {\n      postBody['updatePolicyDescriptionInfo'] = opts.updatePolicyDescriptionInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      policyName: opts.policyName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updatePolicyDescription with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/policy/{policyName}/description',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询策略列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码，默认1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认50，取值范围[10, 100]  optional\n      * @param {string} [opts.keyword] - 关键字  optional\n      * @param {integer} [opts.queryType] - 策略类型：0-全部（默认），1-系统策略，2-自定义策略  optional\n      * @param {integer} [opts.sort] - 排序规则：0-创建时间顺序排序，1-创建时间倒序排序  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总数\n      * @param policy policies\n      */\n\n  describePolicies (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.keyword !== undefined && opts.keyword !== null) {\n      queryParams['keyword'] = opts.keyword\n    }\n    if (opts.queryType !== undefined && opts.queryType !== null) {\n      queryParams['queryType'] = opts.queryType\n    }\n    if (opts.sort !== undefined && opts.sort !== null) {\n      queryParams['sort'] = opts.sort\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePolicies with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/policies',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建角色 &lt;br&gt;\n关于角色的详细介绍，请请参考 &lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/iam/role-overview&quot;&gt;角色概览&lt;/a&gt; &lt;br&gt;\n\n      * @param {Object} opts - parameters\n      * @param {createRoleInfo} opts.createRoleInfo - 角色信息\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param roleInfo roleInfo  角色信息\n      */\n\n  createRole (opts, callback) {\n    opts = opts || {}\n\n    if (opts.createRoleInfo === undefined || opts.createRoleInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createRoleInfo' when calling createRole\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.createRoleInfo !== undefined && opts.createRoleInfo !== null) {\n      postBody['createRoleInfo'] = opts.createRoleInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRole with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/role',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  复制角色\n      * @param {Object} opts - parameters\n      * @param {copyRoleInfo} opts.copyRoleInfo - 角色信息\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param roleInfo roleInfo  角色信息\n      */\n\n  copyRole (opts, callback) {\n    opts = opts || {}\n\n    if (opts.copyRoleInfo === undefined || opts.copyRoleInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.copyRoleInfo' when calling copyRole\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.copyRoleInfo !== undefined && opts.copyRoleInfo !== null) {\n      postBody['copyRoleInfo'] = opts.copyRoleInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call copyRole with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/copyRole',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询角色详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.roleName - 角色名称\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param roleInfo roleInfo  角色信息\n      */\n\n  describeRole (opts, callback) {\n    opts = opts || {}\n\n    if (opts.roleName === undefined || opts.roleName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roleName' when calling describeRole\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      roleName: opts.roleName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRole with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/role/{roleName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除角色\n      * @param {Object} opts - parameters\n      * @param {string} opts.roleName - 角色名称\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRole (opts, callback) {\n    opts = opts || {}\n\n    if (opts.roleName === undefined || opts.roleName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roleName' when calling deleteRole\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      roleName: opts.roleName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRole with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/role/{roleName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改角色内置policy\n      * @param {Object} opts - parameters\n      * @param {string} opts.roleName - 角色名称\n      * @param {updateAssumeRolePolicyInfo} opts.updateAssumeRolePolicyInfo - 角色权限信息\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateAssumeRolePolicy (opts, callback) {\n    opts = opts || {}\n\n    if (opts.roleName === undefined || opts.roleName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roleName' when calling updateAssumeRolePolicy\"\n      )\n    }\n    if (\n      opts.updateAssumeRolePolicyInfo === undefined ||\n      opts.updateAssumeRolePolicyInfo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.updateAssumeRolePolicyInfo' when calling updateAssumeRolePolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.updateAssumeRolePolicyInfo !== undefined &&\n      opts.updateAssumeRolePolicyInfo !== null\n    ) {\n      postBody['updateAssumeRolePolicyInfo'] = opts.updateAssumeRolePolicyInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      roleName: opts.roleName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateAssumeRolePolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/role/{roleName}/assumeRolePolicy',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询角色列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码，默认1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认50，取值范围[10, 100]  optional\n      * @param {string} [opts.roleName] - 角色名称关键词  optional\n      * @param {integer} [opts.type] - 角色类型，默认查找所有类型，2-服务相关角色，3-服务角色，4-用户角色  optional\n      * @param {integer} [opts.sort] - 排序策略,0-按创建时间顺序排序,1-按创建时间倒序排序  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总数\n      * @param listRoleInfo roles\n      */\n\n  describeRoles (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.roleName !== undefined && opts.roleName !== null) {\n      queryParams['roleName'] = opts.roleName\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n    if (opts.sort !== undefined && opts.sort !== null) {\n      queryParams['sort'] = opts.sort\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRoles with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/roles',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为角色绑定策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.roleName - 角色名称\n      * @param {string} opts.policyName - 策略名称\n      * @param {string} [opts.scopeId] - 资源组id  optional\n      * @param {string} [opts.allowAddPolicy] - 允许添加策略绑定：&quot;Deny&quot; 不允许，Allow 允许，空情况默认允许，兼容历史数据  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  attachRolePolicy (opts, callback) {\n    opts = opts || {}\n\n    if (opts.roleName === undefined || opts.roleName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roleName' when calling attachRolePolicy\"\n      )\n    }\n    if (opts.policyName === undefined || opts.policyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyName' when calling attachRolePolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.policyName !== undefined && opts.policyName !== null) {\n      postBody['policyName'] = opts.policyName\n    }\n    if (opts.scopeId !== undefined && opts.scopeId !== null) {\n      postBody['scopeId'] = opts.scopeId\n    }\n    if (opts.allowAddPolicy !== undefined && opts.allowAddPolicy !== null) {\n      postBody['allowAddPolicy'] = opts.allowAddPolicy\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      roleName: opts.roleName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call attachRolePolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/role/{roleName}:attachRolePolicy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为角色绑定策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.roleName - 角色名称\n      * @param {string} opts.policyName - 策略名称\n      * @param {string} [opts.scopeId] - 资源组id  optional\n      * @param {string} [opts.allowDetachAddPolicy] - 允许解除策略：&quot;Deny&quot; 不允许，Allow 允许，空情况默认允许，兼容历史数据  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  detachRolePolicy (opts, callback) {\n    opts = opts || {}\n\n    if (opts.roleName === undefined || opts.roleName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roleName' when calling detachRolePolicy\"\n      )\n    }\n    if (opts.policyName === undefined || opts.policyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyName' when calling detachRolePolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.policyName !== undefined && opts.policyName !== null) {\n      queryParams['policyName'] = opts.policyName\n    }\n    if (opts.scopeId !== undefined && opts.scopeId !== null) {\n      queryParams['scopeId'] = opts.scopeId\n    }\n    if (\n      opts.allowDetachAddPolicy !== undefined &&\n      opts.allowDetachAddPolicy !== null\n    ) {\n      queryParams['allowDetachAddPolicy'] = opts.allowDetachAddPolicy\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      roleName: opts.roleName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call detachRolePolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/role/{roleName}:detachRolePolicy',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询角色授权策略列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.roleName - 角色名称\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 每页显示数目[10~100] 默认50条  optional\n      * @param {string} [opts.keyword] - 关键字  optional\n      * @param {integer} opts.sort - 排序策略,0-按创建时间顺序排序  1-按创建时间倒序\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总数\n      * @param rolePolicy policies\n      */\n\n  describeRolePolicies (opts, callback) {\n    opts = opts || {}\n\n    if (opts.roleName === undefined || opts.roleName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roleName' when calling describeRolePolicies\"\n      )\n    }\n    if (opts.sort === undefined || opts.sort === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sort' when calling describeRolePolicies\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.keyword !== undefined && opts.keyword !== null) {\n      queryParams['keyword'] = opts.keyword\n    }\n    if (opts.sort !== undefined && opts.sort !== null) {\n      queryParams['sort'] = opts.sort\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      roleName: opts.roleName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRolePolicies with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/role/{roleName}/policies',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询角色授权策略列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.roleName - 角色名称\n      * @param {string} opts.policyID - 策略ID\n      * @param {string} [opts.filterBindResGroup] - 滤绑定策略资源组：&quot;Deny&quot; 不允许，Allow 允许，空情况默认不允许，兼容历史数据  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总数\n      * @param rolePolicy policies\n      */\n\n  describeRolePoliciesScope (opts, callback) {\n    opts = opts || {}\n\n    if (opts.roleName === undefined || opts.roleName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roleName' when calling describeRolePoliciesScope\"\n      )\n    }\n    if (opts.policyID === undefined || opts.policyID === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyID' when calling describeRolePoliciesScope\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.policyID !== undefined && opts.policyID !== null) {\n      queryParams['policyID'] = opts.policyID\n    }\n    if (\n      opts.filterBindResGroup !== undefined &&\n      opts.filterBindResGroup !== null\n    ) {\n      queryParams['filterBindResGroup'] = opts.filterBindResGroup\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      roleName: opts.roleName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRolePoliciesScope with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/role/{roleName}/policiesScope',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建子用户, &lt;br&gt;\n请访问&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/iam/subuser-management&quot;&gt;子用户管理&lt;/a&gt;了解更多 &lt;br&gt;\n\n      * @param {Object} opts - parameters\n      * @param {createSubUserInfo} opts.createSubUserInfo - 子用户信息\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param createSubUserRes subUser\n      */\n\n  createSubUser (opts, callback) {\n    opts = opts || {}\n\n    if (\n      opts.createSubUserInfo === undefined ||\n      opts.createSubUserInfo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createSubUserInfo' when calling createSubUser\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.createSubUserInfo !== undefined &&\n      opts.createSubUserInfo !== null\n    ) {\n      postBody['createSubUserInfo'] = opts.createSubUserInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSubUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUser',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子用户信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.subUser - 子用户名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subUser subUser\n      */\n\n  describeSubUser (opts, callback) {\n    opts = opts || {}\n\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling describeSubUser\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      subUser: opts.subUser\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUser/{subUser}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改子用户信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.subUser - 子用户名\n      * @param {updateSubUserInfo} opts.updateSubUserInfo - 子用户信息\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param createSubUserRes subUser\n      */\n\n  updateSubUser (opts, callback) {\n    opts = opts || {}\n\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling updateSubUser\"\n      )\n    }\n    if (\n      opts.updateSubUserInfo === undefined ||\n      opts.updateSubUserInfo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.updateSubUserInfo' when calling updateSubUser\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.updateSubUserInfo !== undefined &&\n      opts.updateSubUserInfo !== null\n    ) {\n      postBody['updateSubUserInfo'] = opts.updateSubUserInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      subUser: opts.subUser\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateSubUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUser/{subUser}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除子用户信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.subUser - 子用户名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSubUser (opts, callback) {\n    opts = opts || {}\n\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling deleteSubUser\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      subUser: opts.subUser\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSubUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUser/{subUser}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子用户列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码，默认1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认50，取值范围[10, 100]  optional\n      * @param {string} [opts.keyword] - 关键字  optional\n      * @param {integer} [opts.sort] - 排序规则：0-创建时间顺序排序，1-创建时间倒序排序  optional\n      * @param {string} [opts.phone] - 手机号，和keyword互斥，不要都传  optional\n      * @param {string} [opts.email] - 邮箱，和keyword互斥，不要都传  optional\n      * @param {string} [opts.description] - 用户姓名，和keyword互斥，不要都传  optional\n      * @param {string} [opts.nickName] - 子用户别名  optional\n      * @param {string} [opts.name] - 子用户姓名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subUser subUsers\n      * @param integer total\n      */\n\n  describeSubUsers (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.keyword !== undefined && opts.keyword !== null) {\n      queryParams['keyword'] = opts.keyword\n    }\n    if (opts.sort !== undefined && opts.sort !== null) {\n      queryParams['sort'] = opts.sort\n    }\n    if (opts.phone !== undefined && opts.phone !== null) {\n      queryParams['phone'] = opts.phone\n    }\n    if (opts.email !== undefined && opts.email !== null) {\n      queryParams['email'] = opts.email\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      queryParams['description'] = opts.description\n    }\n    if (opts.nickName !== undefined && opts.nickName !== null) {\n      queryParams['nickName'] = opts.nickName\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubUsers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUsers',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子用户所属的所有组\n      * @param {Object} opts - parameters\n      * @param {string} opts.subUser - 子用户名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param groupInfo groups\n      * @param integer total\n      */\n\n  describeSubUserGroups (opts, callback) {\n    opts = opts || {}\n\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling describeSubUserGroups\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      subUser: opts.subUser\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubUserGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUser/{subUser}/groups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子用户绑定的策略列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.subUser - 子用户名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总数\n      * @param policy policies\n      */\n\n  describeAttachedSubUserPolicies (opts, callback) {\n    opts = opts || {}\n\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling describeAttachedSubUserPolicies\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      subUser: opts.subUser\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAttachedSubUserPolicies with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUser/{subUser}/policies',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子用户绑定的策略对应资源组列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.subUser - 子用户名\n      * @param {string} opts.policyID - 策略ID\n      * @param {string} [opts.filterBindResGroup] - 滤绑定策略资源组：&quot;Deny&quot; 不允许，Allow 允许，空情况默认不允许，兼容历史数据  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总数\n      * @param resourceGroup policies\n      */\n\n  describeAttachedSubUserPoliciesScope (opts, callback) {\n    opts = opts || {}\n\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling describeAttachedSubUserPoliciesScope\"\n      )\n    }\n    if (opts.policyID === undefined || opts.policyID === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyID' when calling describeAttachedSubUserPoliciesScope\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.policyID !== undefined && opts.policyID !== null) {\n      queryParams['policyID'] = opts.policyID\n    }\n    if (\n      opts.filterBindResGroup !== undefined &&\n      opts.filterBindResGroup !== null\n    ) {\n      queryParams['filterBindResGroup'] = opts.filterBindResGroup\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      subUser: opts.subUser\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAttachedSubUserPoliciesScope with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUser/{subUser}/policiesScope',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为子用户解绑策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.subUser - 子用户名\n      * @param {string} opts.policyName - 策略名称\n      * @param {string} [opts.scopeId] - 资源组id  optional\n      * @param {string} [opts.allowDetachAddPolicy] - 允许解除策略：&quot;Deny&quot; 不允许，Allow 允许，空情况默认允许，兼容历史数据  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  detachSubUserPolicy (opts, callback) {\n    opts = opts || {}\n\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling detachSubUserPolicy\"\n      )\n    }\n    if (opts.policyName === undefined || opts.policyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyName' when calling detachSubUserPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.policyName !== undefined && opts.policyName !== null) {\n      queryParams['policyName'] = opts.policyName\n    }\n    if (opts.scopeId !== undefined && opts.scopeId !== null) {\n      queryParams['scopeId'] = opts.scopeId\n    }\n    if (\n      opts.allowDetachAddPolicy !== undefined &&\n      opts.allowDetachAddPolicy !== null\n    ) {\n      queryParams['allowDetachAddPolicy'] = opts.allowDetachAddPolicy\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      subUser: opts.subUser\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call detachSubUserPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUser/{subUser}:detachSubUserPolicy',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为子用户绑定策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.subUser - 子用户名\n      * @param {string} opts.policyName - 策略名称\n      * @param {string} [opts.scopeId] - 资源组id  optional\n      * @param {string} [opts.allowAddPolicy] - 允许添加策略绑定：&quot;Deny&quot; 不允许，Allow 允许，空情况默认允许，兼容历史数据  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  attachSubUserPolicy (opts, callback) {\n    opts = opts || {}\n\n    if (opts.subUser === undefined || opts.subUser === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subUser' when calling attachSubUserPolicy\"\n      )\n    }\n    if (opts.policyName === undefined || opts.policyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyName' when calling attachSubUserPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.policyName !== undefined && opts.policyName !== null) {\n      postBody['policyName'] = opts.policyName\n    }\n    if (opts.scopeId !== undefined && opts.scopeId !== null) {\n      postBody['scopeId'] = opts.scopeId\n    }\n    if (opts.allowAddPolicy !== undefined && opts.allowAddPolicy !== null) {\n      postBody['allowAddPolicy'] = opts.allowAddPolicy\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      subUser: opts.subUser\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call attachSubUserPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUser/{subUser}:attachSubUserPolicy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建子用户, &lt;br&gt;\n请访问&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/iam/subuser-management&quot;&gt;子用户管理&lt;/a&gt;了解更多 &lt;br&gt;\n\n      * @param {Object} opts - parameters\n      * @param {createSubUserInfoInner} opts.createSubUserInfo - 子用户信息\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param createSubUserRes subUser\n      */\n\n  createSubUserInner (opts, callback) {\n    opts = opts || {}\n\n    if (\n      opts.createSubUserInfo === undefined ||\n      opts.createSubUserInfo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createSubUserInfo' when calling createSubUserInner\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.createSubUserInfo !== undefined &&\n      opts.createSubUserInfo !== null\n    ) {\n      postBody['createSubUserInfo'] = opts.createSubUserInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSubUserInner with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/subUserInner',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询主账号AccessKey列表 &lt;br&gt;\n关于AccessKey的介绍和使用，请参考 &lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/account-management/accesskey-management&quot;&gt;Accesskey管理&lt;/a&gt; &lt;br&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param userAccessKey userAccessKeys\n      */\n\n  describeUserAccessKeys (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeUserAccessKeys\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUserAccessKeys with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/userAccessKeys',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建主账号AccessKey, &lt;br&gt; 最多可创建5个\n\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createUserAccessKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createUserAccessKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createUserAccessKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/userAccessKey',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用主账号AccessKey, &lt;br&gt; 启用后accessKey的状态变成 1 &lt;b&gt;启用&lt;/b&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessKey - accessKey\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enabledUserAccessKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enabledUserAccessKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessKey === undefined || opts.accessKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKey' when calling enabledUserAccessKey\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessKey: opts.accessKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enabledUserAccessKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/userAccessKey/{accessKey}:enabled',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用主账号AccessKey, &lt;br&gt; 禁用后accessKey的状态变成 0 &lt;b&gt;禁用&lt;/b&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessKey - accessKey\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disabledUserAccessKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disabledUserAccessKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessKey === undefined || opts.accessKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKey' when calling disabledUserAccessKey\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessKey: opts.accessKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disabledUserAccessKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/userAccessKey/{accessKey}:disabled',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除主账号AccessKey, &lt;br&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessKey - accessKey\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteUserAccessKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteUserAccessKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.accessKey === undefined || opts.accessKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKey' when calling deleteUserAccessKey\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      accessKey: opts.accessKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteUserAccessKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/userAccessKey/{accessKey}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据AccessKey或者AccountId获取用户Pin\n      * @param {Object} opts - parameters\n      * @param {string} [opts.accessKey] - 用户accessKey  optional\n      * @param {string} [opts.accountId] - 用户唯一id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string pin  用户pin，如果是子账号，则格式为主账号pin @ 子账号pin\n      */\n\n  describeUserPin (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeUserPin\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.accessKey !== undefined && opts.accessKey !== null) {\n      queryParams['accessKey'] = opts.accessKey\n    }\n    if (opts.accountId !== undefined && opts.accountId !== null) {\n      queryParams['accountId'] = opts.accountId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iam/0.3.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUserPin with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/user:describeUserPin',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = IAM\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/ias/v1/ias.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * JDCLOUD IAS Services API\n * 京东云联合登陆Api\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ias'\nService._services[serviceId] = true\n\n/**\n * ias service.\n * @version 0.2.1\n */\n\nJDCloud.IAS = class IAS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'ias.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  运营后台查询app\n      * @param {Object} opts - parameters\n      * @param {string} opts.pin - pin\n      * @param {string} opts.appName - appName\n      * @param {string} opts.clientId - clientId\n      * @param {boolean} opts.multiTenant - multiTenant\n      * @param {string} opts.state - state\n      * @param {string} opts.scope - scope\n      * @param {integer} opts.startTime - startTime\n      * @param {integer} opts.endTime - endTime\n      * @param {string} opts.accountType - accountType\n      * @param {integer} opts.pageIndex - pageIndex\n      * @param {integer} opts.pageSize - pageSize\n      * @param {integer} opts.offset - offset\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination\n      * @param appQueryResultItem result\n      */\n\n  apps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  apps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pin === undefined || opts.pin === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pin' when calling apps\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling apps\"\n      )\n    }\n    if (opts.clientId === undefined || opts.clientId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clientId' when calling apps\"\n      )\n    }\n    if (opts.multiTenant === undefined || opts.multiTenant === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.multiTenant' when calling apps\"\n      )\n    }\n    if (opts.state === undefined || opts.state === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.state' when calling apps\"\n      )\n    }\n    if (opts.scope === undefined || opts.scope === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.scope' when calling apps\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling apps\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling apps\"\n      )\n    }\n    if (opts.accountType === undefined || opts.accountType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountType' when calling apps\"\n      )\n    }\n    if (opts.pageIndex === undefined || opts.pageIndex === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageIndex' when calling apps\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling apps\"\n      )\n    }\n    if (opts.offset === undefined || opts.offset === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.offset' when calling apps\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.clientId !== undefined && opts.clientId !== null) {\n      queryParams['clientId'] = opts.clientId\n    }\n    if (opts.multiTenant !== undefined && opts.multiTenant !== null) {\n      queryParams['multiTenant'] = opts.multiTenant\n    }\n    if (opts.state !== undefined && opts.state !== null) {\n      queryParams['state'] = opts.state\n    }\n    if (opts.scope !== undefined && opts.scope !== null) {\n      queryParams['scope'] = opts.scope\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.accountType !== undefined && opts.accountType !== null) {\n      queryParams['accountType'] = opts.accountType\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.offset !== undefined && opts.offset !== null) {\n      queryParams['offset'] = opts.offset\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ias/0.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call apps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/operate_backend/apps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  运营后台获取应用详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.clientId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string clientId  应用\n      * @param string clientName  应用名\n      * @param string tokenEndpointAuthMethod  tokenEndpointAuthMethod\n      * @param string grantTypes  grantTypes\n      * @param string responseTypes  responseTypes\n      * @param string redirectUris  redirectUris\n      * @param string clientUri  clientUri\n      * @param string logoUri  logoUri\n      * @param string tosUri  tosUri\n      * @param string policyUri  policyUri\n      * @param string scope  scope\n      * @param string jwksUri  jwksUri\n      * @param string jwks  jwks\n      * @param string contacts  contacts\n      * @param string extension  extension\n      * @param integer accessTokenValiditySeconds  accessTokenValiditySeconds\n      * @param integer refreshTokenValiditySeconds  refreshTokenValiditySeconds\n      * @param boolean multiTenant  multiTenant\n      * @param integer secretUpdateTime  secretUpdateTime\n      * @param integer updateTime  updateTime\n      * @param integer createTime  createTime\n      * @param string account  account\n      * @param string userType  userType\n      * @param string state  state\n      */\n\n  appDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  appDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clientId === undefined || opts.clientId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clientId' when calling appDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      clientId: opts.clientId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ias/0.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call appDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/operate_backend/app/{clientId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  运营后台获取应用状态\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param state states\n      */\n\n  state (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  state\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ias/0.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call state with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/operate_backend/state',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建应用\n      * @param {Object} opts - parameters\n      * @param {string} [opts.clientName] - 应用名  optional\n      * @param {string} [opts.tokenEndpointAuthMethod] - 客户端认证方式&lt;br&gt; - none：不设置客户端密码（不推荐）&lt;br&gt; - client_secret_post：客户端必须设置密码，且该密码需要在OAuth2 Token Endpoint提供于请求的body&lt;br&gt; - client_secret_basic：客户端必须设置密码，且该密码需要在OAuth2 Token Endpoint提供于请求的header&lt;br&gt; 支持以下值：&lt;br&gt; （1）none&lt;br&gt; （2）client_secret_post&lt;br&gt; （3）client_secret_basic  optional\n      * @param {string} [opts.grantTypes] - 支持的OAuth类型：&lt;br&gt; - authorization_code：OAuth2授权码模式&lt;br&gt; - implicit：OAuth2隐式授权模式&lt;br&gt; - refresh_token：启用刷新令牌 支持以下值：&lt;br&gt; （1）authorization_code&lt;br&gt; （2）authorization_code,refresh_token&lt;br&gt; （3）authorization_code,implicit&lt;br&gt; （4）authorization_code,implicit,refresh_token&lt;br&gt; （5）implicit&lt;br&gt; 注：如果grantTypes指定了refresh_token，应用将可以使用刷新令牌；如果在创建应用时未指定，则应用不能使用刷新令牌；任何时候应用都可以调用“更新应用”接口更改grantTypes设置  optional\n      * @param {string} [opts.redirectUris] - 回调地址，最多4个，多个url之间用逗号,分隔，每个url长度不超过1000，url不支持#符号  optional\n      * @param {string} [opts.clientUri] - 应用介绍地址，url不支持#符号  optional\n      * @param {string} [opts.logoUri] - 应用logo地址，url不支持#符号  optional\n      * @param {string} [opts.tosUri] - 应用服务协议地址，url不支持#符号  optional\n      * @param {string} [opts.policyUri] - 应用隐私政策地址，url不支持#符号  optional\n      * @param {string} [opts.scope] - OAuth scope范围，支持的值为：&lt;br/&gt; （1）openid：用OpenID Connect协议进行身份认证&lt;br/&gt; 指定scope为openid，并在Authorization Endpoint请求该scope，京东云将返回用户的OpenID令牌；如果在创建应用时未指明该值，则应用不能请求OpenID令牌；任何时候应用都可以调用“更新应用”更改该设置  optional\n      * @param {string} [opts.jwksUri] - JWKS地址，url不支持#符号&lt;br/&gt;jwksUri和jwks传一个即可  optional\n      * @param {string} [opts.jwks] - JWKS  optional\n      * @param {string} [opts.contacts] - 应用联系信息  optional\n      * @param {string} [opts.extension] - 应用扩展信息  optional\n      * @param {integer} [opts.accessTokenValiditySeconds] - 访问令牌有效期，值的范围为 600 秒到 6x3600&#x3D;21,600 秒，即10分钟-6小时  optional\n      * @param {integer} [opts.refreshTokenValiditySeconds] - 刷新令牌有效期，值的范围为 30x24x3600&#x3D;2,592,000 秒到 365x24x3600&#x3D;31,536,000 秒，即30天-365天&lt;br/&gt;&lt;br/&gt; 注：当 GrantTypes 包含 refresh_token 时，refreshTokenValiditySeconds 为必传参数  optional\n      * @param {boolean} [opts.multiTenant] - 是否为多租户应用&lt;br/&gt; &quot;false&quot;：该应用仅支持当前创建应用的租户访问，其他京东云租户无法访问&lt;br/&gt;        &quot;true&quot;：该应用支持其他京东云租户访问，但当前创建应用的租户不能访问  optional\n      * @param {string} [opts.secret] - 应用的密码，支持8-255位长度的ASCII可打印字符，建议使用足够复杂的密码策略&lt;br/&gt;&lt;br/&gt;        注：当TokenEndpointAuthMethod不等于none时，secret为必传参数；反之，当指定了secret时，TokenEndpointAuthMethod不能等于none&lt;br/&gt;京东云将不可逆加密secret，因此您无法再次从京东云查看该密码，但您可以随时通过更新应用重新设置secret  optional\n      * @param {string} [opts.userType] - 能访问应用的账号类型，支持以下值：&lt;br/&gt; （1）root：支持主账号访问，子用户无法访问&lt;br/&gt; （2）sub：子用户账号，使用主账号不能访问&lt;br/&gt;&lt;br/&gt; 注：multiTenant和userType的组合指定了应用的用户人群，典型的应用场景如：&lt;br/&gt; （1）应用向当前租户下的子用户开放（2）应用向京东云其他租户主账号开放  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string clientId  应用ID，由京东云分配的16位数字ID\n      * @param string clientName  clientName参数值\n      * @param string tokenEndpointAuthMethod  tokenEndpointAuthMethod参数值\n      * @param string grantTypes  grantTypes参数值\n      * @param string responseTypes  当grantTypes为authorization_code时，responseTypes为code；当grantTypes为implicit时，responseTypes为token\n      * @param string redirectUris  redirectUris参数值\n      * @param string clientUri  clientUri参数值\n      * @param string logoUri  logoUri参数值\n      * @param string tosUri  tosUri参数值\n      * @param string policyUri  policyUri参数值\n      * @param string scope  scope参数值\n      * @param string jwksUri  jwksUri参数值\n      * @param string jwks  jwks参数值\n      * @param string contacts  contacts参数值\n      * @param string extension  extension参数值\n      * @param integer accessTokenValiditySeconds  accessTokenValiditySeconds参数值\n      * @param integer refreshTokenValiditySeconds  refreshTokenValiditySeconds参数值\n      * @param boolean multiTenant  multiTenant参数值\n      * @param integer secretUpdateTime  secretUpdateTime参数值\n      * @param integer updateTime  updateTime参数值\n      * @param integer createTime  createTime参数值\n      * @param string account  创建应用的账户用户名\n      * @param string userType  userType参数值\n      */\n\n  createApp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createApp\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.clientName !== undefined && opts.clientName !== null) {\n      postBody['clientName'] = opts.clientName\n    }\n    if (\n      opts.tokenEndpointAuthMethod !== undefined &&\n      opts.tokenEndpointAuthMethod !== null\n    ) {\n      postBody['tokenEndpointAuthMethod'] = opts.tokenEndpointAuthMethod\n    }\n    if (opts.grantTypes !== undefined && opts.grantTypes !== null) {\n      postBody['grantTypes'] = opts.grantTypes\n    }\n    if (opts.redirectUris !== undefined && opts.redirectUris !== null) {\n      postBody['redirectUris'] = opts.redirectUris\n    }\n    if (opts.clientUri !== undefined && opts.clientUri !== null) {\n      postBody['clientUri'] = opts.clientUri\n    }\n    if (opts.logoUri !== undefined && opts.logoUri !== null) {\n      postBody['logoUri'] = opts.logoUri\n    }\n    if (opts.tosUri !== undefined && opts.tosUri !== null) {\n      postBody['tosUri'] = opts.tosUri\n    }\n    if (opts.policyUri !== undefined && opts.policyUri !== null) {\n      postBody['policyUri'] = opts.policyUri\n    }\n    if (opts.scope !== undefined && opts.scope !== null) {\n      postBody['scope'] = opts.scope\n    }\n    if (opts.jwksUri !== undefined && opts.jwksUri !== null) {\n      postBody['jwksUri'] = opts.jwksUri\n    }\n    if (opts.jwks !== undefined && opts.jwks !== null) {\n      postBody['jwks'] = opts.jwks\n    }\n    if (opts.contacts !== undefined && opts.contacts !== null) {\n      postBody['contacts'] = opts.contacts\n    }\n    if (opts.extension !== undefined && opts.extension !== null) {\n      postBody['extension'] = opts.extension\n    }\n    if (\n      opts.accessTokenValiditySeconds !== undefined &&\n      opts.accessTokenValiditySeconds !== null\n    ) {\n      postBody['accessTokenValiditySeconds'] = opts.accessTokenValiditySeconds\n    }\n    if (\n      opts.refreshTokenValiditySeconds !== undefined &&\n      opts.refreshTokenValiditySeconds !== null\n    ) {\n      postBody['refreshTokenValiditySeconds'] = opts.refreshTokenValiditySeconds\n    }\n    if (opts.multiTenant !== undefined && opts.multiTenant !== null) {\n      postBody['multiTenant'] = opts.multiTenant\n    }\n    if (opts.secret !== undefined && opts.secret !== null) {\n      postBody['secret'] = opts.secret\n    }\n    if (opts.userType !== undefined && opts.userType !== null) {\n      postBody['userType'] = opts.userType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ias/0.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createApp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/app',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取应用\n      * @param {Object} opts - parameters\n      * @param {string} opts.clientId - 应用ID，应用创建时由京东云分配的16位数字ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string clientId  应用ID，由京东云分配的16位数字ID\n      * @param string clientName  应用名\n      * @param string tokenEndpointAuthMethod  客户端认证方式\n      * @param string grantTypes  支持的OAuth类型\n      * @param string responseTypes  当grantTypes为authorization_code时，responseTypes为code；当grantTypes为implicit时，responseTypes为token\n      * @param string redirectUris  回调地址\n      * @param string clientUri  应用介绍地址\n      * @param string logoUri  应用logo地址\n      * @param string tosUri  应用服务协议地址\n      * @param string policyUri  应用隐私条款地址\n      * @param string scope  OAuth scope授权范围\n      * @param string jwksUri  JWKS地址\n      * @param string jwks  JWKS\n      * @param string contacts  应用联系信息\n      * @param string extension  应用扩展信息\n      * @param integer accessTokenValiditySeconds  访问令牌有效期\n      * @param integer refreshTokenValiditySeconds  刷新令牌有效期\n      * @param boolean multiTenant  是否为多租户应用\n      * @param integer secretUpdateTime  应用密码更新时间\n      * @param integer updateTime  应用更新时间\n      * @param integer createTime  应用创建时间\n      * @param string account  创建应用的账户用户名\n      * @param string userType  允许登录应用的账号类型\n      */\n\n  getApp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getApp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clientId === undefined || opts.clientId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clientId' when calling getApp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      clientId: opts.clientId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ias/0.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getApp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/app/{clientId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新应用（只传需要变更的参数，不传的参数不会更新）\n      * @param {Object} opts - parameters\n      * @param {string} opts.clientId - 应用ID，应用创建时由京东云分配的16位数字ID\n      * @param {string} [opts.clientName] - 应用名  optional\n      * @param {string} [opts.tokenEndpointAuthMethod] - 客户端认证方式：&lt;br/&gt; none：不设置客户端密码（不推荐）&lt;br/&gt; client_secret_post：客户端必须设置密码，且该密码需要在OAuth2 Token Endpoint提供于请求的body&lt;br/&gt; client_secret_basic：客户端必须设置密码，且该密码需要在OAuth2 Token Endpoint提供于请求的header&lt;br/&gt;&lt;br/&gt; 支持以下值：&lt;br/&gt; （1）none&lt;br/&gt; （2）client_secret_post&lt;br/&gt; （3）client_secret_basic  optional\n      * @param {string} [opts.grantTypes] - 支持的OAuth类型：&lt;br/&gt; authorization_code：OAuth2授权码模式&lt;br/&gt; implicit：OAuth2隐式授权模式&lt;br/&gt; refresh_token：启用刷新令牌&lt;br/&gt;&lt;br/&gt; 支持以下值：&lt;br/&gt; （1）authorization_code&lt;br/&gt; （2）authorization_code,refresh_token&lt;br/&gt; （3）authorization_code,implicit&lt;br/&gt; （4）authorization_code,implicit,refresh_token&lt;br/&gt; （5）implicit&lt;br/&gt;&lt;br/&gt;        注：如果grantTypes指定了refresh_token，应用将可以使用刷新令牌；如果在创建应用时未指定，则应用不能使用刷新令牌；任何时候应用都可以调用“更新应用”接口更改grantTypes设置  optional\n      * @param {string} [opts.redirectUris] - 回调地址，最多4个，多个url之间用逗号,分隔，每个url长度不超过1000，url不支持#符号  optional\n      * @param {string} [opts.clientUri] - 应用介绍地址，url不支持#符号  optional\n      * @param {string} [opts.logoUri] - 应用logo地址，url不支持#符号  optional\n      * @param {string} [opts.tosUri] - 应用服务协议地址，url不支持#符号  optional\n      * @param {string} [opts.policyUri] - 应用隐私政策地址，url不支持#符号  optional\n      * @param {string} [opts.scope] - OAuth scope范围，支持的值为：&lt;br/&gt; （1）openid：用OpenID Connect协议进行身份认证&lt;br/&gt; 指定scope为openid，并在Authorization Endpoint请求该scope，京东云将返回用户的OpenID令牌；如果在创建应用时未指明该值，则应用不能请求OpenID令牌；任何时候应用都可以调用“更新应用”更改该设置  optional\n      * @param {string} [opts.jwksUri] - JWKS地址，url不支持#符号&lt;br/&gt; jwksUri和jwks传一个即可  optional\n      * @param {string} [opts.jwks] - JWKS  optional\n      * @param {string} [opts.contacts] - 应用联系信息  optional\n      * @param {string} [opts.extension] - 应用扩展信息  optional\n      * @param {integer} [opts.accessTokenValiditySeconds] - 访问令牌有效期，值的范围为 600 秒到 6x3600&#x3D;21,600 秒，即10分钟-6小时  optional\n      * @param {integer} [opts.refreshTokenValiditySeconds] - 刷新令牌有效期，值的范围为 30x24x3600&#x3D;2,592,000 秒到 365x24x3600&#x3D;31,536,000 秒，即30天-365天&lt;br/&gt;&lt;br/&gt; 注：当 GrantTypes 包含 refresh_token 时，refreshTokenValiditySeconds 为必传参数  optional\n      * @param {boolean} [opts.multiTenant] - 是否为多租户应用&lt;br/&gt; &quot;false&quot;：该应用仅支持当前创建应用的租户访问，其他京东云租户无法访问&lt;br/&gt;        &quot;true&quot;：该应用支持其他京东云租户访问，但当前创建应用的租户不能访问  optional\n      * @param {string} [opts.secret] - 应用的密码，支持8-255位长度的ASCII可打印字符，建议使用足够复杂的密码策略&lt;br/&gt;&lt;br/&gt; 注：当TokenEndpointAuthMethod不等于none时，secret为必传参数；反之，当指定了secret时，TokenEndpointAuthMethod不能等于none&lt;br/&gt; 京东云将不可逆加密secret，因此您无法再次从京东云查看该密码，但您可以随时通过更新应用重新设置secret  optional\n      * @param {string} [opts.userType] - 能访问应用的账号类型，支持以下值：&lt;br/&gt; （1）root：支持主账号访问，子用户无法访问&lt;br/&gt; （2）sub：子用户账号，使用主账号不能访问&lt;br/&gt;&lt;br/&gt; 注：multiTenant和userType的组合指定了应用的用户人群，典型的应用场景如：&lt;br/&gt; （1）应用向当前租户下的子用户开放（2）应用向京东云其他租户主账号开放  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string clientId  应用ID，由京东云分配的16位数字ID\n      * @param string clientName  clientName参数值\n      * @param string tokenEndpointAuthMethod  tokenEndpointAuthMethod参数值\n      * @param string grantTypes  grantTypes参数值\n      * @param string responseTypes  当grantTypes为authorization_code时，responseTypes为code；当grantTypes为implicit时，responseTypes为token\n      * @param string redirectUris  redirectUris参数值\n      * @param string clientUri  clientUri参数值\n      * @param string logoUri  logoUri参数值\n      * @param string tosUri  tosUri参数值\n      * @param string policyUri  policyUri参数值\n      * @param string scope  scope参数值\n      * @param string jwksUri  jwksUri参数值\n      * @param string jwks  jwks参数值\n      * @param string contacts  contacts参数值\n      * @param string extension  extension参数值\n      * @param integer accessTokenValiditySeconds  accessTokenValiditySeconds参数值\n      * @param integer refreshTokenValiditySeconds  refreshTokenValiditySeconds参数值\n      * @param boolean multiTenant  multiTenant参数值\n      * @param integer secretUpdateTime  secretUpdateTime参数值\n      * @param integer updateTime  updateTime参数值\n      * @param integer createTime  createTime参数值\n      * @param string account  创建应用的账户用户名\n      * @param string userType  userType参数值\n      */\n\n  updateApp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateApp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clientId === undefined || opts.clientId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clientId' when calling updateApp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientName !== undefined && opts.clientName !== null) {\n      postBody['clientName'] = opts.clientName\n    }\n    if (\n      opts.tokenEndpointAuthMethod !== undefined &&\n      opts.tokenEndpointAuthMethod !== null\n    ) {\n      postBody['tokenEndpointAuthMethod'] = opts.tokenEndpointAuthMethod\n    }\n    if (opts.grantTypes !== undefined && opts.grantTypes !== null) {\n      postBody['grantTypes'] = opts.grantTypes\n    }\n    if (opts.redirectUris !== undefined && opts.redirectUris !== null) {\n      postBody['redirectUris'] = opts.redirectUris\n    }\n    if (opts.clientUri !== undefined && opts.clientUri !== null) {\n      postBody['clientUri'] = opts.clientUri\n    }\n    if (opts.logoUri !== undefined && opts.logoUri !== null) {\n      postBody['logoUri'] = opts.logoUri\n    }\n    if (opts.tosUri !== undefined && opts.tosUri !== null) {\n      postBody['tosUri'] = opts.tosUri\n    }\n    if (opts.policyUri !== undefined && opts.policyUri !== null) {\n      postBody['policyUri'] = opts.policyUri\n    }\n    if (opts.scope !== undefined && opts.scope !== null) {\n      postBody['scope'] = opts.scope\n    }\n    if (opts.jwksUri !== undefined && opts.jwksUri !== null) {\n      postBody['jwksUri'] = opts.jwksUri\n    }\n    if (opts.jwks !== undefined && opts.jwks !== null) {\n      postBody['jwks'] = opts.jwks\n    }\n    if (opts.contacts !== undefined && opts.contacts !== null) {\n      postBody['contacts'] = opts.contacts\n    }\n    if (opts.extension !== undefined && opts.extension !== null) {\n      postBody['extension'] = opts.extension\n    }\n    if (\n      opts.accessTokenValiditySeconds !== undefined &&\n      opts.accessTokenValiditySeconds !== null\n    ) {\n      postBody['accessTokenValiditySeconds'] = opts.accessTokenValiditySeconds\n    }\n    if (\n      opts.refreshTokenValiditySeconds !== undefined &&\n      opts.refreshTokenValiditySeconds !== null\n    ) {\n      postBody['refreshTokenValiditySeconds'] = opts.refreshTokenValiditySeconds\n    }\n    if (opts.multiTenant !== undefined && opts.multiTenant !== null) {\n      postBody['multiTenant'] = opts.multiTenant\n    }\n    if (opts.secret !== undefined && opts.secret !== null) {\n      postBody['secret'] = opts.secret\n    }\n    if (opts.userType !== undefined && opts.userType !== null) {\n      postBody['userType'] = opts.userType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      clientId: opts.clientId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ias/0.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateApp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/app/{clientId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除应用\n      * @param {Object} opts - parameters\n      * @param {string} opts.clientId - 应用ID，应用创建时由京东云分配的16位数字ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer count  删除结果[1:删除成功,0:删除失败]\n      */\n\n  deleteApp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteApp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clientId === undefined || opts.clientId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clientId' when calling deleteApp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      clientId: opts.clientId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ias/0.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteApp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/app/{clientId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取账户下所有应用\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param applicationRes apps\n      */\n\n  getApps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getApps\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ias/0.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getApps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/apps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.IAS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/industrydata/v1/industrydata.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 大屏数据查询接口\n * 陕西苹果大屏数据查询接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'industrydata'\nService._services[serviceId] = true\n\n/**\n * industrydata service.\n * @version 1.0.0\n */\n\nJDCloud.INDUSTRYDATA = class INDUSTRYDATA extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'industrydata.cn-south-1.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  根据区域、行业、一级指标、二级指标、起始时间等条件查询数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.region - 查询区域，比如某某省或某某市（可选区域以最终授权为准）\n      * @param {string} opts.industry - 查询行业，比如某个水果或者农作物（可选行业以最终授权为准）\n      * @param {string} opts.startDate - 查询起始时间，格式如下：yyyy-MM-dd\n      * @param {string} opts.endDate - 查询结束时间，格式如下：yyyy-MM-dd\n      * @param {string} opts.firstIndex - 数据对应的第一级分析指标（可选一级指标以最终授权为准）\n      * @param {string} [opts.secondIndex] - 数据对应的第二级分析指标，如不填写，则默认把一级指标下的所有二级指标都查询出来（可选二级指标以最终授权为准）  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  true为成功，false为失败\n      * @param string message  描述信息\n      * @param regionIndustryDataList data  查询数据结果\n      */\n\n  getLargeScreenData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getLargeScreenData\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.region === undefined || opts.region === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.region' when calling getLargeScreenData\"\n      )\n    }\n    if (opts.industry === undefined || opts.industry === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.industry' when calling getLargeScreenData\"\n      )\n    }\n    if (opts.startDate === undefined || opts.startDate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startDate' when calling getLargeScreenData\"\n      )\n    }\n    if (opts.endDate === undefined || opts.endDate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endDate' when calling getLargeScreenData\"\n      )\n    }\n    if (opts.firstIndex === undefined || opts.firstIndex === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.firstIndex' when calling getLargeScreenData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.region !== undefined && opts.region !== null) {\n      queryParams['region'] = opts.region\n    }\n    if (opts.industry !== undefined && opts.industry !== null) {\n      queryParams['industry'] = opts.industry\n    }\n    if (opts.startDate !== undefined && opts.startDate !== null) {\n      queryParams['startDate'] = opts.startDate\n    }\n    if (opts.endDate !== undefined && opts.endDate !== null) {\n      queryParams['endDate'] = opts.endDate\n    }\n    if (opts.firstIndex !== undefined && opts.firstIndex !== null) {\n      queryParams['firstIndex'] = opts.firstIndex\n    }\n    if (opts.secondIndex !== undefined && opts.secondIndex !== null) {\n      queryParams['secondIndex'] = opts.secondIndex\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  industrydata/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getLargeScreenData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/getData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.INDUSTRYDATA\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/instancevoucher/v1/instancevoucher.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Instance-Voucher\n * 实例抵扣券相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'instancevoucher'\nService._services[serviceId] = true\n\n/**\n * instancevoucher service.\n * @version 0.0.3\n */\n\nclass INSTANCEVOUCHER extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'instancevoucher.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询实例规格信息列表\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.resourceType] - 产品类型 支持[vm, nativecontainer, pod]，默认为vm  optional\n      * @param {string} [opts.reservedType] - 资源分配方式，支持[nonReserved]  optional\n      * @param {filter} [opts.filters] - Filter names: (仅支持eq)\ninstanceType - 实例规格，精确匹配，支持多个\ninstanceTypeFamily - 实例规格族，精确匹配，支持多个\naz - 可用区，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceVoucherType instanceVoucherTypes\n      */\n\n  describeInstanceVoucherTypes (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceVoucherTypes\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceType !== undefined && opts.resourceType !== null) {\n      queryParams['resourceType'] = opts.resourceType\n    }\n    if (opts.reservedType !== undefined && opts.reservedType !== null) {\n      queryParams['reservedType'] = opts.reservedType\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  instancevoucher/0.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceVoucherTypes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceVoucherTypes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询配额\n\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - Filter names: (仅支持eq)\nresourceType - 产品类型，精确匹配，支持多个 支持[vm, nativecontainer, pod]\nreservedType - 资源分配方式，精确匹配，支持多个 支持[nonReserved]\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quotas\n      */\n\n  describeQuotas (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuotas\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  instancevoucher/0.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuotas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/quotas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询实例抵扣券的详细信息&lt;br&gt;\n此接口支持分页查询，默认每页20条。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - Filter names: (仅支持eq)\ninstanceVoucherId - 实例ID，精确匹配，支持多个\nname - 实例名称，模糊匹配，支持多个\nresourceType - 产品类型，精确匹配，支持多个 支持[vm nativecontainer pod]\nreservedType - 资源分配方式，精确匹配，支持多个 支持[nonReserved]\nstatus - 实例抵扣券状态，精确匹配，支持多个\ninstanceTypeFamily - 实例规格族，精确匹配，支持多个（适用于非预留型）\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceVoucher instanceVouchers\n      * @param integer totalCount\n      */\n\n  describeInstanceVouchers (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceVouchers\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  instancevoucher/0.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceVouchers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceVouchers',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建实例抵扣券\n\n      * @param {Object} opts - parameters\n      * @param {instanceVoucherSpec} opts.instanceVoucherSpec - 创建实例抵扣券规格\n      * @param {string} [opts.clientToken] - 保证请求幂等性  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceVoucherId  实例抵扣券 ID\n      */\n\n  createInstanceVoucher (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstanceVoucher\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.instanceVoucherSpec === undefined ||\n      opts.instanceVoucherSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceVoucherSpec' when calling createInstanceVoucher\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.instanceVoucherSpec !== undefined &&\n      opts.instanceVoucherSpec !== null\n    ) {\n      postBody['instanceVoucherSpec'] = opts.instanceVoucherSpec\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  instancevoucher/0.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstanceVoucher with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceVouchers',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例抵扣券的详细信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceVoucherId - 实例抵扣券 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceVoucher instanceVoucher\n      */\n\n  describeInstanceVoucher (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceVoucher\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.instanceVoucherId === undefined ||\n      opts.instanceVoucherId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceVoucherId' when calling describeInstanceVoucher\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceVoucherId: opts.instanceVoucherId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  instancevoucher/0.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceVoucher with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceVouchers/{instanceVoucherId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除实例抵扣券\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceVoucherId - 实例抵扣券 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteInstanceVoucher (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstanceVoucher\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.instanceVoucherId === undefined ||\n      opts.instanceVoucherId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceVoucherId' when calling deleteInstanceVoucher\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceVoucherId: opts.instanceVoucherId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  instancevoucher/0.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstanceVoucher with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceVouchers/{instanceVoucherId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例抵扣券的 名称 和 描述。&lt;br&gt;\nname 和 description 必须要指定一个\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceVoucherId - 实例抵扣券 ID\n      * @param {string} [opts.name] - 实例抵扣券名称  optional\n      * @param {string} [opts.description] - 实例抵扣券描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceVoucherAttribute (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceVoucherAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.instanceVoucherId === undefined ||\n      opts.instanceVoucherId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceVoucherId' when calling modifyInstanceVoucherAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceVoucherId: opts.instanceVoucherId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  instancevoucher/0.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceVoucherAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceVouchers/{instanceVoucherId}:modifyInstanceVoucherAttribute',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = INSTANCEVOUCHER\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/invoice/v2/invoice.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * JDCLOUD Invoice API\n * 京东云发票\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'invoice'\nService._services[serviceId] = true\n\n/**\n * invoice service.\n * @version 0.4.11\n */\n\nclass INVOICE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'ivoice.jdcloud-api.com'\n    options.basePath = '/v2' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询发票邮寄地址列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.pin] - 用户pin(运营后台必传)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param postAddress addresses\n      */\n\n  describeAddresses (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAddresses\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAddresses with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/addresses',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取集团级联地址列表\n      * @param {Object} opts - parameters\n      * @param {integer} opts.parentId\n      * @param {string} [opts.pin] - 用户pin  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param area addresses\n      */\n\n  describeChildrenArea (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeChildrenArea\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.parentId === undefined || opts.parentId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parentId' when calling describeChildrenArea\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      parentId: opts.parentId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeChildrenArea with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/areas/{parentId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询发票邮寄地址详情\n      * @param {Object} opts - parameters\n      * @param {integer} opts.id\n      * @param {string} [opts.pin] - 用户pin(运营后台必传)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer id  id\n      * @param string name  收件人姓名\n      * @param string phone  收件人电话\n      * @param string province  省\n      * @param string city  市\n      * @param string county  区\n      * @param string town  县\n      * @param string address  邮编\n      * @param integer isDefault  是否默认收货地址\n      * @param string updateTime  更新时间\n      * @param string pin  用户pin\n      * @param string createTime  创建时间\n      * @param string zipCode  邮编\n      * @param integer provinceId  省id\n      * @param integer cityId  市id\n      * @param integer countyId  区县id\n      * @param integer townId  乡镇id\n      */\n\n  describeAddress (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAddress\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling describeAddress\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAddress with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/address/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改发票邮寄地址\n      * @param {Object} opts - parameters\n      * @param {integer} opts.id\n      * @param {integer} [opts.id] - id  optional\n      * @param {string} [opts.name] - 收件人姓名  optional\n      * @param {string} [opts.phone] - 收件人电话  optional\n      * @param {string} [opts.province] - 省  optional\n      * @param {string} [opts.city] - 市  optional\n      * @param {string} [opts.county] - 区  optional\n      * @param {string} [opts.town] - 县  optional\n      * @param {string} [opts.address] - 邮编  optional\n      * @param {integer} [opts.isDefault] - 是否默认收货地址  optional\n      * @param {string} [opts.updateTime] - 更新时间  optional\n      * @param {string} [opts.pin] - 用户pin  optional\n      * @param {string} [opts.createTime] - 创建时间  optional\n      * @param {string} [opts.zipCode] - 邮编  optional\n      * @param {integer} [opts.provinceId] - 省id  optional\n      * @param {integer} [opts.cityId] - 市id  optional\n      * @param {integer} [opts.countyId] - 区县id  optional\n      * @param {integer} [opts.townId] - 乡镇id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  [0成功]\n      * @param string msg  [msg&#x3D;success成功]\n      */\n\n  modifyAddress (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyAddress\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling modifyAddress\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      postBody['id'] = opts.id\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.phone !== undefined && opts.phone !== null) {\n      postBody['phone'] = opts.phone\n    }\n    if (opts.province !== undefined && opts.province !== null) {\n      postBody['province'] = opts.province\n    }\n    if (opts.city !== undefined && opts.city !== null) {\n      postBody['city'] = opts.city\n    }\n    if (opts.county !== undefined && opts.county !== null) {\n      postBody['county'] = opts.county\n    }\n    if (opts.town !== undefined && opts.town !== null) {\n      postBody['town'] = opts.town\n    }\n    if (opts.address !== undefined && opts.address !== null) {\n      postBody['address'] = opts.address\n    }\n    if (opts.isDefault !== undefined && opts.isDefault !== null) {\n      postBody['isDefault'] = opts.isDefault\n    }\n    if (opts.updateTime !== undefined && opts.updateTime !== null) {\n      postBody['updateTime'] = opts.updateTime\n    }\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.createTime !== undefined && opts.createTime !== null) {\n      postBody['createTime'] = opts.createTime\n    }\n    if (opts.zipCode !== undefined && opts.zipCode !== null) {\n      postBody['zipCode'] = opts.zipCode\n    }\n    if (opts.provinceId !== undefined && opts.provinceId !== null) {\n      postBody['provinceId'] = opts.provinceId\n    }\n    if (opts.cityId !== undefined && opts.cityId !== null) {\n      postBody['cityId'] = opts.cityId\n    }\n    if (opts.countyId !== undefined && opts.countyId !== null) {\n      postBody['countyId'] = opts.countyId\n    }\n    if (opts.townId !== undefined && opts.townId !== null) {\n      postBody['townId'] = opts.townId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyAddress with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/address/{id}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除发票邮寄地址\n      * @param {Object} opts - parameters\n      * @param {integer} opts.id\n      * @param {string} [opts.pin] - 用户pin(运营后台必传)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  [0成功]\n      * @param string msg  [msg&#x3D;success成功]\n      */\n\n  deleteAddress (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAddress\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteAddress\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAddress with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/address/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加发票邮寄地址\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.id] - id  optional\n      * @param {string} [opts.name] - 收件人姓名  optional\n      * @param {string} [opts.phone] - 收件人电话  optional\n      * @param {string} [opts.province] - 省  optional\n      * @param {string} [opts.city] - 市  optional\n      * @param {string} [opts.county] - 区  optional\n      * @param {string} [opts.town] - 县  optional\n      * @param {string} [opts.address] - 邮编  optional\n      * @param {integer} [opts.isDefault] - 是否默认收货地址  optional\n      * @param {string} [opts.updateTime] - 更新时间  optional\n      * @param {string} [opts.pin] - 用户pin  optional\n      * @param {string} [opts.createTime] - 创建时间  optional\n      * @param {string} [opts.zipCode] - 邮编  optional\n      * @param {integer} [opts.provinceId] - 省id  optional\n      * @param {integer} [opts.cityId] - 市id  optional\n      * @param {integer} [opts.countyId] - 区县id  optional\n      * @param {integer} [opts.townId] - 乡镇id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  [0成功]\n      * @param string msg  [msg&#x3D;success成功]\n      */\n\n  createAddress (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAddress\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      postBody['id'] = opts.id\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.phone !== undefined && opts.phone !== null) {\n      postBody['phone'] = opts.phone\n    }\n    if (opts.province !== undefined && opts.province !== null) {\n      postBody['province'] = opts.province\n    }\n    if (opts.city !== undefined && opts.city !== null) {\n      postBody['city'] = opts.city\n    }\n    if (opts.county !== undefined && opts.county !== null) {\n      postBody['county'] = opts.county\n    }\n    if (opts.town !== undefined && opts.town !== null) {\n      postBody['town'] = opts.town\n    }\n    if (opts.address !== undefined && opts.address !== null) {\n      postBody['address'] = opts.address\n    }\n    if (opts.isDefault !== undefined && opts.isDefault !== null) {\n      postBody['isDefault'] = opts.isDefault\n    }\n    if (opts.updateTime !== undefined && opts.updateTime !== null) {\n      postBody['updateTime'] = opts.updateTime\n    }\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.createTime !== undefined && opts.createTime !== null) {\n      postBody['createTime'] = opts.createTime\n    }\n    if (opts.zipCode !== undefined && opts.zipCode !== null) {\n      postBody['zipCode'] = opts.zipCode\n    }\n    if (opts.provinceId !== undefined && opts.provinceId !== null) {\n      postBody['provinceId'] = opts.provinceId\n    }\n    if (opts.cityId !== undefined && opts.cityId !== null) {\n      postBody['cityId'] = opts.cityId\n    }\n    if (opts.countyId !== undefined && opts.countyId !== null) {\n      postBody['countyId'] = opts.countyId\n    }\n    if (opts.townId !== undefined && opts.townId !== null) {\n      postBody['townId'] = opts.townId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAddress with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/address:add',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询代客开票订单\n      * @param {Object} opts - parameters\n      * @param {string} opts.pin - 用户pin\n      * @param {string} [opts.orderNumber] - 订单号  optional\n      * @param {integer} opts.pageIndex - 页码(默认1)\n      * @param {integer} opts.pageSize - 每页展示数据量(默认：10)\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param number enableInvoiceFee  可开票金额\n      * @param number oweInvoiceFee  发票金额\n      * @param boolean isSetInvoiceMSGTemplate  是否设置过有效的发票信息\n      * @param invoiceOrderItem invoiceOrderList\n      */\n\n  describeInvoiceOrderList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInvoiceOrderList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pin === undefined || opts.pin === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pin' when calling describeInvoiceOrderList\"\n      )\n    }\n    if (opts.pageIndex === undefined || opts.pageIndex === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageIndex' when calling describeInvoiceOrderList\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeInvoiceOrderList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n    if (opts.orderNumber !== undefined && opts.orderNumber !== null) {\n      queryParams['orderNumber'] = opts.orderNumber\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInvoiceOrderList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeInvoiceOrderList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  代客开票\n      * @param {Object} opts - parameters\n      * @param {string} [opts.orderIds] - 需要开票的订单号列表，以逗号分隔  optional\n      * @param {string} [opts.deductOrderIds] - 抵扣单据单号列表，以逗号分隔  optional\n      * @param {string} [opts.mediumType] - 发票类型[电子-electronic]  optional\n      * @param {string} [opts.createInvoiceType] - 开票类型[按明细开票-consume，按月账单开票-month，指定金额开票-money(mediumType&#x3D;paper生效)]  optional\n      * @param {integer} [opts.invoiceAll] - 是否全部开票[全部开票-1 不需要传orderIds 需要传 开始、结束时间]  optional\n      * @param {string} [opts.orderStartTime] - 开票订单的开始时间(开票标识为 全部开票 时不需要传)  optional\n      * @param {string} [opts.orderEndTime] - 开票订单的结束时间(开票标识为 全部开票 时不需要传)  optional\n      * @param {string} [opts.monthGroups] - 开票月份 仅按月账单开票生效 例（202407,202406）多个月份用逗号分隔  optional\n      * @param {number} [opts.amount] - 指定金额开票时 传入金额 开票类型&#x3D;money时必传  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  [0成功]\n      * @param string msg  [msg&#x3D;success成功]\n      */\n\n  createInvoiceAgent (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInvoiceAgent\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.orderIds !== undefined && opts.orderIds !== null) {\n      postBody['orderIds'] = opts.orderIds\n    }\n    if (opts.deductOrderIds !== undefined && opts.deductOrderIds !== null) {\n      postBody['deductOrderIds'] = opts.deductOrderIds\n    }\n    if (opts.mediumType !== undefined && opts.mediumType !== null) {\n      postBody['mediumType'] = opts.mediumType\n    }\n    if (\n      opts.createInvoiceType !== undefined &&\n      opts.createInvoiceType !== null\n    ) {\n      postBody['createInvoiceType'] = opts.createInvoiceType\n    }\n    if (opts.invoiceAll !== undefined && opts.invoiceAll !== null) {\n      postBody['invoiceAll'] = opts.invoiceAll\n    }\n    if (opts.orderStartTime !== undefined && opts.orderStartTime !== null) {\n      postBody['orderStartTime'] = opts.orderStartTime\n    }\n    if (opts.orderEndTime !== undefined && opts.orderEndTime !== null) {\n      postBody['orderEndTime'] = opts.orderEndTime\n    }\n    if (opts.monthGroups !== undefined && opts.monthGroups !== null) {\n      postBody['monthGroups'] = opts.monthGroups\n    }\n    if (opts.amount !== undefined && opts.amount !== null) {\n      postBody['amount'] = opts.amount\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInvoiceAgent with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/createInvoiceAgent',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改发票模版\n      * @param {Object} opts - parameters\n      * @param {string} [opts.invoiceType] - 发票类型:[个人增值税普通发票-Personal_VAT_Ordinary_Invoice,企业增值税专用发票-Enterprise_VAT_Special_Invoice,企业增值税普通发票-Enterprise_VAT_Ordinary_Invoice]  optional\n      * @param {string} [opts.invoiceTitle] - 发票抬头  optional\n      * @param {string} [opts.invoiceContent] - 开票内容（按类别开票/按明细开票）  optional\n      * @param {string} [opts.taxId] - 纳税人识别码（发票类型为企业增值税专用发票和企业增值税普通发票时必填）  optional\n      * @param {string} [opts.company] - 单位名称（发票类型为企业增值税专用发票时必填）  optional\n      * @param {string} [opts.phone] - 注册电话（发票类型为个人增值税普通发票和企业增值税普通发票时作为收票人手机号）  optional\n      * @param {string} [opts.bank] - 开户银行（发票类型为企业增值税专用发票时必填）  optional\n      * @param {string} [opts.account] - 银行账户（发票类型为企业增值税专用发票时必填）  optional\n      * @param {string} [opts.address] - 注册地址（发票类型为企业增值税专用发票时必填）  optional\n      * @param {string} [opts.email] - 邮箱  optional\n      * @param {string} [opts.mediumType] - [电子-electronic]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code\n      * @param string msg\n      */\n\n  editInvoiceTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  editInvoiceTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.invoiceType !== undefined && opts.invoiceType !== null) {\n      postBody['invoiceType'] = opts.invoiceType\n    }\n    if (opts.invoiceTitle !== undefined && opts.invoiceTitle !== null) {\n      postBody['invoiceTitle'] = opts.invoiceTitle\n    }\n    if (opts.invoiceContent !== undefined && opts.invoiceContent !== null) {\n      postBody['invoiceContent'] = opts.invoiceContent\n    }\n    if (opts.taxId !== undefined && opts.taxId !== null) {\n      postBody['taxId'] = opts.taxId\n    }\n    if (opts.company !== undefined && opts.company !== null) {\n      postBody['company'] = opts.company\n    }\n    if (opts.phone !== undefined && opts.phone !== null) {\n      postBody['phone'] = opts.phone\n    }\n    if (opts.bank !== undefined && opts.bank !== null) {\n      postBody['bank'] = opts.bank\n    }\n    if (opts.account !== undefined && opts.account !== null) {\n      postBody['account'] = opts.account\n    }\n    if (opts.address !== undefined && opts.address !== null) {\n      postBody['address'] = opts.address\n    }\n    if (opts.email !== undefined && opts.email !== null) {\n      postBody['email'] = opts.email\n    }\n    if (opts.mediumType !== undefined && opts.mediumType !== null) {\n      postBody['mediumType'] = opts.mediumType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call editInvoiceTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/editInvoiceTemplate',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询已开票的子单\n      * @param {Object} opts - parameters\n      * @param {string} [opts.pin] - 用户pin  optional\n      * @param {array} [opts.childOrderList] - 子单列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string result\n      */\n\n  decribeInvoicedChildOrders (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  decribeInvoicedChildOrders\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.childOrderList !== undefined && opts.childOrderList !== null) {\n      postBody['childOrderList'] = opts.childOrderList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call decribeInvoicedChildOrders with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoices:decribeInvoicedChildOrders',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  发票列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.status] - 发票状态[已申请-applied ，处理中-processing ，已开票-invoiced ，已邮寄-mailed ，已驳回-dismissed ，已作废-obsolete ，已取消-cancelled，退票中-refund，已退票-refunded，退票驳回-refund_rejected]  optional\n      * @param {string} [opts.searchStartDate] - 开始时间  optional\n      * @param {string} [opts.searchEndDate] - 结束时间  optional\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 页大小  optional\n      * @param {integer} [opts.invoiceType] - 按明细开票 1 按月结算单开票 2 按指定金额开票 3  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param number enableInvoiceFee  可开票金额\n      * @param number invoicedFee  发票金额\n      * @param boolean isSetInvoiceMSGTemplate  是否设置过有效的发票信息\n      * @param invoiceList invoiceList\n      * @param boolean isApplyInvoice  是否可开票\n      * @param invoices invoiceSearch\n      */\n\n  describeInvoices (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInvoices\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.searchStartDate !== undefined && opts.searchStartDate !== null) {\n      postBody['searchStartDate'] = opts.searchStartDate\n    }\n    if (opts.searchEndDate !== undefined && opts.searchEndDate !== null) {\n      postBody['searchEndDate'] = opts.searchEndDate\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.invoiceType !== undefined && opts.invoiceType !== null) {\n      postBody['invoiceType'] = opts.invoiceType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInvoices with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoices',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  发票详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.invoiceNumber - 发票申请单号\n      * @param {integer} opts.pageIndex - 页码(默认1)\n      * @param {integer} opts.pageSize - 每页展示数据量(默认：20)\n      * @param {integer} [opts.invoiceType] - 发票类型 1详情 2按月  optional\n      * @param {string} [opts.pin] - 用户pin  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer id  id\n      * @param string invoiceNumber  发票申请单号\n      * @param string pin  用户pin\n      * @param string invoiceType  发票类型[个人增值税普通发票-Personal_VAT_Ordinary_Invoice，企业增值税专用发票-Enterprise_VAT_Special_Invoice，企业增值税普通发票-Enterprise_VAT_Ordinary_Invoice]\n      * @param string invoiceTitle  发票抬头\n      * @param string taxNo  税号\n      * @param number totalPrice  总价\n      * @param string remark  remark\n      * @param string invoiceContent  发票内容\n      * @param integer userType  用户类型\n      * @param integer addressId  地址ID\n      * @param integer transportId  transportId\n      * @param string createTime  创建日期\n      * @param string updateTime  更新日期\n      * @param string status  状态[已申请-applied ，处理中-processing ，已开票-invoiced ，已邮寄-mailed ，已驳回-dismissed ，已作废-obsolete ，已取消-cancelled]\n      * @param string billingTime  计费日期\n      * @param string reason  原因\n      * @param string invoiceOrg  invoiceOrg\n      * @param string registerAddress  注册地址\n      * @param string registerPhone  注册电话\n      * @param string accountBank  账户银行\n      * @param string account  账户\n      * @param string mediumType  类型[纸质-paper，电子-electronic, digital-数电发票]\n      * @param string pdfUrl  发票PDF文件链接地址\n      * @param string xmlUrl  发票xml文件链接地址\n      * @param string ofdUrl  发票ofd文件链接地址\n      * @param logistics logistics  物流信息\n      * @param postAddress postAddress  邮寄地址\n      * @param invoiceOrder invoiceOrders\n      * @param monthGroupOrder monthGroupOrders\n      * @param integer isHistoryData  区分是否历史数据(1-是 0-否)\n      */\n\n  describeInvoice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInvoice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.invoiceNumber === undefined || opts.invoiceNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.invoiceNumber' when calling describeInvoice\"\n      )\n    }\n    if (opts.pageIndex === undefined || opts.pageIndex === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageIndex' when calling describeInvoice\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeInvoice\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.invoiceType !== undefined && opts.invoiceType !== null) {\n      queryParams['invoiceType'] = opts.invoiceType\n    }\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      invoiceNumber: opts.invoiceNumber\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInvoice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoice/{invoiceNumber}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  账单明细\n      * @param {Object} opts - parameters\n      * @param {string} opts.billId - 计费账单编号\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param billDataList billDataList\n      */\n\n  billDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  billDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.billId === undefined || opts.billId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.billId' when calling billDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      billId: opts.billId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call billDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/billDetail/{billId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询企业资质信息详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.enterpriseName - 企业名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string creditCode  统一社会信用代码\n      * @param string registerAddress  注册地址\n      * @param string registerPhone  注册电话\n      * @param string entName  企业名称\n      * @param string entType  企业类型\n      */\n\n  getCompanyCreditInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getCompanyCreditInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.enterpriseName === undefined || opts.enterpriseName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.enterpriseName' when calling getCompanyCreditInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.enterpriseName !== undefined && opts.enterpriseName !== null) {\n      queryParams['enterpriseName'] = opts.enterpriseName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getCompanyCreditInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/getCompanyCreditInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询订单关联发票信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.orderId - 订单号\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean existed  是否存在关联发票\n      * @param string invoiceNumbers  关联发票号\n      */\n\n  getOrderRelateInvoice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getOrderRelateInvoice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.orderId === undefined || opts.orderId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.orderId' when calling getOrderRelateInvoice\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.orderId !== undefined && opts.orderId !== null) {\n      queryParams['orderId'] = opts.orderId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getOrderRelateInvoice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/getOrderRelateInvoice',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询订单关联信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.orderId - 订单号\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean hasInvoice  是否存在关联发票\n      * @param string invoiceNumbers  关联发票号\n      * @param boolean hasOweTicket  是否关联欠票\n      */\n\n  getOrderRelateInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getOrderRelateInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.orderId === undefined || opts.orderId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.orderId' when calling getOrderRelateInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.orderId !== undefined && opts.orderId !== null) {\n      queryParams['orderId'] = opts.orderId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getOrderRelateInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/getOrderRelateInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建发票\n      * @param {Object} opts - parameters\n      * @param {string} [opts.orderIds] - 需要开票的订单号列表，以逗号分隔  optional\n      * @param {string} [opts.deductOrderIds] - 抵扣单据单号列表，以逗号分隔  optional\n      * @param {string} [opts.mediumType] - 发票类型[电子-electronic]  optional\n      * @param {string} [opts.createInvoiceType] - 开票类型[按明细开票-consume，按月账单开票-month，指定金额开票-money(mediumType&#x3D;paper生效)]  optional\n      * @param {integer} [opts.invoiceAll] - 是否全部开票[全部开票-1 不需要传orderIds 需要传 开始、结束时间]  optional\n      * @param {string} [opts.orderStartTime] - 开票订单的开始时间(开票标识为 全部开票 时不需要传)  optional\n      * @param {string} [opts.orderEndTime] - 开票订单的结束时间(开票标识为 全部开票 时不需要传)  optional\n      * @param {string} [opts.monthGroups] - 开票月份 仅按月账单开票生效 例（202407,202406）多个月份用逗号分隔  optional\n      * @param {number} [opts.amount] - 指定金额开票时 传入金额 开票类型&#x3D;money时必传  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  [0成功]\n      * @param string msg  [msg&#x3D;success成功]\n      */\n\n  createInvoice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInvoice\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.orderIds !== undefined && opts.orderIds !== null) {\n      postBody['orderIds'] = opts.orderIds\n    }\n    if (opts.deductOrderIds !== undefined && opts.deductOrderIds !== null) {\n      postBody['deductOrderIds'] = opts.deductOrderIds\n    }\n    if (opts.mediumType !== undefined && opts.mediumType !== null) {\n      postBody['mediumType'] = opts.mediumType\n    }\n    if (\n      opts.createInvoiceType !== undefined &&\n      opts.createInvoiceType !== null\n    ) {\n      postBody['createInvoiceType'] = opts.createInvoiceType\n    }\n    if (opts.invoiceAll !== undefined && opts.invoiceAll !== null) {\n      postBody['invoiceAll'] = opts.invoiceAll\n    }\n    if (opts.orderStartTime !== undefined && opts.orderStartTime !== null) {\n      postBody['orderStartTime'] = opts.orderStartTime\n    }\n    if (opts.orderEndTime !== undefined && opts.orderEndTime !== null) {\n      postBody['orderEndTime'] = opts.orderEndTime\n    }\n    if (opts.monthGroups !== undefined && opts.monthGroups !== null) {\n      postBody['monthGroups'] = opts.monthGroups\n    }\n    if (opts.amount !== undefined && opts.amount !== null) {\n      postBody['amount'] = opts.amount\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInvoice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoice',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  退票\n      * @param {Object} opts - parameters\n      * @param {string} opts.invoiceNumber - 发票申请单号\n      * @param {string} [opts.refundReason] - 退票原因  optional\n      * @param {string} [opts.remark] - 备注信息  optional\n      * @param {string} [opts.logisticsCompany] - 物流公司  optional\n      * @param {string} [opts.logisticsOrderNumber] - 物流单号  optional\n      * @param {string} [opts.mediumType] - [纸质-paper，电子-electronic]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  [0成功]\n      * @param string msg  [msg&#x3D;success成功]\n      */\n\n  refundInvoice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  refundInvoice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.invoiceNumber === undefined || opts.invoiceNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.invoiceNumber' when calling refundInvoice\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.refundReason !== undefined && opts.refundReason !== null) {\n      postBody['refundReason'] = opts.refundReason\n    }\n    if (opts.remark !== undefined && opts.remark !== null) {\n      postBody['remark'] = opts.remark\n    }\n    if (opts.logisticsCompany !== undefined && opts.logisticsCompany !== null) {\n      postBody['logisticsCompany'] = opts.logisticsCompany\n    }\n    if (\n      opts.logisticsOrderNumber !== undefined &&\n      opts.logisticsOrderNumber !== null\n    ) {\n      postBody['logisticsOrderNumber'] = opts.logisticsOrderNumber\n    }\n    if (opts.mediumType !== undefined && opts.mediumType !== null) {\n      postBody['mediumType'] = opts.mediumType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      invoiceNumber: opts.invoiceNumber\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call refundInvoice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoice/{invoiceNumber}:refund',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  人工退票\n      * @param {Object} opts - parameters\n      * @param {string} [opts.orderId] - 退款订单号  optional\n      * @param {string} [opts.refundAmount] - 退款金额  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  [0成功]\n      * @param string msg  [msg&#x3D;success成功]\n      */\n\n  artificialRefund (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  artificialRefund\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.orderId !== undefined && opts.orderId !== null) {\n      postBody['orderId'] = opts.orderId\n    }\n    if (opts.refundAmount !== undefined && opts.refundAmount !== null) {\n      postBody['refundAmount'] = opts.refundAmount\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call artificialRefund with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoiceorder:artificialRefund',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  撤回发票\n      * @param {Object} opts - parameters\n      * @param {string} opts.invoiceNumber - 发票申请单号\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  [0成功]\n      * @param string msg  [msg&#x3D;success成功]\n      */\n\n  cancelInvoice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  cancelInvoice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.invoiceNumber === undefined || opts.invoiceNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.invoiceNumber' when calling cancelInvoice\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      invoiceNumber: opts.invoiceNumber\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cancelInvoice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoice/{invoiceNumber}:cancel',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取电子发票下载地址\n      * @param {Object} opts - parameters\n      * @param {string} [opts.businessId] - 订单号或者申请单号  optional\n      * @param {string} [opts.ivcCode] - 发票代码  optional\n      * @param {string} [opts.ivcNo] - 发票号码  optional\n      * @param {string} [opts.wid] - 商品编号  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code\n      * @param string msg\n      * @param string result\n      */\n\n  describeInvoiceUrl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInvoiceUrl\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.businessId !== undefined && opts.businessId !== null) {\n      postBody['businessId'] = opts.businessId\n    }\n    if (opts.ivcCode !== undefined && opts.ivcCode !== null) {\n      postBody['ivcCode'] = opts.ivcCode\n    }\n    if (opts.ivcNo !== undefined && opts.ivcNo !== null) {\n      postBody['ivcNo'] = opts.ivcNo\n    }\n    if (opts.wid !== undefined && opts.wid !== null) {\n      postBody['wid'] = opts.wid\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInvoiceUrl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoice:downloadurl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开票单据列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.searchStartTime] - 开始时间  optional\n      * @param {string} [opts.searchEndTime] - 结束时间  optional\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 页大小  optional\n      * @param {string} [opts.receiptType] - 单据类型[订单-order，账单-bill 月结算单-month]  optional\n      * @param {integer} [opts.payType] - 交易(支付)类型 1-代付 2-自付  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param number enableInvoiceFee  可开票金额\n      * @param number enableAllInvoiceFee  可开票总金额\n      * @param number oweInvoiceFee  发票金额\n      * @param boolean isSetInvoiceMSGTemplate  是否设置过有效的发票信息\n      * @param invoiceOrderItem invoiceOrderList\n      */\n\n  describeInvoiceOrders (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInvoiceOrders\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.searchStartTime !== undefined && opts.searchStartTime !== null) {\n      postBody['searchStartTime'] = opts.searchStartTime\n    }\n    if (opts.searchEndTime !== undefined && opts.searchEndTime !== null) {\n      postBody['searchEndTime'] = opts.searchEndTime\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.receiptType !== undefined && opts.receiptType !== null) {\n      postBody['receiptType'] = opts.receiptType\n    }\n    if (opts.payType !== undefined && opts.payType !== null) {\n      postBody['payType'] = opts.payType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInvoiceOrders with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoiceorder:list',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  欠票列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.pin] - 用户pin  optional\n      * @param {integer} [opts.pageIndex] - 页码  optional\n      * @param {integer} [opts.pageSize] - 页大小  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param number oweFee  欠票总金额\n      * @param invoiceOweList invoiceOweList\n      */\n\n  invoiceOweList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  invoiceOweList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      postBody['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call invoiceOweList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoiceOweList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  抵扣欠票\n      * @param {Object} opts - parameters\n      * @param {string} [opts.orderIds] - 抵扣订单号  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  [0成功]\n      * @param string msg  [msg&#x3D;success成功]\n      */\n\n  deductOweFee (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deductOweFee\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.orderIds !== undefined && opts.orderIds !== null) {\n      postBody['orderIds'] = opts.orderIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deductOweFee with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/deductOweFee',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据产品线取税率\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceCode - 产品线\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param taxInfo result\n      */\n\n  getTaxInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTaxInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceCode === undefined || opts.serviceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceCode' when calling getTaxInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTaxInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/getTaxInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  发票预览信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.pin] - 用户pin  optional\n      * @param {string} [opts.orderIds] - 订单号 多个用逗号,分开  optional\n      * @param {array} [opts.deductInfoList] - 欠票抵扣的订单信息  optional\n      * @param {number} [opts.amount] - 指定开票金额  optional\n      * @param {string} [opts.monthGroups] - 开票月份 仅按月开票生效  optional\n      * @param {string} [opts.mediumType] - 发票类型[电子-electronic, 数电-digital]  optional\n      * @param {integer} [opts.invoiceAll] - 全部开票标识 1-全部开票 全部开票, 不需要传orderIds 需要传 开始、结束时间  optional\n      * @param {string} [opts.orderStartTime] - 开票订单的开始时间(yyyy-MM-dd HH:mm:ss)  optional\n      * @param {string} [opts.orderEndTime] - 开票订单的结束时间(yyyy-MM-dd HH:mm:ss)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param invoicePreviewRespVo result\n      */\n\n  getInvoicePreview (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getInvoicePreview\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.orderIds !== undefined && opts.orderIds !== null) {\n      postBody['orderIds'] = opts.orderIds\n    }\n    if (opts.deductInfoList !== undefined && opts.deductInfoList !== null) {\n      postBody['deductInfoList'] = opts.deductInfoList\n    }\n    if (opts.amount !== undefined && opts.amount !== null) {\n      postBody['amount'] = opts.amount\n    }\n    if (opts.monthGroups !== undefined && opts.monthGroups !== null) {\n      postBody['monthGroups'] = opts.monthGroups\n    }\n    if (opts.mediumType !== undefined && opts.mediumType !== null) {\n      postBody['mediumType'] = opts.mediumType\n    }\n    if (opts.invoiceAll !== undefined && opts.invoiceAll !== null) {\n      postBody['invoiceAll'] = opts.invoiceAll\n    }\n    if (opts.orderStartTime !== undefined && opts.orderStartTime !== null) {\n      postBody['orderStartTime'] = opts.orderStartTime\n    }\n    if (opts.orderEndTime !== undefined && opts.orderEndTime !== null) {\n      postBody['orderEndTime'] = opts.orderEndTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getInvoicePreview with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/getInvoicePreview',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据订单信息和总金额计算单个订单金额\n      * @param {Object} opts - parameters\n      * @param {number} [opts.amount] - 预开票总金额（不传则简单计算金额）  optional\n      * @param {array} [opts.orderInfo]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param orderInfoRes result\n      */\n\n  calculateInvoicePrice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  calculateInvoicePrice\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.amount !== undefined && opts.amount !== null) {\n      postBody['amount'] = opts.amount\n    }\n    if (opts.orderInfo !== undefined && opts.orderInfo !== null) {\n      postBody['orderInfo'] = opts.orderInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call calculateInvoicePrice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/calculateInvoicePrice',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按月查询发票详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.month - 发票月份 yyyy-MM\n      * @param {string} [opts.pin] - 用户pin  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param invoiceDetails result\n      */\n\n  describeMonthDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMonthDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.month === undefined || opts.month === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.month' when calling describeMonthDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      month: opts.month\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMonthDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoiceorder/{month}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询发票抬头信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.pin] - 用户pin(运营后台必传)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vat vat  vat\n      * @param invoiceMsgTemplate invoiceMsgTemplate  发票抬头信息\n      */\n\n  describeInvoiceTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInvoiceTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInvoiceTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoiceTemplate',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置发票信息抬头\n      * @param {Object} opts - parameters\n      * @param {string} [opts.invoiceType] - 发票类型:[个人增值税普通发票-Personal_VAT_Ordinary_Invoice,企业增值税专用发票-Enterprise_VAT_Special_Invoice,企业增值税普通发票-Enterprise_VAT_Ordinary_Invoice]  optional\n      * @param {string} [opts.invoiceTitle] - 发票抬头  optional\n      * @param {string} [opts.invoiceContent] - 开票内容（按类别开票/按明细开票）  optional\n      * @param {string} [opts.taxId] - 纳税人识别码（发票类型为企业增值税专用发票和企业增值税普通发票时必填）  optional\n      * @param {string} [opts.company] - 单位名称（发票类型为企业增值税专用发票时必填）  optional\n      * @param {string} [opts.phone] - 注册电话（发票类型为个人增值税普通发票和企业增值税普通发票时作为收票人手机号）  optional\n      * @param {string} [opts.bank] - 开户银行（发票类型为企业增值税专用发票时必填）  optional\n      * @param {string} [opts.account] - 银行账户（发票类型为企业增值税专用发票时必填）  optional\n      * @param {string} [opts.address] - 注册地址（发票类型为企业增值税专用发票时必填）  optional\n      * @param {string} [opts.email] - 邮箱  optional\n      * @param {string} [opts.mediumType] - [电子-electronic]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code\n      * @param string msg\n      */\n\n  createInvoiceTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInvoiceTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.invoiceType !== undefined && opts.invoiceType !== null) {\n      postBody['invoiceType'] = opts.invoiceType\n    }\n    if (opts.invoiceTitle !== undefined && opts.invoiceTitle !== null) {\n      postBody['invoiceTitle'] = opts.invoiceTitle\n    }\n    if (opts.invoiceContent !== undefined && opts.invoiceContent !== null) {\n      postBody['invoiceContent'] = opts.invoiceContent\n    }\n    if (opts.taxId !== undefined && opts.taxId !== null) {\n      postBody['taxId'] = opts.taxId\n    }\n    if (opts.company !== undefined && opts.company !== null) {\n      postBody['company'] = opts.company\n    }\n    if (opts.phone !== undefined && opts.phone !== null) {\n      postBody['phone'] = opts.phone\n    }\n    if (opts.bank !== undefined && opts.bank !== null) {\n      postBody['bank'] = opts.bank\n    }\n    if (opts.account !== undefined && opts.account !== null) {\n      postBody['account'] = opts.account\n    }\n    if (opts.address !== undefined && opts.address !== null) {\n      postBody['address'] = opts.address\n    }\n    if (opts.email !== undefined && opts.email !== null) {\n      postBody['email'] = opts.email\n    }\n    if (opts.mediumType !== undefined && opts.mediumType !== null) {\n      postBody['mediumType'] = opts.mediumType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInvoiceTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoiceTemplate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改发票模版\n      * @param {Object} opts - parameters\n      * @param {string} [opts.invoiceType] - 发票类型:[个人增值税普通发票-Personal_VAT_Ordinary_Invoice,企业增值税专用发票-Enterprise_VAT_Special_Invoice,企业增值税普通发票-Enterprise_VAT_Ordinary_Invoice]  optional\n      * @param {string} [opts.invoiceTitle] - 发票抬头  optional\n      * @param {string} [opts.invoiceContent] - 开票内容（按类别开票/按明细开票）  optional\n      * @param {string} [opts.taxId] - 纳税人识别码（发票类型为企业增值税专用发票和企业增值税普通发票时必填）  optional\n      * @param {string} [opts.company] - 单位名称（发票类型为企业增值税专用发票时必填）  optional\n      * @param {string} [opts.phone] - 注册电话（发票类型为个人增值税普通发票和企业增值税普通发票时作为收票人手机号）  optional\n      * @param {string} [opts.bank] - 开户银行（发票类型为企业增值税专用发票时必填）  optional\n      * @param {string} [opts.account] - 银行账户（发票类型为企业增值税专用发票时必填）  optional\n      * @param {string} [opts.address] - 注册地址（发票类型为企业增值税专用发票时必填）  optional\n      * @param {string} [opts.email] - 邮箱  optional\n      * @param {string} [opts.mediumType] - [电子-electronic]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code\n      * @param string msg\n      */\n\n  modifyInvoiceTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInvoiceTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.invoiceType !== undefined && opts.invoiceType !== null) {\n      postBody['invoiceType'] = opts.invoiceType\n    }\n    if (opts.invoiceTitle !== undefined && opts.invoiceTitle !== null) {\n      postBody['invoiceTitle'] = opts.invoiceTitle\n    }\n    if (opts.invoiceContent !== undefined && opts.invoiceContent !== null) {\n      postBody['invoiceContent'] = opts.invoiceContent\n    }\n    if (opts.taxId !== undefined && opts.taxId !== null) {\n      postBody['taxId'] = opts.taxId\n    }\n    if (opts.company !== undefined && opts.company !== null) {\n      postBody['company'] = opts.company\n    }\n    if (opts.phone !== undefined && opts.phone !== null) {\n      postBody['phone'] = opts.phone\n    }\n    if (opts.bank !== undefined && opts.bank !== null) {\n      postBody['bank'] = opts.bank\n    }\n    if (opts.account !== undefined && opts.account !== null) {\n      postBody['account'] = opts.account\n    }\n    if (opts.address !== undefined && opts.address !== null) {\n      postBody['address'] = opts.address\n    }\n    if (opts.email !== undefined && opts.email !== null) {\n      postBody['email'] = opts.email\n    }\n    if (opts.mediumType !== undefined && opts.mediumType !== null) {\n      postBody['mediumType'] = opts.mediumType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInvoiceTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoiceTemplate',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除发票模版\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code\n      * @param string msg\n      */\n\n  deleteInvoiceTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInvoiceTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInvoiceTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/invoiceTemplate',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询订单是否有欠票状态\n      * @param {Object} opts - parameters\n      * @param {string} [opts.pin] - pin  optional\n      * @param {array} [opts.refundInfoList] - 退款订单信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param checkResult result  true-有欠票, false-无欠票\n      */\n\n  checkInvoiceOwedInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkInvoiceOwedInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.refundInfoList !== undefined && opts.refundInfoList !== null) {\n      postBody['refundInfoList'] = opts.refundInfoList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkInvoiceOwedInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/checkInvoiceOwedInfo',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量更新发票系统中订单的退款信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.pin] - pin  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result  true-更新成功, false-更新失败\n      */\n\n  batchUpdateInvoiceRefundOrder (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  batchUpdateInvoiceRefundOrder\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchUpdateInvoiceRefundOrder with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/batchUpdateInvoiceRefundOrder',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  退款欠票信息\n      * @param {Object} opts - parameters\n      * @param {array} [opts.invoiceOweInfoList] - 退款欠票信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result  true-更新成功, false-更新失败\n      */\n\n  refundOwedInvoice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  refundOwedInvoice\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (\n      opts.invoiceOweInfoList !== undefined &&\n      opts.invoiceOweInfoList !== null\n    ) {\n      postBody['invoiceOweInfoList'] = opts.invoiceOweInfoList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call refundOwedInvoice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/refundOwedInvoice',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  检查订单的开票信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.pin - 用户pin\n      * @param {array} [opts.orderNumberList] - 订单列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param orderInvoiceInfo result  订单开票信息\n      */\n\n  describeOrderInvoice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeOrderInvoice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pin === undefined || opts.pin === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pin' when calling describeOrderInvoice\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.orderNumberList !== undefined && opts.orderNumberList !== null) {\n      postBody['orderNumberList'] = opts.orderNumberList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeOrderInvoice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeOrderInvoice',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  包年包月退款更新发票的退款金额\n      * @param {Object} opts - parameters\n      * @param {array} [opts.refundInfoList]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result  true-更新成功 false-更新失败\n      * @param string message  结果消息\n      */\n\n  updateInvoiceRefundAmount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateInvoiceRefundAmount\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.refundInfoList !== undefined && opts.refundInfoList !== null) {\n      postBody['refundInfoList'] = opts.refundInfoList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  invoice/0.4.11'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateInvoiceRefundAmount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/updateInvoiceRefundAmount',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = INVOICE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/iotcard/v1/iotcard.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * iot-card-Related-API\n * 物联网卡服务相关API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iotcard'\nService._services[serviceId] = true\n\n/**\n * iotcard service.\n * @version 1.0.0\n */\n\nJDCloud.IOTCARD = class IOTCARD extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'openapi.myiot.jdcloud.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  根据物联网卡iccid查询该卡的gprs状态信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.iccid - 物联网卡iccid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param gprsStatusResp result  指定物联网卡的gprs状态信息\n      */\n\n  gprsStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  gprsStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.iccid === undefined || opts.iccid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.iccid' when calling gprsStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.iccid !== undefined && opts.iccid !== null) {\n      queryParams['iccid'] = opts.iccid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcard/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call gprsStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/gprsStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物联网卡iccid查询该卡的开关机状态信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.iccid - 物联网卡iccid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param onOffStatusResp result  指定物联网卡的开关机状态信息\n      */\n\n  onOffStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  onOffStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.iccid === undefined || opts.iccid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.iccid' when calling onOffStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.iccid !== undefined && opts.iccid !== null) {\n      queryParams['iccid'] = opts.iccid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcard/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call onOffStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/onOffStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物联网卡iccid查询该卡的生命周期信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.iccid - 物联网卡iccid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param lifeStatusResp result  指定物联网卡的生命周期信息\n      */\n\n  lifeStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  lifeStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.iccid === undefined || opts.iccid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.iccid' when calling lifeStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.iccid !== undefined && opts.iccid !== null) {\n      queryParams['iccid'] = opts.iccid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcard/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call lifeStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/lifeStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物联网卡iccid查询该卡的当月套餐内的GPRS实时使用量\n      * @param {Object} opts - parameters\n      * @param {string} opts.iccid - 物联网卡iccid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param gprsRealtimeInfoResp result  指定物联网卡的当月套餐内的GPRS实时使用量\n      */\n\n  gprsRealtimeInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  gprsRealtimeInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.iccid === undefined || opts.iccid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.iccid' when calling gprsRealtimeInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.iccid !== undefined && opts.iccid !== null) {\n      queryParams['iccid'] = opts.iccid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcard/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call gprsRealtimeInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/gprsRealtimeInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡开机操作\n      * @param {Object} opts - parameters\n      * @param {array} [opts.iccids] - 物联网卡号码列表(单次提交最多不超过200个号码)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param operationIotCardResp result\n      */\n\n  openIotCard (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  openIotCard\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.iccids !== undefined && opts.iccids !== null) {\n      postBody['iccids'] = opts.iccids\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcard/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call openIotCard with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/openIotCard',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡停机操作\n      * @param {Object} opts - parameters\n      * @param {array} [opts.iccids] - 物联网卡号码列表(单次提交最多不超过200个号码)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param operationIotCardResp result\n      */\n\n  closeIotCard (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  closeIotCard\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.iccids !== undefined && opts.iccids !== null) {\n      postBody['iccids'] = opts.iccids\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcard/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call closeIotCard with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/closeIotCard',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡开启流量操作\n      * @param {Object} opts - parameters\n      * @param {array} [opts.iccids] - 物联网卡号码列表(单次提交最多不超过200个号码)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param operationIotCardResp result\n      */\n\n  openIotFlow (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  openIotFlow\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.iccids !== undefined && opts.iccids !== null) {\n      postBody['iccids'] = opts.iccids\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcard/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call openIotFlow with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/openIotFlow',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡停流量操作\n      * @param {Object} opts - parameters\n      * @param {array} [opts.iccids] - 物联网卡号码列表(单次提交最多不超过200个号码)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param operationIotCardResp result\n      */\n\n  closeIotFlow (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  closeIotFlow\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.iccids !== undefined && opts.iccids !== null) {\n      postBody['iccids'] = opts.iccids\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcard/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call closeIotFlow with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/closeIotFlow',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.IOTCARD\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/iotcloudgateway/v1/iotcloudgateway.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * iotcloudgateway开通接口\n * 用户开通iotcloudgateway服务相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iotcloudgateway'\nService._services[serviceId] = true\n\n/**\n * iotcloudgateway service.\n * @version 1.0.1\n */\n\nJDCloud.IOTCLOUDGATEWAY = class IOTCLOUDGATEWAY extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'iotcloudgateway.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询iotcloudgateway实例列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instances\n      * @param integer totalCount  iotcloudgateway实例总数\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcloudgateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询iotcloudgateway实例详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instance  实例相关信息\n      */\n\n  describeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstance\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcloudgateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询instance绑定的ExposedDomain\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string iotgwd  实例对应下行域名\n      * @param string iotgwu  实例对应上行域名\n      */\n\n  queryInstanceExposeDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryInstanceExposeDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling queryInstanceExposeDomain\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcloudgateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryInstanceExposeDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:queryInstanceExposeDomain',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询instance当前状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  iotcloudgateway实例状态\n      */\n\n  queryInstanceStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryInstanceStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling queryInstanceStatus\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcloudgateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryInstanceStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:queryInstanceStatus',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  下发设备控制指令\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {deviceControlSpec} opts.devicecmd - iotcloudgateway实例下发设备控制指令\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deviceControl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deviceControl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deviceControl\"\n      )\n    }\n    if (opts.devicecmd === undefined || opts.devicecmd === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.devicecmd' when calling deviceControl\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.devicecmd !== undefined && opts.devicecmd !== null) {\n      postBody['devicecmd'] = opts.devicecmd\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcloudgateway/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deviceControl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:deviceControl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.IOTCLOUDGATEWAY\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/iotcore/v2/iotcore.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * IoTHubInstance\n * IoT Hub共享模式和独享模式共用接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iotcore'\nService._services[serviceId] = true\n\n/**\n * iotcore service.\n * @version 1.1.25\n */\n\nclass IOTCORE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'iotcore.jdcloud-api.com'\n    options.basePath = '/v2' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  设备注册接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {deviceInfoVO} opts.deviceInfoVO - 物模型ID编号\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string deviceId  注册设备返回的设备ID\n      */\n\n  registerDevice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  registerDevice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling registerDevice\"\n      )\n    }\n    if (opts.deviceInfoVO === undefined || opts.deviceInfoVO === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceInfoVO' when calling registerDevice\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deviceInfoVO !== undefined && opts.deviceInfoVO !== null) {\n      postBody['deviceInfoVO'] = opts.deviceInfoVO\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call registerDevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/device:register',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  下载设备证书接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {string} opts.deviceId - 设备ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string deviceId  证书对应deviceId\n      * @param string deviceCertUrl  证书zip包对应链接，默认有效时长10分钟\n      */\n\n  downloadDeviceCertificate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  downloadDeviceCertificate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling downloadDeviceCertificate\"\n      )\n    }\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling downloadDeviceCertificate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceId !== undefined && opts.deviceId !== null) {\n      queryParams['deviceId'] = opts.deviceId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call downloadDeviceCertificate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/device:downloadCertificate',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设备删除接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {string} opts.deviceId - 设备ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  是否删除成功\n      */\n\n  deleteDevice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDevice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteDevice\"\n      )\n    }\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling deleteDevice\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceId !== undefined && opts.deviceId !== null) {\n      queryParams['deviceId'] = opts.deviceId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/device:delete',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个设备详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {string} opts.deviceId - 设备ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deviceInfoVO deviceInfoVO\n      */\n\n  describeDevice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDevice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeDevice\"\n      )\n    }\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling describeDevice\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceId !== undefined && opts.deviceId !== null) {\n      queryParams['deviceId'] = opts.deviceId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/device:describe',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询物类型列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {string} [opts.deviceMetaId] - 设备型号标识  optional\n      * @param {string} [opts.deviceMetaName] - 设备型号名称  optional\n      * @param {integer} [opts.nodeType] - 节点类型  optional\n      * @param {integer} [opts.pageNo] - 页码  optional\n      * @param {integer} [opts.pageSize] - 每页显示条数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageSize\n      * @param integer currentPage\n      * @param integer totalCount\n      * @param thingTypeInfoVO list\n      */\n\n  describeThingTypeList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeThingTypeList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeThingTypeList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceMetaId !== undefined && opts.deviceMetaId !== null) {\n      queryParams['deviceMetaId'] = opts.deviceMetaId\n    }\n    if (opts.deviceMetaName !== undefined && opts.deviceMetaName !== null) {\n      queryParams['deviceMetaName'] = opts.deviceMetaName\n    }\n    if (opts.nodeType !== undefined && opts.nodeType !== null) {\n      queryParams['nodeType'] = opts.nodeType\n    }\n    if (opts.pageNo !== undefined && opts.pageNo !== null) {\n      queryParams['pageNo'] = opts.pageNo\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeThingTypeList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/thingType:list',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询物类型详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {string} [opts.deviceMetaId] - 设备型号标识  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param thingTypeInfoVO thingTypeInfoVO\n      */\n\n  describeThingType (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeThingType\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeThingType\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceMetaId !== undefined && opts.deviceMetaId !== null) {\n      queryParams['deviceMetaId'] = opts.deviceMetaId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeThingType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/thingType:describe',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物类型Code查看物模型完整信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {string} opts.thingTypeCode - 物类型Code\n      * @param {string} [opts.thingModelVersion] - 版本号。如果为空，则返回最新版本  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param thingModelRespTO thingModelRespTO\n      */\n\n  describeThingModel (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeThingModel\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeThingModel\"\n      )\n    }\n    if (opts.thingTypeCode === undefined || opts.thingTypeCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.thingTypeCode' when calling describeThingModel\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.thingTypeCode !== undefined && opts.thingTypeCode !== null) {\n      queryParams['thingTypeCode'] = opts.thingTypeCode\n    }\n    if (\n      opts.thingModelVersion !== undefined &&\n      opts.thingModelVersion !== null\n    ) {\n      queryParams['thingModelVersion'] = opts.thingModelVersion\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeThingModel with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/thingModel:describe',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设备控制接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {devicePropertyVO} opts.devicePropertyVO - 设备ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  是否设置成功\n      */\n\n  setDeviceProperty (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setDeviceProperty\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling setDeviceProperty\"\n      )\n    }\n    if (opts.devicePropertyVO === undefined || opts.devicePropertyVO === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.devicePropertyVO' when calling setDeviceProperty\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.devicePropertyVO !== undefined && opts.devicePropertyVO !== null) {\n      postBody['devicePropertyVO'] = opts.devicePropertyVO\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setDeviceProperty with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/deviceProperty:set',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设备方法执行\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {deviceFunctionVO} opts.deviceFunctionVO - 设备方法\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code\n      * @param string message\n      * @param boolean success\n      * @param deviceFunctionVO returnValues\n      */\n\n  invokeFunction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  invokeFunction\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling invokeFunction\"\n      )\n    }\n    if (opts.deviceFunctionVO === undefined || opts.deviceFunctionVO === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceFunctionVO' when calling invokeFunction\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deviceFunctionVO !== undefined && opts.deviceFunctionVO !== null) {\n      postBody['deviceFunctionVO'] = opts.deviceFunctionVO\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call invokeFunction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/function:invokeFunction',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设备事件查询\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {eventReportPageBo} opts.eventReportPageBo - 事件查询请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageSize\n      * @param integer currentPage\n      * @param integer totalCount\n      * @param eventReportVo list\n      */\n\n  describeEventList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeEventList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeEventList\"\n      )\n    }\n    if (\n      opts.eventReportPageBo === undefined ||\n      opts.eventReportPageBo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.eventReportPageBo' when calling describeEventList\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.eventReportPageBo !== undefined &&\n      opts.eventReportPageBo !== null\n    ) {\n      postBody['eventReportPageBo'] = opts.eventReportPageBo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeEventList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/event:list',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询方法调用列表信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {functionCallPageBo} opts.functionCallPageBo - 方法查询请求对象\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageSize\n      * @param integer currentPage\n      * @param integer totalCount\n      * @param functionCallRecordVo list\n      */\n\n  describeFunctionList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeFunctionList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeFunctionList\"\n      )\n    }\n    if (\n      opts.functionCallPageBo === undefined ||\n      opts.functionCallPageBo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.functionCallPageBo' when calling describeFunctionList\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.functionCallPageBo !== undefined &&\n      opts.functionCallPageBo !== null\n    ) {\n      postBody['functionCallPageBo'] = opts.functionCallPageBo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeFunctionList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/function:list',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询属性接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {string} opts.deviceId - 设备ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param propertyAcquireVo propertyAcquireVo\n      */\n\n  describeProperty (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeProperty\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeProperty\"\n      )\n    }\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling describeProperty\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceId !== undefined && opts.deviceId !== null) {\n      queryParams['deviceId'] = opts.deviceId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProperty with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/property:describe',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  属性获取接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {deviceSnapshotRequestVO} opts.deviceSnapshotRequestVO - 方法查询请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string snapShot  JSON字符串格式属性结果\n      */\n\n  describePropertySnapshot (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePropertySnapshot\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describePropertySnapshot\"\n      )\n    }\n    if (\n      opts.deviceSnapshotRequestVO === undefined ||\n      opts.deviceSnapshotRequestVO === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceSnapshotRequestVO' when calling describePropertySnapshot\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.deviceSnapshotRequestVO !== undefined &&\n      opts.deviceSnapshotRequestVO !== null\n    ) {\n      postBody['deviceSnapshotRequestVO'] = opts.deviceSnapshotRequestVO\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePropertySnapshot with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/property:describeSnapshot',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  边缘代理设备与非直连设备拓扑关系创建接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {deviceTopoInfoVO} opts.deviceTopoInfoVO - 方法查询请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deviceTopoResult deviceTopoResult\n      */\n\n  createDeviceTopo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDeviceTopo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createDeviceTopo\"\n      )\n    }\n    if (opts.deviceTopoInfoVO === undefined || opts.deviceTopoInfoVO === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceTopoInfoVO' when calling createDeviceTopo\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deviceTopoInfoVO !== undefined && opts.deviceTopoInfoVO !== null) {\n      postBody['deviceTopoInfoVO'] = opts.deviceTopoInfoVO\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDeviceTopo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/deviceTopo:create',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  边缘代理设备与非直连设备拓扑关系查询接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {deviceTopoPageBO} opts.deviceTopoPageBO - 方法查询请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageSize\n      * @param integer currentPage\n      * @param integer totalCount\n      * @param deviceTopoRecordVO list\n      */\n\n  describeDeviceTopo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeviceTopo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeDeviceTopo\"\n      )\n    }\n    if (opts.deviceTopoPageBO === undefined || opts.deviceTopoPageBO === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceTopoPageBO' when calling describeDeviceTopo\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deviceTopoPageBO !== undefined && opts.deviceTopoPageBO !== null) {\n      postBody['deviceTopoPageBO'] = opts.deviceTopoPageBO\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeviceTopo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/deviceTopo:describe',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  边缘代理设备与非直连设备拓扑关系更新接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {deviceTopoInfoVO} opts.deviceTopoInfoVO - 方法查询请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deviceTopoResult deviceTopoResult\n      */\n\n  updateDeviceTopo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateDeviceTopo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling updateDeviceTopo\"\n      )\n    }\n    if (opts.deviceTopoInfoVO === undefined || opts.deviceTopoInfoVO === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceTopoInfoVO' when calling updateDeviceTopo\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deviceTopoInfoVO !== undefined && opts.deviceTopoInfoVO !== null) {\n      postBody['deviceTopoInfoVO'] = opts.deviceTopoInfoVO\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateDeviceTopo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/deviceTopo:update',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  边缘代理设备与非直连设备拓扑关系删除接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例Id\n      * @param {deviceTopoInfoVO} opts.deviceTopoInfoVO - 方法查询请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deviceTopoResult deviceTopoResult\n      */\n\n  deleteDeviceTopo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDeviceTopo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteDeviceTopo\"\n      )\n    }\n    if (opts.deviceTopoInfoVO === undefined || opts.deviceTopoInfoVO === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceTopoInfoVO' when calling deleteDeviceTopo\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deviceTopoInfoVO !== undefined && opts.deviceTopoInfoVO !== null) {\n      postBody['deviceTopoInfoVO'] = opts.deviceTopoInfoVO\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDeviceTopo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/coreinstances/{instanceId}/deviceTopo:delete',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设备Topic调用\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.identifier - 设备唯一标识\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} opts.topicShortName - Topic如/user/{productKey}/{identifier}/topicShortName\n不支持系统Topic\n\n      * @param {string} opts.topicMessage - 要发送的消息主体\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string msgId  消息唯一标识\n      */\n\n  invokeThingTopic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  invokeThingTopic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling invokeThingTopic\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling invokeThingTopic\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling invokeThingTopic\"\n      )\n    }\n    if (opts.topicShortName === undefined || opts.topicShortName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicShortName' when calling invokeThingTopic\"\n      )\n    }\n    if (opts.topicMessage === undefined || opts.topicMessage === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicMessage' when calling invokeThingTopic\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.topicShortName !== undefined && opts.topicShortName !== null) {\n      postBody['topicShortName'] = opts.topicShortName\n    }\n    if (opts.topicMessage !== undefined && opts.topicMessage !== null) {\n      postBody['topicMessage'] = opts.topicMessage\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      identifier: opts.identifier,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call invokeThingTopic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/devices/{identifier}/topic',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看设备影子\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.identifier - 设备唯一标识\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object state  设备状态\n      * @param object metadata  当用户更新设备状态文档后，设备影子服务会自动更新metadata的值。设备状态的元数据的信息包含以 Epoch 时间表示的每个属性的时间戳，用来获取准确的更新时间。\n      * @param integer version  设备影子版本\n      * @param integer timestamp  设备影子更新时间\n      */\n\n  describeThingShadow (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeThingShadow\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeThingShadow\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling describeThingShadow\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling describeThingShadow\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      identifier: opts.identifier,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeThingShadow with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/devices/{identifier}/shadow',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新设备影子的期望值\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.identifier - 设备唯一标识\n      * @param {string} opts.productKey - 产品Key\n      * @param {object} [opts.state] - 运行状态  optional\n      * @param {integer} [opts.version] - 设备影子版本,当前版本加1，当前版本默认其实版本为-1\n用户主动更新版本号时，设备影子会检查请求中的主动更新版本号是否大于当前版本号。\n如果大于当前版本号，则更新设备影子，并将影子版本值更新到请求的版本中，反之则会拒绝更新设备影子。\n影子版本参数为Integer型\n取值范围：0到2147483647(2的31次方-1)\n当取值达到最大值2147483647(2的31次方-1)时，请求中的主动更新版本号应为-1\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateThingShadow (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateThingShadow\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling updateThingShadow\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling updateThingShadow\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling updateThingShadow\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.state !== undefined && opts.state !== null) {\n      postBody['state'] = opts.state\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      identifier: opts.identifier,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateThingShadow with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/devices/{identifier}/shadow',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设备服务调用\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.identifier - 设备唯一标识\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} opts.name - 服务名称\n      * @param {object} [opts.input] - 输入参数,object的key为参数名称，value为参数值  optional\n      * @param {string} [opts.callbackBeanName] - 回调spring的bean的名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string msgId  消息唯一标识\n      */\n\n  invokeThingService (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  invokeThingService\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling invokeThingService\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling invokeThingService\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling invokeThingService\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling invokeThingService\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.input !== undefined && opts.input !== null) {\n      postBody['input'] = opts.input\n    }\n    if (opts.callbackBeanName !== undefined && opts.callbackBeanName !== null) {\n      postBody['callbackBeanName'] = opts.callbackBeanName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      identifier: opts.identifier,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call invokeThingService with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/devices/{identifier}/services',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  建立设备间的父子关系\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.parentId - 父级设备Id，只允许网关设备作为父级设备\n      * @param {string} [opts.productKey] - 将此产品下所有设备都设置为parentId的子设备，只允许普通设备类型的productKey  optional\n      * @param {array} [opts.children] - 子设备Id集合，children和productKey二者至少填一个，二者都填写则同时生效，只允许普通设备类型的deviceId  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addDeviceLinks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addDeviceLinks\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling addDeviceLinks\"\n      )\n    }\n    if (opts.parentId === undefined || opts.parentId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parentId' when calling addDeviceLinks\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.parentId !== undefined && opts.parentId !== null) {\n      postBody['parentId'] = opts.parentId\n    }\n    if (opts.productKey !== undefined && opts.productKey !== null) {\n      postBody['productKey'] = opts.productKey\n    }\n    if (opts.children !== undefined && opts.children !== null) {\n      postBody['children'] = opts.children\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addDeviceLinks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/devices:addLinks',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  分页查询设备信息,支持一个或多个条件\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} [opts.deviceName] - 设备名称，模糊匹配  optional\n      * @param {integer} [opts.status] - 设备状态 0-未激活，1-激活离线，2-激活在线  optional\n      * @param {string} [opts.productKey] - 设备所归属的产品Key  optional\n      * @param {integer} [opts.deviceType] - 设备类型，同产品类型，0-设备，1-网关  optional\n      * @param {integer} [opts.nowPage] - 当前页数  optional\n      * @param {integer} [opts.pageSize] - 每页的数据条数  optional\n      * @param {string} [opts.order] - 排序关键字--name,type,productKey,status--最多支持一个字段  optional\n      * @param {string} [opts.direction] - 顺序，升序降序--asc,desc  optional\n      * @param {string} [opts.parentId] - 父设备Id  optional\n      * @param {integer} [opts.orderId] - 订单号  optional\n      * @param {string} [opts.deviceCollectorType] - 设备采集器类型  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageSize\n      * @param integer nowPage\n      * @param integer totalSize\n      * @param integer totalPage\n      * @param deviceVO data\n      */\n\n  queryDevicePage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryDevicePage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling queryDevicePage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceName !== undefined && opts.deviceName !== null) {\n      queryParams['deviceName'] = opts.deviceName\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.productKey !== undefined && opts.productKey !== null) {\n      queryParams['productKey'] = opts.productKey\n    }\n    if (opts.deviceType !== undefined && opts.deviceType !== null) {\n      queryParams['deviceType'] = opts.deviceType\n    }\n    if (opts.nowPage !== undefined && opts.nowPage !== null) {\n      queryParams['nowPage'] = opts.nowPage\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.order !== undefined && opts.order !== null) {\n      queryParams['order'] = opts.order\n    }\n    if (opts.direction !== undefined && opts.direction !== null) {\n      queryParams['direction'] = opts.direction\n    }\n    if (opts.parentId !== undefined && opts.parentId !== null) {\n      queryParams['parentId'] = opts.parentId\n    }\n    if (opts.orderId !== undefined && opts.orderId !== null) {\n      queryParams['orderId'] = opts.orderId\n    }\n    if (\n      opts.deviceCollectorType !== undefined &&\n      opts.deviceCollectorType !== null\n    ) {\n      queryParams['deviceCollectorType'] = opts.deviceCollectorType\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDevicePage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/devices:queryPage',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改设备详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.deviceId - 设备Id\n      * @param {string} [opts.model] - 设备型号  optional\n      * @param {string} [opts.manufacturer] - 设备厂商  optional\n      * @param {string} [opts.description] - 设备描述  optional\n      * @param {integer} [opts.status] - 设备状态  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deviceVO device  设备详情\n      */\n\n  updateDevice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateDevice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling updateDevice\"\n      )\n    }\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling updateDevice\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.model !== undefined && opts.model !== null) {\n      postBody['model'] = opts.model\n    }\n    if (opts.manufacturer !== undefined && opts.manufacturer !== null) {\n      postBody['manufacturer'] = opts.manufacturer\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      deviceId: opts.deviceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateDevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/device/{deviceId}:update',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  注册单个设备并返回秘钥信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} [opts.deviceName] - 设备名称  optional\n      * @param {string} [opts.productKey] - 设备所归属的产品  optional\n      * @param {string} [opts.model] - 设备型号  optional\n      * @param {string} [opts.manufacturer] - 厂商  optional\n      * @param {string} [opts.description] - 设备描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string deviceName  设备名称\n      * @param string identifier  设备标识符\n      * @param string secret  设备秘钥\n      */\n\n  addDevice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addDevice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling addDevice\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deviceName !== undefined && opts.deviceName !== null) {\n      postBody['deviceName'] = opts.deviceName\n    }\n    if (opts.productKey !== undefined && opts.productKey !== null) {\n      postBody['productKey'] = opts.productKey\n    }\n    if (opts.model !== undefined && opts.model !== null) {\n      postBody['model'] = opts.model\n    }\n    if (opts.manufacturer !== undefined && opts.manufacturer !== null) {\n      postBody['manufacturer'] = opts.manufacturer\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addDevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/device:add',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询设备详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceName - 设备名称\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string deviceId  设备ID\n      * @param string deviceName  设备名称\n      * @param string parentId  父级设备Id\n      * @param string deviceType  设备类型，同产品类型，0-普通设备，1-网关，2-Edge\n      * @param integer status  设备状态，0-未激活，1-激活离线，2-激活在线\n      * @param string productKey  产品Key\n      * @param string identifier  设备标识符\n      * @param string secret  设备秘钥\n      * @param string description  设备描述\n      * @param integer activatedTime  激活时间\n      * @param integer lastConnectedTime  最后连接时间\n      * @param integer createdTime  注册时间\n      * @param integer updatedTime  修改时间\n      * @param string productName  产品名称\n      * @param string model  设备型号\n      * @param string manufacturer  设备厂商\n      * @param integer dynamicRegister  动态注册,0:关闭，1:开启\n      */\n\n  queryDeviceDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryDeviceDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.deviceName === undefined || opts.deviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceName' when calling queryDeviceDetail\"\n      )\n    }\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling queryDeviceDetail\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling queryDeviceDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      deviceName: opts.deviceName,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDeviceDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/device/{deviceName}:detail',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除设备\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceName - 设备名称\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removeDevice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  removeDevice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.deviceName === undefined || opts.deviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceName' when calling removeDevice\"\n      )\n    }\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling removeDevice\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling removeDevice\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      deviceName: opts.deviceName,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeDevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/device/{deviceName}:delete',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取分组列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} [opts.groupName] - 组名称  optional\n      * @param {string} [opts.queryUserPin] - 查询的用户组  optional\n      * @param {string} [opts.tag] - 组标签  optional\n      * @param {integer} [opts.pageNumber] - 当前页号  optional\n      * @param {integer} [opts.pageSize] - 每页大小  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageSize\n      * @param integer nowPage\n      * @param integer totalSize\n      * @param integer totalPage\n      * @param deviceGroupResp data\n      */\n\n  getDeviceGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDeviceGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling getDeviceGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.groupName !== undefined && opts.groupName !== null) {\n      queryParams['groupName'] = opts.groupName\n    }\n    if (opts.queryUserPin !== undefined && opts.queryUserPin !== null) {\n      queryParams['queryUserPin'] = opts.queryUserPin\n    }\n    if (opts.tag !== undefined && opts.tag !== null) {\n      queryParams['tag'] = opts.tag\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDeviceGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/devicegroup:get',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取组列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} [opts.queryUserPin] - 获取用户 NULL为当前用户  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deviceGroupResp data\n      */\n\n  getDeviceGroupList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDeviceGroupList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling getDeviceGroupList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.queryUserPin !== undefined && opts.queryUserPin !== null) {\n      queryParams['queryUserPin'] = opts.queryUserPin\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDeviceGroupList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/devicegrouplist',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取分组列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} [opts.productKey] - 产品Key  optional\n      * @param {string} [opts.deviceName] - 设备名称  optional\n      * @param {string} [opts.deviceCollectorType] - 采集器类型  optional\n      * @param {string} [opts.groupName] - 组名称  optional\n      * @param {string} [opts.userPin] - 查询的用户组  optional\n      * @param {string} [opts.tag] - 组标签  optional\n      * @param {string} [opts.groupId] - 组ID  optional\n      * @param {string} [opts.manufacturer] - 厂商名称  optional\n      * @param {string} [opts.model] - 设备型号  optional\n      * @param {integer} [opts.orderId] - 订单号  optional\n      * @param {integer} [opts.status] - 设备状态  optional\n      * @param {integer} [opts.pageNumber] - 当前页码  optional\n      * @param {integer} [opts.pageSize] - 每页大小  optional\n      * @param {string} [opts.order] - 排序字段  optional\n      * @param {string} [opts.direction] - 排序方式（asc desc）  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageSize\n      * @param integer nowPage\n      * @param integer totalSize\n      * @param integer totalPage\n      * @param deviceGroupInfo data\n      */\n\n  findDeviceGroupLinkPage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  findDeviceGroupLinkPage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling findDeviceGroupLinkPage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.productKey !== undefined && opts.productKey !== null) {\n      queryParams['productKey'] = opts.productKey\n    }\n    if (opts.deviceName !== undefined && opts.deviceName !== null) {\n      queryParams['deviceName'] = opts.deviceName\n    }\n    if (\n      opts.deviceCollectorType !== undefined &&\n      opts.deviceCollectorType !== null\n    ) {\n      queryParams['deviceCollectorType'] = opts.deviceCollectorType\n    }\n    if (opts.groupName !== undefined && opts.groupName !== null) {\n      queryParams['groupName'] = opts.groupName\n    }\n    if (opts.userPin !== undefined && opts.userPin !== null) {\n      queryParams['userPin'] = opts.userPin\n    }\n    if (opts.tag !== undefined && opts.tag !== null) {\n      queryParams['tag'] = opts.tag\n    }\n    if (opts.groupId !== undefined && opts.groupId !== null) {\n      queryParams['groupId'] = opts.groupId\n    }\n    if (opts.manufacturer !== undefined && opts.manufacturer !== null) {\n      queryParams['manufacturer'] = opts.manufacturer\n    }\n    if (opts.model !== undefined && opts.model !== null) {\n      queryParams['model'] = opts.model\n    }\n    if (opts.orderId !== undefined && opts.orderId !== null) {\n      queryParams['orderId'] = opts.orderId\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.order !== undefined && opts.order !== null) {\n      queryParams['order'] = opts.order\n    }\n    if (opts.direction !== undefined && opts.direction !== null) {\n      queryParams['direction'] = opts.direction\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call findDeviceGroupLinkPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/devicegrouplink:get',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取电梯运行状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Hub实例Id\n      * @param {string} [opts.identifier] - 电梯连接码  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param registerValue data\n      * @param integer totalCount  统计数据\n      */\n\n  elevatorOperatingStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  elevatorOperatingStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling elevatorOperatingStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.identifier !== undefined && opts.identifier !== null) {\n      queryParams['identifier'] = opts.identifier\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call elevatorOperatingStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loongrayinstances/{instanceId}/registerElevatorOperatingStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取协议信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Hub实例Id\n      * @param {string} opts.identifier - 当前的链接码\n      * @param {string} opts.protocol - 当前的协议类型：\n语音播报控制器-输入端子,0X00000~X0007：inputTerminal\n语音播报控制器-播放信息,0X00024~X0027：playInfo\nLR001-516-5B边缘数据采集器-传感器管理：sensor\nLR001-516-5B边缘数据采集器-采集器属性：collectorProperty\nLR001-516-5B边缘数据采集器-电梯属性：elevatorProperty\nLR001-516-5A边缘数据采集器-水质酸碱度(PH)：waterQualityPh\nLR001-516-5A水质监测采集器-水质电导率：waterQualityElectroConductivity\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object readData  读取寄存器值，key：寄存器地址 value:寄存器值\n如读取语音播报控制器-输入端子的响应为\n{\n  &quot;0&quot;:0,\n  &quot;1&quot;:0,\n  &quot;2&quot;:0,\n  &quot;3&quot;:0,\n  &quot;4&quot;:0,\n  &quot;5&quot;:0,\n  &quot;6&quot;:0,\n  &quot;7&quot;:0\n}\n如读取语音播报控制器-播放信息的响应为\n{\n  &quot;36&quot;:0,\n  &quot;37&quot;:0,\n  &quot;38&quot;:0,\n  &quot;39&quot;:0,\n  &quot;40&quot;:0,\n  &quot;41&quot;:0,\n  &quot;42&quot;:0,\n  &quot;43&quot;:0,\n  &quot;44&quot;:1,\n  &quot;45&quot;:3,\n  &quot;46&quot;:0,\n  &quot;47&quot;:0\n}\n如读取LR001-516-5B边缘数据采集器-传感器管理的响应为\n{\n  &quot;40426&quot;:1,\n  &quot;40427&quot;:1,\n  &quot;40428&quot;:2,\n  &quot;40429&quot;:1,\n  &quot;40430&quot;:1,\n  &quot;40431&quot;:1,\n  &quot;40432&quot;:1,\n  &quot;40433&quot;:2,\n  &quot;40434&quot;:1,\n  &quot;40435&quot;:1,\n  &quot;40436&quot;:1,\n  &quot;40437&quot;:1,\n  &quot;40438&quot;:1,\n  &quot;40439&quot;:1,\n  &quot;40440&quot;:1\n}\n如读取LR001-516-5A边缘数据采集器-水质酸碱度(PH)响应为\n{\n  &quot;40301&quot;: 0,\n  &quot;40302&quot;: 225,\n  &quot;40304&quot;: 28.071838,\n  &quot;40306&quot;: 12.9,\n  &quot;40308&quot;: 0,\n  &quot;40309&quot;: 37376,\n  &quot;40311&quot;: 2000,\n  &quot;40313&quot;: -2000,\n  &quot;40315&quot;: 60,\n  &quot;40317&quot;: 0,\n  &quot;40319&quot;: 0,\n  &quot;40321&quot;: 0,\n  &quot;40323&quot;: 0,\n  &quot;40324&quot;: 1,\n  &quot;40325&quot;: 4,\n  &quot;40326&quot;: 0,\n  &quot;40327&quot;: 256,\n  &quot;40329&quot;: -0.1984,\n  &quot;40331&quot;: 0,\n  &quot;40333&quot;: 1,\n  &quot;40335&quot;: 25,\n  &quot;40337&quot;: 0,\n  &quot;40338&quot;: 0,\n  &quot;40339&quot;: 2622\n}\n如读取LR001-516-5A水质监测采集器-水质电导率响应为\n{\n  &quot;40340&quot;: 0,\n  &quot;40342&quot;: 0,\n  &quot;40344&quot;: 29.816881,\n  &quot;40346&quot;: 0,\n  &quot;40348&quot;: 0,\n  &quot;40350&quot;: 10,\n  &quot;40352&quot;: 0.018,\n  &quot;40354&quot;: 25,\n  &quot;40356&quot;: 0,\n  &quot;40358&quot;: 38400,\n  &quot;40360&quot;: 2,\n  &quot;40362&quot;: 1663480.8,\n  &quot;40364&quot;: 1,\n  &quot;40366&quot;: 0,\n  &quot;40368&quot;: 50,\n  &quot;40370&quot;: 20\n}\n\n      */\n\n  collectorReadMessage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  collectorReadMessage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling collectorReadMessage\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling collectorReadMessage\"\n      )\n    }\n    if (opts.protocol === undefined || opts.protocol === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.protocol' when calling collectorReadMessage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.identifier !== undefined && opts.identifier !== null) {\n      queryParams['identifier'] = opts.identifier\n    }\n    if (opts.protocol !== undefined && opts.protocol !== null) {\n      queryParams['protocol'] = opts.protocol\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call collectorReadMessage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loongrayinstances/{instanceId}/readCollectorProperty',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  (0x03)读保持寄存器\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Hub实例Id\n      * @param {string} opts.identifier - 连接码\n      * @param {integer} opts.addressOfFirstRegister - 起始地址，如40301\n      * @param {integer} opts.numberOfRegisters - 寄存器数量\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object readData  读取寄存器值，key：寄存器地址 value:寄存器值\n      */\n\n  readHoldingRegisters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  readHoldingRegisters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling readHoldingRegisters\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling readHoldingRegisters\"\n      )\n    }\n    if (\n      opts.addressOfFirstRegister === undefined ||\n      opts.addressOfFirstRegister === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.addressOfFirstRegister' when calling readHoldingRegisters\"\n      )\n    }\n    if (\n      opts.numberOfRegisters === undefined ||\n      opts.numberOfRegisters === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.numberOfRegisters' when calling readHoldingRegisters\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.identifier !== undefined && opts.identifier !== null) {\n      queryParams['identifier'] = opts.identifier\n    }\n    if (\n      opts.addressOfFirstRegister !== undefined &&\n      opts.addressOfFirstRegister !== null\n    ) {\n      queryParams['addressOfFirstRegister'] = opts.addressOfFirstRegister\n    }\n    if (\n      opts.numberOfRegisters !== undefined &&\n      opts.numberOfRegisters !== null\n    ) {\n      queryParams['numberOfRegisters'] = opts.numberOfRegisters\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call readHoldingRegisters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loongrayinstances/{instanceId}/readHoldingRegisters',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  写入采集器数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Hub实例Id\n      * @param {string} opts.identifier - 当前的链接码\n      * @param {string} [opts.protocol] - 当前的协议类型,非必填项\n  optional\n      * @param {object} opts.data - 当前待写入的数据\n如语音播报控制器-指定播放设备，寄存地址：13对应16进制0x0D，寄存器值:2\n{\n  &quot;13&quot;:2\n}\n如语音播报控制器-播放控制，寄存地址：14对应16进制0x0E，寄存器值:1\n{\n  &quot;14&quot;: 1\n}\n如语音播报控制器-音量设置，寄存地址：15对应16进制0x0F，寄存器值:10，取值范围0~30\n{\n  &quot;15&quot;: 10\n}\n如语音播报控制器-指定文件夹和文件播放,寄存地址：16对应16进制0x10，寄存器值:1\n寄存器值为两字节，第一个字节为文件夹，第二个字节为文件名\n如0x01文件夹,0x03文件名，0x0103换算为10进制为259\n{\n  &quot;16&quot;: 259\n}\n如语音播报控制器-组合播放，寄存器地址：17、18和19，寄存器值：257、258和259，寄存器值的算法和指定文件夹和文件播放是一致的，如259可换算为0x01文件夹,0x03文件名\n{\n  &quot;17&quot;: 257,\n  &quot;18&quot;: 258,\n  &quot;19&quot;: 259\n}\n如语音播报控制器-播放广告，寄存地址：32对应16进制0x20，寄存器值:259，寄存器值的算法和指定文件夹和文件播放是一致的，如259可换算为0x01文件夹,0x03文件名\n{\n  &quot;32&quot;: 259\n}\n如语音播报控制器-指定文件夹循环播放，寄存地址：33对应16进制0x21，寄存器值:256，寄存器值的算法，如256可换算为0x0100文件夹\n{\n  &quot;33&quot;: 256\n}\n如语音播报控制器-指定文件夹随机播放，寄存地址：34对应16进制0x22，寄存器值:256，寄存器值的算法，如256可换算为0x0100文件夹\n{\n  &quot;34&quot;: 256\n}\n如语音播报控制器-指定曲目播放，寄存地址：35对应16进制0x23，寄存器值:13,歌曲选择范围为0~3000\n{\n  &quot;35&quot;: 13\n}\n如电梯数据采集器-传感器管理数据更新\n{\n  &quot;40426&quot;: 1,\n  &quot;40427&quot;: 1,\n  &quot;40428&quot;: 1,\n  &quot;40429&quot;: 1,\n  &quot;40430&quot;: 1,\n  &quot;40431&quot;: 1,\n  &quot;40432&quot;: 1,\n  &quot;40433&quot;: 1,\n  &quot;40434&quot;: 1,\n  &quot;40435&quot;: 1,\n  &quot;40436&quot;: 1,\n  &quot;40437&quot;: 1,\n  &quot;40438&quot;: 1,\n  &quot;40439&quot;: 1,\n  &quot;40440&quot;: 1\n}\n如电梯数据采集器-采集器属性数据更新\n{\n  &quot;40441&quot;: 40441,\n  &quot;40443&quot;: 40443,\n  &quot;40444&quot;: 40444,\n  &quot;40445&quot;: 40445,\n  &quot;40446&quot;: 40446,\n  &quot;40447&quot;: 40447,\n  &quot;40448&quot;: 40448,\n  &quot;40449&quot;: 40449,\n  &quot;40450&quot;: 40450\n}\n如电梯数据采集器-电梯属性数据更新\n{\n  &quot;40801&quot;: 1,\n  &quot;40802&quot;: 1,\n  &quot;40803&quot;: 1,\n  &quot;40804&quot;: 1,\n  &quot;40805&quot;: 1,\n  &quot;40806&quot;: 1,\n  &quot;40807&quot;: 1,\n  &quot;40808&quot;: 1,\n  &quot;40809&quot;: 1,\n  &quot;40810&quot;: 1\n}\n如电梯数据采集器-楼层数据更新\n{\n  &quot;40797&quot;: 1,\n  &quot;40798&quot;: 1,\n  &quot;40799&quot;: 1\n}\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string writeStatus\n      */\n\n  collectorWriteMessage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  collectorWriteMessage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling collectorWriteMessage\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling collectorWriteMessage\"\n      )\n    }\n    if (opts.data === undefined || opts.data === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.data' when calling collectorWriteMessage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.identifier !== undefined && opts.identifier !== null) {\n      postBody['identifier'] = opts.identifier\n    }\n    if (opts.protocol !== undefined && opts.protocol !== null) {\n      postBody['protocol'] = opts.protocol\n    }\n    if (opts.data !== undefined && opts.data !== null) {\n      postBody['data'] = opts.data\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call collectorWriteMessage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loongrayinstances/{instanceId}/writeCollectorProperty',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改设备详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.deviceId - 设备Id\n      * @param {string} [opts.model] - 设备型号  optional\n      * @param {string} [opts.manufacturer] - 设备厂商  optional\n      * @param {string} [opts.description] - 设备名  optional\n      * @param {integer} [opts.status] - 设备状态  optional\n      * @param {string} [opts.identifier] - 连接码  optional\n      * @param {string} [opts.deviceName] - 心跳  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deviceVO device  设备详情\n      */\n\n  updateLooDevice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateLooDevice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling updateLooDevice\"\n      )\n    }\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling updateLooDevice\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.model !== undefined && opts.model !== null) {\n      postBody['model'] = opts.model\n    }\n    if (opts.manufacturer !== undefined && opts.manufacturer !== null) {\n      postBody['manufacturer'] = opts.manufacturer\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.identifier !== undefined && opts.identifier !== null) {\n      postBody['identifier'] = opts.identifier\n    }\n    if (opts.deviceName !== undefined && opts.deviceName !== null) {\n      postBody['deviceName'] = opts.deviceName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      deviceId: opts.deviceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateLooDevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/device/{deviceId}:looupdate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  注册单个朗讯设备并返回秘钥信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.preOrderId - 申请单编号\n      * @param {string} opts.userPinParam - 用户Pin\n      * @param {string} [opts.deviceName] - 心跳  optional\n      * @param {string} [opts.productKey] - 设备所归属的产品  optional\n      * @param {string} [opts.model] - 设备型号  optional\n      * @param {string} [opts.manufacturer] - 厂商  optional\n      * @param {string} [opts.identifier] - 连接码  optional\n      * @param {string} [opts.description] - 设备名  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string deviceName  设备名称\n      * @param string identifier  设备标识符\n      * @param string secret  设备秘钥\n      */\n\n  addLooDevice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addLooDevice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling addLooDevice\"\n      )\n    }\n    if (opts.preOrderId === undefined || opts.preOrderId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.preOrderId' when calling addLooDevice\"\n      )\n    }\n    if (opts.userPinParam === undefined || opts.userPinParam === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userPinParam' when calling addLooDevice\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.userPinParam !== undefined && opts.userPinParam !== null) {\n      postBody['userPinParam'] = opts.userPinParam\n    }\n    if (opts.deviceName !== undefined && opts.deviceName !== null) {\n      postBody['deviceName'] = opts.deviceName\n    }\n    if (opts.productKey !== undefined && opts.productKey !== null) {\n      postBody['productKey'] = opts.productKey\n    }\n    if (opts.model !== undefined && opts.model !== null) {\n      postBody['model'] = opts.model\n    }\n    if (opts.manufacturer !== undefined && opts.manufacturer !== null) {\n      postBody['manufacturer'] = opts.manufacturer\n    }\n    if (opts.identifier !== undefined && opts.identifier !== null) {\n      postBody['identifier'] = opts.identifier\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      preOrderId: opts.preOrderId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLooDevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/preOrderId/{preOrderId}/device_loongray:add',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  朗瑞分页查询设备信息,支持一个或多个条件\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} [opts.deviceName] - 设备名称，模糊匹配  optional\n      * @param {string} [opts.manufacturer] - 设备厂商，模糊匹配  optional\n      * @param {string} [opts.model] - 设备型号，模糊匹配  optional\n      * @param {integer} [opts.status] - 设备状态 0-未激活，1-激活离线，2-激活在线  optional\n      * @param {string} [opts.productKey] - 设备所归属的产品Key  optional\n      * @param {integer} [opts.deviceType] - 设备类型，同产品类型，0-设备，1-网关  optional\n      * @param {integer} [opts.nowPage] - 当前页数  optional\n      * @param {integer} [opts.pageSize] - 每页的数据条数  optional\n      * @param {string} [opts.order] - 排序关键字--name,type,productKey,status--最多支持一个字段  optional\n      * @param {string} [opts.direction] - 顺序，升序降序--asc,desc  optional\n      * @param {string} [opts.parentId] - 父设备Id  optional\n      * @param {integer} [opts.orderId] - 订单号  optional\n      * @param {string} [opts.deviceCollectorType] - 设备采集器类型  optional\n      * @param {string} [opts.queryUserPin] - 查询的userPin  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageSize\n      * @param integer nowPage\n      * @param integer totalSize\n      * @param integer totalPage\n      * @param deviceVO data\n      */\n\n  loongrayQueryPage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  loongrayQueryPage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling loongrayQueryPage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceName !== undefined && opts.deviceName !== null) {\n      queryParams['deviceName'] = opts.deviceName\n    }\n    if (opts.manufacturer !== undefined && opts.manufacturer !== null) {\n      queryParams['manufacturer'] = opts.manufacturer\n    }\n    if (opts.model !== undefined && opts.model !== null) {\n      queryParams['model'] = opts.model\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.productKey !== undefined && opts.productKey !== null) {\n      queryParams['productKey'] = opts.productKey\n    }\n    if (opts.deviceType !== undefined && opts.deviceType !== null) {\n      queryParams['deviceType'] = opts.deviceType\n    }\n    if (opts.nowPage !== undefined && opts.nowPage !== null) {\n      queryParams['nowPage'] = opts.nowPage\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.order !== undefined && opts.order !== null) {\n      queryParams['order'] = opts.order\n    }\n    if (opts.direction !== undefined && opts.direction !== null) {\n      queryParams['direction'] = opts.direction\n    }\n    if (opts.parentId !== undefined && opts.parentId !== null) {\n      queryParams['parentId'] = opts.parentId\n    }\n    if (opts.orderId !== undefined && opts.orderId !== null) {\n      queryParams['orderId'] = opts.orderId\n    }\n    if (\n      opts.deviceCollectorType !== undefined &&\n      opts.deviceCollectorType !== null\n    ) {\n      queryParams['deviceCollectorType'] = opts.deviceCollectorType\n    }\n    if (opts.queryUserPin !== undefined && opts.queryUserPin !== null) {\n      queryParams['queryUserPin'] = opts.queryUserPin\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call loongrayQueryPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/devices:loongrayQueryPage',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设备基本数据统计，包括设备数，激活数，在线数\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} [opts.productKey] - 过滤条件，产品Key  optional\n      * @param {string} [opts.parentId] - 针对parentId下的子设备进行统计  optional\n      * @param {string} [opts.deviceCollectorType] - 采集器类型  optional\n      * @param {string} [opts.queryUserPin] - 查询的用户信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer devices  用户的设备数\n      * @param integer activatedDevices  已激活的设备数\n      * @param integer onlineDevices  在线的设备数\n      * @param integer monthMessages  当月消息数\n      * @param integer monthDuration  当月设备在线时长\n      * @param integer products  产品数\n      */\n\n  queryAdminStatistics (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryAdminStatistics\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling queryAdminStatistics\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.productKey !== undefined && opts.productKey !== null) {\n      queryParams['productKey'] = opts.productKey\n    }\n    if (opts.parentId !== undefined && opts.parentId !== null) {\n      queryParams['parentId'] = opts.parentId\n    }\n    if (\n      opts.deviceCollectorType !== undefined &&\n      opts.deviceCollectorType !== null\n    ) {\n      queryParams['deviceCollectorType'] = opts.deviceCollectorType\n    }\n    if (opts.queryUserPin !== undefined && opts.queryUserPin !== null) {\n      queryParams['queryUserPin'] = opts.queryUserPin\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryAdminStatistics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/device:queryAdminStatistics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除设备\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceName - 设备名称\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removeLoongrayDevice (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  removeLoongrayDevice\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.deviceName === undefined || opts.deviceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceName' when calling removeLoongrayDevice\"\n      )\n    }\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling removeLoongrayDevice\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling removeLoongrayDevice\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      deviceName: opts.deviceName,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeLoongrayDevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/device/{deviceName}:loongraydelete',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看产品\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoT Engine实例ID信息\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string productName  产品名称\n      * @param integer productType  节点类型，取值：\n0：设备。设备不能挂载子设备。可以直连物联网平台，也可以作为网关的子设备连接物联网平台\n1：网关。网关可以挂载子设备，具有子设备管理模块，维持子设备的拓扑关系，和将拓扑关系同步到物联网平台\n\n      * @param string productKey  产品key\n      * @param string productSecret  产品秘钥\n      * @param integer createdTime  创建时间,时间为东八区（UTC/GMT+08:00）\n      * @param integer deviceCount  包含设备数\n      * @param integer dynamicRegister  动态注册,0:关闭，1:开启\n      * @param string productDescription  产品描述信息\n      * @param string templateName  产品类型,如自定义等\n      */\n\n  describeProductWithAdmin (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeProductWithAdmin\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeProductWithAdmin\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling describeProductWithAdmin\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProductWithAdmin with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loongrayinstances/{instanceId}/products/{productKey}/admin',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改产品\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoT Engine实例ID信息\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} [opts.productName] - 产品名称，名称不可为空，3-30个字符，只支持汉字、英文字母、数字、下划线“_”及中划线“-”，必须以汉字、英文字母及数字开头结尾  optional\n      * @param {string} [opts.productDescription] - 产品描述，80字符以内  optional\n      * @param {integer} [opts.dynamicRegister] - 动态注册,0:关闭，1:开启  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateProductWithAdmin (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateProductWithAdmin\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling updateProductWithAdmin\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling updateProductWithAdmin\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.productName !== undefined && opts.productName !== null) {\n      postBody['productName'] = opts.productName\n    }\n    if (\n      opts.productDescription !== undefined &&\n      opts.productDescription !== null\n    ) {\n      postBody['productDescription'] = opts.productDescription\n    }\n    if (opts.dynamicRegister !== undefined && opts.dynamicRegister !== null) {\n      postBody['dynamicRegister'] = opts.dynamicRegister\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateProductWithAdmin with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loongrayinstances/{instanceId}/products/{productKey}/admin',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除产品\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoT Engine实例ID信息\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteProductWithAdmin (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteProductWithAdmin\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteProductWithAdmin\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling deleteProductWithAdmin\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteProductWithAdmin with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loongrayinstances/{instanceId}/products/{productKey}/admin',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看所有产品的列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoT Engine实例ID信息\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为10，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - productName-产品名称，模糊匹配，支持单个\nproductKey-产品key，精确匹配，支持单个\nproductType-产品类型，精确匹配，支持单个\ntemplateName-模板名称，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pageinfoVO page  分页信息\n      * @param product products\n      */\n\n  listProductsWithAdmin (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listProductsWithAdmin\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling listProductsWithAdmin\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listProductsWithAdmin with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loongrayinstances/{instanceId}/products:describeAll',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新建产品\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoT Engine实例ID信息\n      * @param {string} opts.productName - 产品名称，名称不可为空，3-30个字符，只支持汉字、英文字母、数字、下划线“_”及中划线“-”，必须以汉字、英文字母及数字开头结尾\n      * @param {integer} opts.productType - 节点类型，取值：\n0：设备。设备不能挂载子设备。可以直连物联网平台，也可以作为网关的子设备连接物联网平台\n1：网关。网关可以挂载子设备，具有子设备管理模块，维持子设备的拓扑关系，和将拓扑关系同步到物联网平台\n\n      * @param {string} [opts.productDescription] - 产品描述，80字符以内  optional\n      * @param {string} [opts.templateId] - 物模型模板ID，内部参数，用户不可见，默认为自定义  optional\n      * @param {object} [opts.internalTags] - 内部标签，内部参数，用户不可见，隐藏标签：hidden:true  optional\n      * @param {string} opts.collDeviceType - 产品名下所有设备的采集器类型\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string productKey\n      */\n\n  createAdminProduct (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAdminProduct\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createAdminProduct\"\n      )\n    }\n    if (opts.productName === undefined || opts.productName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productName' when calling createAdminProduct\"\n      )\n    }\n    if (opts.productType === undefined || opts.productType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productType' when calling createAdminProduct\"\n      )\n    }\n    if (opts.collDeviceType === undefined || opts.collDeviceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.collDeviceType' when calling createAdminProduct\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.productName !== undefined && opts.productName !== null) {\n      postBody['productName'] = opts.productName\n    }\n    if (opts.productType !== undefined && opts.productType !== null) {\n      postBody['productType'] = opts.productType\n    }\n    if (\n      opts.productDescription !== undefined &&\n      opts.productDescription !== null\n    ) {\n      postBody['productDescription'] = opts.productDescription\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n    if (opts.internalTags !== undefined && opts.internalTags !== null) {\n      postBody['internalTags'] = opts.internalTags\n    }\n    if (opts.collDeviceType !== undefined && opts.collDeviceType !== null) {\n      postBody['collDeviceType'] = opts.collDeviceType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAdminProduct with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loongrayinstances/{instanceId}/productsAdmin',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看产品列表接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoT Engine实例ID信息\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为10，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - productName-产品名称，模糊匹配，支持单个\nproductKey-产品key，精确匹配，支持单个\nproductType-产品类型，精确匹配，支持单个\ntemplateName-模板名称，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pageinfoVO page  分页信息\n      * @param product products\n      */\n\n  listProducts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listProducts\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling listProducts\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listProducts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新建产品\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoT Engine实例ID信息\n      * @param {string} opts.productName - 产品名称，名称不可为空，3-30个字符，只支持汉字、英文字母、数字、下划线“_”及中划线“-”，必须以汉字、英文字母及数字开头结尾\n      * @param {integer} opts.productType - 节点类型，取值：\n0：设备。设备不能挂载子设备。可以直连物联网平台，也可以作为网关的子设备连接物联网平台\n1：网关。网关可以挂载子设备，具有子设备管理模块，维持子设备的拓扑关系，和将拓扑关系同步到物联网平台\n\n      * @param {string} [opts.productDescription] - 产品描述，80字符以内  optional\n      * @param {string} [opts.templateId] - 物模型模板ID，内部参数，用户不可见，默认为自定义  optional\n      * @param {object} [opts.internalTags] - 内部标签，内部参数，用户不可见，隐藏标签：hidden:true  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string productKey\n      */\n\n  createProduct (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createProduct\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createProduct\"\n      )\n    }\n    if (opts.productName === undefined || opts.productName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productName' when calling createProduct\"\n      )\n    }\n    if (opts.productType === undefined || opts.productType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productType' when calling createProduct\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.productName !== undefined && opts.productName !== null) {\n      postBody['productName'] = opts.productName\n    }\n    if (opts.productType !== undefined && opts.productType !== null) {\n      postBody['productType'] = opts.productType\n    }\n    if (\n      opts.productDescription !== undefined &&\n      opts.productDescription !== null\n    ) {\n      postBody['productDescription'] = opts.productDescription\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n    if (opts.internalTags !== undefined && opts.internalTags !== null) {\n      postBody['internalTags'] = opts.internalTags\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createProduct with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看产品\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoT Engine实例ID信息\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string productName  产品名称\n      * @param integer productType  节点类型，取值：\n0：设备。设备不能挂载子设备。可以直连物联网平台，也可以作为网关的子设备连接物联网平台\n1：网关。网关可以挂载子设备，具有子设备管理模块，维持子设备的拓扑关系，和将拓扑关系同步到物联网平台\n\n      * @param string productKey  产品key\n      * @param string productSecret  产品秘钥\n      * @param integer createdTime  创建时间,时间为东八区（UTC/GMT+08:00）\n      * @param integer deviceCount  包含设备数\n      * @param integer dynamicRegister  动态注册,0:关闭，1:开启\n      * @param string productDescription  产品描述信息\n      * @param string templateName  产品类型,如自定义等\n      */\n\n  describeProduct (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeProduct\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeProduct\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling describeProduct\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProduct with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改产品\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoT Engine实例ID信息\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} [opts.productName] - 产品名称，名称不可为空，3-30个字符，只支持汉字、英文字母、数字、下划线“_”及中划线“-”，必须以汉字、英文字母及数字开头结尾  optional\n      * @param {string} [opts.productDescription] - 产品描述，80字符以内  optional\n      * @param {integer} [opts.dynamicRegister] - 动态注册,0:关闭，1:开启  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateProduct (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateProduct\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling updateProduct\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling updateProduct\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.productName !== undefined && opts.productName !== null) {\n      postBody['productName'] = opts.productName\n    }\n    if (\n      opts.productDescription !== undefined &&\n      opts.productDescription !== null\n    ) {\n      postBody['productDescription'] = opts.productDescription\n    }\n    if (opts.dynamicRegister !== undefined && opts.dynamicRegister !== null) {\n      postBody['dynamicRegister'] = opts.dynamicRegister\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateProduct with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除产品\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoT Engine实例ID信息\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteProduct (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteProduct\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteProduct\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling deleteProduct\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteProduct with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看产品功能列表接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoT Hub实例ID信息\n      * @param {string} opts.productKey - 产品Key\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为10，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - abilityName-功能名称，精确匹配\nabilityType-功能类型，精确匹配\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pageinfoVO page  分页信息\n      * @param productAbility abilities\n      */\n\n  listProductAbilities (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listProductAbilities\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling listProductAbilities\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling listProductAbilities\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listProductAbilities with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/abilities',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  导入物模型\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoT Hub实例ID信息\n      * @param {string} opts.productKey - 产品Key\n      * @param {object} opts.thingModel - 物模型JSON\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  importThingModel (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  importThingModel\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling importThingModel\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling importThingModel\"\n      )\n    }\n    if (opts.thingModel === undefined || opts.thingModel === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.thingModel' when calling importThingModel\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.thingModel !== undefined && opts.thingModel !== null) {\n      postBody['thingModel'] = opts.thingModel\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call importThingModel with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/abilities:importThingModel',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  导出物模型\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoT Hub实例ID信息\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object thingModel\n      */\n\n  exportThingModel (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  exportThingModel\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling exportThingModel\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling exportThingModel\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call exportThingModel with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/abilities:exportThingModel',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看产品自定义Topic列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoTCore实例ID信息\n      * @param {string} opts.productKey - 产品Key\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为10，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - topicShortName-topic名称，模糊匹配，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pageinfoVO page  分页信息\n      * @param productTopic productTopics\n      */\n\n  describeProductTopics (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeProductTopics\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeProductTopics\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling describeProductTopics\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProductTopics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/topics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新建产品自定义Topic\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoTCore实例ID信息\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} opts.topicShortName - Topic名称为必填，同一个产品下的Topic名称不能重复\n只能包含字母，数字和下划线，最多64个字符，每个层级都不能为空\n不能以/结尾\n\n      * @param {string} opts.topicOperation - 操作权限，设备对该Topic类的操作权限，取值\npub:发布\nsub:订阅\n\n      * @param {string} [opts.topicDescription] - 描述, 0-50个字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string topicId\n      */\n\n  createProductTopic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createProductTopic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createProductTopic\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling createProductTopic\"\n      )\n    }\n    if (opts.topicShortName === undefined || opts.topicShortName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicShortName' when calling createProductTopic\"\n      )\n    }\n    if (opts.topicOperation === undefined || opts.topicOperation === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicOperation' when calling createProductTopic\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.topicShortName !== undefined && opts.topicShortName !== null) {\n      postBody['topicShortName'] = opts.topicShortName\n    }\n    if (opts.topicOperation !== undefined && opts.topicOperation !== null) {\n      postBody['topicOperation'] = opts.topicOperation\n    }\n    if (opts.topicDescription !== undefined && opts.topicDescription !== null) {\n      postBody['topicDescription'] = opts.topicDescription\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createProductTopic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/topics',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看产品自定义Topic\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoTCore实例ID信息\n      * @param {string} opts.productKey - 产品Key\n      * @param {string} opts.topicId - 自定义topic唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string topicShortName  Topic名称为必填，同一个产品下的Topic名称不能重复\n只能包含字母，数字和下划线，最多64个字符，每个层级都不能为空\n不能以/结尾\n\n      * @param string topicOperation  操作权限，设备对该Topic类的操作权限，取值\npub:发布\nsub:订阅\n\n      * @param string topicDescription  描述, 0-50个字符\n      * @param integer createdTime  创建时间,时间为东八区（UTC/GMT+08:00）\n      * @param integer udpatedTime  修改时间,时间为东八区（UTC/GMT+08:00）\n      */\n\n  describeProductTopic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeProductTopic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeProductTopic\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling describeProductTopic\"\n      )\n    }\n    if (opts.topicId === undefined || opts.topicId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicId' when calling describeProductTopic\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      productKey: opts.productKey,\n      topicId: opts.topicId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotcore/1.1.25'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProductTopic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/topics/{topicId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = IOTCORE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/iotedge/v2/iotedge.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * EdgeSubDeviceManager\n * iotcore-Edge子设备管理\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iotedge'\nService._services[serviceId] = true\n\n/**\n * iotedge service.\n * @version 1.0.0\n */\n\nJDCloud.IOTEDGE = class IOTEDGE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'console-be.iotedge.jdcloud.com'\n    options.basePath = '/v2' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  部署APP应用\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.hardwareId - 硬件版本\n      * @param {string} opts.osId - OSID\n      * @param {string} opts.appName - App内部名称\n      * @param {string} opts.appVersion - App版本\n      * @param {string} opts.edgeName - edge名称\n      * @param {string} [opts.env] - App安装变量（默认为空字符串）  optional\n      * @param {integer} opts.privileged - 是否特权模式运行(0-否 1-是)\n      * @param {string} [opts.volume] - 硬盘操作卷  optional\n      * @param {integer} opts.appType - App类型(1-设备服务 2-边缘应用)\n      * @param {integer} opts.useHost - 是否使用Edge系统的Host配置(0-否 1-是)\n      * @param {integer} opts.cpuShares - CPU权重（低-128 中-256 高-512）\n      * @param {string} opts.memoryLimit - 内存限制（0-无限 低-128 中-256 高-512）\n      * @param {string} opts.restartPolicy - 重启策略(0-never 1-always 2-onFailure)\n      * @param {integer} opts.deployAppStatus - 部署APP状态(3-更新 其余都是安装)\n      * @param {integer} [opts.appStatus] - App状态  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer deployStatus  部署状态\n      */\n\n  deployApp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deployApp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deployApp\"\n      )\n    }\n    if (opts.hardwareId === undefined || opts.hardwareId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.hardwareId' when calling deployApp\"\n      )\n    }\n    if (opts.osId === undefined || opts.osId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.osId' when calling deployApp\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling deployApp\"\n      )\n    }\n    if (opts.appVersion === undefined || opts.appVersion === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appVersion' when calling deployApp\"\n      )\n    }\n    if (opts.edgeName === undefined || opts.edgeName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.edgeName' when calling deployApp\"\n      )\n    }\n    if (opts.privileged === undefined || opts.privileged === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.privileged' when calling deployApp\"\n      )\n    }\n    if (opts.appType === undefined || opts.appType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appType' when calling deployApp\"\n      )\n    }\n    if (opts.useHost === undefined || opts.useHost === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.useHost' when calling deployApp\"\n      )\n    }\n    if (opts.cpuShares === undefined || opts.cpuShares === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cpuShares' when calling deployApp\"\n      )\n    }\n    if (opts.memoryLimit === undefined || opts.memoryLimit === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.memoryLimit' when calling deployApp\"\n      )\n    }\n    if (opts.restartPolicy === undefined || opts.restartPolicy === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restartPolicy' when calling deployApp\"\n      )\n    }\n    if (opts.deployAppStatus === undefined || opts.deployAppStatus === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deployAppStatus' when calling deployApp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.appVersion !== undefined && opts.appVersion !== null) {\n      postBody['appVersion'] = opts.appVersion\n    }\n    if (opts.edgeName !== undefined && opts.edgeName !== null) {\n      postBody['edgeName'] = opts.edgeName\n    }\n    if (opts.env !== undefined && opts.env !== null) {\n      postBody['env'] = opts.env\n    }\n    if (opts.privileged !== undefined && opts.privileged !== null) {\n      postBody['privileged'] = opts.privileged\n    }\n    if (opts.volume !== undefined && opts.volume !== null) {\n      postBody['volume'] = opts.volume\n    }\n    if (opts.appType !== undefined && opts.appType !== null) {\n      postBody['appType'] = opts.appType\n    }\n    if (opts.useHost !== undefined && opts.useHost !== null) {\n      postBody['useHost'] = opts.useHost\n    }\n    if (opts.cpuShares !== undefined && opts.cpuShares !== null) {\n      postBody['cpuShares'] = opts.cpuShares\n    }\n    if (opts.memoryLimit !== undefined && opts.memoryLimit !== null) {\n      postBody['memoryLimit'] = opts.memoryLimit\n    }\n    if (opts.restartPolicy !== undefined && opts.restartPolicy !== null) {\n      postBody['restartPolicy'] = opts.restartPolicy\n    }\n    if (opts.deployAppStatus !== undefined && opts.deployAppStatus !== null) {\n      postBody['deployAppStatus'] = opts.deployAppStatus\n    }\n    if (opts.appStatus !== undefined && opts.appStatus !== null) {\n      postBody['appStatus'] = opts.appStatus\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      hardwareId: opts.hardwareId,\n      osId: opts.osId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotedge/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deployApp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/hardwareId/{hardwareId}/os/{osId}/edgeApp:deployApp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询已经部署的App应用\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.hardwareId - 硬件版本\n      * @param {string} opts.osId - OSID\n      * @param {string} opts.edgeName - Edge名称\n      * @param {string} opts.productKey - Edge对应的产品Key\n      * @param {integer} opts.appType - App类型(1-设备服务 2-边缘应用)\n      * @param {integer} [opts.nowPage] - 当前的规则位置  optional\n      * @param {integer} [opts.pageSize] - 显示多少个数据  optional\n      * @param {integer} [opts.order] - 排序方式  optional\n      * @param {integer} [opts.property] - 排序依据的关键词  optional\n      * @param {string} [opts.searchText] - 模糊搜索关键字  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeAppsRespVO appsResp\n      * @param object page  分页信息\n      */\n\n  describeDeployApp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeployApp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeDeployApp\"\n      )\n    }\n    if (opts.hardwareId === undefined || opts.hardwareId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.hardwareId' when calling describeDeployApp\"\n      )\n    }\n    if (opts.osId === undefined || opts.osId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.osId' when calling describeDeployApp\"\n      )\n    }\n    if (opts.edgeName === undefined || opts.edgeName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.edgeName' when calling describeDeployApp\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling describeDeployApp\"\n      )\n    }\n    if (opts.appType === undefined || opts.appType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appType' when calling describeDeployApp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.edgeName !== undefined && opts.edgeName !== null) {\n      postBody['edgeName'] = opts.edgeName\n    }\n    if (opts.productKey !== undefined && opts.productKey !== null) {\n      postBody['productKey'] = opts.productKey\n    }\n    if (opts.appType !== undefined && opts.appType !== null) {\n      postBody['appType'] = opts.appType\n    }\n    if (opts.nowPage !== undefined && opts.nowPage !== null) {\n      postBody['nowPage'] = opts.nowPage\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.order !== undefined && opts.order !== null) {\n      postBody['order'] = opts.order\n    }\n    if (opts.property !== undefined && opts.property !== null) {\n      postBody['property'] = opts.property\n    }\n    if (opts.searchText !== undefined && opts.searchText !== null) {\n      postBody['searchText'] = opts.searchText\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      hardwareId: opts.hardwareId,\n      osId: opts.osId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotedge/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeployApp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/hardwareId/{hardwareId}/os/{osId}/edgeApp:describeDeployApp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询APP部署列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.hardwareId - 硬件版本\n      * @param {string} opts.osId - OSID\n      * @param {string} opts.appName - Edge名称\n      * @param {integer} [opts.nowPage] - 当前的规则位置  optional\n      * @param {integer} [opts.pageSize] - 显示多少个数据  optional\n      * @param {integer} [opts.order] - 排序方式  optional\n      * @param {integer} [opts.property] - 排序依据的关键词  optional\n      * @param {string} [opts.searchText] - 模糊搜索关键字  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeDeployDetailsRespVO deployDetails\n      * @param object page  分页信息\n      */\n\n  describeDeployDetails (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeployDetails\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeDeployDetails\"\n      )\n    }\n    if (opts.hardwareId === undefined || opts.hardwareId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.hardwareId' when calling describeDeployDetails\"\n      )\n    }\n    if (opts.osId === undefined || opts.osId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.osId' when calling describeDeployDetails\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling describeDeployDetails\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.nowPage !== undefined && opts.nowPage !== null) {\n      postBody['nowPage'] = opts.nowPage\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.order !== undefined && opts.order !== null) {\n      postBody['order'] = opts.order\n    }\n    if (opts.property !== undefined && opts.property !== null) {\n      postBody['property'] = opts.property\n    }\n    if (opts.searchText !== undefined && opts.searchText !== null) {\n      postBody['searchText'] = opts.searchText\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      hardwareId: opts.hardwareId,\n      osId: opts.osId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotedge/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeployDetails with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/hardwareId/{hardwareId}/os/{osId}/edgeApp:describeDeployDetails',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  卸载安装的APP\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.hardwareId - 硬件版本\n      * @param {string} opts.osId - OSID\n      * @param {string} opts.edgeName - Edge名称\n      * @param {string} opts.appName - APP名称\n      * @param {string} opts.deployAppId - 部署ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer unInstallStatus  删除状态\n      */\n\n  unInstallApp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  unInstallApp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling unInstallApp\"\n      )\n    }\n    if (opts.hardwareId === undefined || opts.hardwareId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.hardwareId' when calling unInstallApp\"\n      )\n    }\n    if (opts.osId === undefined || opts.osId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.osId' when calling unInstallApp\"\n      )\n    }\n    if (opts.edgeName === undefined || opts.edgeName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.edgeName' when calling unInstallApp\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling unInstallApp\"\n      )\n    }\n    if (opts.deployAppId === undefined || opts.deployAppId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deployAppId' when calling unInstallApp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.edgeName !== undefined && opts.edgeName !== null) {\n      postBody['edgeName'] = opts.edgeName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.deployAppId !== undefined && opts.deployAppId !== null) {\n      postBody['deployAppId'] = opts.deployAppId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      hardwareId: opts.hardwareId,\n      osId: opts.osId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotedge/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call unInstallApp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/hardwareId/{hardwareId}/os/{osId}/edgeApp:unInstallApp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  APP启动/停止服务\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.hardwareId - 硬件版本\n      * @param {string} opts.osId - OSID\n      * @param {string} opts.appName - App名称\n      * @param {integer} opts.status - APP状态(0停止 1启动)\n      * @param {string} opts.edgeName - Edge名称\n      * @param {string} opts.appVersion - App版本\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer appStatus  app状态\n      */\n\n  setAppStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setAppStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling setAppStatus\"\n      )\n    }\n    if (opts.hardwareId === undefined || opts.hardwareId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.hardwareId' when calling setAppStatus\"\n      )\n    }\n    if (opts.osId === undefined || opts.osId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.osId' when calling setAppStatus\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling setAppStatus\"\n      )\n    }\n    if (opts.status === undefined || opts.status === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.status' when calling setAppStatus\"\n      )\n    }\n    if (opts.edgeName === undefined || opts.edgeName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.edgeName' when calling setAppStatus\"\n      )\n    }\n    if (opts.appVersion === undefined || opts.appVersion === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appVersion' when calling setAppStatus\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.edgeName !== undefined && opts.edgeName !== null) {\n      postBody['edgeName'] = opts.edgeName\n    }\n    if (opts.appVersion !== undefined && opts.appVersion !== null) {\n      postBody['appVersion'] = opts.appVersion\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      hardwareId: opts.hardwareId,\n      osId: opts.osId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotedge/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setAppStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/hardwareId/{hardwareId}/os/{osId}/edgeApp:setAppStatus',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  部署内容查询\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 设备归属的实例ID\n      * @param {string} opts.hardwareId - 硬件版本\n      * @param {string} opts.osId - OSID\n      * @param {string} opts.appName - App名称\n      * @param {string} opts.appVersion - app版本\n      * @param {string} opts.edgeName - edge名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeDeployConfigResp describeConfig  App部署信息\n      */\n\n  describeConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeConfig\"\n      )\n    }\n    if (opts.hardwareId === undefined || opts.hardwareId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.hardwareId' when calling describeConfig\"\n      )\n    }\n    if (opts.osId === undefined || opts.osId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.osId' when calling describeConfig\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling describeConfig\"\n      )\n    }\n    if (opts.appVersion === undefined || opts.appVersion === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appVersion' when calling describeConfig\"\n      )\n    }\n    if (opts.edgeName === undefined || opts.edgeName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.edgeName' when calling describeConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.appVersion !== undefined && opts.appVersion !== null) {\n      postBody['appVersion'] = opts.appVersion\n    }\n    if (opts.edgeName !== undefined && opts.edgeName !== null) {\n      postBody['edgeName'] = opts.edgeName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      hardwareId: opts.hardwareId,\n      osId: opts.osId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotedge/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/hardwareId/{hardwareId}/os/{osId}/edgeApp:describeConfig',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除Edge接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoTCore实例编号\n      * @param {string} opts.edgeName - Edge名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteEdgeWithCore (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteEdgeWithCore\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteEdgeWithCore\"\n      )\n    }\n    if (opts.edgeName === undefined || opts.edgeName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.edgeName' when calling deleteEdgeWithCore\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      edgeName: opts.edgeName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotedge/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteEdgeWithCore with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/edges/{edgeName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加Edge设备\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoTCore实例编号\n      * @param {string} opts.edgeName - Edge名称\n      * @param {string} opts.architecture - 硬件平台编号，具体参数参见硬件平台参数文档\n      * @param {string} opts.os - 操作系统编号，具体参数参见操作系统参数文档\n      * @param {string} opts.manufacturer - Edge厂家信息\n      * @param {string} opts.edgeModel - Edge型号信息\n      * @param {string} [opts.edgeDesc] - Edge描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addEdgeWithCore (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addEdgeWithCore\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling addEdgeWithCore\"\n      )\n    }\n    if (opts.edgeName === undefined || opts.edgeName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.edgeName' when calling addEdgeWithCore\"\n      )\n    }\n    if (opts.architecture === undefined || opts.architecture === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.architecture' when calling addEdgeWithCore\"\n      )\n    }\n    if (opts.os === undefined || opts.os === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.os' when calling addEdgeWithCore\"\n      )\n    }\n    if (opts.manufacturer === undefined || opts.manufacturer === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.manufacturer' when calling addEdgeWithCore\"\n      )\n    }\n    if (opts.edgeModel === undefined || opts.edgeModel === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.edgeModel' when calling addEdgeWithCore\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.architecture !== undefined && opts.architecture !== null) {\n      postBody['architecture'] = opts.architecture\n    }\n    if (opts.os !== undefined && opts.os !== null) {\n      postBody['os'] = opts.os\n    }\n    if (opts.manufacturer !== undefined && opts.manufacturer !== null) {\n      postBody['manufacturer'] = opts.manufacturer\n    }\n    if (opts.edgeModel !== undefined && opts.edgeModel !== null) {\n      postBody['edgeModel'] = opts.edgeModel\n    }\n    if (opts.edgeDesc !== undefined && opts.edgeDesc !== null) {\n      postBody['edgeDesc'] = opts.edgeDesc\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      edgeName: opts.edgeName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotedge/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addEdgeWithCore with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/edges/{edgeName}:addEdge',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加子设备\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoTCore实例编号\n      * @param {string} opts.edgeName - Edge名称\n      * @param {string} opts.productKey - Edge的ProductKey\n      * @param {array} [opts.devices] - 待添加的子设备列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addSubDeviceWithCore (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addSubDeviceWithCore\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling addSubDeviceWithCore\"\n      )\n    }\n    if (opts.edgeName === undefined || opts.edgeName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.edgeName' when calling addSubDeviceWithCore\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling addSubDeviceWithCore\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.devices !== undefined && opts.devices !== null) {\n      postBody['devices'] = opts.devices\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      edgeName: opts.edgeName,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotedge/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addSubDeviceWithCore with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/edges/{edgeName}:addSubDevice',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除子设备\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - IoTCore实例编号\n      * @param {string} opts.edgeName - Edge名称\n      * @param {string} opts.productKey - Edge对应的产品key\n      * @param {array} [opts.delDevices] - 设备名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  delSubDeviceWithCore (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  delSubDeviceWithCore\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling delSubDeviceWithCore\"\n      )\n    }\n    if (opts.edgeName === undefined || opts.edgeName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.edgeName' when calling delSubDeviceWithCore\"\n      )\n    }\n    if (opts.productKey === undefined || opts.productKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.productKey' when calling delSubDeviceWithCore\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.delDevices !== undefined && opts.delDevices !== null) {\n      postBody['delDevices'] = opts.delDevices\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      edgeName: opts.edgeName,\n      productKey: opts.productKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotedge/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call delSubDeviceWithCore with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/products/{productKey}/edges/{edgeName}:delSubDevice',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.IOTEDGE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/iothub/v1/iothub.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * RuleEngineAPI\n * 规则引擎API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iothub'\nService._services[serviceId] = true\n\n/**\n * iothub service.\n * @version 0.6.6\n */\n\nJDCloud.IOTHUB = class IOTHUB extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'iothub.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  删除设备\n      * @param {Object} opts - parameters\n      * @param {string} [opts.deviceId] - 设备Id  optional\n      * @param {string} [opts.instanceId] - hub实例instanceId  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDevice (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceId !== undefined && opts.deviceId !== null) {\n      queryParams['deviceId'] = opts.deviceId\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/device',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询设备在线信息\n      * @param {Object} opts - parameters\n      * @param {array} [opts.deviceIds] - 设备Id集合  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param onlineInfo onlineInfos\n      */\n\n  queryDeviceOnlineInfos (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.deviceIds !== undefined && opts.deviceIds !== null) {\n      postBody['deviceIds'] = opts.deviceIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDeviceOnlineInfos with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/device:queryOnlineInfos',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  激活一个设备，包括Edge、Dragon和普通设备\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceId - Device 唯一标识\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  deviceActivate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling deviceActivate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      deviceId: opts.deviceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deviceActivate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/device/{deviceId}/activate',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  客户用该接口可以批量登记设备\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.instanceId]   optional\n      * @param {deviceEnrollVO} [opts.device]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  devicesEnroll (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.device !== undefined && opts.device !== null) {\n      postBody['device'] = opts.device\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call devicesEnroll with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/device',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  客户用该接口可以查询设备命令列表\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceId - Device 唯一标识\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string commands\n      */\n\n  queryDeviceCommands (opts, callback) {\n    opts = opts || {}\n\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling queryDeviceCommands\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      deviceId: opts.deviceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDeviceCommands with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/device/{deviceId}/command',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  客户用该接口可以对设备下发命令\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceId - Device 唯一标识\n      * @param {deviceCommandVO} [opts.commands]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  deviceCommand (opts, callback) {\n    opts = opts || {}\n\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling deviceCommand\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.commands !== undefined && opts.commands !== null) {\n      postBody['commands'] = opts.commands\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      deviceId: opts.deviceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deviceCommand with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/device/{deviceId}/command',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  客户用该接口可以查询设备预期状态\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceId - Device 唯一标识\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string state\n      */\n\n  queryDeviceStates (opts, callback) {\n    opts = opts || {}\n\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling queryDeviceStates\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      deviceId: opts.deviceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDeviceStates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/device/{deviceId}/state',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  客户用该接口可以修改设备预期状态\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceId - Device 唯一标识\n      * @param {string} [opts.states]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  deviceState (opts, callback) {\n    opts = opts || {}\n\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling deviceState\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.states !== undefined && opts.states !== null) {\n      postBody['states'] = opts.states\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      deviceId: opts.deviceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deviceState with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/device/{deviceId}/state',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  验证DeviceId是否可用\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceId - Device 唯一标识\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  checkDeviceId (opts, callback) {\n    opts = opts || {}\n\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling checkDeviceId\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      deviceId: opts.deviceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkDeviceId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/device/{deviceId}:check',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  客户用该接口可以登记模块\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.moduleName - moduleName 唯一标识\n      * @param {string} [opts.instanceId]   optional\n      * @param {string} [opts.modelName]   optional\n      * @param {string} [opts.parentDeviceName]   optional\n      * @param {string} [opts.name]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  moduleEnrollment (opts, callback) {\n    opts = opts || {}\n\n    if (opts.moduleName === undefined || opts.moduleName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.moduleName' when calling moduleEnrollment\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.modelName !== undefined && opts.modelName !== null) {\n      postBody['modelName'] = opts.modelName\n    }\n    if (opts.parentDeviceName !== undefined && opts.parentDeviceName !== null) {\n      postBody['parentDeviceName'] = opts.parentDeviceName\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      moduleName: opts.moduleName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call moduleEnrollment with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/module/{moduleName}/enroll',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  客户用该接口可以修改模块预期状态\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.moduleName - moduleName 唯一标识\n      * @param {string} [opts.states]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  moduleState (opts, callback) {\n    opts = opts || {}\n\n    if (opts.moduleName === undefined || opts.moduleName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.moduleName' when calling moduleState\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.states !== undefined && opts.states !== null) {\n      postBody['states'] = opts.states\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      moduleName: opts.moduleName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call moduleState with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/module/{moduleName}/state',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取下载物模型的外链地址\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.deviceId\n      * @param {string} [opts.instanceId]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string privateUrl\n      */\n\n  getOMPrivateURL (opts, callback) {\n    opts = opts || {}\n\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling getOMPrivateURL\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      deviceId: opts.deviceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getOMPrivateURL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/om/{deviceId}/privateurl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物模型通过文件上传注册接口\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.fileName - 物模型文件名称\n      * @param {string} opts.instanceId - 待上传物模型的IoT Hub实例编号\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  omEnrollbyFile (opts, callback) {\n    opts = opts || {}\n\n    if (opts.fileName === undefined || opts.fileName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileName' when calling omEnrollbyFile\"\n      )\n    }\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling omEnrollbyFile\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      fileName: opts.fileName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call omEnrollbyFile with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/file/{fileName}/om',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物模型注册接口\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.omName - 物模型唯一标识\n      * @param {string} [opts.instanceId]   optional\n      * @param {string} [opts.payload]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  omEnroll (opts, callback) {\n    opts = opts || {}\n\n    if (opts.omName === undefined || opts.omName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.omName' when calling omEnroll\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.payload !== undefined && opts.payload !== null) {\n      postBody['payload'] = opts.payload\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      omName: opts.omName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iothub/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call omEnroll with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/om/{omName}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.IOTHUB\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/iotlink/v1/iotlink.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Iotlink-Related-API\n * 物联网卡服务相关API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iotlink'\nService._services[serviceId] = true\n\n/**\n * iotlink service.\n * @version 1.0.8\n */\n\nclass IOTLINK extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'iotlink.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  物联网卡实名制信息清除\n      * @param {Object} opts - parameters\n      * @param {string} opts.requestParam - 物联网卡实名制信息清除请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;其他:失败)\n      * @param string message  消息描述\n      * @param boolean result  物联网卡实名制信息清除返回结果集\n      */\n\n  ordinaryRealNameClear (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  ordinaryRealNameClear\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.requestParam === undefined || opts.requestParam === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.requestParam' when calling ordinaryRealNameClear\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.requestParam !== undefined && opts.requestParam !== null) {\n      postBody['requestParam'] = opts.requestParam\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call ordinaryRealNameClear with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ordinaryRealNameClear',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  机卡分离状态查询\n      * @param {Object} opts - parameters\n      * @param {string} opts.iccid - 物联网卡iccid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param cardBindStatusResp result  机卡分离状态查询结果\n      */\n\n  cardBindStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  cardBindStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.iccid === undefined || opts.iccid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.iccid' when calling cardBindStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.iccid !== undefined && opts.iccid !== null) {\n      queryParams['iccid'] = opts.iccid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cardBindStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cardBindStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  在线状态和会话信息查询\n      * @param {Object} opts - parameters\n      * @param {string} opts.iccid - 物联网卡iccid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param getOnlineStatusResp result  在线状态和会话信息查询结果\n      */\n\n  getOnlineStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getOnlineStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.iccid === undefined || opts.iccid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.iccid' when calling getOnlineStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.iccid !== undefined && opts.iccid !== null) {\n      queryParams['iccid'] = opts.iccid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getOnlineStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/getOnlineStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  NB卡有效期查询\n      * @param {Object} opts - parameters\n      * @param {string} opts.requestParam - 物联网卡NB卡有效期查询请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;其他:失败)\n      * @param string message  消息描述\n      * @param queryValidPeriodForNBResp result\n      */\n\n  queryValidPeriodForNB (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryValidPeriodForNB\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.requestParam === undefined || opts.requestParam === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.requestParam' when calling queryValidPeriodForNB\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.requestParam !== undefined && opts.requestParam !== null) {\n      postBody['requestParam'] = opts.requestParam\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryValidPeriodForNB with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/queryValidPeriodForNB',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡日历史流量查询接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.requestParam - 物联网卡日历史流量查询请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;其他:失败)\n      * @param string message  消息描述\n      * @param object result\n      */\n\n  queryDayHistoryTraffic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryDayHistoryTraffic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.requestParam === undefined || opts.requestParam === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.requestParam' when calling queryDayHistoryTraffic\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.requestParam !== undefined && opts.requestParam !== null) {\n      postBody['requestParam'] = opts.requestParam\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryDayHistoryTraffic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/queryDayHistoryTraffic',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡移动实名登记接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.requestParam - 物联网卡移动实名登记请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;其他:失败)\n      * @param string message  消息描述\n      * @param simRealNameRegResp result  物联网卡移动实名登记信息\n      */\n\n  simRealNameReg (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  simRealNameReg\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.requestParam === undefined || opts.requestParam === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.requestParam' when calling simRealNameReg\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.requestParam !== undefined && opts.requestParam !== null) {\n      postBody['requestParam'] = opts.requestParam\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call simRealNameReg with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/simRealNameReg',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡流量查询（时间段）查询接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.requestParam - 物联网卡流量查询（时间段）查询请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;其他:失败)\n      * @param string message  消息描述\n      * @param string result  物联网卡时间段总使用流量\n      */\n\n  queryTrafficByDate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryTrafficByDate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.requestParam === undefined || opts.requestParam === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.requestParam' when calling queryTrafficByDate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.requestParam !== undefined && opts.requestParam !== null) {\n      postBody['requestParam'] = opts.requestParam\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryTrafficByDate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/queryTrafficByDate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡自主限速接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.requestParam - 物联网卡自主限速请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;其他:失败)\n      * @param string message  消息描述\n      * @param boolean result  物联网卡自主限速返回结果集\n      */\n\n  speedLimitAction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  speedLimitAction\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.requestParam === undefined || opts.requestParam === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.requestParam' when calling speedLimitAction\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.requestParam !== undefined && opts.requestParam !== null) {\n      postBody['requestParam'] = opts.requestParam\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call speedLimitAction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/speedLimitAction',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物联网卡iccid查询该卡的基本信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.iccid - 物联网卡iccid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param cardInfoResp result  指定物联网卡的卡基本信息\n      */\n\n  cardInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  cardInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.iccid === undefined || opts.iccid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.iccid' when calling cardInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.iccid !== undefined && opts.iccid !== null) {\n      queryParams['iccid'] = opts.iccid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cardInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cardInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物联网卡iccid查询该卡的实名认证信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.iccid - 物联网卡iccid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param realNameQueryIotResp result  指定物联网卡的实名认证状态信息\n      */\n\n  realNameQueryIot (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  realNameQueryIot\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.iccid === undefined || opts.iccid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.iccid' when calling realNameQueryIot\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.iccid !== undefined && opts.iccid !== null) {\n      queryParams['iccid'] = opts.iccid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call realNameQueryIot with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/realNameQueryIot',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物联网卡IMSI查询该卡的GPRS状态信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.imsi - 物联网卡IMSI\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param gprsStatusResp result  指定物联网卡的gprs状态信息\n      */\n\n  gprsStatusByIMSI (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  gprsStatusByIMSI\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imsi === undefined || opts.imsi === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imsi' when calling gprsStatusByIMSI\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.imsi !== undefined && opts.imsi !== null) {\n      queryParams['imsi'] = opts.imsi\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call gprsStatusByIMSI with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/gprsStatusByIMSI',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物联网卡imsi查询该卡的开关机状态信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.imsi - 物联网卡imsi\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param onOffStatusResp result  指定物联网卡的开关机状态信息\n      */\n\n  onOffStatusByIMSI (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  onOffStatusByIMSI\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imsi === undefined || opts.imsi === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imsi' when calling onOffStatusByIMSI\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.imsi !== undefined && opts.imsi !== null) {\n      queryParams['imsi'] = opts.imsi\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call onOffStatusByIMSI with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/onOffStatusByIMSI',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物联网卡imsi查询该卡的生命周期信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.imsi - 物联网卡imsi\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param lifeStatusResp result  指定物联网卡的生命周期信息\n      */\n\n  lifeStatusByIMSI (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  lifeStatusByIMSI\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imsi === undefined || opts.imsi === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imsi' when calling lifeStatusByIMSI\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.imsi !== undefined && opts.imsi !== null) {\n      queryParams['imsi'] = opts.imsi\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call lifeStatusByIMSI with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/lifeStatusByIMSI',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物联网卡imsi查询该卡的当月套餐内的GPRS实时使用量\n      * @param {Object} opts - parameters\n      * @param {string} opts.imsi - 物联网卡imsi\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param gprsRealtimeInfoResp result  指定物联网卡的当月套餐内的GPRS实时使用量\n      */\n\n  gprsRealtimeInfoByIMSI (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  gprsRealtimeInfoByIMSI\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imsi === undefined || opts.imsi === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imsi' when calling gprsRealtimeInfoByIMSI\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.imsi !== undefined && opts.imsi !== null) {\n      queryParams['imsi'] = opts.imsi\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call gprsRealtimeInfoByIMSI with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/gprsRealtimeInfoByIMSI',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物联网卡iccid查询该卡的gprs状态信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.iccid - 物联网卡iccid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param gprsStatusResp result  指定物联网卡的gprs状态信息\n      */\n\n  gprsStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  gprsStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.iccid === undefined || opts.iccid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.iccid' when calling gprsStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.iccid !== undefined && opts.iccid !== null) {\n      queryParams['iccid'] = opts.iccid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call gprsStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/gprsStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物联网卡iccid查询该卡的开关机状态信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.iccid - 物联网卡iccid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param onOffStatusResp result  指定物联网卡的开关机状态信息\n      */\n\n  onOffStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  onOffStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.iccid === undefined || opts.iccid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.iccid' when calling onOffStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.iccid !== undefined && opts.iccid !== null) {\n      queryParams['iccid'] = opts.iccid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call onOffStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/onOffStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物联网卡iccid查询该卡的生命周期信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.iccid - 物联网卡iccid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param lifeStatusResp result  指定物联网卡的生命周期信息\n      */\n\n  lifeStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  lifeStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.iccid === undefined || opts.iccid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.iccid' when calling lifeStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.iccid !== undefined && opts.iccid !== null) {\n      queryParams['iccid'] = opts.iccid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call lifeStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/lifeStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据物联网卡iccid查询该卡的当月套餐内的GPRS实时使用量\n      * @param {Object} opts - parameters\n      * @param {string} opts.iccid - 物联网卡iccid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param gprsRealtimeInfoResp result  指定物联网卡的当月套餐内的GPRS实时使用量\n      */\n\n  gprsRealtimeInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  gprsRealtimeInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.iccid === undefined || opts.iccid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.iccid' when calling gprsRealtimeInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.iccid !== undefined && opts.iccid !== null) {\n      queryParams['iccid'] = opts.iccid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call gprsRealtimeInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/gprsRealtimeInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡开机操作\n      * @param {Object} opts - parameters\n      * @param {array} [opts.iccids] - 物联网卡号码列表(单次提交最多不超过200个号码)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param operationIotlinkResp result\n      */\n\n  openIotCard (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  openIotCard\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.iccids !== undefined && opts.iccids !== null) {\n      postBody['iccids'] = opts.iccids\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call openIotCard with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/openIotCard',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡停机操作\n      * @param {Object} opts - parameters\n      * @param {array} [opts.iccids] - 物联网卡号码列表(单次提交最多不超过200个号码)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param operationIotlinkResp result\n      */\n\n  closeIotCard (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  closeIotCard\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.iccids !== undefined && opts.iccids !== null) {\n      postBody['iccids'] = opts.iccids\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call closeIotCard with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/closeIotCard',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡开启流量操作\n      * @param {Object} opts - parameters\n      * @param {array} [opts.iccids] - 物联网卡号码列表(单次提交最多不超过200个号码)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param operationIotlinkResp result\n      */\n\n  openIotFlow (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  openIotFlow\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.iccids !== undefined && opts.iccids !== null) {\n      postBody['iccids'] = opts.iccids\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call openIotFlow with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/openIotFlow',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡停流量操作\n      * @param {Object} opts - parameters\n      * @param {array} [opts.iccids] - 物联网卡号码列表(单次提交最多不超过200个号码)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param operationIotlinkResp result\n      */\n\n  closeIotFlow (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  closeIotFlow\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.iccids !== undefined && opts.iccids !== null) {\n      postBody['iccids'] = opts.iccids\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call closeIotFlow with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/closeIotFlow',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡查询通用操作\n      * @param {Object} opts - parameters\n      * @param {string} opts.requestType - 物联网卡查询请求类型\n      * @param {string} opts.requestParam - 物联网卡查询请求参数json串\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param string result  物联网卡查询返回结果集\n      */\n\n  search (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  search\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.requestType === undefined || opts.requestType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.requestType' when calling search\"\n      )\n    }\n    if (opts.requestParam === undefined || opts.requestParam === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.requestParam' when calling search\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.requestType !== undefined && opts.requestType !== null) {\n      postBody['requestType'] = opts.requestType\n    }\n    if (opts.requestParam !== undefined && opts.requestParam !== null) {\n      postBody['requestParam'] = opts.requestParam\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call search with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/search',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  物联网卡卡操作通用操作\n      * @param {Object} opts - parameters\n      * @param {string} opts.requestType - 物联网卡操作请求类型\n      * @param {string} opts.requestParam - 物联网卡操作请求参数json串\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  请求状态(0:成功;1:失败)\n      * @param string message  消息描述\n      * @param string result  物联网卡操作返回结果集\n      */\n\n  operate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  operate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.requestType === undefined || opts.requestType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.requestType' when calling operate\"\n      )\n    }\n    if (opts.requestParam === undefined || opts.requestParam === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.requestParam' when calling operate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.requestType !== undefined && opts.requestType !== null) {\n      postBody['requestType'] = opts.requestType\n    }\n    if (opts.requestParam !== undefined && opts.requestParam !== null) {\n      postBody['requestParam'] = opts.requestParam\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iotlink/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call operate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/operate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = IOTLINK\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/ipanti/v1/ipanti.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Anti DDoS Pro Web Rule Configuration APIs\n * Anti DDoS Pro Web Rule Configuration APIs\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ipanti'\nService._services[serviceId] = true\n\n/**\n * ipanti service.\n * @version 1.12.0\n */\n\nclass IPANTI extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'ipanti.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询 DDoS 攻击日志, 仅能查询非BGP实例的攻击记录, 同时查询BGP和非BGP实例请使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-pro/api/describeDDoSIpAttackLogs&#39;&gt;describeDDoSIpAttackLogs&lt;/a&gt;\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.endTime] - 查询的结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ  optional\n      * @param {string} [opts.instanceId] - 高防实例 ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dDoSAttackLog dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describeDDoSAttackLogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDDoSAttackLogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeDDoSAttackLogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.instanceId, 'instanceId')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDDoSAttackLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/attacklog:describeDDoSAttackLogs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询高防IP的 DDoS 攻击日志, 仅BGP实例返回的是IP级别的攻击记录, 非BGP实例返回的仍是实例级别的攻击记录(serviceIp 字段为空)\n参数 serviceIp 优先级大于 instanceId.\n- 指定 serviceIp 参数时, 忽略 instanceId 参数, 查询 ip 相关攻击记录.\n- 未指定 serviceIp 时, 查询 instanceId 指定实例相关攻击记录.\n- serviceIp 和 instanceId 均未指定时, 查询用户所有攻击记录\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.endTime] - 查询的结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ  optional\n      * @param {string} [opts.instanceId] - 高防实例 ID  optional\n      * @param {string} [opts.serviceIp] - 高防IP列表. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-pro/api/describeServiceIpList&#39;&gt;describeServiceIpList&lt;/a&gt; 接口查询实例的高防 IP  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dDoSIpAttackLog dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describeDDoSIpAttackLogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDDoSIpAttackLogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeDDoSIpAttackLogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.instanceId, 'instanceId')\n    )\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.serviceIp, 'serviceIp')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDDoSIpAttackLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/attacklog:describeDDoSIpAttackLogs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 CC 攻击日志\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.endTime] - 查询的结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ  optional\n      * @param {string} [opts.instanceId] - 高防实例 ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cCAttackLog dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describeCCAttackLogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCCAttackLogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeCCAttackLogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.instanceId, 'instanceId')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCCAttackLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/attacklog:describeCCAttackLogs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 CC 攻击日志详情.\n- 参数 attackId 优先级高于 instanceId, attackId 不为空时, 忽略 instanceId\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} [opts.startTime] - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ, attackId 为空时必传  optional\n      * @param {string} [opts.endTime] - 查询的结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ  optional\n      * @param {string} [opts.instanceId] - 高防实例 ID  optional\n      * @param {string} [opts.attackId] - CC 攻击记录 Id, 不为空时忽略 startTime, endTime  optional\n      * @param {string} [opts.subDomain] - 查询的子域名, 只有选中某一个实例后才能多选子域名  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cCAttackLogDetail dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  实例总数\n      * @param integer totalPage  总页数\n      */\n\n  describeCCAttackLogDetails (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCCAttackLogDetails\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.attackId !== undefined && opts.attackId !== null) {\n      queryParams['attackId'] = opts.attackId\n    }\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.subDomain, 'subDomain')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCCAttackLogDetails with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/attacklog:describeCCAttackLogDetails',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询攻击次数及流量峰值\n参数 serviceIp 优先级大于 instanceId.\n- 指定 serviceIp 参数时, 忽略 instanceId 参数, 统计 ip 相关攻击\n- 未指定 serviceIp 时, 统计 instanceId 指定实例相关攻击\n- serviceIp 和 instanceId 均未指定时, 统计用户所有攻击记录\nCC攻击为实例级别, 查询类型 type 为 cc 时, 参数 serviceIp 无效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.endTime] - 查询的结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ  optional\n      * @param {integer} opts.type - 攻击类型, 0 为 DDoS, 1 为 CC\n      * @param {string} [opts.instanceId] - 高防实例 ID  optional\n      * @param {string} [opts.serviceIp] - 高防IP列表. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-pro/api/describeServiceIpList&#39;&gt;describeServiceIpList&lt;/a&gt; 接口查询实例的高防 IP  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param number flow  攻击流量峰值\n      * @param integer count  攻击次数\n      * @param string unit  流量单位, bps、Kbps、Mbps、Gbps\n      */\n\n  describeAttackStatistics (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAttackStatistics\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeAttackStatistics\"\n      )\n    }\n    if (opts.type === undefined || opts.type === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.type' when calling describeAttackStatistics\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.instanceId, 'instanceId')\n    )\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.serviceIp, 'serviceIp')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAttackStatistics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/attacklog:describeAttackStatistics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询各类型攻击次数\n参数 serviceIp 优先级大于 instanceId.\n- 指定 serviceIp 参数时, 忽略 instanceId 参数, 统计 ip 相关攻击\n- 未指定 serviceIp 时, 统计 instanceId 指定实例相关攻击\n- serviceIp 和 instanceId 均未指定时, 统计用户所有攻击记录\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.endTime] - 查询的结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ  optional\n      * @param {string} [opts.instanceId] - 高防实例 ID  optional\n      * @param {string} [opts.serviceIp] - 高防IP列表. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-pro/api/describeServiceIpList&#39;&gt;describeServiceIpList&lt;/a&gt; 接口查询实例的高防 IP  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param attackTypeCount dataList\n      */\n\n  describeAttackTypeCount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAttackTypeCount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeAttackTypeCount\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.instanceId, 'instanceId')\n    )\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.serviceIp, 'serviceIp')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAttackTypeCount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/attacklog:describeAttackTypeCount',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  DDos 防护流量报表\n参数 serviceIp 优先级大于 instanceId.\n- 指定 serviceIp 参数时, 忽略 instanceId 参数, 查询 ip 相关报表\n- 未指定 serviceIp 时, 查询 instanceId 指定实例相关报表\n- serviceIp 和 instanceId 均未指定时, 查询用户所有实例报表\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.endTime] - 查询的结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ  optional\n      * @param {string} [opts.instanceId] - 高防实例 Id 列表  optional\n      * @param {string} [opts.serviceIp] - 高防IP列表. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-pro/api/describeServiceIpList&#39;&gt;describeServiceIpList&lt;/a&gt; 接口查询实例的高防 IP  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param number preProtect\n      * @param number postProtect\n      * @param string time\n      * @param string unit  流量单位, bps, Kbps, Mbps, Gbps\n      */\n\n  describeDDoSGraph (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDDoSGraph\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeDDoSGraph\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.instanceId, 'instanceId')\n    )\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.serviceIp, 'serviceIp')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDDoSGraph with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/charts:DDoSGraph',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  转发流量报表\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.endTime] - 查询的结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ  optional\n      * @param {string} [opts.instanceId] - 高防实例 Id 列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param number forwardRecord\n      * @param string time\n      * @param string unit  流量单位, bps, Kbps, Mbps, Gbps\n      */\n\n  describeFwdGraph (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeFwdGraph\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeFwdGraph\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.instanceId, 'instanceId')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeFwdGraph with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/charts:fwdGraph',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  业务流量报表\n参数 serviceIp 优先级大于 instanceId.\n- 指定 serviceIp 参数时, 忽略 instanceId 参数, 查询 ip 相关报表\n- 未指定 serviceIp 时, 查询 instanceId 指定实例相关报表\n- serviceIp 和 instanceId 均未指定时, 查询用户所有实例报表\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.endTime] - 查询的结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ  optional\n      * @param {string} [opts.instanceId] - 高防实例 Id 列表  optional\n      * @param {string} [opts.serviceIp] - 高防IP列表. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-pro/api/describeServiceIpList&#39;&gt;describeServiceIpList&lt;/a&gt; 接口查询实例的高防 IP  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param number inTraffic\n      * @param number outTraffic\n      * @param string time\n      * @param string unit  流量单位, bps, Kbps, Mbps, Gbps\n      */\n\n  describeBusinessGraph (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBusinessGraph\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeBusinessGraph\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.instanceId, 'instanceId')\n    )\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.serviceIp, 'serviceIp')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBusinessGraph with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/charts:businessGraph',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  CC 防护流量报表\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.endTime] - 查询的结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ  optional\n      * @param {string} [opts.instanceId] - 高防实例 Id 列表  optional\n      * @param {string} [opts.subDomain] - 规则域名列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer postProtect\n      * @param integer preProtect\n      * @param string time\n      * @param string unit  流量单位\n      */\n\n  describeCCGraph (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCCGraph\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeCCGraph\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.instanceId, 'instanceId')\n    )\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.subDomain, 'subDomain')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCCGraph with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/charts:CCGraph',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  高防返回客户端状态码报表\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 7 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.endTime] - 查询的结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ  optional\n      * @param {string} [opts.instanceId] - 高防实例 Id 列表  optional\n      * @param {string} [opts.subDomain] - 规则域名列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer status500\n      * @param integer status502\n      * @param integer status504\n      * @param integer status590\n      * @param integer status592\n      * @param integer status594\n      * @param integer status5xx\n      * @param string time\n      */\n\n  describeStatusGraph (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeStatusGraph\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeStatusGraph\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.instanceId, 'instanceId')\n    )\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.subDomain, 'subDomain')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStatusGraph with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/charts:statusGraph',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新建与并发连接数统计报表\n参数 serviceIp 优先级大于 instanceId.\n- 指定 serviceIp 参数时, 忽略 instanceId 参数, 查询 ip 相关报表\n- 未指定 serviceIp 时, 查询 instanceId 指定实例相关报表\n- serviceIp 和 instanceId 均未指定时, 查询用户所有实例报表\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 开始时间, 只能查询最近 90 天以内的数据, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ\n      * @param {string} [opts.endTime] - 查询的结束时间, UTC 时间, 格式: yyyy-MM-dd&#39;T&#39;HH:mm:ssZ  optional\n      * @param {string} [opts.instanceId] - 高防实例 Id 列表  optional\n      * @param {string} [opts.serviceIp] - 高防IP列表. &lt;br&gt;- 使用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-pro/api/describeServiceIpList&#39;&gt;describeServiceIpList&lt;/a&gt; 接口查询实例的高防 IP  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer newConn\n      * @param integer activeConn\n      * @param integer inactiveConn\n      * @param string time\n      */\n\n  describeConnStatGraph (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeConnStatGraph\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeConnStatGraph\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.instanceId, 'instanceId')\n    )\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.serviceIp, 'serviceIp')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeConnStatGraph with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/charts:connStatGraph',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询某个实例下的防护调度规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} [opts.name] - 实例名称, 可模糊匹配  optional\n      * @param {string} [opts.innerIp] - 云内IP, 可模糊匹配  optional\n      * @param {string} [opts.serviceIp] - 高防IP, 可模糊匹配  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dispatchRule dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeDispatchRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDispatchRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeDispatchRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.innerIp !== undefined && opts.innerIp !== null) {\n      queryParams['innerIp'] = opts.innerIp\n    }\n    if (opts.serviceIp !== undefined && opts.serviceIp !== null) {\n      queryParams['serviceIp'] = opts.serviceIp\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDispatchRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/dispatchRules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加防护调度规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {createDispatchRuleSpec} opts.createDispatchRuleSpec - 添加防护调度规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 添加规则失败, 1: 添加规则成功\n      * @param string message  添加规则失败时给出具体原因\n      */\n\n  createDispatchRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDispatchRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createDispatchRule\"\n      )\n    }\n    if (\n      opts.createDispatchRuleSpec === undefined ||\n      opts.createDispatchRuleSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createDispatchRuleSpec' when calling createDispatchRule\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.createDispatchRuleSpec !== undefined &&\n      opts.createDispatchRuleSpec !== null\n    ) {\n      postBody['createDispatchRuleSpec'] = opts.createDispatchRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDispatchRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/dispatchRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量添加防护调度规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {array} opts.dispatchRuleSpecList - 批量添加防护调度规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string dispatchRuleIds\n      * @param failedRule failRules\n      */\n\n  createDispatchRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDispatchRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createDispatchRules\"\n      )\n    }\n    if (\n      opts.dispatchRuleSpecList === undefined ||\n      opts.dispatchRuleSpecList === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dispatchRuleSpecList' when calling createDispatchRules\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.dispatchRuleSpecList !== undefined &&\n      opts.dispatchRuleSpecList !== null\n    ) {\n      postBody['dispatchRuleSpecList'] = opts.dispatchRuleSpecList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDispatchRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:createDispatchRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新防护调度规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.dispatchRuleId - 防护调度规则 Id\n      * @param {modifyDispatchRuleSpec} opts.modifyDispatchRuleSpec - 更新防护调度规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 更新规则失败, 1: 更新规则成功\n      * @param string message  更新规则失败时给出具体原因\n      */\n\n  modifyDispatchRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyDispatchRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyDispatchRule\"\n      )\n    }\n    if (opts.dispatchRuleId === undefined || opts.dispatchRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dispatchRuleId' when calling modifyDispatchRule\"\n      )\n    }\n    if (\n      opts.modifyDispatchRuleSpec === undefined ||\n      opts.modifyDispatchRuleSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.modifyDispatchRuleSpec' when calling modifyDispatchRule\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.modifyDispatchRuleSpec !== undefined &&\n      opts.modifyDispatchRuleSpec !== null\n    ) {\n      postBody['modifyDispatchRuleSpec'] = opts.modifyDispatchRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      dispatchRuleId: opts.dispatchRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyDispatchRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/dispatchRules/{dispatchRuleId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除防护调度规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.dispatchRuleId - 防护调度规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 删除规则失败, 1: 删除规则成功\n      * @param string message  删除规则失败时给出具体原因\n      */\n\n  deleteDispatchRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDispatchRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteDispatchRule\"\n      )\n    }\n    if (opts.dispatchRuleId === undefined || opts.dispatchRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dispatchRuleId' when calling deleteDispatchRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      dispatchRuleId: opts.dispatchRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDispatchRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/dispatchRules/{dispatchRuleId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  防护调度规则切换成防御状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.dispatchRuleId - 防护调度规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 规则切换成防御失败, 1: 规则切换成防御成功\n      * @param string message  规则切换成防御失败时给出具体原因\n      */\n\n  switchDispatchRuleProtect (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  switchDispatchRuleProtect\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling switchDispatchRuleProtect\"\n      )\n    }\n    if (opts.dispatchRuleId === undefined || opts.dispatchRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dispatchRuleId' when calling switchDispatchRuleProtect\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      dispatchRuleId: opts.dispatchRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call switchDispatchRuleProtect with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/dispatchRules/{dispatchRuleId}:protect',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  防护调度规则切换成回源状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.dispatchRuleId - 防护调度规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 规则切换成回源失败, 1: 规则切换成回源成功\n      * @param string message  规则切换成回源失败时给出具体原因\n      */\n\n  switchDispatchRuleOrigin (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  switchDispatchRuleOrigin\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling switchDispatchRuleOrigin\"\n      )\n    }\n    if (opts.dispatchRuleId === undefined || opts.dispatchRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dispatchRuleId' when calling switchDispatchRuleOrigin\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      dispatchRuleId: opts.dispatchRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call switchDispatchRuleOrigin with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/dispatchRules/{dispatchRuleId}:origin',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询某个实例下的非网站转发配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} [opts.searchType] - 查询类型名称, domain:源站域名, ip:源站 IP, port: 转发端口, originPort: 源站端口, serviceIp: 高防IP(仅支持BGP线路的实例)  optional\n      * @param {string} [opts.searchValue] - 查询类型值  optional\n      * @param {sort} [opts.sorts] - 排序属性：\nport - 按转发端口排序，默认不排序,asc表示按转发端口升序，desc表示按转发端口降序\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param forwardRule dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeForwardRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeForwardRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeForwardRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.searchType !== undefined && opts.searchType !== null) {\n      queryParams['searchType'] = opts.searchType\n    }\n    if (opts.searchValue !== undefined && opts.searchValue !== null) {\n      queryParams['searchValue'] = opts.searchValue\n    }\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeForwardRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加非网站类规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {forwardRuleSpec} opts.forwardRuleSpec - 添加非网站类规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 添加规则失败, 1: 添加规则成功\n      * @param string message  添加规则失败时给出具体原因\n      */\n\n  createForwardRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createForwardRule\"\n      )\n    }\n    if (opts.forwardRuleSpec === undefined || opts.forwardRuleSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleSpec' when calling createForwardRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.forwardRuleSpec !== undefined && opts.forwardRuleSpec !== null) {\n      postBody['forwardRuleSpec'] = opts.forwardRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量添加非网站类规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {array} opts.forwardRuleSpecList - 批量添加非网站类规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string forwardRuleIds\n      * @param failedPort failedPorts\n      */\n\n  createForwardRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createForwardRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createForwardRules\"\n      )\n    }\n    if (\n      opts.forwardRuleSpecList === undefined ||\n      opts.forwardRuleSpecList === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleSpecList' when calling createForwardRules\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.forwardRuleSpecList !== undefined &&\n      opts.forwardRuleSpecList !== null\n    ) {\n      postBody['forwardRuleSpecList'] = opts.forwardRuleSpecList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createForwardRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:createForwardRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询非网站类规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param forwardRule data\n      */\n\n  describeForwardRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeForwardRule\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling describeForwardRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新非网站类规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {forwardRuleSpec} opts.forwardRuleSpec - 更新非网站类规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 更新规则失败, 1: 更新规则成功\n      * @param string message  更新规则失败时给出具体原因\n      */\n\n  modifyForwardRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyForwardRule\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling modifyForwardRule\"\n      )\n    }\n    if (opts.forwardRuleSpec === undefined || opts.forwardRuleSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleSpec' when calling modifyForwardRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.forwardRuleSpec !== undefined && opts.forwardRuleSpec !== null) {\n      postBody['forwardRuleSpec'] = opts.forwardRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除非网站规则, 批量操作时, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 删除规则失败, 1: 删除规则成功\n      * @param string message  删除规则失败时给出具体原因\n      */\n\n  deleteForwardRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteForwardRule\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling deleteForwardRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  非网站类规则切换成防御状态。支持批量操作, 批量操作时 forwardRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 切换失败, 1: 切换成功\n      * @param string message  切换失败时给出具体原因\n      */\n\n  switchForwardRuleProtect (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  switchForwardRuleProtect\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling switchForwardRuleProtect\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling switchForwardRuleProtect\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call switchForwardRuleProtect with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}:protect',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  非网站类规则切换成回源状态。支持批量操作, 批量操作时 forwardRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 切换失败, 1: 切换成功\n      * @param string message  切换失败时给出具体原因\n      */\n\n  switchForwardRuleOrigin (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  switchForwardRuleOrigin\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling switchForwardRuleOrigin\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling switchForwardRuleOrigin\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call switchForwardRuleOrigin with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}:origin',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询非网站类转发规则的防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param forwardProtectionRule protectionRule\n      */\n\n  describeProtectionRuleOfForwardRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeProtectionRuleOfForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeProtectionRuleOfForwardRule\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling describeProtectionRuleOfForwardRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProtectionRuleOfForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}:describeProtectionRule',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改非网站类转发规则的防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {forwardProtectionRuleSpec} opts.forwardProtectionRuleSpec - 修改非网站类转发规则的防护规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改规则失败, 1: 修改规则成功\n      * @param string message  修改规则失败时给出具体原因\n      */\n\n  modifyProtectionRuleOfForwardRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyProtectionRuleOfForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyProtectionRuleOfForwardRule\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling modifyProtectionRuleOfForwardRule\"\n      )\n    }\n    if (\n      opts.forwardProtectionRuleSpec === undefined ||\n      opts.forwardProtectionRuleSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardProtectionRuleSpec' when calling modifyProtectionRuleOfForwardRule\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.forwardProtectionRuleSpec !== undefined &&\n      opts.forwardProtectionRuleSpec !== null\n    ) {\n      postBody['forwardProtectionRuleSpec'] = opts.forwardProtectionRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyProtectionRuleOfForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}:modifyProtectionRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询非网站类转发规则的防护规则 Geo 拦截可设置区域编码\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param country dataList\n      */\n\n  describeGeoAreas (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeGeoAreas\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeGeoAreas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeGeoAreas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转发规则的黑名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param forwardBlackListRule data\n      */\n\n  describeBlackListRuleOfForwardRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBlackListRuleOfForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeBlackListRuleOfForwardRule\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling describeBlackListRuleOfForwardRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBlackListRuleOfForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}/forwardBlackListRule',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改转发规则的黑名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {modifyBlackListRuleOfForwardRuleSpec} opts.modifySpec - 修改转发规则的黑名单规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  修改结果, 0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyBlackListRuleOfForwardRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBlackListRuleOfForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyBlackListRuleOfForwardRule\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling modifyBlackListRuleOfForwardRule\"\n      )\n    }\n    if (opts.modifySpec === undefined || opts.modifySpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.modifySpec' when calling modifyBlackListRuleOfForwardRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.modifySpec !== undefined && opts.modifySpec !== null) {\n      postBody['modifySpec'] = opts.modifySpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBlackListRuleOfForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}/forwardBlackListRule',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启转发规则的黑名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  开启结果, 0: 开启失败, 1: 开启成功\n      * @param string message  开启失败时给出具体原因\n      */\n\n  enableBlackListRuleOfForwardRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableBlackListRuleOfForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableBlackListRuleOfForwardRule\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling enableBlackListRuleOfForwardRule\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableBlackListRuleOfForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}:enableBlackListRuleOfForwardRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭转发规则的黑名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  关闭结果, 0: 关闭失败, 1: 关闭成功\n      * @param string message  关闭失败时给出具体原因\n      */\n\n  disableBlackListRuleOfForwardRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableBlackListRuleOfForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableBlackListRuleOfForwardRule\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling disableBlackListRuleOfForwardRule\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableBlackListRuleOfForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}:disableBlackListRuleOfForwardRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转发规则的白名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param forwardWhiteListRule data\n      */\n\n  describeWhiteListRuleOfForwardRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWhiteListRuleOfForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeWhiteListRuleOfForwardRule\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling describeWhiteListRuleOfForwardRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWhiteListRuleOfForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}/forwardWhiteListRule',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改转发规则的白名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {modifyWhiteListRuleOfForwardRuleSpec} opts.modifySpec - 修改转发规则的黑名单规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  修改结果, 0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyWhiteListRuleOfForwardRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyWhiteListRuleOfForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyWhiteListRuleOfForwardRule\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling modifyWhiteListRuleOfForwardRule\"\n      )\n    }\n    if (opts.modifySpec === undefined || opts.modifySpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.modifySpec' when calling modifyWhiteListRuleOfForwardRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.modifySpec !== undefined && opts.modifySpec !== null) {\n      postBody['modifySpec'] = opts.modifySpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyWhiteListRuleOfForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}/forwardWhiteListRule',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启转发规则的白名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  开启结果, 0: 开启失败, 1: 开启成功\n      * @param string message  开启失败时给出具体原因\n      */\n\n  enableWhiteListRuleOfForwardRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableWhiteListRuleOfForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableWhiteListRuleOfForwardRule\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling enableWhiteListRuleOfForwardRule\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableWhiteListRuleOfForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}:enableWhiteListRuleOfForwardRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭转发规则的白名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.forwardRuleId - 转发规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  关闭结果, 0: 关闭失败, 1: 关闭成功\n      * @param string message  关闭失败时给出具体原因\n      */\n\n  disableWhiteListRuleOfForwardRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableWhiteListRuleOfForwardRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableWhiteListRuleOfForwardRule\"\n      )\n    }\n    if (opts.forwardRuleId === undefined || opts.forwardRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forwardRuleId' when calling disableWhiteListRuleOfForwardRule\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      forwardRuleId: opts.forwardRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableWhiteListRuleOfForwardRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/forwardRules/{forwardRuleId}:disableWhiteListRuleOfForwardRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例全局访问控制配置，包括全局的IP黑白名单和geo拦截配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceAcl data\n      */\n\n  describeInstanceAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceAcl\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeInstanceAcl',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例全局访问控制配置，包括全局的IP黑白名单和geo拦截配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {instanceAclSpec} opts.instanceAclSpec - 修改实例全局访问控制配置参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  修改是否下发成功\n      * @param boolean canRecover  是否可以恢复到上一次的配置\n      */\n\n  modifyInstanceAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceAcl\"\n      )\n    }\n    if (opts.instanceAclSpec === undefined || opts.instanceAclSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceAclSpec' when calling modifyInstanceAcl\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceAclSpec !== undefined && opts.instanceAclSpec !== null) {\n      postBody['instanceAclSpec'] = opts.instanceAclSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceAcl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  实例全局访问控制配置可以恢复到上一次下发成功的配置时，调用此接口回滚到上一次下发成功的配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  是否回滚成功\n      */\n\n  recoverInstanceAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  recoverInstanceAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling recoverInstanceAcl\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call recoverInstanceAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:recoverInstanceAcl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询自定义页面列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} [opts.status] - 自定义页面状态, 可取值approving: 审批中, refused: 审批不通过, approved: 审批通过, 为空时查询全部  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param customPage dataList\n      */\n\n  describeCustomPages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCustomPages\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeCustomPages\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomPages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/customPages',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加自定义页面\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {customPageSpec} opts.customPageSpec - 添加自定义页面请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 添加失败, 1: 添加成功\n      * @param string message  添加失败时给出具体原因\n      */\n\n  createCustomPage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createCustomPage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createCustomPage\"\n      )\n    }\n    if (opts.customPageSpec === undefined || opts.customPageSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.customPageSpec' when calling createCustomPage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.customPageSpec !== undefined && opts.customPageSpec !== null) {\n      postBody['customPageSpec'] = opts.customPageSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCustomPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/customPages',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改自定义页面\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} opts.pageId - 自定义页面Id\n      * @param {customPageSpec} opts.customPageSpec - 修改自定义页面请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyCustomPage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyCustomPage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyCustomPage\"\n      )\n    }\n    if (opts.pageId === undefined || opts.pageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageId' when calling modifyCustomPage\"\n      )\n    }\n    if (opts.customPageSpec === undefined || opts.customPageSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.customPageSpec' when calling modifyCustomPage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.customPageSpec !== undefined && opts.customPageSpec !== null) {\n      postBody['customPageSpec'] = opts.customPageSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      pageId: opts.pageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyCustomPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/customPages/{pageId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除自定义页面, 使用中的不允许删除\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} opts.pageId - 自定义页面Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 删除失败, 1: 删除成功\n      * @param string message  删除失败时给出具体原因\n      */\n\n  deleteCustomPage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteCustomPage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteCustomPage\"\n      )\n    }\n    if (opts.pageId === undefined || opts.pageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageId' when calling deleteCustomPage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      pageId: opts.pageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCustomPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/customPages/{pageId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例错误状态码返回页面为自定义页面\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} opts.pageId - 自定义页面Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyInstanceCustomPage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceCustomPage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceCustomPage\"\n      )\n    }\n    if (opts.pageId === undefined || opts.pageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageId' when calling modifyInstanceCustomPage\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      pageId: opts.pageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceCustomPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/customPages/{pageId}:modifyInstanceCustomPage',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例页面错误状态码返回页面为为默认页面\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyInstanceCustomPageDefault (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceCustomPageDefault\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceCustomPageDefault\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceCustomPageDefault with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceCustomPageDefault',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启实例错误状态码返回页面, 错误状态码返回默认页面或自定义页面\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  enableInstanceCustomPage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableInstanceCustomPage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableInstanceCustomPage\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableInstanceCustomPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:enableInstanceCustomPage',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭实例错误状态码返回页面, 透传错误状态码\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  disableInstanceCustomPage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableInstanceCustomPage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableInstanceCustomPage\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableInstanceCustomPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:disableInstanceCustomPage',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为 10, 取值范围[10, 100], 0 表示全量  optional\n      * @param {string} [opts.name] - 实例名称, 可模糊匹配  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新购或升级高防实例\n      * @param {Object} opts - parameters\n      * @param {createInstanceSpec} opts.createInstanceSpec - 新购或升级实例请求参数\n      * @param {autoRenewalSpec} [opts.autoRenewalSpec] - 自动续费配置, 默认不开通, 仅新购实例时可设置  optional\n      * @param {boolean} [opts.autoPay] - 自动支付标识  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 新购或升级实例失败, 1: 新购或升级实例成功\n      * @param string message  新购或升级成功时为计费资源ID, 创建实例失败时给出具体原因\n      * @param string orderNumber  新购或升级实例成功, 且设置了自动支付时, 为订单号。否则为空\n      */\n\n  createInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.createInstanceSpec === undefined ||\n      opts.createInstanceSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createInstanceSpec' when calling createInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.createInstanceSpec !== undefined &&\n      opts.createInstanceSpec !== null\n    ) {\n      postBody['createInstanceSpec'] = opts.createInstanceSpec\n    }\n    if (opts.autoRenewalSpec !== undefined && opts.autoRenewalSpec !== null) {\n      postBody['autoRenewalSpec'] = opts.autoRenewalSpec\n    }\n    if (opts.autoPay !== undefined && opts.autoPay !== null) {\n      postBody['autoPay'] = opts.autoPay\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance data\n      */\n\n  describeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {renameInstanceSpec} opts.renameInstanceSpec - 修改实例名称请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改实例名称失败, 1: 修改实例名称成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyInstanceName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceName\"\n      )\n    }\n    if (\n      opts.renameInstanceSpec === undefined ||\n      opts.renameInstanceSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.renameInstanceSpec' when calling modifyInstanceName\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.renameInstanceSpec !== undefined &&\n      opts.renameInstanceSpec !== null\n    ) {\n      postBody['renameInstanceSpec'] = opts.renameInstanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:rename',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新实例弹性防护带宽\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {modifyInstanceEPBSpec} opts.modifyInstanceEPBSpec - 修改实例名称请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyEPB (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyEPB\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyEPB\"\n      )\n    }\n    if (\n      opts.modifyInstanceEPBSpec === undefined ||\n      opts.modifyInstanceEPBSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.modifyInstanceEPBSpec' when calling modifyEPB\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.modifyInstanceEPBSpec !== undefined &&\n      opts.modifyInstanceEPBSpec !== null\n    ) {\n      postBody['modifyInstanceEPBSpec'] = opts.modifyInstanceEPBSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyEPB with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyEPB',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询告警配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param alarmConfig data\n      */\n\n  describeAlarmConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAlarmConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAlarmConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarmConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeAlarmConfig',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新告警配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {alarmConfigSpec} opts.alarmConfigSpec - 更新告警配置请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyAlarmConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyAlarmConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyAlarmConfig\"\n      )\n    }\n    if (opts.alarmConfigSpec === undefined || opts.alarmConfigSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmConfigSpec' when calling modifyAlarmConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.alarmConfigSpec !== undefined && opts.alarmConfigSpec !== null) {\n      postBody['alarmConfigSpec'] = opts.alarmConfigSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyAlarmConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyAlarmConfig',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询高防实例回源 IP 白名单列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  describeOriginWhiteIpList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeOriginWhiteIpList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeOriginWhiteIpList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeOriginWhiteIpList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeOriginWhiteIpList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例高防 IP 列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 ID\n      * @param {integer} [opts.pageNumber] - 页码, 默认为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为 10, 取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param serviceIp dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeServiceIpList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeServiceIpList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeServiceIpList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeServiceIpList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeServiceIpList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据高防计费资源ID查询对应的实例Id, 调用 &lt;a href&#x3D;&#39;http://docs.jdcloud.com/anti-ddos-pro/api/createInstance&#39;&gt;createInstance&lt;/a&gt; 接口成功后，跟据message字段返回的计费资源Id查询对应的高防实例ID, 需要高防实例实际创建成功以后才可查询得到\n      * @param {Object} opts - parameters\n      * @param {string} opts.resourceId - 高防实例计费资源ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceIdVo data\n      */\n\n  describeInstanceIdByResourceId (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceIdByResourceId\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling describeInstanceIdByResourceId\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceIdByResourceId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeInstanceIdByResourceId',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询高防实例名称列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.id] - 高防实例 ID, 为空则查询所有实例名称  optional\n      * @param {string} [opts.name] - 实例名称, 可模糊匹配  optional\n      * @param {integer} [opts.pageNumber] - 页码, 默认为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为 10, 取值范围 [10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceIdName dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeNameList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNameList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      queryParams['id'] = opts.id\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNameList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeNameList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询高防实例防护统计信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param protectionStatistics data\n      */\n\n  describeProtectionStatistics (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeProtectionStatistics\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProtectionStatistics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeProtectionStatistics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询高防实例防护概要\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param protectionOutline data\n      */\n\n  describeProtectionOutline (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeProtectionOutline\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProtectionOutline with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeProtectionOutline',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  检测实例名称是否合法\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 待检测实例名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  检测结果 code, 0: 不可用, 1: 可用\n      * @param string message  检测结果, 不可用时给出具体原因\n      */\n\n  checkName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling checkName\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/checkName',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户可设置为网站类规则回源 IP 的京东云云内弹性公网 IP 资源\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为 10, 取值范围 [0, 100], 0 表示全量  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpcIpResource dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeVpcIpList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVpcIpList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVpcIpList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeVpcIpList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户可设置为网站类规则回源 IP 的京东云云物理服务器公网 IP 资源\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为 10, 取值范围 [0, 100], 0 表示全量  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cpsIpResource dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeCpsIpList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCpsIpList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCpsIpList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cpsIpResources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户可设置为网站类规则回源 IP 的京东云托管区公网 IP 资源\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为 10, 取值范围 [0, 100], 0 表示全量  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ccsIpResource dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeCcsIpList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCcsIpList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCcsIpList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ccsIpResources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例的 IP 黑白名单库列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipSet dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeIpSets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpSets\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeIpSets\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpSets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ipSets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加实例的 IP 黑白名单, 预定义的 IP 黑白名单绑定到转发规则的黑名单或白名单后生效\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {ipSetSpec} opts.ipSetSpec - 添加实例的 IP 黑白名单请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 添加失败, 1: 添加成功\n      * @param string message  添加失败时给出具体原因\n      */\n\n  createIpSet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createIpSet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createIpSet\"\n      )\n    }\n    if (opts.ipSetSpec === undefined || opts.ipSetSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipSetSpec' when calling createIpSet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ipSetSpec !== undefined && opts.ipSetSpec !== null) {\n      postBody['ipSetSpec'] = opts.ipSetSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createIpSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ipSets',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例的 IP 黑白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.ipSetId - IP 黑白名单 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ipSet data\n      */\n\n  describeIpSet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpSet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeIpSet\"\n      )\n    }\n    if (opts.ipSetId === undefined || opts.ipSetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipSetId' when calling describeIpSet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      ipSetId: opts.ipSetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ipSets/{ipSetId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除实例的 IP 黑白名单. 支持批量操作, 批量操作时 ipSetId 传多个, 以 &#39;,&#39; 分隔. IP 黑白名单规则被引用时不允许删除\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.ipSetId - IP 黑白名单 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param batchResultDetail data\n      */\n\n  deleteIpSet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteIpSet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteIpSet\"\n      )\n    }\n    if (opts.ipSetId === undefined || opts.ipSetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ipSetId' when calling deleteIpSet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      ipSetId: opts.ipSetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteIpSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ipSets/{ipSetId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例的 IP 黑白名单用量信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer allocatedNum  实例已添加的 IP 黑白名单数量\n      * @param integer surplusAllocateNum  实例还可添加的 IP 黑白名单数量\n      * @param integer maxAllocateNum  实例最多可添加的 IP 黑白名单数量\n      */\n\n  describeIpSetUsage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpSetUsage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeIpSetUsage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpSetUsage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeIpSetUsage',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询某个实例下的网站类规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} [opts.searchType] - 查询类型名称, domain:源站域名, ip:源站 IP, rawDomain: 域名, serviceIp: 高防IP(仅支持BGP线路的实例)  optional\n      * @param {string} [opts.searchValue] - 查询类型值  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param webRule dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeWebRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWebRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeWebRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.searchType !== undefined && opts.searchType !== null) {\n      queryParams['searchType'] = opts.searchType\n    }\n    if (opts.searchValue !== undefined && opts.searchValue !== null) {\n      queryParams['searchValue'] = opts.searchValue\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWebRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加网站类规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {webRuleSpec} opts.webRuleSpec - 添加网站类规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 添加失败, 1: 添加成功\n      * @param string message  添加失败时给出具体原因\n      */\n\n  createWebRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createWebRule\"\n      )\n    }\n    if (opts.webRuleSpec === undefined || opts.webRuleSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleSpec' when calling createWebRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.webRuleSpec !== undefined && opts.webRuleSpec !== null) {\n      postBody['webRuleSpec'] = opts.webRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量添加网站类规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {array} opts.webRuleSpecList - 批量添加网站类规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string webRuleIdIds\n      * @param failedDomain failedDomains\n      */\n\n  createWebRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createWebRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createWebRules\"\n      )\n    }\n    if (opts.webRuleSpecList === undefined || opts.webRuleSpecList === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleSpecList' when calling createWebRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.webRuleSpecList !== undefined && opts.webRuleSpecList !== null) {\n      postBody['webRuleSpecList'] = opts.webRuleSpecList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createWebRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:createWebRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param webRule data\n      */\n\n  describeWebRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling describeWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改网站类规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {webRuleSpec} opts.webRuleSpec - 更新网站类规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  修改网站类规则结果, 0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyWebRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling modifyWebRule\"\n      )\n    }\n    if (opts.webRuleSpec === undefined || opts.webRuleSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleSpec' when calling modifyWebRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.webRuleSpec !== undefined && opts.webRuleSpec !== null) {\n      postBody['webRuleSpec'] = opts.webRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除网站规则。支持批量操作, 批量操作时 webRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  删除网站类规则结果, 0: 删除失败, 1: 删除成功\n      * @param string message  删除失败时给出具体原因\n      */\n\n  deleteWebRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling deleteWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  网站类规则绑定 SSL 证书\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.certId - 证书 Id. 使用 &lt;a href&#x3D;&#39;https://docs.jdcloud.com/cn/ssl-certificate/api/describecerts&#39;&gt;describeCerts&lt;/a&gt; 接口, 按照域名检索可绑定的证书, 域名不匹配将导致证书配置失败\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 绑定失败, 1: 绑定成功\n      * @param string message  绑定失败时给出具体原因\n      */\n\n  bindCert (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  bindCert\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling bindCert\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling bindCert\"\n      )\n    }\n    if (opts.certId === undefined || opts.certId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certId' when calling bindCert\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.certId !== undefined && opts.certId !== null) {\n      postBody['certId'] = opts.certId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bindCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:bindCert',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  网站类规则切换成防御状态。支持批量操作, 批量操作时 webRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 规则切换成防御失败, 1: 规则切换成防御成功\n      * @param string message  规则切换成防御失败时给出具体原因\n      */\n\n  switchWebRuleProtect (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  switchWebRuleProtect\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling switchWebRuleProtect\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling switchWebRuleProtect\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call switchWebRuleProtect with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:protect',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  网站类规则切换成回源状态。支持批量操作, 批量操作时 webRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 规则切换成回源失败, 1: 规则切换成回源成功\n      * @param string message  规则切换成回源失败时给出具体原因\n      */\n\n  switchWebRuleOrigin (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  switchWebRuleOrigin\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling switchWebRuleOrigin\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling switchWebRuleOrigin\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call switchWebRuleOrigin with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:origin',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  网站类规则开启 CC 防护, 开启后网站类规则已配置的防护规则和 CC 防护配置生效, 若没有配置过 CC 防护, 默认的 CC 防护配置生效。支持批量操作, 批量操作时 webRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 开启 CC 失败, 1: 开启 CC 成功\n      * @param string message  开启 CC 失败时给出具体原因\n      */\n\n  enableWebRuleCC (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableWebRuleCC\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableWebRuleCC\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling enableWebRuleCC\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableWebRuleCC with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:enableCC',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭网站类规则 CC 防护, 网站类规则的 CC 防护规则和 CC 防护配置失效。支持批量操作, 批量操作时 webRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 禁用 CC 失败, 1: 禁用 CC 成功\n      * @param string message  禁用 CC 失败时给出具体原因\n      */\n\n  disableWebRuleCC (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableWebRuleCC\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableWebRuleCC\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling disableWebRuleCC\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableWebRuleCC with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:disableCC',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启网站类规则 CC 观察者模式, 观察模式下, CC 防护只告警不防御。支持批量操作, 批量操作时 webRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 开启 CC 观察者模式失败, 1: 开启 CC 观察者模式成功\n      * @param string message  开启 CC 观察者模式失败时给出具体原因\n      */\n\n  enableWebRuleCCObserverMode (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableWebRuleCCObserverMode\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableWebRuleCCObserverMode\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling enableWebRuleCCObserverMode\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableWebRuleCCObserverMode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:enableCCObserverMode',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭网站类规则 CC 观察者模式, 观察模式下, CC 防护只告警不防御。支持批量操作, 批量操作时 webRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 关闭 CC 观察者模式失败, 1: 关闭 CC 观察者模式成功\n      * @param string message  关闭 CC 观察者模式失败时给出具体原因\n      */\n\n  disableWebRuleCCObserverMode (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableWebRuleCCObserverMode\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableWebRuleCCObserverMode\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling disableWebRuleCCObserverMode\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableWebRuleCCObserverMode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:disableCCObserverMode',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类规则允许插入JS指纹的页面\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param jsPage dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeJsPagesOfWebRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeJsPagesOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeJsPagesOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling describeJsPagesOfWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeJsPagesOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/jsPages',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加网站类规则允许插入JS指纹的页面\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {jsPageSpec} opts.jsPageSpec - 添加 JS 指纹页面请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 添加失败, 1: 添加成功\n      * @param string message  添加失败时给出具体原因\n      */\n\n  createJsPageOfWebRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createJsPageOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createJsPageOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling createJsPageOfWebRule\"\n      )\n    }\n    if (opts.jsPageSpec === undefined || opts.jsPageSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jsPageSpec' when calling createJsPageOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.jsPageSpec !== undefined && opts.jsPageSpec !== null) {\n      postBody['jsPageSpec'] = opts.jsPageSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createJsPageOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/jsPages',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量添加网站类规则允许插入JS指纹的页面\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {jsPagesSpec} opts.jsPagesSpec - 添加 JS 指纹页面请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 添加失败, 1: 添加成功\n      * @param string message  添加失败时给出具体原因\n      */\n\n  createJsPagesOfWebRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createJsPagesOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createJsPagesOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling createJsPagesOfWebRule\"\n      )\n    }\n    if (opts.jsPagesSpec === undefined || opts.jsPagesSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jsPagesSpec' when calling createJsPagesOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.jsPagesSpec !== undefined && opts.jsPagesSpec !== null) {\n      postBody['jsPagesSpec'] = opts.jsPagesSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createJsPagesOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:createJsPagesOfWebRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改网站类规则允许插入 JS 指纹的页面\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.jsPageId - 支持插入JS指纹的页面 Id\n      * @param {jsPageSpec} opts.jsPageSpec - 修改网站类规则允许插入 JS 指纹的页面请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyJsPageOfWebRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyJsPageOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyJsPageOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling modifyJsPageOfWebRule\"\n      )\n    }\n    if (opts.jsPageId === undefined || opts.jsPageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jsPageId' when calling modifyJsPageOfWebRule\"\n      )\n    }\n    if (opts.jsPageSpec === undefined || opts.jsPageSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jsPageSpec' when calling modifyJsPageOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.jsPageSpec !== undefined && opts.jsPageSpec !== null) {\n      postBody['jsPageSpec'] = opts.jsPageSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      jsPageId: opts.jsPageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyJsPageOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/jsPages/{jsPageId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除网站类规则允许插入 JS 指纹的页面。支持批量操作, 批量操作时 jsPageId 传多个, 以 &#39;,&#39; 分隔\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.jsPageId - 支持插入JS指纹的页面 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 删除失败, 1: 删除成功\n      * @param string message  删除失败时给出具体原因\n      */\n\n  deleteJsPageOfWebRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteJsPageOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteJsPageOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling deleteJsPageOfWebRule\"\n      )\n    }\n    if (opts.jsPageId === undefined || opts.jsPageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jsPageId' when calling deleteJsPageOfWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      jsPageId: opts.jsPageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteJsPageOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/jsPages/{jsPageId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭网站类规则的JS指纹开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 关闭失败, 1: 关闭成功\n      * @param string message  关闭失败时给出具体原因\n      */\n\n  disableWebRuleJsPage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableWebRuleJsPage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableWebRuleJsPage\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling disableWebRuleJsPage\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableWebRuleJsPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:disableWebRuleJsPage',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  打开网站类规则的JS指纹开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 打开失败, 1: 打开成功\n      * @param string message  打开失败时给出具体原因\n      */\n\n  enableWebRuleJsPage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableWebRuleJsPage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableWebRuleJsPage\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling enableWebRuleJsPage\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableWebRuleJsPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:enableWebRuleJsPage',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  插入JS指纹到所有页面, 需要打开网站类规则的JS指纹开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyWebRuleJsPageToAll (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyWebRuleJsPageToAll\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyWebRuleJsPageToAll\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling modifyWebRuleJsPageToAll\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyWebRuleJsPageToAll with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:modifyWebRuleJsPageToAll',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  插入JS指纹到配置的自定义页面, 需要打开网站类规则的JS指纹开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyWebRuleJsPageToCustom (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyWebRuleJsPageToCustom\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyWebRuleJsPageToCustom\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling modifyWebRuleJsPageToCustom\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyWebRuleJsPageToCustom with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:modifyWebRuleJsPageToCustom',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类规则的 CC 防护规则列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cCProtectionRule dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeCCProtectionRulesOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCCProtectionRulesOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeCCProtectionRulesOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling describeCCProtectionRulesOfWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCCProtectionRulesOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/ccProtectionRules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加网站类规则的 CC 防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {cCProtectionRuleSpec} opts.ccProtectionRuleSpec - 添加 CC 防护规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 添加失败, 1: 添加成功\n      * @param string message  添加失败时给出具体原因\n      */\n\n  createCCProtectionRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createCCProtectionRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createCCProtectionRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling createCCProtectionRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.ccProtectionRuleSpec === undefined ||\n      opts.ccProtectionRuleSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ccProtectionRuleSpec' when calling createCCProtectionRuleOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.ccProtectionRuleSpec !== undefined &&\n      opts.ccProtectionRuleSpec !== null\n    ) {\n      postBody['ccProtectionRuleSpec'] = opts.ccProtectionRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCCProtectionRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/ccProtectionRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类规则的 CC 防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.ccProtectionRuleId - 网站类规则的 CC 防护规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cCProtectionRule data\n      */\n\n  describeCCProtectionRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCCProtectionRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeCCProtectionRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling describeCCProtectionRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.ccProtectionRuleId === undefined ||\n      opts.ccProtectionRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ccProtectionRuleId' when calling describeCCProtectionRuleOfWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      ccProtectionRuleId: opts.ccProtectionRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCCProtectionRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/ccProtectionRules/{ccProtectionRuleId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改网站类规则的 CC 防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.ccProtectionRuleId - 网站类规则的 CC 防护规则 Id\n      * @param {cCProtectionRuleSpec} opts.ccProtectionRuleSpec - 修改 CC 防护规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyCCProtectionRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyCCProtectionRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyCCProtectionRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling modifyCCProtectionRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.ccProtectionRuleId === undefined ||\n      opts.ccProtectionRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ccProtectionRuleId' when calling modifyCCProtectionRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.ccProtectionRuleSpec === undefined ||\n      opts.ccProtectionRuleSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ccProtectionRuleSpec' when calling modifyCCProtectionRuleOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.ccProtectionRuleSpec !== undefined &&\n      opts.ccProtectionRuleSpec !== null\n    ) {\n      postBody['ccProtectionRuleSpec'] = opts.ccProtectionRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      ccProtectionRuleId: opts.ccProtectionRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyCCProtectionRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/ccProtectionRules/{ccProtectionRuleId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除网站规则的 CC 防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.ccProtectionRuleId - 网站类规则的 CC 防护规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 删除失败, 1: 删除成功\n      * @param string message  删除失败时给出具体原因\n      */\n\n  deleteCCProtectionRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteCCProtectionRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteCCProtectionRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling deleteCCProtectionRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.ccProtectionRuleId === undefined ||\n      opts.ccProtectionRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ccProtectionRuleId' when calling deleteCCProtectionRuleOfWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      ccProtectionRuleId: opts.ccProtectionRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCCProtectionRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/ccProtectionRules/{ccProtectionRuleId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启网站类规则的 CC 防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.ccProtectionRuleId - 网站类规则的 CC 防护规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 开启失败, 1: 开启成功\n      * @param string message  开启失败时给出具体原因\n      */\n\n  enableCCProtectionRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableCCProtectionRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableCCProtectionRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling enableCCProtectionRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.ccProtectionRuleId === undefined ||\n      opts.ccProtectionRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ccProtectionRuleId' when calling enableCCProtectionRuleOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      ccProtectionRuleId: opts.ccProtectionRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableCCProtectionRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/ccProtectionRules/{ccProtectionRuleId}:enable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭网站类规则的 CC 防护规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.ccProtectionRuleId - 网站类规则的 CC 防护规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 关闭失败, 1: 关闭成功\n      * @param string message  关闭失败时给出具体原因\n      */\n\n  disableCCProtectionRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableCCProtectionRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableCCProtectionRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling disableCCProtectionRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.ccProtectionRuleId === undefined ||\n      opts.ccProtectionRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ccProtectionRuleId' when calling disableCCProtectionRuleOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      ccProtectionRuleId: opts.ccProtectionRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableCCProtectionRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/ccProtectionRules/{ccProtectionRuleId}:disable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启网站类规则的自定义 CC 防护规则总开关, 状态为开启的自定义 CC 防护规则生效\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 开启失败, 1: 开启成功\n      * @param string message  开启失败时给出具体原因\n      */\n\n  enableWebRuleCCProtectionRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableWebRuleCCProtectionRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableWebRuleCCProtectionRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling enableWebRuleCCProtectionRule\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableWebRuleCCProtectionRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:enableWebRuleCCProtectionRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭网站类规则的自定义 CC 防护规则总开关, 所有自定义 CC 防护规则失效\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 关闭失败, 1: 关闭成功\n      * @param string message  关闭失败时给出具体原因\n      */\n\n  disableWebRuleCCProtectionRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableWebRuleCCProtectionRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableWebRuleCCProtectionRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling disableWebRuleCCProtectionRule\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableWebRuleCCProtectionRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:disableWebRuleCCProtectionRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类规则的 CC 防护配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cCProtectionConfig data\n      */\n\n  describeCCProtectionConfigOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCCProtectionConfigOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeCCProtectionConfigOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling describeCCProtectionConfigOfWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCCProtectionConfigOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:ccProtectionConfig',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改网站类规则的 CC 防护配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {cCProtectionConfigSpec} opts.ccProtectionConfigSpec - 修改 CC 防护配置请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyCCProtectionConfigOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyCCProtectionConfigOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyCCProtectionConfigOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling modifyCCProtectionConfigOfWebRule\"\n      )\n    }\n    if (\n      opts.ccProtectionConfigSpec === undefined ||\n      opts.ccProtectionConfigSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ccProtectionConfigSpec' when calling modifyCCProtectionConfigOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.ccProtectionConfigSpec !== undefined &&\n      opts.ccProtectionConfigSpec !== null\n    ) {\n      postBody['ccProtectionConfigSpec'] = opts.ccProtectionConfigSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyCCProtectionConfigOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:ccProtectionConfig',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类规则的 CC 防护默认配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cCProtectionDefaultConfig data\n      */\n\n  describeCCProtectionDefaultConfigOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCCProtectionDefaultConfigOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeCCProtectionDefaultConfigOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling describeCCProtectionDefaultConfigOfWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCCProtectionDefaultConfigOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:ccProtectionDefaultConfig',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  编辑网站规则证书信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {certInfoModifySpec} opts.certInfoModifySpec - 编辑网站规则证书信息请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  上传 SSL 证书结果, 0: 删除证书失败, 1: 删除证书成功\n      * @param string message  上传成功时为证书 Id, 失败时给出具体原因\n      */\n\n  modifyCertInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyCertInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyCertInfo\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling modifyCertInfo\"\n      )\n    }\n    if (\n      opts.certInfoModifySpec === undefined ||\n      opts.certInfoModifySpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certInfoModifySpec' when calling modifyCertInfo\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.certInfoModifySpec !== undefined &&\n      opts.certInfoModifySpec !== null\n    ) {\n      postBody['certInfoModifySpec'] = opts.certInfoModifySpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyCertInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:modifyCertInfo',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类防护规则的黑名单用量信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer allocatedNum  已配置的黑名单规则数量\n      * @param integer activeNum  开启的黑名单规则数量\n      * @param integer surplusAllocateNum  还可添加的黑名单规则数量\n      * @param integer maxAllocateNum  最多可添加的黑名单规则数量\n      */\n\n  describeWebRuleBlackListUsage (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWebRuleBlackListUsage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeWebRuleBlackListUsage\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling describeWebRuleBlackListUsage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWebRuleBlackListUsage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:describeWebRuleBlackListUsage',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类规则的黑名单规则列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param webBlackListRule dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeBlackListRulesOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBlackListRulesOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeBlackListRulesOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling describeBlackListRulesOfWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBlackListRulesOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webBlackListRules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加网站类规则的黑名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {webBlackListRuleSpec} opts.webBlackListRuleSpec - 添加网站类规则的黑名单规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 添加失败, 1: 添加成功\n      * @param string message  添加失败时给出具体原因\n      */\n\n  createBlackListRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBlackListRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createBlackListRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling createBlackListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webBlackListRuleSpec === undefined ||\n      opts.webBlackListRuleSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webBlackListRuleSpec' when calling createBlackListRuleOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.webBlackListRuleSpec !== undefined &&\n      opts.webBlackListRuleSpec !== null\n    ) {\n      postBody['webBlackListRuleSpec'] = opts.webBlackListRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBlackListRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webBlackListRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类规则的黑名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.webBlackListRuleId - 网站类规则的黑名单规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param webBlackListRule data\n      */\n\n  describeBlackListRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBlackListRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeBlackListRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling describeBlackListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webBlackListRuleId === undefined ||\n      opts.webBlackListRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webBlackListRuleId' when calling describeBlackListRuleOfWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      webBlackListRuleId: opts.webBlackListRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBlackListRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webBlackListRules/{webBlackListRuleId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改网站类规则的黑名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.webBlackListRuleId - 网站类规则的黑名单规则 Id\n      * @param {webBlackListRuleSpec} opts.webBlackListRuleSpec - 修改网站类规则的黑名单规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  修改结果, 0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyBlackListRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBlackListRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyBlackListRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling modifyBlackListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webBlackListRuleId === undefined ||\n      opts.webBlackListRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webBlackListRuleId' when calling modifyBlackListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webBlackListRuleSpec === undefined ||\n      opts.webBlackListRuleSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webBlackListRuleSpec' when calling modifyBlackListRuleOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.webBlackListRuleSpec !== undefined &&\n      opts.webBlackListRuleSpec !== null\n    ) {\n      postBody['webBlackListRuleSpec'] = opts.webBlackListRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      webBlackListRuleId: opts.webBlackListRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBlackListRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webBlackListRules/{webBlackListRuleId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除网站类规则的黑名单规则, 批量操作时 webBlackListRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.webBlackListRuleId - 网站类规则的黑名单规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  删除结果, 0: 删除失败, 1: 删除成功\n      * @param string message  删除失败时给出具体原因\n      */\n\n  deleteBlackListRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBlackListRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteBlackListRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling deleteBlackListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webBlackListRuleId === undefined ||\n      opts.webBlackListRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webBlackListRuleId' when calling deleteBlackListRuleOfWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      webBlackListRuleId: opts.webBlackListRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBlackListRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webBlackListRules/{webBlackListRuleId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启网站类规则的黑名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  开启结果, 0: 开启失败, 1: 开启成功\n      * @param string message  开启失败时给出具体原因\n      */\n\n  enableWebRuleBlackList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableWebRuleBlackList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableWebRuleBlackList\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling enableWebRuleBlackList\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableWebRuleBlackList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:enableWebRuleBlackList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启网站类规则的黑名单规则, 批量操作时 webBlackListRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.webBlackListRuleId - 网站类规则的黑名单规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  开启结果, 0: 开启失败, 1: 开启成功\n      * @param string message  开启失败时给出具体原因\n      */\n\n  enableBlackListRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableBlackListRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableBlackListRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling enableBlackListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webBlackListRuleId === undefined ||\n      opts.webBlackListRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webBlackListRuleId' when calling enableBlackListRuleOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      webBlackListRuleId: opts.webBlackListRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableBlackListRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webBlackListRules/{webBlackListRuleId}:enable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭网站类规则的黑名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  关闭结果, 0: 关闭失败, 1: 关闭成功\n      * @param string message  关闭失败时给出具体原因\n      */\n\n  disableWebRuleBlackList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableWebRuleBlackList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableWebRuleBlackList\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling disableWebRuleBlackList\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableWebRuleBlackList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:disableWebRuleBlackList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭网站类规则的黑名单规则, 批量操作时 webBlackListRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.webBlackListRuleId - 网站类规则的黑名单规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  关闭结果, 0: 关闭失败, 1: 关闭成功\n      * @param string message  关闭失败时给出具体原因\n      */\n\n  disableBlackListRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableBlackListRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableBlackListRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling disableBlackListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webBlackListRuleId === undefined ||\n      opts.webBlackListRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webBlackListRuleId' when calling disableBlackListRuleOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      webBlackListRuleId: opts.webBlackListRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableBlackListRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webBlackListRules/{webBlackListRuleId}:disable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类防护规则的白名单用量信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer allocatedNum  已配置的白名单规则数量\n      * @param integer activeNum  开启的白名单规则数量\n      * @param integer surplusAllocateNum  还可添加的白名单规则数量\n      * @param integer maxAllocateNum  最多可添加的白名单规则数量\n      */\n\n  describeWebRuleWhiteListUsage (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWebRuleWhiteListUsage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeWebRuleWhiteListUsage\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling describeWebRuleWhiteListUsage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWebRuleWhiteListUsage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:describeWebRuleWhiteListUsage',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类规则的白名单规则列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小, 默认为10, 取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param webWhiteListRule dataList\n      * @param integer currentCount  当前页数量\n      * @param integer totalCount  总数\n      * @param integer totalPage  总页数\n      */\n\n  describeWhiteListRulesOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWhiteListRulesOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeWhiteListRulesOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling describeWhiteListRulesOfWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWhiteListRulesOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webWhiteListRules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加网站类规则的白名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {webWhiteListRuleSpec} opts.webWhiteListRuleSpec - 添加网站类规则的白名单规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  0: 添加失败, 1: 添加成功\n      * @param string message  添加失败时给出具体原因\n      */\n\n  createWhiteListRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createWhiteListRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createWhiteListRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling createWhiteListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webWhiteListRuleSpec === undefined ||\n      opts.webWhiteListRuleSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webWhiteListRuleSpec' when calling createWhiteListRuleOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.webWhiteListRuleSpec !== undefined &&\n      opts.webWhiteListRuleSpec !== null\n    ) {\n      postBody['webWhiteListRuleSpec'] = opts.webWhiteListRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createWhiteListRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webWhiteListRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类规则的白名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.webWhiteListRuleId - 网站类规则的白名单规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param webWhiteListRule data\n      */\n\n  describeWhiteListRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWhiteListRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeWhiteListRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling describeWhiteListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webWhiteListRuleId === undefined ||\n      opts.webWhiteListRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webWhiteListRuleId' when calling describeWhiteListRuleOfWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      webWhiteListRuleId: opts.webWhiteListRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWhiteListRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webWhiteListRules/{webWhiteListRuleId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改网站类规则的白名单规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.webWhiteListRuleId - 网站类规则的白名单规则 Id\n      * @param {webWhiteListRuleSpec} opts.webWhiteListRuleSpec - 修改网站类规则的白名单规则请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  修改结果, 0: 修改失败, 1: 修改成功\n      * @param string message  修改失败时给出具体原因\n      */\n\n  modifyWhiteListRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyWhiteListRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyWhiteListRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling modifyWhiteListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webWhiteListRuleId === undefined ||\n      opts.webWhiteListRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webWhiteListRuleId' when calling modifyWhiteListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webWhiteListRuleSpec === undefined ||\n      opts.webWhiteListRuleSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webWhiteListRuleSpec' when calling modifyWhiteListRuleOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.webWhiteListRuleSpec !== undefined &&\n      opts.webWhiteListRuleSpec !== null\n    ) {\n      postBody['webWhiteListRuleSpec'] = opts.webWhiteListRuleSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      webWhiteListRuleId: opts.webWhiteListRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyWhiteListRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webWhiteListRules/{webWhiteListRuleId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除网站类规则的白名单规则, 批量操作时 webWhiteListRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.webWhiteListRuleId - 网站类规则的白名单规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  删除结果, 0: 删除失败, 1: 删除成功\n      * @param string message  删除失败时给出具体原因\n      */\n\n  deleteWhiteListRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteWhiteListRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteWhiteListRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling deleteWhiteListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webWhiteListRuleId === undefined ||\n      opts.webWhiteListRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webWhiteListRuleId' when calling deleteWhiteListRuleOfWebRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      webWhiteListRuleId: opts.webWhiteListRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteWhiteListRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webWhiteListRules/{webWhiteListRuleId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启网站类规则的白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  开启结果, 0: 开启失败, 1: 开启成功\n      * @param string message  开启失败时给出具体原因\n      */\n\n  enableWebRuleWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableWebRuleWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableWebRuleWhiteList\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling enableWebRuleWhiteList\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableWebRuleWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:enableWebRuleWhiteList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启网站类规则的白名单规则, 批量操作时 webWhiteListRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.webWhiteListRuleId - 网站类规则的白名单规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  开启结果, 0: 开启失败, 1: 开启成功\n      * @param string message  开启失败时给出具体原因\n      */\n\n  enableWhiteListRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableWhiteListRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableWhiteListRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling enableWhiteListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webWhiteListRuleId === undefined ||\n      opts.webWhiteListRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webWhiteListRuleId' when calling enableWhiteListRuleOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      webWhiteListRuleId: opts.webWhiteListRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableWhiteListRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webWhiteListRules/{webWhiteListRuleId}:enable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭网站类规则的白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  关闭结果, 0: 关闭失败, 1: 关闭成功\n      * @param string message  关闭失败时给出具体原因\n      */\n\n  disableWebRuleWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableWebRuleWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableWebRuleWhiteList\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling disableWebRuleWhiteList\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableWebRuleWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}:disableWebRuleWhiteList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭网站类规则的白名单规则, 批量操作时 webWhiteListRuleId 传多个, 以 &#39;,&#39; 分隔, 返回 result.code 为 1 表示操作成功, 为 0 时可能全部失败, 也可能部分失败\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 高防实例 Id\n      * @param {string} opts.webRuleId - 网站规则 Id\n      * @param {string} opts.webWhiteListRuleId - 网站类规则的白名单规则 Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  关闭结果, 0: 关闭失败, 1: 关闭成功\n      * @param string message  关闭失败时给出具体原因\n      */\n\n  disableWhiteListRuleOfWebRule (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableWhiteListRuleOfWebRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableWhiteListRuleOfWebRule\"\n      )\n    }\n    if (opts.webRuleId === undefined || opts.webRuleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webRuleId' when calling disableWhiteListRuleOfWebRule\"\n      )\n    }\n    if (\n      opts.webWhiteListRuleId === undefined ||\n      opts.webWhiteListRuleId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.webWhiteListRuleId' when calling disableWhiteListRuleOfWebRule\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      webRuleId: opts.webRuleId,\n      webWhiteListRuleId: opts.webWhiteListRuleId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableWhiteListRuleOfWebRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/webRules/{webRuleId}/webWhiteListRules/{webWhiteListRuleId}:disable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类转发规则 Geo 模式的黑名单可设置区域编码\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param country dataList\n      */\n\n  describeWebRuleBlackListGeoAreas (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWebRuleBlackListGeoAreas\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWebRuleBlackListGeoAreas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeWebRuleBlackListGeoAreas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类转发规则 Geo 模式的白名单可设置区域编码\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param country dataList\n      */\n\n  describeWebRuleWhiteListGeoAreas (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWebRuleWhiteListGeoAreas\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWebRuleWhiteListGeoAreas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeWebRuleWhiteListGeoAreas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询网站类转发规则按地域回源配置 geoRsRoute 可设置的区域\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param country dataList\n      */\n\n  describeWebRuleRSGeoAreas (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWebRuleRSGeoAreas\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ipanti/1.12.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWebRuleRSGeoAreas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeWebRuleRSGeoAreas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = IPANTI\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/iv/v1/iv.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Vi Template\n * 视频审查模板管理相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iv'\nService._services[serviceId] = true\n\n/**\n * iv service.\n * @version 0.0.1\n */\n\nclass IV extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'iv.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  提交视频审查作业\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 视频审查模板ID\n      * @param {string} opts.region - 对象存储区域，输入和输入同区域\n      * @param {string} [opts.inputBucket] - 输入空间  optional\n      * @param {string} [opts.inputFileKey] - 输入文件  optional\n      * @param {string} [opts.outputBucket] - 输入空间  optional\n      * @param {string} [opts.outputFilePath] - 输入路径  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param viJobSummary resultObject\n      */\n\n  submitViJob (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling submitViJob\"\n      )\n    }\n    if (opts.region === undefined || opts.region === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.region' when calling submitViJob\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n    if (opts.region !== undefined && opts.region !== null) {\n      postBody['region'] = opts.region\n    }\n    if (opts.inputBucket !== undefined && opts.inputBucket !== null) {\n      postBody['inputBucket'] = opts.inputBucket\n    }\n    if (opts.inputFileKey !== undefined && opts.inputFileKey !== null) {\n      postBody['inputFileKey'] = opts.inputFileKey\n    }\n    if (opts.outputBucket !== undefined && opts.outputBucket !== null) {\n      postBody['outputBucket'] = opts.outputBucket\n    }\n    if (opts.outputFilePath !== undefined && opts.outputFilePath !== null) {\n      postBody['outputFilePath'] = opts.outputFilePath\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iv/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call submitViJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/viJobs:submit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询视频审查作业摘要\n      * @param {Object} opts - parameters\n      * @param {string} opts.jobId - 作业ID，路径参数\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param viJobSummary resultObject\n      */\n\n  getViJobSummary (opts, callback) {\n    opts = opts || {}\n\n    if (opts.jobId === undefined || opts.jobId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jobId' when calling getViJobSummary\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      jobId: opts.jobId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iv/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getViJobSummary with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/viJobs/{jobId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询视频审查模板列表。\n支持过滤查询：\n  - templateId,eq 精确匹配模板ID，非必选\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param viTemplatePageInfo resultObject\n      */\n\n  listViTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iv/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listViTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/viTemplates',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建视频审查模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateName - 模板名称。长度不超过128个字符。UTF-8编码。\n\n      * @param {integer} [opts.shotInterval] - 截图间隔  optional\n      * @param {string} [opts.shotIntervalType] - 间隔类型：time, percent  optional\n      * @param {string} [opts.shotFormat] - 截图格式：png, jpg  optional\n      * @param {string} [opts.shotFrameType] - 截图帧类型：any, key  optional\n      * @param {integer} [opts.shotWidth] - 截图宽度  optional\n      * @param {integer} [opts.shotHeight] - 截图高度  optional\n      * @param {string} [opts.shotFillType] - 截图填充类型：stretch, gauss, black, white  optional\n      * @param {string} opts.inspectItems - 审查配置，JSON格式\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param viTemplateInfo resultObject\n      */\n\n  createViTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateName === undefined || opts.templateName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateName' when calling createViTemplate\"\n      )\n    }\n    if (opts.inspectItems === undefined || opts.inspectItems === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.inspectItems' when calling createViTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.templateName !== undefined && opts.templateName !== null) {\n      postBody['templateName'] = opts.templateName\n    }\n    if (opts.shotInterval !== undefined && opts.shotInterval !== null) {\n      postBody['shotInterval'] = opts.shotInterval\n    }\n    if (opts.shotIntervalType !== undefined && opts.shotIntervalType !== null) {\n      postBody['shotIntervalType'] = opts.shotIntervalType\n    }\n    if (opts.shotFormat !== undefined && opts.shotFormat !== null) {\n      postBody['shotFormat'] = opts.shotFormat\n    }\n    if (opts.shotFrameType !== undefined && opts.shotFrameType !== null) {\n      postBody['shotFrameType'] = opts.shotFrameType\n    }\n    if (opts.shotWidth !== undefined && opts.shotWidth !== null) {\n      postBody['shotWidth'] = opts.shotWidth\n    }\n    if (opts.shotHeight !== undefined && opts.shotHeight !== null) {\n      postBody['shotHeight'] = opts.shotHeight\n    }\n    if (opts.shotFillType !== undefined && opts.shotFillType !== null) {\n      postBody['shotFillType'] = opts.shotFillType\n    }\n    if (opts.inspectItems !== undefined && opts.inspectItems !== null) {\n      postBody['inspectItems'] = opts.inspectItems\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iv/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createViTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/viTemplates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询视频审查模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板ID，路径参数\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param viTemplateInfo resultObject\n      */\n\n  getViTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling getViTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iv/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getViTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/viTemplates/{templateId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改视频审查模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板ID，路径参数\n      * @param {string} [opts.templateName] - 模板名称。长度不超过128个字符。UTF-8编码。\n  optional\n      * @param {integer} [opts.shotInterval] - 截图间隔  optional\n      * @param {string} [opts.shotIntervalType] - 间隔类型：time, percent  optional\n      * @param {string} [opts.shotFormat] - 截图格式：png, jpg  optional\n      * @param {string} [opts.shotFrameType] - 截图帧类型：any, key  optional\n      * @param {integer} [opts.shotWidth] - 截图宽度  optional\n      * @param {integer} [opts.shotHeight] - 截图高度  optional\n      * @param {string} [opts.shotFillType] - 截图填充类型：stretch, gauss, black, white  optional\n      * @param {string} [opts.inspectItems] - 审查配置，JSON格式  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param viTemplateInfo resultObject\n      */\n\n  updateViTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling updateViTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.templateName !== undefined && opts.templateName !== null) {\n      postBody['templateName'] = opts.templateName\n    }\n    if (opts.shotInterval !== undefined && opts.shotInterval !== null) {\n      postBody['shotInterval'] = opts.shotInterval\n    }\n    if (opts.shotIntervalType !== undefined && opts.shotIntervalType !== null) {\n      postBody['shotIntervalType'] = opts.shotIntervalType\n    }\n    if (opts.shotFormat !== undefined && opts.shotFormat !== null) {\n      postBody['shotFormat'] = opts.shotFormat\n    }\n    if (opts.shotFrameType !== undefined && opts.shotFrameType !== null) {\n      postBody['shotFrameType'] = opts.shotFrameType\n    }\n    if (opts.shotWidth !== undefined && opts.shotWidth !== null) {\n      postBody['shotWidth'] = opts.shotWidth\n    }\n    if (opts.shotHeight !== undefined && opts.shotHeight !== null) {\n      postBody['shotHeight'] = opts.shotHeight\n    }\n    if (opts.shotFillType !== undefined && opts.shotFillType !== null) {\n      postBody['shotFillType'] = opts.shotFillType\n    }\n    if (opts.inspectItems !== undefined && opts.inspectItems !== null) {\n      postBody['inspectItems'] = opts.inspectItems\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iv/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateViTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/viTemplates/{templateId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除视频审查模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板ID，路径参数\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteViTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling deleteViTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  iv/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteViTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/viTemplates/{templateId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = IV\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/jcq/v1/jcq.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Topic\n * Topic相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jcq'\nService._services[serviceId] = true\n\n/**\n * jcq service.\n * @version 1.0.2\n */\n\nJDCloud.JCQ = class JCQ extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'jcq.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查看接入点接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param accessPoint accessPoint\n      */\n\n  describeAccessPoint (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAccessPoint\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling describeAccessPoint\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAccessPoint with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/accessPoints',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  consumerGroupId列表\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string consumerGroupIds  consumerGroupId列表\n      */\n\n  describeConsumerGroupIds (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeConsumerGroupIds\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeConsumerGroupIds with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/consumerGroupIds',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  死信消息数(按照用户或者consumerGroupId)\n      * @param {Object} opts - parameters\n      * @param {string} [opts.consumerGroupId] - consumerGroupId为空则显示该用户所有订阅关系里的死信数量  optional\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deadLetterNumber deadLetterNumbers\n      * @param integer totalCount  总数\n      */\n\n  describeDeadLetterNumbers (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeadLetterNumbers\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.consumerGroupId !== undefined && opts.consumerGroupId !== null) {\n      queryParams['consumerGroupId'] = opts.consumerGroupId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeadLetterNumbers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deadLetterNumbers',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  死信消息数\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} [opts.consumerGroupId] - consumerGroupId为空则显示该Topic下所有订阅关系里的死信数量  optional\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deadLetterNumber deadLetterNumbers\n      * @param integer totalCount  总数\n      */\n\n  describeDeadLetterNumbersWithTopic (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeadLetterNumbersWithTopic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling describeDeadLetterNumbersWithTopic\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.consumerGroupId !== undefined && opts.consumerGroupId !== null) {\n      queryParams['consumerGroupId'] = opts.consumerGroupId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeadLetterNumbersWithTopic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/deadLetterNumbers',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  死信队列列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.consumerGroupId - consumerGroupId\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} opts.startTime - 开始时间\n      * @param {string} opts.endTime - 结束时间\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deadLetter deadLetters\n      * @param integer totalCount  总数\n      */\n\n  listDeadLetters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listDeadLetters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling listDeadLetters\"\n      )\n    }\n    if (opts.consumerGroupId === undefined || opts.consumerGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.consumerGroupId' when calling listDeadLetters\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling listDeadLetters\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling listDeadLetters\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName,\n      consumerGroupId: opts.consumerGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listDeadLetters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/subscriptions/{consumerGroupId}:listDeadLetters',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除死信消息\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.consumerGroupId - consumerGroupId\n      * @param {string} [opts.messageIds] - messageIds,多个逗号隔开，不传该值就是删除所有的死信  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string messageIds  被删除的消息的id列表\n      */\n\n  deleteDeadLetters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDeadLetters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling deleteDeadLetters\"\n      )\n    }\n    if (opts.consumerGroupId === undefined || opts.consumerGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.consumerGroupId' when calling deleteDeadLetters\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.messageIds !== undefined && opts.messageIds !== null) {\n      queryParams['messageIds'] = opts.messageIds\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName,\n      consumerGroupId: opts.consumerGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDeadLetters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/subscriptions/{consumerGroupId}:deleteDeadLetters',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重发死信消息\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.consumerGroupId - consumerGroupId\n      * @param {string} [opts.messageIds] - messageIds,多个逗号隔开，不传该值就是重发所有死信  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string messageIds  重发成功的消息id列表\n      */\n\n  resendDeadLetters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resendDeadLetters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling resendDeadLetters\"\n      )\n    }\n    if (opts.consumerGroupId === undefined || opts.consumerGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.consumerGroupId' when calling resendDeadLetters\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.messageIds !== undefined && opts.messageIds !== null) {\n      postBody['messageIds'] = opts.messageIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName,\n      consumerGroupId: opts.consumerGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resendDeadLetters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/subscriptions/{consumerGroupId}:resendDeadLetters',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  消息列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.startTime - 开始时间\n      * @param {string} opts.endTime - 结束时间\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param message messages\n      */\n\n  describeMessages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMessages\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling describeMessages\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeMessages\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeMessages\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMessages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/messages',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询message详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.messageId - message Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param message message  消息详情\n      */\n\n  describeMessage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMessage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling describeMessage\"\n      )\n    }\n    if (opts.messageId === undefined || opts.messageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.messageId' when calling describeMessage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName,\n      messageId: opts.messageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMessage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/messages/{messageId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询消息轨迹\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.messageId - message Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param messageTraceInfo messageTraceInfo  消息轨迹信息\n      */\n\n  describeMessageTrace (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMessageTrace\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling describeMessageTrace\"\n      )\n    }\n    if (opts.messageId === undefined || opts.messageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.messageId' when calling describeMessageTrace\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName,\n      messageId: opts.messageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMessageTrace with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/messageTrace/{messageId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据businessId查询消息\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.businessId - business id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param message messages\n      */\n\n  describeMessagesByBusinessId (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMessagesByBusinessId\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling describeMessagesByBusinessId\"\n      )\n    }\n    if (opts.businessId === undefined || opts.businessId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.businessId' when calling describeMessagesByBusinessId\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.businessId !== undefined && opts.businessId !== null) {\n      postBody['businessId'] = opts.businessId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMessagesByBusinessId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/messagesWithBusinessId',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看当前topic授予了哪些用户哪些权限\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param permission permissions\n      */\n\n  describePermission (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePermission\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling describePermission\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePermission with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/iam',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对当前topic授予目标用户特定权限\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.permission - 权限类型，[PUB,SUB,PUBSUB]\n      * @param {string} opts.targetUserId - 目标用户UserId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addPermission (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addPermission\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling addPermission\"\n      )\n    }\n    if (opts.permission === undefined || opts.permission === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.permission' when calling addPermission\"\n      )\n    }\n    if (opts.targetUserId === undefined || opts.targetUserId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetUserId' when calling addPermission\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.permission !== undefined && opts.permission !== null) {\n      postBody['permission'] = opts.permission\n    }\n    if (opts.targetUserId !== undefined && opts.targetUserId !== null) {\n      postBody['targetUserId'] = opts.targetUserId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addPermission with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/iam',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除当前topic对目标用户授权的权限\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.permission - 权限类型, [PUB, SUB, PUBSUB]\n      * @param {string} opts.targetUserId - 目标用户UserId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removePermission (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  removePermission\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling removePermission\"\n      )\n    }\n    if (opts.permission === undefined || opts.permission === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.permission' when calling removePermission\"\n      )\n    }\n    if (opts.targetUserId === undefined || opts.targetUserId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetUserId' when calling removePermission\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.permission !== undefined && opts.permission !== null) {\n      queryParams['permission'] = opts.permission\n    }\n    if (opts.targetUserId !== undefined && opts.targetUserId !== null) {\n      queryParams['targetUserId'] = opts.targetUserId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removePermission with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/iam',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  订阅列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} [opts.consumerGroupFilter] - consumerGroupFilter，consumerGroupId的过滤条件  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subscription subscriptions\n      * @param integer totalCount  订阅关系的总数\n      */\n\n  describeSubscriptions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSubscriptions\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling describeSubscriptions\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (\n      opts.consumerGroupFilter !== undefined &&\n      opts.consumerGroupFilter !== null\n    ) {\n      queryParams['consumerGroupFilter'] = opts.consumerGroupFilter\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubscriptions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/subscriptions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建订阅\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.consumerGroupId - consumerGroupId\n      * @param {integer} [opts.messageInvisibleTimeInSeconds] - 消息隐藏时间单位秒  optional\n      * @param {boolean} [opts.dlqEnable] - 是否开启死信队列[true, false]  optional\n      * @param {integer} [opts.maxRetryTimes] - 最大重试次数dlqEnable为true必填,范围[0,16]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createSubscription (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSubscription\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling createSubscription\"\n      )\n    }\n    if (opts.consumerGroupId === undefined || opts.consumerGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.consumerGroupId' when calling createSubscription\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.consumerGroupId !== undefined && opts.consumerGroupId !== null) {\n      postBody['consumerGroupId'] = opts.consumerGroupId\n    }\n    if (\n      opts.messageInvisibleTimeInSeconds !== undefined &&\n      opts.messageInvisibleTimeInSeconds !== null\n    ) {\n      postBody['messageInvisibleTimeInSeconds'] =\n        opts.messageInvisibleTimeInSeconds\n    }\n    if (opts.dlqEnable !== undefined && opts.dlqEnable !== null) {\n      postBody['dlqEnable'] = opts.dlqEnable\n    }\n    if (opts.maxRetryTimes !== undefined && opts.maxRetryTimes !== null) {\n      postBody['maxRetryTimes'] = opts.maxRetryTimes\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSubscription with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/subscriptions',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询订阅详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.consumerGroupId - consumerGroupId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subscription subscription  订阅详情\n      */\n\n  describeSubscription (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSubscription\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling describeSubscription\"\n      )\n    }\n    if (opts.consumerGroupId === undefined || opts.consumerGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.consumerGroupId' when calling describeSubscription\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName,\n      consumerGroupId: opts.consumerGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubscription with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/subscriptions/{consumerGroupId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改订阅\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.consumerGroupId - consumerGroupId\n      * @param {integer} [opts.maxRetryTimes] - 最大重试次数  optional\n      * @param {integer} [opts.messageInvisibleTimeInSeconds] - 消息ack超时时间  optional\n      * @param {boolean} [opts.dlqEnable] - 是否开启死信队列[true, false]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifySubscriptionAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifySubscriptionAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling modifySubscriptionAttribute\"\n      )\n    }\n    if (opts.consumerGroupId === undefined || opts.consumerGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.consumerGroupId' when calling modifySubscriptionAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.maxRetryTimes !== undefined && opts.maxRetryTimes !== null) {\n      postBody['maxRetryTimes'] = opts.maxRetryTimes\n    }\n    if (\n      opts.messageInvisibleTimeInSeconds !== undefined &&\n      opts.messageInvisibleTimeInSeconds !== null\n    ) {\n      postBody['messageInvisibleTimeInSeconds'] =\n        opts.messageInvisibleTimeInSeconds\n    }\n    if (opts.dlqEnable !== undefined && opts.dlqEnable !== null) {\n      postBody['dlqEnable'] = opts.dlqEnable\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName,\n      consumerGroupId: opts.consumerGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifySubscriptionAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/subscriptions/{consumerGroupId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除订阅\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.consumerGroupId - consumerGroupId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSubscription (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSubscription\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling deleteSubscription\"\n      )\n    }\n    if (opts.consumerGroupId === undefined || opts.consumerGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.consumerGroupId' when calling deleteSubscription\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName,\n      consumerGroupId: opts.consumerGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSubscription with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/subscriptions/{consumerGroupId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  清除消息\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.consumerGroupId - consumerGroupId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  cleanMessages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  cleanMessages\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling cleanMessages\"\n      )\n    }\n    if (opts.consumerGroupId === undefined || opts.consumerGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.consumerGroupId' when calling cleanMessages\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName,\n      consumerGroupId: opts.consumerGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cleanMessages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/subscriptions/{consumerGroupId}:cleanMessages',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重置消费位\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} opts.consumerGroupId - consumerGroupId\n      * @param {string} opts.time - 时间\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resetConsumeOffset (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resetConsumeOffset\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling resetConsumeOffset\"\n      )\n    }\n    if (opts.consumerGroupId === undefined || opts.consumerGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.consumerGroupId' when calling resetConsumeOffset\"\n      )\n    }\n    if (opts.time === undefined || opts.time === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.time' when calling resetConsumeOffset\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.time !== undefined && opts.time !== null) {\n      postBody['time'] = opts.time\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName,\n      consumerGroupId: opts.consumerGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resetConsumeOffset with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}/subscriptions/{consumerGroupId}:resetConsumeOffset',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询topic列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {string} [opts.topicFilter] - topic名称的过滤条件，大小写不敏感  optional\n      * @param {tagFilter} [opts.tagFilters] - 标签过滤条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param topic topics\n      * @param integer totalCount  总数\n      */\n\n  describeTopics (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTopics\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.topicFilter !== undefined && opts.topicFilter !== null) {\n      queryParams['topicFilter'] = opts.topicFilter\n    }\n    Object.assign(\n      queryParams,\n      this.buildTagFilterParam(opts.tagFilters, 'tagFilters')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTopics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个指定名称的topic\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic名称\n      * @param {string} opts.type - 类型，[normal,global_order]\n      * @param {string} [opts.description] - 描述，长度不大于255  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createTopic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createTopic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling createTopic\"\n      )\n    }\n    if (opts.type === undefined || opts.type === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.type' when calling createTopic\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.topicName !== undefined && opts.topicName !== null) {\n      postBody['topicName'] = opts.topicName\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      postBody['type'] = opts.type\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createTopic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询topic详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param topic topic\n      */\n\n  describeTopic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTopic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling describeTopic\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTopic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除单个topic\n      * @param {Object} opts - parameters\n      * @param {string} opts.topicName - topic 名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteTopic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteTopic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicName === undefined || opts.topicName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicName' when calling deleteTopic\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      topicName: opts.topicName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jcq/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTopic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topics/{topicName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.JCQ\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/jdccs/v1/jdccs.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Ticket API\n * 云托管服务的工单API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jdccs'\nService._services[serviceId] = true\n\n/**\n * jdccs service.\n * @version 1.1.5\n */\n\nclass JDCCS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'jdccs.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询报警规则列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20  optional\n      * @param {string} [opts.resourceType] - 资源类型 bandwidth:带宽  optional\n      * @param {string} [opts.resourceId] - 资源ID，指定resourceId时须指定resourceType  optional\n      * @param {string} [opts.idc] - 机房英文标识  optional\n      * @param {string} [opts.status] - 规则状态 disabled:禁用 enabled:启用  optional\n      * @param {filter} [opts.filters] - alarmId - 规则实施ID，精确匹配，支持多个\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeAlarm alarms\n      * @param integer pageNumber  页码\n      * @param integer pageSize  分页大小\n      * @param integer totalCount  总数量\n      */\n\n  describeAlarms (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.resourceType !== undefined && opts.resourceType !== null) {\n      queryParams['resourceType'] = opts.resourceType\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.idc !== undefined && opts.idc !== null) {\n      queryParams['idc'] = opts.idc\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarms with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/alarms',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建报警\n      * @param {Object} opts - parameters\n      * @param {string} [opts.idc] - idc机房实例ID  optional\n      * @param {string} [opts.resourceType] - 资源类型，bandwidth:带宽  optional\n      * @param {string} [opts.resourceId] - 带宽实例ID  optional\n      * @param {string} [opts.name] - 规则名称  optional\n      * @param {string} [opts.metric] - 监控项，bandwidthTrafficIn:上行实时流量 bandwidthTrafficOut:下行实时流量  optional\n      * @param {integer} [opts.period] - 统计周期（单位：分钟）  optional\n      * @param {string} [opts.statisticMethod] - 统计方法：平均值&#x3D;avg、最大值&#x3D;max、最小值&#x3D;min  optional\n      * @param {string} [opts.operator] - 计算方式 &gt;&#x3D;、&gt;、&lt;、&lt;&#x3D;、&#x3D;、！&#x3D;  optional\n      * @param {number} [opts.threshold] - 阈值  optional\n      * @param {integer} [opts.times] - 连续多少次后报警  optional\n      * @param {integer} [opts.noticePeriod] - 通知周期 单位：小时  optional\n      * @param {string} [opts.status] - 规则状态 disabled:禁用 enabled:启用  optional\n      * @param {string} [opts.noticeMethod] - 通知方式 all:全部 sms：短信 email:邮件  optional\n      * @param {string} [opts.noticeObj] - 通知对象 all:全部 persons：个人 groups:角色组  optional\n      * @param {string} [opts.userId] - 通知对象用户ID,若多个用逗号分隔  optional\n      * @param {string} [opts.groupId] - 通知对象组ID  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      */\n\n  createAlarm (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.idc !== undefined && opts.idc !== null) {\n      postBody['idc'] = opts.idc\n    }\n    if (opts.resourceType !== undefined && opts.resourceType !== null) {\n      postBody['resourceType'] = opts.resourceType\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      postBody['resourceId'] = opts.resourceId\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.metric !== undefined && opts.metric !== null) {\n      postBody['metric'] = opts.metric\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.statisticMethod !== undefined && opts.statisticMethod !== null) {\n      postBody['statisticMethod'] = opts.statisticMethod\n    }\n    if (opts.operator !== undefined && opts.operator !== null) {\n      postBody['operator'] = opts.operator\n    }\n    if (opts.threshold !== undefined && opts.threshold !== null) {\n      postBody['threshold'] = opts.threshold\n    }\n    if (opts.times !== undefined && opts.times !== null) {\n      postBody['times'] = opts.times\n    }\n    if (opts.noticePeriod !== undefined && opts.noticePeriod !== null) {\n      postBody['noticePeriod'] = opts.noticePeriod\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.noticeMethod !== undefined && opts.noticeMethod !== null) {\n      postBody['noticeMethod'] = opts.noticeMethod\n    }\n    if (opts.noticeObj !== undefined && opts.noticeObj !== null) {\n      postBody['noticeObj'] = opts.noticeObj\n    }\n    if (opts.userId !== undefined && opts.userId !== null) {\n      postBody['userId'] = opts.userId\n    }\n    if (opts.groupId !== undefined && opts.groupId !== null) {\n      postBody['groupId'] = opts.groupId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/alarms',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询报警规则详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.alarmId - 报警规则ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param alarm alarm\n      */\n\n  describeAlarm (opts, callback) {\n    opts = opts || {}\n\n    if (opts.alarmId === undefined || opts.alarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmId' when calling describeAlarm\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      alarmId: opts.alarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/alarms/{alarmId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改报警规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.alarmId - 报警规则ID\n      * @param {string} [opts.name] - 规则名称  optional\n      * @param {string} [opts.metric] - 监控项，bandwidthTrafficIn:上行实时流量 bandwidthTrafficOut:下行实时流量  optional\n      * @param {integer} [opts.period] - 统计周期（单位：分钟）  optional\n      * @param {string} [opts.statisticMethod] - 统计方法：平均值&#x3D;avg、最大值&#x3D;max、最小值&#x3D;min  optional\n      * @param {string} [opts.operator] - 计算方式 &gt;&#x3D;、&gt;、&lt;、&lt;&#x3D;、&#x3D;、！&#x3D;  optional\n      * @param {number} [opts.threshold] - 阈值  optional\n      * @param {integer} [opts.times] - 连续多少次后报警  optional\n      * @param {integer} [opts.noticePeriod] - 通知周期 单位：小时  optional\n      * @param {string} [opts.status] - 规则状态 disabled:禁用 enabled:启用  optional\n      * @param {string} [opts.noticeMethod] - 通知方式 all:全部 sms：短信 email:邮件  optional\n      * @param {string} [opts.userId] - 通知对象用户ID,若多个用逗号分隔  optional\n      * @param {string} [opts.groupId] - 通知对象组ID  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      */\n\n  updateAlarm (opts, callback) {\n    opts = opts || {}\n\n    if (opts.alarmId === undefined || opts.alarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmId' when calling updateAlarm\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.metric !== undefined && opts.metric !== null) {\n      postBody['metric'] = opts.metric\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.statisticMethod !== undefined && opts.statisticMethod !== null) {\n      postBody['statisticMethod'] = opts.statisticMethod\n    }\n    if (opts.operator !== undefined && opts.operator !== null) {\n      postBody['operator'] = opts.operator\n    }\n    if (opts.threshold !== undefined && opts.threshold !== null) {\n      postBody['threshold'] = opts.threshold\n    }\n    if (opts.times !== undefined && opts.times !== null) {\n      postBody['times'] = opts.times\n    }\n    if (opts.noticePeriod !== undefined && opts.noticePeriod !== null) {\n      postBody['noticePeriod'] = opts.noticePeriod\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.noticeMethod !== undefined && opts.noticeMethod !== null) {\n      postBody['noticeMethod'] = opts.noticeMethod\n    }\n    if (opts.userId !== undefined && opts.userId !== null) {\n      postBody['userId'] = opts.userId\n    }\n    if (opts.groupId !== undefined && opts.groupId !== null) {\n      postBody['groupId'] = opts.groupId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      alarmId: opts.alarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/alarms/{alarmId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除报警\n      * @param {Object} opts - parameters\n      * @param {string} opts.alarmId - 报警规则ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      */\n\n  deleteAlarm (opts, callback) {\n    opts = opts || {}\n\n    if (opts.alarmId === undefined || opts.alarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmId' when calling deleteAlarm\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      alarmId: opts.alarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/alarms/{alarmId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  报警历史列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20  optional\n      * @param {string} [opts.alarmId] - 报警规则ID  optional\n      * @param {string} [opts.idc] - 机房英文标识  optional\n      * @param {integer} [opts.startTime] - 查询时间范围的开始时间， UNIX时间戳  optional\n      * @param {integer} [opts.endTime] - 查询时间范围的结束时间， UNIX时间戳  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param alarmHistory alarmHistory\n      * @param integer pageNumber  页码\n      * @param integer pageSize  分页大小\n      * @param integer totalCount  总数量\n      */\n\n  describeAlarmHistory (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.alarmId !== undefined && opts.alarmId !== null) {\n      queryParams['alarmId'] = opts.alarmId\n    }\n    if (opts.idc !== undefined && opts.idc !== null) {\n      queryParams['idc'] = opts.idc\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarmHistory with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/alarmHistory',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用、禁用报警\n      * @param {Object} opts - parameters\n      * @param {string} opts.alarmId - 报警规则ID\n      * @param {string} [opts.status] - 规则状态 disabled:禁用 enabled:启用  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      */\n\n  switchAlarm (opts, callback) {\n    opts = opts || {}\n\n    if (opts.alarmId === undefined || opts.alarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmId' when calling switchAlarm\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      alarmId: opts.alarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call switchAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/alarms/{alarmId}:switch',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可用监控项列表\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metric metrics\n      */\n\n  describeMetrics (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMetrics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/metrics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看某资源单个监控项数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {string} opts.metric - 监控项英文标识(id)\n      * @param {string} opts.resourceId - 资源ID\n      * @param {integer} opts.startTime - 查询时间范围的开始时间， UNIX时间戳，（机柜电流最多支持最近90天数据查询、带宽流量最多支持最近30天数据查询）\n      * @param {integer} opts.endTime - 查询时间范围的结束时间， UNIX时间戳，（机柜电流最多支持最近90天数据查询、带宽流量最多支持最近30天数据查询）\n      * @param {string} [opts.timeInterval] - 时间间隔：分钟m、小时h、天d，如： 10分钟&#x3D;10m、1小时&#x3D;1h，3天&#x3D;3d；默认5m，最小支持5m，最大90d 目前带宽上、下行流量查询，时间间隔：1m、5m，默认5m。1m时间间隔支持的最大时间范围为2小时  optional\n      * @param {string} [opts.ip] - 交换机IP，指定ip时须同时指定port  optional\n      * @param {string} [opts.port] - 端口，指定port时须同时指定ip  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metricData metricData\n      */\n\n  describeMetricData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeMetricData\"\n      )\n    }\n    if (opts.metric === undefined || opts.metric === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metric' when calling describeMetricData\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling describeMetricData\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeMetricData\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeMetricData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      queryParams['timeInterval'] = opts.timeInterval\n    }\n    if (opts.ip !== undefined && opts.ip !== null) {\n      queryParams['ip'] = opts.ip\n    }\n    if (opts.port !== undefined && opts.port !== null) {\n      queryParams['port'] = opts.port\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc,\n      metric: opts.metric\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMetricData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/metrics/{metric}/metricData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看某资源的最后一个监控数据点（目前只支持机柜电流）\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {string} opts.metric - 监控项英文标识(id)\n      * @param {string} opts.resourceId - 资源ID，支持多个resourceId批量查询，每个id用英文竖线分隔\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param lastDownsampleRespItem items\n      */\n\n  lastDownsample (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling lastDownsample\"\n      )\n    }\n    if (opts.metric === undefined || opts.metric === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metric' when calling lastDownsample\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling lastDownsample\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc,\n      metric: opts.metric\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call lastDownsample with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/metrics/{metric}/lastDownsample',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询带宽（出口）流量列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20  optional\n      * @param {string} [opts.bandwidthName] - 带宽（出口）名称  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeBandwidthTraffic bandwidthTraffics\n      * @param integer pageNumber  页码\n      * @param integer pageSize  分页大小\n      * @param integer totalCount  总数量\n      */\n\n  describeBandwidthTraffics (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeBandwidthTraffics\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.bandwidthName !== undefined && opts.bandwidthName !== null) {\n      queryParams['bandwidthName'] = opts.bandwidthName\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBandwidthTraffics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/bandwidthTraffics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询带宽（出口）流量（资源）详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {string} opts.bandwidthId - 带宽（出口）实例ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bandwidthTraffic bandwidthTraffic  带宽（出口）流量（资源）详情\n      */\n\n  describeBandwidthTraffic (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeBandwidthTraffic\"\n      )\n    }\n    if (opts.bandwidthId === undefined || opts.bandwidthId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthId' when calling describeBandwidthTraffic\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc,\n      bandwidthId: opts.bandwidthId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBandwidthTraffic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/bandwidthTraffics/{bandwidthId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据IP网段查询流量采样数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.resourceId - 资源ID，支持多个resourceId批量查询，每个id用英文竖线分隔\n      * @param {integer} opts.startTime - 查询时间范围的开始时间， UNIX时间戳，（支持查询最近30分钟数据且时间范围不超过5分钟）\n      * @param {integer} opts.endTime - 查询时间范围的结束时间， UNIX时间戳，（支持查询最近30分钟数据且时间范围不超过5分钟）\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param trafficSamplingData data\n      */\n\n  describeTrafficSampling (opts, callback) {\n    opts = opts || {}\n\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling describeTrafficSampling\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeTrafficSampling\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeTrafficSampling\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTrafficSampling with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/trafficSampling',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询开放设备列表\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param openDevices openDevices\n      */\n\n  describeOpenDevices (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeOpenDevices with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/openDevices',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询开放设备数据信息接口\n      * @param {Object} opts - parameters\n      * @param {string} [opts.deviceCodes] - 设备编码,支持多个deviceCode批量查询，每个id用英文竖线分隔  optional\n      * @param {string} opts.deviceType - 设备类型\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param openDevicesData data\n      */\n\n  describeOpenDevicesData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.deviceType === undefined || opts.deviceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceType' when calling describeOpenDevicesData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deviceCodes !== undefined && opts.deviceCodes !== null) {\n      queryParams['deviceCodes'] = opts.deviceCodes\n    }\n    if (opts.deviceType !== undefined && opts.deviceType !== null) {\n      queryParams['deviceType'] = opts.deviceType\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeOpenDevicesData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/openDevicesData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按照时间段查询单个机柜AB路电流\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {string} opts.resourceId - 机柜资源ID\n      * @param {integer} opts.startTime - 查询时间范围的开始时间， UNIX时间戳，（最多支持最近90天数据查询）\n      * @param {integer} opts.endTime - 查询时间范围的结束时间， UNIX时间戳，（最多支持最近90天数据查询）\n      * @param {string} [opts.timeInterval] - 时间间隔：分钟m、小时h、天d，如： 10分钟&#x3D;10m、1小时&#x3D;1h，3天&#x3D;3d；默认5m，最小支持5m，最大90d 目前带宽上、下行流量查询，时间间隔：1m、5m，默认5m。时间间隔支持的最大时间范围为2小时  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cabinetCurrentRespItem data\n      */\n\n  describeRangetimeCabinetCurrent (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeRangetimeCabinetCurrent\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling describeRangetimeCabinetCurrent\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeRangetimeCabinetCurrent\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeRangetimeCabinetCurrent\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      queryParams['timeInterval'] = opts.timeInterval\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRangetimeCabinetCurrent with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/rangetimeCabinetCurrent',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询多个机柜AB路实时电流\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {string} opts.resourceId - 资源ID，支持多个resourceId批量查询，每个id用英文竖线分隔\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cabinetCurrentRespItem data\n      */\n\n  describeRealtimeCabinetCurrent (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeRealtimeCabinetCurrent\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling describeRealtimeCabinetCurrent\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRealtimeCabinetCurrent with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/realtimeCabinetCurrent',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按照时间段查询单个机柜AB路电流-原始数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {string} opts.resourceId - 机柜资源ID\n      * @param {integer} opts.startTime - 查询时间范围的开始时间， UNIX时间戳，（最多支持最近90天数据查询）\n      * @param {integer} opts.endTime - 查询时间范围的结束时间， UNIX时间戳，（最多支持最近90天数据查询）\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object data\n      */\n\n  describeRangetimeCabinetOriCurrent (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeRangetimeCabinetOriCurrent\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling describeRangetimeCabinetOriCurrent\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeRangetimeCabinetOriCurrent\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeRangetimeCabinetOriCurrent\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRangetimeCabinetOriCurrent with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/rangetimeCabinetOriCurrent',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询IDC机房列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20  optional\n      * @param {integer} [opts.all] - 是否查询全部，默认分页  optional\n      * @param {string} [opts.includeExternalIdc] - 是否强制包含外部机房 yes/no  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param idc idcs\n      * @param integer pageNumber  页码\n      * @param integer pageSize  分页大小\n      * @param integer totalCount  总数量\n      */\n\n  describeIdcs (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.all !== undefined && opts.all !== null) {\n      queryParams['all'] = opts.all\n    }\n    if (\n      opts.includeExternalIdc !== undefined &&\n      opts.includeExternalIdc !== null\n    ) {\n      queryParams['includeExternalIdc'] = opts.includeExternalIdc\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIdcs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询机房房间号列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20  optional\n      * @param {integer} [opts.all] - 是否查询全部，默认分页  optional\n      * @param {filter} [opts.filters] - roomNo - 房间号，精确匹配，支持多个\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param room rooms\n      * @param integer pageNumber  页码\n      * @param integer pageSize  分页大小\n      * @param integer totalCount  总数量\n      */\n\n  describeRooms (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeRooms\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.all !== undefined && opts.all !== null) {\n      queryParams['all'] = opts.all\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRooms with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/rooms',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询机柜列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20  optional\n      * @param {string} [opts.cabinetType] - 机柜类型 formal:正式机柜 reserved:预留机柜  optional\n      * @param {string} [opts.cabinetOpenStatus] - 机柜开通状态 disabled:未开通 enabling:开通中 enabled:已开通 disabling:关电中  optional\n      * @param {string} [opts.cabinetNo] - 机柜编码  optional\n      * @param {filter} [opts.filters] - roomNo - 房间号，精确匹配，支持多个\ncabinetId - 机柜ID，精确匹配，支持多个\ncabinetNo - 机柜编码，精确匹配，支持多个\ncabinetOpenStatus - 机柜开通状态，精确匹配，支持多个\n  optional\n      * @param {sort} [opts.sorts] - cabinetNo - 机柜编码 roomNo - 房间号  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeCabinet cabinets\n      * @param integer pageNumber  页码\n      * @param integer pageSize  分页大小\n      * @param integer totalCount  总数量\n      */\n\n  describeCabinets (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeCabinets\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.cabinetType !== undefined && opts.cabinetType !== null) {\n      queryParams['cabinetType'] = opts.cabinetType\n    }\n    if (\n      opts.cabinetOpenStatus !== undefined &&\n      opts.cabinetOpenStatus !== null\n    ) {\n      queryParams['cabinetOpenStatus'] = opts.cabinetOpenStatus\n    }\n    if (opts.cabinetNo !== undefined && opts.cabinetNo !== null) {\n      queryParams['cabinetNo'] = opts.cabinetNo\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCabinets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/cabinets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询机柜详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {string} opts.cabinetId - 机柜实例ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cabinet cabinet\n      */\n\n  describeCabinet (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeCabinet\"\n      )\n    }\n    if (opts.cabinetId === undefined || opts.cabinetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cabinetId' when calling describeCabinet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc,\n      cabinetId: opts.cabinetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCabinet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/cabinets/{cabinetId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询设备列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20  optional\n      * @param {string} [opts.cabinetId] - 机柜ID  optional\n      * @param {string} [opts.deviceType] - 设备类型 server:服务器 network:网络设备 storage:存储设备 other:其他设备  optional\n      * @param {string} [opts.assetStatus] - 资产状态 launched:已上架 opened:已开通 canceling:退订中 operating:操作中 modifing:变更中  optional\n      * @param {string} [opts.assetBelong] - 资产归属 own:自备 lease:租赁  optional\n      * @param {string} [opts.deviceNo] - 设备编码  optional\n      * @param {string} [opts.snNo] - 设备SN号  optional\n      * @param {filter} [opts.filters] - deviceId - 设备实例ID，精确匹配，支持多个\nsnNo - 设备SN号，精确匹配，支持多个\ndeviceNo - 设备编码，精确匹配，支持多个\ncabinetNo - 机柜编码，精确匹配，支持多个\n  optional\n      * @param {sort} [opts.sorts] - deviceNo - 设备编码 cabinetNo - 机柜编码  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeDevice devices\n      * @param integer pageNumber  页码\n      * @param integer pageSize  分页大小\n      * @param integer totalCount  总数量\n      */\n\n  describeDevices (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeDevices\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.cabinetId !== undefined && opts.cabinetId !== null) {\n      queryParams['cabinetId'] = opts.cabinetId\n    }\n    if (opts.deviceType !== undefined && opts.deviceType !== null) {\n      queryParams['deviceType'] = opts.deviceType\n    }\n    if (opts.assetStatus !== undefined && opts.assetStatus !== null) {\n      queryParams['assetStatus'] = opts.assetStatus\n    }\n    if (opts.assetBelong !== undefined && opts.assetBelong !== null) {\n      queryParams['assetBelong'] = opts.assetBelong\n    }\n    if (opts.deviceNo !== undefined && opts.deviceNo !== null) {\n      queryParams['deviceNo'] = opts.deviceNo\n    }\n    if (opts.snNo !== undefined && opts.snNo !== null) {\n      queryParams['snNo'] = opts.snNo\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDevices with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/devices',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询设备详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {string} opts.deviceId - 设备实例ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param device device\n      */\n\n  describeDevice (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeDevice\"\n      )\n    }\n    if (opts.deviceId === undefined || opts.deviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deviceId' when calling describeDevice\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc,\n      deviceId: opts.deviceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDevice with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/devices/{deviceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询公网IP列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20  optional\n      * @param {string} [opts.lineType] - 线路类型 dynamicBGP:动态BGP thirdLineBGP:三线BGP telecom:电信单线 unicom:联通单线 mobile:移动单线  optional\n      * @param {string} [opts.status] - 状态 normal:正常 abnormal:异常  optional\n      * @param {string} [opts.cidrAddr] - IP地址段  optional\n      * @param {filter} [opts.filters] - ipId - 公网IP实例ID，精确匹配，支持多个\n  optional\n      * @param {sort} [opts.sorts] - null  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ip ips\n      * @param integer pageNumber  页码\n      * @param integer pageSize  分页大小\n      * @param integer totalCount  总数量\n      */\n\n  describeIps (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeIps\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.lineType !== undefined && opts.lineType !== null) {\n      queryParams['lineType'] = opts.lineType\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.cidrAddr !== undefined && opts.cidrAddr !== null) {\n      queryParams['cidrAddr'] = opts.cidrAddr\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/ips',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询带宽（出口）列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20  optional\n      * @param {string} [opts.lineType] - 线路类型 dynamicBGP:动态BGP thirdLineBGP:三线BGP telecom:电信单线 unicom:联通单线 mobile:移动单线  optional\n      * @param {string} [opts.chargeType] - 计费方式 fixedBandwidth:固定带宽 95thPercentile:95峰值 merge95thPercentile:合并95峰值  optional\n      * @param {string} [opts.bandwidthName] - 带宽（出口）名称  optional\n      * @param {string} [opts.relatedIp] - 关联的公网IP  optional\n      * @param {filter} [opts.filters] - bandwidthId - 带宽实例ID，精确匹配，支持多个\n  optional\n      * @param {sort} [opts.sorts] - null  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeBandwidth bandwidths\n      * @param integer pageNumber  页码\n      * @param integer pageSize  分页大小\n      * @param integer totalCount  总数量\n      */\n\n  describeBandwidths (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeBandwidths\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.lineType !== undefined && opts.lineType !== null) {\n      queryParams['lineType'] = opts.lineType\n    }\n    if (opts.chargeType !== undefined && opts.chargeType !== null) {\n      queryParams['chargeType'] = opts.chargeType\n    }\n    if (opts.bandwidthName !== undefined && opts.bandwidthName !== null) {\n      queryParams['bandwidthName'] = opts.bandwidthName\n    }\n    if (opts.relatedIp !== undefined && opts.relatedIp !== null) {\n      queryParams['relatedIp'] = opts.relatedIp\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBandwidths with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/bandwidths',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询带宽（出口）详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {string} opts.bandwidthId - 带宽（出口）实例ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bandwidth bandwidth\n      */\n\n  describeBandwidth (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeBandwidth\"\n      )\n    }\n    if (opts.bandwidthId === undefined || opts.bandwidthId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthId' when calling describeBandwidth\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc,\n      bandwidthId: opts.bandwidthId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBandwidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/bandwidths/{bandwidthId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询机房资源概览\n      * @param {Object} opts - parameters\n      * @param {string} opts.idc - IDC机房ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cabinetOverview cabinet\n      * @param deviceOverview device\n      * @param ipOverview ip\n      * @param bandwidthOverview bandwidth\n      */\n\n  describeIdcOverview (opts, callback) {\n    opts = opts || {}\n\n    if (opts.idc === undefined || opts.idc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.idc' when calling describeIdcOverview\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      idc: opts.idc\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIdcOverview with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/idcs/{idc}/overview',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询工单列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20  optional\n      * @param {string} [opts.type] - 工单TAB类型 pendingProcess:待我处理 pendingReview:待审核 processing:处理中 all:全部(默认)  optional\n      * @param {string} [opts.ticketTypeName] - 工单类型  optional\n      * @param {string} [opts.status] - 工单状态 pendingReview:待审核 revoked:已撤销 processing:处理中 pendingVerification:待核验 pendingClose:待关单 rejected:已拒绝 completed:已完成 cancelled:已取消 draft:草稿中  optional\n      * @param {string} [opts.ticketNo] - 工单编号  optional\n      * @param {string} [opts.ticketTemplateName] - 工单名称  optional\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} [opts.startTime] - 创建开始时间，遵循ISO8601标准，使用UTC时间，格式为：yyyy-MM-ddTHH:mm:ssZ  optional\n      * @param {string} [opts.endTime] - 创建结束时间，遵循ISO8601标准，使用UTC时间，格式为：yyyy-MM-ddTHH:mm:ssZ  optional\n      * @param {filter} [opts.filters] - ticketNo - 工单编号，精确匹配，支持多个\n  optional\n      * @param {sort} [opts.sorts] - createdTime - 创建时间 closedTime - 关闭时间  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ticket tickets\n      * @param integer pageNumber  页码\n      * @param integer pageSize  分页大小\n      * @param integer totalCount  总数量\n      */\n\n  describeTickets (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n    if (opts.ticketTypeName !== undefined && opts.ticketTypeName !== null) {\n      queryParams['ticketTypeName'] = opts.ticketTypeName\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.ticketNo !== undefined && opts.ticketNo !== null) {\n      queryParams['ticketNo'] = opts.ticketNo\n    }\n    if (\n      opts.ticketTemplateName !== undefined &&\n      opts.ticketTemplateName !== null\n    ) {\n      queryParams['ticketTemplateName'] = opts.ticketTemplateName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      queryParams['description'] = opts.description\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTickets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/tickets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询工单详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.ticketNo - 工单编号\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ticket ticket  工单详情\n      */\n\n  describeTicket (opts, callback) {\n    opts = opts || {}\n\n    if (opts.ticketNo === undefined || opts.ticketNo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ticketNo' when calling describeTicket\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      ticketNo: opts.ticketNo\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTicket with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/tickets/{ticketNo}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  提交通用服务工单\n      * @param {Object} opts - parameters\n      * @param {string} [opts.phone] - 提单人手机号  optional\n      * @param {string} [opts.email] - 提单人邮箱  optional\n      * @param {string} [opts.idc] - idc机房实例id  optional\n      * @param {boolean} [opts.isExternalIdc] - 是否是商业化外部机房  optional\n      * @param {integer} [opts.count] - 数量  optional\n      * @param {string} [opts.externalIdcAddress] - 外部机房地址  optional\n      * @param {string} [opts.externalIdcContactPerson] - 外部机房联系人  optional\n      * @param {string} [opts.externalIdcContactPhone] - 外部机房联系电话  optional\n      * @param {string} [opts.remarks] - 描述  optional\n      * @param {array} [opts.attach] - 附件  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string ticketNo\n      */\n\n  createGeneralServicesTicket (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.phone !== undefined && opts.phone !== null) {\n      postBody['phone'] = opts.phone\n    }\n    if (opts.email !== undefined && opts.email !== null) {\n      postBody['email'] = opts.email\n    }\n    if (opts.idc !== undefined && opts.idc !== null) {\n      postBody['idc'] = opts.idc\n    }\n    if (opts.isExternalIdc !== undefined && opts.isExternalIdc !== null) {\n      postBody['isExternalIdc'] = opts.isExternalIdc\n    }\n    if (opts.count !== undefined && opts.count !== null) {\n      postBody['count'] = opts.count\n    }\n    if (\n      opts.externalIdcAddress !== undefined &&\n      opts.externalIdcAddress !== null\n    ) {\n      postBody['externalIdcAddress'] = opts.externalIdcAddress\n    }\n    if (\n      opts.externalIdcContactPerson !== undefined &&\n      opts.externalIdcContactPerson !== null\n    ) {\n      postBody['externalIdcContactPerson'] = opts.externalIdcContactPerson\n    }\n    if (\n      opts.externalIdcContactPhone !== undefined &&\n      opts.externalIdcContactPhone !== null\n    ) {\n      postBody['externalIdcContactPhone'] = opts.externalIdcContactPhone\n    }\n    if (opts.remarks !== undefined && opts.remarks !== null) {\n      postBody['remarks'] = opts.remarks\n    }\n    if (opts.attach !== undefined && opts.attach !== null) {\n      postBody['attach'] = opts.attach\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdccs/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createGeneralServicesTicket with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/generalServicesTicket',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCCS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/jdfusion/v1/jdfusion.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Vpc-VserverGroup\n * 与服务器组相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jdfusion'\nService._services[serviceId] = true\n\n/**\n * jdfusion service.\n * @version 0.3.0\n */\n\nJDCloud.JDFUSION = class JDFUSION extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'jdfusion.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  获取当前用户的云注册信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.driver] - 只获取对应driver的云信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cloudInfo clouds\n      */\n\n  getCloudInfos (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getCloudInfos\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.driver !== undefined && opts.driver !== null) {\n      queryParams['driver'] = opts.driver\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getCloudInfos with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/cloud_info',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为指定用户关联云\n      * @param {Object} opts - parameters\n      * @param {cloudInfo} opts.cloud\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cloudInfo cloud\n      */\n\n  registCloudInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  registCloudInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cloud === undefined || opts.cloud === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cloud' when calling registCloudInfo\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.cloud !== undefined && opts.cloud !== null) {\n      postBody['cloud'] = opts.cloud\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call registCloudInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/cloud_info',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取指定云信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.cloudId - 云信息ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cloudInfo cloud\n      */\n\n  getCloudInfoById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getCloudInfoById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cloudId === undefined || opts.cloudId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cloudId' when calling getCloudInfoById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cloudId: opts.cloudId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getCloudInfoById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/cloud_info/{cloudId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取指定云信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.cloudId - 云信息ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  unregistCloudInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  unregistCloudInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cloudId === undefined || opts.cloudId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cloudId' when calling unregistCloudInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cloudId: opts.cloudId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call unregistCloudInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/cloud_info/{cloudId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  验证指定云信息的AK、SK\n      * @param {Object} opts - parameters\n      * @param {string} opts.cloudId - 云信息ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  validCloudInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  validCloudInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cloudId === undefined || opts.cloudId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cloudId' when calling validCloudInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cloudId: opts.cloudId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call validCloudInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/cloud_info/{cloudId}/valid',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询部署信息列表\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deploymentInfo deployments\n      */\n\n  getDeployments (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDeployments\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDeployments with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建部署信息\n      * @param {Object} opts - parameters\n      * @param {deploymentInfo} opts.deployment - 创建deployment\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deploymentInfo deployment\n      */\n\n  createDeployment (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDeployment\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.deployment === undefined || opts.deployment === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deployment' when calling createDeployment\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deployment !== undefined && opts.deployment !== null) {\n      postBody['deployment'] = opts.deployment\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDeployment with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据已有资源反向生成deployment\n      * @param {Object} opts - parameters\n      * @param {reverseDeploymentInfo} opts.reverse - 根据已有资源反向生成deployment\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deploymentInfo deployment\n      */\n\n  reverseDeployment (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  reverseDeployment\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.reverse === undefined || opts.reverse === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.reverse' when calling reverseDeployment\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.reverse !== undefined && opts.reverse !== null) {\n      postBody['reverse'] = opts.reverse\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call reverseDeployment with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments:reverse',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询部署信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - Deployment ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deploymentInfo deployment\n      */\n\n  getDeploymentsById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDeploymentsById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getDeploymentsById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDeploymentsById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改部署信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - Deployment ID\n      * @param {deploymentInfo} opts.deployment - 修改deployment\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deploymentInfo deployment\n      */\n\n  editDeployment (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  editDeployment\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling editDeployment\"\n      )\n    }\n    if (opts.deployment === undefined || opts.deployment === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deployment' when calling editDeployment\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deployment !== undefined && opts.deployment !== null) {\n      postBody['deployment'] = opts.deployment\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call editDeployment with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments/{id}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除部署信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - Deployment ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDeployment (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDeployment\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteDeployment\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDeployment with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  克隆部署信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - Deployment ID\n      * @param {deployment} opts.deployment - 创建deployment\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deploymentInfo deployment\n      */\n\n  cloneDeployment (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  cloneDeployment\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling cloneDeployment\"\n      )\n    }\n    if (opts.deployment === undefined || opts.deployment === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.deployment' when calling cloneDeployment\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.deployment !== undefined && opts.deployment !== null) {\n      postBody['deployment'] = opts.deployment\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cloneDeployment with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments/{id}:clone',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  预部署\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - Deployment ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  dryrunDeployment (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  dryrunDeployment\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling dryrunDeployment\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call dryrunDeployment with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments/{id}:dryrun',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  应用部署\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - Deployment ID\n      * @param {apply} opts.apply - 应用部署\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deploymentInfo deployment\n      */\n\n  applyDeployment (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  applyDeployment\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling applyDeployment\"\n      )\n    }\n    if (opts.apply === undefined || opts.apply === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.apply' when calling applyDeployment\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.apply !== undefined && opts.apply !== null) {\n      postBody['apply'] = opts.apply\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call applyDeployment with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments/{id}:apply',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询执行结果\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - deployment ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param taskInfo task\n      */\n\n  getDeploymentResult (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDeploymentResult\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getDeploymentResult\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDeploymentResult with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments/{id}/result',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询应用记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - Deployment ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deploymentApplyInfo versions\n      */\n\n  getDeploymentVersions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDeploymentVersions\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getDeploymentVersions\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDeploymentVersions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments/{id}/versions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询应用记录详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - deployment ID\n      * @param {string} opts.version_id - application ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deploymentInfo deployment\n      */\n\n  getDeploymentsVersion (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDeploymentsVersion\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getDeploymentsVersion\"\n      )\n    }\n    if (opts.version_id === undefined || opts.version_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.version_id' when calling getDeploymentsVersion\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id,\n      version_id: opts.version_id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDeploymentsVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments/{id}/versions/{version_id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  应用部署回滚\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - deployment ID\n      * @param {string} opts.version_id - application ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deploymentInfo deployment\n      */\n\n  rollbackDeploymentsVersion (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  rollbackDeploymentsVersion\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling rollbackDeploymentsVersion\"\n      )\n    }\n    if (opts.version_id === undefined || opts.version_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.version_id' when calling rollbackDeploymentsVersion\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id,\n      version_id: opts.version_id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call rollbackDeploymentsVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments/{id}/versions/{version_id}:rollback',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询某一次的历史执行结果（内部使用）\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - deployment ID\n      * @param {string} opts.record - deployment ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param taskInfo task\n      */\n\n  getDeploymentsResultsByIdRecord (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDeploymentsResultsByIdRecord\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getDeploymentsResultsByIdRecord\"\n      )\n    }\n    if (opts.record === undefined || opts.record === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.record' when calling getDeploymentsResultsByIdRecord\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id,\n      record: opts.record\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDeploymentsResultsByIdRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/deployments/{id}/results/{record}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的云硬盘资源信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.vmId] - 云主机id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cloudDataDisk disks\n      */\n\n  getDisks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDisks\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.vmId !== undefined && opts.vmId !== null) {\n      queryParams['vmId'] = opts.vmId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDisks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/disk_disks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商创建云硬盘\n      * @param {Object} opts - parameters\n      * @param {createDataDisk} opts.disk - 创建云硬盘\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createDisk (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDisk\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.disk === undefined || opts.disk === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.disk' when calling createDisk\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.disk !== undefined && opts.disk !== null) {\n      postBody['disk'] = opts.disk\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDisk with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/disk_disks',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的云硬盘资源信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 云硬盘 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cloudDataDisk disk\n      */\n\n  getDiskById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDiskById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getDiskById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDiskById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/disk_disks/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除云硬盘\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 云硬盘 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removeDiskById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  removeDiskById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling removeDiskById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeDiskById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/disk_disks/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  云硬盘挂载至虚拟机\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 云硬盘 ID\n      * @param {attachDataDisk} opts.attach - 云硬盘挂载至虚拟机\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  attachDiskToVmInstanceByDiskId (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  attachDiskToVmInstanceByDiskId\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling attachDiskToVmInstanceByDiskId\"\n      )\n    }\n    if (opts.attach === undefined || opts.attach === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.attach' when calling attachDiskToVmInstanceByDiskId\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.attach !== undefined && opts.attach !== null) {\n      postBody['attach'] = opts.attach\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call attachDiskToVmInstanceByDiskId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/disk_disks/{id}:attach',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  从虚拟机卸载云硬盘\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 云硬盘 ID\n      * @param {detachDataDisk} opts.detach - 从虚拟机卸载云硬盘\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  detachDiskToVmInstanceByDiskId (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  detachDiskToVmInstanceByDiskId\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling detachDiskToVmInstanceByDiskId\"\n      )\n    }\n    if (opts.detach === undefined || opts.detach === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.detach' when calling detachDiskToVmInstanceByDiskId\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.detach !== undefined && opts.detach !== null) {\n      postBody['detach'] = opts.detach\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call detachDiskToVmInstanceByDiskId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/disk_disks/{id}:detach',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的OSS存储桶列表\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ossBucketInfo buckets\n      */\n\n  getBuckets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getBuckets\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getBuckets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_buckets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据给定的信息，创建OSS存储桶\n      * @param {Object} opts - parameters\n      * @param {createOSSBucket} opts.bucket - 创建OSS存储桶\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createBucket (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBucket\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucket === undefined || opts.bucket === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucket' when calling createBucket\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.bucket !== undefined && opts.bucket !== null) {\n      postBody['bucket'] = opts.bucket\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBucket with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_buckets',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的OSS存储桶信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - OSS存储桶名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ossBucketDetailInfo bucket\n      */\n\n  getBucketByName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getBucketByName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling getBucketByName\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getBucketByName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_buckets/{name}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定ID的OSS存储桶信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - OSS存储桶名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteBucket (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBucket\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling deleteBucket\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBucket with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_buckets/{name}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据过滤条件，取得指定OSS存储桶上的文件列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - OSS存储桶名称\n      * @param {string} [opts.marker] - 本次查询的起点（文件key值）  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean isTruncated  是否已被截断（表示没有更多数据了）\n      * @param string marker  本次查询的起点（文件key值）\n      * @param ossFileInfo files\n      */\n\n  getBucketFiles (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getBucketFiles\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling getBucketFiles\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.marker !== undefined && opts.marker !== null) {\n      queryParams['marker'] = opts.marker\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getBucketFiles with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_buckets/{name}/files',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取任务列表\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transferTaskInfoWithID tasks\n      */\n\n  getTransferTasks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTransferTasks\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTransferTasks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_transferTasks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建任务\n      * @param {Object} opts - parameters\n      * @param {transferSimpleTaskInfo} [opts.task]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transferTaskInfoWithID task\n      */\n\n  createTransferTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createTransferTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.task !== undefined && opts.task !== null) {\n      postBody['task'] = opts.task\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createTransferTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_transferTasks_simple',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据指定ID获取任务信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 用户ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transferTaskInfoWithID task\n      */\n\n  getTransferTaskById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTransferTaskById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getTransferTaskById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTransferTaskById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_transferTasks/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据指定ID修改任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 任务ID\n      * @param {transferTaskInfo} [opts.task]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  editTransferTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  editTransferTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling editTransferTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.task !== undefined && opts.task !== null) {\n      postBody['task'] = opts.task\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call editTransferTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_transferTasks/{id}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据指定ID删除任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteTransferTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteTransferTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteTransferTask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTransferTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_transferTasks/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据指定ID启动任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 用户ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startTransferTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startTransferTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling startTransferTask\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startTransferTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_transferTasks/{id}:start',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据指定ID停止任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 用户ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopTransferTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopTransferTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling stopTransferTask\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopTransferTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_transferTasks/{id}:stop',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据指定任务id查询迁移进度\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transferTaskProgressInfo task\n      */\n\n  getTransferTaskProgress (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTransferTaskProgress\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getTransferTaskProgress\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTransferTaskProgress with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_transferTasks/{id}/progress',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据指定任务id查询迁移失败文件列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transferTaskFailedDetailInfo task\n      */\n\n  getTransferTaskFailedFiles (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTransferTaskFailedFiles\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getTransferTaskFailedFiles\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTransferTaskFailedFiles with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/oss_transferTasks/{id}/failed-files',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据过滤条件，取得指定RDS实例上的账号信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instId - RDS实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rdsAccountInfo accounts\n      */\n\n  getRdsAccountsByInstId (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRdsAccountsByInstId\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling getRdsAccountsByInstId\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instId: opts.instId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRdsAccountsByInstId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances/{instId}/accounts',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据给定的信息，创建指定RDS实例的账户\n      * @param {Object} opts - parameters\n      * @param {string} opts.instId - RDS实例ID\n      * @param {createRDSAccount} opts.account - 创建RDS实例的账号信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createRdsAccounts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createRdsAccounts\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling createRdsAccounts\"\n      )\n    }\n    if (opts.account === undefined || opts.account === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.account' when calling createRdsAccounts\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.account !== undefined && opts.account !== null) {\n      postBody['account'] = opts.account\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instId: opts.instId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRdsAccounts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances/{instId}/accounts',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  取得指定RDS实例上的指定账号信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instId - RDS实例ID\n      * @param {string} opts.accountName - 账号名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rdsAccountInfo account\n      */\n\n  getRdsAccountsByInstIdAndAccountName (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRdsAccountsByInstIdAndAccountName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling getRdsAccountsByInstIdAndAccountName\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling getRdsAccountsByInstIdAndAccountName\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instId: opts.instId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRdsAccountsByInstIdAndAccountName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances/{instId}/accounts/{accountName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定RDS实例上，指定用户名的账号信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instId - RDS实例ID\n      * @param {string} opts.accountName - 账号用户名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRdsAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRdsAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling deleteRdsAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling deleteRdsAccount\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instId: opts.instId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRdsAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances/{instId}/accounts/{accountName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  给RDS账号分配数据库权限\n      * @param {Object} opts - parameters\n      * @param {string} opts.instId - RDS实例ID\n      * @param {string} opts.accountName - 账号名称\n      * @param {dbPrivilegeInfo} opts.dbPrivilegeInfo - RDS账号对数据库的权限信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  grantRdsAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  grantRdsAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling grantRdsAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling grantRdsAccount\"\n      )\n    }\n    if (opts.dbPrivilegeInfo === undefined || opts.dbPrivilegeInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbPrivilegeInfo' when calling grantRdsAccount\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dbPrivilegeInfo !== undefined && opts.dbPrivilegeInfo !== null) {\n      postBody['dbPrivilegeInfo'] = opts.dbPrivilegeInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instId: opts.instId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call grantRdsAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances/{instId}/accounts/{accountName}:grant',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  撤销RDS账号在指定数据库的所有权限\n      * @param {Object} opts - parameters\n      * @param {string} opts.instId - RDS实例ID\n      * @param {string} opts.accountName - 账号名称\n      * @param {string} opts.dbName - 数据库名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  revokeRdsAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  revokeRdsAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling revokeRdsAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling revokeRdsAccount\"\n      )\n    }\n    if (opts.dbName === undefined || opts.dbName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbName' when calling revokeRdsAccount\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instId: opts.instId,\n      accountName: opts.accountName,\n      dbName: opts.dbName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call revokeRdsAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances/{instId}/accounts/{accountName}/databases/{dbName}:revoke',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  通过异步任务，给RDS账号分配数据库权限\n      * @param {Object} opts - parameters\n      * @param {string} opts.instId - RDS实例ID\n      * @param {string} opts.accountName - 账号名称\n      * @param {dbPrivilegeInfo} opts.info - RDS账号对数据库的权限信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo cloud\n      */\n\n  grantRdsAccountsByTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  grantRdsAccountsByTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling grantRdsAccountsByTask\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling grantRdsAccountsByTask\"\n      )\n    }\n    if (opts.info === undefined || opts.info === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.info' when calling grantRdsAccountsByTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.info !== undefined && opts.info !== null) {\n      postBody['info'] = opts.info\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instId: opts.instId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call grantRdsAccountsByTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances/{instId}/accounts/{accountName}:grantByTask',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据过滤条件，取得指定RDS实例上的数据库信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instId - RDS实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rdsDBInfo dbs\n      */\n\n  getRdsDatabasesByInstId (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRdsDatabasesByInstId\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling getRdsDatabasesByInstId\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instId: opts.instId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRdsDatabasesByInstId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances/{instId}/databases',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据给定的信息，创建指定RDS实例的数据库\n      * @param {Object} opts - parameters\n      * @param {string} opts.instId - RDS实例ID\n      * @param {createRDSDB} opts.database - 创建RDS实例的数据库信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createRdsDatabase (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createRdsDatabase\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling createRdsDatabase\"\n      )\n    }\n    if (opts.database === undefined || opts.database === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.database' when calling createRdsDatabase\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.database !== undefined && opts.database !== null) {\n      postBody['database'] = opts.database\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instId: opts.instId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRdsDatabase with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances/{instId}/databases',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据过滤条件，取得指定RDS实例上的数据库信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instId - RDS实例ID\n      * @param {string} opts.dbName - 数据库名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rdsDBInfo db\n      */\n\n  getRdsDatabaseByInstIdAndDbName (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRdsDatabaseByInstIdAndDbName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling getRdsDatabaseByInstIdAndDbName\"\n      )\n    }\n    if (opts.dbName === undefined || opts.dbName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbName' when calling getRdsDatabaseByInstIdAndDbName\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instId: opts.instId,\n      dbName: opts.dbName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRdsDatabaseByInstIdAndDbName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances/{instId}/databases/{dbName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定RDS实例上，指定数据库名的数据库信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instId - RDS实例ID\n      * @param {string} opts.dbName - 数据库名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRdsDatabase (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRdsDatabase\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling deleteRdsDatabase\"\n      )\n    }\n    if (opts.dbName === undefined || opts.dbName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbName' when calling deleteRdsDatabase\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instId: opts.instId,\n      dbName: opts.dbName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRdsDatabase with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances/{instId}/databases/{dbName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的RDS实例信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rdsInstanceDetailInfo instances\n      */\n\n  getRdsInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRdsInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRdsInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据给定的信息，创建RDS实例\n      * @param {Object} opts - parameters\n      * @param {createRDSInstance} opts.instance - 创建RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createRdsInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createRdsInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instance === undefined || opts.instance === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instance' when calling createRdsInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instance !== undefined && opts.instance !== null) {\n      postBody['instance'] = opts.instance\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRdsInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定ID的RDS实例信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instId - RDS实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rdsInstanceDetailInfo instance\n      */\n\n  getRdsByInstId (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRdsByInstId\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling getRdsByInstId\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instId: opts.instId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRdsByInstId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances/{instId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定ID的RDS实例信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instId - RDS实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRdsByInstId (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRdsByInstId\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instId === undefined || opts.instId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instId' when calling deleteRdsByInstId\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instId: opts.instId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRdsByInstId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_instances/{instId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询数据同步通道信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param channelInfo channels\n      */\n\n  getChannels (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getChannels\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getChannels with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/migration_mysqlChannels',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建数据同步通道\n      * @param {Object} opts - parameters\n      * @param {channelInfo} opts.channel - 创建channel\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param channelInfo channel\n      */\n\n  createChannel (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createChannel\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.channel === undefined || opts.channel === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.channel' when calling createChannel\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.channel !== undefined && opts.channel !== null) {\n      postBody['channel'] = opts.channel\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createChannel with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/migration_mysqlChannels',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除channel\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - channel ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteChannel (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteChannel\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteChannel\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteChannel with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/migration_mysqlChannels/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动数据同步\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - channel ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startChannel (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startChannel\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling startChannel\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startChannel with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/migration_mysqlChannels/{id}:start',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止数据同步\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - channel ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopChannel (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopChannel\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling stopChannel\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopChannel with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/migration_mysqlChannels/{id}:stop',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询数据源\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param datasourceInfo datasources\n      */\n\n  getDatasources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDatasources\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDatasources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/migration_mysqlDatasources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建数据源\n      * @param {Object} opts - parameters\n      * @param {datasourceInfo} opts.datasource - 创建数据源\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param datasourceInfo datasource\n      */\n\n  createDatasource (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDatasource\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.datasource === undefined || opts.datasource === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.datasource' when calling createDatasource\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.datasource !== undefined && opts.datasource !== null) {\n      postBody['datasource'] = opts.datasource\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDatasource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/migration_mysqlDatasources',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除数据源\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - channel ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDatasource (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDatasource\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteDatasource\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDatasource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/migration_mysqlDatasources/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据数据库类型，取得RDS实例的规格\n      * @param {Object} opts - parameters\n      * @param {string} opts.engine - RDS数据库引擎，目前只支持mysql\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rdsSpecification specifications\n      */\n\n  getRdsSpecification (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRdsSpecification\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.engine === undefined || opts.engine === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.engine' when calling getRdsSpecification\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      engine: opts.engine\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRdsSpecification with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/rds_specification/{engine}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询地域列表信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param regionInfo regions\n      */\n\n  getRegions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRegions\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRegions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/regions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可用域列表信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.region - 区域id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param azInfo azs\n      */\n\n  getRegionsAvailableZones (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRegionsAvailableZones\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.region === undefined || opts.region === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.region' when calling getRegionsAvailableZones\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      region: opts.region\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRegionsAvailableZones with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/regions_availableZones/{region}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  读取指定ID的运行结果和运行状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.task - 执行请求 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param taskInfo tasks\n      */\n\n  getTaskInfoHistoryById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTaskInfoHistoryById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.task === undefined || opts.task === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.task' when calling getTaskInfoHistoryById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      task: opts.task\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTaskInfoHistoryById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/task_infos/{task}/history',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  读取指定ID的运行结果和运行状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.task - 执行请求 ID\n      * @param {string} [opts.fileName] - 执行文件名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param taskInfo task\n      */\n\n  getTaskInfoById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTaskInfoById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.task === undefined || opts.task === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.task' when calling getTaskInfoById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.fileName !== undefined && opts.fileName !== null) {\n      queryParams['fileName'] = opts.fileName\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      task: opts.task\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTaskInfoById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/task_infos/{task}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据过滤条件，取得镜像资源的信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.imageSource] - 镜像来源： system：系统官方公共镜像。 self：用户自定义镜像。 others：用户共享的镜像。 marketplace：镜像市场云市场 提供的镜像。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageInfo images\n      */\n\n  getVmImages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVmImages\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.imageSource !== undefined && opts.imageSource !== null) {\n      queryParams['imageSource'] = opts.imageSource\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVmImages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vm_images',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的VM资源信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 资源实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vmInfoDetail vm\n      */\n\n  getVmInstancesById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVmInstancesById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getVmInstancesById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVmInstancesById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vm_instances/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  通过虚拟机id删除虚拟机\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 资源实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVmInstanceById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVmInstanceById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteVmInstanceById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVmInstanceById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vm_instances/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的虚拟机资源信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vmInfo vms\n      */\n\n  getVmInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVmInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVmInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vm_instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商创建虚拟机\n      * @param {Object} opts - parameters\n      * @param {createVm} opts.vm - 创建VM\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createVmInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVmInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vm === undefined || opts.vm === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vm' when calling createVmInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vm !== undefined && opts.vm !== null) {\n      postBody['vm'] = opts.vm\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVmInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vm_instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止运行一台实例。只有状态为 运行中（Running）的实例才可以进行此操作。\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 资源实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopVmInstanceById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopVmInstanceById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling stopVmInstanceById\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopVmInstanceById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vm_instances/{id}:stop',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动一台实例。实例状态必须为 已停止（Stopped），才可以调用该接口。\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 资源实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startVmInstanceById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startVmInstanceById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling startVmInstanceById\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startVmInstanceById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vm_instances/{id}:start',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  只能重启状态为 运行中（Running）的实例。\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 资源实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  rebootVmInstanceById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  rebootVmInstanceById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling rebootVmInstanceById\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call rebootVmInstanceById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vm_instances/{id}:reboot',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  虚拟机规格列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.az] - 可用区  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceTypeInfo instanceTypes\n      */\n\n  getVmInstanceTypes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVmInstanceTypes\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.az !== undefined && opts.az !== null) {\n      queryParams['az'] = opts.az\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVmInstanceTypes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vm_instanceTypes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的密钥对资源信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - keypair name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param keypairInfo keypair\n      */\n\n  getVmKeypairsByName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVmKeypairsByName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling getVmKeypairsByName\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVmKeypairsByName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vm_keypairs/{name}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除密钥对\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - keypair name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVmKeypairByName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVmKeypairByName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling deleteVmKeypairByName\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVmKeypairByName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vm_keypairs/{name}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的密钥对资源信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param keypairInfo keypairs\n      */\n\n  getVmKeypairs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVmKeypairs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVmKeypairs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vm_keypairs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商创建密钥对\n      * @param {Object} opts - parameters\n      * @param {createKeypair} opts.keypair - 创建keypair\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo tasks\n      */\n\n  createVmKeypair (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVmKeypair\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keypair === undefined || opts.keypair === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keypair' when calling createVmKeypair\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.keypair !== undefined && opts.keypair !== null) {\n      postBody['keypair'] = opts.keypair\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVmKeypair with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vm_keypairs',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的公网IP资源信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param eipAddress eipAddresses\n      */\n\n  getVpcEips (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVpcEips\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVpcEips with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_eips',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商分配公网IP\n      * @param {Object} opts - parameters\n      * @param {allocateEipAddress} opts.allocate - 分配弹性公网ip\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createVpcEip (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVpcEip\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.allocate === undefined || opts.allocate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.allocate' when calling createVpcEip\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.allocate !== undefined && opts.allocate !== null) {\n      postBody['allocate'] = opts.allocate\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVpcEip with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_eips',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的公网IP资源信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 公网IP ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param eipAddress eipAddress\n      */\n\n  getVpcEipById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVpcEipById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getVpcEipById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVpcEipById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_eips/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  释放公网IP\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 公网IP ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVpcEipById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVpcEipById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteVpcEipById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVpcEipById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_eips/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  弹性公网IP绑定到虚拟机\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 公网IP ID\n      * @param {associateEipAddress} opts.associate - 弹性公网IP绑定到虚拟机\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  associateVpcEipById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateVpcEipById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling associateVpcEipById\"\n      )\n    }\n    if (opts.associate === undefined || opts.associate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.associate' when calling associateVpcEipById\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.associate !== undefined && opts.associate !== null) {\n      postBody['associate'] = opts.associate\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateVpcEipById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_eips/{id}:associate',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  解绑公网IP\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 公网IP ID\n      * @param {unassociateEipAddress} opts.unassociate - 解绑公网IP\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disassociateVpcEipById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateVpcEipById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling disassociateVpcEipById\"\n      )\n    }\n    if (opts.unassociate === undefined || opts.unassociate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.unassociate' when calling disassociateVpcEipById\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.unassociate !== undefined && opts.unassociate !== null) {\n      postBody['unassociate'] = opts.unassociate\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateVpcEipById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_eips/{id}:disassociate',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据过滤条件，查监听器列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.slbid] - 负载均衡id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param lbHttpListener httpListeners\n      */\n\n  getLbHttpListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getLbHttpListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.slbid !== undefined && opts.slbid !== null) {\n      queryParams['slbid'] = opts.slbid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getLbHttpListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_lbHttpListener',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建HTTP监听器\n      * @param {Object} opts - parameters\n      * @param {createLoadBalancerHTTPListener} opts.httpListener - 创建HTTP监听器\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createVpcLBHttpListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVpcLBHttpListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.httpListener === undefined || opts.httpListener === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.httpListener' when calling createVpcLBHttpListener\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.httpListener !== undefined && opts.httpListener !== null) {\n      postBody['httpListener'] = opts.httpListener\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVpcLBHttpListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_lbHttpListener',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的网卡资源信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 网卡 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param netInterfaceInfo netInterface\n      */\n\n  getVpcNetworkInterfaceById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVpcNetworkInterfaceById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getVpcNetworkInterfaceById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVpcNetworkInterfaceById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_networkInterfaces/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除弹性网卡\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 网卡 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVpcNetworkInterfaceById (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVpcNetworkInterfaceById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteVpcNetworkInterfaceById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVpcNetworkInterfaceById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_networkInterfaces/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的网卡资源信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.vmId] - 云主机id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param netInterfaceInfo netInterfaces\n      */\n\n  getVpcNetworkInterfaces (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVpcNetworkInterfaces\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.vmId !== undefined && opts.vmId !== null) {\n      queryParams['vmId'] = opts.vmId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVpcNetworkInterfaces with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_networkInterfaces',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商创建网卡\n      * @param {Object} opts - parameters\n      * @param {createNetInterface} opts.netInterface - 创建网卡\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createVpcNetworkInterface (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVpcNetworkInterface\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.netInterface === undefined || opts.netInterface === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.netInterface' when calling createVpcNetworkInterface\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.netInterface !== undefined && opts.netInterface !== null) {\n      postBody['netInterface'] = opts.netInterface\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVpcNetworkInterface with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_networkInterfaces',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  网卡挂载虚拟机\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 网卡 ID\n      * @param {attachNetInterface} opts.attach - 网卡挂载虚拟机\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  attachVpcNetworkInterfaceById (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  attachVpcNetworkInterfaceById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling attachVpcNetworkInterfaceById\"\n      )\n    }\n    if (opts.attach === undefined || opts.attach === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.attach' when calling attachVpcNetworkInterfaceById\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.attach !== undefined && opts.attach !== null) {\n      postBody['attach'] = opts.attach\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call attachVpcNetworkInterfaceById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_networkInterfaces/{id}:attach',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  卸载网卡\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 网卡 ID\n      * @param {detachNetInterface} opts.detach - 卸载网卡\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  detachVpcNetworkInterfaceById (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  detachVpcNetworkInterfaceById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling detachVpcNetworkInterfaceById\"\n      )\n    }\n    if (opts.detach === undefined || opts.detach === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.detach' when calling detachVpcNetworkInterfaceById\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.detach !== undefined && opts.detach !== null) {\n      postBody['detach'] = opts.detach\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call detachVpcNetworkInterfaceById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_networkInterfaces/{id}:detach',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定的安全组资源信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - SecurityGroup ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param securityGroupDetail securityGroup\n      */\n\n  getVpcSecurityGroupById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVpcSecurityGroupById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getVpcSecurityGroupById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVpcSecurityGroupById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_securityGroups/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除安全组\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - SecurityGroup ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVpcSecurityGroupById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVpcSecurityGroupById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteVpcSecurityGroupById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVpcSecurityGroupById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_securityGroups/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的安全组资源信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param securityGroupInfo securityGroups\n      */\n\n  getVpcSecurityGroups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVpcSecurityGroups\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVpcSecurityGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_securityGroups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商创建安全组\n      * @param {Object} opts - parameters\n      * @param {createSecurityGroup} opts.securityGroup - 创建securityGroup\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createVpcSecurityGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVpcSecurityGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.securityGroup === undefined || opts.securityGroup === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.securityGroup' when calling createVpcSecurityGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.securityGroup !== undefined && opts.securityGroup !== null) {\n      postBody['securityGroup'] = opts.securityGroup\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVpcSecurityGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_securityGroups',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新增安全组规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 安全组ID\n      * @param {createSgRule} opts.sgRule - 新增安全组规则\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createSecurityGroupsRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSecurityGroupsRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling createSecurityGroupsRule\"\n      )\n    }\n    if (opts.sgRule === undefined || opts.sgRule === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sgRule' when calling createSecurityGroupsRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sgRule !== undefined && opts.sgRule !== null) {\n      postBody['sgRule'] = opts.sgRule\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSecurityGroupsRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_securityGroups/{id}/rule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除安全组规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 安全组ID\n      * @param {string} opts.ruleType - 规则类型，ingress、egress\n      * @param {string} opts.protocol - 协议，tcp、udp、icmp 或者 all\n      * @param {string} opts.fromPort - 起始端口\n      * @param {string} opts.toPort - 终止端口\n      * @param {string} [opts.nicType] - 网络类型，internet、intranet  optional\n      * @param {string} [opts.policy] - 认证策略，accept、drop  optional\n      * @param {string} [opts.priority] - 认证策略的权重，1-100  optional\n      * @param {string} [opts.cidrIp] - 目标IP地址范围  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSecurityGroupsRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSecurityGroupsRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteSecurityGroupsRule\"\n      )\n    }\n    if (opts.ruleType === undefined || opts.ruleType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleType' when calling deleteSecurityGroupsRule\"\n      )\n    }\n    if (opts.protocol === undefined || opts.protocol === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.protocol' when calling deleteSecurityGroupsRule\"\n      )\n    }\n    if (opts.fromPort === undefined || opts.fromPort === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fromPort' when calling deleteSecurityGroupsRule\"\n      )\n    }\n    if (opts.toPort === undefined || opts.toPort === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.toPort' when calling deleteSecurityGroupsRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      queryParams['ruleType'] = opts.ruleType\n    }\n    if (opts.protocol !== undefined && opts.protocol !== null) {\n      queryParams['protocol'] = opts.protocol\n    }\n    if (opts.fromPort !== undefined && opts.fromPort !== null) {\n      queryParams['fromPort'] = opts.fromPort\n    }\n    if (opts.toPort !== undefined && opts.toPort !== null) {\n      queryParams['toPort'] = opts.toPort\n    }\n    if (opts.nicType !== undefined && opts.nicType !== null) {\n      queryParams['nicType'] = opts.nicType\n    }\n    if (opts.policy !== undefined && opts.policy !== null) {\n      queryParams['policy'] = opts.policy\n    }\n    if (opts.priority !== undefined && opts.priority !== null) {\n      queryParams['priority'] = opts.priority\n    }\n    if (opts.cidrIp !== undefined && opts.cidrIp !== null) {\n      queryParams['cidrIp'] = opts.cidrIp\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSecurityGroupsRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_securityGroups/{id}/rule',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的SLB资源信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - LB ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param slbInfoDetail slb\n      */\n\n  getVpcSlbById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVpcSlbById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getVpcSlbById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVpcSlbById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_slbs/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除SLB\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - LB ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVpcSlbById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVpcSlbById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteVpcSlbById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVpcSlbById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_slbs/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的负载均衡资源信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param slbInfo slbs\n      */\n\n  getVpcSlbs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVpcSlbs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVpcSlbs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_slbs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商创建负载均衡\n      * @param {Object} opts - parameters\n      * @param {slbInfo} opts.slb - 创建SLB\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createVpcSlb (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVpcSlb\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.slb === undefined || opts.slb === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.slb' when calling createVpcSlb\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.slb !== undefined && opts.slb !== null) {\n      postBody['slb'] = opts.slb\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVpcSlb with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_slbs',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动负载均衡\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - LB ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startSlb (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startSlb\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling startSlb\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startSlb with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_slbs/{id}:start',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止负载均衡\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - LB ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopSlb (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopSlb\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling stopSlb\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopSlb with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_slbs/{id}:stop',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除监听器\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 负载均衡id\n      * @param {integer} opts.listenerPort - 监听器端口\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSlbsListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSlbsListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteSlbsListener\"\n      )\n    }\n    if (opts.listenerPort === undefined || opts.listenerPort === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerPort' when calling deleteSlbsListener\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.listenerPort !== undefined && opts.listenerPort !== null) {\n      queryParams['listenerPort'] = opts.listenerPort\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSlbsListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_slbs_listener/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动监听器\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 负载均衡id\n      * @param {integer} opts.listenerPort - 监听器端口\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startSlbListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startSlbListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling startSlbListener\"\n      )\n    }\n    if (opts.listenerPort === undefined || opts.listenerPort === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerPort' when calling startSlbListener\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.listenerPort !== undefined && opts.listenerPort !== null) {\n      postBody['listenerPort'] = opts.listenerPort\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startSlbListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_slbs_listener/{id}:start',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止监听器\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 负载均衡id\n      * @param {integer} opts.listenerPort - 监听器端口\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopSlbListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopSlbListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling stopSlbListener\"\n      )\n    }\n    if (opts.listenerPort === undefined || opts.listenerPort === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerPort' when calling stopSlbListener\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.listenerPort !== undefined && opts.listenerPort !== null) {\n      postBody['listenerPort'] = opts.listenerPort\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopSlbListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_slbs_listener/{id}:stop',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的subnet资源信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - VPC ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subnetDesInfo subnet\n      */\n\n  getVpcSubnetById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVpcSubnetById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getVpcSubnetById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVpcSubnetById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_subnets/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除子网\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - VPC ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVpcSubnetById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVpcSubnetById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteVpcSubnetById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVpcSubnetById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_subnets/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的subnet资源信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subnetDesInfo subnets\n      */\n\n  getVpcSubnets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVpcSubnets\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVpcSubnets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_subnets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商创建子网\n      * @param {Object} opts - parameters\n      * @param {createSubnet} opts.subnet - 创建subnet\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createVpcSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVpcSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnet === undefined || opts.subnet === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnet' when calling createVpcSubnet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subnet !== undefined && opts.subnet !== null) {\n      postBody['subnet'] = opts.subnet\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVpcSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_subnets',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商查询对应的VPC资源信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - VPC ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpcInfoDetail vpc\n      */\n\n  getVpcById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVpcById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getVpcById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVpcById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_vpcs/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除VPC\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - VPC ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVpcById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVpcById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteVpcById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVpcById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_vpcs/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询私有网络资源列表\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpcListInfo vpcs\n      */\n\n  getVpcs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVpcs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVpcs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_vpcs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据云提供商创建私有网络\n      * @param {Object} opts - parameters\n      * @param {vpcInfo} opts.vpc - 创建VPC\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpc === undefined || opts.vpc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpc' when calling createVpc\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vpc !== undefined && opts.vpc !== null) {\n      postBody['vpc'] = opts.vpc\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_vpcs',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据过滤条件，取得服务器组的信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.slbid] - 负载均衡id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vserverGroupInfo vserverGroups\n      */\n\n  getVpcVServerGroups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVpcVServerGroups\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.slbid !== undefined && opts.slbid !== null) {\n      queryParams['slbid'] = opts.slbid\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVpcVServerGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_vserverGroups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建虚拟服务器组，并添加后端服务器\n      * @param {Object} opts - parameters\n      * @param {createVserverGroup} opts.vserverGroup - 创建虚拟服务器组\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceTFInfo task\n      */\n\n  createVpcVServerGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVpcVServerGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vserverGroup === undefined || opts.vserverGroup === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vserverGroup' when calling createVpcVServerGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vserverGroup !== undefined && opts.vserverGroup !== null) {\n      postBody['vserverGroup'] = opts.vserverGroup\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVpcVServerGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_vserverGroups',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据过滤条件，取得服务器组的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 服务器组ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vserverGroupDetail vserverGroup\n      */\n\n  getVserverGroupsById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getVserverGroupsById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getVserverGroupsById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVserverGroupsById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_vserverGroups/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除服务器组\n      * @param {Object} opts - parameters\n      * @param {string} opts.id - 服务器组ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVserverGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVserverGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteVserverGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdfusion/0.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVserverGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/vpc_vserverGroups/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.JDFUSION\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/jdro/v1/jdro.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Template\n * Interface of Template\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jdro'\nService._services[serviceId] = true\n\n/**\n * jdro service.\n * @version 0.0.4\n */\n\nJDCloud.JDRO = class JDRO extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'jdro.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询支持的资源列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 当前所在页，默认为1  optional\n      * @param {integer} [opts.pageSize] - 页面大小，默认为20；取值范围[1, 100]  optional\n      * @param {string} [opts.product] - 产品线类型，比如 VM  optional\n      * @param {string} [opts.search] - 搜索的内容  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeResourceTypeListItem resourceTypeList\n      * @param integer totalCount\n      */\n\n  describeResourceTypeList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeResourceTypeList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.product !== undefined && opts.product !== null) {\n      queryParams['product'] = opts.product\n    }\n    if (opts.search !== undefined && opts.search !== null) {\n      queryParams['search'] = opts.search\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdro/0.0.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeResourceTypeList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/resourcetypes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询支持的资源结构详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.resourceType - 资源类型\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object propertyTypes\n      * @param resourceTypes resourceTypes\n      */\n\n  describeResourceTypeSpecification (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeResourceTypeSpecification\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.resourceType === undefined || opts.resourceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceType' when calling describeResourceTypeSpecification\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      resourceType: opts.resourceType\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdro/0.0.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeResourceTypeSpecification with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/resourcetypes/{resourceType}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询资源栈列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 当前所在页，默认为1  optional\n      * @param {integer} [opts.pageSize] - 页面大小，默认为20；取值范围[1, 100]  optional\n      * @param {string} [opts.stackName] - 资源栈名称  optional\n      * @param {string} [opts.action] - 资源栈正在执行的动作  optional\n      * @param {string} [opts.status] - 资源栈正在执行的动作的状态  optional\n      * @param {string} [opts.createStartTime] - 创建开始时间  optional\n      * @param {string} [opts.createEndTime] - 创建结束时间  optional\n      * @param {string} [opts.updateStartTime] - 更新开始时间  optional\n      * @param {string} [opts.updateEndTime] - 更新结束时间  optional\n      * @param {string} [opts.sortField] - 排序字段, createtime, updatetime  optional\n      * @param {string} [opts.sortBy] - 排序方式，asc，desc  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param stackOut list\n      * @param integer totalCount\n      */\n\n  describeStacks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeStacks\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.stackName !== undefined && opts.stackName !== null) {\n      queryParams['stackName'] = opts.stackName\n    }\n    if (opts.action !== undefined && opts.action !== null) {\n      queryParams['action'] = opts.action\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.createStartTime !== undefined && opts.createStartTime !== null) {\n      queryParams['createStartTime'] = opts.createStartTime\n    }\n    if (opts.createEndTime !== undefined && opts.createEndTime !== null) {\n      queryParams['createEndTime'] = opts.createEndTime\n    }\n    if (opts.updateStartTime !== undefined && opts.updateStartTime !== null) {\n      queryParams['updateStartTime'] = opts.updateStartTime\n    }\n    if (opts.updateEndTime !== undefined && opts.updateEndTime !== null) {\n      queryParams['updateEndTime'] = opts.updateEndTime\n    }\n    if (opts.sortField !== undefined && opts.sortField !== null) {\n      queryParams['sortField'] = opts.sortField\n    }\n    if (opts.sortBy !== undefined && opts.sortBy !== null) {\n      queryParams['sortBy'] = opts.sortBy\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdro/0.0.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStacks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/stacks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建资源栈\n      * @param {Object} opts - parameters\n      * @param {environment} opts.environment\n      * @param {object} opts.template - 模板, JSON对象\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string stackID\n      */\n\n  createStack (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createStack\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.environment === undefined || opts.environment === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.environment' when calling createStack\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling createStack\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.environment !== undefined && opts.environment !== null) {\n      postBody['environment'] = opts.environment\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdro/0.0.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createStack with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/stacks',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询资源栈详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.stackId - 资源栈 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param stackOut stack\n      */\n\n  describeStack (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeStack\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.stackId === undefined || opts.stackId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stackId' when calling describeStack\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      stackId: opts.stackId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdro/0.0.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStack with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/stacks/{stackId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除资源栈\n      * @param {Object} opts - parameters\n      * @param {string} opts.stackId - 资源栈 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string details\n      */\n\n  deleteStack (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteStack\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.stackId === undefined || opts.stackId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stackId' when calling deleteStack\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      stackId: opts.stackId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdro/0.0.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteStack with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/stacks/{stackId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建更改集\n      * @param {Object} opts - parameters\n      * @param {string} opts.stackId - 资源栈 ID\n      * @param {environment} opts.environment\n      * @param {object} opts.template - 模板, JSON对象\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string id\n      */\n\n  createChangeSet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createChangeSet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.stackId === undefined || opts.stackId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stackId' when calling createChangeSet\"\n      )\n    }\n    if (opts.environment === undefined || opts.environment === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.environment' when calling createChangeSet\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling createChangeSet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.environment !== undefined && opts.environment !== null) {\n      postBody['environment'] = opts.environment\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      stackId: opts.stackId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdro/0.0.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createChangeSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/stacks/{stackId}/changesets',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  执行更改集\n      * @param {Object} opts - parameters\n      * @param {string} opts.stackId - 资源栈 ID\n      * @param {string} opts.changesetId - 更改集 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  executeChangeSet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  executeChangeSet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.stackId === undefined || opts.stackId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stackId' when calling executeChangeSet\"\n      )\n    }\n    if (opts.changesetId === undefined || opts.changesetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.changesetId' when calling executeChangeSet\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      stackId: opts.stackId,\n      changesetId: opts.changesetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdro/0.0.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call executeChangeSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/stacks/{stackId}/changesets/{changesetId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询资源栈事件列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.stackId - 资源栈 ID\n      * @param {integer} [opts.pageNumber] - 当前所在页，默认为1  optional\n      * @param {integer} [opts.pageSize] - 页面大小，默认为20；取值范围[1, 100]  optional\n      * @param {string} [opts.startTime] - 事件开始时间  optional\n      * @param {string} [opts.endTime] - 事件结束时间  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param eventOut list\n      * @param integer totalCount\n      */\n\n  describeStackEvents (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeStackEvents\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.stackId === undefined || opts.stackId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stackId' when calling describeStackEvents\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      stackId: opts.stackId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdro/0.0.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStackEvents with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/stacks/{stackId}/events',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询资源栈中资源列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.stackId - 资源栈 ID\n      * @param {integer} [opts.pageNumber] - 当前所在页，默认为1  optional\n      * @param {integer} [opts.pageSize] - 页面大小，默认为20；取值范围[1, 100]  optional\n      * @param {string} [opts.search] - 按照京东云产品线名称或者资源逻辑ID进行模糊搜索  optional\n      * @param {string} [opts.product] - 只按照京东云产品线名称进行模糊搜索，比如VM，Disk等  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceOut list\n      * @param integer totalCount\n      */\n\n  describeStackResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeStackResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.stackId === undefined || opts.stackId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stackId' when calling describeStackResources\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.search !== undefined && opts.search !== null) {\n      queryParams['search'] = opts.search\n    }\n    if (opts.product !== undefined && opts.product !== null) {\n      queryParams['product'] = opts.product\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      stackId: opts.stackId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdro/0.0.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStackResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/stacks/{stackId}/resources',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询资源栈使用的模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.stackId - 资源栈 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string template  模板信息\n      */\n\n  describeStackTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeStackTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.stackId === undefined || opts.stackId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.stackId' when calling describeStackTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      stackId: opts.stackId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdro/0.0.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStackTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/stacks/{stackId}/template',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  模板校验\n      * @param {Object} opts - parameters\n      * @param {environment} [opts.environment]   optional\n      * @param {object} opts.template - 模板\n      * @param {string} [opts.validateMode] - 可取值:(validateTemplate (检测模板), validateStack (检测模板和environment)) 默认validateTemplate  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string describe\n      * @param object result  验证模板结果信息，JSON格式\n      */\n\n  validateTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  validateTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling validateTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.environment !== undefined && opts.environment !== null) {\n      postBody['environment'] = opts.environment\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n    if (opts.validateMode !== undefined && opts.validateMode !== null) {\n      postBody['validateMode'] = opts.validateMode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jdro/0.0.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call validateTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/templateValidate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.JDRO\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/jdw/v1/jdw.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 实例管理\n * 实例管理相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jdw'\nService._services[serviceId] = true\n\n/**\n * jdw service.\n * @version 1.0.0\n */\n\nJDCloud.JDW = class JDW extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'jdw.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n}\nmodule.exports = JDCloud.JDW\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/jdworkspace/v1/jdworkspace.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * JDCLOUD 态势感知续费管理 API\n * 态势感知续费管理相关信息接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jdworkspace'\nService._services[serviceId] = true\n\n/**\n * jdworkspace service.\n * @version 0.1.0\n */\n\nclass JDWORKSPACE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'billing.release.workspace.jdcloud.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n}\nmodule.exports = JDWORKSPACE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/jke/v1/jke.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 配额\n * k8s 集群配额相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jke'\nService._services[serviceId] = true\n\n/**\n * jke service.\n * @version 0.1.0\n */\n\nJDCloud.JKE = class JKE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'jke.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询(k8s 集群)配额\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - resourceTypes - 资源类型，暂时只支持[kubernetes]\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quotas\n      */\n\n  describeQuotas (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuotas\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jke/0.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuotas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/quotas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.JKE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/jmr/v1/jmr.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 集群管理\n * JMR集群管理相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jmr'\nService._services[serviceId] = true\n\n/**\n * jmr service.\n * @version 1.1.6\n */\n\nclass JMR extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'jmr.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询用户的集群列表及相关服务的一些信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.dataCenter] - 地域信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object data  包括集群信息列表\n      * @param boolean status\n      */\n\n  idataCluster (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  idataCluster\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.dataCenter === undefined || opts.dataCenter === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataCenter' when calling idataCluster\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      dataCenter: opts.dataCenter\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jmr/1.1.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call idataCluster with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/idata',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取对应版本的软件清单信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.version - JMR软件版本号\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data  对应的软件清单信息\n      * @param boolean status\n      */\n\n  getSoftwareInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getSoftwareInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.version === undefined || opts.version === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.version' when calling getSoftwareInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.version !== undefined && opts.version !== null) {\n      queryParams['version'] = opts.version\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jmr/1.1.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSoftwareInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/softwareInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询JMR的版本信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      * @param boolean status\n      */\n\n  getJmrVersionList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getJmrVersionList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jmr/1.1.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getJmrVersionList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/jmrVersions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询JMR的监控模板信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.clusterId - 集群ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param monitorLabelDetail data\n      * @param boolean status\n      */\n\n  monitorLabelList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  monitorLabelList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clusterId === undefined || opts.clusterId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterId' when calling monitorLabelList\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      clusterId: opts.clusterId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jmr/1.1.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call monitorLabelList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/monitorLabelList/{clusterId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定集群的详细信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.clusterId - 集群ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cluster cluster\n      * @param boolean status\n      */\n\n  describeCluster (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCluster\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clusterId === undefined || opts.clusterId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterId' when calling describeCluster\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      clusterId: opts.clusterId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jmr/1.1.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCluster with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/clusters/{clusterId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户集群的列表\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.dataCenter] - 地域  optional\n      * @param {string} [opts.status] - 集群状态，CREATING，RUNNING，RELEASED，FAILED等  optional\n      * @param {string} [opts.clusterName] - 集群名称  optional\n      * @param {string} [opts.orderBy] - 排序，比如 id desc  optional\n      * @param {integer} [opts.pageNum] - 页数，默认为1  optional\n      * @param {integer} [opts.pageSize] - 每页数目，默认为10  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalNum  集群总的数目\n      * @param clusterListNode clusters\n      * @param boolean status\n      */\n\n  describeClusters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeClusters\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.dataCenter !== undefined && opts.dataCenter !== null) {\n      queryParams['dataCenter'] = opts.dataCenter\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.clusterName !== undefined && opts.clusterName !== null) {\n      queryParams['clusterName'] = opts.clusterName\n    }\n    if (opts.orderBy !== undefined && opts.orderBy !== null) {\n      queryParams['orderBy'] = opts.orderBy\n    }\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jmr/1.1.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeClusters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/clusters',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  释放集群\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.clusterId - 集群ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  是否开始释放集群\n      */\n\n  releaseCluster (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  releaseCluster\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clusterId === undefined || opts.clusterId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterId' when calling releaseCluster\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      clusterId: opts.clusterId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jmr/1.1.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call releaseCluster with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/clusters/{clusterId}:release',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  扩容集群\n      * @param {Object} opts - parameters\n      * @param {clusterExpansion} opts.clusterExpansion - 描述集群扩容信息\n      * @param {string} [opts.clientToken] - 用于保证请求的幂等性。由客户端生成，长度不能超过64个字符。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  是否开始扩容集群\n      */\n\n  clusterExpansion (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  clusterExpansion\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clusterExpansion === undefined || opts.clusterExpansion === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterExpansion' when calling clusterExpansion\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clusterExpansion !== undefined && opts.clusterExpansion !== null) {\n      postBody['clusterExpansion'] = opts.clusterExpansion\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jmr/1.1.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call clusterExpansion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cluster:expansion',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  缩容集群\n      * @param {Object} opts - parameters\n      * @param {clusterReduction} opts.clusterReduction - 描述集群缩容信息\n      * @param {string} [opts.clientToken] - 用于保证请求的幂等性。由客户端生成，长度不能超过64个字符。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  是否开始缩容集群\n      */\n\n  clusterReduction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  clusterReduction\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clusterReduction === undefined || opts.clusterReduction === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterReduction' when calling clusterReduction\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clusterReduction !== undefined && opts.clusterReduction !== null) {\n      postBody['clusterReduction'] = opts.clusterReduction\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jmr/1.1.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call clusterReduction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cluster:reduction',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建集群\n      * @param {Object} opts - parameters\n      * @param {clusterSpec} opts.clusterSpec - 描述集群配置\n      * @param {string} [opts.clientToken] - 用于保证请求的幂等性。由客户端生成，长度不能超过64个字符。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  是否开始创建集群\n      * @param string clusterId  集群ID\n      * @param string message  创建集群的信息\n      */\n\n  createCluster (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createCluster\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clusterSpec === undefined || opts.clusterSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterSpec' when calling createCluster\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clusterSpec !== undefined && opts.clusterSpec !== null) {\n      postBody['clusterSpec'] = opts.clusterSpec\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  jmr/1.1.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCluster with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cluster:create',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JMR\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/kafka/v1/kafka.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * kafka topic 相关接口\n * kafka topic 相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'kafka'\nService._services[serviceId] = true\n\n/**\n * kafka service.\n * @version 1.0.0\n */\n\nJDCloud.KAFKA = class KAFKA extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'kafka.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询kafka实例列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码，默认1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认10  optional\n      * @param {filter} [opts.filters] - 过滤条件：\ninstanceId -实例Id，精确匹配，支持多个\ninstanceVersion -实例版本，精确匹配，支持单个\ninstanceName - 实例名称，模糊匹配，支持单个\ninstanceStatus - 实例状态，精确匹配，支持多个(running：运行，error：错误，creating：创建中，changing：变配中，stop：已停止，processing：处理中)\nchargeMode - 计费类型，按配置postpaid_by_duration或者包年包月prepaid_by_duration\n  optional\n      * @param {tagFilter} [opts.tagFilters] - 标签过滤条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instances\n      * @param integer totalCount  kafka实例总数\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(\n      queryParams,\n      super.buildTagFilterParam(opts.tagFilters, 'tagFilters')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kafka/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个指定配置的kafka实例\n      * @param {Object} opts - parameters\n      * @param {instanceSpec} opts.instance - kafka实例的相关配置\n      * @param {chargeSpec} [opts.charge] - 计费信息的相关配置，只有prepaid_by_duration和postpaid_by_duration 2种计费模式  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId  kafka实例编号\n      * @param string buyId  buyId\n      */\n\n  createInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instance === undefined || opts.instance === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instance' when calling createInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instance !== undefined && opts.instance !== null) {\n      postBody['instance'] = opts.instance\n    }\n    if (opts.charge !== undefined && opts.charge !== null) {\n      postBody['charge'] = opts.charge\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kafka/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询kafka实例的详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instance  kafka实例详细信息\n      */\n\n  describeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kafka/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除按配置计费或包年包月已到期的kafka实例，包年包月未到期不可删除。\n状态为创建中和变配中的不可删除。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kafka/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  变更kafka实例的配置，实例为running状态才可变更配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {array} opts.instanceClassSpec - 变更的规格\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId  kafka实例编号\n      * @param string buyId  buyId\n      */\n\n  modifyInstanceSpec (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceSpec\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceSpec\"\n      )\n    }\n    if (\n      opts.instanceClassSpec === undefined ||\n      opts.instanceClassSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceClassSpec' when calling modifyInstanceSpec\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.instanceClassSpec !== undefined &&\n      opts.instanceClassSpec !== null\n    ) {\n      postBody['instanceClassSpec'] = opts.instanceClassSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kafka/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceSpec with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceSpec',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.KAFKA\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/kms/v1/kms.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Statistics Service\n * 基于硬件保护密钥的安全数据托管服务\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'kms'\nService._services[serviceId] = true\n\n/**\n * kms service.\n * @version 0.3.3\n */\n\nclass KMS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'kms.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  获取密钥列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param keyInfo keyList\n      * @param integer totalCount  Key的数量\n      */\n\n  describeKeyList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeKeyList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个CMK（用户主密钥），默认为启用状态\n      * @param {Object} opts - parameters\n      * @param {keyCfg} opts.keyCfg\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string keyId  创建的密钥ID\n      */\n\n  createKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyCfg === undefined || opts.keyCfg === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyCfg' when calling createKey\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.keyCfg !== undefined && opts.keyCfg !== null) {\n      postBody['keyCfg'] = opts.keyCfg\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key:create',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取密钥详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param keyInfo keyInfo\n      */\n\n  describeKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling describeKey\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   修改对称密钥配置，包括key的名称、用途、是否自动轮换和轮换周期等;\n-   修改非对称密钥配置，包括key的名称、用途等。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {keyCfg} opts.keyCfg\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateKeyDescription (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling updateKeyDescription\"\n      )\n    }\n    if (opts.keyCfg === undefined || opts.keyCfg === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyCfg' when calling updateKeyDescription\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.keyCfg !== undefined && opts.keyCfg !== null) {\n      postBody['keyCfg'] = opts.keyCfg\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateKeyDescription with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用当前状态为&#x60;已禁用&#x60;的密钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling enableKey\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}:enable',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用当前状态为&#x60;已启用&#x60;的密钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling disableKey\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}:disable',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  计划在以后的是个时间点删除密钥，默认为7天\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {integer} [opts.delayDays] - 延迟删除时间，单位（天），默认为7天；支持时间范围：7~30天  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  scheduleKeyDeletion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling scheduleKeyDeletion\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.delayDays !== undefined && opts.delayDays !== null) {\n      queryParams['delayDays'] = opts.delayDays\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call scheduleKeyDeletion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}:delete',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  取消删除密钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  cancelKeyDeletion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling cancelKeyDeletion\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cancelKeyDeletion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}:cancelDelete',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  立即轮换密钥，自动轮换周期顺延-支持对称密钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  keyRotation (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling keyRotation\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call keyRotation with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}:rotate',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  使用密钥对数据进行加密，针对非对称密钥：使用公钥进行加密，仅支持RSA_PKCS1_PADDING填充方式，最大加密数据长度为245字节\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {} [opts.plaintext] - 明文数据 Base64-encoded binary data object  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string ciphertextBlob  密文数据 Base64-encoded binary data object\n      */\n\n  encrypt (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling encrypt\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.plaintext !== undefined && opts.plaintext !== null) {\n      postBody['plaintext'] = opts.plaintext\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call encrypt with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}:Encrypt',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  使用密钥对数据进行解密，针对非对称密钥：使用私钥进行加密\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {} [opts.ciphertextBlob] - 密文数据 Base64-encoded binary data object  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string plaintext  明文数据 Base64-encoded binary data object\n      */\n\n  decrypt (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling decrypt\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ciphertextBlob !== undefined && opts.ciphertextBlob !== null) {\n      postBody['ciphertextBlob'] = opts.ciphertextBlob\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call decrypt with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}:Decrypt',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取非对称密钥的公钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string publicKeyBlob  公钥，PEM格式\n      */\n\n  getPublicKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling getPublicKey\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPublicKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}:GetPublicKey',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  使用非对称密钥的私钥签名,签名算法仅支持RSA_PKCS1_PADDING填充方式,最大签名数据长度为4K字节\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {} [opts.plaintext] - 需要签名的数据 Base64-encoded binary data object  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string signature  签名\n      */\n\n  sign (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling sign\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.plaintext !== undefined && opts.plaintext !== null) {\n      postBody['plaintext'] = opts.plaintext\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call sign with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}:Sign',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  使用非对称密钥的公钥验证签名\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {} [opts.plaintext] - 需要签名的数据 Base64-encoded binary data object  optional\n      * @param {} [opts.signature] - 签名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean validated  校验签名结果，true为成功，false为失败\n      */\n\n  validate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling validate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.plaintext !== undefined && opts.plaintext !== null) {\n      postBody['plaintext'] = opts.plaintext\n    }\n    if (opts.signature !== undefined && opts.signature !== null) {\n      postBody['signature'] = opts.signature\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call validate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}:Validate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  从KMS中获取一对数据密钥的明文/密文\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string plaintext  明文DEK Base64-encoded binary data object\n      * @param string ciphertextBlob  密文DEK Base64-encoded binary data object\n      */\n\n  generateDataKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling generateDataKey\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call generateDataKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}:GenerateDataKey',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取版本详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param keyDetail keyDetail\n      */\n\n  describeKeyDetail (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling describeKeyDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeKeyDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}:describeKeyDetail',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用指定版本密钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {string} opts.version - 密钥版本\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableKeyVersion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling enableKeyVersion\"\n      )\n    }\n    if (opts.version === undefined || opts.version === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.version' when calling enableKeyVersion\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId,\n      version: opts.version\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableKeyVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}/version/{version}:enable',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用指定版本密钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {string} opts.version - 密钥版本\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableKeyVersion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling disableKeyVersion\"\n      )\n    }\n    if (opts.version === undefined || opts.version === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.version' when calling disableKeyVersion\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId,\n      version: opts.version\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableKeyVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}/version/{version}:disable',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  计划在以后的是个时间点删除指定版本密钥，默认为7天\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {string} opts.version - 密钥版本\n      * @param {integer} [opts.delayDays] - 延迟删除时间，单位（天），默认为7天；支持时间范围：7~30天  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  scheduleKeyVersionDeletion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling scheduleKeyVersionDeletion\"\n      )\n    }\n    if (opts.version === undefined || opts.version === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.version' when calling scheduleKeyVersionDeletion\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.delayDays !== undefined && opts.delayDays !== null) {\n      queryParams['delayDays'] = opts.delayDays\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId,\n      version: opts.version\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call scheduleKeyVersionDeletion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}/version/{version}:delete',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  取消删除指定版本密钥\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyId - 密钥ID\n      * @param {string} opts.version - 密钥版本\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  cancelKeyVersionDeletion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.keyId === undefined || opts.keyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyId' when calling cancelKeyVersionDeletion\"\n      )\n    }\n    if (opts.version === undefined || opts.version === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.version' when calling cancelKeyVersionDeletion\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      keyId: opts.keyId,\n      version: opts.version\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cancelKeyVersionDeletion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/key/{keyId}/version/{version}:cancelDelete',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取机密列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param secretInfo secretList\n      * @param integer totalCount  Secret的数量\n      */\n\n  describeSecretList (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecretList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/secret',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建机密\n      * @param {Object} opts - parameters\n      * @param {secretCfg} opts.secretCfg\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string secretId  secretId\n      */\n\n  createSecret (opts, callback) {\n    opts = opts || {}\n\n    if (opts.secretCfg === undefined || opts.secretCfg === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretCfg' when calling createSecret\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.secretCfg !== undefined && opts.secretCfg !== null) {\n      postBody['secretCfg'] = opts.secretCfg\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/secret:create',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取机密详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.secretId - 机密ID\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param secretDetail secretDetail\n      */\n\n  describeSecretVersionList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.secretId === undefined || opts.secretId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretId' when calling describeSecretVersionList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      secretId: opts.secretId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecretVersionList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/secret/{secretId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改机密描述\n      * @param {Object} opts - parameters\n      * @param {string} opts.secretId - 机密ID\n      * @param {secretDescCfg} opts.secretDescCfg\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateSecret (opts, callback) {\n    opts = opts || {}\n\n    if (opts.secretId === undefined || opts.secretId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretId' when calling updateSecret\"\n      )\n    }\n    if (opts.secretDescCfg === undefined || opts.secretDescCfg === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretDescCfg' when calling updateSecret\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.secretDescCfg !== undefined && opts.secretDescCfg !== null) {\n      postBody['secretDescCfg'] = opts.secretDescCfg\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      secretId: opts.secretId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/secret/{secretId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用机密\n      * @param {Object} opts - parameters\n      * @param {string} opts.secretId - 机密ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableSecret (opts, callback) {\n    opts = opts || {}\n\n    if (opts.secretId === undefined || opts.secretId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretId' when calling enableSecret\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      secretId: opts.secretId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/secret/{secretId}:enable',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用机密\n      * @param {Object} opts - parameters\n      * @param {string} opts.secretId - 机密ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableSecret (opts, callback) {\n    opts = opts || {}\n\n    if (opts.secretId === undefined || opts.secretId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretId' when calling disableSecret\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      secretId: opts.secretId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/secret/{secretId}:disable',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除机密\n      * @param {Object} opts - parameters\n      * @param {string} opts.secretId - 机密ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSecret (opts, callback) {\n    opts = opts || {}\n\n    if (opts.secretId === undefined || opts.secretId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretId' when calling deleteSecret\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      secretId: opts.secretId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/secret/{secretId}:delete',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建机密新的版本，默认为已启用状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.secretId - 机密ID\n      * @param {secretVersionCfg} opts.secretVersionCfg\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createSecretVersion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.secretId === undefined || opts.secretId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretId' when calling createSecretVersion\"\n      )\n    }\n    if (opts.secretVersionCfg === undefined || opts.secretVersionCfg === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretVersionCfg' when calling createSecretVersion\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.secretVersionCfg !== undefined && opts.secretVersionCfg !== null) {\n      postBody['secretVersionCfg'] = opts.secretVersionCfg\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      secretId: opts.secretId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSecretVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/secret/{secretId}:createSecretVersion',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取指定机密版本的详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.secretId - 机密ID\n      * @param {string} opts.version - 机密版本\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param secretVersionItem secretVersionItem\n      */\n\n  describeSecretVersionInfo (opts, callback) {\n    opts = opts || {}\n\n    if (opts.secretId === undefined || opts.secretId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretId' when calling describeSecretVersionInfo\"\n      )\n    }\n    if (opts.version === undefined || opts.version === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.version' when calling describeSecretVersionInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      secretId: opts.secretId,\n      version: opts.version\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecretVersionInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/secret/{secretId}/version/{version}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改机密指定版本配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.secretId - 机密ID\n      * @param {string} opts.version - 机密版本\n      * @param {secretTimeCfg} opts.secretTimeCfg\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateSecretVersion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.secretId === undefined || opts.secretId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretId' when calling updateSecretVersion\"\n      )\n    }\n    if (opts.version === undefined || opts.version === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.version' when calling updateSecretVersion\"\n      )\n    }\n    if (opts.secretTimeCfg === undefined || opts.secretTimeCfg === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretTimeCfg' when calling updateSecretVersion\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.secretTimeCfg !== undefined && opts.secretTimeCfg !== null) {\n      postBody['secretTimeCfg'] = opts.secretTimeCfg\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      secretId: opts.secretId,\n      version: opts.version\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateSecretVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/secret/{secretId}/version/{version}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用指定版本机密\n      * @param {Object} opts - parameters\n      * @param {string} opts.secretId - 机密ID\n      * @param {string} opts.version - 机密版本\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableSecretVersion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.secretId === undefined || opts.secretId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretId' when calling enableSecretVersion\"\n      )\n    }\n    if (opts.version === undefined || opts.version === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.version' when calling enableSecretVersion\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      secretId: opts.secretId,\n      version: opts.version\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableSecretVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/secret/{secretId}/version/{version}:enable',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用指定版本机密\n      * @param {Object} opts - parameters\n      * @param {string} opts.secretId - 机密ID\n      * @param {string} opts.version - 机密版本\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableSecretVersion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.secretId === undefined || opts.secretId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretId' when calling disableSecretVersion\"\n      )\n    }\n    if (opts.version === undefined || opts.version === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.version' when calling disableSecretVersion\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      secretId: opts.secretId,\n      version: opts.version\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableSecretVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/secret/{secretId}/version/{version}:disable',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定版本机密\n      * @param {Object} opts - parameters\n      * @param {string} opts.secretId - 机密ID\n      * @param {string} opts.version - 机密版本\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSecretVersion (opts, callback) {\n    opts = opts || {}\n\n    if (opts.secretId === undefined || opts.secretId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretId' when calling deleteSecretVersion\"\n      )\n    }\n    if (opts.version === undefined || opts.version === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.version' when calling deleteSecretVersion\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      secretId: opts.secretId,\n      version: opts.version\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kms/0.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSecretVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/secret/{secretId}/version/{version}:delete',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = KMS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/kubernetes/v1/kubernetes.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ServerlessCluster\n * Serverless集群相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'kubernetes'\nService._services[serviceId] = true\n\n/**\n * kubernetes service.\n * @version 1.2.2\n */\n\nclass KUBERNETES extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'kubernetes.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询集群列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - name - 集群名称，模糊匹配，仅支持单个\nid - id，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cluster clusters\n      * @param number totalCount\n      */\n\n  describeClusters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeClusters\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeClusters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/clusters',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  - 创建集群\n- 证书\n  - 关于kubernetes的证书，默认生成，不需要用户传入。\n- nodegroup\n  - cluster必须与nodeGroup进行绑定\n  - cluster支持多nodegroup\n  - 状态\n    - pending,reconciling,deleting状态不可以操作更新接口\n    - running，running_with_error状态可以操作nodegroup所有接口\n    - error状态只可以查询，删除\n    - delete状态的cluster在十五分钟内可以查询，十五分钟后无法查询到\n- 状态限制\n  - pending,reconciling,deleting状态不可以操作更新接口\n  - running状态可以操作cluster所有接口\n  - error状态只可以查询，删除\n  - delete状态的cluster在十五分钟内可以查询，十五分钟后无法查询到\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 名称（同一用户的 cluster 允许重名）\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} [opts.version] - kubernetes的版本  optional\n      * @param {boolean} [opts.isEdge] - 是否是边缘计算集群  optional\n      * @param {array} [opts.azs] - 集群所在的az  optional\n      * @param {nodeGroupSpec} opts.nodeGroup - 集群节点组\n      * @param {string} opts.accessKey - 用户的AccessKey，插件调用open-api时的认证凭证\n      * @param {string} opts.secretKey - 用户的SecretKey，插件调用open-api时的认证凭证\n      * @param {array} [opts.addonsConfig] - 集群组件配置  optional\n      * @param {string} [opts.clusterNetworkType] - 集群网络配置类型，取值：auto，customized，创建集群接口合并，原CreateCusomizedCluster接口废弃  optional\n      * @param {autoClusterNetworkSpec} [opts.autoClusterNetworkSpec] - clusterNetworkType为【auto】时，此配置必须要配置  optional\n      * @param {customizedClusterNetworkSpec} [opts.customizedClusterNetworkSpec] - clusterNetworkType为【customized】时，此配置必须要配置  optional\n      * @param {array} [opts.clusterEnvironments] - 用户自定义的集群的环境信息，会影响到创建集群时的组件模版的渲染  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string clusterId\n      */\n\n  createCluster (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createCluster\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createCluster\"\n      )\n    }\n    if (opts.nodeGroup === undefined || opts.nodeGroup === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeGroup' when calling createCluster\"\n      )\n    }\n    if (opts.accessKey === undefined || opts.accessKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKey' when calling createCluster\"\n      )\n    }\n    if (opts.secretKey === undefined || opts.secretKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretKey' when calling createCluster\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n    if (opts.isEdge !== undefined && opts.isEdge !== null) {\n      postBody['isEdge'] = opts.isEdge\n    }\n    if (opts.azs !== undefined && opts.azs !== null) {\n      postBody['azs'] = opts.azs\n    }\n    if (opts.nodeGroup !== undefined && opts.nodeGroup !== null) {\n      postBody['nodeGroup'] = opts.nodeGroup\n    }\n    if (opts.accessKey !== undefined && opts.accessKey !== null) {\n      postBody['accessKey'] = opts.accessKey\n    }\n    if (opts.secretKey !== undefined && opts.secretKey !== null) {\n      postBody['secretKey'] = opts.secretKey\n    }\n    if (opts.addonsConfig !== undefined && opts.addonsConfig !== null) {\n      postBody['addonsConfig'] = opts.addonsConfig\n    }\n    if (\n      opts.clusterNetworkType !== undefined &&\n      opts.clusterNetworkType !== null\n    ) {\n      postBody['clusterNetworkType'] = opts.clusterNetworkType\n    }\n    if (\n      opts.autoClusterNetworkSpec !== undefined &&\n      opts.autoClusterNetworkSpec !== null\n    ) {\n      postBody['autoClusterNetworkSpec'] = opts.autoClusterNetworkSpec\n    }\n    if (\n      opts.customizedClusterNetworkSpec !== undefined &&\n      opts.customizedClusterNetworkSpec !== null\n    ) {\n      postBody['customizedClusterNetworkSpec'] =\n        opts.customizedClusterNetworkSpec\n    }\n    if (\n      opts.clusterEnvironments !== undefined &&\n      opts.clusterEnvironments !== null\n    ) {\n      postBody['clusterEnvironments'] = opts.clusterEnvironments\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCluster with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/clusters',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个集群详情。\n      * @param {Object} opts - parameters\n      * @param {string} opts.clusterId - 集群 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cluster cluster\n      */\n\n  describeCluster (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCluster\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clusterId === undefined || opts.clusterId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterId' when calling describeCluster\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      clusterId: opts.clusterId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCluster with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/clusters/{clusterId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改集群的 名称 和 描述。&lt;br&gt;集群 name 和 description 必须要指定一个\n      * @param {Object} opts - parameters\n      * @param {string} opts.clusterId - 集群 ID\n      * @param {string} [opts.name] - 集群名称  optional\n      * @param {string} [opts.description] - 集群描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyCluster (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyCluster\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clusterId === undefined || opts.clusterId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterId' when calling modifyCluster\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      clusterId: opts.clusterId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyCluster with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/clusters/{clusterId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除集群，以及集群的所有node节点，网络，云盘等所有资源。\n      * @param {Object} opts - parameters\n      * @param {string} opts.clusterId - 集群 ID\n      * @param {string} [opts.routeTableId] - 替换路由表id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCluster (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteCluster\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clusterId === undefined || opts.clusterId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterId' when calling deleteCluster\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.routeTableId !== undefined && opts.routeTableId !== null) {\n      queryParams['routeTableId'] = opts.routeTableId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      clusterId: opts.clusterId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCluster with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/clusters/{clusterId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询工作节点组列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - name - 节点组名称，模糊匹配，支持单个\nid - 节点组 id，支持多个\nclusterId - 根据 clusterId 查询\nclusterName - 根据 cluster 名称查询\n  optional\n      * @param {tagFilter} [opts.tags] - Tag筛选条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param nodeGroup nodeGroups\n      * @param number totalCount\n      */\n\n  describeNodeGroups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNodeGroups\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNodeGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/nodeGroups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建工作节点组&lt;br&gt;\n- 要求集群状态为running\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 名称（同一用户的 cluster 内部唯一）\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} opts.clusterId - 工作节点所属的集群\n      * @param {nodeConfigSpec} opts.nodeConfig - 工作节点配置信息\n      * @param {array} [opts.azs] - 工作节点组的 az，必须为集群az的子集，默认为集群az  optional\n      * @param {integer} opts.initialNodeCount - 工作节点组初始化大小\n      * @param {cAConfigSpec} [opts.caConfig] - 自动伸缩配置  optional\n      * @param {nodeGroupNetworkSpec} [opts.nodeGroupNetwork] - 节点组的网络配置，如果集群的类型customized类型，则必须指定该参数，如果是auto，则不是必须  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string nodeGroupId\n      */\n\n  createNodeGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createNodeGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createNodeGroup\"\n      )\n    }\n    if (opts.clusterId === undefined || opts.clusterId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterId' when calling createNodeGroup\"\n      )\n    }\n    if (opts.nodeConfig === undefined || opts.nodeConfig === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeConfig' when calling createNodeGroup\"\n      )\n    }\n    if (opts.initialNodeCount === undefined || opts.initialNodeCount === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.initialNodeCount' when calling createNodeGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.clusterId !== undefined && opts.clusterId !== null) {\n      postBody['clusterId'] = opts.clusterId\n    }\n    if (opts.nodeConfig !== undefined && opts.nodeConfig !== null) {\n      postBody['nodeConfig'] = opts.nodeConfig\n    }\n    if (opts.azs !== undefined && opts.azs !== null) {\n      postBody['azs'] = opts.azs\n    }\n    if (opts.initialNodeCount !== undefined && opts.initialNodeCount !== null) {\n      postBody['initialNodeCount'] = opts.initialNodeCount\n    }\n    if (opts.caConfig !== undefined && opts.caConfig !== null) {\n      postBody['caConfig'] = opts.caConfig\n    }\n    if (opts.nodeGroupNetwork !== undefined && opts.nodeGroupNetwork !== null) {\n      postBody['nodeGroupNetwork'] = opts.nodeGroupNetwork\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createNodeGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/nodeGroups',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个工作节点组详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.nodeGroupId - 工作节点组 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param nodeGroup nodeGroup\n      */\n\n  describeNodeGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNodeGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.nodeGroupId === undefined || opts.nodeGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeGroupId' when calling describeNodeGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      nodeGroupId: opts.nodeGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNodeGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/nodeGroups/{nodeGroupId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改工作节点组的 名称 和 描述&lt;br&gt;name 和 description 必须要指定一个\n      * @param {Object} opts - parameters\n      * @param {string} opts.nodeGroupId - 工作节点组 ID\n      * @param {string} [opts.name] - 工作节点组名称  optional\n      * @param {string} [opts.description] - 工作节点组描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyNodeGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyNodeGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.nodeGroupId === undefined || opts.nodeGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeGroupId' when calling modifyNodeGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      nodeGroupId: opts.nodeGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyNodeGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/nodeGroups/{nodeGroupId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  集群摘除工作节点组并删除工作节点组\n      * @param {Object} opts - parameters\n      * @param {string} opts.nodeGroupId - 工作节点组 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteNodeGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteNodeGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.nodeGroupId === undefined || opts.nodeGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeGroupId' when calling deleteNodeGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      nodeGroupId: opts.nodeGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteNodeGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/nodeGroups/{nodeGroupId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  调整工作节点组实例数量\n      * @param {Object} opts - parameters\n      * @param {string} opts.nodeGroupId - 工作节点组 ID\n      * @param {integer} opts.expectCount - 预期目标节点数量\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setNodeGroupSize (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setNodeGroupSize\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.nodeGroupId === undefined || opts.nodeGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeGroupId' when calling setNodeGroupSize\"\n      )\n    }\n    if (opts.expectCount === undefined || opts.expectCount === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.expectCount' when calling setNodeGroupSize\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.expectCount !== undefined && opts.expectCount !== null) {\n      postBody['expectCount'] = opts.expectCount\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      nodeGroupId: opts.nodeGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setNodeGroupSize with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/nodeGroups/{nodeGroupId}:setNodeGroupSize',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置工作节点组自动扩容缩容\n      * @param {Object} opts - parameters\n      * @param {string} opts.nodeGroupId - 工作节点组 ID\n      * @param {cAConfigSpec} opts.caConfig - 自动伸缩配置，其中 enable 必须指定\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setNodeGroupCA (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setNodeGroupCA\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.nodeGroupId === undefined || opts.nodeGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeGroupId' when calling setNodeGroupCA\"\n      )\n    }\n    if (opts.caConfig === undefined || opts.caConfig === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.caConfig' when calling setNodeGroupCA\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.caConfig !== undefined && opts.caConfig !== null) {\n      postBody['caConfig'] = opts.caConfig\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      nodeGroupId: opts.nodeGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setNodeGroupCA with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/nodeGroups/{nodeGroupId}:setNodeGroupCA',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  从工作节点组中删除指定实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.nodeGroupId - 工作节点组 ID\n      * @param {array} [opts.instanceIds] - 需要从工作节点组中删除的实例\n- 不可将一个集群中的实例全部删除\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteNodeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteNodeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.nodeGroupId === undefined || opts.nodeGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeGroupId' when calling deleteNodeInstances\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceIds !== undefined && opts.instanceIds !== null) {\n      postBody['instanceIds'] = opts.instanceIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      nodeGroupId: opts.nodeGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteNodeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/nodeGroups/{nodeGroupId}:deleteNodeInstances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 kubernetes 集群配额\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - resourceTypes - 资源类型，暂时只支持[kubernetes、serverless-kubernetes]\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quotas\n      */\n\n  describeQuotas (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuotas\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuotas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/quotas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询版本信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.masterVersion] - 集群的大版本，如 1.16.4-jcs.3  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param masterVersion masterVersions\n      */\n\n  describeVersions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVersions\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.masterVersion !== undefined && opts.masterVersion !== null) {\n      queryParams['masterVersion'] = opts.masterVersion\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVersions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/versions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询Serverless集群列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - name - 集群名称，模糊匹配，仅支持单个\nid - id，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param serverlessCluster clusters\n      * @param number totalCount\n      */\n\n  describeServerlessClusters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeServerlessClusters\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeServerlessClusters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverless-clusters',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  - 创建Serverless集群\n- 证书\n  - 关于kubernetes的证书，默认生成，不需要用户传入。\n- 状态限制\n  - pending,reconciling,deleting状态不可以操作更新接口\n  - running状态可以操作cluster所有接口\n  - error状态只可以查询，删除\n  - delete状态的cluster在十五分钟内可以查询，十五分钟后无法查询到\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 名称（同一用户的 cluster 允许重名）\n      * @param {string} [opts.description] - 描述  optional\n      * @param {string} [opts.version] - kubernetes的版本  optional\n      * @param {array} [opts.azs] - 集群所在的az  optional\n      * @param {string} opts.accessKey - 用户的AccessKey，插件调用open-api时的认证凭证\n      * @param {string} opts.secretKey - 用户的SecretKey，插件调用open-api时的认证凭证\n      * @param {array} [opts.addonsConfig] - 集群组件配置  optional\n      * @param {serverlessClusterNetworkSpec} opts.clusterNetworkSpec - 集群网络配置\n      * @param {array} [opts.clusterEnvironments] - 用户自定义的集群的环境信息，会影响到创建集群时的组件模版的渲染  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string clusterId\n      */\n\n  createServerlessCluster (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createServerlessCluster\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createServerlessCluster\"\n      )\n    }\n    if (opts.accessKey === undefined || opts.accessKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKey' when calling createServerlessCluster\"\n      )\n    }\n    if (opts.secretKey === undefined || opts.secretKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretKey' when calling createServerlessCluster\"\n      )\n    }\n    if (\n      opts.clusterNetworkSpec === undefined ||\n      opts.clusterNetworkSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterNetworkSpec' when calling createServerlessCluster\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n    if (opts.azs !== undefined && opts.azs !== null) {\n      postBody['azs'] = opts.azs\n    }\n    if (opts.accessKey !== undefined && opts.accessKey !== null) {\n      postBody['accessKey'] = opts.accessKey\n    }\n    if (opts.secretKey !== undefined && opts.secretKey !== null) {\n      postBody['secretKey'] = opts.secretKey\n    }\n    if (opts.addonsConfig !== undefined && opts.addonsConfig !== null) {\n      postBody['addonsConfig'] = opts.addonsConfig\n    }\n    if (\n      opts.clusterNetworkSpec !== undefined &&\n      opts.clusterNetworkSpec !== null\n    ) {\n      postBody['clusterNetworkSpec'] = opts.clusterNetworkSpec\n    }\n    if (\n      opts.clusterEnvironments !== undefined &&\n      opts.clusterEnvironments !== null\n    ) {\n      postBody['clusterEnvironments'] = opts.clusterEnvironments\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createServerlessCluster with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverless-clusters',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个集群详情。\n      * @param {Object} opts - parameters\n      * @param {string} opts.clusterId - 集群 ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param serverlessCluster cluster\n      */\n\n  describeServerlessCluster (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeServerlessCluster\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clusterId === undefined || opts.clusterId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterId' when calling describeServerlessCluster\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      clusterId: opts.clusterId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeServerlessCluster with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverless-clusters/{clusterId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改Serverless集群的 名称 和 描述。&lt;br&gt;集群 name 和 description 必须要指定一个\n      * @param {Object} opts - parameters\n      * @param {string} opts.clusterId - 集群 ID\n      * @param {string} [opts.name] - 集群名称  optional\n      * @param {string} [opts.description] - 集群描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyServerlessCluster (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyServerlessCluster\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clusterId === undefined || opts.clusterId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterId' when calling modifyServerlessCluster\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      clusterId: opts.clusterId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyServerlessCluster with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverless-clusters/{clusterId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除Serverless集群，以及集群的所有网络，云盘等所有资源。\n      * @param {Object} opts - parameters\n      * @param {string} opts.clusterId - 集群 ID\n      * @param {string} [opts.routeTableId] - 替换路由表id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteServerlessCluster (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteServerlessCluster\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clusterId === undefined || opts.clusterId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clusterId' when calling deleteServerlessCluster\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.routeTableId !== undefined && opts.routeTableId !== null) {\n      queryParams['routeTableId'] = opts.routeTableId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      clusterId: opts.clusterId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteServerlessCluster with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverless-clusters/{clusterId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询Serverless集群版本列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.masterVersion]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param serverlessMasterVersion masterVersions\n      */\n\n  describeServerlessVersions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeServerlessVersions\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.masterVersion !== undefined && opts.masterVersion !== null) {\n      queryParams['masterVersion'] = opts.masterVersion\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  kubernetes/1.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeServerlessVersions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/serverless-versions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = KUBERNETES\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/lavm/v1/lavm.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * quota\n * 轻量应用云主机配额模型的相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'lavm'\nService._services[serviceId] = true\n\n/**\n * lavm service.\n * @version 1.3.1\n */\n\nclass LAVM extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'lavm.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询磁盘信息。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.instanceId] - 指定的轻量应用云主机的实例ID\n  optional\n      * @param {string} [opts.diskIds] - 磁盘ID, &#x60;[\\&quot;volume-xxx\\&quot;, \\&quot;volume-yyy\\&quot;]&#x60;, json array 字串\n  optional\n      * @param {integer} [opts.pageSize] - 页码；默认为1。  optional\n      * @param {integer} [opts.pageNumber] - 分页大小；&lt;br&gt;默认为20；取值范围[10, 100]。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param disk disks\n      * @param integer total  本次查询可匹配到的总记录数，使用者需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      */\n\n  describeDisks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDisks\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.diskIds !== undefined && opts.diskIds !== null) {\n      queryParams['diskIds'] = opts.diskIds\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDisks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/disks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定轻量应用云主机的防火墙规则。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 指定的轻量应用云主机的实例ID\n\n      * @param {integer} [opts.pageSize] - 分页查询时设置的每页行数。最大值：100，默认值：10。\n  optional\n      * @param {integer} [opts.pageNumber] - 防火墙规则列表的页码。起始值：1，默认值：1。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param firewallRule firewallRules\n      * @param integer totalCount\n      */\n\n  describeFirewallRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeFirewallRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeFirewallRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeFirewallRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/firewallRule',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为指定的轻量应用云主机创建一条防火墙规则。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 指定的轻量应用云主机的实例ID\n\n      * @param {string} opts.sourceAddress - 源Ip的CRDI格式的地址\n\n      * @param {string} opts.ruleProtocol - 规则限定协议。取值范围：\nTCP：TCP协议。\nUDP：UDP协议。\nICMP：ICMP协议。\n\n      * @param {string} opts.port - 端口范围。若规则限定协议为传输层协议（TCP、UDP)，取值范围为1&#x60;~&#x60;65535，若规则限定协议为非传输层协议（ICMP协议），恒为0。使用正斜线（/）隔开起始端口和终止端口，例如：1024/1055表示端口范围为1024&#x60;~&#x60;1055。\n\n      * @param {string} [opts.remark] - 防火墙规则的备注, 不超过100个字符\n  optional\n      * @param {string} [opts.clientToken] - 用于保证请求的幂等性。由客户端生成，并确保不同请求中该参数唯一，长度不能超过64个字符。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string firewallId\n      */\n\n  createFirewallRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createFirewallRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createFirewallRule\"\n      )\n    }\n    if (opts.sourceAddress === undefined || opts.sourceAddress === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sourceAddress' when calling createFirewallRule\"\n      )\n    }\n    if (opts.ruleProtocol === undefined || opts.ruleProtocol === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleProtocol' when calling createFirewallRule\"\n      )\n    }\n    if (opts.port === undefined || opts.port === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.port' when calling createFirewallRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.sourceAddress !== undefined && opts.sourceAddress !== null) {\n      postBody['sourceAddress'] = opts.sourceAddress\n    }\n    if (opts.ruleProtocol !== undefined && opts.ruleProtocol !== null) {\n      postBody['ruleProtocol'] = opts.ruleProtocol\n    }\n    if (opts.port !== undefined && opts.port !== null) {\n      postBody['port'] = opts.port\n    }\n    if (opts.remark !== undefined && opts.remark !== null) {\n      postBody['remark'] = opts.remark\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createFirewallRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/firewallRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为指定的轻量应用云主机修改一条防火墙规则。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 指定的轻量应用云主机的实例ID\n\n      * @param {string} opts.ruleId - 防火墙规则ID\n\n      * @param {string} opts.sourceAddress - 源Ip的CRDI格式的地址\n\n      * @param {string} opts.ruleProtocol - 规则限定协议。取值范围：\nTCP：TCP协议。\nUDP：UDP协议。\nICMP：ICMP协议。\n\n      * @param {string} opts.port - 端口范围。若规则限定协议为传输层协议（TCP、UDP)，取值范围为1&#x60;~&#x60;65535，若规则限定协议为非传输层协议（ICMP协议），恒为0。使用正斜线（/）隔开起始端口和终止端口，例如：1024/1055表示端口范围为1024&#x60;~&#x60;1055。\n\n      * @param {string} [opts.remark] - 防火墙规则的备注, 不超过100个字符\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string firewallId\n      */\n\n  modifyFirewallRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyFirewallRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyFirewallRule\"\n      )\n    }\n    if (opts.ruleId === undefined || opts.ruleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleId' when calling modifyFirewallRule\"\n      )\n    }\n    if (opts.sourceAddress === undefined || opts.sourceAddress === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sourceAddress' when calling modifyFirewallRule\"\n      )\n    }\n    if (opts.ruleProtocol === undefined || opts.ruleProtocol === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleProtocol' when calling modifyFirewallRule\"\n      )\n    }\n    if (opts.port === undefined || opts.port === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.port' when calling modifyFirewallRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.ruleId !== undefined && opts.ruleId !== null) {\n      postBody['ruleId'] = opts.ruleId\n    }\n    if (opts.sourceAddress !== undefined && opts.sourceAddress !== null) {\n      postBody['sourceAddress'] = opts.sourceAddress\n    }\n    if (opts.ruleProtocol !== undefined && opts.ruleProtocol !== null) {\n      postBody['ruleProtocol'] = opts.ruleProtocol\n    }\n    if (opts.port !== undefined && opts.port !== null) {\n      postBody['port'] = opts.port\n    }\n    if (opts.remark !== undefined && opts.remark !== null) {\n      postBody['remark'] = opts.remark\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyFirewallRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/firewallRule',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定轻量应用云主机的一条防火墙规则。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 指定的轻量应用云主机的实例ID\n\n      * @param {string} opts.ruleId - 防火墙规则ID\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteFirewallRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteFirewallRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteFirewallRule\"\n      )\n    }\n    if (opts.ruleId === undefined || opts.ruleId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleId' when calling deleteFirewallRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.ruleId !== undefined && opts.ruleId !== null) {\n      queryParams['ruleId'] = opts.ruleId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteFirewallRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/firewallRule',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  DescribeImages 查询指定地域下一个或多个镜像信息Image 模型。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.imageIds] - 镜像ID, &#x60;[\\&quot;img-m5s0****29\\&quot;, \\&quot;img-m5s0****30\\&quot;]&#x60;, json array 字串。\n  optional\n      * @param {string} [opts.imageType] - 镜像类型。 可能取值：system, app, custom, 如果imageIds不传时，此项为必传。\n  optional\n      * @param {string} [opts.platform] - 根据镜像的操作系统发行版查询。\n取值范围：&#x60;Ubuntu、CentOS、Windows Server&#x60;。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param image images\n      */\n\n  describeImages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeImages\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.imageIds !== undefined && opts.imageIds !== null) {\n      queryParams['imageIds'] = opts.imageIds\n    }\n    if (opts.imageType !== undefined && opts.imageType !== null) {\n      queryParams['imageType'] = opts.imageType\n    }\n    if (opts.platform !== undefined && opts.platform !== null) {\n      queryParams['platform'] = opts.platform\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeImages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建自定义镜像。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 指定的轻量应用云主机的实例ID\n\n      * @param {string} opts.imageName - 自定义镜像名称\n\n      * @param {string} [opts.description] - 镜像描述信息\n  optional\n      * @param {string} [opts.clientToken] - 用于保证请求的幂等性。由客户端生成，并确保不同请求中该参数唯一，长度不能超过64个字符。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string imageId\n      */\n\n  createCustomImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createCustomImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createCustomImage\"\n      )\n    }\n    if (opts.imageName === undefined || opts.imageName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageName' when calling createCustomImage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.imageName !== undefined && opts.imageName !== null) {\n      postBody['imageName'] = opts.imageName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCustomImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除自定义镜像。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageId - 自定义镜像ID\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCustomImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteCustomImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling deleteCustomImage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageId: opts.imageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCustomImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images/{imageId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改镜像属性。\n详细操作说明请参考帮助文档：[镜像概述](https://docs.jdcloud.com/cn/virtual-machines/image-overview)\n## 接口说明\n- 只支持修改镜像名称或描述。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageId - 自定义镜像ID\n      * @param {string} [opts.name] - 镜像名称。参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。  optional\n      * @param {string} [opts.description] - 镜像描述。参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyImageAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyImageAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling modifyImageAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageId: opts.imageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyImageAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images/{imageId}:modifyImageAttribute',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询轻量应用云主机列表。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.instanceIds] - 轻量应用云主机的实例ID, &#x60;[\\&quot;lavm-xxx\\&quot;, \\&quot;lavm-yyy\\&quot;]&#x60;, json array 字串\n  optional\n      * @param {string} [opts.chargeType] - 实例的计费方式, 目前只支持且默认值prepaid_by_duration, 包年包月,\n  optional\n      * @param {string} [opts.publicIpAddresses] - 轻量应用云主机的公网IP, 例如: &#x60;[\\&quot;114.1.x.y\\&quot;, \\&quot;114.2.x.z\\&quot;]&#x60;, json array 字串\n  optional\n      * @param {string} [opts.names] - 轻量应用云主机的实例名称, 支持模糊搜索, 例如: &#x60;[\\&quot;instanceName-1\\&quot;, \\&quot;instanceName-2\\&quot;]&#x60;, json array 字串\n  optional\n      * @param {integer} [opts.pageNumber] - 页码；默认为1。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；&lt;br&gt;默认为20；取值范围[10, 100]。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instances\n      * @param integer totalCount  本次查询可匹配到的总记录数，使用者需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceIds !== undefined && opts.instanceIds !== null) {\n      queryParams['instanceIds'] = opts.instanceIds\n    }\n    if (opts.chargeType !== undefined && opts.chargeType !== null) {\n      queryParams['chargeType'] = opts.chargeType\n    }\n    if (\n      opts.publicIpAddresses !== undefined &&\n      opts.publicIpAddresses !== null\n    ) {\n      queryParams['publicIpAddresses'] = opts.publicIpAddresses\n    }\n    if (opts.names !== undefined && opts.names !== null) {\n      queryParams['names'] = opts.names\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一台或多台轻量应用云主机。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageId - 镜像ID\n\n      * @param {string} opts.planId - 套餐ID\n\n      * @param {string} [opts.chargeUnit] - 购买资源的时长单位，取值为&quot;day&quot;或&quot;month&quot;，默认按月&quot;month&quot;\n  optional\n      * @param {integer} opts.period - 购买资源的时长, 默认按月计ChargeUnit&#x3D;&quot;month&quot;。ChargeUnit&#x3D;&quot;month&quot;时，取值1到9，12，24，36个月，即{1-9,12,24,36}；ChargeUnit&#x3D;&quot;day&quot;时，取值1到30天，即{1-30}\n\n      * @param {boolean} [opts.autoRenew] - 是否开启到期自动续费\n  optional\n      * @param {integer} [opts.amount] - 创建轻量应用云主机的数量\n  optional\n      * @param {string} [opts.name] - 实例名称。长度最长128个字符，只允许中文、数字、大小写字母、英文下划线（\\_）、连字符（-）及点（.），不能以（.）作为首尾。\n  optional\n      * @param {string} [opts.chargeType] - 计费方式。取值：prepaid_by_duration, 目前仅支持包年包月计费方式。\n  optional\n      * @param {string} [opts.clientToken] - 用于保证请求的幂等性。由客户端生成，并确保不同请求中该参数唯一，长度不能超过64个字符。\n  optional\n      * @param {string} [opts.password] - 实例密码。可用于SSH登录和VNC登录。长度为8\\~30个字符，必须同时包含大、小写英文字母、数字和特殊符号中的三类字符。特殊符号包括：\\(\\)\\&#x60;~!@#$%^&amp;\\*\\_-+&#x3D;\\|{}\\[ ]:&quot;;&#39;&lt;&gt;,.?/，\n如指定密钥，则密码不会生成注入，否则即使不指定密码系统也将默认自动生成随机密码，并以短信和邮件通知。\n  optional\n      * @param {array} [opts.keyNames] - 密钥对名称。仅Linux系统下该参数生效，当前仅支持输入单个密钥。\n  optional\n      * @param {string} [opts.passwordAuth] - 密码授权，若存在密匙，则根据此参数决定是否使用密码，若没有密匙，此参数无效，会强制使用密码。\n若不使用密码，且密匙对解绑后，用户需重置密码，方可使用密码登录。\n此参数在windows系统中必须为yes。\n  optional\n      * @param {string} [opts.buyScenario] - 产品线统一活动凭证JSON字符串，需要BASE64编码，目前要求编码前格式为 {&quot;activity&quot;:{&quot;activityType&quot;:必填字段, &quot;activityIdentifier&quot;:必填字段}}  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceIds\n      */\n\n  createInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling createInstances\"\n      )\n    }\n    if (opts.planId === undefined || opts.planId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.planId' when calling createInstances\"\n      )\n    }\n    if (opts.period === undefined || opts.period === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.period' when calling createInstances\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.imageId !== undefined && opts.imageId !== null) {\n      postBody['imageId'] = opts.imageId\n    }\n    if (opts.planId !== undefined && opts.planId !== null) {\n      postBody['planId'] = opts.planId\n    }\n    if (opts.chargeUnit !== undefined && opts.chargeUnit !== null) {\n      postBody['chargeUnit'] = opts.chargeUnit\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      postBody['period'] = opts.period\n    }\n    if (opts.autoRenew !== undefined && opts.autoRenew !== null) {\n      postBody['autoRenew'] = opts.autoRenew\n    }\n    if (opts.amount !== undefined && opts.amount !== null) {\n      postBody['amount'] = opts.amount\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.chargeType !== undefined && opts.chargeType !== null) {\n      postBody['chargeType'] = opts.chargeType\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.password !== undefined && opts.password !== null) {\n      postBody['password'] = opts.password\n    }\n    if (opts.keyNames !== undefined && opts.keyNames !== null) {\n      postBody['keyNames'] = opts.keyNames\n    }\n    if (opts.passwordAuth !== undefined && opts.passwordAuth !== null) {\n      postBody['passwordAuth'] = opts.passwordAuth\n    }\n    if (opts.buyScenario !== undefined && opts.buyScenario !== null) {\n      postBody['buyScenario'] = opts.buyScenario\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动轻量应用云主机。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 轻量应用云主机的实例ID\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling startInstance\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:startInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止轻量应用云主机。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 轻量应用云主机的实例ID\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling stopInstance\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:stopInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重启轻量应用云主机。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 轻量应用云主机的实例ID\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  rebootInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  rebootInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling rebootInstance\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call rebootInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:rebootInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取lavm 实例，vnc url\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 轻量应用云主机的实例ID\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string vncUrl  lavm实例的vnc url\n      */\n\n  describeInstanceVncUrl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceVncUrl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceVncUrl\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceVncUrl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/vnc',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  轻量应用云主机重置系统。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 轻量应用云主机的实例ID\n\n      * @param {string} [opts.imageId] - 目标镜像ID\n  optional\n      * @param {array} [opts.keyNames] - 密钥对名称。仅Linux系统下该参数生效，当前仅支持输入单个密钥。\n  optional\n      * @param {string} [opts.password] - 密码\n  optional\n      * @param {string} [opts.passwordAuth] - 密码授权，若存在密匙，则根据此参数决定是否使用密码，若没有密匙，此参数无效，会强制使用密码。\n若不使用密码，且密匙对解绑后，用户需重置密码，方可使用密码登录。\n此参数在windows系统中必须为yes。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resetSystem (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resetSystem\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling resetSystem\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.imageId !== undefined && opts.imageId !== null) {\n      postBody['imageId'] = opts.imageId\n    }\n    if (opts.keyNames !== undefined && opts.keyNames !== null) {\n      postBody['keyNames'] = opts.keyNames\n    }\n    if (opts.password !== undefined && opts.password !== null) {\n      postBody['password'] = opts.password\n    }\n    if (opts.passwordAuth !== undefined && opts.passwordAuth !== null) {\n      postBody['passwordAuth'] = opts.passwordAuth\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resetSystem with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:resetSystem',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改轻量应用云主机的属性信息。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 轻量应用云主机的实例ID\n\n      * @param {string} [opts.password] - 新的服务器密码\n  optional\n      * @param {string} [opts.instanceName] - 服务器名称\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateInstanceAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateInstanceAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling updateInstanceAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.password !== undefined && opts.password !== null) {\n      postBody['password'] = opts.password\n    }\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateInstanceAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:updateInstanceAttribute',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询当前实例可升级套餐列表。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 轻量应用云主机的实例ID\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param plan plans\n      */\n\n  describePlansCanUpgrade (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePlansCanUpgrade\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describePlansCanUpgrade\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePlansCanUpgrade with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describePlansCanUpgrade',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  升级轻量应用云主机。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 轻量应用云主机的实例ID\n\n      * @param {string} opts.planId - 轻量应用云主机方案ID\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  upgradeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  upgradeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling upgradeInstance\"\n      )\n    }\n    if (opts.planId === undefined || opts.planId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.planId' when calling upgradeInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.planId !== undefined && opts.planId !== null) {\n      postBody['planId'] = opts.planId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call upgradeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:upgradeInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询轻量应用云主机详情。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 轻量应用云主机的实例ID\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instance  lavm实例详情\n      */\n\n  describeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个或多个实例流量包详细信息。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.instanceIds] - 轻量应用云主机的实例ID, &#x60;[&quot;lavm-xxx&quot;, &quot;lavm-yyy&quot;]&#x60;, json array 字串\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceTrafficPackageUsage instanceTrafficPackageUsages\n      */\n\n  describeInstancesTrafficPackages (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstancesTrafficPackages\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.instanceIds, 'instanceIds')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstancesTrafficPackages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instancesTrafficPackages',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为轻量云主机绑定域名。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 轻量云主机的实例ID。\n\n      * @param {array} [opts.domainNames] - 域名名称，最多20个，例如: &#x60;[\\&quot;name-1\\&quot;, \\&quot;name-2\\&quot;]&#x60;, json array 字串。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  associateDomains (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateDomains\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling associateDomains\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domainNames !== undefined && opts.domainNames !== null) {\n      postBody['domainNames'] = opts.domainNames\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateDomains with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:associateDomains',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为轻量云主机解绑域名。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 轻量云主机的实例ID。\n\n      * @param {array} [opts.domainNames] - 域名名称，最多20个，例如: &#x60;[\\&quot;name-1\\&quot;, \\&quot;name-2\\&quot;]&#x60;, json array 字串。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disassociateDomains (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateDomains\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disassociateDomains\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.domainNames !== undefined && opts.domainNames !== null) {\n      postBody['domainNames'] = opts.domainNames\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateDomains with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:disassociateDomains',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名接口\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.domainNames] - 域名名称。支持模糊搜索，最多20个，例如: &#x60;[\\&quot;name-1\\&quot;, \\&quot;name-2\\&quot;]&#x60;, json array 字串。\n  optional\n      * @param {integer} [opts.pageNumber] - 页码；默认为1。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；&lt;br&gt;默认为20；取值范围[10, 100]。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceDomain domains\n      * @param integer totalCount  本次查询可匹配到的总记录数，使用者需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      */\n\n  describeDomains (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDomains\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainNames !== undefined && opts.domainNames !== null) {\n      queryParams['domainNames'] = opts.domainNames\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDomains with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceDomains',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n批量查询密钥对。\n\n详细操作说明请参考帮助文档：[密钥概述](https://docs.jdcloud.com/cn/virtual-machines/keypair-overview)\n\n## 接口说明\n- 使用 &#x60;filters&#x60; 过滤器进行条件筛选，每个 &#x60;filter&#x60; 之间的关系为逻辑与（AND）的关系。\n- 单次查询最大可查询100条密钥数据。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；&lt;br&gt;默认为20；取值范围[10, 100]。  optional\n      * @param {filter} [opts.filters] - &lt;b&gt;filters 中支持使用以下关键字进行过滤&lt;/b&gt;\n&#x60;keyNames&#x60;: 密钥对名称，精确匹配，支持多个。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param keypair keypairs\n      * @param number totalCount  本次查询可匹配到的总记录数，使用者需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      */\n\n  describeKeypairs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeKeypairs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeKeypairs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n创建密钥。\n\n公钥和私钥都由京东云生成，公钥保存在京东云，私钥返回给用户，由用户保存。\n\n详细操作说明请参考帮助文档：[创建密钥](https://docs.jdcloud.com/cn/virtual-machines/create-keypair)\n\n## 接口说明\n- 调用该接口创建密钥后，公钥部分存储在京东云，并返回未加密的 &#x60;PEM&#x60; 编码的 &#x60;PKCS#8&#x60; 格式私钥，您只有一次机会保存您的私钥。请妥善保管。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyName - 密钥对名称，需要全局唯一。\n只允许数字、大小写字母、下划线“_”及中划线“-”，不超过32个字符。\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string keyName  密钥对名称。\n      * @param string serviceCode  产品线。\n      * @param string privateKey  密钥对的私钥部分，&#x60;PEM PKCS#8&#x60; 格式。\n      * @param string keyFingerprint  密钥对的指纹，根据 &#x60;RFC4716&#x60; 定义的公钥指纹格式，采用 &#x60;MD5&#x60; 信息摘要算法。\n      */\n\n  createKeypair (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createKeypair\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keyName === undefined || opts.keyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyName' when calling createKeypair\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.keyName !== undefined && opts.keyName !== null) {\n      postBody['keyName'] = opts.keyName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createKeypair with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n导入密钥。\n\n与创建密钥不同的是，导入的密钥是由用户生成的。生成之后将公钥部分导入到京东云。\n\n详细操作说明请参考帮助文档：[创建密钥](https://docs.jdcloud.com/cn/virtual-machines/create-keypair)\n\n## 接口说明\n- 调用该接口导入由其他工具生成的密钥对的公钥部分。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyName - 密钥对名称，需要全局唯一。\n只允许数字、大小写字母、下划线“_”及中划线“-”，不超过32个字符。\n\n      * @param {string} opts.publicKey - 密钥对的公钥部分。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string keyName  密钥对名称。\n      * @param string keyFingerprint  密钥对的指纹，根据 &#x60;RFC4716&#x60; 定义的公钥指纹格式，采用 &#x60;MD5&#x60; 信息摘要算法。\n      */\n\n  importKeypair (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  importKeypair\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keyName === undefined || opts.keyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyName' when calling importKeypair\"\n      )\n    }\n    if (opts.publicKey === undefined || opts.publicKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publicKey' when calling importKeypair\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.keyName !== undefined && opts.keyName !== null) {\n      postBody['keyName'] = opts.keyName\n    }\n    if (opts.publicKey !== undefined && opts.publicKey !== null) {\n      postBody['publicKey'] = opts.publicKey\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call importKeypair with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs:import',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n删除密钥。\n\n详细操作说明请参考帮助文档：[删除密钥](https://docs.jdcloud.com/cn/virtual-machines/delete-keypair)\n\n## 接口说明\n- 密钥删除后，使用该密钥的实例仍可正常使用与之匹配的本地私钥登录，且密钥仍会显示在实例详情中。\n- 密钥删除后，与之关联的实例模板将变为不可用，并且与该实例模板关联的高可用组也会变为不可用。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyName - 密钥名称。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteKeypair (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteKeypair\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keyName === undefined || opts.keyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyName' when calling deleteKeypair\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      keyName: opts.keyName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteKeypair with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs/{keyName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n为云主机实例绑定密钥。\n\n详细操作说明请参考帮助文档：[绑定密钥](https://docs.jdcloud.com/cn/virtual-machines/bind-keypair)\n\n## 接口说明\n- 只支持为 linux 云主机实例绑定密钥。\n- 每台云主机实例只支持绑定一个密钥。如果云主机绑定的密钥被删除了，那么该云主机还可以再次绑定密钥。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyName - 密钥名称。\n      * @param {array} [opts.instanceIds] - 要绑定的云主机Id列表。  optional\n      * @param {string} opts.passwordAuth - 绑定密钥后，根据此参数决定是否允许使用密码登录。可选范围：\n&#x60;yes&#x60;：允许SSH密码登录。\n&#x60;no&#x60;：禁止SSH密码登录。\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string successInstanceId\n      * @param string failInstanceId\n      */\n\n  attachKeypair (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  attachKeypair\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keyName === undefined || opts.keyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyName' when calling attachKeypair\"\n      )\n    }\n    if (opts.passwordAuth === undefined || opts.passwordAuth === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.passwordAuth' when calling attachKeypair\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceIds !== undefined && opts.instanceIds !== null) {\n      postBody['instanceIds'] = opts.instanceIds\n    }\n    if (opts.passwordAuth !== undefined && opts.passwordAuth !== null) {\n      postBody['passwordAuth'] = opts.passwordAuth\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      keyName: opts.keyName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call attachKeypair with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs/{keyName}:attach',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n为云主机实例解绑密钥。\n\n详细操作说明请参考帮助文档：[绑定密钥](https://docs.jdcloud.com/cn/virtual-machines/bind-keypair)\n\n## 接口说明\n- 调用该接口解绑云主机实例中的密钥。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyName - 密钥名称。\n      * @param {array} [opts.instanceIds] - 要解绑的云主机实例ID列表。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string successInstanceId\n      * @param string failInstanceId\n      */\n\n  detachKeypair (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  detachKeypair\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keyName === undefined || opts.keyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyName' when calling detachKeypair\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceIds !== undefined && opts.instanceIds !== null) {\n      postBody['instanceIds'] = opts.instanceIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      keyName: opts.keyName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call detachKeypair with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs/{keyName}:detach',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定地域下轻量应用云主机所有的套餐信息。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.classification] - 套餐分类：通用型套餐（字段：universal）、存储型套餐（字段：storage）、企业型套餐（字段：enterprise）\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param plan plans\n      */\n\n  describePlans (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePlans\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.classification !== undefined && opts.classification !== null) {\n      queryParams['classification'] = opts.classification\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePlans with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/plans',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定地域下轻量应用云主机套餐信息是否售罄\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.planIds - 方案Ids, jsonArray的string 例如 &#x60;[\\&quot;plan-id1\\&quot;, \\&quot;plan-id2\\&quot;]&#x60;\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object statusMap  方案是否售罄map\n  key: planId,  value: true 售罄 , false 可售\n\n      */\n\n  describePlansSoldOutStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePlansSoldOutStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.planIds === undefined || opts.planIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.planIds' when calling describePlansSoldOutStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.planIds !== undefined && opts.planIds !== null) {\n      queryParams['planIds'] = opts.planIds\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePlansSoldOutStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describePlansSoldOutStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询资源配额。\n      * @param {Object} opts - parameters\n      * @param {array} [opts.resourceTypes] - 资源名列表，可取值:\ngeneral_instance 通用型套餐实例\ncustom_image 自定义镜像\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quotas\n      */\n\n  queryQuota (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryQuota\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.resourceTypes !== undefined && opts.resourceTypes !== null) {\n      postBody['resourceTypes'] = opts.resourceTypes\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lavm/1.3.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryQuota with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/quotas',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = LAVM\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/lb/v1/lb.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Forwarding-Rules-Group\n * 转发规则组相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'lb'\nService._services[serviceId] = true\n\n/**\n * lb service.\n * @version 0.6.6\n */\n\nclass LB extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'lb.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询后端服务列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - backendIds - 后端服务Id列表，支持多个\nbackendNames - 后端服务名字列表，支持多个\nloadBalancerId - 负载均衡器Id，支持单个\nagId - 可用性组Id，支持单个\nloadBalancerType - 负载均衡类型，取值为：alb、nlb、dnlb，默认alb，支持单个\nprotocol - 后端服务的协议【alb】支持Http、Tcp和Udp，【nlb】支持Tcp、Udp，【dnlb】支持Tcp、Udp，默认查询所有，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param backend backends\n      * @param integer totalCount  总数量\n      */\n\n  describeBackends (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackends\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackends with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backends/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个后端服务\n      * @param {Object} opts - parameters\n      * @param {string} opts.backendName - 后端服务名字,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符\n      * @param {string} opts.loadBalancerId - 后端服务所属负载均衡的Id\n      * @param {string} opts.protocol - 后端服务的协议 &lt;br&gt;【alb】取值范围：Http、Tcp、Udp &lt;br&gt;【nlb】取值范围：Tcp、Udp &lt;br&gt;【dnlb】取值范围：Tcp、Udp\n      * @param {integer} opts.port - 后端服务的端口，取值范围为[1, 65535]，如指定了TargetSpec中的port，实际按照target指定的port进行转发\n      * @param {healthCheckSpec} opts.healthCheckSpec - 健康检查信息\n      * @param {string} [opts.algorithm] - 调度算法 &lt;br&gt;【alb,nlb】取值范围为[IpHash, RoundRobin, LeastConn]（取值范围的含义：加权源Ip哈希，加权轮询和加权最小连接），alb和nlb默认为加权轮询 &lt;br&gt;【dnlb】取值范围为[IpHash, QuintupleHash]（取值范围的含义分别为：加权源Ip哈希和加权五元组哈希），dnlb默认为加权源Ip哈希  optional\n      * @param {array} [opts.targetGroupIds] - 虚拟服务器组的Id列表，目前只支持一个，且与agIds不能同时存在  optional\n      * @param {array} [opts.agIds] - 高可用组的Id列表，目前只支持一个，且与targetGroupIds不能同时存在  optional\n      * @param {array} [opts.agInfoSpec] - 高可用组属性设置:1.defatult_weight:默认权重, 优先级 agInfoSpec &gt; agIds  optional\n      * @param {boolean} [opts.proxyProtocol] - 【alb Tcp、Udp协议】获取真实ip, 取值为False(不获取)或者True(获取,支持Proxy Protocol v1版本)，默认为False  optional\n      * @param {string} [opts.description] - 描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {boolean} [opts.sessionStickiness] - 会话保持, 取值为false(不开启)或者true(开启)，默认为false &lt;br&gt;【alb Http协议，RoundRobin算法】支持基于cookie的会话保持 &lt;br&gt;【nlb】支持基于报文源目的IP的会话保持  optional\n      * @param {integer} [opts.sessionStickyTimeout] - 【nlb】会话保持超时时间，sessionStickiness开启时生效，默认300s, 取值范围[1-3600]  optional\n      * @param {integer} [opts.connectionDrainingSeconds] - 【nlb】连接耗尽超时。移除target前，连接的最大保持时间，默认300s，取值范围[0-3600]  optional\n      * @param {integer} [opts.httpCookieExpireSeconds] - 【alb Http协议】cookie的过期时间,sessionStickiness开启时生效，取值范围为[0-86400], 默认为0（表示cookie与浏览器同生命周期）  optional\n      * @param {boolean} [opts.httpForwardedProtocol] - 【alb Http协议】获取负载均衡的协议, 取值为False(不获取)或True(获取), 默认为False  optional\n      * @param {boolean} [opts.httpForwardedPort] - 【alb Http协议】获取负载均衡的端口, 取值为False(不获取)或True(获取), 默认为False  optional\n      * @param {boolean} [opts.httpForwardedHost] - 【alb Http协议】获取负载均衡的host信息, 取值为False(不获取)或True(获取), 默认为False  optional\n      * @param {boolean} [opts.httpForwardedVip] - 【alb Http协议】获取负载均衡的vip, 取值为False(不获取)或True(获取), 默认为False  optional\n      * @param {boolean} [opts.httpForwardedClientPort] - 【alb Http协议】获取请求端使用的端口, 取值为False(不获取)或True(获取), 默认为False  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string backendId  后端服务id\n      */\n\n  createBackend (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBackend\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backendName === undefined || opts.backendName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backendName' when calling createBackend\"\n      )\n    }\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling createBackend\"\n      )\n    }\n    if (opts.protocol === undefined || opts.protocol === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.protocol' when calling createBackend\"\n      )\n    }\n    if (opts.port === undefined || opts.port === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.port' when calling createBackend\"\n      )\n    }\n    if (opts.healthCheckSpec === undefined || opts.healthCheckSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.healthCheckSpec' when calling createBackend\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.backendName !== undefined && opts.backendName !== null) {\n      postBody['backendName'] = opts.backendName\n    }\n    if (opts.loadBalancerId !== undefined && opts.loadBalancerId !== null) {\n      postBody['loadBalancerId'] = opts.loadBalancerId\n    }\n    if (opts.protocol !== undefined && opts.protocol !== null) {\n      postBody['protocol'] = opts.protocol\n    }\n    if (opts.port !== undefined && opts.port !== null) {\n      postBody['port'] = opts.port\n    }\n    if (opts.healthCheckSpec !== undefined && opts.healthCheckSpec !== null) {\n      postBody['healthCheckSpec'] = opts.healthCheckSpec\n    }\n    if (opts.algorithm !== undefined && opts.algorithm !== null) {\n      postBody['algorithm'] = opts.algorithm\n    }\n    if (opts.targetGroupIds !== undefined && opts.targetGroupIds !== null) {\n      postBody['targetGroupIds'] = opts.targetGroupIds\n    }\n    if (opts.agIds !== undefined && opts.agIds !== null) {\n      postBody['agIds'] = opts.agIds\n    }\n    if (opts.agInfoSpec !== undefined && opts.agInfoSpec !== null) {\n      postBody['agInfoSpec'] = opts.agInfoSpec\n    }\n    if (opts.proxyProtocol !== undefined && opts.proxyProtocol !== null) {\n      postBody['proxyProtocol'] = opts.proxyProtocol\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (\n      opts.sessionStickiness !== undefined &&\n      opts.sessionStickiness !== null\n    ) {\n      postBody['sessionStickiness'] = opts.sessionStickiness\n    }\n    if (\n      opts.sessionStickyTimeout !== undefined &&\n      opts.sessionStickyTimeout !== null\n    ) {\n      postBody['sessionStickyTimeout'] = opts.sessionStickyTimeout\n    }\n    if (\n      opts.connectionDrainingSeconds !== undefined &&\n      opts.connectionDrainingSeconds !== null\n    ) {\n      postBody['connectionDrainingSeconds'] = opts.connectionDrainingSeconds\n    }\n    if (\n      opts.httpCookieExpireSeconds !== undefined &&\n      opts.httpCookieExpireSeconds !== null\n    ) {\n      postBody['httpCookieExpireSeconds'] = opts.httpCookieExpireSeconds\n    }\n    if (\n      opts.httpForwardedProtocol !== undefined &&\n      opts.httpForwardedProtocol !== null\n    ) {\n      postBody['httpForwardedProtocol'] = opts.httpForwardedProtocol\n    }\n    if (\n      opts.httpForwardedPort !== undefined &&\n      opts.httpForwardedPort !== null\n    ) {\n      postBody['httpForwardedPort'] = opts.httpForwardedPort\n    }\n    if (\n      opts.httpForwardedHost !== undefined &&\n      opts.httpForwardedHost !== null\n    ) {\n      postBody['httpForwardedHost'] = opts.httpForwardedHost\n    }\n    if (opts.httpForwardedVip !== undefined && opts.httpForwardedVip !== null) {\n      postBody['httpForwardedVip'] = opts.httpForwardedVip\n    }\n    if (\n      opts.httpForwardedClientPort !== undefined &&\n      opts.httpForwardedClientPort !== null\n    ) {\n      postBody['httpForwardedClientPort'] = opts.httpForwardedClientPort\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBackend with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backends/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询后端服务详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.backendId - Backend Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param backend backend  后端服务的信息\n      */\n\n  describeBackend (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackend\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backendId === undefined || opts.backendId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backendId' when calling describeBackend\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backendId: opts.backendId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackend with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backends/{backendId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改一个后端服务的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.backendId - Backend Id\n      * @param {string} [opts.backendName] - 后端服务名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符  optional\n      * @param {healthCheckSpec} [opts.healthCheckSpec] - 健康检查信息  optional\n      * @param {string} [opts.algorithm] - 调度算法 &lt;br&gt;【alb,nlb】取值范围为[IpHash, RoundRobin, LeastConn]（含义分别为：加权源Ip哈希，加权轮询和加权最小连接） &lt;br&gt;【dnlb】取值范围为[IpHash, QuintupleHash]（含义分别为：加权源Ip哈希和加权五元组哈希）  optional\n      * @param {array} [opts.targetGroupIds] - 虚拟服务器组的Id列表，目前只支持一个，且与agIds不能同时存在  optional\n      * @param {array} [opts.agIds] - 高可用组的Id列表，目前只支持一个，且与targetGroupIds不能同时存在  optional\n      * @param {array} [opts.agInfoSpec] - 高可用组属性设置:1.defatult_weight:默认权重, 优先级 agInfoSpec &gt; agIds  optional\n      * @param {boolean} [opts.proxyProtocol] - 【alb Tcp、Udp协议】是否启用Proxy ProtocolV1协议获取真实源ip, 取值为false(不开启)或者true(开启), 默认为false  optional\n      * @param {string} [opts.description] - 描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {boolean} [opts.sessionStickiness] - 会话保持, 取值为false(不开启)或者true(开启)，默认为false &lt;br&gt;【alb Http协议，RoundRobin算法】支持基于cookie的会话保持 &lt;br&gt;【nlb】支持基于报文源目的IP的会话保持  optional\n      * @param {integer} [opts.sessionStickyTimeout] - 【nlb】会话保持超时时间，sessionStickiness开启时生效, 取值范围[1-3600]  optional\n      * @param {integer} [opts.connectionDrainingSeconds] - 【nlb】连接耗尽超时，移除target前，连接的最大保持时间，默认300s，取值范围[0-3600]  optional\n      * @param {integer} [opts.httpCookieExpireSeconds] - 【alb Http协议】cookie的过期时间,sessionStickiness开启时生效，取值范围为[0-86400], 0表示cookie与浏览器同生命周期  optional\n      * @param {boolean} [opts.httpForwardedProtocol] - 【alb Http协议】获取负载均衡的协议, 取值为False(不获取)或True(获取)  optional\n      * @param {boolean} [opts.httpForwardedPort] - 【alb Http协议】获取负载均衡的端口, 取值为False(不获取)或True(获取)  optional\n      * @param {boolean} [opts.httpForwardedHost] - 【alb Http协议】获取负载均衡的host信息, 取值为False(不获取)或True(获取)  optional\n      * @param {boolean} [opts.httpForwardedVip] - 【alb Http协议】获取负载均衡的vip, 取值为False(不获取)或True(获取)  optional\n      * @param {boolean} [opts.httpForwardedClientPort] - 【alb Http协议】获取请求端使用的端口, 取值为False(不获取)或True(获取)  optional\n      * @param {boolean} [opts.closeHealthCheck] - 【alb,dnlb】关闭健康检查，取值为false(不关闭)或true(关闭)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateBackend (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateBackend\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backendId === undefined || opts.backendId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backendId' when calling updateBackend\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.backendName !== undefined && opts.backendName !== null) {\n      postBody['backendName'] = opts.backendName\n    }\n    if (opts.healthCheckSpec !== undefined && opts.healthCheckSpec !== null) {\n      postBody['healthCheckSpec'] = opts.healthCheckSpec\n    }\n    if (opts.algorithm !== undefined && opts.algorithm !== null) {\n      postBody['algorithm'] = opts.algorithm\n    }\n    if (opts.targetGroupIds !== undefined && opts.targetGroupIds !== null) {\n      postBody['targetGroupIds'] = opts.targetGroupIds\n    }\n    if (opts.agIds !== undefined && opts.agIds !== null) {\n      postBody['agIds'] = opts.agIds\n    }\n    if (opts.agInfoSpec !== undefined && opts.agInfoSpec !== null) {\n      postBody['agInfoSpec'] = opts.agInfoSpec\n    }\n    if (opts.proxyProtocol !== undefined && opts.proxyProtocol !== null) {\n      postBody['proxyProtocol'] = opts.proxyProtocol\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (\n      opts.sessionStickiness !== undefined &&\n      opts.sessionStickiness !== null\n    ) {\n      postBody['sessionStickiness'] = opts.sessionStickiness\n    }\n    if (\n      opts.sessionStickyTimeout !== undefined &&\n      opts.sessionStickyTimeout !== null\n    ) {\n      postBody['sessionStickyTimeout'] = opts.sessionStickyTimeout\n    }\n    if (\n      opts.connectionDrainingSeconds !== undefined &&\n      opts.connectionDrainingSeconds !== null\n    ) {\n      postBody['connectionDrainingSeconds'] = opts.connectionDrainingSeconds\n    }\n    if (\n      opts.httpCookieExpireSeconds !== undefined &&\n      opts.httpCookieExpireSeconds !== null\n    ) {\n      postBody['httpCookieExpireSeconds'] = opts.httpCookieExpireSeconds\n    }\n    if (\n      opts.httpForwardedProtocol !== undefined &&\n      opts.httpForwardedProtocol !== null\n    ) {\n      postBody['httpForwardedProtocol'] = opts.httpForwardedProtocol\n    }\n    if (\n      opts.httpForwardedPort !== undefined &&\n      opts.httpForwardedPort !== null\n    ) {\n      postBody['httpForwardedPort'] = opts.httpForwardedPort\n    }\n    if (\n      opts.httpForwardedHost !== undefined &&\n      opts.httpForwardedHost !== null\n    ) {\n      postBody['httpForwardedHost'] = opts.httpForwardedHost\n    }\n    if (opts.httpForwardedVip !== undefined && opts.httpForwardedVip !== null) {\n      postBody['httpForwardedVip'] = opts.httpForwardedVip\n    }\n    if (\n      opts.httpForwardedClientPort !== undefined &&\n      opts.httpForwardedClientPort !== null\n    ) {\n      postBody['httpForwardedClientPort'] = opts.httpForwardedClientPort\n    }\n    if (opts.closeHealthCheck !== undefined && opts.closeHealthCheck !== null) {\n      postBody['closeHealthCheck'] = opts.closeHealthCheck\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backendId: opts.backendId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateBackend with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backends/{backendId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一个后端服务\n      * @param {Object} opts - parameters\n      * @param {string} opts.backendId - Backend Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteBackend (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBackend\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backendId === undefined || opts.backendId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backendId' when calling deleteBackend\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backendId: opts.backendId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBackend with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backends/{backendId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询后端服务下的target的健康状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.backendId - Backend Id\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1,取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认返回全部，取值范围：[10,100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param targetHealth targetHealths\n      * @param integer totalCount  总数量\n      */\n\n  describeTargetHealth (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTargetHealth\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backendId === undefined || opts.backendId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backendId' when calling describeTargetHealth\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      backendId: opts.backendId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTargetHealth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backends/{backendId}/health',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改后端服务-高可用组(ag)下target信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.backendId - Backend Id\n      * @param {array} opts.targetUpdateSpecs - 修改ag target信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateAgTargets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateAgTargets\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backendId === undefined || opts.backendId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backendId' when calling updateAgTargets\"\n      )\n    }\n    if (\n      opts.targetUpdateSpecs === undefined ||\n      opts.targetUpdateSpecs === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetUpdateSpecs' when calling updateAgTargets\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.targetUpdateSpecs !== undefined &&\n      opts.targetUpdateSpecs !== null\n    ) {\n      postBody['targetUpdateSpecs'] = opts.targetUpdateSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backendId: opts.backendId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateAgTargets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backends/{backendId}:updateAgTargets',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 后端服务-高可用组 Target列表详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.backendId - Backend Id\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - weight - 权重, 支持多个\ntargetIds - Target ID列表，支持多个\ninstanceId - Instance ID,仅支持单个\nipAddress - ip地址,仅支持单个\n  optional\n      * @param {sort} [opts.sorts] - createdTime - 默认值,默认按 createdTime 倒序\nweight - 权重值\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param agTarget targets\n      * @param integer totalCount  总数量\n      */\n\n  describeAgTargets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAgTargets\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backendId === undefined || opts.backendId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backendId' when calling describeAgTargets\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId,\n      backendId: opts.backendId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAgTargets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backends/{backendId}/agTargets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询个性化配置列表详情\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - customizedConfigurationIds - 个性化配置ID，支持多个\ncustomizedConfigurationNames - 个性化配置名称，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param customizedConfiguration customizedConfigurations\n      * @param integer totalCount  总数量\n      */\n\n  describeCustomizedConfigurations (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCustomizedConfigurations\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomizedConfigurations with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/customizedConfigurations/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个个性化配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.customizedConfigurationName - 个性化配置名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符\n      * @param {string} [opts.description] - 描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {customizedConfigurationContentSpec} [opts.customizedConfigurationContent] - 个性化配置内容  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string customizedConfigurationId  个性化配置Id\n      */\n\n  createCustomizedConfiguration (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createCustomizedConfiguration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.customizedConfigurationName === undefined ||\n      opts.customizedConfigurationName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.customizedConfigurationName' when calling createCustomizedConfiguration\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.customizedConfigurationName !== undefined &&\n      opts.customizedConfigurationName !== null\n    ) {\n      postBody['customizedConfigurationName'] = opts.customizedConfigurationName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (\n      opts.customizedConfigurationContent !== undefined &&\n      opts.customizedConfigurationContent !== null\n    ) {\n      postBody['customizedConfigurationContent'] =\n        opts.customizedConfigurationContent\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCustomizedConfiguration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/customizedConfigurations/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询个性化配置详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.customizedConfigurationId - Customized Configuration Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param customizedConfiguration customizedConfiguration  个性化配置资源信息\n      */\n\n  describeCustomizedConfiguration (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCustomizedConfiguration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.customizedConfigurationId === undefined ||\n      opts.customizedConfigurationId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.customizedConfigurationId' when calling describeCustomizedConfiguration\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      customizedConfigurationId: opts.customizedConfigurationId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomizedConfiguration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/customizedConfigurations/{customizedConfigurationId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改一个个性化配置的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.customizedConfigurationId - Customized Configuration Id\n      * @param {string} [opts.customizedConfigurationName] - 个性化配置名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符  optional\n      * @param {string} [opts.description] - 描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {customizedConfigurationContentSpec} [opts.customizedConfigurationContent] - 个性化配置内容  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateCustomizedConfiguration (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateCustomizedConfiguration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.customizedConfigurationId === undefined ||\n      opts.customizedConfigurationId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.customizedConfigurationId' when calling updateCustomizedConfiguration\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.customizedConfigurationName !== undefined &&\n      opts.customizedConfigurationName !== null\n    ) {\n      postBody['customizedConfigurationName'] = opts.customizedConfigurationName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (\n      opts.customizedConfigurationContent !== undefined &&\n      opts.customizedConfigurationContent !== null\n    ) {\n      postBody['customizedConfigurationContent'] =\n        opts.customizedConfigurationContent\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      customizedConfigurationId: opts.customizedConfigurationId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateCustomizedConfiguration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/customizedConfigurations/{customizedConfigurationId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一个个性化配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.customizedConfigurationId - Customized Configuration Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCustomizedConfiguration (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteCustomizedConfiguration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.customizedConfigurationId === undefined ||\n      opts.customizedConfigurationId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.customizedConfigurationId' when calling deleteCustomizedConfiguration\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      customizedConfigurationId: opts.customizedConfigurationId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCustomizedConfiguration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/customizedConfigurations/{customizedConfigurationId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  给资源绑定个性化配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.customizedConfigurationId - Customized Configuration Id\n      * @param {array} opts.resourceIds - 个性化配置要绑定的资源ID列表, 对于已绑定配置的资源需要先解绑\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  associateCustomizedConfiguration (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateCustomizedConfiguration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.customizedConfigurationId === undefined ||\n      opts.customizedConfigurationId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.customizedConfigurationId' when calling associateCustomizedConfiguration\"\n      )\n    }\n    if (opts.resourceIds === undefined || opts.resourceIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceIds' when calling associateCustomizedConfiguration\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.resourceIds !== undefined && opts.resourceIds !== null) {\n      postBody['resourceIds'] = opts.resourceIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      customizedConfigurationId: opts.customizedConfigurationId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateCustomizedConfiguration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/customizedConfigurations/{customizedConfigurationId}:associateCustomizedConfiguration',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  给资源解绑个性化配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.customizedConfigurationId - Customized Configuration Id\n      * @param {array} opts.resourceIds - 个性化配置要解绑的资源ID列表\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disassociateCustomizedConfiguration (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateCustomizedConfiguration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.customizedConfigurationId === undefined ||\n      opts.customizedConfigurationId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.customizedConfigurationId' when calling disassociateCustomizedConfiguration\"\n      )\n    }\n    if (opts.resourceIds === undefined || opts.resourceIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceIds' when calling disassociateCustomizedConfiguration\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.resourceIds !== undefined && opts.resourceIds !== null) {\n      postBody['resourceIds'] = opts.resourceIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      customizedConfigurationId: opts.customizedConfigurationId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateCustomizedConfiguration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/customizedConfigurations/{customizedConfigurationId}:disassociateCustomizedConfiguration',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询监听器列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - listenerNames - 监听器名称列表，支持多个\nlistenerIds - 监听器Id列表，支持多个\nloadBalancerId - 负载均衡器Id，支持单个\nloadBalancerType - 负载均衡类型，取值为：alb、nlb、dnlb，默认alb，支持单个\nurlMapIds - 【仅alb支持】转发规则组Id列表，支持多个\nsecurityPolicyIds - 监听器绑定的安全策略ID，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listener listeners\n      * @param integer totalCount  总数量\n      */\n\n  describeListeners (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeListeners\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeListeners with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个监听器\n      * @param {Object} opts - parameters\n      * @param {string} opts.listenerName - Listener的名字,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符\n      * @param {string} opts.protocol - 监听协议, 取值为Tcp, Tls, Http, Https, Udp &lt;br&gt;【alb】支持Http, Https，Tcp、Tls和Udp &lt;br&gt;【nlb】支持Tcp, Udp  &lt;br&gt;【dnlb】支持Tcp, Udp\n      * @param {boolean} [opts.hstsEnable] - 【alb使用https时支持】是否开启HSTS，True(开启)， False(关闭)，缺省为False  optional\n      * @param {integer} [opts.hstsMaxAge] - 【alb使用https时支持】HSTS过期时间(秒)，取值范围为[1, 94608000(3年)]，缺省为31536000(1年)  optional\n      * @param {integer} opts.port - 监听端口，取值范围为[1, 65535]\n      * @param {string} opts.backendId - 默认的后端服务Id\n      * @param {string} opts.loadBalancerId - Listener所属loadBalancer的Id\n      * @param {string} [opts.urlMapId] - 【alb Https和Http协议】转发规则组Id  optional\n      * @param {string} [opts.action] - 默认后端服务的转发策略,取值为Forward或Redirect, 现只支持Forward, 默认为Forward  optional\n      * @param {array} [opts.certificateSpecs] - 【alb Https和Tls协议】Listener绑定的默认证书，最多支持两个，两个证书的加密算法需要不同  optional\n      * @param {limitationSpec} [opts.limitation] - 【仅ALB支持】限速配置  optional\n      * @param {integer} [opts.connectionIdleTimeSeconds] - 【alb、nlb】空闲连接超时时间, 范围为[1,86400]。 &lt;br&gt;（Tcp和Tls协议）默认为：1800s &lt;br&gt;（Udp协议）默认为：300s &lt;br&gt;（Http和Https协议）默认为：60s &lt;br&gt;【dnlb】不支持  optional\n      * @param {string} [opts.description] - 描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} [opts.securityPolicyId] - 绑定的安全策略id，仅支持应用负载均衡的HTTPS、TLS监听配置，不传默认使用默认安全策略  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string listenerId  监听器id\n      */\n\n  createListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listenerName === undefined || opts.listenerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerName' when calling createListener\"\n      )\n    }\n    if (opts.protocol === undefined || opts.protocol === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.protocol' when calling createListener\"\n      )\n    }\n    if (opts.port === undefined || opts.port === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.port' when calling createListener\"\n      )\n    }\n    if (opts.backendId === undefined || opts.backendId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backendId' when calling createListener\"\n      )\n    }\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling createListener\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.listenerName !== undefined && opts.listenerName !== null) {\n      postBody['listenerName'] = opts.listenerName\n    }\n    if (opts.protocol !== undefined && opts.protocol !== null) {\n      postBody['protocol'] = opts.protocol\n    }\n    if (opts.hstsEnable !== undefined && opts.hstsEnable !== null) {\n      postBody['hstsEnable'] = opts.hstsEnable\n    }\n    if (opts.hstsMaxAge !== undefined && opts.hstsMaxAge !== null) {\n      postBody['hstsMaxAge'] = opts.hstsMaxAge\n    }\n    if (opts.port !== undefined && opts.port !== null) {\n      postBody['port'] = opts.port\n    }\n    if (opts.backendId !== undefined && opts.backendId !== null) {\n      postBody['backendId'] = opts.backendId\n    }\n    if (opts.loadBalancerId !== undefined && opts.loadBalancerId !== null) {\n      postBody['loadBalancerId'] = opts.loadBalancerId\n    }\n    if (opts.urlMapId !== undefined && opts.urlMapId !== null) {\n      postBody['urlMapId'] = opts.urlMapId\n    }\n    if (opts.action !== undefined && opts.action !== null) {\n      postBody['action'] = opts.action\n    }\n    if (opts.certificateSpecs !== undefined && opts.certificateSpecs !== null) {\n      postBody['certificateSpecs'] = opts.certificateSpecs\n    }\n    if (opts.limitation !== undefined && opts.limitation !== null) {\n      postBody['limitation'] = opts.limitation\n    }\n    if (\n      opts.connectionIdleTimeSeconds !== undefined &&\n      opts.connectionIdleTimeSeconds !== null\n    ) {\n      postBody['connectionIdleTimeSeconds'] = opts.connectionIdleTimeSeconds\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.securityPolicyId !== undefined && opts.securityPolicyId !== null) {\n      postBody['securityPolicyId'] = opts.securityPolicyId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询监听器详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.listenerId - 监听器ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listener listener  监听器的信息\n      */\n\n  describeListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listenerId === undefined || opts.listenerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerId' when calling describeListener\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      listenerId: opts.listenerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners/{listenerId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改一个监听器的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.listenerId - 监听器ID\n      * @param {string} [opts.listenerName] - 监听器名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符  optional\n      * @param {string} [opts.status] - Listener状态, 取值为On或者为Off  optional\n      * @param {boolean} [opts.hstsEnable] - 【alb使用https时支持】是否开启HSTS，True(开启)， False(关闭)，缺省为不改变原值  optional\n      * @param {integer} [opts.hstsMaxAge] - 【alb使用https时支持】HSTS过期时间(秒)，取值范围为[1, 94608000(3年)]，缺省为不改变原值  optional\n      * @param {array} [opts.certificateSpecs] - 【alb Https和Tls协议】Listener绑定的默认证书，最多支持两个，两个证书的加密算法需要不同  optional\n      * @param {limitationSpec} [opts.limitation] - 【仅ALB支持】限速配置  optional\n      * @param {integer} [opts.connectionIdleTimeSeconds] - 【alb、nlb】空闲连接超时时间, 范围为[1,86400]。 &lt;br&gt;（Tcp和Tls协议）默认为：1800s &lt;br&gt;（Http和Https协议）默认为：60s &lt;br&gt;【dnlb】不支持该功能  optional\n      * @param {string} [opts.backendId] - 默认后端服务Id  optional\n      * @param {string} [opts.urlMapId] - 【alb Https和Http协议】转发规则组Id  optional\n      * @param {string} [opts.description] - 监听器描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} [opts.securityPolicyId] - 绑定的安全策略id，仅支持应用负载均衡的HTTPS、TLS监听配置  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listenerId === undefined || opts.listenerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerId' when calling updateListener\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.listenerName !== undefined && opts.listenerName !== null) {\n      postBody['listenerName'] = opts.listenerName\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.hstsEnable !== undefined && opts.hstsEnable !== null) {\n      postBody['hstsEnable'] = opts.hstsEnable\n    }\n    if (opts.hstsMaxAge !== undefined && opts.hstsMaxAge !== null) {\n      postBody['hstsMaxAge'] = opts.hstsMaxAge\n    }\n    if (opts.certificateSpecs !== undefined && opts.certificateSpecs !== null) {\n      postBody['certificateSpecs'] = opts.certificateSpecs\n    }\n    if (opts.limitation !== undefined && opts.limitation !== null) {\n      postBody['limitation'] = opts.limitation\n    }\n    if (\n      opts.connectionIdleTimeSeconds !== undefined &&\n      opts.connectionIdleTimeSeconds !== null\n    ) {\n      postBody['connectionIdleTimeSeconds'] = opts.connectionIdleTimeSeconds\n    }\n    if (opts.backendId !== undefined && opts.backendId !== null) {\n      postBody['backendId'] = opts.backendId\n    }\n    if (opts.urlMapId !== undefined && opts.urlMapId !== null) {\n      postBody['urlMapId'] = opts.urlMapId\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.securityPolicyId !== undefined && opts.securityPolicyId !== null) {\n      postBody['securityPolicyId'] = opts.securityPolicyId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      listenerId: opts.listenerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners/{listenerId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一个监听器\n      * @param {Object} opts - parameters\n      * @param {string} opts.listenerId - 监听器ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteListener (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteListener\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listenerId === undefined || opts.listenerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerId' when calling deleteListener\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      listenerId: opts.listenerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteListener with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners/{listenerId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  listener批量添加扩展证书\n      * @param {Object} opts - parameters\n      * @param {string} opts.listenerId - 监听器ID\n      * @param {array} [opts.certificates] - 【alb Https和Tls协议】ssl server证书列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addListenerCertificates (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addListenerCertificates\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listenerId === undefined || opts.listenerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerId' when calling addListenerCertificates\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.certificates !== undefined && opts.certificates !== null) {\n      postBody['certificates'] = opts.certificates\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      listenerId: opts.listenerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addListenerCertificates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners/{listenerId}:addListenerCertificates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  listener批量修改扩展证书\n      * @param {Object} opts - parameters\n      * @param {string} opts.listenerId - 监听器ID\n      * @param {array} [opts.certificates] - 【alb Https和Tls协议】Listener绑定的扩展证书列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateListenerCertificates (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateListenerCertificates\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listenerId === undefined || opts.listenerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerId' when calling updateListenerCertificates\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.certificates !== undefined && opts.certificates !== null) {\n      postBody['certificates'] = opts.certificates\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      listenerId: opts.listenerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateListenerCertificates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners/{listenerId}:updateListenerCertificates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  listener批量删除扩展证书\n      * @param {Object} opts - parameters\n      * @param {string} opts.listenerId - 监听器ID\n      * @param {array} [opts.certificateBindIds] - 【alb Https和Tls协议】扩展证书绑定Id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteListenerCertificates (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteListenerCertificates\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.listenerId === undefined || opts.listenerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.listenerId' when calling deleteListenerCertificates\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.certificateBindIds !== undefined &&\n      opts.certificateBindIds !== null\n    ) {\n      postBody['certificateBindIds'] = opts.certificateBindIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      listenerId: opts.listenerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteListenerCertificates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/listeners/{listenerId}:deleteListenerCertificates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询负载均衡列表详情\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - loadBalancerType - 负载均衡类型，取值为：alb、nlb、dnlb，默认alb，支持单个\nloadBalancerIds - 负载均衡ID列表，支持多个\nloadBalancerNames - 负载均衡名称列表，支持多个; 支持operator为like的模糊搜索，此时name只能传单个\nvpcId - 负载均衡所在Vpc的Id，支持单个\nazType - 负载均衡az类型，取值：all(全部类型)，standard(标准负载均衡)，edge(边缘负载均衡)，默认all，支持单个\nazs - 可用区，仅支持边缘可用区，支持多个\nprivateIpAddresses - 负载均衡的vip地址，支持多个\nipv6Addresses - 负载均衡的ipv6地址，支持多个\nserviceCodes -  产品唯一掩码，支持多个\nserviceIds   - 产品唯一ID，支持多个\nelasticIpAddress - 负载均衡的弹性公网ip地址，支持单个\ntargetPrivateIpAddress - 后端target的内网IP地址，支持单个\ncustomizedConfigurationIds - 负载均衡绑定的个性化配置ID，支持多个\n  optional\n      * @param {tagFilter} [opts.tags] - Tag筛选条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param loadBalancer loadBalancers\n      * @param integer totalCount  总数量\n      */\n\n  describeLoadBalancers (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeLoadBalancers\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLoadBalancers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loadBalancers/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建负载均衡\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerName - LoadBalancer的名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符\n      * @param {string} opts.subnetId - LoadBalancer所属子网的Id\n      * @param {string} [opts.type] - LoadBalancer的类型，取值：alb、nlb、dnlb，默认为alb  optional\n      * @param {array} [opts.azs] - 【alb，nlb】LoadBalancer所属availability Zone列表,对于alb,nlb是必选参数，可用区个数不能超过2个 &lt;br&gt;【dnlb】中心可用区，dnlb不需要传该参数，全可用区可用；边缘可用区，仅支持传入单可用区  optional\n      * @param {chargeSpec} [opts.chargeSpec] - 【alb】支持按用量计费，默认为按用量。【nlb】支持按用量计费。【dnlb】支持按配置计费  optional\n      * @param {elasticIpSpec} [opts.elasticIp] - 负载均衡关联的弹性IP规格  optional\n      * @param {string} [opts.privateIpAddress] - 指定LoadBalancer的VIP(内网IPv4地址)，需要属于指定的子网并且未被占用  optional\n      * @param {array} [opts.securityGroupIds] - 【alb】 安全组 ID列表  optional\n      * @param {string} [opts.description] - LoadBalancer的描述信息,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {boolean} [opts.deleteProtection] - 删除保护，取值为True(开启)或False(关闭)，默认为False  optional\n      * @param {array} [opts.userTags] - 用户tag 信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string loadBalancerId  负载均衡id\n      */\n\n  createLoadBalancer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createLoadBalancer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerName === undefined || opts.loadBalancerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerName' when calling createLoadBalancer\"\n      )\n    }\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling createLoadBalancer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.loadBalancerName !== undefined && opts.loadBalancerName !== null) {\n      postBody['loadBalancerName'] = opts.loadBalancerName\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      postBody['type'] = opts.type\n    }\n    if (opts.azs !== undefined && opts.azs !== null) {\n      postBody['azs'] = opts.azs\n    }\n    if (opts.chargeSpec !== undefined && opts.chargeSpec !== null) {\n      postBody['chargeSpec'] = opts.chargeSpec\n    }\n    if (opts.elasticIp !== undefined && opts.elasticIp !== null) {\n      postBody['elasticIp'] = opts.elasticIp\n    }\n    if (opts.privateIpAddress !== undefined && opts.privateIpAddress !== null) {\n      postBody['privateIpAddress'] = opts.privateIpAddress\n    }\n    if (opts.securityGroupIds !== undefined && opts.securityGroupIds !== null) {\n      postBody['securityGroupIds'] = opts.securityGroupIds\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.deleteProtection !== undefined && opts.deleteProtection !== null) {\n      postBody['deleteProtection'] = opts.deleteProtection\n    }\n    if (opts.userTags !== undefined && opts.userTags !== null) {\n      postBody['userTags'] = opts.userTags\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createLoadBalancer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loadBalancers/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询负载均衡详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - LB ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param loadBalancer loadBalancer  负载均衡的信息\n      */\n\n  describeLoadBalancer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeLoadBalancer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling describeLoadBalancer\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLoadBalancer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loadBalancers/{loadBalancerId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新负载均衡信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - LB ID\n      * @param {string} [opts.loadBalancerName] - LoadBalancer的名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符  optional\n      * @param {string} [opts.action] - 启用或停止LoadBalancer，取值为Start(启用)或Stop(停止)  optional\n      * @param {string} [opts.description] - LoadBalancer的描述信息,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {boolean} [opts.domainEnable] - 是否绑定域名，包括外网和内网，缺省为不改变原值  optional\n      * @param {boolean} [opts.deleteProtection] - 删除保护，取值为True(开启)或False(关闭)，默认为False  optional\n      * @param {string} [opts.privateIpAddress] - 变更loadBalancer的vip地址，新地址只允许是loadBalancer本子网中的空闲ip地址，缺省为不改变原值  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateLoadBalancer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateLoadBalancer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling updateLoadBalancer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.loadBalancerName !== undefined && opts.loadBalancerName !== null) {\n      postBody['loadBalancerName'] = opts.loadBalancerName\n    }\n    if (opts.action !== undefined && opts.action !== null) {\n      postBody['action'] = opts.action\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.domainEnable !== undefined && opts.domainEnable !== null) {\n      postBody['domainEnable'] = opts.domainEnable\n    }\n    if (opts.deleteProtection !== undefined && opts.deleteProtection !== null) {\n      postBody['deleteProtection'] = opts.deleteProtection\n    }\n    if (opts.privateIpAddress !== undefined && opts.privateIpAddress !== null) {\n      postBody['privateIpAddress'] = opts.privateIpAddress\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateLoadBalancer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loadBalancers/{loadBalancerId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除负载均衡，负载均衡下的监听器，转发规则组(仅alb支持)，后端服务，服务器组会一起删除\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - LB ID\n      * @param {boolean} [opts.deleteElasticIp] - 是否打包删除弹性公网IP，取值范围：true、false，默认false。true表示删除负载均衡时打包删除其绑定的弹性公网IP；false表示删除负载均衡时不删除其绑定的弹性公网IP。包年包月和无计费信息的弹性公网IP不支持打包删除  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLoadBalancer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteLoadBalancer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling deleteLoadBalancer\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deleteElasticIp !== undefined && opts.deleteElasticIp !== null) {\n      queryParams['deleteElasticIp'] = opts.deleteElasticIp\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLoadBalancer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loadBalancers/{loadBalancerId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询安全组绑定负载均衡列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.securityGroupId - securityGroup ID\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数量\n      * @param loadBalancer loadBalancers\n      */\n\n  describeLoadBalancersBySecurityGroup (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeLoadBalancersBySecurityGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.securityGroupId === undefined || opts.securityGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.securityGroupId' when calling describeLoadBalancersBySecurityGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      securityGroupId: opts.securityGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLoadBalancersBySecurityGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loadBalancers/{securityGroupId}:describeLoadBalancersBySecurityGroup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  负载均衡绑定弹性公网IP\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - LB ID\n      * @param {string} opts.elasticIpId - 弹性公网IP ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  associateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling associateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling associateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loadBalancers/{loadBalancerId}:associateElasticIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  负载均衡解绑弹性公网IP\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - LB ID\n      * @param {string} opts.elasticIpId - 弹性公网IP ID\n      * @param {boolean} [opts.deleteElasticIp] - 解绑时是否同时删除弹性公网IP，取值范围：true、false，默认false。true表示解绑弹性公网IP时删除该弹性公网IP；false表示解绑弹性公网IP时不删除该弹性公网IP。包年包月和无计费信息的弹性公网IP不支持解绑时删除  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disassociateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling disassociateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling disassociateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n    if (opts.deleteElasticIp !== undefined && opts.deleteElasticIp !== null) {\n      postBody['deleteElasticIp'] = opts.deleteElasticIp\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loadBalancers/{loadBalancerId}:disassociateElasticIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  负载均衡绑定安全组\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - LB ID\n      * @param {array} [opts.securityGroupIds] - 安全组 ID列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  associateSecurityGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateSecurityGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling associateSecurityGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.securityGroupIds !== undefined && opts.securityGroupIds !== null) {\n      postBody['securityGroupIds'] = opts.securityGroupIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateSecurityGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loadBalancers/{loadBalancerId}:associateSecurityGroup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  负载均衡解绑安全组\n      * @param {Object} opts - parameters\n      * @param {string} opts.loadBalancerId - LB ID\n      * @param {array} [opts.securityGroupIds] - 安全组 ID列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disassociateSecurityGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateSecurityGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling disassociateSecurityGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.securityGroupIds !== undefined && opts.securityGroupIds !== null) {\n      postBody['securityGroupIds'] = opts.securityGroupIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      loadBalancerId: opts.loadBalancerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateSecurityGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/loadBalancers/{loadBalancerId}:disassociateSecurityGroup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询安全策略列表详情\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - securityPolicyIds - 安全策略ID，支持多个\nsecurityPolicyNames - 安全策略名称，支持多个; 支持operator为like的模糊搜索，此时name只能传单个\nsecurityPolicyType - 安全策略类型(SYSTEM/CUSTOM/ALL)，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param securityPolicy securityPolicies\n      * @param integer totalCount  总数量\n      */\n\n  describeSecurityPolicies (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSecurityPolicies\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecurityPolicies with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/securityPolicies/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个安全策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.securityPolicyName - 安全策略名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符\n      * @param {string} [opts.description] - 安全策略描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {array} [opts.protocols] - TLS协议版本列表，目前支持TLSv1、TLSv1.1、TLSv1.2和TLSv1.3，传入的每个protocol至少需要传入一个支持的cipher  optional\n      * @param {array} [opts.ciphers] - TLS加密套件列表，传入的每个cipher至少需要传入一个能够支持的protocol\nTLSv1和TLSv1.1支持的加密套件：\nAES128-SHA\nAES256-SHA\nCAMELLIA128-SHA\nCAMELLIA256-SHA\nDES-CBC3-SHA\nECDHE-RSA-AES128-SHA\nECDHE-RSA-AES256-SHA\nECDHE-RSA-DES-CBC3-SHA\nIDEA-CBC-SHA\nSEED-SHA\nECDHE-ECDSA-AES256-SHA\nECDHE-ECDSA-AES128-SHA\nECDHE-ECDSA-DES-CBC3-SHA\nTLSv1.2支持的加密套件：\nAES128-CCM\nAES128-CCM8\nAES128-GCM-SHA256\nAES128-SHA\nAES128-SHA256\nAES256-CCM\nAES256-CCM8\nAES256-GCM-SHA384\nAES256-SHA\nAES256-SHA256\nARIA128-GCM-SHA256\nARIA256-GCM-SHA384\nCAMELLIA128-SHA\nCAMELLIA128-SHA256\nCAMELLIA256-SHA\nCAMELLIA256-SHA256\nDES-CBC3-SHA\nECDHE-ARIA128-GCM-SHA256\nECDHE-ARIA256-GCM-SHA384\nECDHE-RSA-AES128-GCM-SHA256\nECDHE-RSA-AES128-SHA\nECDHE-RSA-AES128-SHA256\nECDHE-RSA-AES256-GCM-SHA384\nECDHE-RSA-AES256-SHA\nECDHE-RSA-AES256-SHA384\nECDHE-RSA-CAMELLIA128-SHA256\nECDHE-RSA-CAMELLIA256-SHA384\nECDHE-RSA-CHACHA20-POLY1305\nECDHE-RSA-DES-CBC3-SHA\nSEED-SHA\nECDHE-ECDSA-AES256-GCM-SHA384\nECDHE-ECDSA-CHACHA20-POLY1305\nECDHE-ECDSA-AES256-CCM8\nECDHE-ECDSA-AES256-CCM\nECDHE-ECDSA-ARIA256-GCM-SHA384\nECDHE-ECDSA-AES128-GCM-SHA256\nECDHE-ECDSA-AES128-CCM8\nECDHE-ECDSA-AES128-CCM\nECDHE-ECDSA-ARIA128-GCM-SHA256\nECDHE-ECDSA-AES256-SHA384\nECDHE-ECDSA-CAMELLIA256-SHA384\nECDHE-ECDSA-AES128-SHA256\nECDHE-ECDSA-CAMELLIA128-SHA256\nECDHE-ECDSA-AES256-SHA\nECDHE-ECDSA-AES128-SHA\nECDHE-ECDSA-DES-CBC3-SHA\nTLSv1.3支持的加密套件：\nTLS_AES_256_GCM_SHA384\nTLS_CHACHA20_POLY1305_SHA256\nTLS_AES_128_GCM_SHA256  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string securityPolicyId  安全策略Id\n      */\n\n  createSecurityPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSecurityPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.securityPolicyName === undefined ||\n      opts.securityPolicyName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.securityPolicyName' when calling createSecurityPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.securityPolicyName !== undefined &&\n      opts.securityPolicyName !== null\n    ) {\n      postBody['securityPolicyName'] = opts.securityPolicyName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.protocols !== undefined && opts.protocols !== null) {\n      postBody['protocols'] = opts.protocols\n    }\n    if (opts.ciphers !== undefined && opts.ciphers !== null) {\n      postBody['ciphers'] = opts.ciphers\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSecurityPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/securityPolicies/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询安全策略详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.securityPolicyId - Security Policy Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param securityPolicy securityPolicy  安全策略资源信息\n      */\n\n  describeSecurityPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSecurityPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.securityPolicyId === undefined || opts.securityPolicyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.securityPolicyId' when calling describeSecurityPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      securityPolicyId: opts.securityPolicyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecurityPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/securityPolicies/{securityPolicyId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改一个安全策略的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.securityPolicyId - Security Policy Id\n      * @param {string} [opts.securityPolicyName] - 安全策略名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符  optional\n      * @param {string} [opts.description] - 安全策略描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {array} [opts.protocols] - TLS协议版本列表，目前支持TLSv1、TLSv1.1、TLSv1.2和TLSv1.3，传入的每个protocol至少需要传入一个支持的cipher  optional\n      * @param {array} [opts.ciphers] - TLS加密套件列表，传入的每个cipher至少需要传入一个能够支持的protocol\nTLSv1和TLSv1.1支持的加密套件：\nAES128-SHA\nAES256-SHA\nCAMELLIA128-SHA\nCAMELLIA256-SHA\nDES-CBC3-SHA\nECDHE-RSA-AES128-SHA\nECDHE-RSA-AES256-SHA\nECDHE-RSA-DES-CBC3-SHA\nIDEA-CBC-SHA\nSEED-SHA\nECDHE-ECDSA-AES256-SHA\nECDHE-ECDSA-AES128-SHA\nECDHE-ECDSA-DES-CBC3-SHA\nTLSv1.2支持的加密套件：\nAES128-CCM\nAES128-CCM8\nAES128-GCM-SHA256\nAES128-SHA\nAES128-SHA256\nAES256-CCM\nAES256-CCM8\nAES256-GCM-SHA384\nAES256-SHA\nAES256-SHA256\nARIA128-GCM-SHA256\nARIA256-GCM-SHA384\nCAMELLIA128-SHA\nCAMELLIA128-SHA256\nCAMELLIA256-SHA\nCAMELLIA256-SHA256\nDES-CBC3-SHA\nECDHE-ARIA128-GCM-SHA256\nECDHE-ARIA256-GCM-SHA384\nECDHE-RSA-AES128-GCM-SHA256\nECDHE-RSA-AES128-SHA\nECDHE-RSA-AES128-SHA256\nECDHE-RSA-AES256-GCM-SHA384\nECDHE-RSA-AES256-SHA\nECDHE-RSA-AES256-SHA384\nECDHE-RSA-CAMELLIA128-SHA256\nECDHE-RSA-CAMELLIA256-SHA384\nECDHE-RSA-CHACHA20-POLY1305\nECDHE-RSA-DES-CBC3-SHA\nSEED-SHA\nECDHE-ECDSA-AES256-GCM-SHA384\nECDHE-ECDSA-CHACHA20-POLY1305\nECDHE-ECDSA-AES256-CCM8\nECDHE-ECDSA-AES256-CCM\nECDHE-ECDSA-ARIA256-GCM-SHA384\nECDHE-ECDSA-AES128-GCM-SHA256\nECDHE-ECDSA-AES128-CCM8\nECDHE-ECDSA-AES128-CCM\nECDHE-ECDSA-ARIA128-GCM-SHA256\nECDHE-ECDSA-AES256-SHA384\nECDHE-ECDSA-CAMELLIA256-SHA384\nECDHE-ECDSA-AES128-SHA256\nECDHE-ECDSA-CAMELLIA128-SHA256\nECDHE-ECDSA-AES256-SHA\nECDHE-ECDSA-AES128-SHA\nECDHE-ECDSA-DES-CBC3-SHA\nTLSv1.3支持的加密套件：\nTLS_AES_256_GCM_SHA384\nTLS_CHACHA20_POLY1305_SHA256\nTLS_AES_128_GCM_SHA256  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateSecurityPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateSecurityPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.securityPolicyId === undefined || opts.securityPolicyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.securityPolicyId' when calling updateSecurityPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.securityPolicyName !== undefined &&\n      opts.securityPolicyName !== null\n    ) {\n      postBody['securityPolicyName'] = opts.securityPolicyName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.protocols !== undefined && opts.protocols !== null) {\n      postBody['protocols'] = opts.protocols\n    }\n    if (opts.ciphers !== undefined && opts.ciphers !== null) {\n      postBody['ciphers'] = opts.ciphers\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      securityPolicyId: opts.securityPolicyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateSecurityPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/securityPolicies/{securityPolicyId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一个安全策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.securityPolicyId - Security Policy Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSecurityPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSecurityPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.securityPolicyId === undefined || opts.securityPolicyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.securityPolicyId' when calling deleteSecurityPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      securityPolicyId: opts.securityPolicyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSecurityPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/securityPolicies/{securityPolicyId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询安全策略支持Cipher列表详情\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - protocols - 安全策略支持的协议，支持多个\nciphers - 安全策略支持的加密套件，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param supportedCipher supportedCiphers\n      * @param integer totalCount  总数量\n      */\n\n  describeSupportedCiphers (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSupportedCiphers\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSupportedCiphers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/supportedCiphers/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询虚拟服务器组列表详情，返回target详情功能3个月后将会下线，建议用户直接使用describeTargets接口查询target详情\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - targetGroupIds - TargetGroup ID列表，支持多个\ntargetGroupNames - TargetGroup名称列表，支持多个\nloadBalancerId － TargetGroup所属负载均衡的Id，支持单个\nloadBalancerType - 负载均衡类型，取值为：alb、nlb、dnlb，默认alb，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param targetGroup targetGroups\n      * @param integer totalCount  总数量\n      */\n\n  describeTargetGroups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTargetGroups\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTargetGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/targetGroups/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个虚拟服务器组\n      * @param {Object} opts - parameters\n      * @param {string} opts.targetGroupName - 虚拟服务器组名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符\n      * @param {string} opts.loadBalancerId - 负载均衡的Id\n      * @param {string} [opts.description] - 描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} [opts.type] - 类型，取值为instance或ip  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string targetGroupId  虚拟服务器组Id\n      */\n\n  createTargetGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createTargetGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.targetGroupName === undefined || opts.targetGroupName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetGroupName' when calling createTargetGroup\"\n      )\n    }\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling createTargetGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.targetGroupName !== undefined && opts.targetGroupName !== null) {\n      postBody['targetGroupName'] = opts.targetGroupName\n    }\n    if (opts.loadBalancerId !== undefined && opts.loadBalancerId !== null) {\n      postBody['loadBalancerId'] = opts.loadBalancerId\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      postBody['type'] = opts.type\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createTargetGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/targetGroups/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询TargetGroup详情，返回target详情功能3个月后将会下线，建议用户直接使用describeTargets接口查询target详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.targetGroupId - TargetGroup Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param targetGroup targetGroup  TargetGroup资源信息\n      */\n\n  describeTargetGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTargetGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.targetGroupId === undefined || opts.targetGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetGroupId' when calling describeTargetGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      targetGroupId: opts.targetGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTargetGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/targetGroups/{targetGroupId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改一个虚拟服务器组的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.targetGroupId - TargetGroup Id\n      * @param {string} [opts.description] - 虚拟服务器组描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} [opts.targetGroupName] - 虚拟服务器组名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateTargetGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateTargetGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.targetGroupId === undefined || opts.targetGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetGroupId' when calling updateTargetGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.targetGroupName !== undefined && opts.targetGroupName !== null) {\n      postBody['targetGroupName'] = opts.targetGroupName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      targetGroupId: opts.targetGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateTargetGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/targetGroups/{targetGroupId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一个虚拟服务器组\n      * @param {Object} opts - parameters\n      * @param {string} opts.targetGroupId - TargetGroup Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteTargetGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteTargetGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.targetGroupId === undefined || opts.targetGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetGroupId' when calling deleteTargetGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      targetGroupId: opts.targetGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTargetGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/targetGroups/{targetGroupId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  往TargetGroup中加入Target\n      * @param {Object} opts - parameters\n      * @param {string} opts.targetGroupId - TargetGroup Id\n      * @param {array} opts.targetSpecs - 注册Target列表\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  registerTargets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  registerTargets\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.targetGroupId === undefined || opts.targetGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetGroupId' when calling registerTargets\"\n      )\n    }\n    if (opts.targetSpecs === undefined || opts.targetSpecs === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetSpecs' when calling registerTargets\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.targetSpecs !== undefined && opts.targetSpecs !== null) {\n      postBody['targetSpecs'] = opts.targetSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      targetGroupId: opts.targetGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call registerTargets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/targetGroups/{targetGroupId}:registerTargets',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  从TargetGroup中移除一个或多个Target，失败则全部回滚。 成功移除的target将不会再接收来自loadbalancer新建连接的流量\n      * @param {Object} opts - parameters\n      * @param {string} opts.targetGroupId - TargetGroup Id\n      * @param {array} opts.targetIds - Target Id列表\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deRegisterTargets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deRegisterTargets\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.targetGroupId === undefined || opts.targetGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetGroupId' when calling deRegisterTargets\"\n      )\n    }\n    if (opts.targetIds === undefined || opts.targetIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetIds' when calling deRegisterTargets\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.targetIds !== undefined && opts.targetIds !== null) {\n      postBody['targetIds'] = opts.targetIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      targetGroupId: opts.targetGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deRegisterTargets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/targetGroups/{targetGroupId}:deregisterTargets',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改target信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.targetGroupId - TargetGroup Id\n      * @param {array} opts.targetUpdateSpecs - 修改target信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateTargets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateTargets\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.targetGroupId === undefined || opts.targetGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetGroupId' when calling updateTargets\"\n      )\n    }\n    if (\n      opts.targetUpdateSpecs === undefined ||\n      opts.targetUpdateSpecs === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetUpdateSpecs' when calling updateTargets\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.targetUpdateSpecs !== undefined &&\n      opts.targetUpdateSpecs !== null\n    ) {\n      postBody['targetUpdateSpecs'] = opts.targetUpdateSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      targetGroupId: opts.targetGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateTargets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/targetGroups/{targetGroupId}:updateTargets',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询Target列表详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.targetGroupId - TargetGroup Id\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - targetIds - Target ID列表，支持多个\ninstanceId - Instance ID,仅支持单个\ntype － vm, container, ip,仅支持单个\nport - 端口,仅支持单个\nipAddress - ip地址,仅支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param target targets\n      * @param integer totalCount  总数量\n      */\n\n  describeTargets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTargets\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.targetGroupId === undefined || opts.targetGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetGroupId' when calling describeTargets\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      targetGroupId: opts.targetGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTargets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/targetGroups/{targetGroupId}:describeTargets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转发规则组列表详情\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - urlMapIds - 转发规则组Id列表，支持多个\nurlMapNames -转发规则组名称列表，支持多个\nloadBalancerId - 负载均衡器Id，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param urlMap urlMaps\n      * @param integer totalCount  总数量\n      */\n\n  describeUrlMaps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeUrlMaps\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUrlMaps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/urlMaps/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建转发规则组,仅alb支持\n      * @param {Object} opts - parameters\n      * @param {string} opts.urlMapName - 转发规则组名称，同一个负载均衡下，名称不能重复,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符\n      * @param {string} opts.loadBalancerId - 转发规则组所属负载均衡的Id\n      * @param {string} [opts.description] - 描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string urlMapId  转发规则组id\n      */\n\n  createUrlMap (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createUrlMap\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.urlMapName === undefined || opts.urlMapName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.urlMapName' when calling createUrlMap\"\n      )\n    }\n    if (opts.loadBalancerId === undefined || opts.loadBalancerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.loadBalancerId' when calling createUrlMap\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.urlMapName !== undefined && opts.urlMapName !== null) {\n      postBody['urlMapName'] = opts.urlMapName\n    }\n    if (opts.loadBalancerId !== undefined && opts.loadBalancerId !== null) {\n      postBody['loadBalancerId'] = opts.loadBalancerId\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createUrlMap with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/urlMaps/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转发规则组详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.urlMapId - 转发规则组Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param urlMap urlMap  转发规则组的信息\n      */\n\n  describeUrlMap (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeUrlMap\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.urlMapId === undefined || opts.urlMapId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.urlMapId' when calling describeUrlMap\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      urlMapId: opts.urlMapId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUrlMap with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/urlMaps/{urlMapId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改转发规则组\n      * @param {Object} opts - parameters\n      * @param {string} opts.urlMapId - 转发规则组Id\n      * @param {string} [opts.description] - 转发规则组描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} [opts.urlMapName] - 转发规则组名称，同一个负载均衡下，名称不能重复,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateUrlMap (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateUrlMap\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.urlMapId === undefined || opts.urlMapId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.urlMapId' when calling updateUrlMap\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.urlMapName !== undefined && opts.urlMapName !== null) {\n      postBody['urlMapName'] = opts.urlMapName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      urlMapId: opts.urlMapId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateUrlMap with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/urlMaps/{urlMapId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除转发规则组\n      * @param {Object} opts - parameters\n      * @param {string} opts.urlMapId - 转发规则组Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteUrlMap (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteUrlMap\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.urlMapId === undefined || opts.urlMapId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.urlMapId' when calling deleteUrlMap\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      urlMapId: opts.urlMapId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteUrlMap with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/urlMaps/{urlMapId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  往转发规则组加入转发规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.urlMapId - 转发规则组Id\n      * @param {array} [opts.ruleSpecs] - 转发规则的信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.urlMapId === undefined || opts.urlMapId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.urlMapId' when calling addRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ruleSpecs !== undefined && opts.ruleSpecs !== null) {\n      postBody['ruleSpecs'] = opts.ruleSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      urlMapId: opts.urlMapId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/urlMaps/{urlMapId}:addRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改转发规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.urlMapId - 转发规则组Id\n      * @param {array} [opts.ruleUpdateSpecs] - 更新转发规则rules信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.urlMapId === undefined || opts.urlMapId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.urlMapId' when calling updateRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ruleUpdateSpecs !== undefined && opts.ruleUpdateSpecs !== null) {\n      postBody['ruleUpdateSpecs'] = opts.ruleUpdateSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      urlMapId: opts.urlMapId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/urlMaps/{urlMapId}:updateRules',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除转发规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.urlMapId - 转发规则组Id\n      * @param {array} [opts.ruleIds] - rule Id列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.urlMapId === undefined || opts.urlMapId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.urlMapId' when calling deleteRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ruleIds !== undefined && opts.ruleIds !== null) {\n      postBody['ruleIds'] = opts.ruleIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      urlMapId: opts.urlMapId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  lb/0.6.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/urlMaps/{urlMapId}:deleteRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = LB\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/live/v1/live.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Live-Video\n * 直播管理API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'live'\nService._services[serviceId] = true\n\n/**\n * live service.\n * @version 1.0.22\n */\n\nclass LIVE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'live.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询域名下的APP列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围: [1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围: [10, 100]\n  optional\n      * @param {filter} [opts.filters] - 域名下的app列表过滤条件:\n  - name: publishDomain 直播的推流域名\n  - values: 如果参数为空,则查询全部\n  - 过滤条件为空,则表示查询用户下的所有应用名\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param app apps\n      */\n\n  describeLiveApp (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveApp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/apps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加直播应用名\n- 需要提前在应用(app)级别绑定功能模板时才需要提前新建应用名\n- 新的应用名可以推流时自动创建\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 直播的推流域名\n      * @param {string} opts.appName - 应用名称\n- 取值: 数字字母中划线(&quot;-&quot;)下划线(&quot;_&quot;) 50个字符以内\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveApp (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveApp\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling addLiveApp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveApp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/apps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停用 运行中 状态的应用\n- 停用应用之后,不能再用此应用名推流\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 直播的推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopLiveApp (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling stopLiveApp\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling stopLiveApp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopLiveApp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/apps:stop',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询(直播or时移)播放鉴权KEY\n      * @param {Object} opts - parameters\n      * @param {string} opts.playDomain - (直播or时移)播放域名\n- 仅支持精确匹配\n\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string playDomain  播放域名\n      * @param string authStatus  (直播or时移)播放鉴权状态\n  on: 开启\n  off: 关闭\n\n      * @param string authKey  (直播or时移)播放鉴权key\n      */\n\n  describeLivePlayAuthKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.playDomain === undefined || opts.playDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.playDomain' when calling describeLivePlayAuthKey\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.playDomain !== undefined && opts.playDomain !== null) {\n      queryParams['playDomain'] = opts.playDomain\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLivePlayAuthKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/livePlayAuthKey',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置(直播or时移)播放鉴权KEY\n      * @param {Object} opts - parameters\n      * @param {string} opts.playDomain - (直播or时移)播放域名\n      * @param {string} [opts.authStatus] - (直播or时移)播放鉴权状态\n  on: 开启\n  off: 关闭\n- 当播放鉴权状态on(开启)时,authKey不能为空\n  optional\n      * @param {string} [opts.authKey] - (直播or时移)播放鉴权key\n- 取值: 支持大小写字母和数字 长度6-32位\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setLivePlayAuthKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.playDomain === undefined || opts.playDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.playDomain' when calling setLivePlayAuthKey\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.playDomain !== undefined && opts.playDomain !== null) {\n      postBody['playDomain'] = opts.playDomain\n    }\n    if (opts.authStatus !== undefined && opts.authStatus !== null) {\n      postBody['authStatus'] = opts.authStatus\n    }\n    if (opts.authKey !== undefined && opts.authKey !== null) {\n      postBody['authKey'] = opts.authKey\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setLivePlayAuthKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/livePlayAuthKey',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播回看播放鉴权KEY\n      * @param {Object} opts - parameters\n      * @param {string} opts.restartDomain - 直播回看播放域名\n- 仅支持精确匹配\n\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string playDomain  回看播放域名\n      * @param string authStatus  回看播放鉴权状态\n  on: 开启\n  off: 关闭\n\n      * @param string authKey  回看播放鉴权key\n      */\n\n  describeLiveRestartAuthKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.restartDomain === undefined || opts.restartDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restartDomain' when calling describeLiveRestartAuthKey\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.restartDomain !== undefined && opts.restartDomain !== null) {\n      queryParams['restartDomain'] = opts.restartDomain\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveRestartAuthKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveRestartAuthKey',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置直播回看播放鉴权KEY\n      * @param {Object} opts - parameters\n      * @param {string} opts.restartDomain - 直播回看播放域名\n      * @param {string} [opts.authStatus] - 直播回看播放鉴权状态\n  on: 开启\n  off: 关闭\n- 当回看播放鉴权状态on(开启)时,authKey不能为空\n  optional\n      * @param {string} [opts.authKey] - 直播回看播放鉴权key\n- 取值: 支持大小写字母和数字 长度6-32位\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setLiveRestartAuthKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.restartDomain === undefined || opts.restartDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restartDomain' when calling setLiveRestartAuthKey\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.restartDomain !== undefined && opts.restartDomain !== null) {\n      postBody['restartDomain'] = opts.restartDomain\n    }\n    if (opts.authStatus !== undefined && opts.authStatus !== null) {\n      postBody['authStatus'] = opts.authStatus\n    }\n    if (opts.authKey !== undefined && opts.authKey !== null) {\n      postBody['authKey'] = opts.authKey\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setLiveRestartAuthKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveRestartAuthKey',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播计费账单用量数据\n允许通过条件过滤查询，支持的过滤字段如下：\n  - startTime[eq]  账单开始时间\n  - endTime[eq]    账单结束时间\n  - billType[eq]   账单计费类型\n  - userPin[like]  用户PIN\n\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - 传参字段描述:\n  startTime(必填) : 2019-08-21T16:15:10Z\n  endTime(必填)   : 2019-08-21T18:10:10Z\n  billType(非必填)  :\n    enum:\n      - 1   (online)\n      - 2   (offline)\n  userPin(非必填)   : mt_test\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param billDataResultObject resultObject\n      */\n\n  describeLiveBillData (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveBillData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveBillDatas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播播放证书\n      * @param {Object} opts - parameters\n      * @param {string} opts.playDomain - (直播or时移)播放域名\n- 仅支持精确匹配\n\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string playDomain  播放域名\n      * @param string certStatus  (直播or时移)播放证书状态\n  on: 开启\n  off: 关闭\n\n      * @param string cert  (直播or时移)播放证书\n      * @param string title  (直播or时移)播放证书别名\n      */\n\n  describeLiveDomainCertificate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.playDomain === undefined || opts.playDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.playDomain' when calling describeLiveDomainCertificate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.playDomain !== undefined && opts.playDomain !== null) {\n      queryParams['playDomain'] = opts.playDomain\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveDomainCertificate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomainCertificate',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置(直播or时移)播放证书\n-- 设置成功之后30分钟以内生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.playDomain - (直播or时移)播放域名\n      * @param {string} opts.certStatus - (直播or时移)播放证书状态\n  on: 开启\n  off: 关闭\n- 当播放证书状态on(开启)时,cert和key不能为空\n\n      * @param {string} [opts.cert] - (直播or时移)播放证书\n- 取值: 最大支持4098\n- 当播放证书状态on(开启)时,cert不能为空\n  optional\n      * @param {string} [opts.key] - (直播or时移)播放证书key\n- 取值: 最大支持2048\n- 当播放证书状态on(开启)时,key不能为空\n  optional\n      * @param {string} [opts.title] - (直播or时移)播放证书别名\n- 取值: 支持大小写字母和数字 长度最大256\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setLiveDomainCertificate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.playDomain === undefined || opts.playDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.playDomain' when calling setLiveDomainCertificate\"\n      )\n    }\n    if (opts.certStatus === undefined || opts.certStatus === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certStatus' when calling setLiveDomainCertificate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.playDomain !== undefined && opts.playDomain !== null) {\n      postBody['playDomain'] = opts.playDomain\n    }\n    if (opts.certStatus !== undefined && opts.certStatus !== null) {\n      postBody['certStatus'] = opts.certStatus\n    }\n    if (opts.cert !== undefined && opts.cert !== null) {\n      postBody['cert'] = opts.cert\n    }\n    if (opts.key !== undefined && opts.key !== null) {\n      postBody['key'] = opts.key\n    }\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setLiveDomainCertificate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveDomainCertificate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播回看播放证书\n      * @param {Object} opts - parameters\n      * @param {string} opts.restartDomain - 直播回看域名\n- 仅支持精确匹配\n\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string restartDomain  直播回看域名\n      * @param string certStatus  直播回看播放证书状态\n  on: 开启\n  off: 关闭\n\n      * @param string cert  直播回看证书\n      * @param string title  直播回看证书别名\n      */\n\n  describeLiveRestartDomainCertificate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.restartDomain === undefined || opts.restartDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restartDomain' when calling describeLiveRestartDomainCertificate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.restartDomain !== undefined && opts.restartDomain !== null) {\n      queryParams['restartDomain'] = opts.restartDomain\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveRestartDomainCertificate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveRestartDomainCertificate',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置直播回看证书\n-- 设置成功之后30分钟以内生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.restartDomain - 直播回看域名\n      * @param {string} opts.certStatus - 直播回看证书状态\n  on: 开启\n  off: 关闭\n- 当播放证书状态on(开启)时,cert和key不能为空\n\n      * @param {string} [opts.cert] - 直播回看证书\n- 取值: 最大支持4098\n- 当播放证书状态on(开启)时,cert不能为空\n  optional\n      * @param {string} [opts.key] - 直播回看证书key\n- 取值: 最大支持2048\n- 当播放证书状态on(开启)时,key不能为空\n  optional\n      * @param {string} [opts.title] - 直播回看证书别名\n- 取值: 支持大小写字母和数字 长度最大256\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setLiveRestartDomainCertificate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.restartDomain === undefined || opts.restartDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restartDomain' when calling setLiveRestartDomainCertificate\"\n      )\n    }\n    if (opts.certStatus === undefined || opts.certStatus === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certStatus' when calling setLiveRestartDomainCertificate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.restartDomain !== undefined && opts.restartDomain !== null) {\n      postBody['restartDomain'] = opts.restartDomain\n    }\n    if (opts.certStatus !== undefined && opts.certStatus !== null) {\n      postBody['certStatus'] = opts.certStatus\n    }\n    if (opts.cert !== undefined && opts.cert !== null) {\n      postBody['cert'] = opts.cert\n    }\n    if (opts.key !== undefined && opts.key !== null) {\n      postBody['key'] = opts.key\n    }\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setLiveRestartDomainCertificate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveRestartDomainCertificate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围[1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围[10, 100]\n  optional\n      * @param {string} [opts.publishDomain] - 推流域名\n- 目前仅支持精确查询\n- 为空时,查询用户所有直播域名\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param domainDetails domainDetails\n      */\n\n  describeLiveDomains (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      queryParams['publishDomain'] = opts.publishDomain\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveDomains with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加直播域名\n- 创建直播域名之前,必须先开通直播服务\n- 直播域名必须已经备案完成\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 直播的推流域名\n- 不支持泛域名\n\n      * @param {string} opts.playDomain - 直播的播放域名\n- 不支持泛域名\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveDomain\"\n      )\n    }\n    if (opts.playDomain === undefined || opts.playDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.playDomain' when calling addLiveDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.playDomain !== undefined && opts.playDomain !== null) {\n      postBody['playDomain'] = opts.playDomain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动域名\n- 启用状态为 停用 的直播域名对(推流域名,播放域名)将DomainStatus变更为online\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n- 需要启动的域名对(推流域名,播放域名)中的推流域名\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startLiveDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling startLiveDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startLiveDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains:start',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停用域名\n- 停用直播域名对(推流域名,播放域名),将DomainStatus变更为offline\n- 停用该直播域名对后,直播域名信息仍保留,但用户将不能再用该推流域名推流或播放域名播放\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n- 需要停用的域名对(推流域名,播放域名)中的推流域名\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopLiveDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling stopLiveDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopLiveDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains:stop',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定域名相关信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n- 需要停用的域名对(推流域名,播放域名)中的推流域名\n\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer sourceId  SourceID\n      * @param publishDomain publishDomains\n      * @param playDomain playDomains\n      */\n\n  describeLiveDomainDetail (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling describeLiveDomainDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveDomainDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{publishDomain}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除直播域名\n- 请慎重操作（建议在进行域名删除前到域名解析服务商处恢复域名A记录），以免导致删除操作后此域名不可访问。\n  deleteLiveDomain调用成功后将删除本条直播域名的全部相关记录，对于仅需要暂停使用该直播域名，推荐stopLiveDomain接口\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveDomain\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{publishDomain}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加回看域名\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.playDomain - 直播的播放域名\n- 回看域名所对应的原播放域名,新建的回看域名将绑定到此播放域名下\n\n      * @param {string} opts.restartDomain - 直播回看域名\n- 直播域名必须已经备案完成\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveRestartDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.playDomain === undefined || opts.playDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.playDomain' when calling addLiveRestartDomain\"\n      )\n    }\n    if (opts.restartDomain === undefined || opts.restartDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restartDomain' when calling addLiveRestartDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.playDomain !== undefined && opts.playDomain !== null) {\n      postBody['playDomain'] = opts.playDomain\n    }\n    if (opts.restartDomain !== undefined && opts.restartDomain !== null) {\n      postBody['restartDomain'] = opts.restartDomain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveRestartDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains:restart',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建直播拉流转推任务\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.sourceUrl - 拉流地址\n- 支持rtmp\n\n      * @param {string} opts.pushUrl - 转推地址\n- 支持rtmp\n\n      * @param {string} opts.startMode - 执行方式\n- StartNow: 立即执行\n- StartAsScheduled: 定时执行，根据参数设定的时间\n\n      * @param {string} [opts.startTime] - 开始时间\n- UTC时间， ISO8601示例：2021-07-26T08:08:08Z\n- 不填表示立即开始\n  optional\n      * @param {string} [opts.endTime] - 结束时间\n- UTC时间， ISO8601示例：2021-07-26T08:08:08Z\n- 最大支持365天，与开始时间间隔不超过7天。\n  - 假设当前时间2021年03月30日11:50:01，则：结束时间不可超过2022年03月30日11:50:01。\n- 不填拉不到流10分钟自动结束\n  optional\n      * @param {array} [opts.callbackEvents] - 回调类型\n- 不填发送全部回调\n- TaskStart 任务开始\n- TaskExit 任务结束\n- callbackUrl非空的情况下，callbackEvents有效\n  optional\n      * @param {string} [opts.callbackUrl] - 事件回调地址\n  optional\n      * @param {string} [opts.name] - 任务名称\n- 最大255字符\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId  任务ID\n      */\n\n  createLiveForwardTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.sourceUrl === undefined || opts.sourceUrl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sourceUrl' when calling createLiveForwardTask\"\n      )\n    }\n    if (opts.pushUrl === undefined || opts.pushUrl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pushUrl' when calling createLiveForwardTask\"\n      )\n    }\n    if (opts.startMode === undefined || opts.startMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startMode' when calling createLiveForwardTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sourceUrl !== undefined && opts.sourceUrl !== null) {\n      postBody['sourceUrl'] = opts.sourceUrl\n    }\n    if (opts.pushUrl !== undefined && opts.pushUrl !== null) {\n      postBody['pushUrl'] = opts.pushUrl\n    }\n    if (opts.startMode !== undefined && opts.startMode !== null) {\n      postBody['startMode'] = opts.startMode\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.callbackEvents !== undefined && opts.callbackEvents !== null) {\n      postBody['callbackEvents'] = opts.callbackEvents\n    }\n    if (opts.callbackUrl !== undefined && opts.callbackUrl !== null) {\n      postBody['callbackUrl'] = opts.callbackUrl\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createLiveForwardTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/LiveForwardTask:create',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新直播拉流转推任务\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务ID\n\n      * @param {string} [opts.sourceUrl] - 拉流地址\n- 支持rtmp\n  optional\n      * @param {string} [opts.pushUrl] - 转推地址\n- 支持rtmp\n  optional\n      * @param {string} [opts.startTime] - 开始时间\n- UTC时间， ISO8601示例：2021-07-26T08:08:08Z\n- 不填表示立即开始\n  optional\n      * @param {string} [opts.endTime] - 结束时间\n- UTC时间， ISO8601示例：2021-07-26T08:08:08Z\n- 最大支持365天，与开始时间间隔不超过7天。\n- 不填拉不到流10分钟自动结束\n  optional\n      * @param {array} [opts.callbackEvents] - 回调类型\n- 不填发送全部回调\n- TaskStart 任务开始\n- TaskExit 任务结束\n- callbackUrl非空的情况下，callbackEvents有效\n  optional\n      * @param {string} [opts.callbackUrl] - 事件回调地址\n  optional\n      * @param {string} [opts.name] - 任务名称\n- 最大255字符\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateLiveForwardTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling updateLiveForwardTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n    if (opts.sourceUrl !== undefined && opts.sourceUrl !== null) {\n      postBody['sourceUrl'] = opts.sourceUrl\n    }\n    if (opts.pushUrl !== undefined && opts.pushUrl !== null) {\n      postBody['pushUrl'] = opts.pushUrl\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.callbackEvents !== undefined && opts.callbackEvents !== null) {\n      postBody['callbackEvents'] = opts.callbackEvents\n    }\n    if (opts.callbackUrl !== undefined && opts.callbackUrl !== null) {\n      postBody['callbackUrl'] = opts.callbackUrl\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateLiveForwardTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/LiveForwardTask:update',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播拉流转推任务\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围 [1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围 [10, 100]\n  optional\n      * @param {filter} [opts.filters] - 拉流转推任务查询过滤条件:\n- name:   taskId 任务ID\n- value:  如果参数为空，则查询全部\n- name:   taskName 任务名称\n- value:  如果参数为空，则查询全部\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param liveTaskInfo dataList\n      */\n\n  queryLiveForwardTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryLiveForwardTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/LiveForwardTask:query',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开始直播拉流转推任务\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskIds - 任务ID,批量用,分隔\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startLiveForwardTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskIds === undefined || opts.taskIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskIds' when calling startLiveForwardTask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.taskIds !== undefined && opts.taskIds !== null) {\n      queryParams['taskIds'] = opts.taskIds\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startLiveForwardTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/LiveForwardTask:start',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止直播拉流转推任务\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskIds - 任务ID,批量用,分隔\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopLiveForwardTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskIds === undefined || opts.taskIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskIds' when calling stopLiveForwardTask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.taskIds !== undefined && opts.taskIds !== null) {\n      queryParams['taskIds'] = opts.taskIds\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopLiveForwardTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/LiveForwardTask:stop',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除直播拉流转推任务\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskIds - 任务ID,批量用,分隔\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveForwardTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskIds === undefined || opts.taskIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskIds' when calling deleteLiveForwardTask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.taskIds !== undefined && opts.taskIds !== null) {\n      queryParams['taskIds'] = opts.taskIds\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveForwardTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/LiveForwardTask:delete',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加直播质量检测模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.template - 模板名称。长度不超过128个字符。UTF-8编码\n\n      * @param {array} [opts.modules] - 检测项列表。取值范围：\n  BlackScreen - 黑屏\n  PureColor - 纯色\n  ColorCast - 偏色\n  FrozenFrame - 静帧\n  Brightness - 亮度\n  Contrast - 对比度\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addCustomLiveStreamQualityDetectionTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addCustomLiveStreamQualityDetectionTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n    if (opts.modules !== undefined && opts.modules !== null) {\n      postBody['modules'] = opts.modules\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addCustomLiveStreamQualityDetectionTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionCustoms:template',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播质量检测模板列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围 [1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围 [10, 100]\n  optional\n      * @param {filter} [opts.filters] - 质量检测模板查询过滤条件\n- name:   template 质量检测自定义名称\n- value:  如果参数为空，则查询全部\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param qualityDetectionTemplate qualityDetectionTemplates\n      */\n\n  describeCustomLiveStreamQualityDetectionTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomLiveStreamQualityDetectionTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionCustoms',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加应用质量检测配置\n- 添加应用级别的质量检测模板配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.template - 质量检测模板\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveStreamAppQualityDetection (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveStreamAppQualityDetection\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling addLiveStreamAppQualityDetection\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addLiveStreamAppQualityDetection\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveStreamAppQualityDetection with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionApps:template',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加域名质量检测配置\n- 添加域名级别的质量检测模板配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.template - 质量检测模板\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveStreamDomainQualityDetection (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveStreamDomainQualityDetection\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addLiveStreamDomainQualityDetection\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveStreamDomainQualityDetection with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionDomains:template',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置直播质量检测回调通知地址\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.notifyUrl - 质量检测回调通知的URL地址:\n- 以 http:// 开头,外网可访问的地址\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setLiveStreamQualityDetectionNotifyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling setLiveStreamQualityDetectionNotifyConfig\"\n      )\n    }\n    if (opts.notifyUrl === undefined || opts.notifyUrl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.notifyUrl' when calling setLiveStreamQualityDetectionNotifyConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.notifyUrl !== undefined && opts.notifyUrl !== null) {\n      postBody['notifyUrl'] = opts.notifyUrl\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setLiveStreamQualityDetectionNotifyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionNotifys:config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除直播质量检测模板\n- 删除质量检测模板前,请先删除此模板相关的质量检测配置,否则无法删除\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.template - 质量检测模板\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCustomLiveStreamQualityDetectionTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteCustomLiveStreamQualityDetectionTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCustomLiveStreamQualityDetectionTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionCustoms/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除应用级别质量检测模板配置\n- 删除应用级别质量检测模板配置,重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.template - 质量检测模板\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamAppQualityDetection (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamAppQualityDetection\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling deleteLiveStreamAppQualityDetection\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteLiveStreamAppQualityDetection\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      appName: opts.appName,\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamAppQualityDetection with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionApps/{publishDomain}/appNames/{appName}/templates/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除域名质量检测配置\n- 删除域名级别的质量检测模板配置,重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.template - 质量检测模板\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamDomainQualityDetection (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamDomainQualityDetection\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteLiveStreamDomainQualityDetection\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamDomainQualityDetection with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionDomains/{publishDomain}/templates/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询质量检测回调配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string publishDomain  推流域名\n      * @param string notifyUrl  回调地址\n      */\n\n  describeLiveStreamQualityDetectionNotifyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling describeLiveStreamQualityDetectionNotifyConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamQualityDetectionNotifyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionNotifys/{publishDomain}:config',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除质量检测回调配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamQualityDetectionNotifyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamQualityDetectionNotifyConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamQualityDetectionNotifyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionNotifys/{publishDomain}:config',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询质量检测模板绑定\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.template - 质量检测模板\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param templateBinding bindingList\n      */\n\n  describeQualityDetectionBinding (opts, callback) {\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling describeQualityDetectionBinding\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQualityDetectionBinding with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionTemplates/{template}:binding',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除录制文件\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.fileUrl - 需要删除的录制文件在oss的url\n\n      * @param {boolean} [opts.completely] - 是否深度删除所有的ts文件，仅对.m3u8录制文件生效。默认: true\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveRecordings (opts, callback) {\n    opts = opts || {}\n\n    if (opts.fileUrl === undefined || opts.fileUrl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileUrl' when calling deleteLiveRecordings\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.fileUrl !== undefined && opts.fileUrl !== null) {\n      queryParams['fileUrl'] = opts.fileUrl\n    }\n    if (opts.completely !== undefined && opts.completely !== null) {\n      queryParams['completely'] = opts.completely\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveRecordings with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/recordings:delete',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启P2P\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.playDomain] - 播放域名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  openLiveP2p (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.playDomain !== undefined && opts.playDomain !== null) {\n      postBody['playDomain'] = opts.playDomain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call openLiveP2p with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveP2p:open',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭P2P\n      * @param {Object} opts - parameters\n      * @param {string} [opts.playDomain] - 播放域名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  closeLiveP2p (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.playDomain !== undefined && opts.playDomain !== null) {\n      postBody['playDomain'] = opts.playDomain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call closeLiveP2p with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveP2p:close',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询P2P配置\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码\n- 取值范围[1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围[10, 100]\n  optional\n      * @param {string} opts.playDomain - 直播的播放域名\n- 目前仅支持精确匹配\n\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param p2pResultObject resultObject\n      */\n\n  describeLiveP2pConfigs (opts, callback) {\n    opts = opts || {}\n\n    if (opts.playDomain === undefined || opts.playDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.playDomain' when calling describeLiveP2pConfigs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.playDomain !== undefined && opts.playDomain !== null) {\n      queryParams['playDomain'] = opts.playDomain\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveP2pConfigs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveP2p:configs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户自定义直播录制模板列表\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围[1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围[10, 100]\n  optional\n      * @param {filter} [opts.filters] - 录制模板列表查询过滤条件:\n  - name:   template 录制模板自定义名称\n  - value:  如果参数为空，则查询全部\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param recordTemplate recordTemplates\n      */\n\n  describeCustomLiveStreamRecordTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomLiveStreamRecordTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/recordCustoms:template',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加用户自定义直播录制模板\n\n      * @param {Object} opts - parameters\n      * @param {integer} opts.recordPeriod - 自动录制周期\n- 取值: [15,360]\n- 单位: 分钟\n\n      * @param {string} opts.saveBucket - 存储桶\n\n      * @param {string} [opts.saveEndpoint] - endpoint\n  optional\n      * @param {string} opts.recordFileType - 录制文件格式:\n- 取值: ts,flv,mp4 (多种类型之间用;隔开)\n- 不区分大小写\n\n      * @param {string} opts.template - 录制模板自定义名称:\n - 取值要求：数字、大小写字母或短横线(&quot;-&quot;)、下划线(&quot;_&quot;),\n   最大长度50个字符\n - &lt;b&gt;注意: 不能与已定义命名重复&lt;/b&gt;\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addCustomLiveStreamRecordTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.recordPeriod === undefined || opts.recordPeriod === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.recordPeriod' when calling addCustomLiveStreamRecordTemplate\"\n      )\n    }\n    if (opts.saveBucket === undefined || opts.saveBucket === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.saveBucket' when calling addCustomLiveStreamRecordTemplate\"\n      )\n    }\n    if (opts.recordFileType === undefined || opts.recordFileType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.recordFileType' when calling addCustomLiveStreamRecordTemplate\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addCustomLiveStreamRecordTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.recordPeriod !== undefined && opts.recordPeriod !== null) {\n      postBody['recordPeriod'] = opts.recordPeriod\n    }\n    if (opts.saveBucket !== undefined && opts.saveBucket !== null) {\n      postBody['saveBucket'] = opts.saveBucket\n    }\n    if (opts.saveEndpoint !== undefined && opts.saveEndpoint !== null) {\n      postBody['saveEndpoint'] = opts.saveEndpoint\n    }\n    if (opts.recordFileType !== undefined && opts.recordFileType !== null) {\n      postBody['recordFileType'] = opts.recordFileType\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addCustomLiveStreamRecordTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/recordCustoms:template',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加应用级别直播录制配置\n- 添加应用级别的直播录制模板配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.template - 录制模版\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveStreamAppRecord (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveStreamAppRecord\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling addLiveStreamAppRecord\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addLiveStreamAppRecord\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveStreamAppRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/recordApps:config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加域名级别直播录制配置\n- 添加域名级别的直播录制模板配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.template - 录制模版\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveStreamDomainRecord (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveStreamDomainRecord\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addLiveStreamDomainRecord\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveStreamDomainRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/recordDomains:config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播直播录制配置\n- 录制模板配置按照 域名,应用,流 3级配置添加,以最小的粒度配置生效\n- 域名、应用、流 依次粒度递减 即: 域名&gt;应用&gt;流\n- 该查询旨在查询域名、应用、流最终生效的录制模板配置,并非各级的模板绑定情况\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围 [1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围 [10, 100]\n  optional\n      * @param {filter} [opts.filters] - 录制配置查询过滤条件:\n  - name:   publishDomain，必填(推流域名)\n  - value:  参数\n  - name:   appName，必填(应用名称)\n  - value:  参数\n  - name:   streamName，非必填(流名称)\n  - value:  参数\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param liveRecordConfig recordConfigs\n      */\n\n  describeCustomLiveStreamRecordConfig (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomLiveStreamRecordConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/records:config',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置直播录制回调通知\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.notifyUrl - 录制回调通知的URL地址\n- 以 http:// 开头,外网可访问的地址\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setLiveStreamRecordNotifyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling setLiveStreamRecordNotifyConfig\"\n      )\n    }\n    if (opts.notifyUrl === undefined || opts.notifyUrl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.notifyUrl' when calling setLiveStreamRecordNotifyConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.notifyUrl !== undefined && opts.notifyUrl !== null) {\n      postBody['notifyUrl'] = opts.notifyUrl\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setLiveStreamRecordNotifyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/recordNotifys:config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除用户自定义录制模板\n- 删除用户自定义录制模板之前必须先删除此模板在各域名、应用、流级别的录制设置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.template - 录制模板\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCustomLiveStreamRecordTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteCustomLiveStreamRecordTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCustomLiveStreamRecordTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/recordCustoms/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除应用级别录制模板配置\n- 删除应用级别的录制模板配置,重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.template - 录制模板\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamAppRecord (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamAppRecord\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling deleteLiveStreamAppRecord\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteLiveStreamAppRecord\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      appName: opts.appName,\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamAppRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/recordApps/{publishDomain}/appNames/{appName}/templates/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除域名级别录制模板配置\n- 删除域名级别录制模板配置,重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.template - 录制模板\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamDomainRecord (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamDomainRecord\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteLiveStreamDomainRecord\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamDomainRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/recordDomains/{publishDomain}/templates/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询录制回调配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string publishDomain  推流域名\n      * @param string notifyUrl  回调地址\n      */\n\n  describeLiveStreamRecordNotifyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling describeLiveStreamRecordNotifyConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamRecordNotifyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/recordNotifys/{publishDomain}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除录制回调配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamRecordNotifyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamRecordNotifyConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamRecordNotifyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/recordNotifys/{publishDomain}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加打点录制任务\n- 您可以调用此接口精确提取已录制的文件中所需要的部分\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.streamName - 流名称\n      * @param {array} [opts.recordTimes] - 录制时间集合\n- 最大支持10段,多段合并成一个文件\n- 多段时间跨度最小不能小于10s\n- 多段时间跨度最大不能超过8小时\n  optional\n      * @param {string} opts.saveBucket - 存储桶\n      * @param {string} opts.saveEndpoint - 存储地址\n      * @param {string} opts.recordFileType - 录制文件类型:\n- 取值: ts,flv,mp4 (多种类型之间用;隔开)\n- 不区分大小写\n\n      * @param {string} [opts.saveObject] - 录制文件存储Object:\n- 默认: /record/{Date}/{ServerId}/{AppName}/{StreamName}/{StartTime}_{EndTime}\n  optional\n      * @param {string} [opts.taskExternalId] - 打点录制任务外部id(可传入您的id,在回调时会在该字段返回)\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveRecordTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveRecordTask\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling addLiveRecordTask\"\n      )\n    }\n    if (opts.streamName === undefined || opts.streamName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamName' when calling addLiveRecordTask\"\n      )\n    }\n    if (opts.saveBucket === undefined || opts.saveBucket === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.saveBucket' when calling addLiveRecordTask\"\n      )\n    }\n    if (opts.saveEndpoint === undefined || opts.saveEndpoint === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.saveEndpoint' when calling addLiveRecordTask\"\n      )\n    }\n    if (opts.recordFileType === undefined || opts.recordFileType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.recordFileType' when calling addLiveRecordTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.recordTimes !== undefined && opts.recordTimes !== null) {\n      postBody['recordTimes'] = opts.recordTimes\n    }\n    if (opts.saveBucket !== undefined && opts.saveBucket !== null) {\n      postBody['saveBucket'] = opts.saveBucket\n    }\n    if (opts.saveEndpoint !== undefined && opts.saveEndpoint !== null) {\n      postBody['saveEndpoint'] = opts.saveEndpoint\n    }\n    if (opts.recordFileType !== undefined && opts.recordFileType !== null) {\n      postBody['recordFileType'] = opts.recordFileType\n    }\n    if (opts.saveObject !== undefined && opts.saveObject !== null) {\n      postBody['saveObject'] = opts.saveObject\n    }\n    if (opts.taskExternalId !== undefined && opts.taskExternalId !== null) {\n      postBody['taskExternalId'] = opts.taskExternalId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      appName: opts.appName,\n      streamName: opts.streamName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveRecordTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/records/{publishDomain}/appNames/{appName}/streamNames/{streamName}/task',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询录制模板绑定\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.template - 录制模板\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param templateBinding bindingList\n      */\n\n  describeRecordBinding (opts, callback) {\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling describeRecordBinding\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRecordBinding with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/recordTemplates/{template}:binding',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询流分组统计数据\n      * @param {Object} opts - parameters\n      * @param {string} [opts.domainName] - 播放域名  optional\n      * @param {string} [opts.appName] - 应用名称  optional\n      * @param {string} [opts.streamName] - 流名称  optional\n      * @param {string} [opts.ispName] - 运营商\n  optional\n      * @param {string} [opts.locationName] - 查询的区域，如beijing,shanghai。多个用逗号分隔\n  optional\n      * @param {string} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin,halfHour,hour,twoHour,sixHour,day,followTime”，分别表示1min，5min，半小时，1小时，2小时，6小时，1天，跟随时间。默认为空，表示fiveMin。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间，查询时间跨度不超过1天\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param liveStatisticGroupByStreamResult dataList\n      */\n\n  describeLiveStatisticGroupByStream (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveStatisticGroupByStream\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.ispName !== undefined && opts.ispName !== null) {\n      queryParams['ispName'] = opts.ispName\n    }\n    if (opts.locationName !== undefined && opts.locationName !== null) {\n      queryParams['locationName'] = opts.locationName\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStatisticGroupByStream with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveStatisticGroupByStream',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询地域分组统计数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 播放域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.streamName - 流名称\n      * @param {string} [opts.ispName] - 运营商\n  optional\n      * @param {string} [opts.locationName] - 查询的区域，如beijing,shanghai。多个用逗号分隔\n  optional\n      * @param {string} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin,halfHour,hour,twoHour,sixHour,day,followTime”，分别表示1min，5min，半小时，1小时，2小时，6小时，1天，跟随时间。默认为空，表示fiveMin。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间，查询时间跨度不超过1天\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param liveStatisticGroupByAreaResult dataList\n      */\n\n  describeLiveStatisticGroupByArea (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling describeLiveStatisticGroupByArea\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling describeLiveStatisticGroupByArea\"\n      )\n    }\n    if (opts.streamName === undefined || opts.streamName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamName' when calling describeLiveStatisticGroupByArea\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveStatisticGroupByArea\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.ispName !== undefined && opts.ispName !== null) {\n      queryParams['ispName'] = opts.ispName\n    }\n    if (opts.locationName !== undefined && opts.locationName !== null) {\n      queryParams['locationName'] = opts.locationName\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStatisticGroupByArea with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveStatisticGroupByArea',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询地域/运营商分组统计数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 播放域名\n      * @param {string} [opts.appName] - 应用名称  optional\n      * @param {string} [opts.streamName] - 流名称  optional\n      * @param {string} [opts.ispName] - 运营商\n  optional\n      * @param {string} [opts.locationName] - 查询的区域，如beijing,shanghai。多个用逗号分隔\n  optional\n      * @param {string} [opts.protocolType] - 查询的流协议类型，取值范围：&quot;rtmp,hdl,hls&quot;，多个时以逗号分隔\n  optional\n      * @param {string} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin,halfHour,hour,twoHour,sixHour,day,followTime”，分别表示1min，5min，半小时，1小时，2小时，6小时，1天，跟随时间。默认为空，表示fiveMin。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间，查询时间跨度不超过1天\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param liveStatisticGroupByAreaIspResult dataList\n      */\n\n  describeLiveStatisticGroupByAreaIsp (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling describeLiveStatisticGroupByAreaIsp\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveStatisticGroupByAreaIsp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.ispName !== undefined && opts.ispName !== null) {\n      queryParams['ispName'] = opts.ispName\n    }\n    if (opts.locationName !== undefined && opts.locationName !== null) {\n      queryParams['locationName'] = opts.locationName\n    }\n    if (opts.protocolType !== undefined && opts.protocolType !== null) {\n      queryParams['protocolType'] = opts.protocolType\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStatisticGroupByAreaIsp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveStatisticGroupByAreaIsp',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询流分组统计数据(上行)\n      * @param {Object} opts - parameters\n      * @param {string} [opts.domainName] - 播放域名  optional\n      * @param {string} [opts.appName] - 应用名称  optional\n      * @param {string} [opts.streamName] - 流名称  optional\n      * @param {string} [opts.ispName] - 运营商\n  optional\n      * @param {string} [opts.locationName] - 查询的区域，如beijing,shanghai。多个用逗号分隔\n  optional\n      * @param {string} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin,halfHour,hour,twoHour,sixHour,day,followTime”，分别表示1min，5min，半小时，1小时，2小时，6小时，1天，跟随时间。默认为空，表示fiveMin。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间，查询时间跨度不超过1天\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param liveStatisticGroupByStreamResult dataList\n      */\n\n  describeLivePublishStatisticGroupByStream (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLivePublishStatisticGroupByStream\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.ispName !== undefined && opts.ispName !== null) {\n      queryParams['ispName'] = opts.ispName\n    }\n    if (opts.locationName !== undefined && opts.locationName !== null) {\n      queryParams['locationName'] = opts.locationName\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLivePublishStatisticGroupByStream with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLivePublishStatisticGroupByStream',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询推流监控数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.streamName - 流名称\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间，查询时间跨度不超过1天\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param publishStreamInfoResult dataList\n      */\n\n  describePublishStreamInfoData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling describePublishStreamInfoData\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling describePublishStreamInfoData\"\n      )\n    }\n    if (opts.streamName === undefined || opts.streamName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamName' when calling describePublishStreamInfoData\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describePublishStreamInfoData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePublishStreamInfoData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describePublishStreamInfoData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播流历史在线人数\n      * @param {Object} opts - parameters\n      * @param {string} [opts.domainName] - 播放域名  optional\n      * @param {string} [opts.appName] - 应用名称  optional\n      * @param {string} [opts.streamName] - 流名称  optional\n      * @param {string} [opts.ispName] - 运营商\n  optional\n      * @param {string} [opts.locationName] - 查询的区域，如beijing,shanghai。多个用逗号分隔\n  optional\n      * @param {string} [opts.protocolType] - 查询的流协议类型，取值范围：&quot;rtmp,hdl,hls&quot;，多个时以逗号分隔\n  optional\n      * @param {string} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin,halfHour,hour,twoHour,sixHour,day,followTime”，分别表示1min，5min，半小时，1小时，2小时，6小时，1天，跟随时间。默认为空，表示fiveMin。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param liveStreamUserNumResult dataList\n      */\n\n  describeLiveStreamHistoryUserNum (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveStreamHistoryUserNum\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.ispName !== undefined && opts.ispName !== null) {\n      queryParams['ispName'] = opts.ispName\n    }\n    if (opts.locationName !== undefined && opts.locationName !== null) {\n      queryParams['locationName'] = opts.locationName\n    }\n    if (opts.protocolType !== undefined && opts.protocolType !== null) {\n      queryParams['protocolType'] = opts.protocolType\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamHistoryUserNum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveStreamHistoryUserNum',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播推流数\n      * @param {Object} opts - parameters\n      * @param {string} [opts.domainName] - 播放域名  optional\n      * @param {string} [opts.appName] - 应用名称  optional\n      * @param {string} [opts.protocolType] - 查询的流协议类型，取值范围：&quot;rtmp,hdl,hls&quot;，多个时以逗号分隔\n  optional\n      * @param {string} [opts.ispName] - 运营商\n  optional\n      * @param {string} [opts.locationName] - 查询的区域，如beijing,shanghai。多个用逗号分隔\n  optional\n      * @param {string} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin,halfHour,hour,twoHour,sixHour,day,followTime”，分别表示1min，5min，半小时，1小时，2小时，6小时，1天，跟随时间。默认为空，表示fiveMin。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param liveStreamUserNumResult dataList\n      */\n\n  describeLivePublishStreamNum (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLivePublishStreamNum\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.protocolType !== undefined && opts.protocolType !== null) {\n      queryParams['protocolType'] = opts.protocolType\n    }\n    if (opts.ispName !== undefined && opts.ispName !== null) {\n      queryParams['ispName'] = opts.ispName\n    }\n    if (opts.locationName !== undefined && opts.locationName !== null) {\n      queryParams['locationName'] = opts.locationName\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLivePublishStreamNum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLivePublishStreamNum',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播流播放人数排行\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.protocolType - 协议，取值范围：&quot;hdl,hls&quot;\n\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间，时间跨度不不超过⼀一天\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param liveStreamPlayerRankingResult dataList\n      */\n\n  describeLiveStreamPlayerRankingData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling describeLiveStreamPlayerRankingData\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling describeLiveStreamPlayerRankingData\"\n      )\n    }\n    if (opts.protocolType === undefined || opts.protocolType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.protocolType' when calling describeLiveStreamPlayerRankingData\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveStreamPlayerRankingData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.protocolType !== undefined && opts.protocolType !== null) {\n      queryParams['protocolType'] = opts.protocolType\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamPlayerRankingData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveStreamPlayerRankingData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码流信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 推流域名\n\n      * @param {string} opts.appName - 应用名称\n\n      * @param {string} opts.streamName - 流名称\n\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param liveTranscodeStreamResult dataList\n      */\n\n  describeLiveTranscodeStreamList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling describeLiveTranscodeStreamList\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling describeLiveTranscodeStreamList\"\n      )\n    }\n    if (opts.streamName === undefined || opts.streamName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamName' when calling describeLiveTranscodeStreamList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveTranscodeStreamList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveTranscodeStreamList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码流数量\n      * @param {Object} opts - parameters\n      * @param {string} [opts.domainName] - 推流域名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string datetime  时间\n      * @param integer streamCount  流数量\n      */\n\n  describeLiveTranscodeStreamNum (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveTranscodeStreamNum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveTranscodeStreamNum',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码流观看人数\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} [opts.ispName] - 运营商\n  optional\n      * @param {string} [opts.locationName] - 查询的区域，如beijing,shanghai。多个用逗号分隔\n  optional\n      * @param {string} [opts.protocolType] - 查询的流协议类型，取值范围：&quot;rtmp,hdl,hls&quot;，多个时以逗号分隔\n  optional\n      * @param {string} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin,halfHour,hour,twoHour,sixHour,day,followTime”，分别表示1min，5min，半小时，1小时，2小时，6小时，1天，跟随时间。默认为空，表示fiveMin。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 查询起始时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n\n      * @param {string} [opts.endTime] - 查询截至时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，为空时默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param liveStreamUserNumResult dataList\n      */\n\n  describeLiveTranscodeStreamPlayerUserNum (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling describeLiveTranscodeStreamPlayerUserNum\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling describeLiveTranscodeStreamPlayerUserNum\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveTranscodeStreamPlayerUserNum\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.ispName !== undefined && opts.ispName !== null) {\n      queryParams['ispName'] = opts.ispName\n    }\n    if (opts.locationName !== undefined && opts.locationName !== null) {\n      queryParams['locationName'] = opts.locationName\n    }\n    if (opts.protocolType !== undefined && opts.protocolType !== null) {\n      queryParams['protocolType'] = opts.protocolType\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveTranscodeStreamPlayerUserNum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveTranscodeStreamPlayerUserNum',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码流播放带宽\n- 查询1分钟粒度的数据时，时间跨度不超过7天，其他粒度时时间跨度不超过30天\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} [opts.ispName] - 运营商\n  optional\n      * @param {string} [opts.locationName] - 查询的区域，如beijing,shanghai。多个用逗号分隔\n  optional\n      * @param {string} [opts.protocolType] - 查询的流协议类型，取值范围：&quot;rtmp,hdl,hls&quot;，多个时以逗号分隔\n  optional\n      * @param {string} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin,halfHour,hour,twoHour,sixHour,day,followTime”，分别表示1min，5min，半小时，1小时，2小时，6小时，1天，跟随时间。默认为空，表示fiveMin。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 查询起始时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n\n      * @param {string} [opts.endTime] - 查询截至时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，为空时默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bandwidthStatisticResult dataList\n      */\n\n  describeLiveTranscodeStreamBandwidth (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling describeLiveTranscodeStreamBandwidth\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling describeLiveTranscodeStreamBandwidth\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveTranscodeStreamBandwidth\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.ispName !== undefined && opts.ispName !== null) {\n      queryParams['ispName'] = opts.ispName\n    }\n    if (opts.locationName !== undefined && opts.locationName !== null) {\n      queryParams['locationName'] = opts.locationName\n    }\n    if (opts.protocolType !== undefined && opts.protocolType !== null) {\n      queryParams['protocolType'] = opts.protocolType\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveTranscodeStreamBandwidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveTranscodeStreamBandwidth',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询在线流列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 推流域名\n      * @param {string} [opts.appName] - 应用名称  optional\n      * @param {string} [opts.streamName] - 流名称  optional\n      * @param {integer} [opts.pageNum] - 页码，起始页码1\n  optional\n      * @param {integer} [opts.pageSize] - 每页最大记录数，取值：[10,100]，默认：10\n  optional\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间，查询时间跨度不超过30天\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param publishOnlineStreamResultData streamList\n      * @param integer total  流数量\n      */\n\n  describeDomainOnlineStream (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling describeDomainOnlineStream\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeDomainOnlineStream\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDomainOnlineStream with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeDomainOnlineStream',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  日志下载\n      * @param {Object} opts - parameters\n      * @param {string} opts.domains - 播放域名，多个时以逗号（,）分隔\n      * @param {string} [opts.interval] - 时间间隔，取值(hour，day),不传默认小时\n- 按小时（hour）下载时是.log文件\n- 按天（day）下载时是.zip文件\n  optional\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainsLogResult dataList\n      */\n\n  describeDomainsLog (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domains === undefined || opts.domains === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domains' when calling describeDomainsLog\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeDomainsLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domains !== undefined && opts.domains !== null) {\n      queryParams['domains'] = opts.domains\n    }\n    if (opts.interval !== undefined && opts.interval !== null) {\n      queryParams['interval'] = opts.interval\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDomainsLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeDomainsLog',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询URL播放排行\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 播放域名\n      * @param {integer} [opts.size] - 查询Top数量，默认20，即返回Top20的数据  optional\n      * @param {string} [opts.rankfield] - 排行依据字段，取值：[&quot;pv&quot;, &quot;flow&quot;, &quot;bandwidth&quot;]，默认pv\n- pv 播放次数\n- flow 流量\n- bandwidth 带宽\n  optional\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rankingUrlResult dataList\n      */\n\n  describeUrlRanking (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling describeUrlRanking\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeUrlRanking\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.size !== undefined && opts.size !== null) {\n      queryParams['size'] = opts.size\n    }\n    if (opts.rankfield !== undefined && opts.rankfield !== null) {\n      queryParams['rankfield'] = opts.rankfield\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUrlRanking with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeUrlRanking',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询推流码率、帧率\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 推流域名\n      * @param {string} [opts.appName] - 应用名称  optional\n      * @param {string} [opts.streamName] - 流名称  optional\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间\n  optional\n      * @param {integer} [opts.pageNumber] - 页码，起始页码1\n  optional\n      * @param {integer} [opts.pageSize] - 每页最大记录数，取值：[10,1000]，默认：100\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param liveStreamPublishInfo publishInfoList\n      */\n\n  describeLiveStreamPublishInfoByPage (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling describeLiveStreamPublishInfoByPage\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveStreamPublishInfoByPage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamPublishInfoByPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveStreamPublishInfoByPage',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询观看人数\n      * @param {Object} opts - parameters\n      * @param {string} opts.domainName - 推流域名\n      * @param {string} [opts.appName] - 应用名称  optional\n      * @param {string} [opts.streamName] - 流名称  optional\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间\n  optional\n      * @param {integer} [opts.pageNumber] - 页码，起始页码1\n  optional\n      * @param {integer} [opts.pageSize] - 每页最大记录数，取值：[10,1000]，默认：100\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param liveStreamPlayInfo playInfoList\n      */\n\n  describeLiveStreamPlayInfoByPage (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainName === undefined || opts.domainName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainName' when calling describeLiveStreamPlayInfoByPage\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveStreamPlayInfoByPage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamPlayInfoByPage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveStreamPlayInfoByPage',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码时长数据\n      * @param {Object} opts - parameters\n      * @param {string} [opts.domainName] - 播放域名  optional\n      * @param {string} [opts.grade] - 码率档次，可以查询指定档次的转码时长，取值：\n- video_h264_4k_1\n- video_h264_2k_1\n- video_h264_shd_1\n- video_h264_hd_1\n- video_h264_sd_1\n- video_h265_4k_1\n- video_h265_2k_1\n- video_h265_shd_1\n- video_h265_hd_1\n- video_h265_sd_1\n  optional\n      * @param {string} [opts.period] - 查询周期，取值范围：“day,month,year,followTime”，分别表示1天，1月，1年，跟随时间。默认为空，表示day。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 查询起始时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n\n      * @param {string} [opts.endTime] - 查询截至时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，为空时默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeDurationStatisticResult dataList\n      */\n\n  describeLiveTranscodingDurationData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveTranscodingDurationData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.grade !== undefined && opts.grade !== null) {\n      queryParams['grade'] = opts.grade\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveTranscodingDurationData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveTranscodingDurationData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询存储空间数据\n      * @param {Object} opts - parameters\n      * @param {string} [opts.period] - 查询周期，取值范围：“day,month,year,followTime”，分别表示1天，1月，1年，跟随时间。默认为空，表示day。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 查询起始时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n\n      * @param {string} [opts.endTime] - 查询截至时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，为空时默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param fileStorageStatisticResult dataList\n      */\n\n  describeLiveFileStorageData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveFileStorageData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveFileStorageData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveFileStorageData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询带宽数据\n- 查询某个时间段内的带宽数据（平均带宽）\n- 查询1分钟粒度的数据时，时间跨度不超过7天，其他粒度时时间跨度不超过30天\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.domainName] - 播放域名，可以通过指定域名查询该域名下产生的带宽数据。\n  optional\n      * @param {string} [opts.appName] - 推流AppName，将AppName作为查询条件时须指定域名。\n  optional\n      * @param {string} [opts.streamName] - 流名称，将流名称作为查询条件时须指定域名和AppName。\n  optional\n      * @param {string} [opts.ispName] - 运营商\n  optional\n      * @param {string} [opts.locationName] - 查询的区域，如beijing,shanghai。多个用逗号分隔\n  optional\n      * @param {string} [opts.protocolType] - 查询的流协议类型，取值范围：&quot;rtmp,hdl,hls&quot;，多个时以逗号分隔\n  optional\n      * @param {string} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin,halfHour,hour,twoHour,sixHour,day,followTime”，分别表示1min，5min，半小时，1小时，2小时，6小时，1天，跟随时间。默认为空，表示fiveMin。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 查询起始时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n\n      * @param {string} [opts.endTime] - 查询截至时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，为空时默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bandwidthStatisticResult dataList\n      */\n\n  describeLiveStreamBandwidthData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveStreamBandwidthData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.ispName !== undefined && opts.ispName !== null) {\n      queryParams['ispName'] = opts.ispName\n    }\n    if (opts.locationName !== undefined && opts.locationName !== null) {\n      queryParams['locationName'] = opts.locationName\n    }\n    if (opts.protocolType !== undefined && opts.protocolType !== null) {\n      queryParams['protocolType'] = opts.protocolType\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamBandwidthData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveStreamBandwidthData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询推流带宽\n- 查询某个时间段内的推流上行带宽数据\n- 查询1分钟粒度的数据时，时间跨度不超过7天，其他粒度时时间跨度不超过30天\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.domainName] - 推流域名，可以通过指定域名查询该域名下产生的带宽数据。\n  optional\n      * @param {string} [opts.appName] - 推流AppName，将AppName作为查询条件时须指定域名。\n  optional\n      * @param {string} [opts.streamName] - 流名称，将流名称作为查询条件时须指定域名和AppName。\n  optional\n      * @param {string} [opts.ispName] - 运营商\n  optional\n      * @param {string} [opts.locationName] - 查询的区域，如beijing,shanghai。多个用逗号分隔\n  optional\n      * @param {string} [opts.protocolType] - 查询的流协议类型，取值范围：&quot;rtmp,hdl,hls&quot;，多个时以逗号分隔\n  optional\n      * @param {string} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin,halfHour,hour,twoHour,sixHour,day,followTime”，分别表示1min，5min，半小时，1小时，2小时，6小时，1天，跟随时间。默认为空，表示fiveMin。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 查询起始时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n\n      * @param {string} [opts.endTime] - 查询截至时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，为空时默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bandwidthStatisticResult dataList\n      */\n\n  describeLiveStreamPublishBandwidthData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveStreamPublishBandwidthData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.ispName !== undefined && opts.ispName !== null) {\n      queryParams['ispName'] = opts.ispName\n    }\n    if (opts.locationName !== undefined && opts.locationName !== null) {\n      queryParams['locationName'] = opts.locationName\n    }\n    if (opts.protocolType !== undefined && opts.protocolType !== null) {\n      queryParams['protocolType'] = opts.protocolType\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamPublishBandwidthData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveStreamPublishBandwidthData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询流量数据\n- 查询某个时间段内的流量数据。\n- 查询1分钟粒度的数据时，时间跨度不超过7天，其他粒度时时间跨度不超过30天\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.domainName] - 播放域名，可以通过指定域名查询该域名下产生的带宽数据。\n  optional\n      * @param {string} [opts.appName] - 推流AppName，将AppName作为查询条件时须指定域名。\n  optional\n      * @param {string} [opts.streamName] - 流名称\n  optional\n      * @param {string} [opts.ispName] - 运营商\n  optional\n      * @param {string} [opts.locationName] - 查询的区域，如beijing,shanghai。多个用逗号分隔\n  optional\n      * @param {string} [opts.protocolType] - 查询的流协议类型，取值范围：&quot;rtmp,hdl,hls&quot;，多个时以逗号分隔\n  optional\n      * @param {string} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin,halfHour,hour,twoHour,sixHour,day,followTime”，分别表示1min，5min，半小时，1小时，2小时，6小时，1天，跟随时间。默认为空，表示fiveMin。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 查询起始时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n\n      * @param {string} [opts.endTime] - 查询截至时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，为空时默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param trafficStatisticResult dataList\n      */\n\n  describeLiveStreamTrafficData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveStreamTrafficData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.ispName !== undefined && opts.ispName !== null) {\n      queryParams['ispName'] = opts.ispName\n    }\n    if (opts.locationName !== undefined && opts.locationName !== null) {\n      queryParams['locationName'] = opts.locationName\n    }\n    if (opts.protocolType !== undefined && opts.protocolType !== null) {\n      queryParams['protocolType'] = opts.protocolType\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamTrafficData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveStreamTrafficData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询推流上行流量数据\n- 查询某个时间段内的流量数据。\n- 查询1分钟粒度的数据时，时间跨度不超过7天，其他粒度时时间跨度不超过30天\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.domainName] - 推流域名，可以通过指定域名查询该域名下产生的带宽数据。\n  optional\n      * @param {string} [opts.appName] - 推流AppName，将AppName作为查询条件时须指定域名。\n  optional\n      * @param {string} [opts.streamName] - 流名称\n  optional\n      * @param {string} [opts.ispName] - 运营商\n  optional\n      * @param {string} [opts.locationName] - 查询的区域，如beijing,shanghai。多个用逗号分隔\n  optional\n      * @param {string} [opts.protocolType] - 查询的流协议类型，取值范围：&quot;rtmp,hdl,hls&quot;，多个时以逗号分隔\n  optional\n      * @param {string} [opts.period] - 查询周期，当前取值范围：“oneMin,fiveMin,halfHour,hour,twoHour,sixHour,day,followTime”，分别表示1min，5min，半小时，1小时，2小时，6小时，1天，跟随时间。默认为空，表示fiveMin。当传入followTime时，表示按Endtime-StartTime的周期，只返回一个点\n  optional\n      * @param {string} opts.startTime - 查询起始时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n\n      * @param {string} [opts.endTime] - 查询截至时间，UTC时间，格式：yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;，为空时默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param trafficStatisticResult dataList\n      */\n\n  describeLiveStreamPublishTrafficData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveStreamPublishTrafficData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.ispName !== undefined && opts.ispName !== null) {\n      queryParams['ispName'] = opts.ispName\n    }\n    if (opts.locationName !== undefined && opts.locationName !== null) {\n      queryParams['locationName'] = opts.locationName\n    }\n    if (opts.protocolType !== undefined && opts.protocolType !== null) {\n      queryParams['protocolType'] = opts.protocolType\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamPublishTrafficData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeLiveStreamPublishTrafficData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播截图张数数据\n      * @param {Object} opts - parameters\n      * @param {string} [opts.publishDomain] - 推流域名  optional\n      * @param {string} [opts.appName] - 应用名称  optional\n      * @param {string} [opts.streamName] - 流名称  optional\n      * @param {integer} [opts.shotMode] - 截图模式：1表示采样截图；2表示关键帧截图(默认为2)  optional\n      * @param {string} opts.startTime - 起始时间:\n- UTC时间\n  格式: yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例: 2018-10-21T10:00:00Z\n- 支持最大查询90天以内的数据\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式: yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例: 2018-10-21T10:00:00Z\n- 为空,默认当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotCountStatisticResult snapshotData\n      */\n\n  describeLiveSnapshotData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveSnapshotData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      queryParams['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.shotMode !== undefined && opts.shotMode !== null) {\n      queryParams['shotMode'] = opts.shotMode\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveSnapshotData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveSnapshotData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播鉴黄张数数据\n      * @param {Object} opts - parameters\n      * @param {string} [opts.publishDomain] - 推流域名  optional\n      * @param {string} [opts.appName] - 应用名称  optional\n      * @param {string} [opts.streamName] - 流名称  optional\n      * @param {string} opts.startTime - 起始时间\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 支持最大查询90天以内的数据\n\n      * @param {string} [opts.endTime] - 结束时间:\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 为空,默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pornCountStatisticResult pornData\n      */\n\n  describeLivePornData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLivePornData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      queryParams['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLivePornData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/livePornData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加直播截图模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.format - 截图格式\n- 取值: jpg, png\n- 不区分大小写\n\n      * @param {integer} [opts.width] - 截图宽度\n- 取值: [8,8192]\n- 如果(width,height)只设置其中之一,则按所设置参数项等比缩放另一项输出截图\n- 如果(width,height)都不设置，则按源流大小输出截图\n  optional\n      * @param {integer} [opts.height] - 截图高度\n- 取值: [8,8192]\n- 如果(width,height)只设置其中之一,则按所设置参数项等比缩放另一项输出截图\n- 如果(width,height)都不设置，则按源流大小输出截图\n  optional\n      * @param {integer} opts.fillType - 截图与设定的宽高不匹配时的处理规则\n  1: 拉伸\n  2: 留黑\n  3: 留白\n  4: 高斯模糊\n- 1是按照设定宽高拉伸\n- 2,3,4是等比例的缩放多余或不足处按调置处理\n\n      * @param {integer} opts.snapshotInterval - 截图周期\n- 取值范围 [5,3600]\n- 单位: 秒\n\n      * @param {integer} opts.saveMode - 存储模式\n  1: 覆盖存储\n  2: 顺序存储\n\n      * @param {string} opts.saveBucket - 存储桶\n      * @param {string} [opts.saveEndpoint] - 存储地址  optional\n      * @param {string} opts.template - 截图模板自定义名称:\n- 取值要求: 数字、大小写字母或短横线(&quot;-&quot;)、下划线(&quot;_&quot;),\n  首尾不能有特殊字符(&quot;-&quot;)\n  最大长度50个字符\n- &lt;b&gt;注意: 不能与已定义命名重复&lt;/b&gt;\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addCustomLiveStreamSnapshotTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.format === undefined || opts.format === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.format' when calling addCustomLiveStreamSnapshotTemplate\"\n      )\n    }\n    if (opts.fillType === undefined || opts.fillType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fillType' when calling addCustomLiveStreamSnapshotTemplate\"\n      )\n    }\n    if (opts.snapshotInterval === undefined || opts.snapshotInterval === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.snapshotInterval' when calling addCustomLiveStreamSnapshotTemplate\"\n      )\n    }\n    if (opts.saveMode === undefined || opts.saveMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.saveMode' when calling addCustomLiveStreamSnapshotTemplate\"\n      )\n    }\n    if (opts.saveBucket === undefined || opts.saveBucket === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.saveBucket' when calling addCustomLiveStreamSnapshotTemplate\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addCustomLiveStreamSnapshotTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.format !== undefined && opts.format !== null) {\n      postBody['format'] = opts.format\n    }\n    if (opts.width !== undefined && opts.width !== null) {\n      postBody['width'] = opts.width\n    }\n    if (opts.height !== undefined && opts.height !== null) {\n      postBody['height'] = opts.height\n    }\n    if (opts.fillType !== undefined && opts.fillType !== null) {\n      postBody['fillType'] = opts.fillType\n    }\n    if (opts.snapshotInterval !== undefined && opts.snapshotInterval !== null) {\n      postBody['snapshotInterval'] = opts.snapshotInterval\n    }\n    if (opts.saveMode !== undefined && opts.saveMode !== null) {\n      postBody['saveMode'] = opts.saveMode\n    }\n    if (opts.saveBucket !== undefined && opts.saveBucket !== null) {\n      postBody['saveBucket'] = opts.saveBucket\n    }\n    if (opts.saveEndpoint !== undefined && opts.saveEndpoint !== null) {\n      postBody['saveEndpoint'] = opts.saveEndpoint\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addCustomLiveStreamSnapshotTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotCustoms:template',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播截图配置\n- 截图模板配置按照 域名,应用,流 3级配置添加,以最小的粒度配置生效\n- 域名、应用、流 依次粒度递减 即: 域名&gt;应用&gt;流\n- 该查询旨在查询域名、应用、流最终生效的截图模板配置,并非各级的模板绑定情况\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围 [1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围 [10, 100]\n  optional\n      * @param {filter} [opts.filters] - 直播截图查询过滤条件:\n- name:   publishDomain 必填(推流域名)\n- value:  参数\n- name:   appName 必填(应用名称)\n- value:  参数\n- name:   streamName 非必填(流名称)\n- value:  参数\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param snapshotConfig snapshotConfigs\n      */\n\n  describeCustomLiveStreamSnapshotConfig (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomLiveStreamSnapshotConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotCustoms:config',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播截图模板列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围 [1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围 [10, 100]\n  optional\n      * @param {filter} [opts.filters] - 截图模板查询过滤条件\n- name:   template 录制模板自定义名称\n- value:  如果参数为空，则查询全部\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param snapshotTemplate snapshotTemplates\n      */\n\n  describeCustomLiveStreamSnapshotTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomLiveStreamSnapshotTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotCustoms',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加应用截图配置\n- 添加应用级别的截图模板配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.template - 截图模板\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveStreamAppSnapshot (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveStreamAppSnapshot\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling addLiveStreamAppSnapshot\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addLiveStreamAppSnapshot\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveStreamAppSnapshot with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotApps:template',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加域名截图配置\n- 添加域名级别的截图模板配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.template - 截图模板\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveStreamDomainSnapshot (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveStreamDomainSnapshot\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addLiveStreamDomainSnapshot\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveStreamDomainSnapshot with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotDomains:template',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置直播截图回调通知地址\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.notifyUrl - 截图回调通知的URL地址:\n- 以 http:// 开头,外网可访问的地址\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setLiveStreamSnapshotNotifyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling setLiveStreamSnapshotNotifyConfig\"\n      )\n    }\n    if (opts.notifyUrl === undefined || opts.notifyUrl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.notifyUrl' when calling setLiveStreamSnapshotNotifyConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.notifyUrl !== undefined && opts.notifyUrl !== null) {\n      postBody['notifyUrl'] = opts.notifyUrl\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setLiveStreamSnapshotNotifyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotNotifys:config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除用户自定义直播截图模板\n- 删除截图模板前,请先删除此模板相关的截图配置,否则将会影响线上业务\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.template - 截图模板\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCustomLiveStreamSnapshotTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteCustomLiveStreamSnapshotTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCustomLiveStreamSnapshotTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotCustoms/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除APP截图配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.template - 截图模板\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamAppSnapshot (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamAppSnapshot\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling deleteLiveStreamAppSnapshot\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteLiveStreamAppSnapshot\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      appName: opts.appName,\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamAppSnapshot with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotApps/{publishDomain}/appNames/{appName}/templates/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除域名截图配置\n- 删除域名级别的截图模板配置,重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.template - 截图模板\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamDomainSnapshot (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamDomainSnapshot\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteLiveStreamDomainSnapshot\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamDomainSnapshot with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotDomains/{publishDomain}/templates/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询截图回调配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string publishDomain  推流域名\n      * @param string notifyUrl  回调地址\n      */\n\n  describeLiveStreamSnapshotNotifyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling describeLiveStreamSnapshotNotifyConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamSnapshotNotifyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotNotifys/{publishDomain}:config',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除截图回调配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamSnapshotNotifyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamSnapshotNotifyConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamSnapshotNotifyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotNotifys/{publishDomain}:config',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询截图模板绑定\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.template - 截图模板\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param templateBinding bindingList\n      */\n\n  describeSnapshotBinding (opts, callback) {\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling describeSnapshotBinding\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSnapshotBinding with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTemplates/{template}:binding',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁止直播流推送\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.streamName - 流名称\n      * @param {integer} [opts.forbidTime] - 禁流时长,单位:s 0表示永久禁流;大于0为限时禁流,超过时长自动解禁  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  forbidLiveStream (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling forbidLiveStream\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling forbidLiveStream\"\n      )\n    }\n    if (opts.streamName === undefined || opts.streamName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamName' when calling forbidLiveStream\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      postBody['streamName'] = opts.streamName\n    }\n    if (opts.forbidTime !== undefined && opts.forbidTime !== null) {\n      postBody['forbidTime'] = opts.forbidTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call forbidLiveStream with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/streams:forbid',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  恢复直播流推送\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.streamName - 流名称\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resumeLiveStream (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling resumeLiveStream\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling resumeLiveStream\"\n      )\n    }\n    if (opts.streamName === undefined || opts.streamName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamName' when calling resumeLiveStream\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      postBody['streamName'] = opts.streamName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resumeLiveStream with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/streams:resume',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  中断直播流推送\n- 中断操作1秒后可以继续推流\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.streamName - 流名称\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  interruptLiveStream (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling interruptLiveStream\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling interruptLiveStream\"\n      )\n    }\n    if (opts.streamName === undefined || opts.streamName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamName' when calling interruptLiveStream\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      postBody['streamName'] = opts.streamName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call interruptLiveStream with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/streams:interrupt',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播实时流信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.streamName - 流名称\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string publishDomain  推流域名\n      * @param string appName  应用名称\n      * @param string streamName  流名称\n      * @param string status  流状态\n  on: 在线流\n  off: 非在线流\n\n      */\n\n  describeLiveStreamInfo (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling describeLiveStreamInfo\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling describeLiveStreamInfo\"\n      )\n    }\n    if (opts.streamName === undefined || opts.streamName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamName' when calling describeLiveStreamInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      appName: opts.appName,\n      streamName: opts.streamName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/streams/{publishDomain}/appNames/{appName}/streamNames/{streamName}/streamInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置直播流状态回调地址\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.notifyUrl - 直播流状态回调地址\n- 必须以 http:// 开头\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setLiveStreamNotifyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling setLiveStreamNotifyConfig\"\n      )\n    }\n    if (opts.notifyUrl === undefined || opts.notifyUrl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.notifyUrl' when calling setLiveStreamNotifyConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.notifyUrl !== undefined && opts.notifyUrl !== null) {\n      postBody['notifyUrl'] = opts.notifyUrl\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setLiveStreamNotifyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/streamNotifys',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播流状态回调地址\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string publishDomain  推流域名\n      * @param string notifyUrl  流状态回调地址\n      */\n\n  describeLiveStreamNotifyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling describeLiveStreamNotifyConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamNotifyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/streamNotifys/{publishDomain}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除直播流状态回调地址\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamNotifyConfig (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamNotifyConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamNotifyConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/streamNotifys/{publishDomain}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播中的流的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围[1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围[10, 100]\n  optional\n      * @param {string} [opts.appName] - 应用名称  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param onlineStreamInfo onlineStreamInfos\n      */\n\n  describeLiveStreamOnlineList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling describeLiveStreamOnlineList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamOnlineList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/streams/{publishDomain}/onlineList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看推流历史记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {integer} [opts.pageNum] - 页码&lt;br&gt;\n- 取值范围[1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小&lt;br&gt;\n- 取值范围[10, 100]\n  optional\n      * @param {string} [opts.appName] - 应用名称  optional\n      * @param {string} [opts.streamName] - 流名称  optional\n      * @param {string} opts.startTime - 推流起始时间&lt;br&gt;\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 最大支持最近30天内的流历史查询\n\n      * @param {string} [opts.endTime] - 推流结束时间&lt;br&gt;\n- UTC时间\n  格式:yyyy-MM-dd&#39;T&#39;HH:mm:ss&#39;Z&#39;\n  示例:2018-10-21T10:00:00Z\n- 最大支持最近30天内的流历史查询\n- 结束时间为空默认为当前时间\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param liveStreamPublishInfo liveStreamPublishInfos\n      */\n\n  describeLiveStreamPublishList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling describeLiveStreamPublishList\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeLiveStreamPublishList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      queryParams['streamName'] = opts.streamName\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamPublishList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/streams/{publishDomain}/publishList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启回看\n1、直播回看文件格式仅支持m3u8。\n2、回看时长用户可以配置，最大支持7天，即用户请求回看内容，最多可以请求最近7天的直播回看内容。\n3、域名格式：http://{restartDomain}/{appName}/{streamName}/index.m3u8?starttime&#x3D;1527756680&amp;endtime&#x3D;1527760280 (unix时间戳)\n4、starttime-endtime最长可支持24小时，可跨天\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.restartDomain - 回看的播放域名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  openLiveRestart (opts, callback) {\n    opts = opts || {}\n\n    if (opts.restartDomain === undefined || opts.restartDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restartDomain' when calling openLiveRestart\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.restartDomain !== undefined && opts.restartDomain !== null) {\n      postBody['restartDomain'] = opts.restartDomain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call openLiveRestart with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveRestart:open',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭回看\n      * @param {Object} opts - parameters\n      * @param {string} opts.restartDomain - 回看的播放域名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  closeLiveRestart (opts, callback) {\n    opts = opts || {}\n\n    if (opts.restartDomain === undefined || opts.restartDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restartDomain' when calling closeLiveRestart\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.restartDomain !== undefined && opts.restartDomain !== null) {\n      postBody['restartDomain'] = opts.restartDomain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call closeLiveRestart with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveRestart:close',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询回看配置\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码；默认为1；取值范围[1, 100000]  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} opts.restartDomain - 回看的推流域名\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param restartConfig restartConfigs\n      */\n\n  describeLiveRestartConfigs (opts, callback) {\n    opts = opts || {}\n\n    if (opts.restartDomain === undefined || opts.restartDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restartDomain' when calling describeLiveRestartConfigs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.restartDomain !== undefined && opts.restartDomain !== null) {\n      queryParams['restartDomain'] = opts.restartDomain\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveRestartConfigs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveRestart:configs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启时移\n直播支持最大4小时的HLS时移，使用方式为在播放域名后增加时移参数来实现，参数类型支持指定开始时间和时间偏移量2种方式进行时移。 开启直播时移后，重新推流生效，使用播放域名带相应参数访问即可播放\n- 域名格式：\n1、http://{playDomain}/{appName}/{streamName}/index.m3u8?timeshift&#x3D;400（秒，指从当前时间往前时移的偏移量）\n2、http://{playDomain}/{appName}/{streamName}/index.m3u8?starttime&#x3D;1529223702 (unix时间戳)\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.playDomain - 直播的播放域名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  openLiveTimeshift (opts, callback) {\n    opts = opts || {}\n\n    if (opts.playDomain === undefined || opts.playDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.playDomain' when calling openLiveTimeshift\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.playDomain !== undefined && opts.playDomain !== null) {\n      postBody['playDomain'] = opts.playDomain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call openLiveTimeshift with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveTimeshift:open',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭时移\n      * @param {Object} opts - parameters\n      * @param {string} opts.playDomain - 直播的播放域名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  closeLiveTimeshift (opts, callback) {\n    opts = opts || {}\n\n    if (opts.playDomain === undefined || opts.playDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.playDomain' when calling closeLiveTimeshift\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.playDomain !== undefined && opts.playDomain !== null) {\n      postBody['playDomain'] = opts.playDomain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call closeLiveTimeshift with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveTimeshift:close',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询时移配置\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码\n- 取值范围[1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围[10, 100]\n  optional\n      * @param {string} opts.playDomain - 直播的播放域名\n- 目前仅支持精确匹配\n\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param timeshiftConfig timeshiftConfigs\n      */\n\n  describeLiveTimeshiftConfigs (opts, callback) {\n    opts = opts || {}\n\n    if (opts.playDomain === undefined || opts.playDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.playDomain' when calling describeLiveTimeshiftConfigs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.playDomain !== undefined && opts.playDomain !== null) {\n      queryParams['playDomain'] = opts.playDomain\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveTimeshiftConfigs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/liveTimeshift:configs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加域名级别转码配置\n- 添加域名级别的转码模板配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 直播的推流域名\n      * @param {string} opts.template - 转码模版\n- 取值范围: 系统标准转码模板, 用户自定义转码模板\n- 系统标准转码模板\n  ld (h.264/640*360/15f)\n  sd (h.264/960*540/25f)\n  hd (h.264/1280*720/25f)\n  shd (h.264/1920*1080/30f)\n  ld-265 (h.265/640*360/15f)\n  sd-265 (h.265/960*540/25f)\n  hd-265 (h.265/1280*720/25f)\n  shd-265 (h.265/1920*1080/30f)\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveStreamDomainTranscode (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveStreamDomainTranscode\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addLiveStreamDomainTranscode\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveStreamDomainTranscode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeDomains:config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加应用转码配置\n- 添加应用级别的转码模板配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.template - 转码模版\n- 取值范围: 系统标准转码模板, 用户自定义转码模板\n- 系统标准转码模板\n  ld (h.264/640*360/15f)\n  sd (h.264/960*540/25f)\n  hd (h.264/1280*720/25f)\n  shd (h.264/1920*1080/30f)\n  ld-265 (h.265/640*360/15f)\n  sd-265 (h.265/960*540/25f)\n  hd-265 (h.265/1280*720/25f)\n  shd-265 (h.265/1920*1080/30f)\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveStreamAppTranscode (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveStreamAppTranscode\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling addLiveStreamAppTranscode\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addLiveStreamAppTranscode\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveStreamAppTranscode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeApps:config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加自定义转码模板\n- 系统为您预设了标准转码模板,如果不能满足您的转码需求,可以通过此接口添加自定义转码模板\n- 系统标准转码模板\n    ld (h.264/640*360/15f)\n    sd (h.264/960*540/25f)\n    hd (h.264/1280*720/25f)\n    shd (h.264/1920*1080/30f)\n    ld-265 (h.265/640*360/15f)\n    sd-265 (h.265/960*540/25f)\n    hd-265 (h.265/1280*720/25f)\n    shd-265 (h.265/1920*1080/30f)\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.templateName] - 转码模板名称\n- 长度范围：[1,50]\n  optional\n      * @param {string} [opts.videoCodec] - 视频编码格式，取值：h264,h265，默认h264\n- h264时,分辨率小于等于1080p\n- h265时,分辨率小于等于4k\n  optional\n      * @param {integer} opts.videoCodeRate - 转码输出的码率值\n- 取值范围: [128,15000]\n- 单位: kpbs\n\n      * @param {string} opts.videoFrameRate - 转码输出的帧率值\n- 取值：[1,30]\n\n      * @param {integer} [opts.width] - 转码输出视频宽度\n- 取值: [128,4096]\n- 如果(width,height)只设置其中之一,则按所设置参数项等比缩放另一项输出转码\n- 如果(width,height)都不设置，则按源流大小输出转码\n  optional\n      * @param {integer} [opts.height] - 转码输出视频高度\n- 取值: [128,4096]\n- 如果(width,height)只设置其中之一,则按所设置参数项等比缩放另一项输出转码\n- 如果(width,height)都不设置，则按源流大小输出转码\n  optional\n      * @param {string} opts.template - 转码模板(转码流输出后缀)\n- 取值要求：数字、大小写字母或短横线(&quot;-&quot;),必须以数字或字母作为开头和结尾,长度不超过50字符\n- &lt;b&gt;注意: 不能与系统的标准的转码模板和当前用户已自定义命名重复&lt;/b&gt;\n- 系统标准转码模板\n  ld (h.264/640*360/15f)\n  sd (h.264/960*540/25f)\n  hd (h.264/1280*720/25f)\n  shd (h.264/1920*1080/30f)\n  ld-265 (h.265/640*360/15f)\n  sd-265 (h.265/960*540/25f)\n  hd-265 (h.265/1280*720/25f)\n  shd-265 (h.265/1920*1080/30f)\n\n      * @param {string} opts.audioCodec - 转码输出音频编码格式\n- 取值: aac、mp3\n- 不区分大小写\n\n      * @param {string} [opts.audioFormat] - 转码输出音频格式\n- 取值: aac_lc,aac_low,aac_he,aac_he_v2; 默认:aac_he\n- 不区分大小写\n  optional\n      * @param {integer} opts.audioSampleRate - 转码输出音频采样率\n- 取值: [44100,48000]\n\n      * @param {integer} opts.audioChannel - 转码输出音频通道数\n  1: 单声道\n  2: 双声道\n\n      * @param {integer} opts.audioCodeRate - 转码输出音频码率\n- 取值: [16,128]\n- 单位: kbps\n\n      * @param {string} [opts.jdchd] - 京享超清开关\n- 取值: jdchd-1.0,off\n- 京享超清暂时只支持h.264\n  optional\n      * @param {string} [opts.audioComfort] - 舒适音频\n- 取值: on,off\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addCustomLiveStreamTranscodeTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.videoCodeRate === undefined || opts.videoCodeRate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.videoCodeRate' when calling addCustomLiveStreamTranscodeTemplate\"\n      )\n    }\n    if (opts.videoFrameRate === undefined || opts.videoFrameRate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.videoFrameRate' when calling addCustomLiveStreamTranscodeTemplate\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addCustomLiveStreamTranscodeTemplate\"\n      )\n    }\n    if (opts.audioCodec === undefined || opts.audioCodec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.audioCodec' when calling addCustomLiveStreamTranscodeTemplate\"\n      )\n    }\n    if (opts.audioSampleRate === undefined || opts.audioSampleRate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.audioSampleRate' when calling addCustomLiveStreamTranscodeTemplate\"\n      )\n    }\n    if (opts.audioChannel === undefined || opts.audioChannel === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.audioChannel' when calling addCustomLiveStreamTranscodeTemplate\"\n      )\n    }\n    if (opts.audioCodeRate === undefined || opts.audioCodeRate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.audioCodeRate' when calling addCustomLiveStreamTranscodeTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.templateName !== undefined && opts.templateName !== null) {\n      postBody['templateName'] = opts.templateName\n    }\n    if (opts.videoCodec !== undefined && opts.videoCodec !== null) {\n      postBody['videoCodec'] = opts.videoCodec\n    }\n    if (opts.videoCodeRate !== undefined && opts.videoCodeRate !== null) {\n      postBody['videoCodeRate'] = opts.videoCodeRate\n    }\n    if (opts.videoFrameRate !== undefined && opts.videoFrameRate !== null) {\n      postBody['videoFrameRate'] = opts.videoFrameRate\n    }\n    if (opts.width !== undefined && opts.width !== null) {\n      postBody['width'] = opts.width\n    }\n    if (opts.height !== undefined && opts.height !== null) {\n      postBody['height'] = opts.height\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n    if (opts.audioCodec !== undefined && opts.audioCodec !== null) {\n      postBody['audioCodec'] = opts.audioCodec\n    }\n    if (opts.audioFormat !== undefined && opts.audioFormat !== null) {\n      postBody['audioFormat'] = opts.audioFormat\n    }\n    if (opts.audioSampleRate !== undefined && opts.audioSampleRate !== null) {\n      postBody['audioSampleRate'] = opts.audioSampleRate\n    }\n    if (opts.audioChannel !== undefined && opts.audioChannel !== null) {\n      postBody['audioChannel'] = opts.audioChannel\n    }\n    if (opts.audioCodeRate !== undefined && opts.audioCodeRate !== null) {\n      postBody['audioCodeRate'] = opts.audioCodeRate\n    }\n    if (opts.jdchd !== undefined && opts.jdchd !== null) {\n      postBody['jdchd'] = opts.jdchd\n    }\n    if (opts.audioComfort !== undefined && opts.audioComfort !== null) {\n      postBody['audioComfort'] = opts.audioComfort\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addCustomLiveStreamTranscodeTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeCustoms:template',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户自定义转码模板列表\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围 [1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围 [10, 100]\n  optional\n      * @param {filter} [opts.filters] - 转码模板查询过滤条件:\n  - name:   template 转码模板自定义名称\n  - value:  如果参数为空，则查询全部\n  - 如果为空,则表示查询该用下所有自定义的转码模板\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param transcodeInfo transcodeTemplates\n      */\n\n  describeCustomLiveStreamTranscodeTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomLiveStreamTranscodeTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeCustoms',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询系统默认转码模板列表\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围 [1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围 [10, 100]\n  optional\n      * @param {filter} [opts.filters] - 转码模板查询过滤条件:\n  - name:   template 转码模板自定义名称\n  - value:  如果参数为空，则查询全部\n  - 如果为空,则表示查询该用下所有自定义的转码模板\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param transcodeInfo transcodeTemplates\n      */\n\n  describeSystemLiveStreamTranscodeTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSystemLiveStreamTranscodeTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeSystem',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码模板配置\n- 转码模板配置按照 域名,应用,流 3级配置添加,以最小的粒度配置生效原则\n- 域名、应用、流 依次粒度递减 即: 域名&gt;应用&gt;流\n- 该查询旨在查询域名、应用、流最终生效的转码模板配置,并非各级的模板绑定情况\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围 [1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围[10, 100]\n  optional\n      * @param {filter} [opts.filters] - 模板配置查询过滤条件:\n  - name:   publishDomain 必填(推流域名)\n  - value:  参数\n  - name:   appName 必填(应用名称)\n  - value:  参数\n  - name:   streamName 非必填(流名称)\n  - value:  参数\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param templateConfig transcodeConfigs\n      */\n\n  describeLiveStreamTranscodeConfig (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamTranscodeConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodes:config',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除域名级别转码模板配置\n- 删除域名级别转码模板配置,重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.template - 转码模板\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamDomainTranscode (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamDomainTranscode\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteLiveStreamDomainTranscode\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamDomainTranscode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeDomains/{publishDomain}/templates/{template}:config',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除应用级别转码模板配置\n- 删除应用级别的转码模板配置,重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.template - 转码模板\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamAppTranscode (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamAppTranscode\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling deleteLiveStreamAppTranscode\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteLiveStreamAppTranscode\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      appName: opts.appName,\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamAppTranscode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeApps/{publishDomain}/appNames/{appName}/templates/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户自定义转码模板详情\n- 查询用户自定义转码模板详情\n- 系统标准转码模板\n      ld (h.264/640*360/15f)\n      sd (h.264/960*540/24f)\n      hd (h.264/1280*720/25f)\n      shd (h.264/1920*1080/30f)\n      ld-265 (h.265/640*360/15f)\n      sd-265 (h.265/960*540/24f)\n      hd-265 (h.265/1280*720/25f)\n      shd-265 (h.265/1920*1080/30f)\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.template - 转码模板\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string videoCodec  视频编码格式，取值：h264,h265，默认h264\n\n      * @param integer videoCodeRate  转码输出的码率值\n- 单位: kpbs\n\n      * @param string videoFrameRate  转码输出的帧率值\n\n      * @param integer width  转码输出视频宽度\n\n      * @param integer height  转码输出视频高度\n\n      * @param string template  转码模板\n\n      * @param string audioCodec  转码输出音频编码格式\n\n      * @param string audioFormat  转码输出音频格式\n\n      * @param integer audioSampleRate  转码输出音频采样率\n\n      * @param integer audioChannel  转码输出音频通道数\n  1: 单声道\n  2: 双声道\n\n      * @param integer audioCodeRate  转码输出音频码率\n- 单位: kbps\n\n      * @param string jdchd  京享超清\n- 取值: jdchd-1.0,off\n\n      * @param string audioComfort  舒适音频\n- 取值: on,off\n\n      */\n\n  describeCustomLiveStreamTranscodeTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling describeCustomLiveStreamTranscodeTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomLiveStreamTranscodeTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeCustoms/{template}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除用户自定义转码模板\n- 删除用户自定义转码模板之前必须先删除此模板在各域名、应用、流级别的转码设置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.template - 转码模板\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCustomLiveStreamTranscodeTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteCustomLiveStreamTranscodeTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCustomLiveStreamTranscodeTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeCustoms/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码模板绑定\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.template - 转码模板\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param templateBinding bindingList\n      */\n\n  describeTranscodeBinding (opts, callback) {\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling describeTranscodeBinding\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTranscodeBinding with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplates/{template}:binding',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加域名翻译配置\n- 添加域名级别的翻译模板配置\n- 一个域名最多可绑定一个翻译模板\n- 重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 直播的推流域名\n      * @param {string} opts.template - 翻译模版\n- 取值范围: 系统标准翻译模板, 用户自定义翻译模板\n- 系统标准翻译模板\n  system-zh-en (中译英)\n  system-en-zh (英译中)\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveStreamDomainTranslate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveStreamDomainTranslate\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addLiveStreamDomainTranslate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveStreamDomainTranslate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/translateDomains:config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加应用翻译配置\n- 添加应用级别的翻译模板配置\n- 一个应用最多可绑定一个翻译模板\n- 重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.template - 翻译模版\n- 取值范围: 系统标准翻译模板, 用户自定义翻译模板\n- 系统标准翻译模板\n  system-zh-en (中译英)\n  system-en-zh (英译中)\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveStreamAppTranslate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveStreamAppTranslate\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling addLiveStreamAppTranslate\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addLiveStreamAppTranslate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveStreamAppTranslate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/translateApps:config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加流翻译配置\n- 添加流级别的翻译模板配置\n- 一个流最多可绑定一个翻译模板\n- 重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.streamName - 流名称\n      * @param {string} opts.template - 翻译模版\n- 取值范围: 系统标准翻译模板, 用户自定义翻译模板\n- 系统标准翻译模板\n  system-zh-en (中译英)\n  system-en-zh (英译中)\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveStreamTranslate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveStreamTranslate\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling addLiveStreamTranslate\"\n      )\n    }\n    if (opts.streamName === undefined || opts.streamName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamName' when calling addLiveStreamTranslate\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addLiveStreamTranslate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      postBody['streamName'] = opts.streamName\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveStreamTranslate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/translateStream:config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询系统默认翻译模板列表\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围 [1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围 [10, 100]\n  optional\n      * @param {filter} [opts.filters] - 翻译模板查询过滤条件:\n  - name:   template 翻译模板名称\n  - value:  如果参数为空，则查询全部\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param translateInfo translateTemplates\n      */\n\n  describeSystemLiveStreamTranslateTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSystemLiveStreamTranslateTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/translateSystem',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询翻译模板配置\n- 翻译模板配置按照 域名,应用,流 3级配置添加,以最小的粒度配置生效原则\n- 域名、应用、流 依次粒度递减 即: 域名&gt;应用&gt;流\n- 该查询旨在查询域名、应用、流最终生效的翻译模板配置,并非各级的模板绑定情况\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围 [1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围[10, 100]\n  optional\n      * @param {filter} [opts.filters] - 模板配置查询过滤条件:\n  - name:   publishDomain 必填(推流域名)\n  - value:  参数\n  - name:   appName 必填(应用名称)\n  - value:  参数\n  - name:   streamName 非必填(流名称)\n  - value:  参数\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param translateTemplateConfig translateConfigs\n      */\n\n  describeLiveStreamTranslateConfig (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveStreamTranslateConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/translates:config',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名下的翻译模板配置\n\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - 模板配置查询过滤条件:\n  - name:   publishDomain 必填(推流域名)\n  - value:  参数\n  - name:   level 非必填(Level)\n  - value:  参数，取值：domain,app,stream\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainTranslateTemplateConfig templateList\n      */\n\n  describeLiveDomainTranslateConfig (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLiveDomainTranslateConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/translateTemplates:domain',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除域名的翻译模板配置\n- 删除域名级别翻译模板配置,重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.template - 翻译模板\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamDomainTranslate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamDomainTranslate\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteLiveStreamDomainTranslate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamDomainTranslate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/translateDomains/{publishDomain}/templates/{template}:config',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除应用的翻译模板配置\n- 删除应用级别的翻译模板配置,重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.template - 翻译模板\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamAppTranslate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamAppTranslate\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling deleteLiveStreamAppTranslate\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteLiveStreamAppTranslate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      appName: opts.appName,\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamAppTranslate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/translateApps/{publishDomain}/appNames/{appName}/templates/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除流的翻译模板配置\n- 删除流级别翻译模板配置,重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.streamName - 流名称\n      * @param {string} opts.template - 翻译模板\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamTranslate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamTranslate\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling deleteLiveStreamTranslate\"\n      )\n    }\n    if (opts.streamName === undefined || opts.streamName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamName' when calling deleteLiveStreamTranslate\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteLiveStreamTranslate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      appName: opts.appName,\n      streamName: opts.streamName,\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamTranslate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/translateStream/{publishDomain}/appNames/{appName}/streams/{streamName}/templates/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询翻译模板绑定\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.template - 翻译模板\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param templateBinding bindingList\n      */\n\n  describeTranslateBinding (opts, callback) {\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling describeTranslateBinding\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTranslateBinding with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/translateTemplates/{template}:binding',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  暂停指定流的翻译任务\n- 暂停添加实时翻译字幕到指定流\n- 指定的流需在线且配置了翻译模板\n\n      * @param {Object} opts - parameters\n      * @param {} opts.publishDomain - 推流域名\n      * @param {} opts.appName - APP名\n      * @param {} opts.streamName - 流名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  pauseLiveStreamTranslate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling pauseLiveStreamTranslate\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling pauseLiveStreamTranslate\"\n      )\n    }\n    if (opts.streamName === undefined || opts.streamName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamName' when calling pauseLiveStreamTranslate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      postBody['streamName'] = opts.streamName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call pauseLiveStreamTranslate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/translate:pause',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  恢复指定流的翻译任务\n- 恢复添加实时翻译字幕到指定流\n- 指定的流需在线且配置了翻译模板，同时处于翻译暂停状态\n\n      * @param {Object} opts - parameters\n      * @param {} opts.publishDomain - 推流域名\n      * @param {} opts.appName - APP名\n      * @param {} opts.streamName - 流名\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resumeLiveStreamTranslate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling resumeLiveStreamTranslate\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling resumeLiveStreamTranslate\"\n      )\n    }\n    if (opts.streamName === undefined || opts.streamName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamName' when calling resumeLiveStreamTranslate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      postBody['streamName'] = opts.streamName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resumeLiveStreamTranslate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/translate:resume',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加用户自定义水印模板\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.position] - 水印位置\n- 取值范围：左上：1，右上：3， 左下：7，右下：9，默认：1\n  optional\n      * @param {string} [opts.offsetUnit] - 偏移量单位\n- 取值: percent,pixel\n- percent:按百分比; pixel:像素 默认:pixel\n  optional\n      * @param {integer} opts.offsetX - x轴偏移量\n- 取值范围\n  percent: (0,100]\n  pixel: (0,1920]\n\n      * @param {integer} opts.offsetY - y轴偏移量:\n- 取值范围\n  percent: (0,100]\n  pixel: (0,1920]\n\n      * @param {string} [opts.sizeUnit] - 水印大小单位\n- 取值: percent,pixel\n- percent:按百分比; pixel:像素 默认:pixel\n  optional\n      * @param {integer} opts.width - 水印宽度:\n- 取值范围\n  percent: (0,100]\n  pixel: (0,1920]\n\n      * @param {integer} opts.height - 水印高度:\n- 取值范围\n  percent: (0,100]\n  pixel: (0,1920]\n\n      * @param {string} opts.template - 自定义水印模板名称\n-&amp;ensp;取值要求: 数字、大小写字母、短横线(&quot;-&quot;)、下划线(&quot;_&quot;),\n&amp;ensp;&amp;ensp;首尾不能有特殊字符(&quot;-&quot;),\n&amp;ensp;&amp;ensp;不超过50字符,utf-8格式\n-&amp;ensp;&lt;b&gt;注意: 不能与已定义命名重复&lt;/b&gt;\n\n      * @param {string} [opts.uploadId] - 创建上传任务时返回的uploadId参数，当通过接口上传水印图片时，uploadId必填\n  optional\n      * @param {string} opts.url - 水印地址&lt;br&gt;-&amp;ensp;以&amp;ensp;http:// 开头,可公开访问地址&lt;br&gt;\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addCustomLiveStreamWatermarkTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.offsetX === undefined || opts.offsetX === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.offsetX' when calling addCustomLiveStreamWatermarkTemplate\"\n      )\n    }\n    if (opts.offsetY === undefined || opts.offsetY === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.offsetY' when calling addCustomLiveStreamWatermarkTemplate\"\n      )\n    }\n    if (opts.width === undefined || opts.width === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.width' when calling addCustomLiveStreamWatermarkTemplate\"\n      )\n    }\n    if (opts.height === undefined || opts.height === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.height' when calling addCustomLiveStreamWatermarkTemplate\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addCustomLiveStreamWatermarkTemplate\"\n      )\n    }\n    if (opts.url === undefined || opts.url === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.url' when calling addCustomLiveStreamWatermarkTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.position !== undefined && opts.position !== null) {\n      postBody['position'] = opts.position\n    }\n    if (opts.offsetUnit !== undefined && opts.offsetUnit !== null) {\n      postBody['offsetUnit'] = opts.offsetUnit\n    }\n    if (opts.offsetX !== undefined && opts.offsetX !== null) {\n      postBody['offsetX'] = opts.offsetX\n    }\n    if (opts.offsetY !== undefined && opts.offsetY !== null) {\n      postBody['offsetY'] = opts.offsetY\n    }\n    if (opts.sizeUnit !== undefined && opts.sizeUnit !== null) {\n      postBody['sizeUnit'] = opts.sizeUnit\n    }\n    if (opts.width !== undefined && opts.width !== null) {\n      postBody['width'] = opts.width\n    }\n    if (opts.height !== undefined && opts.height !== null) {\n      postBody['height'] = opts.height\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n    if (opts.uploadId !== undefined && opts.uploadId !== null) {\n      postBody['uploadId'] = opts.uploadId\n    }\n    if (opts.url !== undefined && opts.url !== null) {\n      postBody['url'] = opts.url\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addCustomLiveStreamWatermarkTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarkCustoms:template',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户定义水印模板列表\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围 [1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围 [10, 100]\n  optional\n      * @param {filter} [opts.filters] - 水印模板列表查询过滤条件:\n  - name:   template 录制模板自定义名称\n  - value:  如果参数为空，则查询全部\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param watermarkTemplate watermarkTemplates\n      */\n\n  describeCustomLiveStreamWatermarkTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomLiveStreamWatermarkTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarkCustoms',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加应用级别水印配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.template - 水印模板名称\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveStreamAppWatermark (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveStreamAppWatermark\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling addLiveStreamAppWatermark\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addLiveStreamAppWatermark\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveStreamAppWatermark with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarkApps:config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加域名水印配置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.template - 水印模板\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addLiveStreamDomainWatermark (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling addLiveStreamDomainWatermark\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling addLiveStreamDomainWatermark\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.template !== undefined && opts.template !== null) {\n      postBody['template'] = opts.template\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addLiveStreamDomainWatermark with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarkDomains:config',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询直播水印配置\n- 水印模板配置按照 域名,应用,流 3级配置添加,以最小的粒度配置生效\n- 域名、应用、流 依次粒度递减 即: 域名&gt;应用&gt;流\n- 该查询旨在查询域名、应用、流最终生效的水印模板配置,并非各级的模板绑定情况\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNum] - 页码\n- 取值范围 [1, 100000]\n  optional\n      * @param {integer} [opts.pageSize] - 分页大小\n- 取值范围 [10, 100]\n  optional\n      * @param {filter} [opts.filters] - 水印配置查询过滤条件:\n  - name:   publishDomain，必填(推流域名)\n  - value:  参数\n  - name:   appName，必填(应用名称)\n  - value:  参数\n  - name:   streamName，非必填(流名称)\n  - value:  参数\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  每页数量\n      * @param integer totalCount  查询总数\n      * @param liveStreamRecordConfig watermarkConfigs\n      */\n\n  describeCustomLiveStreamWatermarkConfig (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomLiveStreamWatermarkConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarks:config',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除用户自定义水印模板\n- 删除用户自定义水印模板之前必须先删除此模板在各域名、应用、流级别的水印设置\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.template - 水印模板\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCustomLiveStreamWatermarkTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteCustomLiveStreamWatermarkTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCustomLiveStreamWatermarkTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarkCustoms/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除应用级别水印模板配置\n- 删除应用级别的水印模板配置,重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.template - 水印模板\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamAppWatermark (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamAppWatermark\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling deleteLiveStreamAppWatermark\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteLiveStreamAppWatermark\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      appName: opts.appName,\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamAppWatermark with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarkApps/{publishDomain}/appNames/{appName}/templates/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除域名级别水印模板配置\n- 删除域名级别水印模板配置,重新推流后生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.template - 水印模板\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteLiveStreamDomainWatermark (opts, callback) {\n    opts = opts || {}\n\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling deleteLiveStreamDomainWatermark\"\n      )\n    }\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling deleteLiveStreamDomainWatermark\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      publishDomain: opts.publishDomain,\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLiveStreamDomainWatermark with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarkDomains/{publishDomain}/templates/{template}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询水印模板绑定\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.template - 水印模板\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param templateBinding bindingList\n      */\n\n  describeWatermarkBinding (opts, callback) {\n    opts = opts || {}\n\n    if (opts.template === undefined || opts.template === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.template' when calling describeWatermarkBinding\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      template: opts.template\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  live/1.0.22'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWatermarkBinding with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarkTemplates/{template}:binding',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = LIVE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/mongodb/v1/mongodb.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 安全管理\n * API related to MONGODB security\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'mongodb'\nService._services[serviceId] = true\n\n/**\n * mongodb service.\n * @version 1.1.9\n */\n\nJDCloud.MONGODB = class MONGODB extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'mongodb.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询实例信息\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1，取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[1, 100]  optional\n      * @param {filter} [opts.filters] - instanceId - 实例ID, 精确匹配\ninstanceName - 实例名称, 模糊匹配\ninstanceStatus - mongodb状态，精确匹配，支持多个.RUNNING：运行, ERROR：错误 ,BUILDING：创建中, DELETING：删除中, RESTORING：恢复中, RESIZING：变配中\nchargeMode - 计费类型，精确匹配\n  optional\n      * @param {tagFilter} [opts.tagFilters] - Tag筛选条件  optional\n      * @param {sort} [opts.sorts] - createTime - 创建时间,asc（正序），desc（倒序）\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dBInstance dbInstances\n      * @param integer totalCount\n      * @param integer pageNumber\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(\n      queryParams,\n      super.buildTagFilterParam(opts.tagFilters, 'tagFilters')\n    )\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建实例\n      * @param {Object} opts - parameters\n      * @param {dBInstanceSpec} opts.instanceSpec - 实例规格\n      * @param {chargeSpec} [opts.chargeSpec] - 付费方式  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId\n      * @param string orderId\n      */\n\n  createInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n    if (opts.chargeSpec !== undefined && opts.chargeSpec !== null) {\n      postBody['chargeSpec'] = opts.chargeSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重置密码\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {} opts.accountPassword - 新密码，必须包含且只支持字母及数字，不少于8字符不超过16字符。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resetPassword (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resetPassword\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling resetPassword\"\n      )\n    }\n    if (opts.accountPassword === undefined || opts.accountPassword === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountPassword' when calling resetPassword\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountPassword !== undefined && opts.accountPassword !== null) {\n      postBody['accountPassword'] = opts.accountPassword\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resetPassword with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:resetPassword',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  变更实例规格\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {} opts.instanceClass - 实例规格，包年包月不允许小于当前规格。\n      * @param {} opts.instanceStorageGB - 存储空间，包年包月不允许小于当前规格。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId\n      * @param string orderId\n      */\n\n  modifyInstanceSpec (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceSpec\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceSpec\"\n      )\n    }\n    if (opts.instanceClass === undefined || opts.instanceClass === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceClass' when calling modifyInstanceSpec\"\n      )\n    }\n    if (\n      opts.instanceStorageGB === undefined ||\n      opts.instanceStorageGB === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceStorageGB' when calling modifyInstanceSpec\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceClass !== undefined && opts.instanceClass !== null) {\n      postBody['instanceClass'] = opts.instanceClass\n    }\n    if (\n      opts.instanceStorageGB !== undefined &&\n      opts.instanceStorageGB !== null\n    ) {\n      postBody['instanceStorageGB'] = opts.instanceStorageGB\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceSpec with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceSpec',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {} opts.instanceName - 新的实例名称，只支持数字、字母、英文下划线、中文，且不少于2字符不超过32字符。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceName\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling modifyInstanceName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceName',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取备份策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string preferredBackupPeriod\n      * @param string preferredBackupWindow\n      * @param string backupRetentionPeriod\n      */\n\n  describeBackupPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackupPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeBackupPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackupPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/backupPolicy',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改备份策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {} opts.preferredBackupTime - 备份时间，格式：HH:mmZ- HH:mmZ，只允许间隔时间为1小时的整点.\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string preferredBackupPeriod\n      * @param string preferredBackupWindow\n      * @param string backupRetentionPeriod\n      */\n\n  modifyBackupPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBackupPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyBackupPolicy\"\n      )\n    }\n    if (\n      opts.preferredBackupTime === undefined ||\n      opts.preferredBackupTime === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.preferredBackupTime' when calling modifyBackupPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.preferredBackupTime !== undefined &&\n      opts.preferredBackupTime !== null\n    ) {\n      postBody['preferredBackupTime'] = opts.preferredBackupTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBackupPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/backupPolicy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  数据恢复\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {} opts.backupId - 备份ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restoreInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restoreInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling restoreInstance\"\n      )\n    }\n    if (opts.backupId === undefined || opts.backupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupId' when calling restoreInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.backupId !== undefined && opts.backupId !== null) {\n      postBody['backupId'] = opts.backupId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restoreInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/restoreInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取规格\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param flavor flavors\n      */\n\n  describeFlavors (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeFlavors\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeFlavors with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/flavors',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取可用区\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param availableZones availableZones\n      */\n\n  describeAvailableZones (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAvailableZones\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAvailableZones with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/availableZones',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重启实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId\n      */\n\n  restartInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restartInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling restartInstance\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restartInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:restartInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建分片集群\n      * @param {Object} opts - parameters\n      * @param {shardingDBInstanceSpec} opts.shardingInstanceSpec - 实例规格\n      * @param {chargeSpec} [opts.chargeSpec] - 付费方式  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId\n      * @param string orderId\n      */\n\n  createShardingInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createShardingInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.shardingInstanceSpec === undefined ||\n      opts.shardingInstanceSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.shardingInstanceSpec' when calling createShardingInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.shardingInstanceSpec !== undefined &&\n      opts.shardingInstanceSpec !== null\n    ) {\n      postBody['shardingInstanceSpec'] = opts.shardingInstanceSpec\n    }\n    if (opts.chargeSpec !== undefined && opts.chargeSpec !== null) {\n      postBody['chargeSpec'] = opts.chargeSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createShardingInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/shardingInstances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  变更分片集群的节点规格，支持Mognos、Shard节点。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {string} opts.nodeId - Node ID\n      * @param {} opts.nodeType - Shard节点或Mongos节点的规格，不允许小于当前规格。\n      * @param {} [opts.nodeStorageGB] - Shard存储空间，当前节点为Shard时可用，不允许小于当前规格。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string nodeId\n      */\n\n  modifyNodeSpec (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyNodeSpec\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyNodeSpec\"\n      )\n    }\n    if (opts.nodeId === undefined || opts.nodeId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeId' when calling modifyNodeSpec\"\n      )\n    }\n    if (opts.nodeType === undefined || opts.nodeType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeType' when calling modifyNodeSpec\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.nodeType !== undefined && opts.nodeType !== null) {\n      postBody['nodeType'] = opts.nodeType\n    }\n    if (opts.nodeStorageGB !== undefined && opts.nodeStorageGB !== null) {\n      postBody['nodeStorageGB'] = opts.nodeStorageGB\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      nodeId: opts.nodeId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyNodeSpec with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/nodes/{nodeId}:modifyNodeSpec',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重启MongoDB分片集群节点，支持重启Mongos、Shard。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {string} opts.nodeId - Node ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string nodeId\n      */\n\n  restartNode (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restartNode\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling restartNode\"\n      )\n    }\n    if (opts.nodeId === undefined || opts.nodeId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeId' when calling restartNode\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      nodeId: opts.nodeId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restartNode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/nodes/{nodeId}:restartNode',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看备份\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1，取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[1, 100]  optional\n      * @param {filter} [opts.filters] - instanceId - 实例ID, 精确匹配\nbackupId - 备份ID, 精确匹配\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param backup backups\n      * @param integer totalCount\n      * @param integer pageNumber\n      */\n\n  describeBackups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackups\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建备份\n      * @param {Object} opts - parameters\n      * @param {} opts.instanceId - 实例ID\n      * @param {} [opts.backupName] - 备份名称  optional\n      * @param {} [opts.backupMethod] - 备份方式，Logical - 逻辑备份、Physical - 物理备份  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string backupId\n      */\n\n  createBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createBackup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.backupName !== undefined && opts.backupName !== null) {\n      postBody['backupName'] = opts.backupName\n    }\n    if (opts.backupMethod !== undefined && opts.backupMethod !== null) {\n      postBody['backupMethod'] = opts.backupMethod\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backups',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除备份\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupId - backup ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupId === undefined || opts.backupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupId' when calling deleteBackup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupId: opts.backupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backups/{backupId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取备份下载链接\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupId - backup ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param backupDownloadURL backupDownloadURL\n      */\n\n  backupDownloadURL (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  backupDownloadURL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupId === undefined || opts.backupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupId' when calling backupDownloadURL\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupId: opts.backupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call backupDownloadURL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backups/{backupId}/downloadURL',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询跨区域备份同步服务\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1，取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[1, 100]  optional\n      * @param {filter} [opts.filters] - null  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param backupSynchronicity backupSynchronicities\n      * @param integer totalCount\n      * @param integer pageNumber\n      */\n\n  describeBackupSynchronicities (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackupSynchronicities\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackupSynchronicities with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupSynchronicities',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建跨区域备份同步服务\n      * @param {Object} opts - parameters\n      * @param {} opts.instanceId - 源实例ID\n      * @param {} opts.srcRegion - 源实例所在地域\n      * @param {} opts.dstRegion - 备份同步的目标地域\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string serviceId\n      */\n\n  createBackupSynchronicity (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBackupSynchronicity\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createBackupSynchronicity\"\n      )\n    }\n    if (opts.srcRegion === undefined || opts.srcRegion === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.srcRegion' when calling createBackupSynchronicity\"\n      )\n    }\n    if (opts.dstRegion === undefined || opts.dstRegion === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dstRegion' when calling createBackupSynchronicity\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.srcRegion !== undefined && opts.srcRegion !== null) {\n      postBody['srcRegion'] = opts.srcRegion\n    }\n    if (opts.dstRegion !== undefined && opts.dstRegion !== null) {\n      postBody['dstRegion'] = opts.dstRegion\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBackupSynchronicity with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupSynchronicities',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除跨地域备份同步服务\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceId - service ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string serviceId\n      */\n\n  deleteBackupSynchronicities (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBackupSynchronicities\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceId === undefined || opts.serviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceId' when calling deleteBackupSynchronicities\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceId: opts.serviceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBackupSynchronicities with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupSynchronicities/{serviceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例访问白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string securityIps\n      */\n\n  describeSecurityIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSecurityIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeSecurityIps\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecurityIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/securityIps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例访问白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {} opts.modifyMode - 修改方式,Add 增加白名单,Delete 删除白名单.\n      * @param {} opts.securityIps - IP白名单分组下的IP列表，最多45个以逗号隔开，格式如下：0.0.0.0/0，10.23.12.24（IP），或者10.23.12.24/24（CIDR模式，无类域间路由，/24表示了地址中前缀的长度，范围[1，32]）。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifySecurityIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifySecurityIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifySecurityIps\"\n      )\n    }\n    if (opts.modifyMode === undefined || opts.modifyMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.modifyMode' when calling modifySecurityIps\"\n      )\n    }\n    if (opts.securityIps === undefined || opts.securityIps === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.securityIps' when calling modifySecurityIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.modifyMode !== undefined && opts.modifyMode !== null) {\n      postBody['modifyMode'] = opts.modifyMode\n    }\n    if (opts.securityIps !== undefined && opts.securityIps !== null) {\n      postBody['securityIps'] = opts.securityIps\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mongodb/1.1.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifySecurityIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/securityIps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.MONGODB\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/monitor/v1/monitor.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Statistics APIs\n * 资源统计相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'monitor'\nService._services[serviceId] = true\n\n/**\n * monitor service.\n * @version 1.3.9\n */\n\nJDCloud.MONITOR = class MONITOR extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'monitor.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询报警历史\n检索条件组合优先级从高到低为\n1：alarmIds不为空\n2：alarmId不为空\n3：serviceCode不为空\n3.1：serviceCode + resourceId\n3.2: serviceCode + resourceIds\n3.3: serviceCode + ruleName\n4：serviceCodes不为空\n4.1：serviceCode + resourceId\n4.2: serviceCode + resourceIds\n4.3: serviceCode + ruleName\n5: 所有规则\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 当前所在页，默认为1  optional\n      * @param {integer} [opts.pageSize] - 页面大小，默认为20；取值范围[1, 100]  optional\n      * @param {string} [opts.serviceCode] - 产品线标识,默认返回该serviceCode下所有group的数据。eg:serviceCode&#x3D;jdw（jdw产品线下包含jdw-master与jdw-segment两个分组)会返回jdw-master和jdw-segment的数据。  optional\n      * @param {string} [opts.groupCode] - 分组标识、指定该参数时，查询只返回该group的数据。groupCode参数仅在与serviceCode匹配时生效；eg:serviceCode&#x3D;jdw、groupCode&#x3D;jdw-master,只返回jdw-master分组的数据，不返回jdw-segment的数据。  optional\n      * @param {string} [opts.resourceId] - 资源Id  optional\n      * @param {string} [opts.alarmId] - 规则Id  optional\n      * @param {integer} [opts.alarming] - 正在报警, 取值为1  optional\n      * @param {string} [opts.startTime] - 开始时间  optional\n      * @param {string} [opts.endTime] - 结束时间  optional\n      * @param {integer} [opts.ruleType] - 规则类型,默认查询1， 1表示资源监控，6表示站点监控,7表示可用性监控  optional\n      * @param {filter} [opts.filters] - serviceCodes - 产品线servicecode，精确匹配，支持多个\nresourceIds - 资源Id，精确匹配，支持多个（必须指定serviceCode才会在该serviceCode下根据resourceIds过滤，否则该参数不生效）\nalarmIds - 规则Id，精确匹配，支持多个\nruleName - 规则名称，模糊匹配，支持单个  optional\n      * @param {string} [opts.resourceIdList] - resourceId列表，必须指定serviceCode才会生效  optional\n      * @param {string} [opts.serviceCodeList] - 产品线列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describedAlarmHistory alarmHistoryList\n      * @param integer total  总数\n      */\n\n  describeAlarmHistory (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAlarmHistory\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.groupCode !== undefined && opts.groupCode !== null) {\n      queryParams['groupCode'] = opts.groupCode\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.alarmId !== undefined && opts.alarmId !== null) {\n      queryParams['alarmId'] = opts.alarmId\n    }\n    if (opts.alarming !== undefined && opts.alarming !== null) {\n      queryParams['alarming'] = opts.alarming\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      queryParams['ruleType'] = opts.ruleType\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(\n      queryParams,\n      this.buildArrayParam(opts.resourceIdList, 'resourceIdList')\n    )\n    Object.assign(\n      queryParams,\n      this.buildArrayParam(opts.serviceCodeList, 'serviceCodeList')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarmHistory with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/alarmHistory',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询规则, 查询参数组合及优先级从高到低为：\n1：alarmIds不为空\n2：alarmId不为空\n3：serviceCode不为空\n3.1：serviceCode + resourceId\n3.2: serviceCode + resourceIds\n3.3: serviceCode + ruleName\n4：serviceCodes不为空\n4.1：serviceCode + resourceId\n4.2: serviceCode + resourceIds\n4.3: serviceCode + ruleName\n5: 所有规则\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 当前所在页，默认为1  optional\n      * @param {integer} [opts.pageSize] - 页面大小，默认为20；取值范围[1, 100]  optional\n      * @param {string} [opts.serviceCode] - 产品线标识,默认返回该serviceCode下所有group的数据。eg:serviceCode&#x3D;jdw（jdw产品线下包含jdw-master与jdw-segment两个分组)会返回jdw-master和jdw-segment的数据。  optional\n      * @param {string} [opts.groupCode] - 分组标识、指定该参数时，查询只返回该group的数据。groupCode参数仅在与serviceCode匹配时生效；eg:serviceCode&#x3D;jdw、groupCode&#x3D;jdw-master,只返回jdw-master分组的数据，不返回jdw-segment的数据。  optional\n      * @param {string} [opts.resourceId] - 资源ID,根据resourceId查询时必须指定serviceCode才会生效  optional\n      * @param {integer} [opts.ruleType] - 规则类型, 1表示资源监控，6表示站点监控,7表示可用性监控  optional\n      * @param {integer} [opts.status] - 规则报警状态, 1：正常, 2：报警，4：数据不足  optional\n      * @param {integer} [opts.enabled] - 规则状态：1为启用，0为禁用  optional\n      * @param {integer} [opts.isAlarming] - 是否为正在报警的规则，0为忽略，1为是，与 status 同时只能生效一个,isAlarming 优先生效  optional\n      * @param {string} [opts.alarmId] - 规则的id，若指定filter的alarmIds过滤时，忽略该参数  optional\n      * @param {filter} [opts.filters] - 服务码或资源Id列表\nserviceCodes - 产品线servicecode，精确匹配，支持多个\nresourceIds - 资源Id，精确匹配，支持多个（必须指定serviceCode才会在该serviceCode下根据resourceIds过滤，否则该参数不生效）\nalarmIds - 规则id，精确匹配，支持多个\nruleName - 规则名称，模糊匹配，支持单个  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describedAlarm alarmList\n      * @param integer total  规则总数\n      */\n\n  describeAlarms (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAlarms\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.groupCode !== undefined && opts.groupCode !== null) {\n      queryParams['groupCode'] = opts.groupCode\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      queryParams['ruleType'] = opts.ruleType\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      queryParams['enabled'] = opts.enabled\n    }\n    if (opts.isAlarming !== undefined && opts.isAlarming !== null) {\n      queryParams['isAlarming'] = opts.isAlarming\n    }\n    if (opts.alarmId !== undefined && opts.alarmId !== null) {\n      queryParams['alarmId'] = opts.alarmId\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarms with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/alarms',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建报警规则，可以为某一个实例创建报警规则，也可以为多个实例同时创建报警规则。\n      * @param {Object} opts - parameters\n      * @param {string} opts.clientToken - 幂等性校验参数,最长36位,若两个请求clientToken相等，则返回第一次创建的规则id，只创建一次规则\n      * @param {createAlarmParam} opts.createAlarmSpec\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string alarmIdList\n      */\n\n  createAlarm (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAlarm\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.clientToken === undefined || opts.clientToken === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clientToken' when calling createAlarm\"\n      )\n    }\n    if (opts.createAlarmSpec === undefined || opts.createAlarmSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.createAlarmSpec' when calling createAlarm\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.createAlarmSpec !== undefined && opts.createAlarmSpec !== null) {\n      postBody['createAlarmSpec'] = opts.createAlarmSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/alarms',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.ids - 待删除的规则id，用逗号,分隔\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteAlarms (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAlarms\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.ids === undefined || opts.ids === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ids' when calling deleteAlarms\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.ids !== undefined && opts.ids !== null) {\n      queryParams['ids'] = opts.ids\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAlarms with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/alarms',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询规则详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.alarmId - 规则id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param alarm alarm\n      */\n\n  describeAlarmsByID (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAlarmsByID\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.alarmId === undefined || opts.alarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmId' when calling describeAlarmsByID\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      alarmId: opts.alarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarmsByID with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/alarms/{alarmId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改已创建的报警规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.alarmId - 规则id\n      * @param {array} [opts.contacts] - 通知联系人  optional\n      * @param {baseRule} opts.rule\n      * @param {string} [opts.webHookContent] - 回调content 注：仅webHookUrl和webHookContent均不为空时，才会创建webHook  optional\n      * @param {string} [opts.webHookProtocol] - webHook协议，目前支持http，https  optional\n      * @param {string} [opts.webHookSecret] - 回调secret，用户请求签名，防伪造  optional\n      * @param {string} [opts.webHookUrl] - 回调url，例如http://www.jdcloud.com  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateAlarm (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateAlarm\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.alarmId === undefined || opts.alarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmId' when calling updateAlarm\"\n      )\n    }\n    if (opts.rule === undefined || opts.rule === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.rule' when calling updateAlarm\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.contacts !== undefined && opts.contacts !== null) {\n      postBody['contacts'] = opts.contacts\n    }\n    if (opts.rule !== undefined && opts.rule !== null) {\n      postBody['rule'] = opts.rule\n    }\n    if (opts.webHookContent !== undefined && opts.webHookContent !== null) {\n      postBody['webHookContent'] = opts.webHookContent\n    }\n    if (opts.webHookProtocol !== undefined && opts.webHookProtocol !== null) {\n      postBody['webHookProtocol'] = opts.webHookProtocol\n    }\n    if (opts.webHookSecret !== undefined && opts.webHookSecret !== null) {\n      postBody['webHookSecret'] = opts.webHookSecret\n    }\n    if (opts.webHookUrl !== undefined && opts.webHookUrl !== null) {\n      postBody['webHookUrl'] = opts.webHookUrl\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      alarmId: opts.alarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/alarms/{alarmId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询规则的报警联系人\n      * @param {Object} opts - parameters\n      * @param {string} opts.alarmId - 规则id\n      * @param {integer} [opts.pageNumber] - 当前所在页，默认为1  optional\n      * @param {integer} [opts.pageSize] - 页面大小，默认为20；取值范围[1, 100]  optional\n      * @param {integer} [opts.referenceType] - 联系人类型。0,联系人分组; 1,联系人  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describedNoticeContacts contactsList\n      * @param integer total  报警联系人总数\n      */\n\n  describeAlarmContacts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAlarmContacts\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.alarmId === undefined || opts.alarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmId' when calling describeAlarmContacts\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.referenceType !== undefined && opts.referenceType !== null) {\n      queryParams['referenceType'] = opts.referenceType\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      alarmId: opts.alarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarmContacts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/alarms/{alarmId}/contacts',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用报警规则。报警规则禁用后，将停止探测实例的监控项数据。\n      * @param {Object} opts - parameters\n      * @param {string} opts.alarmId - 规则 id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableAlarm (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableAlarm\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.alarmId === undefined || opts.alarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmId' when calling disableAlarm\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      alarmId: opts.alarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/alarms/{alarmId}/disable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用报警规则，当客户的报警规则处于停止状态时，可以使用此接口启用报警规则。\n      * @param {Object} opts - parameters\n      * @param {string} opts.alarmId - 规则id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableAlarm (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableAlarm\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.alarmId === undefined || opts.alarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmId' when calling enableAlarm\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      alarmId: opts.alarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/alarms/{alarmId}/enable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询报警历史\n检索条件组合优先级从高到低为\n1：alarmIds不为空\n2：alarmId不为空\n3：serviceCode不为空\n3.1：serviceCode + resourceId\n3.2: serviceCode + resourceIds\n3.3: serviceCode + ruleName\n4：serviceCodes不为空\n4.1：serviceCode + resourceId\n4.2: serviceCode + resourceIds\n4.3: serviceCode + ruleName\n5: 所有规则\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 当前所在页，默认为1  optional\n      * @param {integer} [opts.pageSize] - 页面大小，默认为20；取值范围[1, 100]  optional\n      * @param {string} [opts.serviceCode] - 产品线标识,默认返回该serviceCode下所有group的数据。eg:serviceCode&#x3D;jdw（jdw产品线下包含jdw-master与jdw-segment两个分组)会返回jdw-master和jdw-segment的数据。  optional\n      * @param {string} [opts.groupCode] - 分组标识、指定该参数时，查询只返回该group的数据。groupCode参数仅在与serviceCode匹配时生效；eg:serviceCode&#x3D;jdw、groupCode&#x3D;jdw-master,只返回jdw-master分组的数据，不返回jdw-segment的数据。  optional\n      * @param {string} [opts.resourceId] - 资源Id  optional\n      * @param {string} [opts.alarmId] - 规则Id  optional\n      * @param {integer} [opts.alarming] - 正在报警, 取值为1  optional\n      * @param {string} [opts.startTime] - 开始时间  optional\n      * @param {string} [opts.endTime] - 结束时间  optional\n      * @param {integer} [opts.ruleType] - 规则类型,默认查询1， 1表示资源监控，6表示站点监控,7表示可用性监控  optional\n      * @param {filter} [opts.filters] - serviceCodes - 产品线servicecode，精确匹配，支持多个\nresourceIds - 资源Id，精确匹配，支持多个（必须指定serviceCode才会在该serviceCode下根据resourceIds过滤，否则该参数不生效）\nalarmIds - 规则Id，精确匹配，支持多个\nruleName - 规则名称，模糊匹配，支持单个  optional\n      * @param {string} [opts.resourceIdList] - resourceId列表，必须指定serviceCode才会生效  optional\n      * @param {string} [opts.serviceCodeList] - 产品线列表  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param alarmHistoryWithDetail list\n      * @param integer total  总数\n      */\n\n  describeAlarmHistoryAllRegion (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.groupCode !== undefined && opts.groupCode !== null) {\n      queryParams['groupCode'] = opts.groupCode\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.alarmId !== undefined && opts.alarmId !== null) {\n      queryParams['alarmId'] = opts.alarmId\n    }\n    if (opts.alarming !== undefined && opts.alarming !== null) {\n      queryParams['alarming'] = opts.alarming\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      queryParams['ruleType'] = opts.ruleType\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(\n      queryParams,\n      this.buildArrayParam(opts.resourceIdList, 'resourceIdList')\n    )\n    Object.assign(\n      queryParams,\n      this.buildArrayParam(opts.serviceCodeList, 'serviceCodeList')\n    )\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarmHistoryAllRegion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/ruleNoticeHistory',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除自定义监控规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.ids - ids,多个id用|分隔\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteAlarmsCm (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAlarmsCm\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.ids === undefined || opts.ids === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ids' when calling deleteAlarmsCm\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.ids !== undefined && opts.ids !== null) {\n      queryParams['ids'] = opts.ids\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAlarmsCm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/cmAlarms',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据产品线查询可用监控项列表,metric介绍：&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;Metrics&lt;/a&gt;\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceCode - 资源的类型，取值vm, lb, ip, database 等\n      * @param {integer} [opts.type] - metric的类型，取值0(控制台展示)、1(内部使用，控制台不展示)、2(所有).默认取0  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metricDetail metrics\n      */\n\n  describeMetrics (opts, callback) {\n    opts = opts || {}\n\n    if (opts.serviceCode === undefined || opts.serviceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceCode' when calling describeMetrics\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMetrics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/metrics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可用创建监控规则的指标列表,metric介绍：&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;Metrics&lt;/a&gt;\n      * @param {Object} opts - parameters\n      * @param {string} [opts.serviceCode] - 资源的类型，取值vm, lb, ip, database 等  optional\n      * @param {integer} [opts.type] - metric类型，取值0、1；默认值：0（常规指标，用于控制台创建报警规则）、1（其它）  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param serviceCodeMetrics serviceCodeList\n      */\n\n  describeMetricsForCreateAlarm (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMetricsForCreateAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/metricsForCreateAlarm',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看某资源的最后一个点,metric介绍：&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;Metrics&lt;/a&gt;\n      * @param {Object} opts - parameters\n      * @param {string} opts.metric - 监控项英文标识(id)\n      * @param {string} opts.serviceCode - 资源的类型，取值vm, lb, ip, database 等\n      * @param {string} opts.resourceId - 资源的uuid，支持多个resourceId批量查询，每个id用竖线分隔。 如：id1|id2|id3|id4\n      * @param {string} [opts.startTime] - 查询时间范围的开始时间， UTC时间，格式：2016-12-11T00:00:00+0800（早于30d时，将被重置为30d）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.endTime] - 查询时间范围的结束时间， UTC时间，格式：2016-12-11T00:00:00+0800（为空时，将由startTime与timeInterval计算得出）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.timeInterval] - 查询的时间间隔，最大不超过30天，支持分钟级别,小时级别，天级别，例如：1m、1h、1d  optional\n      * @param {string} [opts.aggrType] - 聚合方式：max avg min等,用于不同维度之间聚合  optional\n      * @param {string} [opts.downAggrType] - 聚合方式：max avg min等,用于将维度内一个周期数据聚合为一个点的聚合方式,默认last  optional\n      * @param {tagFilter} [opts.tags] - 自定义标签  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param lastDownsampleRespItem items\n      */\n\n  lastDownsample (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  lastDownsample\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.metric === undefined || opts.metric === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metric' when calling lastDownsample\"\n      )\n    }\n    if (opts.serviceCode === undefined || opts.serviceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceCode' when calling lastDownsample\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling lastDownsample\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      queryParams['timeInterval'] = opts.timeInterval\n    }\n    if (opts.aggrType !== undefined && opts.aggrType !== null) {\n      queryParams['aggrType'] = opts.aggrType\n    }\n    if (opts.downAggrType !== undefined && opts.downAggrType !== null) {\n      queryParams['downAggrType'] = opts.downAggrType\n    }\n    Object.assign(queryParams, this.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId,\n      metric: opts.metric\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call lastDownsample with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/metrics/{metric}/lastDownsample',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看某资源多个监控项数据，metric介绍1：&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;Metrics&lt;/a&gt;\n      * @param {Object} opts - parameters\n      * @param {string} opts.metric - 监控项英文标识(id)\n      * @param {string} [opts.aggrType] - 聚合方式，默认等于downSampleType或avg，可选值参考:sum、avg、last、min、max  optional\n      * @param {string} [opts.downSampleType] - 采样方式，默认等于aggrType或avg，可选值参考：sum、avg、last、min、max  optional\n      * @param {string} [opts.startTime] - 查询时间范围的开始时间， UTC时间，格式：2016-12-11T00:00:00+0800（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.endTime] - 查询时间范围的结束时间， UTC时间，格式：2016-12-11T00:00:00+0800（为空时，将由startTime与timeInterval计算得出）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.timeInterval] - 时间间隔：1h，6h，12h，1d，3d，7d，14d，固定时间间隔，timeInterval默认为1h，当前时间往 前1h  optional\n      * @param {boolean} [opts.groupBy] - 是否对查询的tags分组  optional\n      * @param {boolean} [opts.rate] - 是否求速率  optional\n      * @param {string} opts.serviceCode - 资源的类型，取值vm, lb, ip, database 等\n      * @param {string} opts.resourceId - 资源的uuid\n      * @param {tagFilter} [opts.tags] - 监控指标数据的维度信息,根据tags来筛选指标数据不同的维度  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metricData metricDatas\n      */\n\n  describeMetricData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMetricData\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.metric === undefined || opts.metric === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metric' when calling describeMetricData\"\n      )\n    }\n    if (opts.serviceCode === undefined || opts.serviceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceCode' when calling describeMetricData\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling describeMetricData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.aggrType !== undefined && opts.aggrType !== null) {\n      queryParams['aggrType'] = opts.aggrType\n    }\n    if (opts.downSampleType !== undefined && opts.downSampleType !== null) {\n      queryParams['downSampleType'] = opts.downSampleType\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      queryParams['timeInterval'] = opts.timeInterval\n    }\n    if (opts.groupBy !== undefined && opts.groupBy !== null) {\n      queryParams['groupBy'] = opts.groupBy\n    }\n    if (opts.rate !== undefined && opts.rate !== null) {\n      queryParams['rate'] = opts.rate\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    Object.assign(queryParams, this.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId,\n      metric: opts.metric\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMetricData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/metrics/{metric}/metricData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  该接口为自定义监控数据上报的接口，方便您将自己采集的时序数据上报到云监控。不同region域名上报不同region的数据，参考：&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/reporting-monitoring-data&quot;&gt;调用说明&lt;/a&gt;可上报原始数据和已聚合的统计数据。支持批量上报方式。单次请求最多包含 50 个数据点；数据大小不超过 256k。\n      * @param {Object} opts - parameters\n      * @param {array} [opts.metricDataList] - 数据参数  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  全部写入成功为true，否则为false\n      * @param metricDataList errMetricDataList\n      */\n\n  putMetricData (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.metricDataList !== undefined && opts.metricDataList !== null) {\n      postBody['metricDataList'] = opts.metricDataList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call putMetricData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/customMetrics',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  概览页产品线信息接口\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.productType] - 要查询的产品线类型   0：all    1：资源监控   2：其它   默认：1。若指定了查询的serviceCode，则忽略该参数  optional\n      * @param {filter} [opts.filters] - 服务码列表\nfilter name 为serviceCodes表示查询多个产品线的规则  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param serviceInfo services\n      */\n\n  describeServices (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.productType !== undefined && opts.productType !== null) {\n      queryParams['productType'] = opts.productType\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/1.3.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeServices with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/services',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.MONITOR\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/monitor/v2/monitor.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * maintainAuxiliaryTags APIs\n * 一组资源增加删除标签\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'monitor'\nService._services[serviceId] = true\n\n/**\n * monitor service.\n * @version 2.5.12\n */\n\nclass MONITOR extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'monitor.jdcloud-api.com'\n    options.basePath = '/v2' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询规则列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 当前所在页，默认为1  optional\n      * @param {integer} [opts.pageSize] - 页面大小，默认为20；取值范围[1, 100]  optional\n      * @param {integer} [opts.dataOwner] - 数据所有者，1云监控控制台; 2云鼎。默认为1  optional\n      * @param {string} [opts.serviceCode] - 产品线标识，同一个产品线下可能存在多个product，如(redis下有redis2.8cluster、redis4.0)  optional\n      * @param {string} [opts.product] - 产品标识，如redis下分多个产品(redis2.8cluster、redis4.0)。同时指定serviceCode与product时，product优先生效  optional\n      * @param {string} [opts.dimension] - 产品下的维度标识，指定dimension时必须指定product  optional\n      * @param {string} [opts.ruleName] - 规则名称  optional\n      * @param {integer} [opts.ruleType] - 规则类型, 1表示资源监控，6表示站点监控,7表示可用性监控  optional\n      * @param {integer} [opts.enabled] - 规则状态：1为启用，0为禁用  optional\n      * @param {integer} [opts.ruleStatus] - 资源的规则状态  2：报警、4：数据不足  optional\n      * @param {filter} [opts.filters] - 服务码或资源Id列表\nproducts - 产品product，精确匹配，支持多个\nresourceIds - 资源Id，精确匹配，支持多个（必须指定serviceCode、product或dimension，否则该参数不生效）\nalarmIds - 规则id，精确匹配，支持多个  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeGroupAlarm alarmList\n      * @param integer numberPages  总页数\n      * @param integer numberRecords  总记录数\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  分页大小\n      */\n\n  describeAlarms (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.dataOwner !== undefined && opts.dataOwner !== null) {\n      queryParams['dataOwner'] = opts.dataOwner\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.product !== undefined && opts.product !== null) {\n      queryParams['product'] = opts.product\n    }\n    if (opts.dimension !== undefined && opts.dimension !== null) {\n      queryParams['dimension'] = opts.dimension\n    }\n    if (opts.ruleName !== undefined && opts.ruleName !== null) {\n      queryParams['ruleName'] = opts.ruleName\n    }\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      queryParams['ruleType'] = opts.ruleType\n    }\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      queryParams['enabled'] = opts.enabled\n    }\n    if (opts.ruleStatus !== undefined && opts.ruleStatus !== null) {\n      queryParams['ruleStatus'] = opts.ruleStatus\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarms with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/groupAlarms',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建报警规则\n      * @param {Object} opts - parameters\n      * @param {string} [opts.autoScalingPolicyId] - 弹性伸缩组Id。注：仅ag\\asg产品线内部使用  optional\n      * @param {array} [opts.baseContact] - 告警通知联系人  optional\n      * @param {string} opts.clientToken - 幂等性校验参数,最长36位,若两个请求clientToken相等，则返回第一次创建的规则id，只创建一次规则\n      * @param {integer} [opts.dataOwner] - 数据所有者，1云监控控制台; 2云鼎。默认为1  optional\n      * @param {string} [opts.dimension] - 资源维度，可用的维度请使用 describeProductsForAlarm接口查询  optional\n      * @param {integer} [opts.enabled] - 是否启用, 1表示启用规则，0表示禁用规则，默认为1  optional\n      * @param {array} [opts.multiWebHook] - url回调设置数组  optional\n      * @param {array} [opts.noticeOption] - 通知策略  optional\n      * @param {string} opts.product - 资源类型, 可用的资源类型列表请使用 describeProductsForAlarm接口查询。\n      * @param {resourceOption} opts.resourceOption\n      * @param {string} opts.ruleName - 规则名称，规则名称，最大长度42个字符，只允许中英文、数字、&#39;&#39;-&#39;&#39;和&quot;_&quot;\n      * @param {ruleOption} opts.ruleOption\n      * @param {string} [opts.ruleType] - 规则类型, 默认为resourceMonitor  optional\n      * @param {object} [opts.tags] - 资源维度，指定监控数据实例的维度标签,如resourceId&#x3D;id。(请确认资源的监控数据带有该标签，否则规则会报数据不足)  optional\n      * @param {webHookOption} [opts.webHookOption]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string alarmId  创建成功的规则id\n      * @param integer ruleIds\n      */\n\n  createAlarm (opts, callback) {\n    opts = opts || {}\n\n    if (opts.clientToken === undefined || opts.clientToken === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clientToken' when calling createAlarm\"\n      )\n    }\n    if (opts.product === undefined || opts.product === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.product' when calling createAlarm\"\n      )\n    }\n    if (opts.resourceOption === undefined || opts.resourceOption === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceOption' when calling createAlarm\"\n      )\n    }\n    if (opts.ruleName === undefined || opts.ruleName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleName' when calling createAlarm\"\n      )\n    }\n    if (opts.ruleOption === undefined || opts.ruleOption === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleOption' when calling createAlarm\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.autoScalingPolicyId !== undefined &&\n      opts.autoScalingPolicyId !== null\n    ) {\n      postBody['autoScalingPolicyId'] = opts.autoScalingPolicyId\n    }\n    if (opts.baseContact !== undefined && opts.baseContact !== null) {\n      postBody['baseContact'] = opts.baseContact\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.dataOwner !== undefined && opts.dataOwner !== null) {\n      postBody['dataOwner'] = opts.dataOwner\n    }\n    if (opts.dimension !== undefined && opts.dimension !== null) {\n      postBody['dimension'] = opts.dimension\n    }\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n    if (opts.multiWebHook !== undefined && opts.multiWebHook !== null) {\n      postBody['multiWebHook'] = opts.multiWebHook\n    }\n    if (opts.noticeOption !== undefined && opts.noticeOption !== null) {\n      postBody['noticeOption'] = opts.noticeOption\n    }\n    if (opts.product !== undefined && opts.product !== null) {\n      postBody['product'] = opts.product\n    }\n    if (opts.resourceOption !== undefined && opts.resourceOption !== null) {\n      postBody['resourceOption'] = opts.resourceOption\n    }\n    if (opts.ruleName !== undefined && opts.ruleName !== null) {\n      postBody['ruleName'] = opts.ruleName\n    }\n    if (opts.ruleOption !== undefined && opts.ruleOption !== null) {\n      postBody['ruleOption'] = opts.ruleOption\n    }\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      postBody['ruleType'] = opts.ruleType\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (opts.webHookOption !== undefined && opts.webHookOption !== null) {\n      postBody['webHookOption'] = opts.webHookOption\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/groupAlarms',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询规则详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.alarmId - 规则id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string alarmId  报警规则ID\n      * @param integer alarmStatus  规则状态，当一个规则下同时存在报警、数据不足、正常的资源时，规则状态按 报警&gt;数据不足&gt;正常的优先级展示\n监控项状态：-1 未启用 1正常，2告警，4数据不足\n      * @param integer alarmStatusList\n      * @param baseContact baseContact\n      * @param string createTime  创建时间\n      * @param string dimension  资源维度\n      * @param string dimensionName  资源维度名称\n      * @param integer enabled  是否启用, 1表示启用规则，0表示禁用规则，默认为1\n      * @param webHookOption multiWebHook\n      * @param noticeOption noticeOption\n      * @param string product  资源类型\n      * @param string productName  资源类型名称\n      * @param resourceOption resourceOption\n      * @param string ruleName  规则名称，规则名称，最大长度42个字符，只允许中英文、数字、&#39;&#39;-&#39;&#39;和&quot;_&quot;\n      * @param ruleOptionDetail ruleOption\n      * @param string ruleType  规则类型, 默认为resourceMonitor\n      * @param string ruleVersion  规则版本  v1  v2\n      * @param object tags  资源维度，指定监控数据实例的维度标签,如resourceId&#x3D;id。(请确认资源的监控数据带有该标签，否则规则会报数据不足)\n      * @param webHookOption webHookOption\n      */\n\n  describeAlarm (opts, callback) {\n    opts = opts || {}\n\n    if (opts.alarmId === undefined || opts.alarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmId' when calling describeAlarm\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      alarmId: opts.alarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/groupAlarms/{alarmId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改已创建的报警规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.alarmId - 规则id\n      * @param {string} [opts.autoScalingPolicyId] - 弹性伸缩组Id。注：仅ag\\asg产品线内部使用  optional\n      * @param {array} [opts.baseContact] - 告警通知联系人  optional\n      * @param {integer} [opts.dataOwner] - 数据所有者，1云监控控制台; 2云鼎。默认为1  optional\n      * @param {string} [opts.dimension] - 资源维度，可用的维度请使用 describeProductsForAlarm接口查询  optional\n      * @param {integer} [opts.enabled] - 是否启用, 1表示启用规则，0表示禁用规则，默认为1  optional\n      * @param {array} [opts.multiWebHook] - url回调设置数组  optional\n      * @param {array} [opts.noticeOption] - 通知策略  optional\n      * @param {string} opts.product - 资源类型, 可用的资源类型列表请使用 describeProductsForAlarm接口查询。\n      * @param {resourceOption} opts.resourceOption\n      * @param {string} opts.ruleName - 规则名称，规则名称，最大长度42个字符，只允许中英文、数字、&#39;&#39;-&#39;&#39;和&quot;_&quot;\n      * @param {ruleOption} opts.ruleOption\n      * @param {string} [opts.ruleType] - 规则类型, 默认为resourceMonitor  optional\n      * @param {object} [opts.tags] - 资源维度，指定监控数据实例的维度标签,如resourceId&#x3D;id。(请确认资源的监控数据带有该标签，否则规则会报数据不足)  optional\n      * @param {webHookOption} [opts.webHookOption]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string alarmId  创建成功的规则id\n      * @param integer ruleIds\n      * @param boolean success  成功则返回true\n      */\n\n  updateAlarm (opts, callback) {\n    opts = opts || {}\n\n    if (opts.alarmId === undefined || opts.alarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmId' when calling updateAlarm\"\n      )\n    }\n    if (opts.product === undefined || opts.product === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.product' when calling updateAlarm\"\n      )\n    }\n    if (opts.resourceOption === undefined || opts.resourceOption === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceOption' when calling updateAlarm\"\n      )\n    }\n    if (opts.ruleName === undefined || opts.ruleName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleName' when calling updateAlarm\"\n      )\n    }\n    if (opts.ruleOption === undefined || opts.ruleOption === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleOption' when calling updateAlarm\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.autoScalingPolicyId !== undefined &&\n      opts.autoScalingPolicyId !== null\n    ) {\n      postBody['autoScalingPolicyId'] = opts.autoScalingPolicyId\n    }\n    if (opts.baseContact !== undefined && opts.baseContact !== null) {\n      postBody['baseContact'] = opts.baseContact\n    }\n    if (opts.dataOwner !== undefined && opts.dataOwner !== null) {\n      postBody['dataOwner'] = opts.dataOwner\n    }\n    if (opts.dimension !== undefined && opts.dimension !== null) {\n      postBody['dimension'] = opts.dimension\n    }\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n    if (opts.multiWebHook !== undefined && opts.multiWebHook !== null) {\n      postBody['multiWebHook'] = opts.multiWebHook\n    }\n    if (opts.noticeOption !== undefined && opts.noticeOption !== null) {\n      postBody['noticeOption'] = opts.noticeOption\n    }\n    if (opts.product !== undefined && opts.product !== null) {\n      postBody['product'] = opts.product\n    }\n    if (opts.resourceOption !== undefined && opts.resourceOption !== null) {\n      postBody['resourceOption'] = opts.resourceOption\n    }\n    if (opts.ruleName !== undefined && opts.ruleName !== null) {\n      postBody['ruleName'] = opts.ruleName\n    }\n    if (opts.ruleOption !== undefined && opts.ruleOption !== null) {\n      postBody['ruleOption'] = opts.ruleOption\n    }\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      postBody['ruleType'] = opts.ruleType\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (opts.webHookOption !== undefined && opts.webHookOption !== null) {\n      postBody['webHookOption'] = opts.webHookOption\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      alarmId: opts.alarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/groupAlarms/{alarmId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.alarmId - 规则id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      */\n\n  deleteAlarms (opts, callback) {\n    opts = opts || {}\n\n    if (opts.alarmId === undefined || opts.alarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmId' when calling deleteAlarms\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      alarmId: opts.alarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAlarms with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/groupAlarms/{alarmId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询规则的报警联系人\n      * @param {Object} opts - parameters\n      * @param {string} opts.alarmId - 规则id\n      * @param {integer} [opts.pageNumber] - 当前所在页，默认为1  optional\n      * @param {integer} [opts.pageSize] - 页面大小，默认为20；取值范围[1, 100]  optional\n      * @param {integer} [opts.referenceType] - 联系人类型。0,联系人分组; 1,联系人  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describedNoticeContacts contactsList\n      * @param integer total  报警联系人总数\n      */\n\n  describeAlarmContacts (opts, callback) {\n    opts = opts || {}\n\n    if (opts.alarmId === undefined || opts.alarmId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.alarmId' when calling describeAlarmContacts\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.referenceType !== undefined && opts.referenceType !== null) {\n      queryParams['referenceType'] = opts.referenceType\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      alarmId: opts.alarmId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarmContacts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/groupAlarms/{alarmId}/contacts',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可用于创建监控规则的指标列表,metric介绍：&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;Metrics&lt;/a&gt;\n      * @param {Object} opts - parameters\n      * @param {string} [opts.serviceCode] - 产品线  optional\n      * @param {string} [opts.product] - 产品类型，如redis2.8cluster(集群)\\redis2.8MS(主从)。当serviceCode与product同时指定时，product优先级更高  optional\n      * @param {string} [opts.dimension] - 产品维度，必须指定serviceCode或product才生效。  optional\n      * @param {integer} [opts.metricType] - metric类型，取值0、1；默认值：0（常规指标，用于控制台创建报警规则）、1（其它）  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ruleMetricDetail metrics\n      */\n\n  describeMetricsForAlarm (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.product !== undefined && opts.product !== null) {\n      queryParams['product'] = opts.product\n    }\n    if (opts.dimension !== undefined && opts.dimension !== null) {\n      queryParams['dimension'] = opts.dimension\n    }\n    if (opts.metricType !== undefined && opts.metricType !== null) {\n      queryParams['metricType'] = opts.metricType\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMetricsForAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/groupAlarms:metrics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询可用于创建监控规则的产品列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.serviceCode] - 产品线，从产品线维度筛选  optional\n      * @param {string} [opts.product] - 产品类型,从产品维度筛选、如redis2.8cluster\\redis2.8instance。当serviceCode与product同时指定时，product优先级更高  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param product productList\n      */\n\n  describeProductsForAlarm (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.product !== undefined && opts.product !== null) {\n      queryParams['product'] = opts.product\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProductsForAlarm with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/groupAlarms:products',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用、禁用规则\n      * @param {Object} opts - parameters\n      * @param {array} [opts.alarmIds] - 告警规则的ID列表  optional\n      * @param {integer} [opts.state] - 启用:1,禁用0,  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      */\n\n  enableAlarms (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.alarmIds !== undefined && opts.alarmIds !== null) {\n      postBody['alarmIds'] = opts.alarmIds\n    }\n    if (opts.state !== undefined && opts.state !== null) {\n      postBody['state'] = opts.state\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableAlarms with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/groupAlarms:switch',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询报警历史\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 当前所在页，默认为1  optional\n      * @param {integer} [opts.pageSize] - 页面大小，默认为20；取值范围[1, 100]  optional\n      * @param {integer} [opts.dataOwner] - 数据所有者，1云监控控制台; 2云鼎。默认为1  optional\n      * @param {string} [opts.serviceCode] - 产品线标识，同一个产品线下可能存在多个product，如(redis下有redis2.8cluster、redis4.0)  optional\n      * @param {string} [opts.product] - 产品标识,默认返回该product下所有dimension的数据。eg:product&#x3D;redis2.8cluster（redis2.8cluster产品下包含redis2.8-shard与redis2.8-proxy、redis2.8-instance多个维度)。  optional\n      * @param {string} [opts.dimension] - 维度标识、指定该参数时，查询只返回该维度的数据。如redis2.8cluster下存在实例、分片等多个维度  optional\n      * @param {string} [opts.region] - 根据region筛选对应region的资源的报警历史  optional\n      * @param {integer} [opts.isAlarming] - 正在报警, 取值为1  optional\n      * @param {integer} [opts.status] - 报警的状态,1为报警恢复、2为报警、4为报警恢复无数据  optional\n      * @param {string} [opts.startTime] - 开始时间  optional\n      * @param {string} [opts.endTime] - 结束时间  optional\n      * @param {integer} [opts.ruleType] - 规则类型,默认查询1， 1表示资源监控，6表示站点监控,7表示可用性监控  optional\n      * @param {string} [opts.ruleName] - 规则名称模糊搜索  optional\n      * @param {filter} [opts.filters] - serviceCodes - 产品线servicecode，精确匹配，支持多个\nresourceIds - 资源Id，精确匹配，支持多个（必须指定serviceCode才会在该serviceCode下根据resourceIds过滤，否则该参数不生效）\nalarmIds - 规则Id，精确匹配，支持多个  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describedAlarmHistory alarmHistoryList\n      * @param integer numberPages  总页数\n      * @param integer numberRecords  总记录数\n      * @param integer pageNumber  当前页码\n      * @param integer pageSize  分页大小\n      */\n\n  describeAlarmHistory (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.dataOwner !== undefined && opts.dataOwner !== null) {\n      queryParams['dataOwner'] = opts.dataOwner\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.product !== undefined && opts.product !== null) {\n      queryParams['product'] = opts.product\n    }\n    if (opts.dimension !== undefined && opts.dimension !== null) {\n      queryParams['dimension'] = opts.dimension\n    }\n    if (opts.region !== undefined && opts.region !== null) {\n      queryParams['region'] = opts.region\n    }\n    if (opts.isAlarming !== undefined && opts.isAlarming !== null) {\n      queryParams['isAlarming'] = opts.isAlarming\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.ruleType !== undefined && opts.ruleType !== null) {\n      queryParams['ruleType'] = opts.ruleType\n    }\n    if (opts.ruleName !== undefined && opts.ruleName !== null) {\n      queryParams['ruleName'] = opts.ruleName\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarmHistory with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/groupAlarmsHistory',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  通过指定维度查询自定义监控的数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.namespaceUID - namespace\n      * @param {string} [opts.endTime] - 查询时间范围的结束时间， UTC时间，格式：2016-12-11T00:00:00+0800（为空时，将由startTime与timeInterval计算得出）  optional\n      * @param {queryOption} opts.query\n      * @param {string} [opts.startTime] - 查询时间范围的开始时间， UTC时间，格式：2016-12-11T00:00:00+0800  optional\n      * @param {string} [opts.timeInterval] - 时间间隔：1h，6h，12h，1d，3d，7d，14d，固定时间间隔，timeInterval默认为1h，当前时间往 前1h  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metricDataItemCm metricDatas\n      */\n\n  describeCustomMetricData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCustomMetricData\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.namespaceUID === undefined || opts.namespaceUID === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.namespaceUID' when calling describeCustomMetricData\"\n      )\n    }\n    if (opts.query === undefined || opts.query === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.query' when calling describeCustomMetricData\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.query !== undefined && opts.query !== null) {\n      postBody['query'] = opts.query\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      postBody['timeInterval'] = opts.timeInterval\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      namespaceUID: opts.namespaceUID\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomMetricData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/namespaces/{namespaceUID}/metricData',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据产品线查询可用监控项列表,metric介绍：&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;Metrics&lt;/a&gt;\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceCode - 资源的类型，取值vm, lb, ip, database 等。&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/api/describeservices?content&#x3D;API&amp;SOP&#x3D;JDCloud&quot;&gt;describeServices&lt;/a&gt;：查询己接入云监控的产品线列表\n      * @param {string} [opts.dimension]   optional\n      * @param {integer} [opts.type] - metric的类型，取值0(控制台展示)、1(内部使用，控制台不展示)、2(所有).默认取0  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metricDetail metrics\n      */\n\n  describeMetrics (opts, callback) {\n    opts = opts || {}\n\n    if (opts.serviceCode === undefined || opts.serviceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceCode' when calling describeMetrics\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.dimension !== undefined && opts.dimension !== null) {\n      queryParams['dimension'] = opts.dimension\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMetrics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/metrics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据不同的聚合方式将metric的数据聚合为一个点。downAggrType：last(最后一个点)、max(最大值)、min(最小值)、avg(平均值)。该接口返回值为上报metric的原始值，没有做单位转换。metric介绍：&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;Metrics&lt;/a&gt;\n      * @param {Object} opts - parameters\n      * @param {string} opts.metric - 监控项英文标识(id)\n      * @param {string} opts.serviceCode - 资源的类型，取值vm, lb, ip, database 等。可用的serviceCode请使用describeServices接口查询\n      * @param {string} [opts.dimension] - 资源的维度。serviceCode下可用的dimension请使用describeServices接口查询  optional\n      * @param {string} opts.resourceId - 资源的uuid，支持多个resourceId批量查询，每个id用竖线分隔。 如：id1|id2|id3|id4\n      * @param {string} [opts.startTime] - 查询时间范围的开始时间， UTC时间，格式：2016-12-11T00:00:00+0800（早于30d时，将被重置为30d）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.endTime] - 查询时间范围的结束时间， UTC时间，格式：2016-12-11T00:00:00+0800（为空时，将由startTime与timeInterval计算得出）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.timeInterval] - 查询的时间间隔，最大不超过30天，支持分钟级别,小时级别，天级别，例如：1m、1h、1d  optional\n      * @param {string} [opts.aggrType] - 聚合方式：max avg min等,用于不同维度之间聚合  optional\n      * @param {string} [opts.downAggrType] - 聚合方式：max avg min等,用于将维度内一个周期数据聚合为一个点的聚合方式,默认last  optional\n      * @param {string} [opts.timeOffset] - 时间偏移，可传入30s、1m、1h、1d等数字+单位的形式(其中s秒，m分，h时，d天)，当业务侧数据上报存在延迟时，可以传入该参数，该参数会使查询的时间段整体向前偏移.偏移后的开始时间若早于30天前,则开始时间自动设置为30天前;若偏移后结束时间早于30天前，则无效  optional\n      * @param {tagFilter} [opts.tags] - 自定义标签  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param lastDownsampleRespItem items\n      */\n\n  lastDownsample (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  lastDownsample\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.metric === undefined || opts.metric === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metric' when calling lastDownsample\"\n      )\n    }\n    if (opts.serviceCode === undefined || opts.serviceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceCode' when calling lastDownsample\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling lastDownsample\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.dimension !== undefined && opts.dimension !== null) {\n      queryParams['dimension'] = opts.dimension\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      queryParams['timeInterval'] = opts.timeInterval\n    }\n    if (opts.aggrType !== undefined && opts.aggrType !== null) {\n      queryParams['aggrType'] = opts.aggrType\n    }\n    if (opts.downAggrType !== undefined && opts.downAggrType !== null) {\n      queryParams['downAggrType'] = opts.downAggrType\n    }\n    if (opts.timeOffset !== undefined && opts.timeOffset !== null) {\n      queryParams['timeOffset'] = opts.timeOffset\n    }\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId,\n      metric: opts.metric\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call lastDownsample with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/metrics/{metric}/lastDownsample',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看某资源单个监控项数据.\nmetric介绍: &lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;Metrics&lt;/a&gt;\n可以使用接口:&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;describeMetrics&lt;/a&gt;:查询产品线可用的metric列表。\n查询起止时间统一向下对齐10s, 举例:开始时间为 08:45:45 会对齐到08:45:40\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.metric - 监控项英文标识(id)\n      * @param {string} [opts.aggrType] - 聚合方式，用于不同时间轴上的聚合。如balance产品同一个resourceId下存在port&#x3D;80和port&#x3D;8080等多种维度。可选值参考:sum、avg、min、max  optional\n      * @param {string} [opts.downSampleType] - 采样方式，用于在时间轴维度上将聚合周期内的数据聚合为一个点。可选值参考：sum(聚合周期内的数据求和)、avg(求平均)、last(最新值)、min(最小值)、max(最大值)  optional\n      * @param {string} [opts.startTime] - 查询时间范围的开始时间， UTC时间，格式：2016-12-11T00:00:00+0800（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）\n开始时间不得晚于当前时间,开始时间不得早于 30 天前\n  optional\n      * @param {string} [opts.endTime] - 查询时间范围的结束时间, UTC时间，格式：2016-12-11T00:00:00+0800（为空时，将由startTime与timeInterval计算得出）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）\n默认为当前时间,结束时间不得晚于当前时间. 如果晚于, 会被默认设成当前时间, 结束时间不得早于 30 天前.\n  optional\n      * @param {string} [opts.timeInterval] - 时间间隔：1h，6h，12h，1d，3d，7d，14d，固定时间间隔，timeInterval默认为1h，当前时间往 前1h\n如果指定了 startTime 和 endTime,可以不用设置. 默认的,三个参数都不设置查询 1h 内数据.\ntimeInterval 默认值 1h\nendTime 默认值, 当前时间\nstartTime 默认值,  endTime - timeInterval\n  optional\n      * @param {boolean} [opts.groupBy] - 是否对查询的tags分组  optional\n      * @param {boolean} [opts.rate] - 是否求速率。仅对累积类型指标有意义, 默认 false  optional\n      * @param {string} [opts.serviceCode] - 资源的类型，取值vm, lb, ip, database 等,&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/api/describeservices?content&#x3D;API&amp;SOP&#x3D;JDCloud&quot;&gt;describeServices&lt;/a&gt;：查询己接入云监控的产品线列表  optional\n      * @param {string} [opts.dimension] - 资源的维度。查询serviceCode下可用的维度请使用describeServices接口  optional\n      * @param {string} opts.resourceId - 资源的uuid\n      * @param {tagFilter} [opts.tags] - 监控指标数据的维度信息,根据tags来筛选指标数据不同的维度  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metricData metricDatas\n      */\n\n  describeMetricData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMetricData\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.metric === undefined || opts.metric === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metric' when calling describeMetricData\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling describeMetricData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.aggrType !== undefined && opts.aggrType !== null) {\n      queryParams['aggrType'] = opts.aggrType\n    }\n    if (opts.downSampleType !== undefined && opts.downSampleType !== null) {\n      queryParams['downSampleType'] = opts.downSampleType\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      queryParams['timeInterval'] = opts.timeInterval\n    }\n    if (opts.groupBy !== undefined && opts.groupBy !== null) {\n      queryParams['groupBy'] = opts.groupBy\n    }\n    if (opts.rate !== undefined && opts.rate !== null) {\n      queryParams['rate'] = opts.rate\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.dimension !== undefined && opts.dimension !== null) {\n      queryParams['dimension'] = opts.dimension\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId,\n      metric: opts.metric\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMetricData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/metrics/{metric}/metricData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询某资源下指定tag key的tag value\n      * @param {Object} opts - parameters\n      * @param {string} opts.tagKey - region\n      * @param {string} opts.serviceCode - serviceCode\n      * @param {string} opts.resourceId - 资源标识\n      * @param {string} [opts.metric] - metric  optional\n      * @param {string} [opts.startTime] - 查询时间范围的开始时间(如不传,则默认为1时前)， UTC时间，格式：2016-12-11T00:00:00+0800（注意在url中+,:要转译,如2019-10-23T10%3A33%3A31%2B0800）。对于非连续的时序数据，开始时间无法保证准确性  optional\n      * @param {string} [opts.endTime] - 查询时间范围的结束时间(如不传,则默认为当前)， UTC时间，格式：2016-12-11T00:00:00+0800（注意在url中+,:要转译,如2019-10-23T10%3A33%3A31%2B0800）.对于非连续的时序数据，结束时间无法保证准确性  optional\n      * @param {string} [opts.timeInterval] - 时间间隔：1h，6h，12h，1d，3d，7d，14d，固定时间间隔，timeInterval默认为1h，当前时间往 前1h  optional\n      * @param {tagFilter} [opts.tags] - 根据tags进行筛选(传入*和不传的效果一致)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string tagValues\n      */\n\n  describeTagValues (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTagValues\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.tagKey === undefined || opts.tagKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tagKey' when calling describeTagValues\"\n      )\n    }\n    if (opts.serviceCode === undefined || opts.serviceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceCode' when calling describeTagValues\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling describeTagValues\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.metric !== undefined && opts.metric !== null) {\n      queryParams['metric'] = opts.metric\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      queryParams['timeInterval'] = opts.timeInterval\n    }\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId,\n      tagKey: opts.tagKey\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTagValues with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tagValues/{tagKey}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询监控图可用的产品线列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.productType] - 要查询的产品线类型   0：all    1：资源监控   2：其它   默认：1。若指定了查询的serviceCode，则忽略该参数  optional\n      * @param {filter} [opts.filters] - 服务码列表\nfilter name 为serviceCodes表示查询多个产品线的规则  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param serviceInfoV2 services\n      */\n\n  describeServices (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.productType !== undefined && opts.productType !== null) {\n      queryParams['productType'] = opts.productType\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeServices with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/services',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  该接口为自定义监控数据上报的接口，方便您将自己采集的时序数据上报到云监控。不同region域名上报不同region的数据，参考：&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/reporting-monitoring-data&quot;&gt;调用说明&lt;/a&gt;可上报原始数据和已聚合的统计数据。支持批量上报方式。单次请求最多包含 50 个数据点；数据大小不超过 256k。\n      * @param {Object} opts - parameters\n      * @param {array} [opts.metricDataList] - 数据参数  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  全部写入成功为true，否则为false\n      * @param metricDataList errMetricDataList\n      */\n\n  putMetricData (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.metricDataList !== undefined && opts.metricDataList !== null) {\n      postBody['metricDataList'] = opts.metricDataList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call putMetricData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/customMetrics',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  该接口为自定义监控数据上报的接口，方便您将自己采集的时序数据上报到云监控。不同region域名上报不同region的数据，参考：&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/reporting-monitoring-data&quot;&gt;调用说明&lt;/a&gt;可上报原始数据和已聚合的统计数据。支持批量上报方式。单次请求最多包含 50 个数据点；数据大小不超过 256k。\n      * @param {Object} opts - parameters\n      * @param {array} [opts.metricDataList] - 数据参数  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  全部写入成功为true，否则为false\n      * @param metricDataList errMetricDataList\n      */\n\n  putCustomMetricData (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.metricDataList !== undefined && opts.metricDataList !== null) {\n      postBody['metricDataList'] = opts.metricDataList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call putCustomMetricData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/customMetrics',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  监控数据上报。\n      * @param {Object} opts - parameters\n      * @param {string} opts.appCode - 目前统一用jcloud\n      * @param {string} opts.serviceCode - 资源的类型，取值vm,ip,database,storage,disk,cdn,redis,balance,nat_gw,db_ro,vpn,ddos等,新接入的产品要求与opentapi命名的产品线名称一致\n      * @param {string} opts.region - 地域信息，如 cn-north-1 等\n      * @param {string} opts.resourceId - 资源的唯一表示，一般为uuid\n      * @param {array} [opts.dataPoints] - 监控数据点  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer failed  失败数量\n      * @param integer success  成功数量\n      */\n\n  put (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appCode === undefined || opts.appCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appCode' when calling put\"\n      )\n    }\n    if (opts.serviceCode === undefined || opts.serviceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceCode' when calling put\"\n      )\n    }\n    if (opts.region === undefined || opts.region === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.region' when calling put\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling put\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.region !== undefined && opts.region !== null) {\n      postBody['region'] = opts.region\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      postBody['resourceId'] = opts.resourceId\n    }\n    if (opts.dataPoints !== undefined && opts.dataPoints !== null) {\n      postBody['dataPoints'] = opts.dataPoints\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call put with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/put',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  监控数据上报。\n      * @param {Object} opts - parameters\n      * @param {string} opts.appCode - 目前统一用jcloud\n      * @param {string} opts.serviceCode - 资源的类型，取值vm,ip,database,storage,disk,cdn,redis,balance,nat_gw,db_ro,vpn,ddos等,新接入的产品要求与opentapi命名的产品线名称一致\n      * @param {string} opts.region - 地域信息，如 cn-north-1 等\n      * @param {string} opts.resourceId - 资源的唯一表示，一般为uuid\n      * @param {array} [opts.dataPoints] - 监控数据点  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer failed  失败数量\n      * @param integer success  成功数量\n      */\n\n  putProductMetricData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appCode === undefined || opts.appCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appCode' when calling putProductMetricData\"\n      )\n    }\n    if (opts.serviceCode === undefined || opts.serviceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceCode' when calling putProductMetricData\"\n      )\n    }\n    if (opts.region === undefined || opts.region === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.region' when calling putProductMetricData\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling putProductMetricData\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.region !== undefined && opts.region !== null) {\n      postBody['region'] = opts.region\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      postBody['resourceId'] = opts.resourceId\n    }\n    if (opts.dataPoints !== undefined && opts.dataPoints !== null) {\n      postBody['dataPoints'] = opts.dataPoints\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitor/2.5.12'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call putProductMetricData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/put',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = MONITOR\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/monitorcm/v1/monitorcm.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 监控项相关接口\n * 监控项相关接口，提供自定义监控数据上报功能\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'monitorcm'\nService._services[serviceId] = true\n\n/**\n * monitorcm service.\n * @version 1.0.0\n */\n\nJDCloud.MONITORCM = class MONITORCM extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'monitor.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  上报用户自定义监控数据\n      * @param {Object} opts - parameters\n      * @param {array} opts.metricDataList - 数据参数\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      * @param metricDataList errMetricDataList\n      */\n\n  putMetricData (opts, callback) {\n    opts = opts || {}\n\n    if (opts.metricDataList === undefined || opts.metricDataList === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metricDataList' when calling putMetricData\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.metricDataList !== undefined && opts.metricDataList !== null) {\n      postBody['metricDataList'] = opts.metricDataList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  monitorcm/1.0.0'\n    }\n\n    let formParams = {}\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    let returnType = null\n\n    this.config.logger(\n      `call putMetricData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/customMetrics',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback) {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback) {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.MONITORCM\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/mps/v1/mps.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 媒体处理相关接口\n * 多媒体处理服务API，包括截图、转码、媒体处理消息通知等操作。本文档详细说明了媒体处理API及用法，适合开发人员阅读。\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'mps'\nService._services[serviceId] = true\n\n/**\n * mps service.\n * @version 0.4.10\n */\n\nclass MPS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'mps.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  设置回调配置\n      * @param {Object} opts - parameters\n      * @param {array} [opts.callbackEvents] - 回调事件列表。取值范围：\n- snapshot_complete 截图完成，包括成功和失败\n  optional\n      * @param {string} opts.callbackType - 回调方式，目前只支持 http\n      * @param {string} [opts.httpUrl] - 回调方式为 http 时，此为必须参数  optional\n      * @param {string} [opts.disabled] - 是否禁用回调，默认值为 false，即开启回调  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setCallbackSettings (opts, callback) {\n    opts = opts || {}\n\n    if (opts.callbackType === undefined || opts.callbackType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.callbackType' when calling setCallbackSettings\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.callbackEvents !== undefined && opts.callbackEvents !== null) {\n      postBody['callbackEvents'] = opts.callbackEvents\n    }\n    if (opts.callbackType !== undefined && opts.callbackType !== null) {\n      postBody['callbackType'] = opts.callbackType\n    }\n    if (opts.httpUrl !== undefined && opts.httpUrl !== null) {\n      postBody['httpUrl'] = opts.httpUrl\n    }\n    if (opts.disabled !== undefined && opts.disabled !== null) {\n      postBody['disabled'] = opts.disabled\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setCallbackSettings with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/settings:setCallbackSettings',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询回调配置\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param callbackSettings resultObject\n      */\n\n  queryCallbackSettings (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryCallbackSettings with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/settings:queryCallbackSettings',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  提交视频截图任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 截图模板ID\n      * @param {input} opts.input\n      * @param {output} opts.output\n      * @param {output} [opts.spriteOutput]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param submitSnapshotTaskResultObject resultObject\n      */\n\n  submitSnapshotTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling submitSnapshotTask\"\n      )\n    }\n    if (opts.input === undefined || opts.input === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.input' when calling submitSnapshotTask\"\n      )\n    }\n    if (opts.output === undefined || opts.output === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.output' when calling submitSnapshotTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n    if (opts.input !== undefined && opts.input !== null) {\n      postBody['input'] = opts.input\n    }\n    if (opts.output !== undefined && opts.output !== null) {\n      postBody['output'] = opts.output\n    }\n    if (opts.spriteOutput !== undefined && opts.spriteOutput !== null) {\n      postBody['spriteOutput'] = opts.spriteOutput\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call submitSnapshotTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTasks:submit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询视频截图任务列表\n支持过滤查询：\n  - createTime,ge 最早任务创建时间\n  - createTime,le 最晚任务创建时间\n  - status,in 任务状态IN查询\n  - taskId,eq 任务ID精确查询\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listSnapshotTasksResultObject resultObject\n      */\n\n  listSnapshotTasks (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSnapshotTasks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTasks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取视频截图任务详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务ID，路径参数\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotTaskObject snapshotTaskObject\n      */\n\n  getSnapshotTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling getSnapshotTask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSnapshotTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTasks/{taskId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除视频截图任务。删除任务时，会同时删除任务相关的数据，如任务执行结果等\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务ID，路径参数\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSnapshotTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling deleteSnapshotTask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSnapshotTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTasks/{taskId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询视频截图任务结果\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务ID，路径参数\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotTaskResultObject snapshotTaskResultObject\n      */\n\n  querySnapshotTaskResult (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling querySnapshotTaskResult\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call querySnapshotTaskResult with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTasks/{taskId}:queryResult',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询截图模板列表。\n允许通过条件过滤查询，支持的过滤字段如下：\n  - templateId[eq] 按模板ID精确查询\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listSnapshotTemplatesResultInfo resultObject\n      */\n\n  listSnapshotTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSnapshotTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTemplates',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建截图模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.title - 模板标题。长度不超过 128 个字节。UTF-8 编码。\n      * @param {integer} [opts.startTime] - 截图起始时间，取值范围单位为秒，缺省值为 0\n  optional\n      * @param {string} [opts.frameType] - 截图帧类型。取值范围：\n  any - 任意帧\n  intra - 关键帧\n缺省值为 any\n  optional\n      * @param {string} [opts.format] - 截图格式。取值范围：\n  jpg - 对应的截图或雪碧图输出文件扩展名为 jpg\n  png - 对应的截图或雪碧图输出文件扩展名为 png\n缺省值为 jpg\n  optional\n      * @param {integer} [opts.number] - 截图数量。取值范围：[1, 3600]\n缺省值为 10\n若雪碧图配置不为空，则生成雪碧图，提交的截图任务中，此字段会被雪碧图的行列积所覆盖。\n  optional\n      * @param {integer} [opts.interval] - 截图时间间隔。取值范围：[1, 100]，单位为秒\n若未设置，则对于普通截图，按照截图张数做平均截图；对于雪碧图，则按照行列数乘积做平均截图\n  optional\n      * @param {integer} [opts.width] - 截图宽度，取值范围：[8, 4096]\n若宽度和高度同时设置，则按照设置的宽高截图；\n若宽度和高度均未设置，则截图保持与源视频相同的宽高值；\n若宽度和高度其中一项未设置，则截图保持与源视频相同的宽高比；\n  optional\n      * @param {integer} [opts.height] - 截图高度，取值范围：[8, 4096]\n若宽度和高度同时设置，则按照设置的宽高截图；\n若宽度和高度均未设置，则截图保持与源视频相同的宽高值；\n若宽度和高度其中一项未设置，则截图保持与源视频相同的宽高比；\n  optional\n      * @param {string} [opts.fillType] - 填充方式，当视频宽高与截图宽高指定值不能匹配时的填充处理方式。取值范围：\n  stretch - 伸缩\n  black - 留黑\n  white - 留白\n  gauss - 高斯模糊\n缺省值为 black\n  optional\n      * @param {spriteConfig} [opts.spriteConfig] - 雪碧图配置。若此字段有值，则生成雪碧图。\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotTemplateInfo resultObject\n      */\n\n  createSnapshotTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.title === undefined || opts.title === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.title' when calling createSnapshotTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.frameType !== undefined && opts.frameType !== null) {\n      postBody['frameType'] = opts.frameType\n    }\n    if (opts.format !== undefined && opts.format !== null) {\n      postBody['format'] = opts.format\n    }\n    if (opts.number !== undefined && opts.number !== null) {\n      postBody['number'] = opts.number\n    }\n    if (opts.interval !== undefined && opts.interval !== null) {\n      postBody['interval'] = opts.interval\n    }\n    if (opts.width !== undefined && opts.width !== null) {\n      postBody['width'] = opts.width\n    }\n    if (opts.height !== undefined && opts.height !== null) {\n      postBody['height'] = opts.height\n    }\n    if (opts.fillType !== undefined && opts.fillType !== null) {\n      postBody['fillType'] = opts.fillType\n    }\n    if (opts.spriteConfig !== undefined && opts.spriteConfig !== null) {\n      postBody['spriteConfig'] = opts.spriteConfig\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSnapshotTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTemplates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询截图模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotTemplateInfo resultObject\n      */\n\n  getSnapshotTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling getSnapshotTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSnapshotTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTemplates/{templateId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改截图模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板ID\n      * @param {string} [opts.title] - 模板标题。长度不超过 128 个字节。UTF-8 编码。  optional\n      * @param {integer} [opts.startTime] - 截图起始时间，单位为秒，缺省值为 0  optional\n      * @param {string} [opts.frameType] - 截图帧类型。取值范围：normal、intra  optional\n      * @param {string} [opts.format] - 截图格式。取值范围：jpg、png  optional\n      * @param {integer} [opts.number] - 截图数量，缺省值为 10  optional\n      * @param {integer} [opts.interval] - 截图间隔  optional\n      * @param {integer} [opts.width] - 截图宽度，取值范围：[8, 4096]\n  optional\n      * @param {integer} [opts.height] - 截图高度，取值范围：[8, 4096]\n  optional\n      * @param {string} [opts.fillType] - 填充方式，当视频宽高与截图宽高指定值不能匹配时的填充处理方式。取值范围：\n  stretch - 伸缩\n  black - 留黑\n  white - 留白\n  gauss - 高斯模糊\n缺省值为 black\n  optional\n      * @param {spriteConfig} [opts.spriteConfig] - 雪碧图配置  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotTemplateInfo resultObject\n      */\n\n  modifySnapshotTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling modifySnapshotTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.frameType !== undefined && opts.frameType !== null) {\n      postBody['frameType'] = opts.frameType\n    }\n    if (opts.format !== undefined && opts.format !== null) {\n      postBody['format'] = opts.format\n    }\n    if (opts.number !== undefined && opts.number !== null) {\n      postBody['number'] = opts.number\n    }\n    if (opts.interval !== undefined && opts.interval !== null) {\n      postBody['interval'] = opts.interval\n    }\n    if (opts.width !== undefined && opts.width !== null) {\n      postBody['width'] = opts.width\n    }\n    if (opts.height !== undefined && opts.height !== null) {\n      postBody['height'] = opts.height\n    }\n    if (opts.fillType !== undefined && opts.fillType !== null) {\n      postBody['fillType'] = opts.fillType\n    }\n    if (opts.spriteConfig !== undefined && opts.spriteConfig !== null) {\n      postBody['spriteConfig'] = opts.spriteConfig\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifySnapshotTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTemplates/{templateId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除截图模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSnapshotTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling deleteSnapshotTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSnapshotTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTemplates/{templateId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  提交转码作业\n      * @param {Object} opts - parameters\n      * @param {string} opts.accessKey - 输入对象存储 accessKey，必须参数\n      * @param {string} opts.secretKey - 输入对象存储 accessKey，必须参数\n      * @param {string} opts.endpoint - 输入对象存储 endpoint。必须参数，内网域名，如 s3-internal.cn-north-1.jcloudcs.com\n      * @param {string} opts.bucket - 输入对象存储 bucket，必须参数\n      * @param {string} opts.objectKey - 输入对象存储 objectKey，必须参数\n      * @param {string} [opts.title] - 输入视频标题，可选参数，默认会从 objectKey 中截取  optional\n      * @param {array} [opts.templateIds] - 转码模板ID集合，必须参数，非空集合  optional\n      * @param {transcodeOutputConfig} opts.outputConfig - 输出配置，必须参数\n      * @param {string} [opts.additionalProperties] - 附加参数，JSON格式的字符串。除非清楚了解其用途和用法，请勿使用此字段。\n若参数在本次作业提交所关联的模板中，存在相同用途的对应字段，则该属性值会覆盖模板中的对应字段；\n若参数在本次作业提交所关联的模板中，不存在相同用途的对应字段，则该属性值会作为补充设置，用于生产任务；\n有特殊说明的除外。\n当前支持的附加参数：\n  - hls.encrypt.key - HLS加密公钥，对应于转码模板中 encryption.hlsKey 字段\n  - hls.encrypt.keyUrl - HLS加密公钥地址，对应于转码模板中 encryption.hlsKeyUrl 字段\n  - hls.encrypt.encodeType - HLS加密公钥编码方式，对应于转码模板中 encryption.hlsKeyEncodeType 字段\n特殊说明：\n  -  HLS加密相关参数，具有完整性要求，故 hls.encrypt 命名空间下的附加参数，依赖于 hls.encrypt.key 参数的设置情况。若设置 hls.encrypt.key 参数，则命名空间 hls.encrypt 下的其他参数也须同时设置；否则，其他参数会被忽略。\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param submitTranscodeJobResultInfo resultObject\n      */\n\n  submitTranscodeJob (opts, callback) {\n    opts = opts || {}\n\n    if (opts.accessKey === undefined || opts.accessKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accessKey' when calling submitTranscodeJob\"\n      )\n    }\n    if (opts.secretKey === undefined || opts.secretKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretKey' when calling submitTranscodeJob\"\n      )\n    }\n    if (opts.endpoint === undefined || opts.endpoint === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endpoint' when calling submitTranscodeJob\"\n      )\n    }\n    if (opts.bucket === undefined || opts.bucket === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucket' when calling submitTranscodeJob\"\n      )\n    }\n    if (opts.objectKey === undefined || opts.objectKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.objectKey' when calling submitTranscodeJob\"\n      )\n    }\n    if (opts.outputConfig === undefined || opts.outputConfig === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.outputConfig' when calling submitTranscodeJob\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accessKey !== undefined && opts.accessKey !== null) {\n      postBody['accessKey'] = opts.accessKey\n    }\n    if (opts.secretKey !== undefined && opts.secretKey !== null) {\n      postBody['secretKey'] = opts.secretKey\n    }\n    if (opts.endpoint !== undefined && opts.endpoint !== null) {\n      postBody['endpoint'] = opts.endpoint\n    }\n    if (opts.bucket !== undefined && opts.bucket !== null) {\n      postBody['bucket'] = opts.bucket\n    }\n    if (opts.objectKey !== undefined && opts.objectKey !== null) {\n      postBody['objectKey'] = opts.objectKey\n    }\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.templateIds !== undefined && opts.templateIds !== null) {\n      postBody['templateIds'] = opts.templateIds\n    }\n    if (opts.outputConfig !== undefined && opts.outputConfig !== null) {\n      postBody['outputConfig'] = opts.outputConfig\n    }\n    if (\n      opts.additionalProperties !== undefined &&\n      opts.additionalProperties !== null\n    ) {\n      postBody['additionalProperties'] = opts.additionalProperties\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call submitTranscodeJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeJobs:submit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码作业列表。\n支持如下过滤器：\n- title[eq] 按照输入视频标题进行精确匹配\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listTranscodeJobsResultInfo resultObject\n      */\n\n  listTranscodeJobs (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listTranscodeJobs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeJobs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个转码作业信息。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.jobId - 转码作业ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeJobInfo resultObject\n      */\n\n  getTranscodeJob (opts, callback) {\n    opts = opts || {}\n\n    if (opts.jobId === undefined || opts.jobId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jobId' when calling getTranscodeJob\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      jobId: opts.jobId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTranscodeJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeJobs/{jobId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码模板列表。\n允许通过条件过滤查询，支持的过滤字段如下：\n  - transcodeType[eq] 按转码方式精确查询\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listTranscodeTemplatesResultInfo resultObject\n      */\n\n  listTranscodeTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listTranscodeTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplates',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建转码模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.title - 模板标题。长度不超过 128 个字符，最少 2 个字符。UTF-8 编码。\n\n      * @param {videoStreamSettings} opts.video - 视频参数配置\n      * @param {audioStreamSettings} opts.audio - 音频参数配置\n      * @param {containerSettings} opts.container - 容器封装配置\n      * @param {encryptionSettings} [opts.encryption] - 加密配置  optional\n      * @param {string} opts.definition - 清晰度规格标记。取值范围：\n  SD - 标清\n  HD - 高清\n  FHD - 超清\n  2K\n  4K\n\n      * @param {string} [opts.transcodeType] - 转码方式。取值范围：\n  normal - 普通转码\n  jdchd - 京享超清\n  jdchs - 极速转码\n默认值为 normal\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeTemplateInfo resultObject\n      */\n\n  createTranscodeTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.title === undefined || opts.title === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.title' when calling createTranscodeTemplate\"\n      )\n    }\n    if (opts.video === undefined || opts.video === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.video' when calling createTranscodeTemplate\"\n      )\n    }\n    if (opts.audio === undefined || opts.audio === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.audio' when calling createTranscodeTemplate\"\n      )\n    }\n    if (opts.container === undefined || opts.container === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.container' when calling createTranscodeTemplate\"\n      )\n    }\n    if (opts.definition === undefined || opts.definition === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.definition' when calling createTranscodeTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.video !== undefined && opts.video !== null) {\n      postBody['video'] = opts.video\n    }\n    if (opts.audio !== undefined && opts.audio !== null) {\n      postBody['audio'] = opts.audio\n    }\n    if (opts.container !== undefined && opts.container !== null) {\n      postBody['container'] = opts.container\n    }\n    if (opts.encryption !== undefined && opts.encryption !== null) {\n      postBody['encryption'] = opts.encryption\n    }\n    if (opts.definition !== undefined && opts.definition !== null) {\n      postBody['definition'] = opts.definition\n    }\n    if (opts.transcodeType !== undefined && opts.transcodeType !== null) {\n      postBody['transcodeType'] = opts.transcodeType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createTranscodeTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码模板\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeTemplateInfo resultObject\n      */\n\n  getTranscodeTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling getTranscodeTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTranscodeTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplates/{templateId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  完整更新转码模板\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} [opts.title] - 模板标题。长度不超过 128 个字符，最少 2 个字符。UTF-8 编码。\n  optional\n      * @param {videoStreamSettings} [opts.video] - 视频参数配置  optional\n      * @param {audioStreamSettings} [opts.audio] - 音频参数配置  optional\n      * @param {containerSettings} [opts.container] - 封装容器配置  optional\n      * @param {encryptionSettings} [opts.encryption] - 加密配置  optional\n      * @param {string} [opts.definition] - 清晰度规格标记。取值范围：\n  SD - 标清\n  HD - 高清\n  FHD - 超清\n  2K\n  4K\n  optional\n      * @param {string} [opts.transcodeType] - 转码方式。取值范围：\n  normal - 普通转码\n  jdchd - 京享超清\n  jdchs - 极速转码\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeTemplateInfo resultObject\n      */\n\n  updateTranscodeTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling updateTranscodeTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.video !== undefined && opts.video !== null) {\n      postBody['video'] = opts.video\n    }\n    if (opts.audio !== undefined && opts.audio !== null) {\n      postBody['audio'] = opts.audio\n    }\n    if (opts.container !== undefined && opts.container !== null) {\n      postBody['container'] = opts.container\n    }\n    if (opts.encryption !== undefined && opts.encryption !== null) {\n      postBody['encryption'] = opts.encryption\n    }\n    if (opts.definition !== undefined && opts.definition !== null) {\n      postBody['definition'] = opts.definition\n    }\n    if (opts.transcodeType !== undefined && opts.transcodeType !== null) {\n      postBody['transcodeType'] = opts.transcodeType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateTranscodeTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplates/{templateId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  部分修改转码模板\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} [opts.title] - 模板标题。长度不超过 128 个字符，最少 2 个字符。UTF-8 编码。\n  optional\n      * @param {videoStreamSettings} [opts.video] - 视频参数配置  optional\n      * @param {audioStreamSettings} [opts.audio] - 音频参数配置  optional\n      * @param {containerSettings} [opts.container] - 封装容器配置  optional\n      * @param {encryptionSettings} [opts.encryption] - 加密配置  optional\n      * @param {string} [opts.definition] - 清晰度规格标记。取值范围：\n  SD - 标清\n  HD - 高清\n  FHD - 超清\n  2K\n  4K\n  optional\n      * @param {string} [opts.transcodeType] - 转码方式。取值范围：\n  normal - 普通转码\n  jdchd - 京享超清\n  jdchs - 极速转码\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeTemplateInfo resultObject\n      */\n\n  modifyTranscodeTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling modifyTranscodeTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.video !== undefined && opts.video !== null) {\n      postBody['video'] = opts.video\n    }\n    if (opts.audio !== undefined && opts.audio !== null) {\n      postBody['audio'] = opts.audio\n    }\n    if (opts.container !== undefined && opts.container !== null) {\n      postBody['container'] = opts.container\n    }\n    if (opts.encryption !== undefined && opts.encryption !== null) {\n      postBody['encryption'] = opts.encryption\n    }\n    if (opts.definition !== undefined && opts.definition !== null) {\n      postBody['definition'] = opts.definition\n    }\n    if (opts.transcodeType !== undefined && opts.transcodeType !== null) {\n      postBody['transcodeType'] = opts.transcodeType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyTranscodeTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplates/{templateId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除转码模板\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteTranscodeTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling deleteTranscodeTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTranscodeTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplates/{templateId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取bucket的图片样式分隔符配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param styleDelimiterConf styleDelimiterConf\n      */\n\n  getStyleDelimiter (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getStyleDelimiter\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling getStyleDelimiter\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getStyleDelimiter with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/styleDelimiter/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置图片样式分隔符\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {array} [opts.delimiters] - 图片样式分隔符配置（JSON数组）；支持的分隔符包含：[&quot;-&quot;, &quot;_&quot;, &quot;/&quot;, &quot;!&quot;]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setStyleDelimiter (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setStyleDelimiter\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling setStyleDelimiter\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.delimiters !== undefined && opts.delimiters !== null) {\n      postBody['delimiters'] = opts.delimiters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setStyleDelimiter with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/styleDelimiter/',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除bucket的图片样式分隔符配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteStyleDelimiter (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteStyleDelimiter\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling deleteStyleDelimiter\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteStyleDelimiter with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/styleDelimiter/',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  图片样式列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {string} [opts.styleName] - 按样式名称查询  optional\n      * @param {integer} [opts.pageNumber] - 数据页码  optional\n      * @param {integer} [opts.pageSize] - 每页数据的条数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageStyleQueryResult imageStyleQueryResult\n      */\n\n  listImageStyle (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listImageStyle\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling listImageStyle\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.styleName !== undefined && opts.styleName !== null) {\n      queryParams['styleName'] = opts.styleName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listImageStyle with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/imageStyles',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加图片样式\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {integer} [opts.id] - 图片样式id(readOnly)  optional\n      * @param {string} [opts.userId] - 用户id(readOnly)  optional\n      * @param {string} [opts.styleName] - 图片样式名称  optional\n      * @param {string} [opts.params] - 图片样式参数  optional\n      * @param {string} [opts.paramAlias] - 图片样式参数别名  optional\n      * @param {string} [opts.regionId] - 所属区域(readOnly)  optional\n      * @param {string} [opts.bucketName] - 所属Bucket(readOnly)  optional\n      * @param {integer} [opts.status] - 图片样式状态(readOnly)  optional\n      * @param {string} [opts.modifyTime] - 修改时间(readOnly)  optional\n      * @param {string} [opts.createdTime] - 创建时间(readOnly)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageStyleID imageStyleID\n      */\n\n  createImageStyle (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createImageStyle\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling createImageStyle\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      postBody['id'] = opts.id\n    }\n    if (opts.userId !== undefined && opts.userId !== null) {\n      postBody['userId'] = opts.userId\n    }\n    if (opts.styleName !== undefined && opts.styleName !== null) {\n      postBody['styleName'] = opts.styleName\n    }\n    if (opts.params !== undefined && opts.params !== null) {\n      postBody['params'] = opts.params\n    }\n    if (opts.paramAlias !== undefined && opts.paramAlias !== null) {\n      postBody['paramAlias'] = opts.paramAlias\n    }\n    if (opts.regionId !== undefined && opts.regionId !== null) {\n      postBody['regionId'] = opts.regionId\n    }\n    if (opts.bucketName !== undefined && opts.bucketName !== null) {\n      postBody['bucketName'] = opts.bucketName\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.modifyTime !== undefined && opts.modifyTime !== null) {\n      postBody['modifyTime'] = opts.modifyTime\n    }\n    if (opts.createdTime !== undefined && opts.createdTime !== null) {\n      postBody['createdTime'] = opts.createdTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createImageStyle with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/imageStyles',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  图片样式详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {integer} opts.id - 图片样式id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageStyle imageStyle\n      */\n\n  getImageStyle (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getImageStyle\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling getImageStyle\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling getImageStyle\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getImageStyle with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/imageStyles/{id}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改图片样式\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {integer} opts.id - 图片样式id\n      * @param {integer} [opts.id] - 图片样式id(readOnly)  optional\n      * @param {string} [opts.userId] - 用户id(readOnly)  optional\n      * @param {string} [opts.styleName] - 图片样式名称  optional\n      * @param {string} [opts.params] - 图片样式参数  optional\n      * @param {string} [opts.paramAlias] - 图片样式参数别名  optional\n      * @param {string} [opts.regionId] - 所属区域(readOnly)  optional\n      * @param {string} [opts.bucketName] - 所属Bucket(readOnly)  optional\n      * @param {integer} [opts.status] - 图片样式状态(readOnly)  optional\n      * @param {string} [opts.modifyTime] - 修改时间(readOnly)  optional\n      * @param {string} [opts.createdTime] - 创建时间(readOnly)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateImageStyle (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateImageStyle\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling updateImageStyle\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling updateImageStyle\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      postBody['id'] = opts.id\n    }\n    if (opts.userId !== undefined && opts.userId !== null) {\n      postBody['userId'] = opts.userId\n    }\n    if (opts.styleName !== undefined && opts.styleName !== null) {\n      postBody['styleName'] = opts.styleName\n    }\n    if (opts.params !== undefined && opts.params !== null) {\n      postBody['params'] = opts.params\n    }\n    if (opts.paramAlias !== undefined && opts.paramAlias !== null) {\n      postBody['paramAlias'] = opts.paramAlias\n    }\n    if (opts.regionId !== undefined && opts.regionId !== null) {\n      postBody['regionId'] = opts.regionId\n    }\n    if (opts.bucketName !== undefined && opts.bucketName !== null) {\n      postBody['bucketName'] = opts.bucketName\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.modifyTime !== undefined && opts.modifyTime !== null) {\n      postBody['modifyTime'] = opts.modifyTime\n    }\n    if (opts.createdTime !== undefined && opts.createdTime !== null) {\n      postBody['createdTime'] = opts.createdTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateImageStyle with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/imageStyles/{id}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除图片样式\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {integer} opts.id - 图片样式id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteImageStyle (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteImageStyle\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling deleteImageStyle\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteImageStyle\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteImageStyle with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/imageStyles/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  图片样式总数\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {string} [opts.styleName] - 按样式名称查询  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageStyleCount imageStyleCount\n      */\n\n  countImageStyle (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  countImageStyle\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling countImageStyle\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.styleName !== undefined && opts.styleName !== null) {\n      queryParams['styleName'] = opts.styleName\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call countImageStyle with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/imageStyles/count',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询截图任务，返回满足查询条件的任务列表。\n      * @param {Object} opts - parameters\n      * @param {string} [opts.status] - task 状态 (PENDING, RUNNING, SUCCESS, FAILED)  optional\n      * @param {string} [opts.begin] - 开始时间 时间格式(GMT): yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39;Z&#39;  optional\n      * @param {string} [opts.end] - 结束时间 时间格式(GMT): yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39;Z&#39;  optional\n      * @param {string} [opts.marker] - 查询标记  optional\n      * @param {integer} [opts.limit] - 查询记录数 [1, 1000]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param thumbnailQuery thumbnailQuery\n      */\n\n  listThumbnailTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listThumbnailTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.begin !== undefined && opts.begin !== null) {\n      queryParams['begin'] = opts.begin\n    }\n    if (opts.end !== undefined && opts.end !== null) {\n      queryParams['end'] = opts.end\n    }\n    if (opts.marker !== undefined && opts.marker !== null) {\n      queryParams['marker'] = opts.marker\n    }\n    if (opts.limit !== undefined && opts.limit !== null) {\n      queryParams['limit'] = opts.limit\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listThumbnailTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/thumbnail',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建截图任务，创建成功时返回任务ID。本接口用于截取指定时间点的画面。\n      * @param {Object} opts - parameters\n      * @param {string} [opts.taskID] - 任务ID (readonly)  optional\n      * @param {string} [opts.status] - 状态 (SUCCESS, ERROR, PENDDING, RUNNING) (readonly)  optional\n      * @param {integer} [opts.errorCode] - 错误码 (readonly)  optional\n      * @param {string} [opts.createdTime] - 任务创建时间 时间格式(GMT): yyyy-MM-dd’T’HH:mm:ss.SSS’Z’  (readonly)  optional\n      * @param {string} [opts.lastUpdatedTime] - 任务创建时间 时间格式(GMT): yyyy-MM-dd’T’HH:mm:ss.SSS’Z’  (readonly)  optional\n      * @param {thumbnailTaskSource} opts.source\n      * @param {thumbnailTaskTarget} opts.target\n      * @param {thumbnailTaskRule} [opts.rule]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param thumbnailTaskID thumbnailTaskID\n      */\n\n  createThumbnailTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createThumbnailTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.source === undefined || opts.source === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.source' when calling createThumbnailTask\"\n      )\n    }\n    if (opts.target === undefined || opts.target === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.target' when calling createThumbnailTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskID !== undefined && opts.taskID !== null) {\n      postBody['taskID'] = opts.taskID\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.errorCode !== undefined && opts.errorCode !== null) {\n      postBody['errorCode'] = opts.errorCode\n    }\n    if (opts.createdTime !== undefined && opts.createdTime !== null) {\n      postBody['createdTime'] = opts.createdTime\n    }\n    if (opts.lastUpdatedTime !== undefined && opts.lastUpdatedTime !== null) {\n      postBody['lastUpdatedTime'] = opts.lastUpdatedTime\n    }\n    if (opts.source !== undefined && opts.source !== null) {\n      postBody['source'] = opts.source\n    }\n    if (opts.target !== undefined && opts.target !== null) {\n      postBody['target'] = opts.target\n    }\n    if (opts.rule !== undefined && opts.rule !== null) {\n      postBody['rule'] = opts.rule\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createThumbnailTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/thumbnail',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据任务ID获取截图任务。\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - task id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param thumbnailTask thumbnailTask\n      */\n\n  getThumbnailTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getThumbnailTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling getThumbnailTask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getThumbnailTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/thumbnail/{taskId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取媒体处理通知\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param notification notification\n      */\n\n  getNotification (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getNotification\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getNotification with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/notification',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置媒体处理通知, 在设置Notification时会对endpoint进行校验, 设置时会对endpoint发一条SubscriptionConfirmation(x-jdcloud-message-type头)的通知, 要求把Message内容进行base64编码返回给系统(body)进行校验\n      * @param {Object} opts - parameters\n      * @param {boolean} opts.enabled - 是否启用通知\n      * @param {string} [opts.endpoint] - 通知endpoint, 当前支持http://和https://  optional\n      * @param {array} [opts.events] - 触发通知的事件集合 (mpsTranscodeComplete, mpsThumbnailComplete)  optional\n      * @param {string} [opts.notifyStrategy] - 重试策略, BACKOFF_RETRY: 退避重试策略, 重试 3 次, 每次重试的间隔时间是 10秒 到 20秒 之间的随机值; EXPONENTIAL_DECAY_RETRY: 指数衰减重试, 重试 176 次, 每次重试的间隔时间指数递增至 512秒, 总计重试时间为1天; 每次重试的具体间隔为: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 512 ... 512 秒(共167个512)  optional\n      * @param {string} [opts.notifyContentFormat] - 描述了向 Endpoint 推送的消息格式, JSON: 包含消息正文和消息属性, SIMPLIFIED: 消息体即用户发布的消息, 不包含任何属性信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setNotification (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setNotification\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.enabled === undefined || opts.enabled === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.enabled' when calling setNotification\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n    if (opts.endpoint !== undefined && opts.endpoint !== null) {\n      postBody['endpoint'] = opts.endpoint\n    }\n    if (opts.events !== undefined && opts.events !== null) {\n      postBody['events'] = opts.events\n    }\n    if (opts.notifyStrategy !== undefined && opts.notifyStrategy !== null) {\n      postBody['notifyStrategy'] = opts.notifyStrategy\n    }\n    if (\n      opts.notifyContentFormat !== undefined &&\n      opts.notifyContentFormat !== null\n    ) {\n      postBody['notifyContentFormat'] = opts.notifyContentFormat\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  mps/0.4.10'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setNotification with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/notification',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = MPS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/nativecontainer/v1/nativecontainer.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 用户设置\n * 查询用户设置接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'nativecontainer'\nService._services[serviceId] = true\n\n/**\n * nativecontainer service.\n * @version 2.3.0\n */\n\nclass NATIVECONTAINER extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'nativecontainer.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  批量查询原生容器的详细信息&lt;br&gt;\n此接口支持分页查询，默认每页20条。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - containerId - 实例ID，精确匹配，支持多个\nprivateIpAddress - 主网卡IP地址，模糊匹配，支持单个\naz - 可用区，精确匹配，支持多个\nvpcId - 私有网络ID，精确匹配，支持多个\nstatus - 容器状态，精确匹配，支持多个\nname - 容器名称，模糊匹配，支持单个\nsubnetId - 子网ID，精确匹配，支持多个\nagId - 镜像ID，精确匹配，支持多个\n  optional\n      * @param {tagFilter} [opts.tags] - Tag筛选条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param container containers\n      * @param number totalCount\n      */\n\n  describeContainers (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeContainers\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeContainers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一台或多台指定配置容器\n- 创建容器需要通过实名认证\n- 可用区\n  - 容器所属的可用区\n  - 创建容器，需要使用中心可用区的相关资源：\n    - 具有中心可用区属性的子网\n    - 公网IP服务商\n- 镜像\n  - 容器的镜像通过镜像名称来确定\n  - nginx:tag, mysql/mysql-server:tag这样命名的镜像表示docker hub官方镜像\n  - container-registry/image:tag这样命名的镜像表示私有仓储的镜像\n  - 私有仓储必须兼容docker registry认证机制，并通过secret来保存机密信息\n- hostname规范\n  - 支持两种方式：以标签方式书写或以完整主机名方式书写\n  - 标签规范\n    - 0-9，a-z(不分大小写)和-（减号），其他的都是无效的字符串\n    - 不能以减号开始，也不能以减号结尾\n    - 最小1个字符，最大63个字符\n  - 完整的主机名由一系列标签与点连接组成\n    - 标签与标签之间使用“.”(点)进行连接\n    - 不能以“.”(点)开始，也不能以“.”(点)结尾\n    - 整个主机名（包括标签以及分隔点“.”）最多有63个ASCII字符\n- 网络配置\n  - 指定主网卡配置信息\n    - 必须指定vpcId、subnetId、securityGroupIds\n    - 可以指定elasticIp规格来约束创建的弹性IP，带宽取值范围[1-200]Mbps，步进1Mbps\n    - 可以指定网卡的主IP(primaryIpAddress)和辅助IP(secondaryIpAddresses)，此时maxCount只能为1\n    - 可以指定希望的辅助IP个数(secondaryIpAddressCount)让系统自动创建内网IP\n    - 可以设置网卡的自动删除autoDelete属性，指明是否删除实例时自动删除网卡\n    - 安全组securityGroup需与子网Subnet在同一个私有网络VPC内\n    - 每个容器至多指定5个安全组\n    - 主网卡deviceIndex设置为0\n- 存储\n  - volume分为root volume和data volume，root volume的挂载目录是/，data volume的挂载目录可以随意指定\n  - volume的底层存储介质当前只支持cloud类别，也就是云硬盘\n  - 云盘类型为 ssd.io1 时，用户可以指定 iops，其他类型云盘无效，对已经存在的云盘无效，具体规则如下\n    - 步长 10\n    - 范围 [200，min(32000，size*50)]\n    - 默认值 size*30\n  - root volume\n  - root volume支持cloud和local\n    - 云硬盘类型可以选择hdd.std1、ssd.gp1、ssd.io1\n    - 磁盘大小\n      - 所有类型：范围[10,100]GB，步长为10G\n    - 自动删除\n      - 默认自动删除\n    - 可以选择已存在的云硬盘\n  - data volume\n    - data volume当前只能选择cloud类别\n    - 云硬盘类型可以选择hdd.std1、ssd.gp1、ssd.io1\n    - 磁盘大小\n      - 所有类型：范围[20,2000]GB，步长为10G\n    - 自动删除\n      - 默认自动删除\n    - 可以选择已存在的云硬盘\n    - 可以从快照创建磁盘\n    - 单个容器可以挂载7个data volume\n- 容器日志\n  - default：默认在本地分配10MB的存储空间，自动rotate\n- 其他\n  - 创建完成后，容器状态为running\n  - maxCount为最大努力，不保证一定能达到maxCount\n\n      * @param {Object} opts - parameters\n      * @param {containerSpec} opts.containerSpec - 创建容器规格\n      * @param {integer} opts.maxCount - 购买实例数量；取值范围：[1,100]\n      * @param {string} [opts.clientToken] - 保证请求幂等性  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string containerIds\n      */\n\n  createContainers (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createContainers\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerSpec === undefined || opts.containerSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerSpec' when calling createContainers\"\n      )\n    }\n    if (opts.maxCount === undefined || opts.maxCount === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.maxCount' when calling createContainers\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.containerSpec !== undefined && opts.containerSpec !== null) {\n      postBody['containerSpec'] = opts.containerSpec\n    }\n    if (opts.maxCount !== undefined && opts.maxCount !== null) {\n      postBody['maxCount'] = opts.maxCount\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createContainers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  &quot;查询一台原生容器的详细信息&quot;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param container container\n      */\n\n  describeContainer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeContainer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling describeContainer\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeContainer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers/{containerId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  容器状态必须为 stopped、running 或 error状态。 &lt;br&gt;\n按量付费的实例，如不主动删除将一直运行，不再使用的实例，可通过本接口主动停用。&lt;br&gt;\n只能支持主动删除按配置计费类型的实例。包年包月过期的容器也可以删除，其它的情况还请发工单系统。计费状态异常的容器无法删除。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteContainer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteContainer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling deleteContainer\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteContainer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers/{containerId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动处于关闭状态的单个容器，处在任务执行中的容器无法启动。&lt;br&gt;\n容器实例或其绑定的云盘已欠费时，容器将无法正常启动。&lt;br&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startContainer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startContainer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling startContainer\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startContainer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:startContainer',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止处于运行状态的单个实例，处于任务执行中的容器无法启动。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopContainer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopContainer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling stopContainer\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopContainer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:stopContainer',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改容器的 名称 和 描述。&lt;br&gt;\nname 和 description 必须要指定一个\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} [opts.name] - 容器名称  optional\n      * @param {string} [opts.description] - 容器描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyContainerAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyContainerAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling modifyContainerAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyContainerAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:modifyContainerAttribute',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  容器绑定弹性公网 IP，绑定的是主网卡、主内网IP对应的弹性IP. &lt;br&gt;\n一台云主机只能绑定一个弹性公网 IP(主网卡)，若主网卡已存在弹性公网IP，会返回错误。&lt;br&gt;\n如果是黑名单中的用户，会返回错误。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} opts.elasticIpId - 弹性IP ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  associateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling associateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling associateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:associateElasticIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  容器解绑公网 IP，解绑的是主网卡、主内网 IP 对应的弹性 IP.\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} opts.elasticIpId - 弹性IP ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disassociateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling disassociateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling disassociateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:disassociateElasticIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个容器日志\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {integer} [opts.tailLines] - 返回日志文件中倒数 tailLines 行，如不指定，默认从容器启动时或 sinceSeconds 指定的时间读取。\n  optional\n      * @param {integer} [opts.sinceSeconds] - 返回相对于当前时间之前sinceSeconds之内的日志。\n  optional\n      * @param {integer} [opts.limitBytes] - 限制返回的日志文件内容字节数，取值范围 [1-4]KB，最大 4KB.\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object logs\n      */\n\n  getLogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getLogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling getLogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.tailLines !== undefined && opts.tailLines !== null) {\n      queryParams['tailLines'] = opts.tailLines\n    }\n    if (opts.sinceSeconds !== undefined && opts.sinceSeconds !== null) {\n      queryParams['sinceSeconds'] = opts.sinceSeconds\n    }\n    if (opts.limitBytes !== undefined && opts.limitBytes !== null) {\n      queryParams['limitBytes'] = opts.limitBytes\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:getLogs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重置原生容器，对已有原生容器使用新的镜像重置。\n原容器 id 不变，不涉及计费变动，暂不支持修改实例类型，不会改变原生容器所在的物理节点，也不支持修改已经使用的系统盘和数据盘以及网络相关参数。\n- 镜像\n    - 容器的镜像通过镜像名称来确定\n    - nginx:tag 或 mysql/mysql-server:tag 这样命名的镜像表示 docker hub 官方镜像\n    - container-registry/image:tag 这样命名的镜像表示私有仓储的镜像\n    - 私有仓储必须兼容 docker registry 认证机制，并通过 secret 来保存机密信息\n- 其他\n    - rebuild 之前容器必须处于关闭状态\n    - rebuild 完成后，容器仍为关闭状态\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} opts.image - 镜像名称 &lt;/br&gt; 1. Docker Hub官方镜像通过类似nginx, mysql/mysql-server的名字指定 &lt;/br&gt; &lt;/br&gt; repository长度最大256个字符，tag最大128个字符，registry最大255个字符 &lt;/br&gt; 下载镜像超时时间：10分钟\n      * @param {string} [opts.secret] - 镜像仓库认证信息；使用Docker Hub和京东云CR的镜像不需要secret  optional\n      * @param {array} [opts.command] - 容器启动执行的命令, 如果不指定默认是镜像的ENTRYPOINT. 数组字符总长度范围：[0-256]  optional\n      * @param {array} [opts.args] - 容器启动执行命令的参数, 如果不指定默认是镜像的CMD. 数组字符总长度范围：[0-2048]  optional\n      * @param {boolean} [opts.tty] - 容器是否分配tty。默认不分配  optional\n      * @param {string} [opts.workingDir] - 容器的工作目录。如果不指定，默认是根目录（/），必须是绝对路径。字符长度范围：[0-1024]  optional\n      * @param {array} [opts.envs] - 容器执行的环境变量；如果和镜像中的环境变量Key相同，会覆盖镜像中的值；&lt;/br&gt; 最大100对  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  rebuildContainer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  rebuildContainer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling rebuildContainer\"\n      )\n    }\n    if (opts.image === undefined || opts.image === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.image' when calling rebuildContainer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.image !== undefined && opts.image !== null) {\n      postBody['image'] = opts.image\n    }\n    if (opts.secret !== undefined && opts.secret !== null) {\n      postBody['secret'] = opts.secret\n    }\n    if (opts.command !== undefined && opts.command !== null) {\n      postBody['command'] = opts.command\n    }\n    if (opts.args !== undefined && opts.args !== null) {\n      postBody['args'] = opts.args\n    }\n    if (opts.tty !== undefined && opts.tty !== null) {\n      postBody['tty'] = opts.tty\n    }\n    if (opts.workingDir !== undefined && opts.workingDir !== null) {\n      postBody['workingDir'] = opts.workingDir\n    }\n    if (opts.envs !== undefined && opts.envs !== null) {\n      postBody['envs'] = opts.envs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call rebuildContainer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:rebuild',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  调整原生容器实例类型配置。\n- 原生容器状态为停止;\n- 支持升配、降配；**不支持原有规格**\n- 计费类型不变\n    - 包年包月：需要计算配置差价，如果所选配置价格高，需要补齐到期前的差价，到期时间不变；如果所选配置价格低，需要延长到期时间\n    - 按配置：按照所选规格，进行计费\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} opts.instanceType - 新实例类型，不可与原实例类型相同\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resizeContainer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resizeContainer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling resizeContainer\"\n      )\n    }\n    if (opts.instanceType === undefined || opts.instanceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceType' when calling resizeContainer\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceType !== undefined && opts.instanceType !== null) {\n      postBody['instanceType'] = opts.instanceType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resizeContainer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:resize',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建exec\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {array} [opts.command] - 执行命令  optional\n      * @param {boolean} [opts.tty] - 执行命令是否添加tty  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string execId\n      */\n\n  execCreate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  execCreate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling execCreate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.command !== undefined && opts.command !== null) {\n      postBody['command'] = opts.command\n    }\n    if (opts.tty !== undefined && opts.tty !== null) {\n      postBody['tty'] = opts.tty\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call execCreate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:execCreate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取exec退出码\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} opts.execId - exec ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer exitCode\n      */\n\n  execGetExitCode (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  execGetExitCode\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling execGetExitCode\"\n      )\n    }\n    if (opts.execId === undefined || opts.execId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.execId' when calling execGetExitCode\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.execId !== undefined && opts.execId !== null) {\n      queryParams['execId'] = opts.execId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call execGetExitCode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:execGetExitCode',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  调整TTY大小\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {integer} opts.height - tty row\n      * @param {integer} opts.width - tty column\n      * @param {string} [opts.execId] - exec ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resizeTTY (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resizeTTY\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling resizeTTY\"\n      )\n    }\n    if (opts.height === undefined || opts.height === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.height' when calling resizeTTY\"\n      )\n    }\n    if (opts.width === undefined || opts.width === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.width' when calling resizeTTY\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.height !== undefined && opts.height !== null) {\n      postBody['height'] = opts.height\n    }\n    if (opts.width !== undefined && opts.width !== null) {\n      postBody['width'] = opts.width\n    }\n    if (opts.execId !== undefined && opts.execId !== null) {\n      postBody['execId'] = opts.execId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resizeTTY with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:resizeTTY',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例规格信息列表\n\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - instanceTypes - 实例规格，精确匹配，支持多个\naz - 可用区，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceType instanceTypes\n      * @param instanceType specificInstanceTypes\n      * @param integer totalCount  总数量\n      */\n\n  describeInstanceTypes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceTypes\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceTypes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceTypes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询资源的配额，支持：原生容器 pod 和 secret.\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.resourceType - resourceType - 资源类型，支持 [container, pod, secret]\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quota\n      */\n\n  describeQuota (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuota\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.resourceType === undefined || opts.resourceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceType' when calling describeQuota\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceType !== undefined && opts.resourceType !== null) {\n      queryParams['resourceType'] = opts.resourceType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuota with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/quotas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 secret 列表。&lt;br&gt;\n此接口支持分页查询，默认每页20条。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - name - secret名称，支持模糊搜索\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param secret secrets\n      * @param number totalCount\n      */\n\n  describeSecrets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSecrets\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecrets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secrets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个 secret，用于存放镜像仓库认证信息。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 镜像仓库认证信息名称，不能重复\n\n      * @param {string} opts.secretType - 镜像仓库认证信息类型，目前仅支持：docker-registry 类型，用来和docker registry认证的类型。\n\n      * @param {dockerRegistryData} opts.data - 镜像仓库认证信息数据。&lt;br&gt;\n必须包含server、username、password 字段，email 字段是可选的。&lt;br&gt;\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string secretName\n      */\n\n  createSecret (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSecret\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createSecret\"\n      )\n    }\n    if (opts.secretType === undefined || opts.secretType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretType' when calling createSecret\"\n      )\n    }\n    if (opts.data === undefined || opts.data === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.data' when calling createSecret\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.secretType !== undefined && opts.secretType !== null) {\n      postBody['secretType'] = opts.secretType\n    }\n    if (opts.data !== undefined && opts.data !== null) {\n      postBody['data'] = opts.data\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secrets',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个 secret 详情\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - Secret Name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param secret secret\n      */\n\n  describeSecret (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSecret\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling describeSecret\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secrets/{name}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除单个 secret\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - Secret Name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSecret (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSecret\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling deleteSecret\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nativecontainer/2.3.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secrets/{name}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = NATIVECONTAINER\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/nc/v1/nc.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 镜像仓库认证信息\n * 关于镜像仓库认证信息的相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'nc'\nService._services[serviceId] = true\n\n/**\n * nc service.\n * @version 0.2.5\n */\n\nJDCloud.NC = class NC extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'nc.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  批量查询原生容器的详细信息&lt;br&gt;\n此接口支持分页查询，默认每页20条。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - containerId - 实例ID，精确匹配，支持多个\nprivateIpAddress - 主网卡IP地址，模糊匹配，支持单个\naz - 可用区，精确匹配，支持多个\nvpcId - 私有网络ID，精确匹配，支持多个\nstatus - 容器状态，精确匹配，支持多个\nname - 实例名称，模糊匹配，支持单个\nsubnetId - 镜像ID，模糊匹配，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param container containers\n      * @param number totalCount\n      */\n\n  describeContainers (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeContainers\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeContainers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/containers',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一台或多台指定配置容器。\n- 创建容器需要通过实名认证\n- 镜像\n    - 容器的镜像通过镜像名称来确定\n    - nginx:tag 或 mysql/mysql-server:tag 这样命名的镜像表示 docker hub 官方镜像\n    - container-registry/image:tag 这样命名的镜像表示私有仓储的镜像\n    - 私有仓储必须兼容 docker registry 认证机制，并通过 secret 来保存机密信息\n- hostname 规范\n    - 支持两种方式：以标签方式书写或以完整主机名方式书写\n    - 标签规范\n        - 0-9，a-z(不分大小写)和 -（减号），其他的都是无效的字符串\n        - 不能以减号开始，也不能以减号结尾\n        - 最小1个字符，最大63个字符\n    - 完整的主机名由一系列标签与点连接组成\n        - 标签与标签之间使用“.”(点)进行连接\n        - 不能以“.”(点)开始，也不能以“.”(点)结尾\n        - 整个主机名（包括标签以及分隔点“.”）最多有63个ASCII字符\n- 网络配置\n    - 指定主网卡配置信息\n        - 必须指定一个子网\n        - 一台云主机创建时必须指定一个安全组，至多指定 5 个安全组\n        - 可以指定 elasticIp 规格来约束创建的弹性 IP，带宽取值范围 [1-200]Mbps，步进 1Mbps\n        - 可以指定网卡的主 IP(primaryIpAddress)，该 IP 需要在子网 IP 范围内且未被占用，指定子网 IP 时 maxCount 只能为1\n        - 安全组 securityGroup 需与子网 Subnet 在同一个私有网络 VPC 内\n        - 主网卡 deviceIndex 设置为 1\n- 存储\n    - volume 分为 root volume 和 data volume，root volume 的挂载目录是 /，data volume 的挂载目录可以随意指定\n    - volume 的底层存储介质当前只支持 cloud 类别，也就是云硬盘\n    - 系统盘\n        - 云硬盘类型可以选择 ssd、premium-hdd\n        - 磁盘大小\n            - ssd：范围 [10, 100]GB，步长为 10G\n            - premium-hdd：范围 [20, 1000]GB，步长为 10G\n        - 自动删除\n            - 云盘默认跟随容器实例自动删除，如果是包年包月的数据盘或共享型数据盘，此参数不生效\n        - 可以选择已存在的云硬盘\n    - 数据盘\n        - 云硬盘类型可以选择 ssd、premium-hdd\n        - 磁盘大小\n            - ssd：范围[20,1000]GB，步长为10G\n            - premium-hdd：范围[20,3000]GB，步长为10G\n        - 自动删除\n            - 默认自动删除\n        - 可以选择已存在的云硬盘\n        - 单个容器最多可以挂载 7 个 data volume\n- 计费\n  - 弹性IP的计费模式，如果选择按用量类型可以单独设置，其它计费模式都以主机为准\n  - 云硬盘的计费模式以主机为准\n- 容器日志\n    - 默认在本地分配10MB的存储空间，自动 rotate\n- 其他\n    - 创建完成后，容器状态为running\n    - maxCount 为最大努力，不保证一定能达到 maxCount\n\n      * @param {Object} opts - parameters\n      * @param {containerSpec} [opts.containerSpec] - 创建容器规格  optional\n      * @param {integer} [opts.maxCount] - 购买实例数量；取值范围：[1,100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string containerIds\n      */\n\n  createContainers (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createContainers\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.containerSpec !== undefined && opts.containerSpec !== null) {\n      postBody['containerSpec'] = opts.containerSpec\n    }\n    if (opts.maxCount !== undefined && opts.maxCount !== null) {\n      postBody['maxCount'] = opts.maxCount\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createContainers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/containers',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一台原生容器的详细信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param container container\n      */\n\n  describeContainer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeContainer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling describeContainer\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeContainer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/containers/{containerId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  容器状态必须为 stopped、running 或 error状态。 &lt;br&gt;\n按量付费的实例，如不主动删除将一直运行，不再使用的实例，可通过本接口主动停用。&lt;br&gt;\n只能支持主动删除按量计费类型的实例。包年包月过期的容器也可以删除，其它的情况还请发工单系统。计费状态异常的容器无法删除。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteContainer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteContainer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling deleteContainer\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteContainer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/containers/{containerId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动处于关闭状态的单个容器，处在任务执行中的容器无法启动。&lt;br&gt;\n容器实例或其绑定的云盘已欠费时，容器将无法正常启动。&lt;br&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startContainer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startContainer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling startContainer\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startContainer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:startContainer',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止处于运行状态的单个实例，处于任务执行中的容器无法启动。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopContainer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopContainer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling stopContainer\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopContainer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:stopContainer',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改容器的 名称 和 描述。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} [opts.name] - 容器名称  optional\n      * @param {string} [opts.description] - 容器描述；和description必须要指定一个  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyContainerAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyContainerAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling modifyContainerAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyContainerAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:modifyContainerAttribute',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  容器绑定弹性公网 IP，绑定的是主网卡、主内网IP对应的弹性IP. &lt;br&gt;\n一台云主机只能绑定一个弹性公网 IP(主网卡)，若主网卡已存在弹性公网IP，会返回错误。&lt;br&gt;\n如果是黑名单中的用户，会返回错误。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} opts.elasticIpId - 弹性IP ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  associateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling associateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling associateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:associateElasticIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  容器解绑公网 IP，解绑的是主网卡、主内网 IP 对应的弹性 IP.\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {string} opts.elasticIpId - 弹性IP ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disassociateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling disassociateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling disassociateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:disassociateElasticIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个容器日志\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.containerId - Container ID\n      * @param {integer} [opts.tailLines] - 返回日志文件中倒数 tailLines 行，如不指定，默认从容器启动时或 sinceSeconds 指定的时间读取。\n  optional\n      * @param {integer} [opts.sinceSeconds] - 返回相对于当前时间之前sinceSeconds之内的日志。\n  optional\n      * @param {integer} [opts.limitBytes] - 限制返回的日志文件内容字节数，取值范围 [1-4]KB，最大 4KB.\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object logs\n      */\n\n  getLogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getLogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.containerId === undefined || opts.containerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerId' when calling getLogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.tailLines !== undefined && opts.tailLines !== null) {\n      queryParams['tailLines'] = opts.tailLines\n    }\n    if (opts.sinceSeconds !== undefined && opts.sinceSeconds !== null) {\n      queryParams['sinceSeconds'] = opts.sinceSeconds\n    }\n    if (opts.limitBytes !== undefined && opts.limitBytes !== null) {\n      queryParams['limitBytes'] = opts.limitBytes\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      containerId: opts.containerId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/containers/{containerId}:getLogs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询资源的配额，支持：原生容器 pod 和 secret.\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.resourceType - resourceType - 资源类型，支持 [container, pod, secret]\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quota\n      */\n\n  describeQuota (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuota\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.resourceType === undefined || opts.resourceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceType' when calling describeQuota\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceType !== undefined && opts.resourceType !== null) {\n      queryParams['resourceType'] = opts.resourceType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuota with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/quotas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 secret 列表。&lt;br&gt;\n此接口支持分页查询，默认每页20条。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - name - secret名称，支持模糊搜索\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param secret secrets\n      * @param number totalCount\n      */\n\n  describeSecrets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSecrets\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecrets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/secrets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个 secret，用于存放镜像仓库机密相关信息。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 机密数据名称，不能重复\n\n      * @param {string} opts.secretType - 机密数据的类型，目前仅支持：docker-registry 类型，用来和docker registry认证的类型。\n\n      * @param {dockerRegistryData} [opts.data] - 机密的数据。&lt;br&gt;\nkey 的有效字符包括字母、数字、-、_和.； &lt;br&gt;\nvalue 是 Base64 编码的字符串，不能包含换行符（在 linux 下使用 base64 -w 0选项），每个value长度上限为4KB，整个data的长度不能超过256KB; &lt;br&gt;\n必须包含server、username、password 字段，email 字段是可选的。&lt;br&gt;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string secretName\n      */\n\n  createSecret (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSecret\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createSecret\"\n      )\n    }\n    if (opts.secretType === undefined || opts.secretType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretType' when calling createSecret\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.secretType !== undefined && opts.secretType !== null) {\n      postBody['secretType'] = opts.secretType\n    }\n    if (opts.data !== undefined && opts.data !== null) {\n      postBody['data'] = opts.data\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/secrets',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个 secret 详情\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - Secret Name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param secret secret\n      */\n\n  describeSecret (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSecret\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling describeSecret\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/secrets/{name}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除单个 secret\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - Secret Name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSecret (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSecret\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling deleteSecret\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  nc/0.2.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/secrets/{name}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.NC\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/openjrtc/v1/openjrtc.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * UserRoom\n * 用户房间号管理\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'openjrtc'\nService._services[serviceId] = true\n\n/**\n * openjrtc service.\n * @version 1.1.8\n */\n\nclass OPENJRTC extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'openjrtc.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  开启语音识别功能\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - 应用ID  optional\n      * @param {string} [opts.userRoomId] - 业务接入方定义的且在JRTC系统内注册过的房间号  optional\n      * @param {integer} [opts.asrTaskType] - 语音识别场景 0-全部识别转文字  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startAsrTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      postBody['userRoomId'] = opts.userRoomId\n    }\n    if (opts.asrTaskType !== undefined && opts.asrTaskType !== null) {\n      postBody['asrTaskType'] = opts.asrTaskType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startAsrTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/startAsrTask',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭语音识别功能\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - 应用ID  optional\n      * @param {string} [opts.userRoomId] - 业务接入方定义的且在JRTC系统内注册过的房间号  optional\n      * @param {integer} [opts.asrTaskType] - 语音识别场景 0-全部识别转文字  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopAsrTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      postBody['userRoomId'] = opts.userRoomId\n    }\n    if (opts.asrTaskType !== undefined && opts.asrTaskType !== null) {\n      postBody['asrTaskType'] = opts.asrTaskType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopAsrTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/stopAsrTask',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户应用列表信息\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param appConentObject resultObject\n      */\n\n  describeApps (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeApps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/applications',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询应用信息:\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param appInfoObject resultObject\n      */\n\n  describeApp (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeApp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeApp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/applications/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询应用appKey\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param appKeyInfoObject resultObject\n      */\n\n  describeAppKey (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeAppKey\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAppKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/applications/{appId}:describeAppKey',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建房间\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.roomName] - 房间名称  optional\n      * @param {string} [opts.appId] - 应用ID  optional\n      * @param {integer} [opts.roomType] - 房间类型 1-小房间(音频单流订阅) 2-大房间(音频固定订阅)  optional\n      * @param {integer} [opts.meetingType] - 会议类型 0-即时会议 1-预约会议  optional\n      * @param {integer} [opts.peerId] - 用户ID(创建者ID)  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param roomInfoObj resultObject\n      */\n\n  createRoom (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.roomName !== undefined && opts.roomName !== null) {\n      postBody['roomName'] = opts.roomName\n    }\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.roomType !== undefined && opts.roomType !== null) {\n      postBody['roomType'] = opts.roomType\n    }\n    if (opts.meetingType !== undefined && opts.meetingType !== null) {\n      postBody['meetingType'] = opts.meetingType\n    }\n    if (opts.peerId !== undefined && opts.peerId !== null) {\n      postBody['peerId'] = opts.peerId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRoom with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/createRoom',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取房间信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} opts.roomId - 房间ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param roomInfoObj resultObject\n      */\n\n  describeRoomInfo (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeRoomInfo\"\n      )\n    }\n    if (opts.roomId === undefined || opts.roomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roomId' when calling describeRoomInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.roomId !== undefined && opts.roomId !== null) {\n      queryParams['roomId'] = opts.roomId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRoomInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/rooms/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改房间\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} [opts.roomId] - 房间ID  optional\n      * @param {string} [opts.roomName] - 房间名称  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param roomInfoObj resultObject\n      */\n\n  updateRoom (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling updateRoom\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.roomId !== undefined && opts.roomId !== null) {\n      postBody['roomId'] = opts.roomId\n    }\n    if (opts.roomName !== undefined && opts.roomName !== null) {\n      postBody['roomName'] = opts.roomName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateRoom with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/rooms/{appId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除房间\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} opts.roomId - 房间ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRoom (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling deleteRoom\"\n      )\n    }\n    if (opts.roomId === undefined || opts.roomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roomId' when calling deleteRoom\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.roomId !== undefined && opts.roomId !== null) {\n      queryParams['roomId'] = opts.roomId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRoom with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/rooms/{appId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询应用下的房间列表\n允许通过条件过滤查询，支持的过滤字段如下：\n           - appId[eq] 按应用ID查询\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters] - 传参字段描述:\n  appId:   应用ID\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param roomInfosObj resultObject\n      */\n\n  describeRooms (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRooms with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/rooms',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询房间实时在线人数\n\n      * @param {Object} opts - parameters\n      * @param {integer} opts.roomId - 房间ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param userOnlineNumInfo resultObject\n      */\n\n  describeRoomOnlineUserNum (opts, callback) {\n    opts = opts || {}\n\n    if (opts.roomId === undefined || opts.roomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roomId' when calling describeRoomOnlineUserNum\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      roomId: opts.roomId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRoomOnlineUserNum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeRoomOnlineUserNum/{roomId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  移除房间内人员\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} opts.roomId - 房间ID\n      * @param {array} [opts.peerIds] - peerId列表,最多支持20个peerId  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removeRoomUser (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling removeRoomUser\"\n      )\n    }\n    if (opts.roomId === undefined || opts.roomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roomId' when calling removeRoomUser\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.peerIds !== undefined && opts.peerIds !== null) {\n      postBody['peerIds'] = opts.peerIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId,\n      roomId: opts.roomId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeRoomUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/roomUser/{appId}/removeUser/{roomId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  移除房间内所有人员\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} opts.roomId - 房间ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removeAllRoomUsers (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling removeAllRoomUsers\"\n      )\n    }\n    if (opts.roomId === undefined || opts.roomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roomId' when calling removeAllRoomUsers\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId,\n      roomId: opts.roomId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeAllRoomUsers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/roomUser/{appId}/removeAll/{roomId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询房间人数，通讯时长，最大支持查询7天的数据\n允许通过条件过滤查询，支持的过滤字段如下：\n           - appId[eq] 按应用ID精确查询(必填)\n           - userRoomId[eq] 按房间ID精确查询(必填)\n           - startTime[eq] 开始时间 UTC格式(必填)\n           - endTime[eq] 截止时间 UTC格式 (必填)\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters] - 传参字段描述:\n  appId:   应用ID (必填)\n  userRoomId：业务接入方定义的且在JRTC系统内注册过的房间号(必填)\n  startTime: 房间使用起始时间 UTC (必填)\n  endTime：房间使用截止时间 UTC (必填)\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param roomUserNumInfos resultObject\n      */\n\n  describeOnlineUserNum (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeOnlineUserNum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeOnlineUserNum',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询房间用户记录,最大支持查询7天的数据\n允许通过条件过滤查询，支持的过滤字段如下：\n           - appId[eq] 按应用ID精确查询 (必填)\n           - startTime[eq] 开始时间 UTC格式 (必填)\n           - endTime[eq] 截止时间 UTC格式 (必填)\n           - userRoomId[eq] 按房间ID精确查询(必填)\n           - userId[eq] 按用户ID精确查询\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters] - 传参字段描述:\n  appId:   应用ID (必填)\n  startTime: 房间使用起始时间 UTC格式 (必填)\n  endTime：房间使用截止时间 UTC格式 (必填)\n  userRoomId：业务接入方定义的且在JRTC系统内注册过的房间号(必填)\n  userId：业务接入方定义的且在JRTC系统内注册过的用户id\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param roomUserRecordInfo resultObject\n      */\n\n  describeUserRecordByRoom (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUserRecordByRoom with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeUserRecordByRoom',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户端到端推流码率\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} opts.userRoomId - 业务接入方定义的且在JRTC系统内注册过的用户房间号\n      * @param {string} opts.userId - 业务接入方定义的且在JRTC系统内注册过的用户id\n      * @param {string} opts.kind - audio/video\n      * @param {string} opts.type - producer 发布流 consumer 订阅流\n      * @param {string} opts.joinTime - 加入时间 UTC格式\n      * @param {string} [opts.leaveTime] - 离开时间 UTC格式  optional\n      * @param {string} [opts.fromUserId] - 业务接入方定义的且在JRTC系统内注册过的用户id type&#x3D;consumer时选择发送端用户id切换码率  optional\n      * @param {string} [opts.period] - 粒度 支持 1m 1h 1d  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param streamBitRate content\n      */\n\n  describeP2pStreamBitRate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeP2pStreamBitRate\"\n      )\n    }\n    if (opts.userRoomId === undefined || opts.userRoomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userRoomId' when calling describeP2pStreamBitRate\"\n      )\n    }\n    if (opts.userId === undefined || opts.userId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userId' when calling describeP2pStreamBitRate\"\n      )\n    }\n    if (opts.kind === undefined || opts.kind === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.kind' when calling describeP2pStreamBitRate\"\n      )\n    }\n    if (opts.type === undefined || opts.type === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.type' when calling describeP2pStreamBitRate\"\n      )\n    }\n    if (opts.joinTime === undefined || opts.joinTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.joinTime' when calling describeP2pStreamBitRate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      queryParams['appId'] = opts.appId\n    }\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      queryParams['userRoomId'] = opts.userRoomId\n    }\n    if (opts.userId !== undefined && opts.userId !== null) {\n      queryParams['userId'] = opts.userId\n    }\n    if (opts.kind !== undefined && opts.kind !== null) {\n      queryParams['kind'] = opts.kind\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n    if (opts.joinTime !== undefined && opts.joinTime !== null) {\n      queryParams['joinTime'] = opts.joinTime\n    }\n    if (opts.leaveTime !== undefined && opts.leaveTime !== null) {\n      queryParams['leaveTime'] = opts.leaveTime\n    }\n    if (opts.fromUserId !== undefined && opts.fromUserId !== null) {\n      queryParams['fromUserId'] = opts.fromUserId\n    }\n    if (opts.period !== undefined && opts.period !== null) {\n      queryParams['period'] = opts.period\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeP2pStreamBitRate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeP2pStreamBitRate',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取历史音频、区分视频码率通讯时长\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - 应用ID  optional\n      * @param {string} opts.startTime - 开始时间 UTC格式\n      * @param {string} [opts.endTime] - 结束时间 UTC格式  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param callDurationByCodeRate content\n      */\n\n  describeCallDurationByCodeRate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeCallDurationByCodeRate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      queryParams['appId'] = opts.appId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCallDurationByCodeRate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeCallDurationByCodeRate',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取近7天通讯时长\n\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param callDuration content\n      */\n\n  describeDailyCallDuration (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDailyCallDuration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeDailyCallDuration',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建用户\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - 应用ID  optional\n      * @param {string} [opts.userName] - 用户名称  optional\n      * @param {string} [opts.userId] - 业务接入方的用户ID  optional\n      * @param {boolean} [opts.temporary] - 是否临时用户  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param createUserResultObj resultObject\n      */\n\n  createUser (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.userName !== undefined && opts.userName !== null) {\n      postBody['userName'] = opts.userName\n    }\n    if (opts.userId !== undefined && opts.userId !== null) {\n      postBody['userId'] = opts.userId\n    }\n    if (opts.temporary !== undefined && opts.temporary !== null) {\n      postBody['temporary'] = opts.temporary\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/createUser',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询peer对应的用户信息\n\n      * @param {Object} opts - parameters\n      * @param {integer} opts.peerId - peerId\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param userInfoObj resultObject\n      */\n\n  describeUserByPeer (opts, callback) {\n    opts = opts || {}\n\n    if (opts.peerId === undefined || opts.peerId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.peerId' when calling describeUserByPeer\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.peerId !== undefined && opts.peerId !== null) {\n      queryParams['peerId'] = opts.peerId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUserByPeer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeUserByPeer',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  下发混流任务\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - 应用ID  optional\n      * @param {string} [opts.userRoomId] - 业务接入方定义的且在JRTC系统内注册过的房间号  optional\n      * @param {integer} [opts.layoutTemplate] - 布局模板-支持参数1  optional\n      * @param {string} [opts.mainUserId] - 主人员userId  optional\n      * @param {integer} [opts.outputType] - 输出类型 1：录制 2：旁路转推  optional\n      * @param {string} [opts.outputName] - 输出名称  optional\n      * @param {array} [opts.mcuUserInfos] - 参与混流人员参数  optional\n      * @param {outputEncode} [opts.outputEncode] - 输出格式  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startMcuTranscode (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      postBody['userRoomId'] = opts.userRoomId\n    }\n    if (opts.layoutTemplate !== undefined && opts.layoutTemplate !== null) {\n      postBody['layoutTemplate'] = opts.layoutTemplate\n    }\n    if (opts.mainUserId !== undefined && opts.mainUserId !== null) {\n      postBody['mainUserId'] = opts.mainUserId\n    }\n    if (opts.outputType !== undefined && opts.outputType !== null) {\n      postBody['outputType'] = opts.outputType\n    }\n    if (opts.outputName !== undefined && opts.outputName !== null) {\n      postBody['outputName'] = opts.outputName\n    }\n    if (opts.mcuUserInfos !== undefined && opts.mcuUserInfos !== null) {\n      postBody['mcuUserInfos'] = opts.mcuUserInfos\n    }\n    if (opts.outputEncode !== undefined && opts.outputEncode !== null) {\n      postBody['outputEncode'] = opts.outputEncode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startMcuTranscode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/startMcuTranscode',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  中止混流任务\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - 应用ID  optional\n      * @param {string} [opts.userRoomId] - 业务接入方定义的且在JRTC系统内注册过的房间号  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopMcuTranscode (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      postBody['userRoomId'] = opts.userRoomId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopMcuTranscode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/stopMcuTask',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  发送自定义信令给房间内的人员\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} opts.roomId - 房间ID\n      * @param {string} [opts.eventName] - 事件名称  optional\n      * @param {string} [opts.message] - 自定义信令消息  optional\n      * @param {integer} [opts.peerId] - peerId  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  sendMessageToUser (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling sendMessageToUser\"\n      )\n    }\n    if (opts.roomId === undefined || opts.roomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roomId' when calling sendMessageToUser\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.eventName !== undefined && opts.eventName !== null) {\n      postBody['eventName'] = opts.eventName\n    }\n    if (opts.message !== undefined && opts.message !== null) {\n      postBody['message'] = opts.message\n    }\n    if (opts.peerId !== undefined && opts.peerId !== null) {\n      postBody['peerId'] = opts.peerId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId,\n      roomId: opts.roomId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call sendMessageToUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/message/{appId}/toUser/{roomId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  发送自定义信令给房间\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} opts.roomId - 房间ID\n      * @param {string} [opts.eventName] - 事件名称  optional\n      * @param {string} [opts.message] - 自定义信令消息  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  sendMessageToRoom (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling sendMessageToRoom\"\n      )\n    }\n    if (opts.roomId === undefined || opts.roomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roomId' when calling sendMessageToRoom\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.eventName !== undefined && opts.eventName !== null) {\n      postBody['eventName'] = opts.eventName\n    }\n    if (opts.message !== undefined && opts.message !== null) {\n      postBody['message'] = opts.message\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId,\n      roomId: opts.roomId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call sendMessageToRoom with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/message/{appId}/toRoom/{roomId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加推流规则\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - 应用ID  optional\n      * @param {array} [opts.rules] - 推流规则  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addPushStreamRule (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.rules !== undefined && opts.rules !== null) {\n      postBody['rules'] = opts.rules\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addPushStreamRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/addPushStreamRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加录制规则\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - 应用ID  optional\n      * @param {array} [opts.rules] - 录制规则  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addRecordRule (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.rules !== undefined && opts.rules !== null) {\n      postBody['rules'] = opts.rules\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addRecordRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/addRecordRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  注册用户-将业务接入方用户体系的userId注册为jrtc系统内可识别和流转的用户id\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - 应用ID  optional\n      * @param {string} [opts.userName] - 用户名称  optional\n      * @param {string} [opts.userId] - 业务接入方用户体系定义的userId  optional\n      * @param {boolean} [opts.temporary] - 是否临时用户  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param registerUserResultObj resultObject\n      */\n\n  registerUser (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.userName !== undefined && opts.userName !== null) {\n      postBody['userName'] = opts.userName\n    }\n    if (opts.userId !== undefined && opts.userId !== null) {\n      postBody['userId'] = opts.userId\n    }\n    if (opts.temporary !== undefined && opts.temporary !== null) {\n      postBody['temporary'] = opts.temporary\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call registerUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/registerUser',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询注册用户\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} opts.userId - 业务接入方用户体系定义的且在JRTC系统内注册过的userId\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param registerUserInfoObj resultObject\n      */\n\n  describeRegisterUser (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeRegisterUser\"\n      )\n    }\n    if (opts.userId === undefined || opts.userId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userId' when calling describeRegisterUser\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.userId !== undefined && opts.userId !== null) {\n      queryParams['userId'] = opts.userId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRegisterUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeRegisterUser/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询注册用户列表\n允许通过条件过滤查询，支持的过滤字段如下：\n           - startTime[eq] 用户注册时间段开始时间-UTC时间 startTime,endTime同时有值时生效\n           - endTime[eq] 用户注册时间段结束时间-UTC时间 startTime,endTime同时有值时生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters] - 传参字段描述:\n  startTime[eq]:   用户注册时间段开始时间-UTC时间 startTime,endTime同时有值时生效\n  endTime[eq]:     用户注册时间段结束时间-UTC时间 startTime,endTime同时有值时生效\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param registerUserInfosObj resultObject\n      */\n\n  describeRegisterUsers (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeRegisterUsers\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRegisterUsers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeRegisterUsers/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询房间内推流信息列表\n允许通过条件过滤查询，支持的过滤字段如下：\n           - status[eq] 在线状态 1-在线 2-离线\n           - kind[eq] 在线状态 1-音频流 2-视频流 100-数据流\n           - startTime[eq] 用户推流开始时间-UTC时间  startTime,endTime同时指定时生效\n           - endTime[eq]   用户推流结束时间-UTC时间  startTime,endTime同时指定时生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {string} opts.userRoomId - 业务接入方定义的且在JRTC系统内注册过的房间号\n      * @param {filter} [opts.filters] - 传参字段描述:\n- status[eq] 在线状态 1-在线 2-离线\n- kind[eq] 在线状态 1-音频流 2-视频流 100-数据流\n- startTime[eq] 用户推流开始时间-UTC时间  startTime,endTime同时指定时生效\n- endTime[eq]   用户推流结束时间-UTC时间  startTime,endTime同时指定时生效\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param roomStreamContent resultObject\n      */\n\n  describeStreamInfosByUserRoomId (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeStreamInfosByUserRoomId\"\n      )\n    }\n    if (opts.userRoomId === undefined || opts.userRoomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userRoomId' when calling describeStreamInfosByUserRoomId\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      queryParams['userRoomId'] = opts.userRoomId\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStreamInfosByUserRoomId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeStreamInfosByUserRoomId/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定用户在房间内的推流信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} opts.userRoomId - 业务接入方定义的且在JRTC系统内注册过的房间号\n      * @param {string} opts.userId - 业务接入方用户体系定义的且在JRTC系统内注册过的userId\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param streamInfo content\n      */\n\n  describeStreamInfosByUserId (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeStreamInfosByUserId\"\n      )\n    }\n    if (opts.userRoomId === undefined || opts.userRoomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userRoomId' when calling describeStreamInfosByUserId\"\n      )\n    }\n    if (opts.userId === undefined || opts.userId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userId' when calling describeStreamInfosByUserId\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      queryParams['userRoomId'] = opts.userRoomId\n    }\n    if (opts.userId !== undefined && opts.userId !== null) {\n      queryParams['userId'] = opts.userId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStreamInfosByUserId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeStreamInfosByUserId/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据流ID查询推流信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} opts.streamId - 流ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param streamInfo resultObject\n      */\n\n  describeStreamInfoByStreamId (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeStreamInfoByStreamId\"\n      )\n    }\n    if (opts.streamId === undefined || opts.streamId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamId' when calling describeStreamInfoByStreamId\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.streamId !== undefined && opts.streamId !== null) {\n      queryParams['streamId'] = opts.streamId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStreamInfoByStreamId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeStreamInfoByStreamId/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定用户在房间内的推流历史记录\n允许通过条件过滤查询，支持的过滤字段如下：\n           - kind[eq] 在线状态 1-音频流 2-视频流 100-数据流\n           - startTime[eq] 用户推流开始时间-UTC时间  startTime,endTime同时指定时生效\n           - endTime[eq]   用户推流结束时间-UTC时间  startTime,endTime同时指定时生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {string} opts.userRoomId - 业务接入方定义的且在JRTC系统内注册过的房间号\n      * @param {string} opts.userId - 业务接入方用户体系定义的且在JRTC系统内注册过的userId\n      * @param {filter} [opts.filters] - 传参字段描述:\n- kind[eq] 在线状态 1-音频流 2-视频流 100-数据流\n- startTime[eq] 用户推流开始时间-UTC时间  startTime,endTime同时指定时生效\n- endTime[eq]   用户推流结束时间-UTC时间  startTime,endTime同时指定时生效\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param streamRecordContent resultObject\n      */\n\n  describeStreamRecordsByUserId (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeStreamRecordsByUserId\"\n      )\n    }\n    if (opts.userRoomId === undefined || opts.userRoomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userRoomId' when calling describeStreamRecordsByUserId\"\n      )\n    }\n    if (opts.userId === undefined || opts.userId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userId' when calling describeStreamRecordsByUserId\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      queryParams['userRoomId'] = opts.userRoomId\n    }\n    if (opts.userId !== undefined && opts.userId !== null) {\n      queryParams['userId'] = opts.userId\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStreamRecordsByUserId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeStreamRecordsByUserId/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据流ID查询推流历史记录\n允许通过条件过滤查询，支持的过滤字段如下：\n           - startTime[eq] 用户推流开始时间-UTC时间  startTime,endTime同时指定时生效\n           - endTime[eq]   用户推流结束时间-UTC时间  startTime,endTime同时指定时生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {string} opts.streamId - 流ID\n      * @param {filter} [opts.filters] - 传参字段描述:\n- startTime[eq] 用户推流开始时间-UTC时间  startTime,endTime同时指定时生效\n- endTime[eq]   用户推流结束时间-UTC时间  startTime,endTime同时指定时生效\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param streamRecordContent resultObject\n      */\n\n  describeStreamRecordsByStreamId (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeStreamRecordsByStreamId\"\n      )\n    }\n    if (opts.streamId === undefined || opts.streamId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamId' when calling describeStreamRecordsByStreamId\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.streamId !== undefined && opts.streamId !== null) {\n      queryParams['streamId'] = opts.streamId\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStreamRecordsByStreamId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeStreamRecordsByStreamId/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  移除房间内人员\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} [opts.userRoomId] - 业务接入方定义的且在JRTC系统内注册过的房间号  optional\n      * @param {array} [opts.userIds] - 接入方定义的userId列表,最多支持20个userId  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removeUserByUserRoomId (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling removeUserByUserRoomId\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      postBody['userRoomId'] = opts.userRoomId\n    }\n    if (opts.userIds !== undefined && opts.userIds !== null) {\n      postBody['userIds'] = opts.userIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeUserByUserRoomId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/removeUserByUserRoomId/{appId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  移除房间内所有人员\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} [opts.userRoomId] - 业务接入方定义的且在JRTC系统内注册过的房间号  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removeAllUsersByUserRoomId (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling removeAllUsersByUserRoomId\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      postBody['userRoomId'] = opts.userRoomId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeAllUsersByUserRoomId with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/removeAllUsersByUserRoomId/{appId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询房间内人员列表\n允许通过条件过滤查询，支持的过滤字段如下：\n           - status[eq] 在线状态 1-在线 2-离线\n           - startTime[eq] 用户加入时间段开始时间-UTC时间  startTime,endTime同时有值时生效\n           - endTime[eq] 用户加入时间段结束时间-UTC时间    startTime,endTime同时有值时生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {string} opts.userRoomId - 业务接入方定义的且在JRTC系统内注册过的房间号\n      * @param {filter} [opts.filters] - 传参字段描述:\n- status[eq] 在线状态 1-在线 2-离线\n- startTime[eq] 用户加入时间段开始时间-UTC时间 startTime,endTime同时有值时生效\n- endTime[eq] 用户加入时间段结束时间-UTC时间   startTime,endTime同时有值时生效\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param roomUserInfosObj resultObject\n      */\n\n  describeRoomUsers (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeRoomUsers\"\n      )\n    }\n    if (opts.userRoomId === undefined || opts.userRoomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userRoomId' when calling describeRoomUsers\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      queryParams['userRoomId'] = opts.userRoomId\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRoomUsers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeRoomUsers/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询房间内的人员信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} opts.userRoomId - 业务接入方定义的且在JRTC系统内注册过的房间号\n      * @param {string} opts.userId - 业务接入方用户体系定义的且在JRTC系统内注册过的userId\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param roomUserInfoObj resultObject\n      */\n\n  describeRoomUser (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeRoomUser\"\n      )\n    }\n    if (opts.userRoomId === undefined || opts.userRoomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userRoomId' when calling describeRoomUser\"\n      )\n    }\n    if (opts.userId === undefined || opts.userId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userId' when calling describeRoomUser\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      queryParams['userRoomId'] = opts.userRoomId\n    }\n    if (opts.userId !== undefined && opts.userId !== null) {\n      queryParams['userId'] = opts.userId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRoomUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeRoomUser/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  统计房间内人数\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} opts.userRoomId - 业务接入方定义的且在JRTC系统内注册过的房间号\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param roomUsersNumInfoObj resultObject\n      */\n\n  describeRoomUsersNum (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeRoomUsersNum\"\n      )\n    }\n    if (opts.userRoomId === undefined || opts.userRoomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userRoomId' when calling describeRoomUsersNum\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      queryParams['userRoomId'] = opts.userRoomId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRoomUsersNum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeRoomUsersNum/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭房间内的指定流\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} [opts.userRoomId] - 业务接入方定义的且在JRTC系统内注册过的房间号  optional\n      * @param {string} [opts.userId] - 业务接入方用户体系定义的且在JRTC系统内注册过的userId  optional\n      * @param {string} [opts.streamId] - 要关闭的流ID  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  closeRoomUserStream (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling closeRoomUserStream\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      postBody['userRoomId'] = opts.userRoomId\n    }\n    if (opts.userId !== undefined && opts.userId !== null) {\n      postBody['userId'] = opts.userId\n    }\n    if (opts.streamId !== undefined && opts.streamId !== null) {\n      postBody['streamId'] = opts.streamId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call closeRoomUserStream with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/closeRoomUserStream/{appId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  生成token-用户加入房间时携带token校验通过后方能加入\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - appId  optional\n      * @param {string} [opts.appKey] - appKey  optional\n      * @param {string} [opts.userId] - 用户id  optional\n      * @param {string} [opts.userRoomId] - 业务接入方定义的且在JRTC系统内注册过的房间号  optional\n      * @param {integer} [opts.timestamp] - 时间戳-毫秒  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tokenInfo resultObject\n      */\n\n  createToken (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.appKey !== undefined && opts.appKey !== null) {\n      postBody['appKey'] = opts.appKey\n    }\n    if (opts.userId !== undefined && opts.userId !== null) {\n      postBody['userId'] = opts.userId\n    }\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      postBody['userRoomId'] = opts.userRoomId\n    }\n    if (opts.timestamp !== undefined && opts.timestamp !== null) {\n      postBody['timestamp'] = opts.timestamp\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createToken with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/createToken',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  发送自定义信令给房间\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - 应用ID  optional\n      * @param {string} [opts.userRoomId] - 业务接入方定义的且在JRTC系统内注册过的房间号  optional\n      * @param {string} [opts.eventName] - 事件名称  optional\n      * @param {string} [opts.message] - 自定义信令消息  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  postMessageToUserRoom (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      postBody['userRoomId'] = opts.userRoomId\n    }\n    if (opts.eventName !== undefined && opts.eventName !== null) {\n      postBody['eventName'] = opts.eventName\n    }\n    if (opts.message !== undefined && opts.message !== null) {\n      postBody['message'] = opts.message\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call postMessageToUserRoom with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/postMessageToUserRoom',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  发送自定义信令给房间内的人员\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - 应用ID  optional\n      * @param {string} [opts.userRoomId] - 业务接入方定义的且在JRTC系统内注册过的房间号  optional\n      * @param {string} [opts.userId] - 业务接入方用户体系定义的且在JRTC系统内注册过的userId  optional\n      * @param {string} [opts.eventName] - 事件名称  optional\n      * @param {string} [opts.message] - 自定义信令消息  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  postMessageToUser (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      postBody['userRoomId'] = opts.userRoomId\n    }\n    if (opts.userId !== undefined && opts.userId !== null) {\n      postBody['userId'] = opts.userId\n    }\n    if (opts.eventName !== undefined && opts.eventName !== null) {\n      postBody['eventName'] = opts.eventName\n    }\n    if (opts.message !== undefined && opts.message !== null) {\n      postBody['message'] = opts.message\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call postMessageToUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/postMessageToUser',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  注册用户房间号-将业务接入方定义的userRoomId注册为jrtc系统内可识别和流转的房间号\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.userRoomId] - 业务接入方定义的房间号  optional\n      * @param {string} [opts.roomName] - 房间名称  optional\n      * @param {string} [opts.appId] - 应用ID  optional\n      * @param {integer} [opts.roomType] - 房间类型 1-小房间(音频单流订阅) 2-大房间(音频固定订阅),默认取控制台APP对应的房间类型  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param userRoomInfoObj resultObject\n      */\n\n  registerUserRoom (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      postBody['userRoomId'] = opts.userRoomId\n    }\n    if (opts.roomName !== undefined && opts.roomName !== null) {\n      postBody['roomName'] = opts.roomName\n    }\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.roomType !== undefined && opts.roomType !== null) {\n      postBody['roomType'] = opts.roomType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call registerUserRoom with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/registerUserRoom',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改房间\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} [opts.userRoomId] - 用户房间号  optional\n      * @param {string} [opts.roomName] - 房间名称  optional\n      * @param {integer} [opts.roomType] - 房间类型 1-小房间；2-大房间  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param userRoomInfoObj resultObject\n      */\n\n  updateUserRoom (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling updateUserRoom\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      postBody['userRoomId'] = opts.userRoomId\n    }\n    if (opts.roomName !== undefined && opts.roomName !== null) {\n      postBody['roomName'] = opts.roomName\n    }\n    if (opts.roomType !== undefined && opts.roomType !== null) {\n      postBody['roomType'] = opts.roomType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateUserRoom with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/updateUserRoom/{appId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询注册房间号\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} opts.userRoomId - 业务接入方定义的且在JRTC系统内注册过的房间号\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param userRoomInfoObj resultObject\n      */\n\n  describeUserRoom (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeUserRoom\"\n      )\n    }\n    if (opts.userRoomId === undefined || opts.userRoomId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userRoomId' when calling describeUserRoom\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.userRoomId !== undefined && opts.userRoomId !== null) {\n      queryParams['userRoomId'] = opts.userRoomId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUserRoom with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeUserRoom/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询注册房间号列表\n允许通过条件过滤查询，支持的过滤字段如下：\n           - startTime[eq] 房间注册时间段开始时间-UTC时间 startTime,endTime同时有值时生效\n           - endTime[eq] 房间注册时间段结束时间-UTC时间   startTime,endTime同时有值时生效\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters] - 传参字段描述:\n  - startTime[eq] 按房间注册时间段查询-UTC时间 startTime,endTime同时有值时生效\n  - endTime[eq] 按房间注册时间段查询-UTC时间   startTime,endTime同时有值时生效\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param userRoomInfosObj resultObject\n      */\n\n  describeUserRooms (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling describeUserRooms\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  openjrtc/1.1.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUserRooms with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeUserRooms/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = OPENJRTC\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/oss/v1/oss.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * OSS相关接口\n * OSS相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'oss'\nService._services[serviceId] = true\n\n/**\n * oss service.\n * @version 0.2.2\n */\n\nJDCloud.OSS = class OSS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'oss.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  列出当前用户的所有bucket\n\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param user owner\n      * @param bucket buckets\n      */\n\n  listBuckets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listBuckets\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  oss/0.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listBuckets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/buckets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建bucket\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketname - bucket名字，例如：test-bucket\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  putBucket (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  putBucket\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketname === undefined || opts.bucketname === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketname' when calling putBucket\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketname: opts.bucketname\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  oss/0.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call putBucket with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/buckets/{bucketname}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一个bucket\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketname - bucket名字，例如：test-bucket\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteBucket (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBucket\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketname === undefined || opts.bucketname === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketname' when calling deleteBucket\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketname: opts.bucketname\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  oss/0.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBucket with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/buckets/{bucketname}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询bucket是否存在\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketname - bucket名字，例如：test-bucket\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  headBucket (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  headBucket\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketname === undefined || opts.bucketname === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketname' when calling headBucket\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketname: opts.bucketname\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  oss/0.2.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call headBucket with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/buckets/{bucketname}',\n      'HEAD',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.OSS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/ossopenapi/v1/ossopenapi.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * vpc policy openapi v1\n * vpc policy openapi v1\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ossopenapi'\nService._services[serviceId] = true\n\n/**\n * ossopenapi service.\n * @version 0.9.7\n */\n\nclass OSSOPENAPI extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'ossopenapi.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  根据type获取bucket用量数据\n      * @param {Object} opts - parameters\n      * @param {array} [opts.capacityTypes] - &lt;p&gt;查询用量数据类型：&lt;/p&gt;&lt;br&gt;&lt;code&gt;1000040&lt;/code&gt;:标准存储&lt;br&gt;&lt;code&gt;1000041&lt;/code&gt;:低冗余存储&lt;br&gt;&lt;code&gt;1000042&lt;/code&gt;:归档存储&lt;br&gt;&lt;code&gt;1000043&lt;/code&gt;归档overHead存储:&lt;br&gt;&lt;code&gt;1000044&lt;/code&gt;低频存储:&lt;br&gt;&lt;code&gt;1000045&lt;/code&gt;低频overHead存储:&lt;br&gt;&lt;code&gt;1&lt;/code&gt;:内网GET流量&lt;br&gt;&lt;code&gt;2&lt;/code&gt;:内网HEAD流量&lt;br&gt;&lt;code&gt;3&lt;/code&gt;:内网PUT流量&lt;br&gt;&lt;code&gt;4&lt;/code&gt;:内网POST流量&lt;br&gt;&lt;code&gt;5&lt;/code&gt;:内网DELETE流量&lt;br&gt;&lt;code&gt;6&lt;/code&gt;:内网OPTIONS流量&lt;br&gt;&lt;code&gt;7&lt;/code&gt;:内网TRACE流量&lt;br&gt;&lt;code&gt;11&lt;/code&gt;:外网GET流量&lt;br&gt;&lt;code&gt;12&lt;/code&gt;:外网HEAD流量&lt;br&gt;&lt;code&gt;13&lt;/code&gt;:外网PUT流量&lt;br&gt;&lt;code&gt;14&lt;/code&gt;:外网POST流量&lt;br&gt;&lt;code&gt;15&lt;/code&gt;:外网DELETE流量&lt;br&gt;&lt;code&gt;16&lt;/code&gt;:外网OPTIONS流量&lt;br&gt;&lt;code&gt;17&lt;/code&gt;:外网TRACE流量&lt;br&gt;&lt;code&gt;21&lt;/code&gt;:CDN GET流量&lt;br&gt;&lt;code&gt;22&lt;/code&gt;:CDN HEAD流量&lt;br&gt;&lt;code&gt;23&lt;/code&gt;:CDN PUT流量&lt;br&gt;&lt;code&gt;24&lt;/code&gt;:CDN POST流量&lt;br&gt;&lt;code&gt;25&lt;/code&gt;:CDN DELETE流量&lt;br&gt;&lt;code&gt;26&lt;/code&gt;:CDN OPTIONS流量&lt;br&gt;&lt;code&gt;27&lt;/code&gt;:CDN TRACE流量&lt;br&gt;&lt;code&gt;31&lt;/code&gt;:内网GET数&lt;br&gt;&lt;code&gt;32&lt;/code&gt;:内网HEAD数&lt;br&gt;&lt;code&gt;33&lt;/code&gt;:内网PUT数&lt;br&gt;&lt;code&gt;34&lt;/code&gt;:内网POST数&lt;br&gt;&lt;code&gt;35&lt;/code&gt;:内网DELETE数&lt;br&gt;&lt;code&gt;36&lt;/code&gt;:内网OPTIONS数&lt;br&gt;&lt;code&gt;37&lt;/code&gt;:内网TRACE数&lt;br&gt;&lt;code&gt;51&lt;/code&gt;:外网GET数&lt;br&gt;&lt;code&gt;52&lt;/code&gt;:外网HEAD数&lt;br&gt;&lt;code&gt;53&lt;/code&gt;:外网PUT数&lt;br&gt;&lt;code&gt;54&lt;/code&gt;:外网POST数&lt;br&gt;&lt;code&gt;55&lt;/code&gt;:外网DELETE数&lt;br&gt;&lt;code&gt;56&lt;/code&gt;:外网OPTIONS数&lt;br&gt;&lt;code&gt;57&lt;/code&gt;:外网TRACE数&lt;br&gt;&lt;code&gt;61&lt;/code&gt;:CDN GET数&lt;br&gt;&lt;code&gt;62&lt;/code&gt;:CDN HEAD数&lt;br&gt;&lt;code&gt;63&lt;/code&gt;:CDN PUT数&lt;br&gt;&lt;code&gt;64&lt;/code&gt;:CDN POST数&lt;br&gt;&lt;code&gt;65&lt;/code&gt;:CDN DELETE数&lt;br&gt;&lt;code&gt;66&lt;/code&gt;:CDN OPTIONS数&lt;br&gt;&lt;code&gt;67&lt;/code&gt;:CDN TRACE数&lt;br&gt;&lt;code&gt;71&lt;/code&gt;:归档提前删除&lt;br&gt;&lt;code&gt;72&lt;/code&gt;:低频提前删除&lt;br&gt;&lt;code&gt;81&lt;/code&gt;:归档取回Bulk&lt;br&gt;&lt;code&gt;82&lt;/code&gt;:归档取回Std&lt;br&gt;&lt;code&gt;83&lt;/code&gt;:归档取回Exp&lt;br&gt;&lt;code&gt;84&lt;/code&gt;:低频数据取回\n  optional\n      * @param {string} [opts.beginTime] - 开始时间，使用UTC时间，格式为：YYYY-MM-DDTHH:mm:ss&#39;Z&#39;  optional\n      * @param {string} [opts.endTime] - 结束时间，使用UTC时间，格式为：YYYY-MM-DDTHH:mm:ss&#39;Z&#39;  optional\n      * @param {integer} [opts.periodType] - 查询数据的聚合方式:&lt;br&gt;&lt;code&gt;0&lt;/code&gt;:all, 最大查询区间365天 &lt;br&gt;&lt;code&gt;1&lt;/code&gt;:hour，最大查询区间31天。默认1&lt;br&gt;&lt;code&gt;2&lt;/code&gt;:day, 最大查询区间365天。  optional\n      * @param {integer} opts.method - 返回数据的方式： &lt;code&gt;1&lt;/code&gt;:recent(区间值), &lt;code&gt;2&lt;/code&gt;:current(当前值。method &#x3D; 2 时如果查询当前值时传入beginTime，则按照beginTime时间来进行查询；如果不传beginTime，则按照后端系统时间查询。)\n      * @param {array} [opts.bucketNames] - 查询的bucket Names。如果查询用户全部Bucket,则不传  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bucketCapacityQueryResult bucketCapacityQueryResult\n      */\n\n  getBucketCapacity (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getBucketCapacity\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.method === undefined || opts.method === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.method' when calling getBucketCapacity\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.capacityTypes !== undefined && opts.capacityTypes !== null) {\n      postBody['capacityTypes'] = opts.capacityTypes\n    }\n    if (opts.beginTime !== undefined && opts.beginTime !== null) {\n      postBody['beginTime'] = opts.beginTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.periodType !== undefined && opts.periodType !== null) {\n      postBody['periodType'] = opts.periodType\n    }\n    if (opts.method !== undefined && opts.method !== null) {\n      postBody['method'] = opts.method\n    }\n    if (opts.bucketNames !== undefined && opts.bucketNames !== null) {\n      postBody['bucketNames'] = opts.bucketNames\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ossopenapi/0.9.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getBucketCapacity with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/capacity/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据type获取指定bucket用量数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - 查询用量的指定bucket\n      * @param {array} [opts.capacityTypes] - &lt;p&gt;查询用量数据类型：&lt;/p&gt;&lt;br&gt;&lt;code&gt;1000040&lt;/code&gt;:标准存储&lt;br&gt;&lt;code&gt;1000041&lt;/code&gt;:低冗余存储&lt;br&gt;&lt;code&gt;1000042&lt;/code&gt;:归档存储&lt;br&gt;&lt;code&gt;1000043&lt;/code&gt;归档overHead存储:&lt;br&gt;&lt;code&gt;1000044&lt;/code&gt;低频存储:&lt;br&gt;&lt;code&gt;1000045&lt;/code&gt;低频overHead存储:&lt;br&gt;&lt;code&gt;1&lt;/code&gt;:内网GET流量&lt;br&gt;&lt;code&gt;2&lt;/code&gt;:内网HEAD流量&lt;br&gt;&lt;code&gt;3&lt;/code&gt;:内网PUT流量&lt;br&gt;&lt;code&gt;4&lt;/code&gt;:内网POST流量&lt;br&gt;&lt;code&gt;5&lt;/code&gt;:内网DELETE流量&lt;br&gt;&lt;code&gt;6&lt;/code&gt;:内网OPTIONS流量&lt;br&gt;&lt;code&gt;7&lt;/code&gt;:内网TRACE流量&lt;br&gt;&lt;code&gt;11&lt;/code&gt;:外网GET流量&lt;br&gt;&lt;code&gt;12&lt;/code&gt;:外网HEAD流量&lt;br&gt;&lt;code&gt;13&lt;/code&gt;:外网PUT流量&lt;br&gt;&lt;code&gt;14&lt;/code&gt;:外网POST流量&lt;br&gt;&lt;code&gt;15&lt;/code&gt;:外网DELETE流量&lt;br&gt;&lt;code&gt;16&lt;/code&gt;:外网OPTIONS流量&lt;br&gt;&lt;code&gt;17&lt;/code&gt;:外网TRACE流量&lt;br&gt;&lt;code&gt;21&lt;/code&gt;:CDN GET流量&lt;br&gt;&lt;code&gt;22&lt;/code&gt;:CDN HEAD流量&lt;br&gt;&lt;code&gt;23&lt;/code&gt;:CDN PUT流量&lt;br&gt;&lt;code&gt;24&lt;/code&gt;:CDN POST流量&lt;br&gt;&lt;code&gt;25&lt;/code&gt;:CDN DELETE流量&lt;br&gt;&lt;code&gt;26&lt;/code&gt;:CDN OPTIONS流量&lt;br&gt;&lt;code&gt;27&lt;/code&gt;:CDN TRACE流量&lt;br&gt;&lt;code&gt;31&lt;/code&gt;:内网GET数&lt;br&gt;&lt;code&gt;32&lt;/code&gt;:内网HEAD数&lt;br&gt;&lt;code&gt;33&lt;/code&gt;:内网PUT数&lt;br&gt;&lt;code&gt;34&lt;/code&gt;:内网POST数&lt;br&gt;&lt;code&gt;35&lt;/code&gt;:内网DELETE数&lt;br&gt;&lt;code&gt;36&lt;/code&gt;:内网OPTIONS数&lt;br&gt;&lt;code&gt;37&lt;/code&gt;:内网TRACE数&lt;br&gt;&lt;code&gt;51&lt;/code&gt;:外网GET数&lt;br&gt;&lt;code&gt;52&lt;/code&gt;:外网HEAD数&lt;br&gt;&lt;code&gt;53&lt;/code&gt;:外网PUT数&lt;br&gt;&lt;code&gt;54&lt;/code&gt;:外网POST数&lt;br&gt;&lt;code&gt;55&lt;/code&gt;:外网DELETE数&lt;br&gt;&lt;code&gt;56&lt;/code&gt;:外网OPTIONS数&lt;br&gt;&lt;code&gt;57&lt;/code&gt;:外网TRACE数&lt;br&gt;&lt;code&gt;61&lt;/code&gt;:CDN GET数&lt;br&gt;&lt;code&gt;62&lt;/code&gt;:CDN HEAD数&lt;br&gt;&lt;code&gt;63&lt;/code&gt;:CDN PUT数&lt;br&gt;&lt;code&gt;64&lt;/code&gt;:CDN POST数&lt;br&gt;&lt;code&gt;65&lt;/code&gt;:CDN DELETE数&lt;br&gt;&lt;code&gt;66&lt;/code&gt;:CDN OPTIONS数&lt;br&gt;&lt;code&gt;67&lt;/code&gt;:CDN TRACE数&lt;br&gt;&lt;code&gt;71&lt;/code&gt;:归档提前删除&lt;br&gt;&lt;code&gt;72&lt;/code&gt;:低频提前删除&lt;br&gt;&lt;code&gt;81&lt;/code&gt;:归档取回Bulk&lt;br&gt;&lt;code&gt;82&lt;/code&gt;:归档取回Std&lt;br&gt;&lt;code&gt;83&lt;/code&gt;:归档取回Exp&lt;br&gt;&lt;code&gt;84&lt;/code&gt;:低频数据取回\n  optional\n      * @param {string} [opts.beginTime] - 开始时间，使用UTC时间，格式为：YYYY-MM-DDTHH:mm:ss&#39;Z&#39;  optional\n      * @param {string} [opts.endTime] - 结束时间，使用UTC时间，格式为：YYYY-MM-DDTHH:mm:ss&#39;Z&#39;  optional\n      * @param {integer} [opts.periodType] - 查询数据的聚合方式:&lt;br&gt;&lt;code&gt;0&lt;/code&gt;:all, 最大查询区间365天 &lt;br&gt;&lt;code&gt;1&lt;/code&gt;:hour，最大查询区间31天。默认1&lt;br&gt;&lt;code&gt;2&lt;/code&gt;:day, 最大查询区间365天。  optional\n      * @param {integer} opts.method - 返回数据的方式： &lt;code&gt;1&lt;/code&gt;:recent(区间值), &lt;code&gt;2&lt;/code&gt;:current(当前值。method &#x3D; 2 时如果查询当前值时传入beginTime，则按照beginTime时间来进行查询；如果不传beginTime，则按照后端系统时间查询。)\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bucketCapacityQueryResult bucketCapacityQueryResult\n      */\n\n  getSingleBucketCapacity (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getSingleBucketCapacity\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling getSingleBucketCapacity\"\n      )\n    }\n    if (opts.method === undefined || opts.method === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.method' when calling getSingleBucketCapacity\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.capacityTypes !== undefined && opts.capacityTypes !== null) {\n      postBody['capacityTypes'] = opts.capacityTypes\n    }\n    if (opts.beginTime !== undefined && opts.beginTime !== null) {\n      postBody['beginTime'] = opts.beginTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n    if (opts.periodType !== undefined && opts.periodType !== null) {\n      postBody['periodType'] = opts.periodType\n    }\n    if (opts.method !== undefined && opts.method !== null) {\n      postBody['method'] = opts.method\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ossopenapi/0.9.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSingleBucketCapacity with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/capacity/{bucketName}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取回源配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bucketBackSourceConfiguration bucketBackSourceConfiguration\n      */\n\n  getBackSourceConfiguration (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getBackSourceConfiguration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling getBackSourceConfiguration\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ossopenapi/0.9.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getBackSourceConfiguration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/backSource',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加修改回源配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {array} [opts.backSourceRules] - 回源配置规则  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  putBackSourceConfiguration (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  putBackSourceConfiguration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling putBackSourceConfiguration\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.backSourceRules !== undefined && opts.backSourceRules !== null) {\n      postBody['backSourceRules'] = opts.backSourceRules\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ossopenapi/0.9.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call putBackSourceConfiguration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/backSource',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除回源配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteBackSourceConfiguration (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBackSourceConfiguration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling deleteBackSourceConfiguration\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ossopenapi/0.9.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBackSourceConfiguration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/backSource',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据bucket名称获取该bucket下的同步任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {string} opts.taskId - 任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param historyReplicationTaskInfo historyReplicationTaskInfo\n      */\n\n  getHistoricalReplicatTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getHistoricalReplicatTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling getHistoricalReplicatTask\"\n      )\n    }\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling getHistoricalReplicatTask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ossopenapi/0.9.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getHistoricalReplicatTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/historical_replicat_task/{taskId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止bucket名称获取该bucket下的同步任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {string} opts.taskId - 任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  abortHistoricalReplicatTask (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  abortHistoricalReplicatTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling abortHistoricalReplicatTask\"\n      )\n    }\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling abortHistoricalReplicatTask\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ossopenapi/0.9.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call abortHistoricalReplicatTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/historical_replicat_task/{taskId}/abort',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据bucket名称获取该bucket下的同步任务列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {string} [opts.marker] - 同步任务列表开始的key  optional\n      * @param {integer} [opts.limit] - 每次查询返回的结果数，默认为1000  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listResult listResult\n      */\n\n  listHistoricalReplicatTasks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listHistoricalReplicatTasks\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling listHistoricalReplicatTasks\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.marker !== undefined && opts.marker !== null) {\n      queryParams['marker'] = opts.marker\n    }\n    if (opts.limit !== undefined && opts.limit !== null) {\n      queryParams['limit'] = opts.limit\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ossopenapi/0.9.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listHistoricalReplicatTasks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/historical_replicat_task/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建历史同步任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.bucketName - Bucket名称\n      * @param {string} opts.action - 是否覆盖\n      * @param {string} opts.bucketName - bucket名称\n      * @param {string} opts.bucketRegion - bucket所属区域\n      * @param {string} opts.targetBucketName - 目标bucket名称\n      * @param {string} opts.targetBucketRegion - 目标bucket所属区域\n      * @param {string} opts.storageClass - 存储类型\n      * @param {array} [opts.prefixSet]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param historyReplicationTask historyReplicationTask\n      */\n\n  createHistoricalReplicatTask (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createHistoricalReplicatTask\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling createHistoricalReplicatTask\"\n      )\n    }\n    if (opts.action === undefined || opts.action === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.action' when calling createHistoricalReplicatTask\"\n      )\n    }\n    if (opts.bucketName === undefined || opts.bucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketName' when calling createHistoricalReplicatTask\"\n      )\n    }\n    if (opts.bucketRegion === undefined || opts.bucketRegion === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bucketRegion' when calling createHistoricalReplicatTask\"\n      )\n    }\n    if (opts.targetBucketName === undefined || opts.targetBucketName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetBucketName' when calling createHistoricalReplicatTask\"\n      )\n    }\n    if (\n      opts.targetBucketRegion === undefined ||\n      opts.targetBucketRegion === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetBucketRegion' when calling createHistoricalReplicatTask\"\n      )\n    }\n    if (opts.storageClass === undefined || opts.storageClass === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.storageClass' when calling createHistoricalReplicatTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.action !== undefined && opts.action !== null) {\n      postBody['action'] = opts.action\n    }\n    if (opts.bucketName !== undefined && opts.bucketName !== null) {\n      postBody['bucketName'] = opts.bucketName\n    }\n    if (opts.bucketRegion !== undefined && opts.bucketRegion !== null) {\n      postBody['bucketRegion'] = opts.bucketRegion\n    }\n    if (opts.targetBucketName !== undefined && opts.targetBucketName !== null) {\n      postBody['targetBucketName'] = opts.targetBucketName\n    }\n    if (\n      opts.targetBucketRegion !== undefined &&\n      opts.targetBucketRegion !== null\n    ) {\n      postBody['targetBucketRegion'] = opts.targetBucketRegion\n    }\n    if (opts.storageClass !== undefined && opts.storageClass !== null) {\n      postBody['storageClass'] = opts.storageClass\n    }\n    if (opts.prefixSet !== undefined && opts.prefixSet !== null) {\n      postBody['prefixSet'] = opts.prefixSet\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bucketName: opts.bucketName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ossopenapi/0.9.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createHistoricalReplicatTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/buckets/{bucketName}/historical_replicat_task/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开通对象存储服务\n      * @param {Object} opts - parameters\n      * @param {string} opts.userId - 用户Id\n      * @param {string} opts.appCode - app code\n      * @param {string} opts.serviceCode - service code\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  openService (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  openService\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.userId === undefined || opts.userId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userId' when calling openService\"\n      )\n    }\n    if (opts.appCode === undefined || opts.appCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appCode' when calling openService\"\n      )\n    }\n    if (opts.serviceCode === undefined || opts.serviceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceCode' when calling openService\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      userId: opts.userId,\n      appCode: opts.appCode,\n      serviceCode: opts.serviceCode\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ossopenapi/0.9.7'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call openService with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/users/{userId}/appCodes/{appCode}/serviceCodes/{serviceCode}/openService',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = OSSOPENAPI\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/partner/v1/partner.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 合作信息管理\n * 合作信息管理\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'partner'\nService._services[serviceId] = true\n\n/**\n * partner service.\n * @version 1.3.13\n */\n\nclass PARTNER extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'partner.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询合作产品列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.cooperationId] - 合作id  optional\n      * @param {string} [opts.companyName] - 公司名称  optional\n      * @param {string} [opts.name] - 合作名称  optional\n      * @param {string} [opts.productName] - 产品名称  optional\n      * @param {string} [opts.contractNo] - 合同编号  optional\n      * @param {integer} [opts.productType] - 产品类型  optional\n      * @param {integer} [opts.productMode] - 产品模式  optional\n      * @param {integer} [opts.productStatus] - 产品状态  optional\n      * @param {integer} [opts.settlementMode] - 结算方式  optional\n      * @param {integer} [opts.settlementCycle] - 结算周期  optional\n      * @param {integer} [opts.pageIndex] - 页码  optional\n      * @param {integer} [opts.pageSize] - 每页记录数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination  分页信息\n      * @param coProductVo result\n      * @param string requestId  请求id\n      */\n\n  describeCoProducts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCoProducts\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.cooperationId !== undefined && opts.cooperationId !== null) {\n      postBody['cooperationId'] = opts.cooperationId\n    }\n    if (opts.companyName !== undefined && opts.companyName !== null) {\n      postBody['companyName'] = opts.companyName\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.productName !== undefined && opts.productName !== null) {\n      postBody['productName'] = opts.productName\n    }\n    if (opts.contractNo !== undefined && opts.contractNo !== null) {\n      postBody['contractNo'] = opts.contractNo\n    }\n    if (opts.productType !== undefined && opts.productType !== null) {\n      postBody['productType'] = opts.productType\n    }\n    if (opts.productMode !== undefined && opts.productMode !== null) {\n      postBody['productMode'] = opts.productMode\n    }\n    if (opts.productStatus !== undefined && opts.productStatus !== null) {\n      postBody['productStatus'] = opts.productStatus\n    }\n    if (opts.settlementMode !== undefined && opts.settlementMode !== null) {\n      postBody['settlementMode'] = opts.settlementMode\n    }\n    if (opts.settlementCycle !== undefined && opts.settlementCycle !== null) {\n      postBody['settlementCycle'] = opts.settlementCycle\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      postBody['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCoProducts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/CooperationInfo:describeCoProducts',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  合作产品列表导出\n      * @param {Object} opts - parameters\n      * @param {string} [opts.cooperationId] - 合作id  optional\n      * @param {string} [opts.companyName] - 公司名称  optional\n      * @param {string} [opts.name] - 合作名称  optional\n      * @param {string} [opts.productName] - 产品名称  optional\n      * @param {string} [opts.contractNo] - 合同编号  optional\n      * @param {integer} [opts.productType] - 产品类型  optional\n      * @param {integer} [opts.productMode] - 产品模式  optional\n      * @param {integer} [opts.productStatus] - 产品状态  optional\n      * @param {integer} [opts.settlementMode] - 结算方式  optional\n      * @param {integer} [opts.settlementCycle] - 结算周期  optional\n      * @param {integer} [opts.pageIndex] - 页码  optional\n      * @param {integer} [opts.pageSize] - 每页记录数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string result  导出文件的下载url\n      * @param string requestId  请求id\n      */\n\n  exportCoProducts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  exportCoProducts\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.cooperationId !== undefined && opts.cooperationId !== null) {\n      postBody['cooperationId'] = opts.cooperationId\n    }\n    if (opts.companyName !== undefined && opts.companyName !== null) {\n      postBody['companyName'] = opts.companyName\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.productName !== undefined && opts.productName !== null) {\n      postBody['productName'] = opts.productName\n    }\n    if (opts.contractNo !== undefined && opts.contractNo !== null) {\n      postBody['contractNo'] = opts.contractNo\n    }\n    if (opts.productType !== undefined && opts.productType !== null) {\n      postBody['productType'] = opts.productType\n    }\n    if (opts.productMode !== undefined && opts.productMode !== null) {\n      postBody['productMode'] = opts.productMode\n    }\n    if (opts.productStatus !== undefined && opts.productStatus !== null) {\n      postBody['productStatus'] = opts.productStatus\n    }\n    if (opts.settlementMode !== undefined && opts.settlementMode !== null) {\n      postBody['settlementMode'] = opts.settlementMode\n    }\n    if (opts.settlementCycle !== undefined && opts.settlementCycle !== null) {\n      postBody['settlementCycle'] = opts.settlementCycle\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      postBody['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call exportCoProducts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/CooperationInfo:exportCoProducts',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  合作产品详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.uuid - 合作产品唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param coProductDetailVo result  合作产品详情\n      * @param string requestId  请求id\n      */\n\n  describeCoProduct (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCoProduct\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.uuid === undefined || opts.uuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.uuid' when calling describeCoProduct\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      uuid: opts.uuid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCoProduct with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/uuid/{uuid}:describeCoProduct',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  编辑合作产品\n      * @param {Object} opts - parameters\n      * @param {string} [opts.cooperationId] - 合作id  optional\n      * @param {string} [opts.productName] - 合作产品名称  optional\n      * @param {string} [opts.name] - 合作名称  optional\n      * @param {integer} [opts.productType] - 产品类型  optional\n      * @param {integer} [opts.productMode] - 产品模式  optional\n      * @param {string} [opts.productDesc] - 产品简介  optional\n      * @param {string} [opts.targetCustomer] - 目标客户  optional\n      * @param {string} [opts.marketSize] - 市场规模  optional\n      * @param {string} [opts.comparableProduct] - 主要竞品  optional\n      * @param {integer} [opts.sellingForm] - 售卖形态  1套/n年、2套/n月、3套、4次  optional\n      * @param {string} [opts.sellingMode] - 售卖方式  1直销，2渠道，3代理  optional\n      * @param {string} [opts.pricing] - 定价  optional\n      * @param {integer} [opts.productStatus] - 产品状态  optional\n      * @param {string} [opts.incomeForecast] - 收入预测  optional\n      * @param {string} [opts.costStructure] - 成本结构  optional\n      * @param {string} [opts.grossMarginForecast] - 毛利率预测  optional\n      * @param {integer} [opts.pricingStrategy] - 定价策略 1市场对标， 2总成本加成，3变动成本加成  optional\n      * @param {integer} [opts.settlementMode] - 结算方式 1固定金额结算，2实际售价固定比例结算，3实际售价浮动比例结算  optional\n      * @param {integer} [opts.settlementCycle] - 结算周期 1周结后付款、2月结后付款、3季结后付款、4年结后付款，5 PO预付款  optional\n      * @param {string} [opts.riskSuggestion] - 风险及建议  optional\n      * @param {string} [opts.erp] - erp  optional\n      * @param {string} [opts.uuid] - 产品唯一标识id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result  true:修改成功 false:修改失败\n      * @param string requestId  请求id\n      */\n\n  modifyCoProduct (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyCoProduct\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.cooperationId !== undefined && opts.cooperationId !== null) {\n      postBody['cooperationId'] = opts.cooperationId\n    }\n    if (opts.productName !== undefined && opts.productName !== null) {\n      postBody['productName'] = opts.productName\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.productType !== undefined && opts.productType !== null) {\n      postBody['productType'] = opts.productType\n    }\n    if (opts.productMode !== undefined && opts.productMode !== null) {\n      postBody['productMode'] = opts.productMode\n    }\n    if (opts.productDesc !== undefined && opts.productDesc !== null) {\n      postBody['productDesc'] = opts.productDesc\n    }\n    if (opts.targetCustomer !== undefined && opts.targetCustomer !== null) {\n      postBody['targetCustomer'] = opts.targetCustomer\n    }\n    if (opts.marketSize !== undefined && opts.marketSize !== null) {\n      postBody['marketSize'] = opts.marketSize\n    }\n    if (\n      opts.comparableProduct !== undefined &&\n      opts.comparableProduct !== null\n    ) {\n      postBody['comparableProduct'] = opts.comparableProduct\n    }\n    if (opts.sellingForm !== undefined && opts.sellingForm !== null) {\n      postBody['sellingForm'] = opts.sellingForm\n    }\n    if (opts.sellingMode !== undefined && opts.sellingMode !== null) {\n      postBody['sellingMode'] = opts.sellingMode\n    }\n    if (opts.pricing !== undefined && opts.pricing !== null) {\n      postBody['pricing'] = opts.pricing\n    }\n    if (opts.productStatus !== undefined && opts.productStatus !== null) {\n      postBody['productStatus'] = opts.productStatus\n    }\n    if (opts.incomeForecast !== undefined && opts.incomeForecast !== null) {\n      postBody['incomeForecast'] = opts.incomeForecast\n    }\n    if (opts.costStructure !== undefined && opts.costStructure !== null) {\n      postBody['costStructure'] = opts.costStructure\n    }\n    if (\n      opts.grossMarginForecast !== undefined &&\n      opts.grossMarginForecast !== null\n    ) {\n      postBody['grossMarginForecast'] = opts.grossMarginForecast\n    }\n    if (opts.pricingStrategy !== undefined && opts.pricingStrategy !== null) {\n      postBody['pricingStrategy'] = opts.pricingStrategy\n    }\n    if (opts.settlementMode !== undefined && opts.settlementMode !== null) {\n      postBody['settlementMode'] = opts.settlementMode\n    }\n    if (opts.settlementCycle !== undefined && opts.settlementCycle !== null) {\n      postBody['settlementCycle'] = opts.settlementCycle\n    }\n    if (opts.riskSuggestion !== undefined && opts.riskSuggestion !== null) {\n      postBody['riskSuggestion'] = opts.riskSuggestion\n    }\n    if (opts.erp !== undefined && opts.erp !== null) {\n      postBody['erp'] = opts.erp\n    }\n    if (opts.uuid !== undefined && opts.uuid !== null) {\n      postBody['uuid'] = opts.uuid\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyCoProduct with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/CooperationInfo:modifyCoProduct',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加合作产品\n      * @param {Object} opts - parameters\n      * @param {string} [opts.cooperationId] - 合作id  optional\n      * @param {string} [opts.productName] - 合作产品名称  optional\n      * @param {string} [opts.name] - 合作名称  optional\n      * @param {integer} [opts.productType] - 产品类型  optional\n      * @param {integer} [opts.productMode] - 产品模式  optional\n      * @param {string} [opts.productDesc] - 产品简介  optional\n      * @param {string} [opts.targetCustomer] - 目标客户  optional\n      * @param {string} [opts.marketSize] - 市场规模  optional\n      * @param {string} [opts.comparableProduct] - 主要竞品  optional\n      * @param {integer} [opts.sellingForm] - 售卖形态  1套/n年、2套/n月、3套、4次  optional\n      * @param {string} [opts.sellingMode] - 售卖方式  1直销，2渠道，3代理  optional\n      * @param {string} [opts.pricing] - 定价  optional\n      * @param {integer} [opts.productStatus] - 产品状态  optional\n      * @param {string} [opts.incomeForecast] - 收入预测  optional\n      * @param {string} [opts.costStructure] - 成本结构  optional\n      * @param {string} [opts.grossMarginForecast] - 毛利率预测  optional\n      * @param {integer} [opts.pricingStrategy] - 定价策略 1市场对标， 2总成本加成，3变动成本加成  optional\n      * @param {integer} [opts.settlementMode] - 结算方式 1固定金额结算，2实际售价固定比例结算，3实际售价浮动比例结算  optional\n      * @param {integer} [opts.settlementCycle] - 结算周期 1周结后付款、2月结后付款、3季结后付款、4年结后付款，5 PO预付款  optional\n      * @param {string} [opts.riskSuggestion] - 风险及建议  optional\n      * @param {string} [opts.erp] - erp  optional\n      * @param {string} [opts.uuid] - 产品唯一标识id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result  true:添加成功 false:添加失败\n      * @param string requestId  请求id\n      */\n\n  addCoProduct (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addCoProduct\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.cooperationId !== undefined && opts.cooperationId !== null) {\n      postBody['cooperationId'] = opts.cooperationId\n    }\n    if (opts.productName !== undefined && opts.productName !== null) {\n      postBody['productName'] = opts.productName\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.productType !== undefined && opts.productType !== null) {\n      postBody['productType'] = opts.productType\n    }\n    if (opts.productMode !== undefined && opts.productMode !== null) {\n      postBody['productMode'] = opts.productMode\n    }\n    if (opts.productDesc !== undefined && opts.productDesc !== null) {\n      postBody['productDesc'] = opts.productDesc\n    }\n    if (opts.targetCustomer !== undefined && opts.targetCustomer !== null) {\n      postBody['targetCustomer'] = opts.targetCustomer\n    }\n    if (opts.marketSize !== undefined && opts.marketSize !== null) {\n      postBody['marketSize'] = opts.marketSize\n    }\n    if (\n      opts.comparableProduct !== undefined &&\n      opts.comparableProduct !== null\n    ) {\n      postBody['comparableProduct'] = opts.comparableProduct\n    }\n    if (opts.sellingForm !== undefined && opts.sellingForm !== null) {\n      postBody['sellingForm'] = opts.sellingForm\n    }\n    if (opts.sellingMode !== undefined && opts.sellingMode !== null) {\n      postBody['sellingMode'] = opts.sellingMode\n    }\n    if (opts.pricing !== undefined && opts.pricing !== null) {\n      postBody['pricing'] = opts.pricing\n    }\n    if (opts.productStatus !== undefined && opts.productStatus !== null) {\n      postBody['productStatus'] = opts.productStatus\n    }\n    if (opts.incomeForecast !== undefined && opts.incomeForecast !== null) {\n      postBody['incomeForecast'] = opts.incomeForecast\n    }\n    if (opts.costStructure !== undefined && opts.costStructure !== null) {\n      postBody['costStructure'] = opts.costStructure\n    }\n    if (\n      opts.grossMarginForecast !== undefined &&\n      opts.grossMarginForecast !== null\n    ) {\n      postBody['grossMarginForecast'] = opts.grossMarginForecast\n    }\n    if (opts.pricingStrategy !== undefined && opts.pricingStrategy !== null) {\n      postBody['pricingStrategy'] = opts.pricingStrategy\n    }\n    if (opts.settlementMode !== undefined && opts.settlementMode !== null) {\n      postBody['settlementMode'] = opts.settlementMode\n    }\n    if (opts.settlementCycle !== undefined && opts.settlementCycle !== null) {\n      postBody['settlementCycle'] = opts.settlementCycle\n    }\n    if (opts.riskSuggestion !== undefined && opts.riskSuggestion !== null) {\n      postBody['riskSuggestion'] = opts.riskSuggestion\n    }\n    if (opts.erp !== undefined && opts.erp !== null) {\n      postBody['erp'] = opts.erp\n    }\n    if (opts.uuid !== undefined && opts.uuid !== null) {\n      postBody['uuid'] = opts.uuid\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addCoProduct with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/CooperationInfo:addCoProduct',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除合同附件\n      * @param {Object} opts - parameters\n      * @param {string} opts.fileUuid - 合同附件唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result  true-删除成功,false-删除失败\n      */\n\n  deleteFile (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteFile\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.fileUuid === undefined || opts.fileUuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileUuid' when calling deleteFile\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      fileUuid: opts.fileUuid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteFile with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/fileUuid/{fileUuid}/Contract:deleteFile',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加合同信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.contractUuid] - 合同唯一标识(添加不需要传，编辑必传)  optional\n      * @param {string} [opts.contractNo] - 合同编号  optional\n      * @param {string} [opts.startDate] - 开始时间  optional\n      * @param {string} [opts.endDate] - 结束时间  optional\n      * @param {string} [opts.remark] - 备注  optional\n      * @param {string} [opts.fileUuid] - 合同附件文件标识  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string result  合同唯一标识(添加失败为空)\n      * @param string requestId  请求id\n      */\n\n  addContract (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addContract\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.contractUuid !== undefined && opts.contractUuid !== null) {\n      postBody['contractUuid'] = opts.contractUuid\n    }\n    if (opts.contractNo !== undefined && opts.contractNo !== null) {\n      postBody['contractNo'] = opts.contractNo\n    }\n    if (opts.startDate !== undefined && opts.startDate !== null) {\n      postBody['startDate'] = opts.startDate\n    }\n    if (opts.endDate !== undefined && opts.endDate !== null) {\n      postBody['endDate'] = opts.endDate\n    }\n    if (opts.remark !== undefined && opts.remark !== null) {\n      postBody['remark'] = opts.remark\n    }\n    if (opts.fileUuid !== undefined && opts.fileUuid !== null) {\n      postBody['fileUuid'] = opts.fileUuid\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addContract with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/Contract:addContract',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  编辑合同信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.contractUuid] - 合同唯一标识(添加不需要传，编辑必传)  optional\n      * @param {string} [opts.contractNo] - 合同编号  optional\n      * @param {string} [opts.startDate] - 开始时间  optional\n      * @param {string} [opts.endDate] - 结束时间  optional\n      * @param {string} [opts.remark] - 备注  optional\n      * @param {string} [opts.fileUuid] - 合同附件文件标识  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result  true:修改成功 false:修改失败\n      * @param string requestId  请求id\n      */\n\n  modifyContract (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyContract\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.contractUuid !== undefined && opts.contractUuid !== null) {\n      postBody['contractUuid'] = opts.contractUuid\n    }\n    if (opts.contractNo !== undefined && opts.contractNo !== null) {\n      postBody['contractNo'] = opts.contractNo\n    }\n    if (opts.startDate !== undefined && opts.startDate !== null) {\n      postBody['startDate'] = opts.startDate\n    }\n    if (opts.endDate !== undefined && opts.endDate !== null) {\n      postBody['endDate'] = opts.endDate\n    }\n    if (opts.remark !== undefined && opts.remark !== null) {\n      postBody['remark'] = opts.remark\n    }\n    if (opts.fileUuid !== undefined && opts.fileUuid !== null) {\n      postBody['fileUuid'] = opts.fileUuid\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyContract with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/Contract:modifyContract',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询客户信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.customerPin] - 客户pin  optional\n      * @param {string} [opts.aliasName]   optional\n      * @param {string} [opts.nameLike] - 客户名称  optional\n      * @param {integer} [opts.accountType] - 账户类型（1个人2企业）  optional\n      * @param {string} [opts.loginName] - 帐户名  optional\n      * @param {string} [opts.startRelTime] - 关联开始时间（格式：yyyy-MM-dd HH:mm:ss）  optional\n      * @param {string} [opts.endRelTime] - 关联结束时间（格式：yyyy-MM-dd HH:mm:ss）  optional\n      * @param {integer} [opts.pageIndex] - 当前页序号  optional\n      * @param {integer} [opts.pageSize] - 当前条数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination\n      * @param customer result\n      */\n\n  queryMyCustomerList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryMyCustomerList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.customerPin !== undefined && opts.customerPin !== null) {\n      postBody['customerPin'] = opts.customerPin\n    }\n    if (opts.aliasName !== undefined && opts.aliasName !== null) {\n      postBody['aliasName'] = opts.aliasName\n    }\n    if (opts.nameLike !== undefined && opts.nameLike !== null) {\n      postBody['nameLike'] = opts.nameLike\n    }\n    if (opts.accountType !== undefined && opts.accountType !== null) {\n      postBody['accountType'] = opts.accountType\n    }\n    if (opts.loginName !== undefined && opts.loginName !== null) {\n      postBody['loginName'] = opts.loginName\n    }\n    if (opts.startRelTime !== undefined && opts.startRelTime !== null) {\n      postBody['startRelTime'] = opts.startRelTime\n    }\n    if (opts.endRelTime !== undefined && opts.endRelTime !== null) {\n      postBody['endRelTime'] = opts.endRelTime\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      postBody['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryMyCustomerList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/customerManage:queryMyCustomerList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询渠道用户信息\n      * @param {Object} opts - parameters\n      * @param {string} [opts.pin]   optional\n      * @param {string} [opts.loginName] - 帐户名  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param partnerUserDTO partnerUserDTOList\n      */\n\n  getPartnerUserList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getPartnerUserList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n    if (opts.loginName !== undefined && opts.loginName !== null) {\n      queryParams['loginName'] = opts.loginName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPartnerUserList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/getPartnerUserList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  编辑字典\n      * @param {Object} opts - parameters\n      * @param {number} [opts.id] - ID  optional\n      * @param {string} [opts.codeType] - 字典类型  optional\n      * @param {string} [opts.code] - 字典编码  optional\n      * @param {string} [opts.name] - 字典编码名称  optional\n      * @param {string} [opts.value] - 字典编码值  optional\n      * @param {boolean} [opts.useFlag] - null  optional\n      * @param {string} [opts.systemType] - 系统类型  optional\n      * @param {string} [opts.refValue] - 引用值  optional\n      * @param {integer} [opts.seq] - 顺序  optional\n      * @param {string} [opts.remark] - 字典说明  optional\n      * @param {string} [opts.createTime] - 创建时间  optional\n      * @param {string} [opts.createUser] - 创建人  optional\n      * @param {string} [opts.updateTime] - 修改时间  optional\n      * @param {string} [opts.updateUser] - 修改人  optional\n      * @param {integer} [opts.yn] - 是否删除0未删除,1已删除  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string code  返还编码0成功,其他失败\n      * @param string message  返回消息\n      */\n\n  modifyDicDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyDicDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      postBody['id'] = opts.id\n    }\n    if (opts.codeType !== undefined && opts.codeType !== null) {\n      postBody['codeType'] = opts.codeType\n    }\n    if (opts.code !== undefined && opts.code !== null) {\n      postBody['code'] = opts.code\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n    if (opts.useFlag !== undefined && opts.useFlag !== null) {\n      postBody['useFlag'] = opts.useFlag\n    }\n    if (opts.systemType !== undefined && opts.systemType !== null) {\n      postBody['systemType'] = opts.systemType\n    }\n    if (opts.refValue !== undefined && opts.refValue !== null) {\n      postBody['refValue'] = opts.refValue\n    }\n    if (opts.seq !== undefined && opts.seq !== null) {\n      postBody['seq'] = opts.seq\n    }\n    if (opts.remark !== undefined && opts.remark !== null) {\n      postBody['remark'] = opts.remark\n    }\n    if (opts.createTime !== undefined && opts.createTime !== null) {\n      postBody['createTime'] = opts.createTime\n    }\n    if (opts.createUser !== undefined && opts.createUser !== null) {\n      postBody['createUser'] = opts.createUser\n    }\n    if (opts.updateTime !== undefined && opts.updateTime !== null) {\n      postBody['updateTime'] = opts.updateTime\n    }\n    if (opts.updateUser !== undefined && opts.updateUser !== null) {\n      postBody['updateUser'] = opts.updateUser\n    }\n    if (opts.yn !== undefined && opts.yn !== null) {\n      postBody['yn'] = opts.yn\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyDicDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/dictionary:modifyDicDetail',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取伙伴账单\n      * @param {Object} opts - parameters\n      * @param {string} [opts.pin] - 渠道商pin  optional\n      * @param {string} [opts.loginName] - 账号名  optional\n      * @param {string} opts.billDate - 账期，yyyy-MM\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pinBill pinBills\n      * @param productBill productBills\n      */\n\n  describePartnerBills (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePartnerBills\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.billDate === undefined || opts.billDate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.billDate' when calling describePartnerBills\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.loginName !== undefined && opts.loginName !== null) {\n      postBody['loginName'] = opts.loginName\n    }\n    if (opts.billDate !== undefined && opts.billDate !== null) {\n      postBody['billDate'] = opts.billDate\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePartnerBills with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describePartnerBills',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询服务商相关的总消费数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 按月查询开始时间（yyyy/MM/dd）\n      * @param {string} opts.endTime - 按月查询结束时间（yyyy/MM/dd）\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param summaryBill result\n      */\n\n  getTotalConsumption (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTotalConsumption\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling getTotalConsumption\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling getTotalConsumption\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTotalConsumption with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/accountingBill:getTotalConsumption',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询服务商下每个客户总消费数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 按月查询开始时间（yyyy/MM/dd）\n      * @param {string} opts.endTime - 按月查询结束时间（yyyy/MM/dd）\n      * @param {string} [opts.pin] - pin  optional\n      * @param {integer} opts.pageSize - 每页条数\n      * @param {integer} opts.pageIndex - 第几页\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination\n      * @param summaryBill result\n      */\n\n  getEachConsumption (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getEachConsumption\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling getEachConsumption\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling getEachConsumption\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling getEachConsumption\"\n      )\n    }\n    if (opts.pageIndex === undefined || opts.pageIndex === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageIndex' when calling getEachConsumption\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getEachConsumption with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/accountingBill:getEachConsumption',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询服务商相关pin下每个产品的消费数据\n      * @param {Object} opts - parameters\n      * @param {string} [opts.pin] - pin  optional\n      * @param {string} opts.startTime - 按月查询开始时间（yyyy-MM-dd）,不可跨月\n      * @param {string} opts.endTime - 按月查询结束时间（yyyy-MM-dd）,不可跨月\n      * @param {integer} opts.pageSize - 每页条数,不超过100\n      * @param {integer} opts.pageIndex - 第几页\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination\n      * @param serviceCodeBill result\n      */\n\n  describeCustomerBillByProduct (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCustomerBillByProduct\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeCustomerBillByProduct\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeCustomerBillByProduct\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeCustomerBillByProduct\"\n      )\n    }\n    if (opts.pageIndex === undefined || opts.pageIndex === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageIndex' when calling describeCustomerBillByProduct\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      queryParams['pin'] = opts.pin\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  partner/1.3.13'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCustomerBillByProduct with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/accountingBill:describeCustomerBillByProduct',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = PARTNER\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/pipeline/v1/pipeline.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * tools\n * API OF tools Create|Update|Read|Delete|Execute\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'pipeline'\nService._services[serviceId] = true\n\n/**\n * pipeline service.\n * @version 1.0.0\n */\n\nJDCloud.PIPELINE = class PIPELINE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'pipeline.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询用户限制\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer numberLimit  流水线数量限制\n      * @param boolean canCreate  是否可以创建\n      */\n\n  getLimits (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getLimits\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getLimits with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/limits',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取可选的源提供商\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  记录数\n      * @param nameLabelPair providers\n      */\n\n  getSourceProviders (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getSourceProviders\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSourceProviders with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/options/sourceProviders',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  操作提供商\n      * @param {Object} opts - parameters\n      * @param {string} [opts.type] - 源提供商类型  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  记录数\n      * @param nameLabelPair providers\n      */\n\n  getOperationProviders (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getOperationProviders\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getOperationProviders with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/options/operationProviders',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  可选地域\n      * @param {Object} opts - parameters\n      * @param {string} [opts.type] - 源提供商类型  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  可选地域总数\n      * @param nameLabelPair regions\n      */\n\n  getRegions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRegions\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRegions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/options/regions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询获取流水线任务列表，并显示最后一次执行的状态或结果信息\n/v1/regions/cn-south-1?sorts.1.name&#x3D;startedAt&amp;sorts.1.direction&#x3D;desc&amp;pageNumber&#x3D;1&amp;pageSize&#x3D;10&amp;filters.1.name&#x3D;name&amp;filters.1.values.1&#x3D;我的pipeline\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - 根据流水线名称查询  optional\n      * @param {sort} [opts.sorts]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param simplePipeline pipelines\n      */\n\n  getPipelines (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getPipelines\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, this.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPipelines with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/pipeline',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新建流水线任务\n      * @param {Object} opts - parameters\n      * @param {pipelineParams} [opts.data]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string uuid  流水线任务uuid\n      * @param boolean result  创建成功则是true\n      */\n\n  createPipeline (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createPipeline\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.data !== undefined && opts.data !== null) {\n      postBody['data'] = opts.data\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createPipeline with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/pipeline',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据uuid获取流水线任务的配置信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.uuid - 流水线 uuid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pipeline pipeline\n      */\n\n  getPipeline (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getPipeline\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.uuid === undefined || opts.uuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.uuid' when calling getPipeline\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      uuid: opts.uuid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPipeline with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/pipeline/{uuid}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新流水线任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.uuid - 流水线任务 uuid\n      * @param {pipelineParams} [opts.data]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string uuid  流水线任务uuid\n      * @param boolean result  更新成功则是true\n      */\n\n  updatePipeline (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updatePipeline\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.uuid === undefined || opts.uuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.uuid' when calling updatePipeline\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.data !== undefined && opts.data !== null) {\n      postBody['data'] = opts.data\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      uuid: opts.uuid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updatePipeline with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/pipeline/{uuid}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一个流水线任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.uuid - 流水线任务uuid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string uuid  流水线任务uuid\n      * @param boolean result  删除成功则是true\n      */\n\n  deletePipeline (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deletePipeline\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.uuid === undefined || opts.uuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.uuid' when calling deletePipeline\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      uuid: opts.uuid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deletePipeline with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/pipeline/{uuid}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据uuid启动一个流水线任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.uuid - 流水线uuid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceUuid  本次执行生成的实例的uuid\n      * @param string uuid  提交运行的流水线uuid\n      * @param boolean result  提交任务是否成功\n      */\n\n  startPipeline (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startPipeline\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.uuid === undefined || opts.uuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.uuid' when calling startPipeline\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      uuid: opts.uuid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startPipeline with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/pipeline/{uuid}:start',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询多个指定流水线执行及状态信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.uuid - 流水线uuid\n      * @param {string} opts.instanceUuid - 流水线实例uuid\n      * @param {string} opts.actionUuid - 动作UUID\n      * @param {string} opts.status - 手动设置的状态，如SUCCESS,FAILED\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceUuid\n      * @param string actionUuid\n      */\n\n  manualAction (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  manualAction\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.uuid === undefined || opts.uuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.uuid' when calling manualAction\"\n      )\n    }\n    if (opts.instanceUuid === undefined || opts.instanceUuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceUuid' when calling manualAction\"\n      )\n    }\n    if (opts.actionUuid === undefined || opts.actionUuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.actionUuid' when calling manualAction\"\n      )\n    }\n    if (opts.status === undefined || opts.status === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.status' when calling manualAction\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      uuid: opts.uuid,\n      instanceUuid: opts.instanceUuid,\n      actionUuid: opts.actionUuid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call manualAction with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/pipeline/{uuid}/instances/{instanceUuid}/actions/{actionUuid}:manual',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据条件查询流水线执行历史\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.uuids - 流水线执行实例ID，多个ID用逗号分隔\n      * @param {boolean} [opts.isSimple] - 流水线执行的状态，如果isSimple是true，只显示每个stage的状态, 而stage中的action状态将被忽略  optional\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - 根据流水线名称查询  optional\n      * @param {sort} [opts.sorts]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pipelineInstance pipelineInstances\n      */\n\n  getPipelineInstancesByUuids (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getPipelineInstancesByUuids\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.uuids === undefined || opts.uuids === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.uuids' when calling getPipelineInstancesByUuids\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.uuids !== undefined && opts.uuids !== null) {\n      queryParams['uuids'] = opts.uuids\n    }\n    if (opts.isSimple !== undefined && opts.isSimple !== null) {\n      queryParams['isSimple'] = opts.isSimple\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, this.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, this.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPipelineInstancesByUuids with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询流水线执行历史列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.uuid - 流水线uuid\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount\n      * @param pipelineInstance instances\n      */\n\n  getPipelineInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getPipelineInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.uuid === undefined || opts.uuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.uuid' when calling getPipelineInstances\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      uuid: opts.uuid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPipelineInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/pipeline/{uuid}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询流水线执行结果及状态信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.uuid - 流水线uuid\n      * @param {string} opts.instanceUuid - 流水线uuid执行历史记录的uuid, 也可以用 latest 字符串代替uuid, 来取得最近的状态\n      * @param {boolean} [opts.isSimple] - 流水线执行的状态，如果isSimple是true，只显示每个stage的状态, 而stage中的action状态将被忽略  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pipelineInstance pipelineInstance\n      */\n\n  getPipelineInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getPipelineInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.uuid === undefined || opts.uuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.uuid' when calling getPipelineInstance\"\n      )\n    }\n    if (opts.instanceUuid === undefined || opts.instanceUuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceUuid' when calling getPipelineInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.isSimple !== undefined && opts.isSimple !== null) {\n      queryParams['isSimple'] = opts.isSimple\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      uuid: opts.uuid,\n      instanceUuid: opts.instanceUuid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPipelineInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/pipeline/{uuid}/instance/{instanceUuid}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止流水线的一次执行\n      * @param {Object} opts - parameters\n      * @param {string} opts.uuid - 流水线uuid\n      * @param {string} opts.instanceUuid - 流水线执行的uuid\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceUuid\n      * @param string actionUuid\n      */\n\n  stopPipelineInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopPipelineInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.uuid === undefined || opts.uuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.uuid' when calling stopPipelineInstance\"\n      )\n    }\n    if (opts.instanceUuid === undefined || opts.instanceUuid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceUuid' when calling stopPipelineInstance\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      uuid: opts.uuid,\n      instanceUuid: opts.instanceUuid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopPipelineInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/pipeline/{uuid}/instance/{instanceUuid}:stop',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上传文件，返回文件内容\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean result\n      * @param string contents\n      */\n\n  readFile (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  readFile\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pipeline/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call readFile with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/file',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.PIPELINE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/pod/v1/pod.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 用户设置\n * 查询用户设置接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'pod'\nService._services[serviceId] = true\n\n/**\n * pod service.\n * @version 2.7.0\n */\n\nclass POD extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'pod.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  创建一个 configFile，存放文件内容（键值对）。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - ConfigFile 的名字，名称不能重复\n长度不超过63（命名字母小写，数字和-）\n\n      * @param {array} [opts.data] - configFile数据，个数不超过32个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string name\n      */\n\n  createConfigFile (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createConfigFile\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createConfigFile\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.data !== undefined && opts.data !== null) {\n      postBody['data'] = opts.data\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createConfigFile with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/configFiles',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个 configFile 详情\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - Name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param configFile configFile\n      */\n\n  describeConfigFile (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeConfigFile\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling describeConfigFile\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeConfigFile with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/configFiles/{name}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除单个 configFile\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - Name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteConfigFile (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteConfigFile\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling deleteConfigFile\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteConfigFile with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/configFiles/{name}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新configFile信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - Name\n      * @param {string} opts.name - 想要挂载的 ConfigFile 的名字，不能重复\n\n      * @param {array} [opts.data] - configFile数据，个数不超过32个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string name\n      */\n\n  updateConfigFile (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateConfigFile\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling updateConfigFile\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling updateConfigFile\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.data !== undefined && opts.data !== null) {\n      postBody['data'] = opts.data\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateConfigFile with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/configFiles/{name}:update',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取 pod 中某个容器的详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} opts.containerName - container name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param container container\n      */\n\n  describeContainer (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeContainer\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling describeContainer\"\n      )\n    }\n    if (opts.containerName === undefined || opts.containerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerName' when calling describeContainer\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId,\n      containerName: opts.containerName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeContainer with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}/containers/{containerName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  将容器连接到本地标准输入输出\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} opts.containerName - container name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  attach (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  attach\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling attach\"\n      )\n    }\n    if (opts.containerName === undefined || opts.containerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerName' when calling attach\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId,\n      containerName: opts.containerName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call attach with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}/containers/{containerName}:attach',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建 exec\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} opts.containerName - container name\n      * @param {array} [opts.command] - 执行的命令  optional\n      * @param {boolean} [opts.tty] - 执行命令是否分配tty。默认不分配  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string execId  exec id\n      */\n\n  execCreate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  execCreate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling execCreate\"\n      )\n    }\n    if (opts.containerName === undefined || opts.containerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerName' when calling execCreate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.command !== undefined && opts.command !== null) {\n      postBody['command'] = opts.command\n    }\n    if (opts.tty !== undefined && opts.tty !== null) {\n      postBody['tty'] = opts.tty\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId,\n      containerName: opts.containerName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call execCreate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}/containers/{containerName}:execCreate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取exec退出码\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} opts.containerName - container name\n      * @param {string} opts.execId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer execCode  exec命令执行的退出码\n      */\n\n  execGetExitCode (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  execGetExitCode\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling execGetExitCode\"\n      )\n    }\n    if (opts.containerName === undefined || opts.containerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerName' when calling execGetExitCode\"\n      )\n    }\n    if (opts.execId === undefined || opts.execId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.execId' when calling execGetExitCode\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.execId !== undefined && opts.execId !== null) {\n      queryParams['execId'] = opts.execId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId,\n      containerName: opts.containerName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call execGetExitCode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}/containers/{containerName}:execGetExitCode',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  执行exec，此接口需要升级Http协议到WebSocket\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} opts.containerName - container name\n      * @param {string} opts.execId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  execStart (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  execStart\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling execStart\"\n      )\n    }\n    if (opts.containerName === undefined || opts.containerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerName' when calling execStart\"\n      )\n    }\n    if (opts.execId === undefined || opts.execId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.execId' when calling execStart\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.execId !== undefined && opts.execId !== null) {\n      queryParams['execId'] = opts.execId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId,\n      containerName: opts.containerName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call execStart with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}/containers/{containerName}:execStart',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置TTY大小\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} opts.containerName - container name\n      * @param {integer} opts.height - tty row，取值范围：[10, 2000]\n      * @param {integer} opts.width - tty column，取值范围：[10, 1000]\n      * @param {string} [opts.execId] - exec ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resizeTTY (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resizeTTY\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling resizeTTY\"\n      )\n    }\n    if (opts.containerName === undefined || opts.containerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerName' when calling resizeTTY\"\n      )\n    }\n    if (opts.height === undefined || opts.height === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.height' when calling resizeTTY\"\n      )\n    }\n    if (opts.width === undefined || opts.width === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.width' when calling resizeTTY\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.height !== undefined && opts.height !== null) {\n      postBody['height'] = opts.height\n    }\n    if (opts.width !== undefined && opts.width !== null) {\n      postBody['width'] = opts.width\n    }\n    if (opts.execId !== undefined && opts.execId !== null) {\n      postBody['execId'] = opts.execId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId,\n      containerName: opts.containerName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resizeTTY with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}/containers/{containerName}:resizeTTY',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个镜像缓存信息。镜像缓存加速是将镜像预先拉取到一个云盘中并制作为云盘快照，\n用户在创建Pod/NC时，若使用的镜像已经有镜像缓存，则可以直接基于该镜像缓存对应的快照制作云盘，并挂载为该容器的系统盘，避免重复拉取镜像并加快创建速度。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.name] - 镜像缓存名称  optional\n      * @param {imageCacheSpec} opts.imageCacheSpec - 镜像缓存创建参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string imageCacheId\n      */\n\n  createImageCache (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createImageCache\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageCacheSpec === undefined || opts.imageCacheSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageCacheSpec' when calling createImageCache\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.imageCacheSpec !== undefined && opts.imageCacheSpec !== null) {\n      postBody['imageCacheSpec'] = opts.imageCacheSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createImageCache with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/imageCache',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询镜像缓存。支持分页查询，默认每页20条。\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - imageCacheId - imageCacheId，精确匹配，支持多个\nstatus - 镜像缓存状态，精确匹配，支持多个\nname - 镜像缓存名称，模糊匹配，支持单个\nimage - 镜像名称，模糊匹配，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageCache imageCaches\n      * @param number totalCount\n      */\n\n  describeImageCaches (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeImageCaches\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeImageCaches with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/imageCaches',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量创建镜像缓存。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.name] - 镜像缓存名称\n  optional\n      * @param {array} [opts.imageCacheSpecs] - 镜像缓存创建参数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string imageCacheId\n      */\n\n  createImageCaches (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createImageCaches\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.imageCacheSpecs !== undefined && opts.imageCacheSpecs !== null) {\n      postBody['imageCacheSpecs'] = opts.imageCacheSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createImageCaches with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/imageCaches',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询镜像缓存的详细信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageCacheId - imageCacheId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageCache imageCache\n      */\n\n  describeImageCache (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeImageCache\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageCacheId === undefined || opts.imageCacheId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageCacheId' when calling describeImageCache\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageCacheId: opts.imageCacheId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeImageCache with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/imageCache/{imageCacheId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除镜像缓存，镜像缓存状态必须为Ready或Error状态。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageCacheId - imageCacheId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteImageCache (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteImageCache\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageCacheId === undefined || opts.imageCacheId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageCacheId' when calling deleteImageCache\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageCacheId: opts.imageCacheId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteImageCache with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/imageCache/{imageCacheId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据镜像信息匹配镜像缓存，根据镜像缓存的体积（体积小的优先）和创建时间（创建时间晚的优先）进行匹配\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.image - 镜像名称\n\n      * @param {string} [opts.secret] - 镜像仓库认证信息；使用Docker Hub和京东云CR的镜像不需要secret\n  optional\n      * @param {integer} [opts.size] - 限制返回的镜像缓存的大小不大于该值，用于避免镜像缓存大于系统盘导致创建失败的情况。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean found  是否匹配到镜像缓存\n      * @param imageCache imageCache  镜像缓存详情\n      */\n\n  getMostSuitableImageCache (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getMostSuitableImageCache\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.image === undefined || opts.image === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.image' when calling getMostSuitableImageCache\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.image !== undefined && opts.image !== null) {\n      queryParams['image'] = opts.image\n    }\n    if (opts.secret !== undefined && opts.secret !== null) {\n      queryParams['secret'] = opts.secret\n    }\n    if (opts.size !== undefined && opts.size !== null) {\n      queryParams['size'] = opts.size\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getMostSuitableImageCache with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/imageCache:getMostSuitable',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改镜像缓存的属性。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageCacheId - imageCacheId\n      * @param {string} [opts.name] - 新的镜像缓存名称  optional\n      * @param {integer} [opts.retentionDays] - 新的保留日期，以创建时间为准计算过期时间，新的过期时间不得为当前时间之前  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateImageCache (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateImageCache\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageCacheId === undefined || opts.imageCacheId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageCacheId' when calling updateImageCache\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.retentionDays !== undefined && opts.retentionDays !== null) {\n      postBody['retentionDays'] = opts.retentionDays\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageCacheId: opts.imageCacheId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateImageCache with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/imageCache/{imageCacheId}:update',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例规格信息列表\n\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - instanceTypes - 实例规格，精确匹配，支持多个\naz - 可用区，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceType instanceTypes\n      * @param instanceType specificInstanceTypes\n      * @param integer totalCount  总数量\n      */\n\n  describeInstanceTypes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceTypes\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceTypes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceTypes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询 pod 的详细信息&lt;br&gt;\n此接口支持分页查询，默认每页20条。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - podId - pod ID，精确匹配，支持多个\nprivateIpAddress - 主网卡IP地址，模糊匹配，支持单个\naz - 可用区，精确匹配，支持多个\nvpcId - 私有网络ID，精确匹配，支持多个\nphase - pod 状态，精确匹配，支持多个\nname - 实例名称，模糊匹配，支持单个\nsubnetId - 镜像ID，精确匹配，支持多个\nagId - 高可用组ID，精确匹配，支持多个\n  optional\n      * @param {tagFilter} [opts.tags] - Tag筛选条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pod pods\n      * @param number totalCount\n      */\n\n  describePods (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePods\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePods with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一台或多台 pod\n- 创建pod需要通过实名认证\n- 可用区\n    - Pod所属的可用区\n    - 创建Pod，需要使用中心可用区的相关资源：\n        - 具有中心可用区属性的子网\n        - 公网IP服务商\n- hostname规范\n    - 支持两种方式：以标签方式书写或以完整主机名方式书写\n    - 标签规范\n        - 0-9，a-z(不分大小写)和-（减号），其他的都是无效的字符串\n        - 不能以减号开始，也不能以减号结尾\n        - 最小1个字符，最大63个字符\n    - 完整的主机名由一系列标签与点连接组成\n        - 标签与标签之间使用“.”(点)进行连接\n        - 不能以“.”(点)开始，也不能以“.”(点)结尾\n        - 整个主机名（包括标签以及分隔点“.”）最多有63个ASCII字符\n- 网络配置\n    - 指定主网卡配置信息\n        - 必须指定subnetId\n        - 可以指定elasticIp规格来约束创建的弹性IP，带宽取值范围[1-100]Mbps，步进1Mbps\n        - 可以指定网卡的主IP(primaryIpAddress)和辅助IP(secondaryIpAddresses)，此时maxCount只能为1\n        - 可以设置网卡的自动删除autoDelete属性，指明是否删除实例时自动删除网卡\n        - 安全组securityGroup需与子网Subnet在同一个私有网络VPC内\n        - 一个 pod 创建时至多指定5个安全组\n        - 主网卡deviceIndex设置为1\n- 存储\n    - volume分为container system disk和pod data volume，container system disk的挂载目录是/，data volume的挂载目录可以随意指定\n    - container system disk\n        - 支持cloud和local\n        - 云硬盘类型可以选择hdd.std1、ssd.gp1、ssd.io1\n        - 磁盘大小\n            - 所有类型：范围[20,100]GB，步长为10G\n        - 自动删除\n            - 默认自动删除\n        - 可以选择已存在的云硬盘\n    - data volume\n        -cloudDisk\n          - 云硬盘类型可以选择hdd.std1、ssd.gp1、ssd.io1\n          - 磁盘大小\n              - 所有类型：范围[20,2000]GB，步长为10G\n          - 自动删除\n              - 默认自动删除\n          - 可以选择已存在的云硬盘\n          - 可以从快照创建磁盘\n        -CFS\n          - 从zbs去获取数据，挂载到当前的volume\n        -configFile\n          - 提前创建好configFile相关数据，然后挂载到volume\n\n- pod 容器日志\n    - default：默认在本地分配10MB的存储空间，自动rotate\n- DNS-1123 label规范\n    - 支持数字、小写字母、英文中划线“-”，但不支持以“-”作为开始字符和结束字符，1~63字符。\n    - 例子: my-name, 123-abc\n- DNS-1123 subdomain规范\n    - 由一或多个标签组成，标签之间用&#39;.&#39;分隔；标签可由小写字母、数字、英文中划线&#39;-&#39;构成，标签首尾不可为&#39;-&#39;；所有字符总长度为1~253。\n    - 例子: example.com, registry.docker-cn.com\n- 其他\n    - 创建完成后，pod 状态为running\n    - maxCount为最大努力，不保证一定能达到maxCount\n\n      * @param {Object} opts - parameters\n      * @param {podSpec} opts.podSpec - pod 创建参数\n      * @param {integer} opts.maxCount - 购买实例数量；取值范围：[1,100]\n      * @param {string} [opts.clientToken] - 保证请求幂等性的字符串；最大长度64个ASCII字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string podIds\n      */\n\n  createPods (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createPods\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podSpec === undefined || opts.podSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podSpec' when calling createPods\"\n      )\n    }\n    if (opts.maxCount === undefined || opts.maxCount === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.maxCount' when calling createPods\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.podSpec !== undefined && opts.podSpec !== null) {\n      postBody['podSpec'] = opts.podSpec\n    }\n    if (opts.maxCount !== undefined && opts.maxCount !== null) {\n      postBody['maxCount'] = opts.maxCount\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createPods with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询 pod 的状态信息&lt;br&gt;\n此接口支持分页查询，默认每页20条。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 500]  optional\n      * @param {filter} [opts.filters] - podId - pod ID，精确匹配，支持多个\nprivateIpAddress - 主网卡IP地址，模糊匹配，支持单个\naz - 可用区，精确匹配，支持多个\nvpcId - 私有网络ID，精确匹配，支持多个\nphase - pod 状态，精确匹配，支持多个\nname - 实例名称，模糊匹配，支持单个\nsubnetId - 镜像ID，精确匹配，支持多个\nagId - 高可用组ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param briefPodStatus podsStatus\n      * @param number totalCount\n      */\n\n  describePodsStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePodsStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePodsStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/podsStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  podName 是否符合命名规范，以及查询指定 podName 区域内是否已经存在。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.podName - 用户定义的 pod 名称，符合 DNS-1123 subdomain 规范。\n      * @param {integer} [opts.maxCount] - 需要创建的 pod 总数，默认创建一个，不同的总数会对校验结果产生影响。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  用户指定 podName 是否通过校验 0 通过 1 名称为空 2 不符合规范 3 重名。\n      * @param string reason  code 字段非零时，给出详细原因。\n      */\n\n  checkPodName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkPodName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podName === undefined || opts.podName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podName' when calling checkPodName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.podName !== undefined && opts.podName !== null) {\n      postBody['podName'] = opts.podName\n    }\n    if (opts.maxCount !== undefined && opts.maxCount !== null) {\n      postBody['maxCount'] = opts.maxCount\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkPodName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods:checkPodName',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个 pod 的详细信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pod pod\n      */\n\n  describePod (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePod\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling describePod\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePod with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  pod 状态必须为 stopped、running 或 error状态。 &lt;br&gt;\n按量付费的实例，如不主动删除将一直运行，不再使用的实例，可通过本接口主动停用。&lt;br&gt;\n只能支持主动删除按量计费类型的实例。包年包月过期的 pod 也可以删除，其它的情况还请发工单系统。计费状态异常的容器无法删除。\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {boolean} [opts.deletePrimaryNetworkInterfaceAllElasticIp] - 是否删除主机的主网卡绑定的所有弹性公网IP，默认为否。可选值：&#x60;true&#x60;，&#x60;false&#x60;。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deletePod (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deletePod\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling deletePod\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (\n      opts.deletePrimaryNetworkInterfaceAllElasticIp !== undefined &&\n      opts.deletePrimaryNetworkInterfaceAllElasticIp !== null\n    ) {\n      queryParams['deletePrimaryNetworkInterfaceAllElasticIp'] =\n        opts.deletePrimaryNetworkInterfaceAllElasticIp\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deletePod with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动处于关闭状态的单个 pod ，处在任务执行中的 pod 无法启动。&lt;br&gt;\npod 实例或其绑定的云盘已欠费时，容器将无法正常启动。&lt;br&gt;\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startPod (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startPod\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling startPod\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startPod with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}:startPod',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止处于运行状态的单个实例，处于任务执行中的 pod 无法启动。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopPod (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopPod\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling stopPod\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopPod with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}:stopPod',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改 pod 的描述。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} [opts.description] - 修改后的描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyPodAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyPodAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling modifyPodAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyPodAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}:modifyPodAttribute',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  pod 绑定弹性公网 IP，绑定的是主网卡、主内网IP对应的弹性IP. &lt;br&gt;\n一个 pod 只能绑定一个弹性公网 IP(主网卡)，若主网卡已存在弹性公网IP，会返回错误。&lt;br&gt;\n如果是黑名单中的用户，会返回错误。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} opts.elasticIpId - 弹性IP ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  associateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling associateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling associateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}:associateElasticIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  pod 解绑公网 IP，解绑的是主网卡、主内网 IP 对应的弹性 IP.\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} opts.elasticIpId - 弹性IP ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disassociateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling disassociateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling disassociateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}:disassociateElasticIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个容器日志\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} opts.containerName - container name\n      * @param {integer} [opts.tailLines] - 返回日志文件中倒数 tailLines 行，如不指定，默认从容器启动时或 sinceSeconds 指定的时间读取。\n  optional\n      * @param {integer} [opts.sinceSeconds] - 返回相对于当前时间之前sinceSeconds之内的日志。\n  optional\n      * @param {integer} [opts.limitBytes] - 限制返回的日志文件内容字节数，取值范围 [1-4]KB，最大 4KB.\n  optional\n      * @param {string} [opts.startTime] - 日志时间上限，不传表示不限时间\n  optional\n      * @param {string} [opts.endTime] - 日志时间下限，不传表示不限时间\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param logs logs\n      */\n\n  getContainerLogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getContainerLogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling getContainerLogs\"\n      )\n    }\n    if (opts.containerName === undefined || opts.containerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.containerName' when calling getContainerLogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.tailLines !== undefined && opts.tailLines !== null) {\n      queryParams['tailLines'] = opts.tailLines\n    }\n    if (opts.sinceSeconds !== undefined && opts.sinceSeconds !== null) {\n      queryParams['sinceSeconds'] = opts.sinceSeconds\n    }\n    if (opts.limitBytes !== undefined && opts.limitBytes !== null) {\n      queryParams['limitBytes'] = opts.limitBytes\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId,\n      containerName: opts.containerName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getContainerLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}/containers/{containerName}:getContainerLogs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对 pod 中的容器使用新的镜像进行重置，pod 需要处于关闭状态。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {array} [opts.containers] - 重置容器相关参数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  rebuildPod (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  rebuildPod\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling rebuildPod\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.containers !== undefined && opts.containers !== null) {\n      postBody['containers'] = opts.containers\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call rebuildPod with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}:rebuild',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  调整pod实例类型配置。\n- pod phase 需是停止状态；\n- 支持升配、降配；**不支持原有规格**\n- 计费类型不变\n    - 包年包月：需要计算配置差价，如果所选配置价格高，需要补齐到期前的差价，到期时间不变；如果所选配置价格低，需要延长到期时间\n    - 按配置：按照所选规格，进行计费\n- 支持对 pod 中的容器进行资源限制、资源需求的调整\n    - 容器需求的总资源占用不得超过 pod 的实例类型\n    - 容器资源限制不得超过 pod 的实例类型\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.podId - Pod ID\n      * @param {string} opts.instanceType - 新实例类型，不可与原实例类型相同\n      * @param {array} [opts.containerResources] - 新实例类型，不可与原实例类型相同  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resizePod (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resizePod\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podId === undefined || opts.podId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podId' when calling resizePod\"\n      )\n    }\n    if (opts.instanceType === undefined || opts.instanceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceType' when calling resizePod\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceType !== undefined && opts.instanceType !== null) {\n      postBody['instanceType'] = opts.instanceType\n    }\n    if (\n      opts.containerResources !== undefined &&\n      opts.containerResources !== null\n    ) {\n      postBody['containerResources'] = opts.containerResources\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podId: opts.podId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resizePod with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/pods/{podId}:resize',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询Pod模板。支持分页查询，默认每页20条。\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1。取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - podTemplateIds - podTemplate ID，精确匹配，支持多个\nname - pod模板名称，模糊匹配，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param podTemplate podTemplates\n      * @param number totalCount\n      */\n\n  describePodTemplates (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePodTemplates\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePodTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/podTemplates',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建Pod模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - pod模板的名称，参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。\n      * @param {string} [opts.description] - pod模板描述，参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。  optional\n      * @param {podTemplateSpec} opts.podTemplateSpec - pod模板创建参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string podTemplateId  Pod模板ID。\n      */\n\n  createPodTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createPodTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createPodTemplate\"\n      )\n    }\n    if (opts.podTemplateSpec === undefined || opts.podTemplateSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podTemplateSpec' when calling createPodTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.podTemplateSpec !== undefined && opts.podTemplateSpec !== null) {\n      postBody['podTemplateSpec'] = opts.podTemplateSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createPodTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/podTemplates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询Pod模板的详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.podTemplateId - Pod模板ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param podTemplate podTemplate\n      */\n\n  describePodTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePodTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podTemplateId === undefined || opts.podTemplateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podTemplateId' when calling describePodTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podTemplateId: opts.podTemplateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePodTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/podTemplates/{podTemplateId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改Pod模板的配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.podTemplateId - Pod模板ID\n      * @param {string} [opts.name] - pod模板的名称，参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。  optional\n      * @param {string} [opts.description] - pod模板描述，参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。  optional\n      * @param {updatePodTemplateSpec} [opts.podTemplateSpec] - pod模板修改参。如果没有指定，那么就意味着不进行修改。在不特殊说明的情况下，这个规则也适用于此结构体内的其他字段。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updatePodTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updatePodTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podTemplateId === undefined || opts.podTemplateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podTemplateId' when calling updatePodTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.podTemplateSpec !== undefined && opts.podTemplateSpec !== null) {\n      postBody['podTemplateSpec'] = opts.podTemplateSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podTemplateId: opts.podTemplateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updatePodTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/podTemplates/{podTemplateId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除单个pod模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.podTemplateId - Pod模板ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deletePodTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deletePodTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podTemplateId === undefined || opts.podTemplateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podTemplateId' when calling deletePodTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podTemplateId: opts.podTemplateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deletePodTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/podTemplates/{podTemplateId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  校验pod模板的有效性。\n\n## 接口说明\n- 调用该接口可以校验Pod模板是否有效，例如某些关联资源（如子网、镜像等）已经被删除了。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.podTemplateId - Pod模板ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  verifyPodTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  verifyPodTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.podTemplateId === undefined || opts.podTemplateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.podTemplateId' when calling verifyPodTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      podTemplateId: opts.podTemplateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call verifyPodTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/podTemplates/{podTemplateId}:verify',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询资源的配额，支持：原生容器,pod,secret,镜像缓存,Pod模板\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.resourceType - resourceType - 资源类型，支持 [container, pod, secret, imageCache,podTemplate]\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quota\n      */\n\n  describeQuota (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuota\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.resourceType === undefined || opts.resourceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceType' when calling describeQuota\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceType !== undefined && opts.resourceType !== null) {\n      queryParams['resourceType'] = opts.resourceType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuota with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/quotas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 secret 列表。&lt;br&gt;\n此接口支持分页查询，默认每页20条。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - name - secret名称，支持模糊搜索\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param secret secrets\n      * @param number totalCount\n      */\n\n  describeSecrets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSecrets\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecrets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secrets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个 secret，用于存放镜像仓库机密相关信息。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 机密数据名称，不能重复\n\n      * @param {string} opts.secretType - 机密数据的类型，目前仅支持：docker-registry 类型，用来和docker registry认证的类型。\n\n      * @param {dockerRegistryData} opts.data - 机密的数据。&lt;br&gt;\nkey 的有效字符包括字母、数字、-、_和.； &lt;br&gt;\nvalue 是 Base64 编码的字符串，不能包含换行符（在 linux 下使用 base64 -w 0选项），每个value长度上限为4KB，整个data的长度不能超过256KB; &lt;br&gt;\n必须包含server、username、password 字段，email 字段是可选的。&lt;br&gt;\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string secretName\n      */\n\n  createSecret (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSecret\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createSecret\"\n      )\n    }\n    if (opts.secretType === undefined || opts.secretType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.secretType' when calling createSecret\"\n      )\n    }\n    if (opts.data === undefined || opts.data === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.data' when calling createSecret\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.secretType !== undefined && opts.secretType !== null) {\n      postBody['secretType'] = opts.secretType\n    }\n    if (opts.data !== undefined && opts.data !== null) {\n      postBody['data'] = opts.data\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secrets',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个 secret 详情\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - Secret Name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param secret secret\n      */\n\n  describeSecret (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSecret\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling describeSecret\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secrets/{name}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除单个 secret\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - Secret Name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSecret (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSecret\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling deleteSecret\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      name: opts.name\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  pod/2.7.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSecret with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/secrets/{name}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = POD\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/portal/v1/portal.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * search\n * 搜索相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'portal'\nService._services[serviceId] = true\n\n/**\n * portal service.\n * @version 0.1.4\n */\n\nJDCloud.PORTAL = class PORTAL extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'portal.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询产品的详细信息\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.url - 产品url\n      * @param {string} opts.lang - 中文cn 英文en\n      * @param {string} opts.ak - 外部使用ak；\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param product result  产品详情\n      */\n\n  describeProduct (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeProduct\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.url === undefined || opts.url === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.url' when calling describeProduct\"\n      )\n    }\n    if (opts.lang === undefined || opts.lang === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.lang' when calling describeProduct\"\n      )\n    }\n    if (opts.ak === undefined || opts.ak === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ak' when calling describeProduct\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.url !== undefined && opts.url !== null) {\n      queryParams['url'] = opts.url\n    }\n    if (opts.lang !== undefined && opts.lang !== null) {\n      queryParams['lang'] = opts.lang\n    }\n    if (opts.ak !== undefined && opts.ak !== null) {\n      queryParams['ak'] = opts.ak\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  portal/0.1.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProduct with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/product',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  产品页列表查询接口\n\n      * @param {Object} opts - parameters\n      * @param {integer} opts.id - 语言类型；中文cn；英文en；\n      * @param {string} opts.ak - 外部使用ak；\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param navigation result\n      */\n\n  describeProductsById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeProductsById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling describeProductsById\"\n      )\n    }\n    if (opts.ak === undefined || opts.ak === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ak' when calling describeProductsById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      queryParams['id'] = opts.id\n    }\n    if (opts.ak !== undefined && opts.ak !== null) {\n      queryParams['ak'] = opts.ak\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  portal/0.1.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeProductsById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/getProductsById',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.PORTAL\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/privatezone/v1/privatezone.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 私有域名zone\n * 私有域名zone API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'privatezone'\nService._services[serviceId] = true\n\n/**\n * privatezone service.\n * @version 0.0.1\n */\n\nclass PRIVATEZONE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'privatezone.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询操作日志\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageSize] - 页容量，默认10，取值范围(1 - 100)  optional\n      * @param {integer} [opts.pageNumber] - 页序号，默认值1，不能小于1  optional\n      * @param {string} opts.start - 起始时间，格式：UTC时间例如2017-11-10T23:00:00Z\n      * @param {string} opts.end - 结束时间，格式：UTC时间例如2017-11-10T23:00:00Z\n      * @param {string} [opts.keyWord] - 日志模糊匹配的关键词  optional\n      * @param {boolean} [opts.success] - 操作结果 false-&gt;失败 true-&gt;成功  optional\n      * @param {string} [opts.actionType] - 日志类型，支持的类型有：CREATE_ZONE、DELETE_ZONE、LOCK_ZONE、CREATE_RR、MODIFY_RR、DELETE_RR、SET_RR_STATUS、RETRY_RECURSE_ZONE  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeActionLogsRes dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  describeActionLogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeActionLogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.start === undefined || opts.start === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.start' when calling describeActionLogs\"\n      )\n    }\n    if (opts.end === undefined || opts.end === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.end' when calling describeActionLogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.start !== undefined && opts.start !== null) {\n      queryParams['start'] = opts.start\n    }\n    if (opts.end !== undefined && opts.end !== null) {\n      queryParams['end'] = opts.end\n    }\n    if (opts.keyWord !== undefined && opts.keyWord !== null) {\n      queryParams['keyWord'] = opts.keyWord\n    }\n    if (opts.success !== undefined && opts.success !== null) {\n      queryParams['success'] = opts.success\n    }\n    if (opts.actionType !== undefined && opts.actionType !== null) {\n      queryParams['actionType'] = opts.actionType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeActionLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/actionLogs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例信息\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageSize] - 页容量，默认10，取值范围(1 - 100)  optional\n      * @param {integer} [opts.pageNumber] - 页序号，默认1，不能小于1  optional\n      * @param {string} [opts.instanceId] - 实例ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeInstancesRes dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询解析记录\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId - zone id\n      * @param {string} [opts.hostRecord] - 主机记录左右模糊查询  optional\n      * @param {integer} [opts.pageSize] - 页容量，默认10，取值范围(1 - 100)  optional\n      * @param {integer} [opts.pageNumber] - 页序号，默认1，不能小于1  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeResourceRecordsRes dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  describeResourceRecords (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeResourceRecords\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling describeResourceRecords\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.hostRecord !== undefined && opts.hostRecord !== null) {\n      queryParams['hostRecord'] = opts.hostRecord\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      zoneId: opts.zoneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeResourceRecords with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/zone/{zoneId}/resourceRecords',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建解析记录\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId - zone id\n      * @param {} [opts.hostRecord] - 主机记录  optional\n      * @param {} [opts.hostValue] - 主机记录值  optional\n      * @param {} [opts.recordType] - 解析类型，目前支持类型 A AAAA CNAME TXT CAA SRV MX PTR  optional\n      * @param {} [opts.ttl] - TTL值  optional\n      * @param {} [opts.priority] - 优先级，只存在于MX, SRV解析记录类型  optional\n      * @param {} [opts.port] - 端口，只存在于SRV解析记录类型  optional\n      * @param {} [opts.weight] - 解析记录的权重，目前支持权重的有：A/AAAA/CNAME，A/AAAA权重范围0-100，CNAME权重范围1-100。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createResourceRecord (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createResourceRecord\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling createResourceRecord\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.hostRecord !== undefined && opts.hostRecord !== null) {\n      postBody['hostRecord'] = opts.hostRecord\n    }\n    if (opts.hostValue !== undefined && opts.hostValue !== null) {\n      postBody['hostValue'] = opts.hostValue\n    }\n    if (opts.recordType !== undefined && opts.recordType !== null) {\n      postBody['recordType'] = opts.recordType\n    }\n    if (opts.ttl !== undefined && opts.ttl !== null) {\n      postBody['ttl'] = opts.ttl\n    }\n    if (opts.priority !== undefined && opts.priority !== null) {\n      postBody['priority'] = opts.priority\n    }\n    if (opts.port !== undefined && opts.port !== null) {\n      postBody['port'] = opts.port\n    }\n    if (opts.weight !== undefined && opts.weight !== null) {\n      postBody['weight'] = opts.weight\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      zoneId: opts.zoneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createResourceRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/zone/{zoneId}/resourceRecords',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改解析记录\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId - zone id\n      * @param {string} opts.resourceRecordId - 解析记录ID\n      * @param {} [opts.hostRecord] - 主机记录  optional\n      * @param {} [opts.hostValue] - 主机记录值  optional\n      * @param {} [opts.recordType] - 解析类型，目前支持类型 A AAAA CNAME TXT CAA SRV MX PTR  optional\n      * @param {} [opts.ttl] - TTL值  optional\n      * @param {} [opts.priority] - 优先级，只存在于MX, SRV解析记录类型  optional\n      * @param {} [opts.port] - 端口，只存在于SRV解析记录类型  optional\n      * @param {} [opts.weight] - 解析记录的权重，目前支持权重的有：A/AAAA/CNAME，A/AAAA权重范围0-100，CNAME权重范围1-100。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyResourceRecord (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyResourceRecord\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling modifyResourceRecord\"\n      )\n    }\n    if (opts.resourceRecordId === undefined || opts.resourceRecordId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceRecordId' when calling modifyResourceRecord\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.hostRecord !== undefined && opts.hostRecord !== null) {\n      postBody['hostRecord'] = opts.hostRecord\n    }\n    if (opts.hostValue !== undefined && opts.hostValue !== null) {\n      postBody['hostValue'] = opts.hostValue\n    }\n    if (opts.recordType !== undefined && opts.recordType !== null) {\n      postBody['recordType'] = opts.recordType\n    }\n    if (opts.ttl !== undefined && opts.ttl !== null) {\n      postBody['ttl'] = opts.ttl\n    }\n    if (opts.priority !== undefined && opts.priority !== null) {\n      postBody['priority'] = opts.priority\n    }\n    if (opts.port !== undefined && opts.port !== null) {\n      postBody['port'] = opts.port\n    }\n    if (opts.weight !== undefined && opts.weight !== null) {\n      postBody['weight'] = opts.weight\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      zoneId: opts.zoneId,\n      resourceRecordId: opts.resourceRecordId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyResourceRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/zone/{zoneId}/resourceRecord/{resourceRecordId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除解析记录。批量删除时多个resourceRecordId用&quot;,&quot;分隔。批量删除每次最多不超过100个记录\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId - zone id\n      * @param {string} opts.resourceRecordId - 解析记录ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteResourceRecords (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteResourceRecords\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling deleteResourceRecords\"\n      )\n    }\n    if (opts.resourceRecordId === undefined || opts.resourceRecordId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceRecordId' when calling deleteResourceRecords\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      zoneId: opts.zoneId,\n      resourceRecordId: opts.resourceRecordId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteResourceRecords with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/zone/{zoneId}/resourceRecords/{resourceRecordId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置解析记录状态，STOP操作会将停止该记录的解析，直到再次START。批量设置时多个resourceRecordId用&quot;,&quot;分隔。批量设置时每次最多不超过100个记录\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId - zone id\n      * @param {string} opts.resourceRecordId - 解析记录ID\n      * @param {string} opts.status - 解析记录状态 START-&gt;正常解析 STOP-&gt;停止解析\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setResourceRecordsStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setResourceRecordsStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling setResourceRecordsStatus\"\n      )\n    }\n    if (opts.resourceRecordId === undefined || opts.resourceRecordId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceRecordId' when calling setResourceRecordsStatus\"\n      )\n    }\n    if (opts.status === undefined || opts.status === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.status' when calling setResourceRecordsStatus\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      zoneId: opts.zoneId,\n      resourceRecordId: opts.resourceRecordId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setResourceRecordsStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/zone/{zoneId}/resourceRecords/{resourceRecordId}/status',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  导出当前zone下所有解析记录，返回的数据是可以转换为csv文件格式的字符串\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId - zone id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data  导出数据结果，此结果是可以存储为csv文件格式的字符串\n      */\n\n  exportResourceRecords (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  exportResourceRecords\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling exportResourceRecords\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      zoneId: opts.zoneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call exportResourceRecords with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/zone/{zoneId}/resourceRecords:export',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量导入解析记录，批量导入每次不可超过100条记录\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId - zone id\n      * @param {array} opts.importResourceRecordsReq - 导入的解析记录数据\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  importResourceRecords (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  importResourceRecords\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling importResourceRecords\"\n      )\n    }\n    if (\n      opts.importResourceRecordsReq === undefined ||\n      opts.importResourceRecordsReq === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.importResourceRecordsReq' when calling importResourceRecords\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.importResourceRecordsReq !== undefined &&\n      opts.importResourceRecordsReq !== null\n    ) {\n      postBody['importResourceRecordsReq'] = opts.importResourceRecordsReq\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      zoneId: opts.zoneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call importResourceRecords with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/zone/{zoneId}/resourceRecords:import',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  统计zone的解析量\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.start - 查询时间段的起始时间, UTC时间格式，例如2017-11-10T23:00:00Z\n      * @param {string} opts.end - 查询时间段的终止时间, UTC时间格式，例如2017-11-10T23:00:00Z\n      * @param {array} [opts.zoneIds] - 查询的zone id，默认查询所有zone  optional\n      * @param {array} [opts.vpcIds] - 查询的vpc id，默认查询所有vpc  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer time\n      * @param integer traffic\n      */\n\n  zoneResolveCount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  zoneResolveCount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.start === undefined || opts.start === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.start' when calling zoneResolveCount\"\n      )\n    }\n    if (opts.end === undefined || opts.end === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.end' when calling zoneResolveCount\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.start !== undefined && opts.start !== null) {\n      postBody['start'] = opts.start\n    }\n    if (opts.end !== undefined && opts.end !== null) {\n      postBody['end'] = opts.end\n    }\n    if (opts.zoneIds !== undefined && opts.zoneIds !== null) {\n      postBody['zoneIds'] = opts.zoneIds\n    }\n    if (opts.vpcIds !== undefined && opts.vpcIds !== null) {\n      postBody['vpcIds'] = opts.vpcIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneResolveCount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/stat:zoneResolveCount',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  统计zone的流量\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.start - 查询时间段的起始时间, UTC时间格式，例如2017-11-10T23:00:00Z\n      * @param {string} opts.end - 查询时间段的终止时间, UTC时间格式，例如2017-11-10T23:00:00Z\n      * @param {array} [opts.zoneIds] - 查询的zone id，默认查询所有zone  optional\n      * @param {array} [opts.vpcIds] - 查询的vpc id，默认查询所有vpc  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer time\n      * @param string unit  数据序列的单位\n      * @param number traffic\n      */\n\n  zoneFlowCount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  zoneFlowCount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.start === undefined || opts.start === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.start' when calling zoneFlowCount\"\n      )\n    }\n    if (opts.end === undefined || opts.end === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.end' when calling zoneFlowCount\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.start !== undefined && opts.start !== null) {\n      postBody['start'] = opts.start\n    }\n    if (opts.end !== undefined && opts.end !== null) {\n      postBody['end'] = opts.end\n    }\n    if (opts.zoneIds !== undefined && opts.zoneIds !== null) {\n      postBody['zoneIds'] = opts.zoneIds\n    }\n    if (opts.vpcIds !== undefined && opts.vpcIds !== null) {\n      postBody['vpcIds'] = opts.vpcIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneFlowCount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/stat:zoneFlowCount',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询私有解析zone列表\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.zone] - zone模块匹配查询  optional\n      * @param {string} [opts.instanceId] - 购买的套餐实例ID  optional\n      * @param {string} [opts.zoneId] - 根据zoneId精准查询(zone模糊查询失效)  optional\n      * @param {integer} [opts.pageSize] - 页容量，默认10，取值范围(1 - 100)  optional\n      * @param {integer} [opts.pageNumber] - 页序号，默认1，不能小于1  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeZonesRes dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  describeZones (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeZones\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.zone !== undefined && opts.zone !== null) {\n      queryParams['zone'] = opts.zone\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.zoneId !== undefined && opts.zoneId !== null) {\n      queryParams['zoneId'] = opts.zoneId\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeZones with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/zones',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  - 添加一个私有解析的zone，可添加以下三种类型的zone\n- 云内全局zone：zone的后缀是指定的后缀，如：local。该域名在云内自动全局生效，不用关联vpc即可在vpc内解析，该类型全局唯一，不能重复添加\n- 反向解析zone：zone的后缀是in-addr.arpa时，我们认为他是一个反向解析的zone，反向解析域名前缀目前支持10/172.16-31/192.168网段，如：10.in-addr.arpa、16.172.in-addr.arpa。反向解析的zone只能添加反向解析的记录\n- 私有解析zone：该类型的zone可以时任意符合格式的域名，私有解析zone需要关联vpc后，在vpc内生效解析\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone - zone\n      * @param {string} opts.instanceId - 购买的套餐实例ID\n      * @param {string} opts.zoneType - 域名类型 LOCAL-&gt;云内全局 PTR-&gt;反向解析zone PV-&gt;私有zone\n      * @param {boolean} [opts.retryRecurse] - 解析失败后是否进行递归解析  optional\n      * @param {array} [opts.bindVpc] - 绑定的vpc信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createZone (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createZone\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.zone === undefined || opts.zone === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone' when calling createZone\"\n      )\n    }\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createZone\"\n      )\n    }\n    if (opts.zoneType === undefined || opts.zoneType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneType' when calling createZone\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zone !== undefined && opts.zone !== null) {\n      postBody['zone'] = opts.zone\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.zoneType !== undefined && opts.zoneType !== null) {\n      postBody['zoneType'] = opts.zoneType\n    }\n    if (opts.retryRecurse !== undefined && opts.retryRecurse !== null) {\n      postBody['retryRecurse'] = opts.retryRecurse\n    }\n    if (opts.bindVpc !== undefined && opts.bindVpc !== null) {\n      postBody['bindVpc'] = opts.bindVpc\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createZone with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/zones',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除zone，该zone下的解析记录和绑定的vpc关联关系将会被删除\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId - zone id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteZone (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteZone\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling deleteZone\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      zoneId: opts.zoneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteZone with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/zone/{zoneId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  解析失败后，尝试递归解析开关\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId - zone id\n      * @param {boolean} opts.retryRecurse - true-&gt;解析失败后尝试递归解析 false-&gt;解析失败后不进行递归解析\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  retryRecurse (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  retryRecurse\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling retryRecurse\"\n      )\n    }\n    if (opts.retryRecurse === undefined || opts.retryRecurse === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.retryRecurse' when calling retryRecurse\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.retryRecurse !== undefined && opts.retryRecurse !== null) {\n      postBody['retryRecurse'] = opts.retryRecurse\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      zoneId: opts.zoneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call retryRecurse with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/zone/{zoneId}:retryRecurse',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  绑定vpc\n- vpc信息为空时，会将之前的绑定关系全部解除\n- 该接口为覆盖类的接口，请将需要的vpc全部进行绑定\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId - zone id\n      * @param {array} [opts.bindVpc] - 绑定的vpc信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  bindVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  bindVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling bindVpc\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.bindVpc !== undefined && opts.bindVpc !== null) {\n      postBody['bindVpc'] = opts.bindVpc\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      zoneId: opts.zoneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  privatezone/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bindVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/zone/{zoneId}/vpc:bind',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = PRIVATEZONE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/quota/v2/quota.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * JDCLOUD remote quota API\n * API JDCLOUD remote quota API\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'quota'\nService._services[serviceId] = true\n\n/**\n * quota service.\n * @version 0.0.2\n */\n\nclass QUOTA extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'quota.jdcloud-api.com'\n    options.basePath = '/v2' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  校验配额\n      * @param {Object} opts - parameters\n      * @param {string} [opts.pin] - 用户pin  optional\n      * @param {integer} [opts.siteType] - 站点类型  optional\n      * @param {string} [opts.appCode] - 业务线  optional\n      * @param {string} [opts.serviceCode] - 资源产品线  optional\n      * @param {string} [opts.region] - 地域  optional\n      * @param {string} [opts.parentResourceId] - 父层资源id（针对有两层结构的服务）  optional\n      * @param {string} [opts.uid] - 业务唯一键  optional\n      * @param {integer} [opts.quotaAmount] - 配额数量  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      * @param integer code\n      * @param string message\n      * @param verifyQuotaResVo data\n      * @param string requestId\n      */\n\n  verifyUserQuota (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  verifyUserQuota\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.siteType !== undefined && opts.siteType !== null) {\n      postBody['siteType'] = opts.siteType\n    }\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.region !== undefined && opts.region !== null) {\n      postBody['region'] = opts.region\n    }\n    if (opts.parentResourceId !== undefined && opts.parentResourceId !== null) {\n      postBody['parentResourceId'] = opts.parentResourceId\n    }\n    if (opts.uid !== undefined && opts.uid !== null) {\n      postBody['uid'] = opts.uid\n    }\n    if (opts.quotaAmount !== undefined && opts.quotaAmount !== null) {\n      postBody['quotaAmount'] = opts.quotaAmount\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  quota/0.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call verifyUserQuota with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/userQuota:verify',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  校验配额\n      * @param {Object} opts - parameters\n      * @param {string} [opts.pin] - 用户pin  optional\n      * @param {integer} [opts.siteType] - 站点类型  optional\n      * @param {string} [opts.appCode] - 业务线  optional\n      * @param {string} [opts.serviceCode] - 资源产品线  optional\n      * @param {string} [opts.region] - 地域  optional\n      * @param {string} [opts.parentResourceId] - 父层资源id（针对有两层结构的服务）  optional\n      * @param {string} [opts.uid] - 业务唯一键  optional\n      * @param {integer} [opts.quotaAmount] - 配额数量  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success\n      * @param integer code\n      * @param string message\n      * @param userQuotaResVo data\n      * @param string requestId\n      */\n\n  getUserQuotaDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getUserQuotaDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.siteType !== undefined && opts.siteType !== null) {\n      postBody['siteType'] = opts.siteType\n    }\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.region !== undefined && opts.region !== null) {\n      postBody['region'] = opts.region\n    }\n    if (opts.parentResourceId !== undefined && opts.parentResourceId !== null) {\n      postBody['parentResourceId'] = opts.parentResourceId\n    }\n    if (opts.uid !== undefined && opts.uid !== null) {\n      postBody['uid'] = opts.uid\n    }\n    if (opts.quotaAmount !== undefined && opts.quotaAmount !== null) {\n      postBody['quotaAmount'] = opts.quotaAmount\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  quota/0.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getUserQuotaDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/userQuota:getDetail',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = QUOTA\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/rds/v1/rds.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 白名单\n * 白名单相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'rds'\nService._services[serviceId] = true\n\n/**\n * rds service.\n * @version 1.3.4\n */\n\nclass RDS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'rds.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查看某个RDS实例下所有账号信息，包括账号名称、对各个数据库的访问权限信息等\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为100，取值范围：[10,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param account accounts\n      * @param integer totalCount\n      */\n\n  describeAccounts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAccounts\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAccounts\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAccounts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建数据库账号，用户可以使用客户端，应用程序等通过该账号和密码登录RDS数据库实例。&lt;br&gt;为便于管理和恢复，RDS对账号进行了限制，数据库账号只能通过控制台或者OpenAPI进行创建、删除账号以及对账号授权等，用户不能通过SQL语句对账号进行相关操作。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.accountName - 账号名，在同一个RDS实例中，账号名不能重复。账号名的具体规则可参见帮助中心文档:[名称及密码限制](../../../documentation/Database-and-Cache-Service/RDS/Introduction/Restrictions/SQLServer-Restrictions.md)\n      * @param {} opts.accountPassword - 密码,密码的具体规则可参见帮助中心文档:[名称及密码限制](../../../documentation/Database-and-Cache-Service/RDS/Introduction/Restrictions/SQLServer-Restrictions.md)\n      * @param {} [opts.notes] - 备注信息，仅支持PostgreSQL  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling createAccount\"\n      )\n    }\n    if (opts.accountPassword === undefined || opts.accountPassword === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountPassword' when calling createAccount\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountName !== undefined && opts.accountName !== null) {\n      postBody['accountName'] = opts.accountName\n    }\n    if (opts.accountPassword !== undefined && opts.accountPassword !== null) {\n      postBody['accountPassword'] = opts.accountPassword\n    }\n    if (opts.notes !== undefined && opts.notes !== null) {\n      postBody['notes'] = opts.notes\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看RDS实例的账号的权限信息 - 仅支持 MySQL，Percona，MariaDB\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.accountName - 账号名，在同一个实例中账号名不能重复\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param databasePrivilege databasePrivileges  数据库细粒度权限内容\n      * @param string globalPrivileges\n      */\n\n  describeAccountPrivilege (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAccountPrivilege\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAccountPrivilege\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling describeAccountPrivilege\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAccountPrivilege with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts/{accountName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除数据库账号，账号删除后不可恢复，用户无法再使用该账号登录RDS实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.accountName - 账号名，在同一个实例中账号名不能重复\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling deleteAccount\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts/{accountName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  授予账号的数据库访问权限，即该账号对数据库拥有什么权限。一个账号可以对多个数据库具有访问权限。&lt;br&gt;为便于管理，RDS对权限进行了归类，目前提供以下两种权限&lt;br&gt;- ro：只读权限，用户只能读取数据库中的数据，不能进行创建、插入、删除、更改等操作。&lt;br&gt;- rw：读写权限，用户可以对数据库进行增删改查等操作\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.accountName - 账号名，在同一个实例中账号名不能重复\n      * @param {array} opts.accountPrivileges - 账号的访问权限\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  grantPrivilege (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  grantPrivilege\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling grantPrivilege\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling grantPrivilege\"\n      )\n    }\n    if (\n      opts.accountPrivileges === undefined ||\n      opts.accountPrivileges === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountPrivileges' when calling grantPrivilege\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.accountPrivileges !== undefined &&\n      opts.accountPrivileges !== null\n    ) {\n      postBody['accountPrivileges'] = opts.accountPrivileges\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call grantPrivilege with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts/{accountName}:grantPrivilege',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  取消该账号对某个数据库的所有权限。权限取消后，该账号将不能访问此数据库。取消账号对某个数据库的访问权限，不影响该账号对其他数据库的访问权限\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.accountName - 账号名，在同一个实例中账号名不能重复\n      * @param {array} [opts.dbNames] - 需要取消授权的数据库的名称。权限取消后，该账号将不能访问此数据库  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  revokePrivilege (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  revokePrivilege\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling revokePrivilege\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling revokePrivilege\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dbNames !== undefined && opts.dbNames !== null) {\n      postBody['dbNames'] = opts.dbNames\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call revokePrivilege with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts/{accountName}:revokePrivilege',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重置数据库账号密码。如果用户忘记账号的密码，可以使用该接口重置指定账号密码。密码重置后，以前的密码将无法使用，必须使用重置后的新密码登录或连接数据库实例。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.accountName - 账号名，在同一个实例中账号名不能重复\n      * @param {} opts.accountPassword - 新密码，密码的具体规则可参见帮助中心文档:[名称及密码限制](../../../documentation/Database-and-Cache-Service/RDS/Introduction/Restrictions/SQLServer-Restrictions.md)\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resetPassword (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resetPassword\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling resetPassword\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling resetPassword\"\n      )\n    }\n    if (opts.accountPassword === undefined || opts.accountPassword === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountPassword' when calling resetPassword\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountPassword !== undefined && opts.accountPassword !== null) {\n      postBody['accountPassword'] = opts.accountPassword\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resetPassword with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts/{accountName}:resetPassword',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建数据库账号，用户可以使用客户端，应用程序等通过该账号和密码登录RDS数据库实例。&lt;br&gt;为便于管理和恢复，RDS对账号进行了限制，数据库账号只能通过控制台或者OpenAPI进行创建、删除账号以及对账号授权等，用户不能通过SQL语句对账号进行相关操作。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.accountName - 账号名，在同一个RDS实例中，账号名不能重复。账号名的具体规则可参见帮助中心文档:[名称及密码限制](../../../documentation/Database-and-Cache-Service/RDS/Introduction/Restrictions/SQLServer-Restrictions.md)\n      * @param {} opts.accountPassword - 密码,密码的具体规则可参见帮助中心文档:[名称及密码限制](../../../documentation/Database-and-Cache-Service/RDS/Introduction/Restrictions/SQLServer-Restrictions.md)\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createSuperAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSuperAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createSuperAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling createSuperAccount\"\n      )\n    }\n    if (opts.accountPassword === undefined || opts.accountPassword === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountPassword' when calling createSuperAccount\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountName !== undefined && opts.accountName !== null) {\n      postBody['accountName'] = opts.accountName\n    }\n    if (opts.accountPassword !== undefined && opts.accountPassword !== null) {\n      postBody['accountPassword'] = opts.accountPassword\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSuperAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts:createSuperAccount',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  授予账号的数据库细粒度的访问权限 - 仅支持 MySQL，Percona，MariaDB\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.accountName - 账号名，在同一个实例中账号名不能重复\n      * @param {} [opts.databasePrivileges] - 设置数据库细粒度权限内容  optional\n      * @param {} [opts.globalPrivileges] - 设置全局权限，权限的具体定义参见[枚举参数定义](../Enum-Definitions/Enum-Definitions.md)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  grantAccountPrivilege (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  grantAccountPrivilege\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling grantAccountPrivilege\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling grantAccountPrivilege\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.databasePrivileges !== undefined &&\n      opts.databasePrivileges !== null\n    ) {\n      postBody['databasePrivileges'] = opts.databasePrivileges\n    }\n    if (opts.globalPrivileges !== undefined && opts.globalPrivileges !== null) {\n      postBody['globalPrivileges'] = opts.globalPrivileges\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call grantAccountPrivilege with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts/{accountName}:grantAccountPrivilege',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看某个RDS实例下的运维账号信息。&lt;br&gt;- 仅支持 MySQL，Percona，MariaDB\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dBInstanceAccountForOps accounts\n      * @param integer totalCount\n      */\n\n  describeAccountsForOps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAccountsForOps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAccountsForOps\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAccountsForOps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accountsForOps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建数据库临时运维账号。&lt;br&gt;如果在使用数据库过程中需要京东云提供技术支持,并且需要对您的实例进行操作，您可以把临时运维账号提供给技术支持人员。&lt;br&gt;临时运维账号默认授予全局Select、Process权限，且账号只能通过控制台或者OpenAPI进行创建、删除账号以及对账号授权等，用户不能通过SQL语句对账号进行相关操作。&lt;br&gt;- 仅支持 MySQL，Percona，MariaDB\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} [opts.expiredTime] - 运维账号到期时间，UTC时间格式  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createAccountForOps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAccountForOps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createAccountForOps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.expiredTime !== undefined && opts.expiredTime !== null) {\n      postBody['expiredTime'] = opts.expiredTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAccountForOps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accountsForOps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改数据库临时运维账号属性。&lt;br&gt;- 仅支持 MySQL，Percona，MariaDB\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} [opts.expiredTime] - 运维账号到期时间，UTC时间格式  optional\n      * @param {} [opts.globalPrivileges]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyAccountForOps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyAccountForOps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyAccountForOps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.expiredTime !== undefined && opts.expiredTime !== null) {\n      postBody['expiredTime'] = opts.expiredTime\n    }\n    if (opts.globalPrivileges !== undefined && opts.globalPrivileges !== null) {\n      postBody['globalPrivileges'] = opts.globalPrivileges\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyAccountForOps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accountsForOps',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看当前实例已开启的审计选项。如当前实例未开启审计，则返回空&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string enabled  当前已开启的审计选项。如当前实例未开启审计，则返回空数组\n      */\n\n  describeAudit (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAudit\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAudit\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAudit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/audit',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启SQL Server的数据库审计功能，目前支持实例级的数据库审计。用户可以根据需要开启、关闭审计、自定义审计策略，并下载审计文件。审计文件为原生的SQL Server审计文件，缺省保存6个月。&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.enabled - 要开启的审计选项，各个选项之间用英文逗号或空格进行分割，例如：DATABASE_OBJECT_ACCESS_GROUP,ACKUP_RESTORE_GROU等&lt;br&gt;各个数据库版本支持的审计选项可以通过接口[describeAuditOptions](./describeAuditOptions.md)获得，各个审计项的具体含义可以参看微软的官方文档\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createAudit (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAudit\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createAudit\"\n      )\n    }\n    if (opts.enabled === undefined || opts.enabled === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.enabled' when calling createAudit\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAudit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/audit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭数据库审计。关闭数据库审计后，以前生成的审计结果文件并不会被立即删除。审计结果文件会过期后由系统自动删除，过期时间缺省为6个月&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteAudit (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAudit\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteAudit\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAudit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/audit',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前系统所支持的各种数据库版本的审计选项及相应的推荐选项&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.name - 审计选项类别，**大小写敏感**，目前支持两种类型：&lt;br&gt;（1）AuditOptions开头：在disalbed参数中返回SQL Server各个版本支持的所有选项，支持的名称为&lt;br&gt;AuditOptions2008R2&lt;br&gt;AuditOptions2012&lt;br&gt;AuditOptions2014&lt;br&gt;AuditOptions2016&lt;br&gt;例如输入参数为&quot;AuditOptions2016&quot;，则在disabled字段中返回SQL Server 2016 版本所支持的所有的审计选项&lt;br&gt;（2）AuditDefault开头：京东云建议的默认选项,在enabled参数中返回建议开启的选项，在disabled参数中返回不开启的选项，支持的名称为：&lt;br&gt;AuditDefault2008R2&lt;br&gt;AuditDefault2012&lt;br&gt;AuditDefault2014&lt;br&gt;AuditDefault2016&lt;br&gt;例如输入参数为&quot;AuditDefault2016&quot;，则在enabled字段返回SQL Server 2016 版本中京东云建议开启的审计选项，在disabled字段中返回建议不开启的选项\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string enabled  AuditDefault类模板：返回建议开启的审计选项。&lt;br&gt; AuditOptions类模板：不返回该参数\n      * @param string disabled  AuditDefault类模板：返回未开启的审计选项&lt;br&gt;AuditOptions类模板：返回所有的审计选项\n      */\n\n  describeAuditOptions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAuditOptions\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAuditOptions\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling describeAuditOptions\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAuditOptions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/audit:describeAuditOptions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改当前的审计选项。当前已有审计选项可以通过describeAudit获得，支持的全部选项可以通过getAuditOptions获得。&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} [opts.add] - 在原有审计项基础上，增加新的审计项，多个审计项之间用英文逗号，分号或空格分隔，例如DATABASE_OBJECT_ACCESS_GROUP,ACKUP_RESTORE_GROUP  optional\n      * @param {} [opts.drop] - 删除审计项，多个审计项之间用英文逗号，分号或空格分隔，例如DATABASE_OBJECT_ACCESS_GROUP,ACKUP_RESTORE_GROUP&lt;br&gt;如删除了所有审计项，则审计自动关闭  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyAudit (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyAudit\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyAudit\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.add !== undefined && opts.add !== null) {\n      postBody['add'] = opts.add\n    }\n    if (opts.drop !== undefined && opts.drop !== null) {\n      postBody['drop'] = opts.drop\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyAudit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/audit:modifyAudit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前实例下的所有审计结果文件的列表&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param auditFile auditFiles\n      */\n\n  describeAuditFiles (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAuditFiles\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAuditFiles\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAuditFiles with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/audit:describeAuditFiles',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取某个审计文件的下载链接，同时支持内链和外链，链接的有效时间为24小时&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.fileName - 审计文件名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string publicURL  公网下载链接，若当前不可下载，则为空串\n      * @param string internalURL  内网下载链接，若当前不可下载，则为空串\n      */\n\n  describeAuditDownloadURL (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAuditDownloadURL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAuditDownloadURL\"\n      )\n    }\n    if (opts.fileName === undefined || opts.fileName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileName' when calling describeAuditDownloadURL\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.fileName !== undefined && opts.fileName !== null) {\n      queryParams['fileName'] = opts.fileName\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAuditDownloadURL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/audit:describeAuditDownloadURL',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  仅支持MySQL实例开启数据库审计&lt;br&gt;- 仅支持 MySQL 5.6, MySQL 5.7, Percona, MariaDB, PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableAudit (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableAudit\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableAudit\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableAudit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/audit:enableAudit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  仅支持MySQL实例关闭数据库审计&lt;br&gt;- 仅支持 MySQL 5.6, MySQL 5.7, Percona, MariaDB, PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableAudit (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableAudit\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableAudit\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableAudit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/audit:disableAudit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看RDS实例的审计内容&lt;br&gt;- 仅支持 MySQL 5.6, MySQL 5.7, Percona, MariaDB, PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.startTime - 查询开始时间，格式为：YYYY-MM-DD HH:mm:ss，开始时间不能早于当前时间3天\n      * @param {string} opts.endTime - 查询截止时间，格式为：YYYY-MM-DD HH:mm:ss，开始时间到结束时间不能超过3天\n      * @param {string} [opts.dbName] - 废弃，使用filter，数据库名  optional\n      * @param {string} [opts.accountName] - 废弃，使用filter，账号名  optional\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - 过滤参数，多个过滤参数之间的关系为“与”(and支持以下属性的过滤(默认等值)：)\n- operation：仅第一个value生效，语句类型【create/alter/drop/truncate/select/insert/update/delete/replace/ddl/dml/disconnect/connect/failed_connect/query】,operator仅支持eq或者in\n- account：实例账号名，operator仅支持eq或者in\n- keyword：SQL 关键词，模糊查询，operator仅支持eq或者in\n- database：实例库名，operator仅支持eq或者in\n- threadId：会话id，operator仅支持eq或者in\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param auditResult auditResult\n      * @param integer totalCount\n      */\n\n  describeAuditResult (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAuditResult\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAuditResult\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeAuditResult\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeAuditResult\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      queryParams['dbName'] = opts.dbName\n    }\n    if (opts.accountName !== undefined && opts.accountName !== null) {\n      queryParams['accountName'] = opts.accountName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAuditResult with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/audit:describeAuditResult',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看指定地域下各种RDS数据库支持的可用区，不同类型的RDS支持的可用区不一样\n      * @param {Object} opts - parameters\n      * @param {string} opts.engine - RDS引擎类型，参见[枚举参数定义](../Enum-Definitions/Enum-Definitions.md)\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string azs\n      * @param azInfo azInfos\n      */\n\n  describeAzs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAzs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.engine === undefined || opts.engine === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.engine' when calling describeAzs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.engine !== undefined && opts.engine !== null) {\n      queryParams['engine'] = opts.engine\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAzs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/azs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看该RDS实例下所有备份的详细信息，返回的备份列表按照备份开始时间（backupStartTime）降序排列。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS实例ID，唯一标识一个实例\n      * @param {integer} [opts.auto] - 查询备份类型，0为手动备份，1为自动备份，不传表示全部. &lt;br&gt;**- 测试参数，仅支持SQL Server，后续可能被其他参数取代**  optional\n      * @param {string} [opts.backupTypeFilter] - 返回backupType等于指定值的备份列表。full为全量备份，diff为增量备份&lt;br&gt;**- 测试参数，仅支持SQL Server，后续可能被其他参数取代**  optional\n      * @param {string} [opts.dbNameFilter] - 返回dbName等于指定值的备份列表，不传或为空返回全部&lt;br&gt;**- 测试参数，仅支持SQL Server，后续可能被其他参数取代**  optional\n      * @param {string} [opts.backupTimeRangeStartFilter] - 返回备份开始时间大于该时间的备份列表&lt;br&gt;**- 测试参数，仅支持SQL Server，后续可能被其他参数取代**  optional\n      * @param {string} [opts.backupTimeRangeEndFilter] - 返回备份开始时间小于等于该时间的备份列表&lt;br&gt;**- 测试参数，仅支持SQL Server，后续可能被其他参数取代**  optional\n      * @param {integer} opts.pageNumber - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；\n      * @param {integer} opts.pageSize - 每页显示的数据条数，默认为10，取值范围：[10,100]\n      * @param {filter} [opts.filters] - 过滤参数，多个过滤参数之间的关系为“与”(and支持以下属性的过滤(默认等值)：)\n- instanceId：RDS实例ID，唯一标识一个实例，operator仅支持eq\n- instanceName：RDS实例名称，模糊搜索，operator仅支持eq、like\n- backupId：备份ID，唯一标识一个备份，operator仅支持eq\n- backupName：备份名称，模糊搜索，operator仅支持eq、like\n- auto：备份类型，0为手动备份，1为自动备份，operator仅支持eq\n- backupMethod：返回backupMethod等于指定值的备份列表，physical为物理备份，snapshot为快照备份备注，operator仅支持eq\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param backup backup\n      * @param integer totalCount  总记录数\n      */\n\n  describeBackups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackups\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeBackups\"\n      )\n    }\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling describeBackups\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling describeBackups\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.auto !== undefined && opts.auto !== null) {\n      queryParams['auto'] = opts.auto\n    }\n    if (opts.backupTypeFilter !== undefined && opts.backupTypeFilter !== null) {\n      queryParams['backupTypeFilter'] = opts.backupTypeFilter\n    }\n    if (opts.dbNameFilter !== undefined && opts.dbNameFilter !== null) {\n      queryParams['dbNameFilter'] = opts.dbNameFilter\n    }\n    if (\n      opts.backupTimeRangeStartFilter !== undefined &&\n      opts.backupTimeRangeStartFilter !== null\n    ) {\n      queryParams['backupTimeRangeStartFilter'] =\n        opts.backupTimeRangeStartFilter\n    }\n    if (\n      opts.backupTimeRangeEndFilter !== undefined &&\n      opts.backupTimeRangeEndFilter !== null\n    ) {\n      queryParams['backupTimeRangeEndFilter'] = opts.backupTimeRangeEndFilter\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个RDS实例全量备份，可以对整个实例或者部分数据库（仅SQL Server支持）进行全量备份。同一时间点，只能有一个正在运行的备份任务\n      * @param {Object} opts - parameters\n      * @param {string} [opts.instanceId] - RDS实例ID，唯一标识一个实例  optional\n      * @param {backupSpec} [opts.backupSpec] - 备份规格  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string backupId  备份Id\n      */\n\n  createBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.backupSpec !== undefined && opts.backupSpec !== null) {\n      postBody['backupSpec'] = opts.backupSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backups',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除RDS实例备份，仅允许删除用户生成的备份，系统自动备份不允许删除。\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupId - 备份ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupId === undefined || opts.backupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupId' when calling deleteBackup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupId: opts.backupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backups/{backupId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取整个备份或备份中单个文件的下载链接。&lt;br&gt;- 当输入参数中有文件名时，获取该文件的下载链接。&lt;br&gt;- 输入参数中无文件名时，获取整个备份的下载链接。&lt;br&gt;由于备份机制的差异，使用该接口下载备份时，SQL Server必须输入文件名，每个文件逐一下载，不支持下载整个备份。SQL Server备份中的文件名（不包括后缀）即为备份的数据库名。例如文件名为my_test_db.bak，表示该文件是my_test_db数据库的备份。&lt;br&gt;MySQL可下载整个备份集，但不支持单个文件的下载。\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupId - 备份ID\n      * @param {string} [opts.fileName] - 文件名称&lt;br&gt;- MySQL：不支持该参数&lt;br&gt;- SQL Server：必须输入该参数，指定该备份中需要获取下载链接的文件名称。备份中的文件名（不包括后缀）即为备份的数据库名。例如文件名为my_test_db.bak，表示该文件是my_test_db数据库的备份  optional\n      * @param {string} [opts.urlExpirationSecond] - 指定下载链接的过期时间，单位秒, 取值范围为 1 ~ 86400 秒；支持 SQL Server：缺省为 86400 秒。支持 MySQL, Percona, MariaDB：缺省为 300 秒。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string publicURL  公网下载链接，若当前不可下载，则为空串\n      * @param string internalURL  内网下载链接，若当前不可下载，则为空串\n      */\n\n  describeBackupDownloadURL (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackupDownloadURL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupId === undefined || opts.backupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupId' when calling describeBackupDownloadURL\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.fileName !== undefined && opts.fileName !== null) {\n      queryParams['fileName'] = opts.fileName\n    }\n    if (\n      opts.urlExpirationSecond !== undefined &&\n      opts.urlExpirationSecond !== null\n    ) {\n      queryParams['urlExpirationSecond'] = opts.urlExpirationSecond\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      backupId: opts.backupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackupDownloadURL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backups/{backupId}:describeBackupDownloadURL',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询跨地域备份同步服务列表。\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[1,∞)，用于查询列表的接口  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：10、20、30、50、100  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param backupSynchronicity backupSynchronicities\n      * @param integer totalCount\n      */\n\n  describeBackupSynchronicities (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackupSynchronicities\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackupSynchronicities with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupSynchronicities',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个跨地域备份同步服务。\n      * @param {Object} opts - parameters\n      * @param {} opts.instanceId - 源实例ID\n      * @param {} opts.destRegion - 备份同步的目标地域\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string serviceId  跨地域备份同步服务ID\n      */\n\n  createBackupSynchronicity (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBackupSynchronicity\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createBackupSynchronicity\"\n      )\n    }\n    if (opts.destRegion === undefined || opts.destRegion === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.destRegion' when calling createBackupSynchronicity\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.destRegion !== undefined && opts.destRegion !== null) {\n      postBody['destRegion'] = opts.destRegion\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBackupSynchronicity with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupSynchronicities',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一个跨地域备份同步服务。\n      * @param {Object} opts - parameters\n      * @param {string} opts.serviceId - 跨地域备份同步服务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteBackupSynchronicity (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBackupSynchronicity\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.serviceId === undefined || opts.serviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceId' when calling deleteBackupSynchronicity\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      serviceId: opts.serviceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBackupSynchronicity with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupSynchronicities/{serviceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据跨地域备份同步服务时间点创建实例。\n      * @param {Object} opts - parameters\n      * @param {string} opts.restoreTime - 根据源实例的哪个时间点创建新实例\n      * @param {string} opts.serviceId - 跨地域备份同步服务ID\n      * @param {restoredNewDBInstanceSpec} opts.instanceSpec - 新建实例规格\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId  新创建的实例ID\n      * @param string orderId  订单ID\n      */\n\n  createInstanceByTimeInCrossRegion (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstanceByTimeInCrossRegion\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.restoreTime === undefined || opts.restoreTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restoreTime' when calling createInstanceByTimeInCrossRegion\"\n      )\n    }\n    if (opts.serviceId === undefined || opts.serviceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceId' when calling createInstanceByTimeInCrossRegion\"\n      )\n    }\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstanceByTimeInCrossRegion\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.restoreTime !== undefined && opts.restoreTime !== null) {\n      postBody['restoreTime'] = opts.restoreTime\n    }\n    if (opts.serviceId !== undefined && opts.serviceId !== null) {\n      postBody['serviceId'] = opts.serviceId\n    }\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstanceByTimeInCrossRegion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backupSynchronicities:createInstanceByTimeInCrossRegion',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取MySQL实例中binlog的详细信息&lt;br&gt;- 仅支持 MySQL, Percona, MariaDB\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]  optional\n      * @param {string} [opts.startTime] - 查询开始时间，格式为：YYYY-MM-DDTHH:mm:ssZ，开始时间到结束时间不超过7天  optional\n      * @param {string} [opts.endTime] - 查询结束时间，格式为：YYYY-MM-DDTHH:mm:ssZ，开始时间到结束时间不超过7天  optional\n      * @param {filter} [opts.filters] - 过滤参数，多个过滤参数之间的关系为“与”(and支持以下属性的过滤(默认等值)：)\n- instanceId：RDS实例ID，唯一标识一个实例，operator仅支持eq\n- instanceName：RDS实例名称，模糊搜索，operator仅支持eq、like\n- binlogId：Binlog ID，唯一标识一个备份，operator仅支持eq\n- binlogName：Binlog名称，模糊搜索，operator仅支持eq、like\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总记录数\n      * @param binlog binlogs\n      */\n\n  describeBinlogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBinlogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeBinlogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBinlogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/binlogs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取MySQL实例的binlog的下载链接&lt;br&gt;- 仅支持 MySQL, Percona, MariaDB\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.binlogBackupId - binlog的备份ID，可以通过describeBinlogs获得\n      * @param {integer} [opts.seconds] - 设置链接地址的过期时间，单位是秒，默认值是 300 秒，最长不能超过取值范围为 1 ~ 86400 秒  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string publicURL  公网下载链接\n      * @param string internalURL  内网下载链接\n      */\n\n  describeBinlogDownloadURL (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBinlogDownloadURL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeBinlogDownloadURL\"\n      )\n    }\n    if (opts.binlogBackupId === undefined || opts.binlogBackupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.binlogBackupId' when calling describeBinlogDownloadURL\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.seconds !== undefined && opts.seconds !== null) {\n      queryParams['seconds'] = opts.seconds\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      binlogBackupId: opts.binlogBackupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBinlogDownloadURL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/binlogs/{binlogBackupId}:describeBinlogDownloadURL',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  清理本地的binlog并释放空间。 系统只会清理已经备份到存储的binlog，不会影响MySQL实例的备份恢复&lt;br&gt;- 仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  clearBinlogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  clearBinlogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling clearBinlogs\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call clearBinlogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/binlogs:clearBinlogs',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取MySQL实例的binlog的内网下载链接&lt;br&gt;- 仅支持 MySQL, Percona, MariaDB\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.binlogBackupId - binlog的备份ID，可以通过describeBinlogs获得\n      * @param {integer} [opts.seconds] - 设置链接地址的过期时间，单位是秒，默认值是 300 秒，最长不能超过取值范围为 1 ~ 86400 秒  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string internalURL  内网下载链接\n      */\n\n  describeBinlogDownloadInternalURL (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBinlogDownloadInternalURL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeBinlogDownloadInternalURL\"\n      )\n    }\n    if (opts.binlogBackupId === undefined || opts.binlogBackupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.binlogBackupId' when calling describeBinlogDownloadInternalURL\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.seconds !== undefined && opts.seconds !== null) {\n      queryParams['seconds'] = opts.seconds\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      binlogBackupId: opts.binlogBackupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBinlogDownloadInternalURL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/binlogs/{binlogBackupId}:describeBinlogDownloadInternalURL',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  通过 PT-OSC 服务来处理 DDL 命令, 避免锁表。此接口暂是对部分用户开放\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.database - DDL命令修改的库名\n      * @param {} opts.table - DDL命令修改的表名\n      * @param {} opts.command - 需要执行的的DDL命令\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  alterTableWithOnlineDDL (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  alterTableWithOnlineDDL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling alterTableWithOnlineDDL\"\n      )\n    }\n    if (opts.database === undefined || opts.database === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.database' when calling alterTableWithOnlineDDL\"\n      )\n    }\n    if (opts.table === undefined || opts.table === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.table' when calling alterTableWithOnlineDDL\"\n      )\n    }\n    if (opts.command === undefined || opts.command === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.command' when calling alterTableWithOnlineDDL\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.database !== undefined && opts.database !== null) {\n      postBody['database'] = opts.database\n    }\n    if (opts.table !== undefined && opts.table !== null) {\n      postBody['table'] = opts.table\n    }\n    if (opts.command !== undefined && opts.command !== null) {\n      postBody['command'] = opts.command\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call alterTableWithOnlineDDL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:alterTableWithOnlineDDL',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看云数据库 RDS 的权限信息 - 仅支持 MySQL，Percona，MariaDB\n      * @param {Object} opts - parameters\n      * @param {string} opts.engine - 设置可见的引擎类型，如 MySQL 等\n      * @param {string} [opts.instanceId] - RDS 实例ID，唯一标识一个RDS实例  optional\n      * @param {boolean} [opts.allAdminPrivileges] - true表示展示高权限，默认false  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string globalPrivileges\n      * @param string databasePrivileges\n      * @param string tablePrivileges\n      */\n\n  describePrivilege (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePrivilege\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.engine === undefined || opts.engine === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.engine' when calling describePrivilege\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.engine !== undefined && opts.engine !== null) {\n      queryParams['engine'] = opts.engine\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (\n      opts.allAdminPrivileges !== undefined &&\n      opts.allAdminPrivileges !== null\n    ) {\n      queryParams['allAdminPrivileges'] = opts.allAdminPrivileges\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePrivilege with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/common:describePrivilege',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前实例的所有数据库详细信息的列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} [opts.dbName] - 数据库名。如果不指定数据库名，则返回所有数据库列表&lt;br&gt;- **MySQL：不支持该字段**&lt;br&gt;- **SQL Server：支持该字段**  optional\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为100，取值范围：[10,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param database databases\n      * @param integer totalCount\n      */\n\n  describeDatabases (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDatabases\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeDatabases\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      queryParams['dbName'] = opts.dbName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDatabases with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/databases',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个数据库。 为了实例的管理和数据恢复，RDS对用户权限进行了限制，用户仅能通过控制台或本接口创建数据库\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.dbName - 数据库名，数据库名称的限制请参考[帮助中心文档](../../../documentation/Database-and-Cache-Service/RDS/Introduction/Restrictions/SQLServer-Restrictions.md)\n      * @param {} opts.characterSetName - 数据库的字符集名，当前支持的字符集请查看[枚举参数定义](../Enum-Definitions/Enum-Definitions.md)\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createDatabase (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDatabase\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createDatabase\"\n      )\n    }\n    if (opts.dbName === undefined || opts.dbName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbName' when calling createDatabase\"\n      )\n    }\n    if (opts.characterSetName === undefined || opts.characterSetName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.characterSetName' when calling createDatabase\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.characterSetName !== undefined && opts.characterSetName !== null) {\n      postBody['characterSetName'] = opts.characterSetName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDatabase with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/databases',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  从RDS实例中删除数据库。为便于管理和数据恢复，RDS对用户权限进行了控制，用户仅能通过控制台或本接口删除数据库 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.dbName - 库名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDatabase (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDatabase\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteDatabase\"\n      )\n    }\n    if (opts.dbName === undefined || opts.dbName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbName' when calling deleteDatabase\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      dbName: opts.dbName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDatabase with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/databases/{dbName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  从备份中恢复单个数据库，支持从其他实例（但必须是同一个账号下的实例）备份中恢复。例如可以从生产环境的数据库实例的备份恢复到测试环境的数据库中。&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.dbName - 库名称\n      * @param {} opts.backupId - 备份ID，可从备份查询接口describeBackups获取\n      * @param {} opts.backupFileName - 指定该备份中用于恢复数据库的文件名称。通常情况下文件名（不包括后缀）即为备份的数据库名。例如文件名为my_test_db.bak，表示该文件是my_test_db数据库的备份\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restoreDatabaseFromBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restoreDatabaseFromBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling restoreDatabaseFromBackup\"\n      )\n    }\n    if (opts.dbName === undefined || opts.dbName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbName' when calling restoreDatabaseFromBackup\"\n      )\n    }\n    if (opts.backupId === undefined || opts.backupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupId' when calling restoreDatabaseFromBackup\"\n      )\n    }\n    if (opts.backupFileName === undefined || opts.backupFileName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupFileName' when calling restoreDatabaseFromBackup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.backupId !== undefined && opts.backupId !== null) {\n      postBody['backupId'] = opts.backupId\n    }\n    if (opts.backupFileName !== undefined && opts.backupFileName !== null) {\n      postBody['backupFileName'] = opts.backupFileName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      dbName: opts.dbName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restoreDatabaseFromBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/databases/{dbName}:restoreDatabaseFromBackup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  从用户通过单库上云工具上传到云上的备份文件中恢复单个数据库&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.dbName - 库名称\n      * @param {} [opts.sharedFileGid] - 共享文件的全局ID，可从上传文件查询接口[describeImportFiles](../Cloud-on-Single-Database/describeImportFiles.md)获取；如果该文件不是共享文件，则不用输入该参数  optional\n      * @param {} opts.fileName - 用户上传的备份文件名称（包括文件后缀名），例如mydb1.bak\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restoreDatabaseFromFile (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restoreDatabaseFromFile\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling restoreDatabaseFromFile\"\n      )\n    }\n    if (opts.dbName === undefined || opts.dbName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbName' when calling restoreDatabaseFromFile\"\n      )\n    }\n    if (opts.fileName === undefined || opts.fileName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileName' when calling restoreDatabaseFromFile\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sharedFileGid !== undefined && opts.sharedFileGid !== null) {\n      postBody['sharedFileGid'] = opts.sharedFileGid\n    }\n    if (opts.fileName !== undefined && opts.fileName !== null) {\n      postBody['fileName'] = opts.fileName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      dbName: opts.dbName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restoreDatabaseFromFile with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/databases/{dbName}:restoreDatabaseFromFile',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  从上传到OSS的备份文件中恢复单个数据库&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.dbName - 库名称\n      * @param {} opts.ossURL - 用户上传到对象存储OSS上的备份文件的路径。&lt;br&gt;例如用户备份上传的bucket为db_backup，文件为test_server/db1.bak，那么ossULR为db_backup/test_server/db1.bak。&lt;br&gt;**授权说明**：需要授予账户ID：785455908940，对这个bucket的读取权限，具体步骤可以查看[文档](https://docs.jdcloud.com/cn/object-storage-service/set-bucket-policy-2)。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restoreDatabaseFromOSS (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restoreDatabaseFromOSS\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling restoreDatabaseFromOSS\"\n      )\n    }\n    if (opts.dbName === undefined || opts.dbName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbName' when calling restoreDatabaseFromOSS\"\n      )\n    }\n    if (opts.ossURL === undefined || opts.ossURL === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ossURL' when calling restoreDatabaseFromOSS\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ossURL !== undefined && opts.ossURL !== null) {\n      postBody['ossURL'] = opts.ossURL\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      dbName: opts.dbName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restoreDatabaseFromOSS with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/databases/{dbName}:restoreDatabaseFromOSS',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改数据库备注，仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.dbName - 库名称\n      * @param {} opts.comment - 数据库的备注信息，支持中午，ASCII字符，最大长度64\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyDatabaseComment (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyDatabaseComment\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyDatabaseComment\"\n      )\n    }\n    if (opts.dbName === undefined || opts.dbName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbName' when calling modifyDatabaseComment\"\n      )\n    }\n    if (opts.comment === undefined || opts.comment === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.comment' when calling modifyDatabaseComment\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.comment !== undefined && opts.comment !== null) {\n      postBody['comment'] = opts.comment\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      dbName: opts.dbName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyDatabaseComment with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/databases/{dbName}:modifyDatabaseComment',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取SQL Server 错误日志及下载信息&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param errorLog errorLogs\n      */\n\n  describeErrorLogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeErrorLogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeErrorLogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeErrorLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/errorLogs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取用户通过单库上云工具上传到该实例上的文件列表&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param importFile importFiles\n      */\n\n  describeImportFiles (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeImportFiles\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeImportFiles\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeImportFiles with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/importFiles',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取单库上云工具上传文件的需要的Key。单库上云工具需要正确的key值方能连接到京东云&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string key  上传文件需要用到的Key\n      */\n\n  getUploadKey (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getUploadKey\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling getUploadKey\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getUploadKey with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/importFiles:getUploadKey',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置或取消上传文件是否共享给同一账号下的其他实例。缺省情况下，文件仅在上传的实例上可见并可导入，其他实例不可见不可导入。如果需要该文件在其他实例上也可导入，可将此文件设置为共享&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.fileName - 单库上云文件名\n      * @param {} opts.shared - 文件是否共享&lt;br&gt;true:共享&lt;br&gt;false:不共享\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setImportFileShared (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setImportFileShared\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling setImportFileShared\"\n      )\n    }\n    if (opts.fileName === undefined || opts.fileName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileName' when calling setImportFileShared\"\n      )\n    }\n    if (opts.shared === undefined || opts.shared === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.shared' when calling setImportFileShared\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.shared !== undefined && opts.shared !== null) {\n      postBody['shared'] = opts.shared\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      fileName: opts.fileName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setImportFileShared with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/importFiles/{fileName}:setShared',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除用户通过单库上云工具上传的数据库备份文件&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.fileName - 单库上云文件名\n      * @param {} [opts.sharedFileGid] - 共享文件的全局ID，可从上传文件查询接口describeImportFiles中获取；如果该文件不是共享文件，则无须输入该字段  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteImportFile (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteImportFile\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteImportFile\"\n      )\n    }\n    if (opts.fileName === undefined || opts.fileName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileName' when calling deleteImportFile\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.sharedFileGid !== undefined && opts.sharedFileGid !== null) {\n      queryParams['sharedFileGid'] = opts.sharedFileGid\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      fileName: opts.fileName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteImportFile with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/importFiles/{fileName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前账号下所有RDS实例及MySQL/PostgreSQL只读实例的概要信息，例如实例类型，版本，计费信息等\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞]。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，且为10的整数倍  optional\n      * @param {filter} [opts.filters] - 过滤参数，多个过滤参数之间的关系为“与”(and)\n支持以下属性的过滤：\ninstanceId, 支持operator选项：eq\ninstanceName, 支持operator选项：eq, like\nengine, 支持operator选项：eq\nengineVersion, 支持operator选项：eq\ninstanceStatus, 支持operator选项：eq\nvpcId, 支持operator选项：eq\ninstanceType, 支持operator选项：eq\ninternalDomainName, 支持operator选项：eq\npublicDomainName, 支持operator选项：eq\nroInstanceProxyInternalDomainName, 支持operator选项：like\nreadWriteProxyInternalDomainName, 支持operator选项：like\n  optional\n      * @param {tagFilter} [opts.tagFilters] - 资源标签  optional\n      * @param {string} [opts.resourceGroupIds] - 资源组id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dBInstance dbInstances\n      * @param integer totalCount\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(\n      queryParams,\n      super.buildTagFilterParam(opts.tagFilters, 'tagFilters')\n    )\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.resourceGroupIds, 'resourceGroupIds')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个RDS实例，用户可以使用相应的数据库客户端或者应用程序通过域名和端口链接到该RDS实例上，进行操作。\n      * @param {Object} opts - parameters\n      * @param {dBInstanceSpec} opts.instanceSpec - 新建实例规格\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId\n      * @param string orderId\n      */\n\n  createInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询RDS实例（MySQL、SQL Server等）的详细信息以及MySQL/PostgreSQL只读实例详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {integer} [opts.instanceExistence] - 默认不传，返回当前未删除的实例的实例详情 **仅支持 MySQL，Percona，MariaDB。&lt;br&gt;请求参数：&lt;br&gt;- 0:当前存在的实例；&lt;br&gt;- 1:已删除的实例；&lt;br&gt;- 2:全部实例，不区分实例是否删除;  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dBInstanceAttribute dbInstanceAttributes\n      */\n\n  describeInstanceAttributes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceAttributes\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceAttributes\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (\n      opts.instanceExistence !== undefined &&\n      opts.instanceExistence !== null\n    ) {\n      queryParams['instanceExistence'] = opts.instanceExistence\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceAttributes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除一个RDS实例或者MySQL/PostgreSQL的只读实例。删除MySQL/PostgreSQL主实例时，会同时将对应的MySQL/PostgreSQL只读实例也删除 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看RDS实例备份策略。根据数据库类型的不同，支持的备份策略也略有差异，具体请看返回参数中的详细说明\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startWindow  自动备份开始时间窗口，范围00:00-23:59，时间范围差不得小于30分钟。&lt;br&gt;例如：00:00-01:00，表示0点到1点开始进行数据库自动备份，备份完成时间则跟实例大小有关，不一定在这个时间范围中\n      * @param integer retentionPeriod  自动备份保留周期，单位天，默认为7\n      * @param integer binlogRetentionPeriod  binlog本地保留周期，单位小时，默认为24\n      * @param integer binlogUsageLimit  binlog本地占用空间上限，单位%，默认为30\n      * @param string binlogSpaceProtection  空间保护是否开启，开启后，磁盘剩余空间小于20%或剩余空间不足5GB时，将自动清理本地binlog。开启：on，关闭：off，默认为off &lt;br&gt;- 仅支持MySQL\n      * @param integer cycleMode  自动备份循环模式&lt;br&gt;1:表示每天都是全量备份&lt;br&gt;2:表示自动备份按照全量、增量、增量这样的方式进行，例如第1天是全量备份，第2、3天是增量备份；第4天又是全量备份，以此类推.&lt;br&gt; - 仅支持 SQL Server\n      * @param string backupBinlog  是否备份binlog，默认为true&lt;br&gt;true:表示备份&lt;br&gt;false:表示不备份&lt;br&gt; - **仅支持 MySQL，Percona，MariaDB\n      * @param string enhancedBackup  是否开启增强备份模式&lt;br&gt;true:当前实例已开启增强备份模式&lt;br&gt;false或为空：表示当前实例未开启增强备份模式&lt;br&gt; - **仅支持 SQL Server\n      * @param string releasedKeepPolicy  已删除实例的备份保留策略,取值：&lt;br&gt;• CreateAndKeep：删除时新创建备份并保留&lt;br&gt;• All：全部保留&lt;br&gt;• None：不保留&lt;br&gt;- 仅支持 MySQL，Percona，MariaDB&lt;br&gt; - **仅支持 SQL Server\n      * @param string backupPeriod  备份周期\n      * @param integer binlogRetentionNumber  本地binlog最大保留数量，默认为-1，不限保留个数。\n      */\n\n  describeBackupPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackupPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeBackupPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackupPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeBackupPolicy',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改RDS实例备份策略，目前仅支持用户修改“自动备份开始时间窗口”这个参数，其他参数暂不开放修改\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} [opts.startWindow] - 自动备份开始时间窗口,例如：00:00-01:00，表示0点到1点开始进行数据库自动备份，备份完成时间则跟实例大小有关，不一定在这个时间范围中&lt;br&gt;SQL Server:范围00:00-23:59，时间范围差不得小于30分钟。&lt;br&gt;MySQL,只能是以下取值:&lt;br&gt;00:00-01:00&lt;br&gt;01:00-02:00&lt;br&gt;......&lt;br&gt;23:00-24:00  optional\n      * @param {} [opts.binlogRetentionPeriod] - binlog本地保留周期，单位小时，范围1-168，默认为24  optional\n      * @param {} [opts.binlogUsageLimit] - binlog本地占用空间上限，单位%，范围5-50，默认为30  optional\n      * @param {} [opts.binlogSpaceProtection] - 设置空间保护，开启：on，关闭：off；开启后，磁盘剩余空间小于20%或剩余空间不足5GB时，将自动清理本地binlog。 &lt;br&gt;- 仅支持MySQL  optional\n      * @param {} [opts.retentionPeriod] - 自动备份保留周期，单位天，范围7-730&lt;br&gt;SQL Server需要当enhancedBackup为true时才可修改  optional\n      * @param {} [opts.cycleMode] - 自动备份循环模式&lt;br&gt;1：表示每天都是全量备份&lt;br&gt;2：表示自动备份按照全量、增量、增量这样的方式进行，例如第1天是全量备份，第2、3天是增量备份；第4天又是全量备份，以此类推&lt;br&gt;当enhancedBackup为true时可修改&lt;br&gt;- 仅支持SQL Server  optional\n      * @param {} [opts.releasedKeepPolicy] - 已删除实例的备份保留策略,取值：&lt;br&gt;• CreateAndKeep：删除时新创建备份并保留&lt;br&gt;• All：全部保留&lt;br&gt;• None：不保留  optional\n      * @param {} [opts.backupPeriod] - 备份周期。至少需要指定2天，取值：&lt;br&gt;• Monday：周一&lt;br&gt;• Tuesday：周二&lt;br&gt;• Wednesday：周三&lt;br&gt;• Thursday：周四&lt;br&gt;• Friday：周五&lt;br&gt;• Saturday：周六&lt;br&gt;• Sunday：周日  optional\n      * @param {} [opts.binlogRetentionNumber] - 本地binlog最大保留数量，支持设置保留个数为6-1000个，可传-1表示不限保留个数，默认为-1。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyBackupPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBackupPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyBackupPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.startWindow !== undefined && opts.startWindow !== null) {\n      postBody['startWindow'] = opts.startWindow\n    }\n    if (\n      opts.binlogRetentionPeriod !== undefined &&\n      opts.binlogRetentionPeriod !== null\n    ) {\n      postBody['binlogRetentionPeriod'] = opts.binlogRetentionPeriod\n    }\n    if (opts.binlogUsageLimit !== undefined && opts.binlogUsageLimit !== null) {\n      postBody['binlogUsageLimit'] = opts.binlogUsageLimit\n    }\n    if (\n      opts.binlogSpaceProtection !== undefined &&\n      opts.binlogSpaceProtection !== null\n    ) {\n      postBody['binlogSpaceProtection'] = opts.binlogSpaceProtection\n    }\n    if (opts.retentionPeriod !== undefined && opts.retentionPeriod !== null) {\n      postBody['retentionPeriod'] = opts.retentionPeriod\n    }\n    if (opts.cycleMode !== undefined && opts.cycleMode !== null) {\n      postBody['cycleMode'] = opts.cycleMode\n    }\n    if (\n      opts.releasedKeepPolicy !== undefined &&\n      opts.releasedKeepPolicy !== null\n    ) {\n      postBody['releasedKeepPolicy'] = opts.releasedKeepPolicy\n    }\n    if (opts.backupPeriod !== undefined && opts.backupPeriod !== null) {\n      postBody['backupPeriod'] = opts.backupPeriod\n    }\n    if (\n      opts.binlogRetentionNumber !== undefined &&\n      opts.binlogRetentionNumber !== null\n    ) {\n      postBody['binlogRetentionNumber'] = opts.binlogRetentionNumber\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBackupPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyBackupPolicy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启增强备份模式，开启后，备份保留天数可大于7天。 免费备份额度外的备份将按照备份占用的空间收费。开启后，不支持关闭。&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableEnhancedBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableEnhancedBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableEnhancedBackup\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableEnhancedBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:enableEnhancedBackup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  当实例开启增强备份模式后，查询实例备份的空间使用情况&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param number totalFreeSpace  当前地域下总的免费备份空间大小，单位GB\n      * @param number totalUsedSpace  当前地域下所有实例的备份大小，单位GB\n      * @param number current  当前实例的备份大小，单位GB\n      */\n\n  describeBackupSpace (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackupSpace\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeBackupSpace\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackupSpace with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeBackupSpace',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询该用户pin关联的备份的计费信息。仅当该用户开启了增强备份后有效。如用户未开启增强备份，返回null&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.engine - 实例引擎类型\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param charge charge  计费配置\n      */\n\n  describeBackupCharge (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackupCharge\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.engine === undefined || opts.engine === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.engine' when calling describeBackupCharge\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.engine !== undefined && opts.engine !== null) {\n      queryParams['engine'] = opts.engine\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackupCharge with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:describeBackupCharge',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例名称，可支持中文，实例名的具体规则可参见帮助中心文档:[名称及密码限制](../../../documentation/Database-and-Cache-Service/RDS/Introduction/Restrictions/SQLServer-Restrictions.md)\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.instanceName - 实例名称，名称支持中文，实例名的具体规则可参见帮助中心文档:[名称及密码限制](../../../documentation/Database-and-Cache-Service/RDS/Introduction/Restrictions/SQLServer-Restrictions.md)\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceName\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling modifyInstanceName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceName',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对RDS实例进行主备切换。&lt;br&gt;注意：如果实例正在进行备份，那么主备切换将会终止备份操作。可以查看备份策略中的备份开始时间确认是否有备份正在运行。如果确实需要在实例备份时进行主备切换，建议切换完成 后，手工进行一次实例的全备&lt;br&gt;对于SQL Server，主备切换后30分钟内，不支持按时间点恢复/创建，例如在10:05分用户进行了主备切换，那么10:05 ~ 10:35这个时间段不能进行按时间点恢复/创建。&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  failoverInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  failoverInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling failoverInstance\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call failoverInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:failoverInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重启RDS实例，例如修改了一些配置参数后，需要重启实例才能生效。可以结合主备切换的功能，轮流重启备机，降低对业务的影响&lt;br&gt;**注意：如果实例正在进行备份，那么重启主实例将会终止备份操作。** 可以查看备份策略中的备份开始时间确认是否有备份正在运行。如果确实需要在实例备份时重启主实例，建议重启后，手工进行一次实例的全备。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} [opts.rebootMaster] - 是否重启主节点。&lt;br&gt; - 仅SQL Server 支持该参数  optional\n      * @param {} [opts.rebootSlave] - 是否重启备节点。&lt;br&gt; - 仅SQL Server 支持该参数  optional\n      * @param {} [opts.force] - 是否强制重启 &lt;br&gt;- 仅支持MySQL  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  rebootInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  rebootInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling rebootInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.rebootMaster !== undefined && opts.rebootMaster !== null) {\n      postBody['rebootMaster'] = opts.rebootMaster\n    }\n    if (opts.rebootSlave !== undefined && opts.rebootSlave !== null) {\n      postBody['rebootSlave'] = opts.rebootSlave\n    }\n    if (opts.force !== undefined && opts.force !== null) {\n      postBody['force'] = opts.force\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call rebootInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:rebootInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启RDS实例的外网访问功能。开启后，用户可以通过internet访问RDS实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableInternetAccess (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableInternetAccess\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableInternetAccess\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableInternetAccess with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:enableInternetAccess',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭RDS实例的外网访问功能。关闭后，用户无法通过Internet访问RDS，但可以在京东云内网通过内网域名访问\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableInternetAccess (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableInternetAccess\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableInternetAccess\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableInternetAccess with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:disableInternetAccess',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  使用实例的全量备份覆盖恢复当前实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} [opts.backupId] - 用于恢复的备份Id，仅限于本实例生成的备份  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restoreInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restoreInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling restoreInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.backupId !== undefined && opts.backupId !== null) {\n      postBody['backupId'] = opts.backupId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restoreInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:restoreInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据源实例全量备份创建一个新实例，新实例的数据跟源实例在创建备份时的数据状态一样。&lt;br&gt;例如根据源实例A的一个全量备份“mybak”新建一个实例B，该备份是在“‘2018-8-18 03:23:54”创建的。那么新建实例B的数据状态跟实例A‘2018-8-18 03:23:54’的状态一致\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupId - 备份ID\n      * @param {string} opts.engine - 标识是创建什么类型的实例，例如MySQL，SQL Server等,具体可参见文档[枚举参数定义](../Enum-Definitions/Enum-Definitions.md)&lt;br&gt;**注意：备份来源实例的engine和要创建的实例的engine必须一致**\n      * @param {restoredNewDBInstanceSpec} opts.instanceSpec - 新建实例规格\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId\n      * @param string orderId\n      */\n\n  createInstanceFromBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstanceFromBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupId === undefined || opts.backupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupId' when calling createInstanceFromBackup\"\n      )\n    }\n    if (opts.engine === undefined || opts.engine === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.engine' when calling createInstanceFromBackup\"\n      )\n    }\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstanceFromBackup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.backupId !== undefined && opts.backupId !== null) {\n      postBody['backupId'] = opts.backupId\n    }\n    if (opts.engine !== undefined && opts.engine !== null) {\n      postBody['engine'] = opts.engine\n    }\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstanceFromBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:createInstanceFromBackup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  实例扩容，支持升级实例的CPU，内存及磁盘。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.newInstanceClass - 扩容后实例规格\n      * @param {integer} opts.newInstanceStorageGB - 扩容后实例磁盘大小\n      * @param {string} [opts.newInstanceStorageType] - 存储类型，如果不指定，默认会采用实例原存储类型.  optional\n      * @param {boolean} [opts.storageEncrypted] - 实例数据加密(存储类型为云硬盘才支持数据加密). false：不加密; true：加密. 如果实例从本地盘变为云硬盘，缺省为false. 如果实例本来就是使用云硬盘的，缺省和源实例保持一致  optional\n      * @param {string} [opts.subnetId] - 变配后的子网ID  optional\n      * @param {string} [opts.effectiveTime] - 生效时间，取值：&lt;br&gt;immediate：立即生效&lt;br&gt;maintainTime：在可维护时间段内生效。&lt;br&gt;postpone：延后生效。  optional\n      * @param {integer} [opts.postponeTime] - 延后生效的时间，单位为分钟。effectiveTime为postpone时必传，取值1-1440分钟  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string orderId  生成的订单号\n      */\n\n  modifyInstanceSpec (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceSpec\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceSpec\"\n      )\n    }\n    if (opts.newInstanceClass === undefined || opts.newInstanceClass === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.newInstanceClass' when calling modifyInstanceSpec\"\n      )\n    }\n    if (\n      opts.newInstanceStorageGB === undefined ||\n      opts.newInstanceStorageGB === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.newInstanceStorageGB' when calling modifyInstanceSpec\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.newInstanceClass !== undefined && opts.newInstanceClass !== null) {\n      postBody['newInstanceClass'] = opts.newInstanceClass\n    }\n    if (\n      opts.newInstanceStorageGB !== undefined &&\n      opts.newInstanceStorageGB !== null\n    ) {\n      postBody['newInstanceStorageGB'] = opts.newInstanceStorageGB\n    }\n    if (\n      opts.newInstanceStorageType !== undefined &&\n      opts.newInstanceStorageType !== null\n    ) {\n      postBody['newInstanceStorageType'] = opts.newInstanceStorageType\n    }\n    if (opts.storageEncrypted !== undefined && opts.storageEncrypted !== null) {\n      postBody['storageEncrypted'] = opts.storageEncrypted\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n    if (opts.effectiveTime !== undefined && opts.effectiveTime !== null) {\n      postBody['effectiveTime'] = opts.effectiveTime\n    }\n    if (opts.postponeTime !== undefined && opts.postponeTime !== null) {\n      postBody['postponeTime'] = opts.postponeTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceSpec with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceSpec',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据源实例备份创建一个新实例，并通过追加日志的方式，将新实例的数据恢复到跟源实例指定时间点的数据状态一样。&lt;br&gt;例如根据实例A在“2018-06-18 23:00:00”时间点创建一个实例B，就是新建一个实例B，该实例B的数据跟实例A在“2018-06-18 23:00:00”这个时间点的数据完全一致。&lt;br&gt;对于SQL Server，主备切换后30分钟内，不支持按时间点恢复/创建，例如在10:05分用户进行了主备切换，那么10:05 ~ 10:35这个时间段不能进行按时间点恢复/创建。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.restoreTime - 根据源实例的哪个时间点创建新实例\n      * @param {restoredNewDBInstanceSpec} opts.instanceSpec - 新建实例规格\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId  新创建的实例ID\n      * @param string orderId  生成的订单号\n      */\n\n  createInstanceByTime (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstanceByTime\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createInstanceByTime\"\n      )\n    }\n    if (opts.restoreTime === undefined || opts.restoreTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restoreTime' when calling createInstanceByTime\"\n      )\n    }\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstanceByTime\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.restoreTime !== undefined && opts.restoreTime !== null) {\n      postBody['restoreTime'] = opts.restoreTime\n    }\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstanceByTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:createInstanceByTime',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建MySQL的只读实例&lt;br&gt; - 仅支持MySQL&lt;br&gt; - 创建的只读实例跟主实例在同一个VPC同一个子网中&lt;br&gt; * 只读实例只支持按配置计费\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.instanceName - 实例名称，具体规则可参见帮助中心文档:[名称及密码限制](../../../documentation/Database-and-Cache-Service/RDS/Introduction/Restrictions/SQLServer-Restrictions.md)\n      * @param {string} opts.instanceClass - 只读实例规格FlavorId\n      * @param {string} [opts.instanceStorageType] - 存储类型，参见[枚举参数定义](../Enum-Definitions/Enum-Definitions.md)，缺省值为：LOCAL_SSD  optional\n      * @param {integer} opts.instanceStorageGB - 磁盘空间\n      * @param {string} opts.azId - 可用区ID\n      * @param {string} [opts.vpcId] - VPC的ID，如果没有填写就保持和常规实例一样的VPC  optional\n      * @param {string} [opts.subnetId] - 子网ID，如果没有填写就保持和常规实例一样的subnet  optional\n      * @param {string} [opts.parameterGroup] - 参数组ID，缺省采用和常规实例一样的参数组  optional\n      * @param {boolean} [opts.storageEncrypted] - 实例数据加密(存储类型为云硬盘才支持数据加密)。false：不加密；true：加密。缺省为false。  optional\n      * @param {integer} [opts.count] - 创建只读实例的数目,缺省为1  optional\n      * @param {string} [opts.roInstanceProxy] - 只读代理服务的ID，缺省值为 “NULL”，表示不绑定代理服务  optional\n      * @param {array} [opts.tagSpec] - 标签信息  optional\n      * @param {string} [opts.resourceGroupId] - 资源组id  optional\n      * @param {chargeSpec} [opts.chargeSpec] - 计费规格，包括计费类型，计费周期等  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string roInstanceId  新创建的只读实例ID\n      * @param string orderId  订单ID\n      */\n\n  createROInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createROInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createROInstance\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling createROInstance\"\n      )\n    }\n    if (opts.instanceClass === undefined || opts.instanceClass === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceClass' when calling createROInstance\"\n      )\n    }\n    if (\n      opts.instanceStorageGB === undefined ||\n      opts.instanceStorageGB === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceStorageGB' when calling createROInstance\"\n      )\n    }\n    if (opts.azId === undefined || opts.azId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.azId' when calling createROInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n    if (opts.instanceClass !== undefined && opts.instanceClass !== null) {\n      postBody['instanceClass'] = opts.instanceClass\n    }\n    if (\n      opts.instanceStorageType !== undefined &&\n      opts.instanceStorageType !== null\n    ) {\n      postBody['instanceStorageType'] = opts.instanceStorageType\n    }\n    if (\n      opts.instanceStorageGB !== undefined &&\n      opts.instanceStorageGB !== null\n    ) {\n      postBody['instanceStorageGB'] = opts.instanceStorageGB\n    }\n    if (opts.azId !== undefined && opts.azId !== null) {\n      postBody['azId'] = opts.azId\n    }\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      postBody['vpcId'] = opts.vpcId\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n    if (opts.parameterGroup !== undefined && opts.parameterGroup !== null) {\n      postBody['parameterGroup'] = opts.parameterGroup\n    }\n    if (opts.storageEncrypted !== undefined && opts.storageEncrypted !== null) {\n      postBody['storageEncrypted'] = opts.storageEncrypted\n    }\n    if (opts.count !== undefined && opts.count !== null) {\n      postBody['count'] = opts.count\n    }\n    if (opts.roInstanceProxy !== undefined && opts.roInstanceProxy !== null) {\n      postBody['roInstanceProxy'] = opts.roInstanceProxy\n    }\n    if (opts.tagSpec !== undefined && opts.tagSpec !== null) {\n      postBody['tagSpec'] = opts.tagSpec\n    }\n    if (opts.resourceGroupId !== undefined && opts.resourceGroupId !== null) {\n      postBody['resourceGroupId'] = opts.resourceGroupId\n    }\n    if (opts.chargeSpec !== undefined && opts.chargeSpec !== null) {\n      postBody['chargeSpec'] = opts.chargeSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createROInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:createROInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改MySQL实例的连接模式：标准模式(standard) 和高安全模式(security).&lt;br&gt;- **标准模式**：响应时间短，但没有 SQL 审计和拦截的能力。&lt;br&gt;- **高安全模式**：具备一定的 SQL注入拦截能力（通过分析表达式、关键系统函数等来实现防御 SQL 注入攻击），并可开启 SQL 审计，但会增加一定的响应时间。&lt;br&gt;- 仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.connectionMode - 连接模式&lt;br&gt; - standard：标准模式(缺省)，响应时间短，但没有 SQL 审计和拦截的能力 &lt;br&gt;- security：高安全模式，具备一定的 SQL注入拦截能力，并可开启 SQL 审计，但会增加一定的响应时间\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyConnectionMode (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyConnectionMode\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyConnectionMode\"\n      )\n    }\n    if (opts.connectionMode === undefined || opts.connectionMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.connectionMode' when calling modifyConnectionMode\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.connectionMode !== undefined && opts.connectionMode !== null) {\n      postBody['connectionMode'] = opts.connectionMode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyConnectionMode with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyConnectionMode',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取SQL Server实例按时间点恢复/创建时，可恢复到的最后的一个时间点&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string latestRestoreTime  实例按时间点恢复时,可恢复到的最后的一个时间点\n      */\n\n  describeLatestRestoreTime (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeLatestRestoreTime\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeLatestRestoreTime\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLatestRestoreTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeLatestRestoreTime',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改RDS实例的参数组&lt;br&gt;- 仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.parameterGroupId - 参数组ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyParameterGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyParameterGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyParameterGroup\"\n      )\n    }\n    if (opts.parameterGroupId === undefined || opts.parameterGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameterGroupId' when calling modifyParameterGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.parameterGroupId !== undefined && opts.parameterGroupId !== null) {\n      postBody['parameterGroupId'] = opts.parameterGroupId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyParameterGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyParameterGroup',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  交换两个实例的域名，包括内网域名和外网域名。如果一个实例有外网域名，一个没有，则不允许交换。&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.targetInstanceId - 要交换的实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  exchangeInstanceDns (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  exchangeInstanceDns\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling exchangeInstanceDns\"\n      )\n    }\n    if (opts.targetInstanceId === undefined || opts.targetInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.targetInstanceId' when calling exchangeInstanceDns\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.targetInstanceId !== undefined && opts.targetInstanceId !== null) {\n      postBody['targetInstanceId'] = opts.targetInstanceId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call exchangeInstanceDns with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:exchangeInstanceDns',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例的可用区，例如将实例的可用区从单可用区调整为多可用区\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.newAzId - 新可用区ID。 如果是单机实例，只需输入一个可用区；如果是主备实例，则必须输入两个可用区ID：第一个为主节点所在可用区，第二个为备节点所在可用区。主备两个可用区可以相同，也可以不同\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceAz (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceAz\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceAz\"\n      )\n    }\n    if (opts.newAzId === undefined || opts.newAzId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.newAzId' when calling modifyInstanceAz\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.newAzId !== undefined && opts.newAzId !== null) {\n      postBody['newAzId'] = opts.newAzId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceAz with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceAz',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看当前实例已开启加密连接。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean available  当前实例是否已经开启加密连接，如已开启，返回true，如未开启，返回false.\n      */\n\n  describeSSL (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSSL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeSSL\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSSL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ssl',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启数据库的加密连接, 同时会重启数据库实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableSSL (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableSSL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableSSL\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableSSL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ssl:enableSSL',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭数据库的加密连接, 需要重启数据库实例才生效&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableSSL (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableSSL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableSSL\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableSSL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ssl:disableSSL',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据时间点，选择单表恢复当前实例&lt;br&gt;- 仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.restoreTime - 根据源实例的哪个时间点创建新实例\n      * @param {} opts.restoreSchema - 需要进行单库，单表恢复的概要信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restoreInstanceByTime (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restoreInstanceByTime\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling restoreInstanceByTime\"\n      )\n    }\n    if (opts.restoreTime === undefined || opts.restoreTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restoreTime' when calling restoreInstanceByTime\"\n      )\n    }\n    if (opts.restoreSchema === undefined || opts.restoreSchema === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restoreSchema' when calling restoreInstanceByTime\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.restoreTime !== undefined && opts.restoreTime !== null) {\n      postBody['restoreTime'] = opts.restoreTime\n    }\n    if (opts.restoreSchema !== undefined && opts.restoreSchema !== null) {\n      postBody['restoreSchema'] = opts.restoreSchema\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restoreInstanceByTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:restoreInstanceByTime',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改SQL Server对接的Active Directory 服务。支持SQL Server 2012 及2012以上以上的版本。&lt;br&gt;注意：修改目录服务后，需重启SQL Server实例才能生效\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.adResourceId - 目录服务的资源ID&lt;br&gt;- 加入目录服务：要加入的目录服务的资源ID&lt;br&gt;- 修改目录服务：新目录服务的资源ID&lt;br&gt;- 移除目录服务：传入字符串“none”，不区分大小写\n      * @param {} opts.forceRestart - 修改后，是否强制重启实例，使修改生效。&lt;br&gt; - true 修改后立即重启&lt;br&gt;- false：默认值，修改后不重启，需用户自行重启\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyActiveDirectory (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyActiveDirectory\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyActiveDirectory\"\n      )\n    }\n    if (opts.adResourceId === undefined || opts.adResourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.adResourceId' when calling modifyActiveDirectory\"\n      )\n    }\n    if (opts.forceRestart === undefined || opts.forceRestart === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.forceRestart' when calling modifyActiveDirectory\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.adResourceId !== undefined && opts.adResourceId !== null) {\n      postBody['adResourceId'] = opts.adResourceId\n    }\n    if (opts.forceRestart !== undefined && opts.forceRestart !== null) {\n      postBody['forceRestart'] = opts.forceRestart\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyActiveDirectory with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyActiveDirectory',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例的可维护时间。实例可维护时间段一般设置为业务的低峰时间段。京东云会在您设置的可维护时间段内进行实例维护，保证对业务的影响降到最低。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} [opts.maintainTime] - 实例的可维护时间段。格式：HH:mm-HH:mm，取值为一个小时整点  optional\n      * @param {} [opts.maintainPeriod] - 选择维护周期，可选择一周中的某一天或多天  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceMaintainTime (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceMaintainTime\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceMaintainTime\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.maintainTime !== undefined && opts.maintainTime !== null) {\n      postBody['maintainTime'] = opts.maintainTime\n    }\n    if (opts.maintainPeriod !== undefined && opts.maintainPeriod !== null) {\n      postBody['maintainPeriod'] = opts.maintainPeriod\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceMaintainTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceMaintainTime',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例的可维护时间\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string maintainTime  实例的可维护时间段。格式：HH:mm-HH:mm\n      * @param string maintainPeriod  Monday、Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday\n      */\n\n  describeInstanceMaintainTime (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceMaintainTime\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceMaintainTime\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceMaintainTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeInstanceMaintainTime',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  实例状态为变配待切换中，可执行，执行后，状态变为变配中\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  switchForModifyingInstanceSpec (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  switchForModifyingInstanceSpec\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling switchForModifyingInstanceSpec\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call switchForModifyingInstanceSpec with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:switchForModifyingInstanceSpec',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前数据库可升级到的版本，仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string versions\n      */\n\n  describeUpgradeVersions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeUpgradeVersions\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeUpgradeVersions\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUpgradeVersions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeUpgradeVersions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询当前发起的数据库的升级计划，仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string newVersion  升级后的新版本\n      * @param integer upgradeSchedule  计划开始升级的时间，1：立即开始升级，2：维护时间窗口升级\n      */\n\n  describeUpgradePlan (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeUpgradePlan\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeUpgradePlan\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUpgradePlan with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeUpgradePlan',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  升级引擎版本，例如从5.7.21 升级到5.7.24，仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.upgradeSchedule - 计划开始升级的时间，1：立即开始升级，2：维护时间窗口升级，0：取消升级\n      * @param {} [opts.newVersion] - 升级到的新版本，默认为当前实例可升级到的最新版本  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  upgradeEngineVersion (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  upgradeEngineVersion\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling upgradeEngineVersion\"\n      )\n    }\n    if (opts.upgradeSchedule === undefined || opts.upgradeSchedule === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.upgradeSchedule' when calling upgradeEngineVersion\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.upgradeSchedule !== undefined && opts.upgradeSchedule !== null) {\n      postBody['upgradeSchedule'] = opts.upgradeSchedule\n    }\n    if (opts.newVersion !== undefined && opts.newVersion !== null) {\n      postBody['newVersion'] = opts.newVersion\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call upgradeEngineVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:upgradeEngineVersion',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启数据库的高安全模式&lt;br&gt;- 仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableIntercept (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableIntercept\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableIntercept\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableIntercept with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/intercept:enableIntercept',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭数据库的高安全模式&lt;br&gt;- 仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableIntercept (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableIntercept\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableIntercept\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableIntercept with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/intercept:disableIntercept',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看开启高安全模式后，当前实例的 SQL 拦截记录&lt;br&gt;- 仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，且为10的整数倍  optional\n      * @param {filter} [opts.filters] - 过滤参数，多个过滤参数之间的关系为“与”(and);\n支持以下属性的过滤：account,database,keyword; 支持operator选项：eq,in; 仅支持 MySQL，Percona，MariaDB\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param interceptResult interceptResult\n      * @param integer totalCount\n      */\n\n  describeInterceptResult (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInterceptResult\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInterceptResult\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInterceptResult with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/intercept:describeInterceptResult',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看当前实例已开启的安全模式。如果开启数据库的高安全模式，会返回配置信息&lt;br&gt;- 仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean available\n      */\n\n  describeIntercept (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIntercept\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeIntercept\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIntercept with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/intercept',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取日志文件列表&lt;br&gt;- 仅支持PostgreSQL, MySQL, Percona, MariaDB\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为100，取值范围：[10,100]，用于查询列表的接口  optional\n      * @param {filter} [opts.filters] - 过滤参数，多个过滤参数之间的关系为“与”(and)\n支持以下属性的过滤：logType, 支持operator选项：eq, 仅支持 MySQL，Percona，MariaDB\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param log logs\n      * @param integer totalCount\n      */\n\n  describeLogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeLogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeLogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/log:describeLogs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置日志文件的下载链接过期时间，重新生成 PostgreSQL 的日志文件下载地址\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.logId - 日志文件ID\n      * @param {} opts.seconds - 设置链接地址的过期时间，单位是秒，最长不能超过取值范围为 1 ~ 86400 秒\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string publicURL  公网下载链接\n      * @param string internalURL  内网下载链接\n      */\n\n  updateLogDownloadURLInternal (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateLogDownloadURLInternal\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling updateLogDownloadURLInternal\"\n      )\n    }\n    if (opts.logId === undefined || opts.logId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.logId' when calling updateLogDownloadURLInternal\"\n      )\n    }\n    if (opts.seconds === undefined || opts.seconds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.seconds' when calling updateLogDownloadURLInternal\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.seconds !== undefined && opts.seconds !== null) {\n      postBody['seconds'] = opts.seconds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      logId: opts.logId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateLogDownloadURLInternal with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/log/{logId}:updateLogDownloadURLInternal',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据日志文件的下载链接过期时间，生成日志文件下载地址 仅支持 PostgreSQL, MySQL, Percona, MariaDB\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.logId - 日志文件ID\n      * @param {} [opts.seconds] - 设置链接地址的过期时间，单位是秒，默认值是 300 秒，最长不能超过取值范围为 1 ~ 86400 秒  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string publicURL  公网下载链接\n      * @param string internalURL  内网下载链接\n      */\n\n  describeLogDownloadURL (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeLogDownloadURL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeLogDownloadURL\"\n      )\n    }\n    if (opts.logId === undefined || opts.logId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.logId' when calling describeLogDownloadURL\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.seconds !== undefined && opts.seconds !== null) {\n      postBody['seconds'] = opts.seconds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      logId: opts.logId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLogDownloadURL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/log/{logId}:describeLogDownloadURL',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看SQL Server实例的配置参数&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dBInstanceParameter parameters\n      */\n\n  describeParameters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeParameters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeParameters\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeParameters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/parameters',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改SQL Server实例的配置参数，目前支持以下参数:max_worker_threads,max_degree_of_parallelism,max_server_memory_(MB)。 部分参数修改后，需要重启才能生效，具体可以参考微软的相关文档。&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - Instance ID\n      * @param {array} opts.parameters - 修改的实例参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyParameters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyParameters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyParameters\"\n      )\n    }\n    if (opts.parameters === undefined || opts.parameters === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameters' when calling modifyParameters\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.parameters !== undefined && opts.parameters !== null) {\n      postBody['parameters'] = opts.parameters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyParameters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/parameters',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除参数组&lt;br&gt;- 仅支持MySQL，Percona，MariaDB，PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.parameterGroupId - Parameter Group ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteParameterGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteParameterGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.parameterGroupId === undefined || opts.parameterGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameterGroupId' when calling deleteParameterGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      parameterGroupId: opts.parameterGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteParameterGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/parameterGroups/{parameterGroupId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改参数组名称，描述&lt;br&gt;- 仅支持MySQL，Percona，MariaDB，PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.parameterGroupId - Parameter Group ID\n      * @param {} opts.parameterGroupName - 参数组名称\n      * @param {} [opts.description] - 参数组描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyParameterGroupAttribute (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyParameterGroupAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.parameterGroupId === undefined || opts.parameterGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameterGroupId' when calling modifyParameterGroupAttribute\"\n      )\n    }\n    if (\n      opts.parameterGroupName === undefined ||\n      opts.parameterGroupName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameterGroupName' when calling modifyParameterGroupAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.parameterGroupName !== undefined &&\n      opts.parameterGroupName !== null\n    ) {\n      postBody['parameterGroupName'] = opts.parameterGroupName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      parameterGroupId: opts.parameterGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyParameterGroupAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/parameterGroups/{parameterGroupId}:modifyParameterGroupAttribute',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前账号下所有的参数组列表&lt;br&gt;- 仅支持MySQL，Percona，MariaDB，PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，且为10的整数倍  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param parameterGroup parameterGroups\n      * @param integer totalCount\n      */\n\n  describeParameterGroups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeParameterGroups\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeParameterGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/parameterGroups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个参数组&lt;br&gt;- 仅支持MySQL，Percona，MariaDB，PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {} opts.engine - 实例引擎类型，参见[枚举参数定义](../Enum-Definitions/Enum-Definitions.md)\n      * @param {} opts.engineVersion - 实例引擎版本，参见[枚举参数定义](../Enum-Definitions/Enum-Definitions.md)\n      * @param {} opts.parameterGroupName - 参数组的名字\n      * @param {} [opts.description] - 参数组的描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string parameterGroupId\n      */\n\n  createParameterGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createParameterGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.engine === undefined || opts.engine === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.engine' when calling createParameterGroup\"\n      )\n    }\n    if (opts.engineVersion === undefined || opts.engineVersion === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.engineVersion' when calling createParameterGroup\"\n      )\n    }\n    if (\n      opts.parameterGroupName === undefined ||\n      opts.parameterGroupName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameterGroupName' when calling createParameterGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.engine !== undefined && opts.engine !== null) {\n      postBody['engine'] = opts.engine\n    }\n    if (opts.engineVersion !== undefined && opts.engineVersion !== null) {\n      postBody['engineVersion'] = opts.engineVersion\n    }\n    if (\n      opts.parameterGroupName !== undefined &&\n      opts.parameterGroupName !== null\n    ) {\n      postBody['parameterGroupName'] = opts.parameterGroupName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createParameterGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/parameterGroups',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看参数组的参数&lt;br&gt;- 仅支持MySQL，Percona，MariaDB，PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.parameterGroupId - Parameter Group ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param parameterGroupParameter parameters\n      */\n\n  describeParameterGroupParameters (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeParameterGroupParameters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.parameterGroupId === undefined || opts.parameterGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameterGroupId' when calling describeParameterGroupParameters\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      parameterGroupId: opts.parameterGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeParameterGroupParameters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/parameterGroups/{parameterGroupId}/parameters',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改参数组的参数&lt;br&gt;- 仅支持MySQL，Percona，MariaDB，PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.parameterGroupId - Parameter Group ID\n      * @param {} opts.parameters - 修改的参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyParameterGroupParameters (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyParameterGroupParameters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.parameterGroupId === undefined || opts.parameterGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameterGroupId' when calling modifyParameterGroupParameters\"\n      )\n    }\n    if (opts.parameters === undefined || opts.parameters === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameters' when calling modifyParameterGroupParameters\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.parameters !== undefined && opts.parameters !== null) {\n      postBody['parameters'] = opts.parameters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      parameterGroupId: opts.parameterGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyParameterGroupParameters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/parameterGroups/{parameterGroupId}/parameters',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看参数的修改历史&lt;br&gt;- 仅支持MySQL，Percona，MariaDB，PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.parameterGroupId - Parameter Group ID\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，且为10的整数倍  optional\n      * @param {string} [opts.startTime] - 查询开始时间，格式为：YYYY-MM-DD HH:mm:ss  optional\n      * @param {string} [opts.endTime] - 查询结束时间，格式为：YYYY-MM-DD HH:mm:ss  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param parameterModifyRecords records\n      * @param integer totalCount\n      */\n\n  describeParameterModifyRecords (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeParameterModifyRecords\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.parameterGroupId === undefined || opts.parameterGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameterGroupId' when calling describeParameterModifyRecords\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      parameterGroupId: opts.parameterGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeParameterModifyRecords with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/parameterGroups/{parameterGroupId}/records',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  拷贝参数组\n      * @param {Object} opts - parameters\n      * @param {} opts.parameterGroupId - 参数组ID\n      * @param {} opts.parameterGroupName - 参数组的名字\n      * @param {} [opts.description] - 参数组的描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string parameterGroupId\n      */\n\n  copyParameterGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  copyParameterGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.parameterGroupId === undefined || opts.parameterGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameterGroupId' when calling copyParameterGroup\"\n      )\n    }\n    if (\n      opts.parameterGroupName === undefined ||\n      opts.parameterGroupName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameterGroupName' when calling copyParameterGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.parameterGroupId !== undefined && opts.parameterGroupId !== null) {\n      postBody['parameterGroupId'] = opts.parameterGroupId\n    }\n    if (\n      opts.parameterGroupName !== undefined &&\n      opts.parameterGroupName !== null\n    ) {\n      postBody['parameterGroupName'] = opts.parameterGroupName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call copyParameterGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/parameterGroups:copyParameterGroup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看参数组绑定的云数据库实例&lt;br&gt;- 仅支持MySQL，Percona，MariaDB，PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.parameterGroupId - Parameter Group ID\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，且为10的整数倍  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param attachedDBInstance instances\n      * @param integer totalCount\n      */\n\n  describeParameterGroupAttachedInstances (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeParameterGroupAttachedInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.parameterGroupId === undefined || opts.parameterGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameterGroupId' when calling describeParameterGroupAttachedInstances\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      parameterGroupId: opts.parameterGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeParameterGroupAttachedInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/parameterGroups/{parameterGroupId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据用户定义的查询条件，获取索引性能的统计信息，并提供缺失索引及索引创建建议。用户可以根据这些信息查找与索引相关的性能瓶颈，并进行优化。&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.queryType - 查询类型，不同的查询类型按照相应的字段从高到低返回结果。&lt;br&gt;支持如下类型：&lt;br&gt;Missing：缺失索引&lt;br&gt;Size：索引大小，单位KB&lt;br&gt;Updates：索引更新次数&lt;br&gt;Scans：表扫描次数&lt;br&gt;Used：最少使用&lt;br&gt;\n      * @param {string} [opts.db] - 需要查询的数据库名，多个数据库名之间用英文逗号分隔，默认所有数据库  optional\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞]。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为50，取值范围：[1,100]，只能为10的倍数，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param missingIndexResult missingIndexResult\n      * @param indexPerformanceResult indexPerformanceResult\n      * @param integer totalCount  总记录条数\n      * @param integer pageNumber  当前数据的页码\n      * @param integer pageSize  每页显示的数据条数\n      */\n\n  describeIndexPerformance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIndexPerformance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeIndexPerformance\"\n      )\n    }\n    if (opts.queryType === undefined || opts.queryType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryType' when calling describeIndexPerformance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.queryType !== undefined && opts.queryType !== null) {\n      queryParams['queryType'] = opts.queryType\n    }\n    if (opts.db !== undefined && opts.db !== null) {\n      queryParams['db'] = opts.db\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIndexPerformance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/performance:describeIndexPerformance',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据用户定义的查询条件，获取SQL执行的性能统计信息，例如慢SQL等。用户可以根据这些信息查找与SQL执行相关的性能瓶颈，并进行优化。&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.queryType - 查询类型，不同的查询类型按照相应的字段从高到低返回结果。&lt;br&gt;支持如下类型：&lt;br&gt;ExecutionCount：执行次数&lt;br&gt;LastRows：上次返回行数&lt;br&gt;ElapsedTime：平均执行时间&lt;br&gt;CPUTime：平均CPU时间&lt;br&gt;LogicalReads：平均逻辑读&lt;br&gt;LogicalWrites：平均逻辑写&lt;br&gt;PhysicalReads：平均物理读&lt;br&gt;\n      * @param {integer} [opts.threshold] - 只返回查询条件大于等于threshold的记录，默认为0  optional\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,1000]。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为50，取值范围：[1,100]，只能为10的倍数，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param queryPerformanceResult queryPerformanceResult\n      * @param integer totalCount  总记录条数\n      * @param integer pageNumber  当前数据的页码\n      * @param integer pageSize  每页显示的数据条数\n      */\n\n  describeQueryPerformance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQueryPerformance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeQueryPerformance\"\n      )\n    }\n    if (opts.queryType === undefined || opts.queryType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryType' when calling describeQueryPerformance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.queryType !== undefined && opts.queryType !== null) {\n      queryParams['queryType'] = opts.queryType\n    }\n    if (opts.threshold !== undefined && opts.threshold !== null) {\n      queryParams['threshold'] = opts.threshold\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQueryPerformance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/performance:describeQueryPerformance',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询MySQL实例的慢日志的详细信息。&lt;br&gt;- 仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.startTime - 慢日志开始时间，格式为：YYYY-MM-DD HH:mm:ss，开始时间到当前时间不能大于 7 天, 开始时间不能大于结束时间\n      * @param {string} opts.endTime - 慢日志结束时间，格式为：YYYY-MM-DD HH:mm:ss，开始时间到当前时间不能大于 7 天, 开始时间不能大于结束时间\n      * @param {string} [opts.dbName] - 废弃字段，查询哪个数据库的慢日志，不填表示返回所有数据库的慢日志。  optional\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞]。pageNumber为-1时，返回所有数据页码  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - 过滤参数，多个过滤参数之间的关系为“与”(and支持以下属性的过滤(默认等值)：)\n- account：实例账号名，operator仅支持eq或者in\n- keyword：SQL 关键词，模糊查询，operator仅支持eq或者in\n  optional\n      * @param {sort} [opts.sorts] - 慢日志明细的排序规则，不指定时按上报日志的时间戳降序返回所有的日志  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param slowLogAttributes slowLogsAttributes\n      * @param integer totalCount  总记录条数\n      */\n\n  describeSlowLogAttributes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSlowLogAttributes\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeSlowLogAttributes\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeSlowLogAttributes\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeSlowLogAttributes\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      queryParams['dbName'] = opts.dbName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSlowLogAttributes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/performance:describeSlowLogAttributes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询MySQL实例的慢日志的概要信息。&lt;br&gt;- 仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.startTime - 慢日志开始时间，格式为：YYYY-MM-DD HH:mm:ss，开始时间到当前时间不能大于 7 天，开始时间不能大于结束时间\n      * @param {string} opts.endTime - 慢日志结束时间，格式为：YYYY-MM-DD HH:mm:ss，开始时间到当前时间不能大于 7 天，开始时间不能大于结束时间\n      * @param {string} [opts.dbName] - 废弃字段，查询哪个数据库的慢日志，不填表示返回所有数据库的慢日志  optional\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞]。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - 过滤参数，多个过滤参数之间的关系为“与”(and支持以下属性的过滤(默认等值)：)\n- account：实例账号名，operator仅支持eq或者in\n- keyword：SQL 关键词，模糊查询，operator仅支持eq或者in\n  optional\n      * @param {sort} [opts.sorts] - 排序参数，支持rowsExaminedSum、rowsSentSum、lockTimeSum、executionCount、executionTimeSum  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param slowLogDigest slowLogs\n      * @param integer totalCount  总记录条数\n      */\n\n  describeSlowLogs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSlowLogs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeSlowLogs\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeSlowLogs\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeSlowLogs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      queryParams['dbName'] = opts.dbName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSlowLogs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/performance:describeSlowLogs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据用户定义的查询条件，获取正在执行中的SQL执行的性能信息。用户可以根据这些信息查找与SQL执行相关的性能瓶颈，并进行优化。&lt;br&gt;- 仅支持SQL Server\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} [opts.db] - 需要查询的数据库名，多个数据库名之间用英文逗号分隔，默认所有数据库  optional\n      * @param {integer} [opts.threshold] - 返回执行时间大于等于threshold的记录，默认10，单位秒  optional\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞]。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为50，取值范围：[1,100]，只能为10的倍数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param activeQueryPerformanceResult activeQueryPerformanceResult\n      * @param integer totalCount  总记录条数\n      * @param integer pageNumber  当前数据的页码\n      * @param integer pageSize  每页显示的数据条数\n      */\n\n  describeActiveQueryPerformance (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeActiveQueryPerformance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeActiveQueryPerformance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.db !== undefined && opts.db !== null) {\n      queryParams['db'] = opts.db\n    }\n    if (opts.threshold !== undefined && opts.threshold !== null) {\n      queryParams['threshold'] = opts.threshold\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeActiveQueryPerformance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/performance:describeActiveQueryPerformance',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询错误日志的概要信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.startTime - 错误日志开始时间，格式为：YYYY-MM-DD HH:mm:ss，开始时间到当前时间不能大于 7 天，开始时间不能大于结束时间，结束时间不能大于当前时间\n      * @param {string} opts.endTime - 错误日志结束时间，格式为：YYYY-MM-DD HH:mm:ss，开始时间到当前时间不能大于 7 天，开始时间不能大于结束时间，结束时间不能大于当前时间\n      * @param {string} [opts.dbName] - 查询哪个数据库的慢日志，不填表示返回所有数据库的错误日志。&lt;br&gt;- MySQL不支持  optional\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞]。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为50，取值范围：[1,100]，只能为10的倍数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param errorLogDigest errorLogs\n      * @param integer totalCount  总记录条数\n      */\n\n  describeErrorLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeErrorLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeErrorLog\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeErrorLog\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeErrorLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      queryParams['dbName'] = opts.dbName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeErrorLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/performance:describeErrorLog',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看RDS读写分离代理列表&lt;br&gt;- 仅支持MySQL、PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS实例ID，唯一标识一个实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param readWriteProxy readWriteProxies\n      * @param integer totalCount\n      */\n\n  describeReadWriteProxies (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeReadWriteProxies\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeReadWriteProxies\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeReadWriteProxies with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/readWriteProxy',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建数据库读写分离代理服务&lt;br&gt;- 仅支持MySQL、PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {} opts.instanceId - RDS 实例ID\n      * @param {} [opts.delayThreshold] - 延迟阈值，范围是1~1000，单位：秒，默认为100，仅MySQL  optional\n      * @param {} [opts.walDelayThreshold] - wal日志延迟阈值，范围是1~1024，单位：MB，默认为200，仅PostgreSQL  optional\n      * @param {} [opts.loadBalancerPolicy] - 读写分离代理后端实例负载均衡策略，默认值为LEAST_CURRENT_OPERATIONS；当前支持的负载均衡策略请查看[枚举参数定义](../Enum-Definitions/Enum-Definitions.md)  optional\n      * @param {} [opts.healthCheckSpec] - 后端实例健康检查配置  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string readWriteProxyId  RDS 读写分离代理服务ID\n      */\n\n  createReadWriteProxy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createReadWriteProxy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createReadWriteProxy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.delayThreshold !== undefined && opts.delayThreshold !== null) {\n      postBody['delayThreshold'] = opts.delayThreshold\n    }\n    if (\n      opts.walDelayThreshold !== undefined &&\n      opts.walDelayThreshold !== null\n    ) {\n      postBody['walDelayThreshold'] = opts.walDelayThreshold\n    }\n    if (\n      opts.loadBalancerPolicy !== undefined &&\n      opts.loadBalancerPolicy !== null\n    ) {\n      postBody['loadBalancerPolicy'] = opts.loadBalancerPolicy\n    }\n    if (opts.healthCheckSpec !== undefined && opts.healthCheckSpec !== null) {\n      postBody['healthCheckSpec'] = opts.healthCheckSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createReadWriteProxy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/readWriteProxy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看指定RDS读写分离代理详情&lt;br&gt;- 仅支持MySQL、PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.readWriteProxyId - 读写分离代理服务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param readWriteProxy readWriteProxy\n      */\n\n  describeReadWriteProxyAttribute (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeReadWriteProxyAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.readWriteProxyId === undefined || opts.readWriteProxyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.readWriteProxyId' when calling describeReadWriteProxyAttribute\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      readWriteProxyId: opts.readWriteProxyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeReadWriteProxyAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/readWriteProxy/{readWriteProxyId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除RDS 实例的读写分离代理&lt;br&gt;- 仅支持MySQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.readWriteProxyId - 读写分离代理服务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteReadWriteProxy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteReadWriteProxy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.readWriteProxyId === undefined || opts.readWriteProxyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.readWriteProxyId' when calling deleteReadWriteProxy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      readWriteProxyId: opts.readWriteProxyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteReadWriteProxy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/readWriteProxy/{readWriteProxyId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启读写分离代理服务的外网访问功能。开启后，用户可以通过 internet 连接读写分离代理服务&lt;br&gt;- 仅支持MySQL、PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.readWriteProxyId - 读写分离代理服务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableReadWriteProxyInternetAccess (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableReadWriteProxyInternetAccess\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.readWriteProxyId === undefined || opts.readWriteProxyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.readWriteProxyId' when calling enableReadWriteProxyInternetAccess\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      readWriteProxyId: opts.readWriteProxyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableReadWriteProxyInternetAccess with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/readWriteProxy/{readWriteProxyId}:enableReadWriteProxyInternetAccess',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭读写分离代理服务的外网访问功能。关闭后，用户无法通过 Internet 连接读写分离代理服务，但可以在京东云内网通过内网域名连接&lt;br&gt;- 仅支持MySQL、PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.readWriteProxyId - 读写分离代理服务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableReadWriteProxyInternetAccess (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableReadWriteProxyInternetAccess\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.readWriteProxyId === undefined || opts.readWriteProxyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.readWriteProxyId' when calling disableReadWriteProxyInternetAccess\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      readWriteProxyId: opts.readWriteProxyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableReadWriteProxyInternetAccess with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/readWriteProxy/{readWriteProxyId}:disableReadWriteProxyInternetAccess',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改数据库读写分离代理服务配置&lt;br&gt;- 仅支持MySQL、PostgreSQL\n      * @param {Object} opts - parameters\n      * @param {string} opts.readWriteProxyId - 读写分离代理服务ID\n      * @param {} [opts.delayThreshold] - 延迟阈值，范围是1~1000，单位：秒，默认为100，仅MySQL  optional\n      * @param {} [opts.walDelayThreshold] - wal日志延迟阈值，范围是1~1024，单位：MB，默认为200，仅PostgreSQL  optional\n      * @param {} [opts.loadBalancerPolicy] - 读写分离代理后端实例负载均衡策略，默认值为LEAST_CURRENT_OPERATIONS；当前支持的负载均衡策略请查看[枚举参数定义](../Enum-Definitions/Enum-Definitions.md)  optional\n      * @param {} [opts.healthCheckSpec] - 后端实例健康检查配置  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyReadWriteProxy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyReadWriteProxy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.readWriteProxyId === undefined || opts.readWriteProxyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.readWriteProxyId' when calling modifyReadWriteProxy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.delayThreshold !== undefined && opts.delayThreshold !== null) {\n      postBody['delayThreshold'] = opts.delayThreshold\n    }\n    if (\n      opts.walDelayThreshold !== undefined &&\n      opts.walDelayThreshold !== null\n    ) {\n      postBody['walDelayThreshold'] = opts.walDelayThreshold\n    }\n    if (\n      opts.loadBalancerPolicy !== undefined &&\n      opts.loadBalancerPolicy !== null\n    ) {\n      postBody['loadBalancerPolicy'] = opts.loadBalancerPolicy\n    }\n    if (opts.healthCheckSpec !== undefined && opts.healthCheckSpec !== null) {\n      postBody['healthCheckSpec'] = opts.healthCheckSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      readWriteProxyId: opts.readWriteProxyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyReadWriteProxy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/readWriteProxy/{readWriteProxyId}:modifyReadWriteProxy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前实例的指定库的表列表信息 - 仅支持 MySQL，Percona，MariaDB\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.dbName - 库名称\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为100，取值范围：[10,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string tables\n      * @param integer totalCount\n      */\n\n  describeTables (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTables\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeTables\"\n      )\n    }\n    if (opts.dbName === undefined || opts.dbName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbName' when calling describeTables\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      dbName: opts.dbName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTables with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/databases/{dbName}/tables',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看当前实例是否开启TDE\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  当前实例是否已经开启TDE功能，如已开启，返回true；如未开启，返回false；开启中，返回pending；已开启未生效时返回inProgress\n      * @param statusDetail statusDetail  TDE加密已开启未生效时返回实例重启状态的详细进度；TDE加密已开启未生效或未开启时返回空;&lt;当实例类型为MySQL时有效&gt;\n      */\n\n  describeTde (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTde\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeTde\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTde with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/tde',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启数据库的TDE功能\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableTde (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableTde\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableTde\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableTde with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/tde:enableTde',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看RDS实例当前白名单。白名单是允许访问当前实例的IP/IP段列表，缺省情况下，白名单对本VPC开放。如果用户开启了外网访问的功能，还需要对外网的IP配置白名单。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param whiteList whiteLists\n      */\n\n  describeWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeWhiteList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/whiteList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个白名单分组并设置白名单允许访问的IP，仅MySQL、Percona、MariaDB支持。修改允许访问实例的IP白名单。白名单是允许访问当前实例的IP/IP段列表，缺省情况下，白名单对本VPC开放。如果用户开启了外网访问的功能，还需要对外网的IP配置白名单。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.whiteListName - 白名单名称\n      * @param {} opts.ips - IP或IP段，不同的IP/IP段之间用英文逗号分隔，例如0.0.0.0/0,192.168.0.10\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createWhiteListGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createWhiteListGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createWhiteListGroup\"\n      )\n    }\n    if (opts.whiteListName === undefined || opts.whiteListName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.whiteListName' when calling createWhiteListGroup\"\n      )\n    }\n    if (opts.ips === undefined || opts.ips === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ips' when calling createWhiteListGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.whiteListName !== undefined && opts.whiteListName !== null) {\n      postBody['whiteListName'] = opts.whiteListName\n    }\n    if (opts.ips !== undefined && opts.ips !== null) {\n      postBody['ips'] = opts.ips\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createWhiteListGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/whiteList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改允许访问实例的IP白名单。白名单是允许访问当前实例的IP/IP段列表，缺省情况下，白名单对本VPC开放。如果用户开启了外网访问的功能，还需要对外网的IP配置白名单。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} [opts.whiteListName] - 白名单名称，默认Default  optional\n      * @param {} opts.ips - IP或IP段，不同的IP/IP段之间用英文逗号分隔，例如0.0.0.0/0,192.168.0.10\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyWhiteList\"\n      )\n    }\n    if (opts.ips === undefined || opts.ips === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ips' when calling modifyWhiteList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.whiteListName !== undefined && opts.whiteListName !== null) {\n      postBody['whiteListName'] = opts.whiteListName\n    }\n    if (opts.ips !== undefined && opts.ips !== null) {\n      postBody['ips'] = opts.ips\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/whiteList',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  当该白名单分组用户无需使用时，可进行删除。仅适用于MySQL、Percona、MariaDB。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.whiteListName - 白名单名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteWhiteListGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteWhiteListGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteWhiteListGroup\"\n      )\n    }\n    if (opts.whiteListName === undefined || opts.whiteListName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.whiteListName' when calling deleteWhiteListGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.whiteListName !== undefined && opts.whiteListName !== null) {\n      queryParams['whiteListName'] = opts.whiteListName\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rds/1.3.4'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteWhiteListGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/whiteList',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = RDS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/rdts/v2/rdts.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * operation\n * 查询异步请求结果\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'rdts'\nService._services[serviceId] = true\n\n/**\n * rdts service.\n * @version 2.5.3\n */\n\nclass RDTS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'rdts.jdcloud-api.com'\n    options.basePath = '/v2' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  迁移任务列表，可分页、可排序、可搜索、可过滤\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码：取值范围[1,∞)，默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小：取值范围[10,100]，默认为10  optional\n      * @param {filter} [opts.filters] - 过滤条件：\n- instanceIds：迁移任务ID，精确匹配，可选择多个\n- migrationName：迁移任务名称，模糊匹配\n- migrationStatuses：迁移任务状态，精确匹配，可选择多个（具体可参考迁移任务详情中的迁移状态）\n  optional\n      * @param {sort} [opts.sorts] - 排序属性：\n- createdTime：按创建时间排序(asc表示按时间正序，desc表示按时间倒序)\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listItem instances\n      * @param integer totalCount  迁移任务总数\n      */\n\n  describeMigrations (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMigrations\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rdts/2.5.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMigrations with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个迁移任务，指定并校验迁移配置\n      * @param {Object} opts - parameters\n      * @param {migrateConfig} opts.migrateConfig - 迁移配置，创建成功后可修改\n      * @param {azAndNetConfig} [opts.azAndNetConfig] - 可用区与网络配置，创建成功后不能修改  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId  迁移任务ID\n      */\n\n  createMigration (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createMigration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.migrateConfig === undefined || opts.migrateConfig === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.migrateConfig' when calling createMigration\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.migrateConfig !== undefined && opts.migrateConfig !== null) {\n      postBody['migrateConfig'] = opts.migrateConfig\n    }\n    if (opts.azAndNetConfig !== undefined && opts.azAndNetConfig !== null) {\n      postBody['azAndNetConfig'] = opts.azAndNetConfig\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rdts/2.5.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createMigration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询迁移任务详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 迁移任务的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instance  迁移任务详请\n      */\n\n  describeMigration (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMigration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeMigration\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rdts/2.5.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMigration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改并验证迁移配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 迁移任务的唯一标识\n      * @param {migrateConfig} [opts.migrateConfig] - 迁移配置参数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyMigration (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyMigration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyMigration\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.migrateConfig !== undefined && opts.migrateConfig !== null) {\n      postBody['migrateConfig'] = opts.migrateConfig\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rdts/2.5.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyMigration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除迁移任务，迁移中的任务不能删除，迁移代理有流量不能删除\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 迁移任务的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteMigration (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteMigration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteMigration\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rdts/2.5.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteMigration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改迁移任务名\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 迁移任务的唯一标识\n      * @param {string} [opts.migrateName] - 迁移任务名  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyMigrationName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyMigrationName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyMigrationName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.migrateName !== undefined && opts.migrateName !== null) {\n      postBody['migrateName'] = opts.migrateName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rdts/2.5.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyMigrationName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceId}:modifyMigrateName',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询迁移进度及数据校验状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 迁移任务的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param migrateProgress migrationProgress  迁移进度\n      */\n\n  getMigrationProgress (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getMigrationProgress\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling getMigrationProgress\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rdts/2.5.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getMigrationProgress with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceId}:getMigrationProgress',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建迁移job，创建job之后无法修改迁移配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 迁移任务的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createMigrationJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createMigrationJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createMigrationJob\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rdts/2.5.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createMigrationJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceId}:start',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动迁移job，开始迁移数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 迁移任务的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startMigrationJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startMigrationJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling startMigrationJob\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rdts/2.5.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startMigrationJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceId}:migrate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  如果迁移超时、迁移失败，可重新迁移\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 迁移任务的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restartMigrationJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restartMigrationJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling restartMigrationJob\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rdts/2.5.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restartMigrationJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceId}:remigrate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = RDTS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/redis/v1/redis.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Redis SpecConfig API\n * 缓存Redis实例规格配置接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'redis'\nService._services[serviceId] = true\n\n/**\n * redis service.\n * @version 2.6.32\n */\n\nclass REDIS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'redis.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询支持的地域列表\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param availableRegion availableRegions\n      */\n\n  describeAvailableRegion (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAvailableRegion\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAvailableRegion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/availableRegion',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询支持的规格列表\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param availableResource availableResources\n      */\n\n  describeAvailableResource (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAvailableResource\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAvailableResource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/availableResource',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询支持的规格列表\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param availableResource availableResources\n      */\n\n  describeAvailableResource2 (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAvailableResource2\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAvailableResource2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/availableResource2',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询缓存Redis实例列表，可分页、可排序、可搜索、可过滤\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码：取值范围[1,∞)，默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小：取值范围[10, 100]，默认为10  optional\n      * @param {filter} [opts.filters] - 过滤属性：\ncacheInstanceId - 实例Id，精确匹配，可选择多个\ncacheInstanceName - 实例名称，模糊匹配\ncacheInstanceStatus - 实例状态，精确匹配，可选择多个(running：运行中，error：错误，creating：创建中，changing：变配中，configuring：参数修改中，restoring：备份恢复中，deleting：删除中)\nredisVersion - redis引擎版本，精确匹配，可选择2.8和4.0\ninstanceType - 实例类型，精确匹配（redis表示主从版，redis_cluster表示集群版）\nchargeMode - 计费类型，精确匹配（prepaid_by_duration表示包年包月预付费，postpaid_by_duration表示按配置后付费）\n  optional\n      * @param {tagFilter} [opts.tagFilters] - 标签的过滤条件  optional\n      * @param {sort} [opts.sorts] - 排序属性：\ncreateTime - 按创建时间排序(asc表示按时间正序，desc表示按时间倒序)\n  optional\n      * @param {string} [opts.resourceGroupIds]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cacheInstance cacheInstances\n      * @param integer totalCount  实例总数\n      */\n\n  describeCacheInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCacheInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(\n      queryParams,\n      super.buildTagFilterParam(opts.tagFilters, 'tagFilters')\n    )\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.resourceGroupIds, 'resourceGroupIds')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCacheInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个指定配置的缓存Redis实例：可选择版本、类型、规格（按CPU核数、内存容量、磁盘容量、带宽等划分），自定义分片规格可通过describeSpecConfig接口获取，老规格代码请参考，https://docs.jdcloud.com/cn/jcs-for-redis/specifications\n\n      * @param {Object} opts - parameters\n      * @param {cacheInstanceSpec} opts.cacheInstance - 实例的创建参数\n      * @param {chargeSpec} [opts.charge] - 实例的计费类型  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string cacheInstanceId  实例ID\n      * @param string orderNum  订单编号\n      * @param string buyId  购买ID\n      */\n\n  createCacheInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createCacheInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstance === undefined || opts.cacheInstance === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstance' when calling createCacheInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.cacheInstance !== undefined && opts.cacheInstance !== null) {\n      postBody['cacheInstance'] = opts.cacheInstance\n    }\n    if (opts.charge !== undefined && opts.charge !== null) {\n      postBody['charge'] = opts.charge\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCacheInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询缓存Redis实例的详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cacheInstance cacheInstance  实例的详细信息\n      */\n\n  describeCacheInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCacheInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeCacheInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCacheInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改缓存Redis实例的资源名称或描述，二者至少选一\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} [opts.cacheInstanceName] - 实例的名称，名称只支持数字、字母、英文下划线、中文，且不少于2字符不超过32字符  optional\n      * @param {string} [opts.cacheInstanceDescription] - 实例的描述，不能超过256个字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyCacheInstanceAttribute (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyCacheInstanceAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling modifyCacheInstanceAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.cacheInstanceName !== undefined &&\n      opts.cacheInstanceName !== null\n    ) {\n      postBody['cacheInstanceName'] = opts.cacheInstanceName\n    }\n    if (\n      opts.cacheInstanceDescription !== undefined &&\n      opts.cacheInstanceDescription !== null\n    ) {\n      postBody['cacheInstanceDescription'] = opts.cacheInstanceDescription\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyCacheInstanceAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除按配置计费、或包年包月已到期的缓存Redis实例，包年包月未到期不可删除。\n只有处于运行running或者错误error状态才可以删除，其余状态不可以删除。\n白名单用户不能删除包年包月已到期的缓存Redis实例。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCacheInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteCacheInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling deleteCacheInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCacheInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  变更缓存Redis实例规格（变配），实例运行时可以变配，新规格不能与之前的老规格相同，新规格内存大小不能小于实例的已使用内存\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.cacheInstanceClass - 新规格\n      * @param {integer} [opts.shardNumber] - 自定义分片数，只对自定义分片规格实例有效  optional\n      * @param {boolean} [opts.parallel] - 是否开启4.0集群并行变配  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string orderNum  订单编号\n      * @param string buyId  购买ID\n      */\n\n  modifyCacheInstanceClass (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyCacheInstanceClass\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling modifyCacheInstanceClass\"\n      )\n    }\n    if (\n      opts.cacheInstanceClass === undefined ||\n      opts.cacheInstanceClass === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceClass' when calling modifyCacheInstanceClass\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.cacheInstanceClass !== undefined &&\n      opts.cacheInstanceClass !== null\n    ) {\n      postBody['cacheInstanceClass'] = opts.cacheInstanceClass\n    }\n    if (opts.shardNumber !== undefined && opts.shardNumber !== null) {\n      postBody['shardNumber'] = opts.shardNumber\n    }\n    if (opts.parallel !== undefined && opts.parallel !== null) {\n      postBody['parallel'] = opts.parallel\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyCacheInstanceClass with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}:modifyCacheInstanceClass',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询缓存Red4.0实例是否支持新变配功能，是否支持并行变配, 变配需要的IP数量及变配预估时间\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} [opts.cacheInstanceClass] - 新规格。不传参只返回是否支持新变配功能。  optional\n      * @param {integer} [opts.shardNumber] - 自定义分片数。不传参只返回是否支持新变配功能。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean supportPScale  是否支持新变配\n      * @param boolean supportParallel  是否支持并行变配\n      * @param integer serialIpCount  串行变配需要的IP数量\n      * @param integer serialTimeCost  串行变配预估时间\n      * @param integer parallelIpCount  并行变配需要的IP数量\n      * @param integer parallelTimeCost  并行变配预估时间\n      */\n\n  describeResizeModeIpTimeInfo (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeResizeModeIpTimeInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeResizeModeIpTimeInfo\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.cacheInstanceClass !== undefined &&\n      opts.cacheInstanceClass !== null\n    ) {\n      postBody['cacheInstanceClass'] = opts.cacheInstanceClass\n    }\n    if (opts.shardNumber !== undefined && opts.shardNumber !== null) {\n      postBody['shardNumber'] = opts.shardNumber\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeResizeModeIpTimeInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/describeResizeModeIpTimeInfo',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改缓存Redis实例的密码，可为空\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} [opts.password] - 密码，为空即为免密，不少于8字符不超过16字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resetCacheInstancePassword (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resetCacheInstancePassword\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling resetCacheInstancePassword\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.password !== undefined && opts.password !== null) {\n      postBody['password'] = opts.password\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resetCacheInstancePassword with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}:resetCacheInstancePassword',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看缓存Redis实例的当前配置参数\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string unSupportConfigs\n      * @param configItem instanceConfig\n      */\n\n  describeInstanceConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeInstanceConfig\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/instanceConfig',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改缓存Redis实例的配置参数，支持部分配置参数修改\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {array} opts.instanceConfig - 配置参数名和参数值\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling modifyInstanceConfig\"\n      )\n    }\n    if (opts.instanceConfig === undefined || opts.instanceConfig === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceConfig' when calling modifyInstanceConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceConfig !== undefined && opts.instanceConfig !== null) {\n      postBody['instanceConfig'] = opts.instanceConfig\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/instanceConfig',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取自动缓存分析时间\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string time  -表示为关闭，HH:mm-HH:mm 时区，例如&quot;01:00-02:00 +0800&quot;，表示东八区的1点到2点\n      */\n\n  describeAnalysisTime (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAnalysisTime\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeAnalysisTime\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAnalysisTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/analysisTime',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置自动缓存分析时间\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.analysisTime - 自动缓存分析时间，设置为-表示关闭，否则为：HH:mm-HH:mm 时区，例如&quot;01:00-02:00 +0800&quot;，表示东八区的1点到2点\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyAnalysisTime (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyAnalysisTime\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling modifyAnalysisTime\"\n      )\n    }\n    if (opts.analysisTime === undefined || opts.analysisTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.analysisTime' when calling modifyAnalysisTime\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.analysisTime !== undefined && opts.analysisTime !== null) {\n      postBody['analysisTime'] = opts.analysisTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyAnalysisTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/analysisTime',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询缓存分析任务列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.date - 格式:yyyy-MM-dd,表示查询某一天的缓存分析列表\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cacheAnalysis analyses\n      */\n\n  describeCacheAnalysisList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCacheAnalysisList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeCacheAnalysisList\"\n      )\n    }\n    if (opts.date === undefined || opts.date === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.date' when calling describeCacheAnalysisList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.date !== undefined && opts.date !== null) {\n      queryParams['date'] = opts.date\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCacheAnalysisList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/cacheAnalysis',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建缓存分析任务，一天最多创建12次分析任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} [opts.sizeMode] - 计算大key的方式。若为elementCounts，则使用元素个数计算大key；若为memorySize，则使用内存大小计算大key。默认为memorySize。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createCacheAnalysis (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createCacheAnalysis\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling createCacheAnalysis\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sizeMode !== undefined && opts.sizeMode !== null) {\n      postBody['sizeMode'] = opts.sizeMode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCacheAnalysis with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/cacheAnalysis',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询缓存分析任务详情，最多查询到30天前的数据\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.taskId - 任务ID，即request ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime  任务开始时间, rfc3339格式\n      * @param string finishTime  任务结束时间, rfc3339格式\n      * @param integer analysisType  任务类型，0:手动分析，1自动分析\n      * @param redisKey stringBigKeys\n      * @param redisKey otherBigKeys\n      * @param redisKey hotKeys\n      * @param redisCmd cmdCallTimesTop\n      * @param redisCmd cmdUseCpuTop\n      * @param object keyTypeDistribution  key的类型分布\n      * @param object keySizeDistribution  key的大小分布\n      */\n\n  describeCacheAnalysisResult (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeCacheAnalysisResult\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeCacheAnalysisResult\"\n      )\n    }\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling describeCacheAnalysisResult\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCacheAnalysisResult with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/cacheAnalysis/{taskId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询当前客户端IP列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ips ips\n      */\n\n  describeClientList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeClientList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeClientList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeClientList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/clientList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定客户端IP的连接详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.ip - 客户端IP\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param details details\n      */\n\n  describeClientIpDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeClientIpDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeClientIpDetail\"\n      )\n    }\n    if (opts.ip === undefined || opts.ip === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ip' when calling describeClientIpDetail\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ip !== undefined && opts.ip !== null) {\n      postBody['ip'] = opts.ip\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeClientIpDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/clientIpDetail',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询缓存Redis实例的备份任务（文件）列表，可分页、可指定起止时间或备份任务ID\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} [opts.startTime] - 开始时间  optional\n      * @param {string} [opts.endTime] - 结束时间  optional\n      * @param {string} [opts.baseId] - 备份任务ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param backup backups\n      * @param integer totalCount  备份任务（文件）总数\n      */\n\n  describeBackups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackups\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeBackups\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.baseId !== undefined && opts.baseId !== null) {\n      queryParams['baseId'] = opts.baseId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/backup',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建并执行缓存Redis实例的备份任务，只能为手动备份，可设置备份文件名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.fileName - 备份文件名称，只支持英文数字和下划线的组合，长度不超过32个字符\n      * @param {integer} opts.backupType - 备份类型：手动备份为1，只能为手动备份\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string baseId  本次备份任务ID，可用于查询本次备份任务的结果\n      */\n\n  createBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling createBackup\"\n      )\n    }\n    if (opts.fileName === undefined || opts.fileName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileName' when calling createBackup\"\n      )\n    }\n    if (opts.backupType === undefined || opts.backupType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupType' when calling createBackup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.fileName !== undefined && opts.fileName !== null) {\n      postBody['fileName'] = opts.fileName\n    }\n    if (opts.backupType !== undefined && opts.backupType !== null) {\n      postBody['backupType'] = opts.backupType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/backup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询缓存Redis实例的自动备份策略\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean autoBackup  是否开启自动备份，true表示开启，false表示关闭\n      * @param string backupPeriod  备份周期，包括：Monday，Tuesday，Wednesday，Thursday，Friday，Saturday，Sunday，多个用逗号分隔\n      * @param string backupTime  备份时间，格式为：HH:mm-HH:mm 时区，例如&quot;01:00-02:00 +0800&quot;，表示东八区的1点到2点\n      * @param string nextBackupTime  下次自动备份时间段，ISO 8601标准的UTC时间，格式为：YYYY-MM-DDTHH:mm:ssZ~YYYY-MM-DDTHH:mm:ssZ\n      */\n\n  describeBackupPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackupPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeBackupPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackupPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/backupPolicy',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启或更新缓存Redis实例的自动备份策略，可修改备份周期和备份时间\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {boolean} [opts.autoBackup] - 是否开启自动备份，true表示开启，false表示关闭  optional\n      * @param {string} opts.backupTime - 设置自动备份时间，格式为：HH:mm-HH:mm 时区，例如&quot;01:00-02:00 +0800&quot;，表示东八区的1点到2点\n      * @param {string} opts.backupPeriod - 备份周期，包括：Monday，Tuesday，Wednesday，Thursday，Friday，Saturday，Sunday，多个用逗号分隔\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyBackupPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBackupPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling modifyBackupPolicy\"\n      )\n    }\n    if (opts.backupTime === undefined || opts.backupTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupTime' when calling modifyBackupPolicy\"\n      )\n    }\n    if (opts.backupPeriod === undefined || opts.backupPeriod === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupPeriod' when calling modifyBackupPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.autoBackup !== undefined && opts.autoBackup !== null) {\n      postBody['autoBackup'] = opts.autoBackup\n    }\n    if (opts.backupTime !== undefined && opts.backupTime !== null) {\n      postBody['backupTime'] = opts.backupTime\n    }\n    if (opts.backupPeriod !== undefined && opts.backupPeriod !== null) {\n      postBody['backupPeriod'] = opts.backupPeriod\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBackupPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/backupPolicy',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  恢复缓存Redis实例的某次备份\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.baseId - 备份任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restoreInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restoreInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling restoreInstance\"\n      )\n    }\n    if (opts.baseId === undefined || opts.baseId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.baseId' when calling restoreInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.baseId !== undefined && opts.baseId !== null) {\n      postBody['baseId'] = opts.baseId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restoreInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/restore',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取缓存Redis实例的备份文件临时下载地址（1个小时有效期）\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.baseId - 备份任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param downloadUrl downloadUrls\n      */\n\n  describeDownloadUrl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDownloadUrl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeDownloadUrl\"\n      )\n    }\n    if (opts.baseId === undefined || opts.baseId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.baseId' when calling describeDownloadUrl\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.baseId !== undefined && opts.baseId !== null) {\n      queryParams['baseId'] = opts.baseId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDownloadUrl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/backup:describeDownloadUrl',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询Redis实例的集群内部信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param clusterInfo info  集群内部信息\n      */\n\n  describeClusterInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeClusterInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeClusterInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeClusterInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/clusterInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取Redis实例的IP白名单（只有白名单内的IP、网络才能访问该实例）\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string ipWhiteList\n      */\n\n  describeIpWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIpWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeIpWhiteList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIpWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/ipWhiteList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改Redis实例的IP白名单\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {array} [opts.ipWhiteList] - 修改后的IP白名单列表，IP格式为CIDR表示法（x.x.x.x/x），0.0.0.0/0表示任何IP、网络都可以访问  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyIpWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyIpWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling modifyIpWhiteList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ipWhiteList !== undefined && opts.ipWhiteList !== null) {\n      postBody['ipWhiteList'] = opts.ipWhiteList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyIpWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/ipWhiteList',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取缓存Redis实例的慢查询日志，可分页、可搜索\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} [opts.startTime] - 开始时间  optional\n      * @param {string} [opts.endTime] - 结束时间  optional\n      * @param {string} [opts.shardId] - 分片id  optional\n      * @param {string} [opts.shardAddr] - 分片地址  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param slowLog slowLogs\n      * @param integer totalCount  慢查询日志总条数\n      */\n\n  describeSlowLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSlowLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeSlowLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.shardId !== undefined && opts.shardId !== null) {\n      queryParams['shardId'] = opts.shardId\n    }\n    if (opts.shardAddr !== undefined && opts.shardAddr !== null) {\n      queryParams['shardAddr'] = opts.shardAddr\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSlowLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/slowLog',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询正在执行的任务进度列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} [opts.taskType] - 任务类型：resize表示变配，upgrade表示升级  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param taskProgress taskProgresses\n      */\n\n  describeTaskProgressList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTaskProgressList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeTaskProgressList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.taskType !== undefined && opts.taskType !== null) {\n      queryParams['taskType'] = opts.taskType\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTaskProgressList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/taskProgress',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取禁用命令列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param disableCommandsInfo disableCommandLists\n      */\n\n  getDisableCommands (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDisableCommands\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling getDisableCommands\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDisableCommands with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/disableCommands',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  禁用redis命令\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {array} [opts.disableCommands] - 禁用命令列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setDisableCommands (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setDisableCommands\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling setDisableCommands\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.disableCommands !== undefined && opts.disableCommands !== null) {\n      postBody['disableCommands'] = opts.disableCommands\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setDisableCommands with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/disableCommands',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询账号信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean isSupport  是否支持账号管理功能\n      * @param accounts accountLists\n      */\n\n  describeAccounts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAccounts\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeAccounts\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAccounts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/account',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建账号\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.accountName - 账号名称\n      * @param {string} opts.accountPassword - 账号密码\n      * @param {string} [opts.accountPrivilege] - 账号权限，默认为读写权限。支持RoleReadOnly（只读权限）、RoleReadWrite（读写权限）  optional\n      * @param {string} [opts.accountDescription] - 账号描述  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling createAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling createAccount\"\n      )\n    }\n    if (opts.accountPassword === undefined || opts.accountPassword === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountPassword' when calling createAccount\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountName !== undefined && opts.accountName !== null) {\n      postBody['accountName'] = opts.accountName\n    }\n    if (opts.accountPassword !== undefined && opts.accountPassword !== null) {\n      postBody['accountPassword'] = opts.accountPassword\n    }\n    if (opts.accountPrivilege !== undefined && opts.accountPrivilege !== null) {\n      postBody['accountPrivilege'] = opts.accountPrivilege\n    }\n    if (\n      opts.accountDescription !== undefined &&\n      opts.accountDescription !== null\n    ) {\n      postBody['accountDescription'] = opts.accountDescription\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/account',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改账号信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.accountName - 账号名称\n      * @param {string} [opts.accountPassword] - 账号密码  optional\n      * @param {string} [opts.accountPrivilege] - 账号权限。支持RoleReadOnly（只读权限）、RoleReadWrite（读写权限）  optional\n      * @param {string} [opts.accountDescription] - 账号备注  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling modifyAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling modifyAccount\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountName !== undefined && opts.accountName !== null) {\n      postBody['accountName'] = opts.accountName\n    }\n    if (opts.accountPassword !== undefined && opts.accountPassword !== null) {\n      postBody['accountPassword'] = opts.accountPassword\n    }\n    if (opts.accountPrivilege !== undefined && opts.accountPrivilege !== null) {\n      postBody['accountPrivilege'] = opts.accountPrivilege\n    }\n    if (\n      opts.accountDescription !== undefined &&\n      opts.accountDescription !== null\n    ) {\n      postBody['accountDescription'] = opts.accountDescription\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/account',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除账号\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.accountName - 账号名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling deleteAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling deleteAccount\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.accountName !== undefined && opts.accountName !== null) {\n      queryParams['accountName'] = opts.accountName\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/account',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量修改账号信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {array} [opts.accounts] - 要修改的账号列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyAccounts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyAccounts\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling modifyAccounts\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accounts !== undefined && opts.accounts !== null) {\n      postBody['accounts'] = opts.accounts\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyAccounts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/accounts',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建数据清理任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.clearType - 数据清理任务类型\n      * @param {string} [opts.keyPattern] - 匹配模式, 如: test*、*test、ab*cc*, 当节点为AllData、ExpiredData时可以忽略此参数  optional\n      * @param {array} [opts.keyFilter] - key的过滤条件, 当节点为AllData、ExpiredData时可以忽略此参数  optional\n      * @param {integer} [opts.qpsLimit] - 数据遍历的速率  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startClearData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startClearData\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling startClearData\"\n      )\n    }\n    if (opts.clearType === undefined || opts.clearType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clearType' when calling startClearData\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.clearType !== undefined && opts.clearType !== null) {\n      postBody['clearType'] = opts.clearType\n    }\n    if (opts.keyPattern !== undefined && opts.keyPattern !== null) {\n      postBody['keyPattern'] = opts.keyPattern\n    }\n    if (opts.keyFilter !== undefined && opts.keyFilter !== null) {\n      postBody['keyFilter'] = opts.keyFilter\n    }\n    if (opts.qpsLimit !== undefined && opts.qpsLimit !== null) {\n      postBody['qpsLimit'] = opts.qpsLimit\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startClearData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/startClearData',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止数据清理任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopClearData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopClearData\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling stopClearData\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopClearData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/stopClearData',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询数据清理任务进度\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param clearDataTaskInfo clearDataTaskInfo\n      */\n\n  describeClearData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeClearData\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeClearData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeClearData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/describeClearData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询大key分析任务列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.date - 格式:yyyy-MM-dd,表示查询某一天的大key分析列表\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cacheAnalysis analyses\n      */\n\n  describeBigKeyList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBigKeyList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeBigKeyList\"\n      )\n    }\n    if (opts.date === undefined || opts.date === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.date' when calling describeBigKeyList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.date !== undefined && opts.date !== null) {\n      queryParams['date'] = opts.date\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBigKeyList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/bigKey',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建大key分析任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {integer} [opts.stringSize] - String类型阈值  optional\n      * @param {integer} [opts.listSize] - List类型阈值  optional\n      * @param {integer} [opts.hashSize] - Hash类型阈值  optional\n      * @param {integer} [opts.setSize] - Set类型阈值  optional\n      * @param {integer} [opts.zsetSize] - Zset类型阈值  optional\n      * @param {integer} [opts.top] - top值，范围10~1000  optional\n      * @param {string} [opts.sizeMode] - 计算大key的方式。若为“elementCounts”，则使用元素个数计算大key；若为“memorySize”，则使用内存大小计算大key。默认为“elementCounts”。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createBigKeyAnalysis (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBigKeyAnalysis\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling createBigKeyAnalysis\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.stringSize !== undefined && opts.stringSize !== null) {\n      postBody['stringSize'] = opts.stringSize\n    }\n    if (opts.listSize !== undefined && opts.listSize !== null) {\n      postBody['listSize'] = opts.listSize\n    }\n    if (opts.hashSize !== undefined && opts.hashSize !== null) {\n      postBody['hashSize'] = opts.hashSize\n    }\n    if (opts.setSize !== undefined && opts.setSize !== null) {\n      postBody['setSize'] = opts.setSize\n    }\n    if (opts.zsetSize !== undefined && opts.zsetSize !== null) {\n      postBody['zsetSize'] = opts.zsetSize\n    }\n    if (opts.top !== undefined && opts.top !== null) {\n      postBody['top'] = opts.top\n    }\n    if (opts.sizeMode !== undefined && opts.sizeMode !== null) {\n      postBody['sizeMode'] = opts.sizeMode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBigKeyAnalysis with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/bigKey',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询大key分析详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.taskId - 任务id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime  任务开始时间, rfc3339格式\n      * @param string finishTime  任务结束时间, rfc3339格式\n      * @param integer analysisType  任务类型，0:自动分析，1:手动分析\n      * @param redisBigKey stringBigKeys\n      * @param redisBigKey hashBigKeys\n      * @param redisBigKey listBigKeys\n      * @param redisBigKey zsetBigKeys\n      * @param redisBigKey setBigKeys\n      */\n\n  describeBigKeyDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBigKeyDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeBigKeyDetail\"\n      )\n    }\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling describeBigKeyDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      queryParams['taskId'] = opts.taskId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBigKeyDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/bigKeyDetail',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取大key自动缓存分析时间\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string time  -表示为关闭，HH:mm-HH:mm 时区，例如&quot;01:00-02:00 +0800&quot;，表示东八区的1点到2点\n      */\n\n  describeBigKeyAnalysisTime (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBigKeyAnalysisTime\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeBigKeyAnalysisTime\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBigKeyAnalysisTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/bigKeyAutoAnalysisTime',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置大key自动缓存分析时间\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.analysisTime - -表示关闭，否则为：HH:mm-HH:mm 时区，例如&quot;01:00-02:00 +0800&quot;，表示东八区的1点到2点\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyBigKeyAnalysisTime (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBigKeyAnalysisTime\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling modifyBigKeyAnalysisTime\"\n      )\n    }\n    if (opts.analysisTime === undefined || opts.analysisTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.analysisTime' when calling modifyBigKeyAnalysisTime\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.analysisTime !== undefined && opts.analysisTime !== null) {\n      postBody['analysisTime'] = opts.analysisTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBigKeyAnalysisTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/bigKeyAutoAnalysisTime',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止缓存分析任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopCacheAnalysis (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopCacheAnalysis\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling stopCacheAnalysis\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopCacheAnalysis with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/stopCacheAnalysis',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询缓存分析阈值\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer stringSize  String类型的阈值\n      * @param integer listSize  List类型的阈值\n      * @param integer hashSize  Hash类型的阈值\n      * @param integer setSize  Set类型的阈值\n      * @param integer zsetSize  Zset类型的阈值\n      * @param integer topSize  top值\n      */\n\n  describeAnalysisThreshold (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAnalysisThreshold\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeAnalysisThreshold\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAnalysisThreshold with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/cacheAnalysisThreshold',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置缓存分析阈值\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {integer} [opts.stringSize] - String类型阈值  optional\n      * @param {integer} [opts.listSize] - List类型阈值  optional\n      * @param {integer} [opts.hashSize] - Hash类型阈值  optional\n      * @param {integer} [opts.setSize] - Set类型阈值  optional\n      * @param {integer} [opts.zsetSize] - Zset类型阈值  optional\n      * @param {integer} [opts.top] - top值，范围10~1000  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyAnalysisThreshold (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyAnalysisThreshold\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling modifyAnalysisThreshold\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.stringSize !== undefined && opts.stringSize !== null) {\n      postBody['stringSize'] = opts.stringSize\n    }\n    if (opts.listSize !== undefined && opts.listSize !== null) {\n      postBody['listSize'] = opts.listSize\n    }\n    if (opts.hashSize !== undefined && opts.hashSize !== null) {\n      postBody['hashSize'] = opts.hashSize\n    }\n    if (opts.setSize !== undefined && opts.setSize !== null) {\n      postBody['setSize'] = opts.setSize\n    }\n    if (opts.zsetSize !== undefined && opts.zsetSize !== null) {\n      postBody['zsetSize'] = opts.zsetSize\n    }\n    if (opts.top !== undefined && opts.top !== null) {\n      postBody['top'] = opts.top\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyAnalysisThreshold with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/cacheAnalysisThreshold',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建大key分析任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {integer} [opts.stringSize] - String类型阈值，最小10240  optional\n      * @param {integer} [opts.listSize] - List类型阈值，最小1000  optional\n      * @param {integer} [opts.hashSize] - Hash类型阈值，最小1000  optional\n      * @param {integer} [opts.setSize] - Set类型阈值，最小1000  optional\n      * @param {integer} [opts.zsetSize] - Zset类型阈值，最小1000  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createBigKeyAnalysis2 (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBigKeyAnalysis2\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling createBigKeyAnalysis2\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.stringSize !== undefined && opts.stringSize !== null) {\n      postBody['stringSize'] = opts.stringSize\n    }\n    if (opts.listSize !== undefined && opts.listSize !== null) {\n      postBody['listSize'] = opts.listSize\n    }\n    if (opts.hashSize !== undefined && opts.hashSize !== null) {\n      postBody['hashSize'] = opts.hashSize\n    }\n    if (opts.setSize !== undefined && opts.setSize !== null) {\n      postBody['setSize'] = opts.setSize\n    }\n    if (opts.zsetSize !== undefined && opts.zsetSize !== null) {\n      postBody['zsetSize'] = opts.zsetSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBigKeyAnalysis2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/bigKeyAnalysis',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询大key分析任务列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param clusterCacheAnalysis cacheAnalysisList\n      * @param integer totalCount  大key分析列表总条数\n      */\n\n  describeBigKeyList2 (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBigKeyList2\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeBigKeyList2\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBigKeyList2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/bigKeyAnalysisResultList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询大key分析详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.taskId - 任务id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId  任务id\n      * @param integer stringSize  String类型的阈值\n      * @param integer listSize  List类型的阈值\n      * @param integer setSize  Set类型的阈值\n      * @param integer hashSize  Hash类型的阈值\n      * @param integer zsetSize  Zset类型的阈值\n      * @param string status  大key分析任务状态(running, success, fail, manual_stop)\n      * @param string analysisTime  大key分析开始时间, rfc3339格式\n      * @param string analysisDuration  大key分析时长\n      * @param bigKeyAnalysisNode bigKeyAnalysisNodesList\n      */\n\n  describeBigKeyDetail2 (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBigKeyDetail2\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeBigKeyDetail2\"\n      )\n    }\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling describeBigKeyDetail2\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      queryParams['taskId'] = opts.taskId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBigKeyDetail2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/bigKeyAnalysisDetail',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取大key自动缓存分析时间\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string time  -表示为关闭，HH:mm-HH:mm 时区，例如&quot;01:00-02:00 +0800&quot;，表示东八区的1点到2点\n      */\n\n  describeBigKeyAnalysisTime2 (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBigKeyAnalysisTime2\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeBigKeyAnalysisTime2\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBigKeyAnalysisTime2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/bigKeyAnalysisTime',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置大key自动缓存分析时间\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.analysisTime - -表示关闭，否则为：HH:mm-HH:mm 时区，例如&quot;01:00-02:00 +0800&quot;，表示东八区的1点到2点\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyBigKeyAnalysisTime2 (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBigKeyAnalysisTime2\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling modifyBigKeyAnalysisTime2\"\n      )\n    }\n    if (opts.analysisTime === undefined || opts.analysisTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.analysisTime' when calling modifyBigKeyAnalysisTime2\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.analysisTime !== undefined && opts.analysisTime !== null) {\n      postBody['analysisTime'] = opts.analysisTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBigKeyAnalysisTime2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/bigKeyAnalysisTime',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询缓存分析阈值\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer stringSize  String类型的阈值\n      * @param integer listSize  List类型的阈值\n      * @param integer hashSize  Hash类型的阈值\n      * @param integer setSize  Set类型的阈值\n      * @param integer zsetSize  Zset类型的阈值\n      */\n\n  describeAnalysisThreshold2 (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAnalysisThreshold2\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeAnalysisThreshold2\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAnalysisThreshold2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/bigKeyAnalysisThreshold',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置缓存分析阈值\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {integer} [opts.stringSize] - String类型阈值，最小10240  optional\n      * @param {integer} [opts.listSize] - List类型阈值，最小1000  optional\n      * @param {integer} [opts.hashSize] - Hash类型阈值，最小1000  optional\n      * @param {integer} [opts.setSize] - Set类型阈值，最小1000  optional\n      * @param {integer} [opts.zsetSize] - Zset类型阈值，最小1000  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyAnalysisThreshold2 (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyAnalysisThreshold2\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling modifyAnalysisThreshold2\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.stringSize !== undefined && opts.stringSize !== null) {\n      postBody['stringSize'] = opts.stringSize\n    }\n    if (opts.listSize !== undefined && opts.listSize !== null) {\n      postBody['listSize'] = opts.listSize\n    }\n    if (opts.hashSize !== undefined && opts.hashSize !== null) {\n      postBody['hashSize'] = opts.hashSize\n    }\n    if (opts.setSize !== undefined && opts.setSize !== null) {\n      postBody['setSize'] = opts.setSize\n    }\n    if (opts.zsetSize !== undefined && opts.zsetSize !== null) {\n      postBody['zsetSize'] = opts.zsetSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyAnalysisThreshold2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/bigKeyAnalysisThreshold',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询热key分析结果\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param hotKeyAnalysisNode hotKeyAnalysisNodesList\n      */\n\n  describeHotKeyResult2 (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeHotKeyResult2\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeHotKeyResult2\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeHotKeyResult2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/hotKeyAnalysisResult',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询热key分析详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.nodeId - 节点id\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param redisHotKey hotHeys\n      * @param integer totalCount  热key总数量\n      */\n\n  describeHotKeyDetail2 (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeHotKeyDetail2\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeHotKeyDetail2\"\n      )\n    }\n    if (opts.nodeId === undefined || opts.nodeId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeId' when calling describeHotKeyDetail2\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.nodeId !== undefined && opts.nodeId !== null) {\n      queryParams['nodeId'] = opts.nodeId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeHotKeyDetail2 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/hotKeyDetail',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询热key分析结果汇总\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} [opts.startTime] - 开始时间，RFC3339格式，最多可以查询30天内的数据  optional\n      * @param {string} [opts.endTime] - 结束时间，RFC3339格式，查询时间范围最多7天  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param hotKeyAnalysisNode hotKeyAnalysisNodesList\n      */\n\n  describeHotKeySummary (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeHotKeySummary\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeHotKeySummary\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeHotKeySummary with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/hotKeyAnalysisSummary',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询热key分析详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.nodeId - 节点id\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[10, 100]  optional\n      * @param {string} [opts.startTime] - 开始时间，RFC3339格式，最多可以查询30天内的数据  optional\n      * @param {string} [opts.endTime] - 结束时间，RFC3339格式，查询时间范围最多7天  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param redisHotKey hotHeys\n      * @param integer totalCount  热key总数量\n      */\n\n  describeHotKeyDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeHotKeyDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling describeHotKeyDetail\"\n      )\n    }\n    if (opts.nodeId === undefined || opts.nodeId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeId' when calling describeHotKeyDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.nodeId !== undefined && opts.nodeId !== null) {\n      queryParams['nodeId'] = opts.nodeId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeHotKeyDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/hotKeyAnalysisDetail',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重启4.0实例代理\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {array} [opts.proxyIds] - proxy节点id列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  restartProxy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  restartProxy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling restartProxy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.proxyIds !== undefined && opts.proxyIds !== null) {\n      postBody['proxyIds'] = opts.proxyIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call restartProxy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/restartProxy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭4.0实例客户端连接\n      * @param {Object} opts - parameters\n      * @param {string} opts.cacheInstanceId - 缓存Redis实例ID，是访问实例的唯一标识\n      * @param {string} opts.option - 关闭属性, 支持addr/type/db三种属性\naddr - 根据客户端地址关闭连接\ntype - 根据链接类型关闭连接\ndb - 根据db关闭连接\n\n      * @param {string} opts.value - 筛选条件\n属性是addr时 - ip:port, port空表示此ip所有port\n属性是type时 - 支持normal/pubsub/all三种条件\n属性是db时 - db列表, 0,1,2..\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  clientKill (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  clientKill\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.cacheInstanceId === undefined || opts.cacheInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.cacheInstanceId' when calling clientKill\"\n      )\n    }\n    if (opts.option === undefined || opts.option === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.option' when calling clientKill\"\n      )\n    }\n    if (opts.value === undefined || opts.value === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.value' when calling clientKill\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.option !== undefined && opts.option !== null) {\n      postBody['option'] = opts.option\n    }\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      cacheInstanceId: opts.cacheInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call clientKill with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cacheInstance/{cacheInstanceId}/clientKill',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询缓存Redis实例的规格列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.redisVersion] - 缓存Redis的版本号：目前有2.8和4.0，默认为2.8  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceClass instanceClasses\n      * @param integer totalCount\n      */\n\n  describeInstanceClass (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceClass\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.redisVersion !== undefined && opts.redisVersion !== null) {\n      queryParams['redisVersion'] = opts.redisVersion\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceClass with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceClass',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询账户的缓存Redis配额信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quota\n      */\n\n  describeUserQuota (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeUserQuota\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUserQuota with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/quota',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询缓存Redis实例的规格配置信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object shardSpec  单分片规格，自定义分片规格集群实例才需要\n      * @param instanceSpec instanceSpec  实例规格\n      */\n\n  describeSpecConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSpecConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  redis/2.6.32'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSpecConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/specConfig',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = REDIS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/refund/v1/refund.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 退款策略中心\n * 退款策略中心接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'refund'\nService._services[serviceId] = true\n\n/**\n * refund service.\n * @version 0.0.1\n */\n\nclass REFUND extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'refund.jdcloud.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  退款并删除资源\n      * @param {Object} opts - parameters\n      * @param {resourceRefundReq} [opts.jsonBody]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  true-请求成功，false-请求失败\n      * @param integer code  结果code\n      * @param string data  退款单号\n      * @param string message  失败时显示原因\n      */\n\n  submitResourceRefund (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  submitResourceRefund\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.jsonBody !== undefined && opts.jsonBody !== null) {\n      postBody['jsonBody'] = opts.jsonBody\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  refund/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call submitResourceRefund with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/refund:resource',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询退款状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.pin\n      * @param {string} [opts.refundId]   optional\n      * @param {string} [opts.resourceId]   optional\n      * @param {integer} [opts.pageNumber] - 第几页，默认值为0  optional\n      * @param {integer} [opts.pageSize] - 每页条数，默认为20  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pageInfos pageInfos\n      * @param refundResult data\n      */\n\n  descirbeRefundStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  descirbeRefundStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.pin === undefined || opts.pin === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pin' when calling descirbeRefundStatus\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.refundId !== undefined && opts.refundId !== null) {\n      postBody['refundId'] = opts.refundId\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      postBody['resourceId'] = opts.resourceId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  refund/0.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call descirbeRefundStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/refund:status',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = REFUND\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/reservedinstance/v1/reservedinstance.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * sysConfig APIs\n * 系统参数配置\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'reservedinstance'\nService._services[serviceId] = true\n\n/**\n * reservedinstance service.\n * @version 0.1.2\n */\n\nclass RESERVEDINSTANCE extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'reservedinstance.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询实例券使用明细列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.reservedInstanceType] - 实例券类型  optional\n      * @param {string} [opts.reservedInstanceId] - 实例券ID  optional\n      * @param {string} [opts.instanceId] - 抵扣实例ID  optional\n      * @param {string} [opts.startTime] - 使用开始时间  optional\n      * @param {string} [opts.endTime] - 使用结束时间  optional\n      * @param {integer} [opts.pageNo] - 页码,默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认10，最大100  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination\n      * @param deductionDetailVo result\n      */\n\n  describeDeductionDetails (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDeductionDetails\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (\n      opts.reservedInstanceType !== undefined &&\n      opts.reservedInstanceType !== null\n    ) {\n      queryParams['reservedInstanceType'] = opts.reservedInstanceType\n    }\n    if (\n      opts.reservedInstanceId !== undefined &&\n      opts.reservedInstanceId !== null\n    ) {\n      queryParams['reservedInstanceId'] = opts.reservedInstanceId\n    }\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.pageNo !== undefined && opts.pageNo !== null) {\n      queryParams['pageNo'] = opts.pageNo\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  reservedinstance/0.1.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDeductionDetails with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/deductionDetails',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例抵扣券列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.voucherType] - 实例券类型  optional\n      * @param {integer} [opts.status] - 状态(全部:不传 1.生效 2.失效)  optional\n      * @param {string} [opts.createTimeBegin] - 创建时间段开始时间  optional\n      * @param {string} [opts.createTimeEnd] - 创建时间段结束时间  optional\n      * @param {integer} [opts.pageNum] - 当前页序号(默认:1)  optional\n      * @param {integer} [opts.pageSize] - 每页结果数量(默认:10)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pagination pagination  分页信息\n      * @param consoleInstanceVoucherVo data\n      */\n\n  describeConsoleInstanceVouchers (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeConsoleInstanceVouchers\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.voucherType !== undefined && opts.voucherType !== null) {\n      queryParams['voucherType'] = opts.voucherType\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.createTimeBegin !== undefined && opts.createTimeBegin !== null) {\n      queryParams['createTimeBegin'] = opts.createTimeBegin\n    }\n    if (opts.createTimeEnd !== undefined && opts.createTimeEnd !== null) {\n      queryParams['createTimeEnd'] = opts.createTimeEnd\n    }\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      queryParams['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  reservedinstance/0.1.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeConsoleInstanceVouchers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceVoucher:describeConsoleInstanceVouchers',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = RESERVEDINSTANCE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/resourcetag/v1/resourcetag.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Resource-Tag-APIs\n * 资源标签接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'resourcetag'\nService._services[serviceId] = true\n\n/**\n * resourcetag service.\n * @version 0.6.0\n */\n\nclass RESOURCETAG extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'resource-tag.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  获得资源与对应标签列表详情，不含资源名称和可用区。&lt;br/&gt;\n注意查询cdn的资源时url中regionId必须指定为cn-all。&lt;br/&gt;\n该接口目前不支持分页功能。\n\n      * @param {Object} opts - parameters\n      * @param {resourceReqVo} opts.resourceVo - 资源标签参数对象\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param resourceResVo data  资源与对应标签列表详情\n      */\n\n  describeResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.resourceVo === undefined || opts.resourceVo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceVo' when calling describeResources\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.resourceVo !== undefined && opts.resourceVo !== null) {\n      postBody['resourceVo'] = opts.resourceVo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  resourcetag/0.6.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tags:describeResources',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取资源标签。&lt;br/&gt;\n注意查询cdn资源的标签时url中regionId必须指定为cn-all。&lt;br/&gt;\n注意查询不限制地域时url中regionId必须指定为all-region。\n\n      * @param {Object} opts - parameters\n      * @param {tagsReqVo} opts.tagKeysVo - 标签参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tagsResVo data  获取标签结果详情\n      */\n\n  describeTags (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTags\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.tagKeysVo === undefined || opts.tagKeysVo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tagKeysVo' when calling describeTags\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.tagKeysVo !== undefined && opts.tagKeysVo !== null) {\n      postBody['tagKeysVo'] = opts.tagKeysVo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  resourcetag/0.6.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTags with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeTags',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取标签键\n      * @param {Object} opts - parameters\n      * @param {tagKeysReqVo} opts.tagKeysVo - 标签键参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tagKeysResVo data  获取标签键结果详情\n      */\n\n  describeKeys (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeKeys\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.tagKeysVo === undefined || opts.tagKeysVo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tagKeysVo' when calling describeKeys\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.tagKeysVo !== undefined && opts.tagKeysVo !== null) {\n      postBody['tagKeysVo'] = opts.tagKeysVo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  resourcetag/0.6.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeKeys with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tags:describeKeys',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取标签值\n      * @param {Object} opts - parameters\n      * @param {tagValuesReqVo} opts.tagValuesVo - 标签值参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tagValuesResVo data  获取标签值结果详情\n      */\n\n  describeValues (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeValues\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.tagValuesVo === undefined || opts.tagValuesVo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tagValuesVo' when calling describeValues\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.tagValuesVo !== undefined && opts.tagValuesVo !== null) {\n      postBody['tagValuesVo'] = opts.tagValuesVo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  resourcetag/0.6.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeValues with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tags:describeValues',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  资源标签绑定。&lt;br/&gt;\n注意cdn资源绑定标签时url中regionId必须指定为cn-all。\n\n      * @param {Object} opts - parameters\n      * @param {tagResourcesReqVo} opts.tagResources - 绑定标签参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tagResourcesResVo data  资源标签绑定结果详情\n      */\n\n  tagResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  tagResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.tagResources === undefined || opts.tagResources === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tagResources' when calling tagResources\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.tagResources !== undefined && opts.tagResources !== null) {\n      postBody['tagResources'] = opts.tagResources\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  resourcetag/0.6.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call tagResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tags:tagResources',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  资源标签解绑。&lt;br/&gt;\n注意cdn资源解绑标签时url中regionId必须指定为cn-all。\n\n      * @param {Object} opts - parameters\n      * @param {unTagResourcesReqVo} opts.unTagResources - 解绑标签参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param unTagResourcesResVo data  资源标签解绑结果详情\n      */\n\n  unTagResources (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  unTagResources\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.unTagResources === undefined || opts.unTagResources === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.unTagResources' when calling unTagResources\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.unTagResources !== undefined && opts.unTagResources !== null) {\n      postBody['unTagResources'] = opts.unTagResources\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  resourcetag/0.6.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call unTagResources with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/tags:unTagResources',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据标签查找资源。 &lt;br/&gt;\n若要查找cdn产品线的资源则url中的regionId必须指定为cn-all。\n\n      * @param {Object} opts - parameters\n      * @param {queryResourceReqVo} opts.queryResource - 查找资源id的参数对象\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string resourceIds\n      */\n\n  queryResource (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryResource\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.queryResource === undefined || opts.queryResource === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryResource' when calling queryResource\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryResource !== undefined && opts.queryResource !== null) {\n      postBody['queryResource'] = opts.queryResource\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  resourcetag/0.6.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryResource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/queryResource',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = RESOURCETAG\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/rms/v1/rms.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 短信内容接口\n * API related to  Template\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'rms'\nService._services[serviceId] = true\n\n/**\n * rms service.\n * @version 1.0.0\n */\n\nJDCloud.RMS = class RMS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'rms.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  指定短信Id群发短信\n      * @param {Object} opts - parameters\n      * @param {sendBatchMsgSpec} opts.sendBatchMsgSpec - 指定短信Id群发短信请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param sendBatchMsg data  指定短信Id群发短信响应参数\n      */\n\n  sendBatchMsg (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  sendBatchMsg\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.sendBatchMsgSpec === undefined || opts.sendBatchMsgSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sendBatchMsgSpec' when calling sendBatchMsg\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sendBatchMsgSpec !== undefined && opts.sendBatchMsgSpec !== null) {\n      postBody['sendBatchMsgSpec'] = opts.sendBatchMsgSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call sendBatchMsg with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/sendBatchMsg',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取发送状态\n      * @param {Object} opts - parameters\n      * @param {querySendStatusSpec} opts.querySendStatusSpec - 获取发送状态请求参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param querySendStatus data\n      */\n\n  querySendStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  querySendStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.querySendStatusSpec === undefined ||\n      opts.querySendStatusSpec === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.querySendStatusSpec' when calling querySendStatus\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.querySendStatusSpec !== undefined &&\n      opts.querySendStatusSpec !== null\n    ) {\n      postBody['querySendStatusSpec'] = opts.querySendStatusSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call querySendStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/querySendStatus',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  增加富媒体短信内容接口\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - appId参数  optional\n      * @param {string} [opts.signType] - signType参数  optional\n      * @param {string} [opts.purpose] - purpose参数  optional\n      * @param {string} [opts.signCardType] - signCardType参数  optional\n      * @param {string} [opts.aptitudes] - aptitudes参数  optional\n      * @param {string} [opts.title] - title参数  optional\n      * @param {string} [opts.description] - description参数  optional\n      * @param {string} [opts.isTuiding] - isTuiding参数  optional\n      * @param {array} [opts.content] - content参数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param respAddTemplateData data\n      * @param string message  message参数\n      * @param string status  status参数\n      */\n\n  addTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.signType !== undefined && opts.signType !== null) {\n      postBody['signType'] = opts.signType\n    }\n    if (opts.purpose !== undefined && opts.purpose !== null) {\n      postBody['purpose'] = opts.purpose\n    }\n    if (opts.signCardType !== undefined && opts.signCardType !== null) {\n      postBody['signCardType'] = opts.signCardType\n    }\n    if (opts.aptitudes !== undefined && opts.aptitudes !== null) {\n      postBody['aptitudes'] = opts.aptitudes\n    }\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.isTuiding !== undefined && opts.isTuiding !== null) {\n      postBody['isTuiding'] = opts.isTuiding\n    }\n    if (opts.content !== undefined && opts.content !== null) {\n      postBody['content'] = opts.content\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/addTemplate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个富媒体短信内容接口\n      * @param {Object} opts - parameters\n      * @param {string} [opts.templateId] - templateId参数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param respQueryOneTemplateResourceList data\n      * @param string description  description参数\n      * @param string mediaLength  mediaLength参数\n      * @param string type  type参数\n      * @param string title  title参数\n      * @param string isTuiding  isTuiding参数\n      * @param string message  message参数\n      * @param string status  status参数\n      */\n\n  queryOneTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryOneTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryOneTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/queryOneTemplate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询富媒体短信内容列表接口\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - appId参数  optional\n      * @param {string} [opts.searchKey] - searchKey参数  optional\n      * @param {string} [opts.pageNum] - pageNum参数  optional\n      * @param {string} [opts.pageLimit] - pageLimit参数  optional\n      * @param {string} [opts.status] - status参数  optional\n      * @param {string} [opts.title] - title参数  optional\n      * @param {string} [opts.startTime] - startTime参数  optional\n      * @param {string} [opts.endTime] - endTime参数  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param respQueryTemplateListData data\n      * @param string message  message参数\n      * @param string totalElements  totalElements参数\n      * @param string status  status参数\n      */\n\n  queryTemplateList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryTemplateList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.searchKey !== undefined && opts.searchKey !== null) {\n      postBody['searchKey'] = opts.searchKey\n    }\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      postBody['pageNum'] = opts.pageNum\n    }\n    if (opts.pageLimit !== undefined && opts.pageLimit !== null) {\n      postBody['pageLimit'] = opts.pageLimit\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.0.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryTemplateList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/queryTemplateList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.RMS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/rms/v2/rms.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Message-Content-APIs\n * 富媒体模板内容创建、查询相关接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'rms'\nService._services[serviceId] = true\n\n/**\n * rms service.\n * @version 1.4.0\n */\n\nclass RMS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'rms.jdcloud-api.com'\n    options.basePath = '/v2' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  增加富媒体短信资质接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} opts.name - 资质名称\n      * @param {string} opts.description - 资质描述\n      * @param {string} opts.businessLicense - 营业执照图片,必须是jpg图片的base64编码，只支持jpg图片\n      * @param {string} opts.businessLicenseName - 营业执照名称\n      * @param {string} opts.signedAuthorization - 签名授权书图片,必须是jpg图片的base64编码，只支持jpg图片\n      * @param {string} opts.signedAuthorizationName - 签名授权书名称\n      * @param {string} opts.informationSecurity - 信息安全保障责任书图片,必须是jpg图片的base64编码，只支持jpg图片\n      * @param {string} opts.informationSecurityName - 信息安全保障责任书名称\n      * @param {string} opts.membershipCertificate - 会员证明图片,必须是jpg图片的base64编码，只支持jpg图片\n      * @param {string} opts.membershipCertificateName - 会员证明名称\n      * @param {string} opts.otherCertificate - 其他证明图片,必须是jpg图片的base64编码，只支持jpg图片\n      * @param {string} opts.otherCertificateName - 其他证明名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param respCreditData data  资质ID\n      * @param boolean status  请求状态\n      * @param string code  错误码\n      * @param string message  错误消息\n      */\n\n  addCredit (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addCredit\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling addCredit\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling addCredit\"\n      )\n    }\n    if (opts.description === undefined || opts.description === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.description' when calling addCredit\"\n      )\n    }\n    if (opts.businessLicense === undefined || opts.businessLicense === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.businessLicense' when calling addCredit\"\n      )\n    }\n    if (\n      opts.businessLicenseName === undefined ||\n      opts.businessLicenseName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.businessLicenseName' when calling addCredit\"\n      )\n    }\n    if (\n      opts.signedAuthorization === undefined ||\n      opts.signedAuthorization === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signedAuthorization' when calling addCredit\"\n      )\n    }\n    if (\n      opts.signedAuthorizationName === undefined ||\n      opts.signedAuthorizationName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signedAuthorizationName' when calling addCredit\"\n      )\n    }\n    if (\n      opts.informationSecurity === undefined ||\n      opts.informationSecurity === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.informationSecurity' when calling addCredit\"\n      )\n    }\n    if (\n      opts.informationSecurityName === undefined ||\n      opts.informationSecurityName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.informationSecurityName' when calling addCredit\"\n      )\n    }\n    if (\n      opts.membershipCertificate === undefined ||\n      opts.membershipCertificate === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.membershipCertificate' when calling addCredit\"\n      )\n    }\n    if (\n      opts.membershipCertificateName === undefined ||\n      opts.membershipCertificateName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.membershipCertificateName' when calling addCredit\"\n      )\n    }\n    if (opts.otherCertificate === undefined || opts.otherCertificate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.otherCertificate' when calling addCredit\"\n      )\n    }\n    if (\n      opts.otherCertificateName === undefined ||\n      opts.otherCertificateName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.otherCertificateName' when calling addCredit\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.businessLicense !== undefined && opts.businessLicense !== null) {\n      postBody['businessLicense'] = opts.businessLicense\n    }\n    if (\n      opts.businessLicenseName !== undefined &&\n      opts.businessLicenseName !== null\n    ) {\n      postBody['businessLicenseName'] = opts.businessLicenseName\n    }\n    if (\n      opts.signedAuthorization !== undefined &&\n      opts.signedAuthorization !== null\n    ) {\n      postBody['signedAuthorization'] = opts.signedAuthorization\n    }\n    if (\n      opts.signedAuthorizationName !== undefined &&\n      opts.signedAuthorizationName !== null\n    ) {\n      postBody['signedAuthorizationName'] = opts.signedAuthorizationName\n    }\n    if (\n      opts.informationSecurity !== undefined &&\n      opts.informationSecurity !== null\n    ) {\n      postBody['informationSecurity'] = opts.informationSecurity\n    }\n    if (\n      opts.informationSecurityName !== undefined &&\n      opts.informationSecurityName !== null\n    ) {\n      postBody['informationSecurityName'] = opts.informationSecurityName\n    }\n    if (\n      opts.membershipCertificate !== undefined &&\n      opts.membershipCertificate !== null\n    ) {\n      postBody['membershipCertificate'] = opts.membershipCertificate\n    }\n    if (\n      opts.membershipCertificateName !== undefined &&\n      opts.membershipCertificateName !== null\n    ) {\n      postBody['membershipCertificateName'] = opts.membershipCertificateName\n    }\n    if (opts.otherCertificate !== undefined && opts.otherCertificate !== null) {\n      postBody['otherCertificate'] = opts.otherCertificate\n    }\n    if (\n      opts.otherCertificateName !== undefined &&\n      opts.otherCertificateName !== null\n    ) {\n      postBody['otherCertificateName'] = opts.otherCertificateName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addCredit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/addCredit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改富媒体短信资质接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.signId - 资质ID\n      * @param {string} opts.appId - 应用ID\n      * @param {string} opts.name - 资质名称\n      * @param {string} opts.description - 资质描述\n      * @param {string} opts.businessLicense - 营业执照图片,必须是jpg图片的base64编码，只支持jpg图片\n      * @param {string} opts.businessLicenseName - 营业执照名称\n      * @param {string} opts.signedAuthorization - 签名授权书图片,必须是jpg图片的base64编码，只支持jpg图片\n      * @param {string} opts.signedAuthorizationName - 签名授权书名称\n      * @param {string} opts.informationSecurity - 信息安全保障责任书图片,必须是jpg图片的base64编码，只支持jpg图片\n      * @param {string} opts.informationSecurityName - 信息安全保障责任书名称\n      * @param {string} opts.membershipCertificate - 会员证明图片,必须是jpg图片的base64编码，只支持jpg图片\n      * @param {string} opts.membershipCertificateName - 会员证明名称\n      * @param {string} opts.otherCertificate - 其他证明图片,必须是jpg图片的base64编码，只支持jpg图片\n      * @param {string} opts.otherCertificateName - 其他证明名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param respCreditData data  资质ID\n      * @param boolean status  请求状态\n      * @param string code  错误码\n      * @param string message  错误消息\n      */\n\n  editCredit (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  editCredit\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.signId === undefined || opts.signId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signId' when calling editCredit\"\n      )\n    }\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling editCredit\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling editCredit\"\n      )\n    }\n    if (opts.description === undefined || opts.description === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.description' when calling editCredit\"\n      )\n    }\n    if (opts.businessLicense === undefined || opts.businessLicense === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.businessLicense' when calling editCredit\"\n      )\n    }\n    if (\n      opts.businessLicenseName === undefined ||\n      opts.businessLicenseName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.businessLicenseName' when calling editCredit\"\n      )\n    }\n    if (\n      opts.signedAuthorization === undefined ||\n      opts.signedAuthorization === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signedAuthorization' when calling editCredit\"\n      )\n    }\n    if (\n      opts.signedAuthorizationName === undefined ||\n      opts.signedAuthorizationName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signedAuthorizationName' when calling editCredit\"\n      )\n    }\n    if (\n      opts.informationSecurity === undefined ||\n      opts.informationSecurity === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.informationSecurity' when calling editCredit\"\n      )\n    }\n    if (\n      opts.informationSecurityName === undefined ||\n      opts.informationSecurityName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.informationSecurityName' when calling editCredit\"\n      )\n    }\n    if (\n      opts.membershipCertificate === undefined ||\n      opts.membershipCertificate === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.membershipCertificate' when calling editCredit\"\n      )\n    }\n    if (\n      opts.membershipCertificateName === undefined ||\n      opts.membershipCertificateName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.membershipCertificateName' when calling editCredit\"\n      )\n    }\n    if (opts.otherCertificate === undefined || opts.otherCertificate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.otherCertificate' when calling editCredit\"\n      )\n    }\n    if (\n      opts.otherCertificateName === undefined ||\n      opts.otherCertificateName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.otherCertificateName' when calling editCredit\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.signId !== undefined && opts.signId !== null) {\n      postBody['signId'] = opts.signId\n    }\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.businessLicense !== undefined && opts.businessLicense !== null) {\n      postBody['businessLicense'] = opts.businessLicense\n    }\n    if (\n      opts.businessLicenseName !== undefined &&\n      opts.businessLicenseName !== null\n    ) {\n      postBody['businessLicenseName'] = opts.businessLicenseName\n    }\n    if (\n      opts.signedAuthorization !== undefined &&\n      opts.signedAuthorization !== null\n    ) {\n      postBody['signedAuthorization'] = opts.signedAuthorization\n    }\n    if (\n      opts.signedAuthorizationName !== undefined &&\n      opts.signedAuthorizationName !== null\n    ) {\n      postBody['signedAuthorizationName'] = opts.signedAuthorizationName\n    }\n    if (\n      opts.informationSecurity !== undefined &&\n      opts.informationSecurity !== null\n    ) {\n      postBody['informationSecurity'] = opts.informationSecurity\n    }\n    if (\n      opts.informationSecurityName !== undefined &&\n      opts.informationSecurityName !== null\n    ) {\n      postBody['informationSecurityName'] = opts.informationSecurityName\n    }\n    if (\n      opts.membershipCertificate !== undefined &&\n      opts.membershipCertificate !== null\n    ) {\n      postBody['membershipCertificate'] = opts.membershipCertificate\n    }\n    if (\n      opts.membershipCertificateName !== undefined &&\n      opts.membershipCertificateName !== null\n    ) {\n      postBody['membershipCertificateName'] = opts.membershipCertificateName\n    }\n    if (opts.otherCertificate !== undefined && opts.otherCertificate !== null) {\n      postBody['otherCertificate'] = opts.otherCertificate\n    }\n    if (\n      opts.otherCertificateName !== undefined &&\n      opts.otherCertificateName !== null\n    ) {\n      postBody['otherCertificateName'] = opts.otherCertificateName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call editCredit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/editCredit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除富媒体短信资质接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.signId - 资质ID\n      * @param {string} opts.appId - 应用ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param respCreditData data  资质ID\n      * @param boolean status  请求状态\n      * @param string code  错误码\n      * @param string message  错误消息\n      */\n\n  deleteCredit (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteCredit\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.signId === undefined || opts.signId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signId' when calling deleteCredit\"\n      )\n    }\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling deleteCredit\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.signId !== undefined && opts.signId !== null) {\n      postBody['signId'] = opts.signId\n    }\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCredit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/deleteCredit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询富媒体短信资质列表接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {integer} opts.pageNum - 第几页\n      * @param {integer} opts.pageSize - 每页多少条记录\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param respCreditPageResult data\n      * @param boolean status  请求状态\n      * @param string code  错误码\n      * @param string message  错误消息\n      */\n\n  queryCreditList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryCreditList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling queryCreditList\"\n      )\n    }\n    if (opts.pageNum === undefined || opts.pageNum === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNum' when calling queryCreditList\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling queryCreditList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      postBody['pageNum'] = opts.pageNum\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryCreditList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/queryCreditList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  套餐包余量，仅预付费用户使用\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param respPackageResult data  响应数据\n      * @param boolean status  请求状态\n      * @param string code  错误码\n      * @param string message  错误消息\n      */\n\n  queryPackageRemainder (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryPackageRemainder\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryPackageRemainder with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/queryPackageRemainder',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  指定短信Id群发短信\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} opts.templateId - 短信ID\n      * @param {array} [opts.phone] - 群发的国内电话号码，群发时一次最多不要超过100个手机号  optional\n      * @param {array} [opts.params] - 短信模板变量对应的数据值，Array格式  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param sendBatchMsg data  指定短信Id群发短信响应参数\n      * @param boolean status  请求状态\n      * @param string code  错误码\n      * @param string message  错误消息\n      */\n\n  sendBatchMsg (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  sendBatchMsg\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling sendBatchMsg\"\n      )\n    }\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling sendBatchMsg\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n    if (opts.phone !== undefined && opts.phone !== null) {\n      postBody['phone'] = opts.phone\n    }\n    if (opts.params !== undefined && opts.params !== null) {\n      postBody['params'] = opts.params\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call sendBatchMsg with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/sendBatchMsg',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取发送状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} opts.sequenceNumber - 序列号\n      * @param {string} [opts.phone] - 手机号  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param querySendStatus data\n      * @param boolean status  请求状态\n      * @param string code  错误码\n      * @param string message  错误消息\n      */\n\n  querySendStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  querySendStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling querySendStatus\"\n      )\n    }\n    if (opts.sequenceNumber === undefined || opts.sequenceNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sequenceNumber' when calling querySendStatus\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.sequenceNumber !== undefined && opts.sequenceNumber !== null) {\n      postBody['sequenceNumber'] = opts.sequenceNumber\n    }\n    if (opts.phone !== undefined && opts.phone !== null) {\n      postBody['phone'] = opts.phone\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call querySendStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/querySendStatus',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  增加富媒体短信内容接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} opts.aptitudesId - 资质ID\n      * @param {string} opts.title - 短信主题\n      * @param {string} opts.description - 短信描述\n      * @param {string} opts.signContent - 短信签名\n      * @param {array} [opts.content] - 短信内容  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param respTemplateData data  短信ID\n      * @param boolean status  请求状态\n      * @param string code  错误码\n      * @param string message  错误消息\n      */\n\n  addTemplateNew (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addTemplateNew\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling addTemplateNew\"\n      )\n    }\n    if (opts.aptitudesId === undefined || opts.aptitudesId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aptitudesId' when calling addTemplateNew\"\n      )\n    }\n    if (opts.title === undefined || opts.title === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.title' when calling addTemplateNew\"\n      )\n    }\n    if (opts.description === undefined || opts.description === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.description' when calling addTemplateNew\"\n      )\n    }\n    if (opts.signContent === undefined || opts.signContent === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signContent' when calling addTemplateNew\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.aptitudesId !== undefined && opts.aptitudesId !== null) {\n      postBody['aptitudesId'] = opts.aptitudesId\n    }\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.signContent !== undefined && opts.signContent !== null) {\n      postBody['signContent'] = opts.signContent\n    }\n    if (opts.content !== undefined && opts.content !== null) {\n      postBody['content'] = opts.content\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addTemplateNew with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/addTemplateNew',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改富媒体短信内容接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板ID\n      * @param {string} opts.appId - 应用ID\n      * @param {string} opts.aptitudesId - 资质ID\n      * @param {string} opts.title - 短信主题\n      * @param {string} opts.description - 短信描述\n      * @param {string} opts.signContent - 短信签名\n      * @param {array} [opts.content] - 短信内容  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param respTemplateData data  短信ID\n      * @param boolean status  请求状态\n      * @param string code  错误码\n      * @param string message  错误消息\n      */\n\n  editTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  editTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling editTemplate\"\n      )\n    }\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling editTemplate\"\n      )\n    }\n    if (opts.aptitudesId === undefined || opts.aptitudesId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.aptitudesId' when calling editTemplate\"\n      )\n    }\n    if (opts.title === undefined || opts.title === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.title' when calling editTemplate\"\n      )\n    }\n    if (opts.description === undefined || opts.description === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.description' when calling editTemplate\"\n      )\n    }\n    if (opts.signContent === undefined || opts.signContent === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signContent' when calling editTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.aptitudesId !== undefined && opts.aptitudesId !== null) {\n      postBody['aptitudesId'] = opts.aptitudesId\n    }\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.signContent !== undefined && opts.signContent !== null) {\n      postBody['signContent'] = opts.signContent\n    }\n    if (opts.content !== undefined && opts.content !== null) {\n      postBody['content'] = opts.content\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call editTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/editTemplate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除富媒体短信内容接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板ID\n      * @param {string} opts.appId - 应用ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param respTemplateData data  短信ID\n      * @param boolean status  请求状态\n      * @param string code  错误码\n      * @param string message  错误消息\n      */\n\n  deleteTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling deleteTemplate\"\n      )\n    }\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling deleteTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/deleteTemplate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一个富媒体短信内容接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 短信ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param respQueryTemplateListData data  响应数据\n      * @param boolean status  请求状态\n      * @param string code  错误码\n      * @param string message  错误消息\n      */\n\n  queryTemplateById (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryTemplateById\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling queryTemplateById\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryTemplateById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/queryTemplateById',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询富媒体短信内容列表接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用ID\n      * @param {string} [opts.title] - 查询标题关键词  optional\n      * @param {integer} opts.pageNum - 第几页\n      * @param {integer} opts.pageLimit - 每页多少条记录\n      * @param {string} [opts.status] - 审核状态：0: 审核中 1: 通过 2: 未通过 4:待提交  optional\n      * @param {string} [opts.startTime] - 开始时间,格式YYYY-MM-DD  optional\n      * @param {string} [opts.endTime] - 结束时间,格式YYYY-MM-DD  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param respTemplatePageResult data\n      * @param boolean status  请求状态\n      * @param string code  错误码\n      * @param string message  错误消息\n      */\n\n  queryTemplateList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryTemplateList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling queryTemplateList\"\n      )\n    }\n    if (opts.pageNum === undefined || opts.pageNum === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNum' when calling queryTemplateList\"\n      )\n    }\n    if (opts.pageLimit === undefined || opts.pageLimit === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageLimit' when calling queryTemplateList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.pageNum !== undefined && opts.pageNum !== null) {\n      postBody['pageNum'] = opts.pageNum\n    }\n    if (opts.pageLimit !== undefined && opts.pageLimit !== null) {\n      postBody['pageLimit'] = opts.pageLimit\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      postBody['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      postBody['endTime'] = opts.endTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  rms/1.4.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryTemplateList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/queryTemplateList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = RMS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/smartdba/v2/smartdba.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Table-Check\n * 表诊断相关接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'smartdba'\nService._services[serviceId] = true\n\n/**\n * smartdba service.\n * @version 2.0.1\n */\n\nclass SMARTDBA extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'smartdba.jdcloud-api.com'\n    options.basePath = '/v2' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  近一小时告警列表，按级别倒序\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10  optional\n      * @param {string} [opts.dbType] - 数据库类型，默认MySQL  optional\n      * @param {string} opts.endTime - null\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param alarmDetail data\n      * @param integer totalCount  总数\n      */\n\n  describeAlarmResource (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAlarmResource\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeAlarmResource\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarmResource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeAlarmResource',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询告警历史\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10  optional\n      * @param {string} opts.startTime - 查询开始时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} opts.endTime - 查询截止时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} [opts.dbType] - 数据库类型，默认MySQL  optional\n      * @param {string} [opts.instanceGid] - 实例Id  optional\n      * @param {string} [opts.instanceName] - 实例名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param alarmHistoryDetail data\n      * @param integer totalCount  总数\n      */\n\n  describeAlarmHistory (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAlarmHistory\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeAlarmHistory\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeAlarmHistory\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n    if (opts.instanceGid !== undefined && opts.instanceGid !== null) {\n      queryParams['instanceGid'] = opts.instanceGid\n    }\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      queryParams['instanceName'] = opts.instanceName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarmHistory with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeAlarmHistory',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  最近3小时，24小时，3天报警数量\n      * @param {Object} opts - parameters\n      * @param {string} opts.endTime - 查询时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} [opts.dbType] - 数据库类型，默认MySQL  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer count3h  最近3小时告警数量\n      * @param integer count24h  最近24小时告警数量\n      * @param integer count72h  最近72小时告警数量\n      */\n\n  describeAlarmStatistic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAlarmStatistic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeAlarmStatistic\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarmStatistic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/alarmStatistic',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  最近3小时，24小时，3天慢sql情况\n      * @param {Object} opts - parameters\n      * @param {string} opts.endTime - 查询时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} [opts.dbType] - 数据库类型，默认MySQL  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer count3h  最近3小时慢sql数量\n      * @param integer count24h  最近24小时慢sql数量\n      * @param integer count72h  最近72小时慢sql数量\n      */\n\n  describeslowLogStatistic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeslowLogStatistic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeslowLogStatistic\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeslowLogStatistic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/slowLogStatistic',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取告警数量，用于趋势展示\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 查询起始时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} opts.endTime - 查询截止时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} [opts.dbType] - 数据库类型，默认MySQL  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dataPoint itemData\n      * @param metric metricInfo  metric元信息\n      */\n\n  describeAlarmTrend (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAlarmTrend\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeAlarmTrend\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeAlarmTrend\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAlarmTrend with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/alarmTrend',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  最近5分钟(或历史某点5分钟)，top5的资源\n      * @param {Object} opts - parameters\n      * @param {string} opts.metric - 监控指标\n      * @param {string} opts.endTime - 查询时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} [opts.dbType] - 数据库类型，默认MySQL  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metricResourceModel data\n      */\n\n  getTopResourceByMetric (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTopResourceByMetric\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.metric === undefined || opts.metric === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metric' when calling getTopResourceByMetric\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling getTopResourceByMetric\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.metric !== undefined && opts.metric !== null) {\n      queryParams['metric'] = opts.metric\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTopResourceByMetric with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/getTopResource',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取一键诊断分数最低的top5\n      * @param {Object} opts - parameters\n      * @param {string} opts.endTime - 查询时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} [opts.dbType] - 数据库类型，默认MySQL  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param inspectTopResource data\n      */\n\n  describeDiagnoseTopResource (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDiagnoseTopResource\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeDiagnoseTopResource\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDiagnoseTopResource with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/diagnoseTopResource',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  一键诊断趋势\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.endTime - 查询时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dataPoint data\n      */\n\n  describeDiagnoseTrend (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDiagnoseTrend\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeDiagnoseTrend\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeDiagnoseTrend\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDiagnoseTrend with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/diagnoseTrend',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  一键诊断\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId  巡检任务id\n      */\n\n  createDiagnose (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDiagnose\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling createDiagnose\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDiagnose with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/diagnose',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前实例的所有诊断记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageIndex 为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数\n      * @param diagnoseDetail data\n      */\n\n  describeDiagnoseList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDiagnoseList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeDiagnoseList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDiagnoseList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/diagnoses',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取诊断记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.diagnoseId - 诊断任务id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string status  巡检状态描述，取值 complete 或者 fail。如遇到云监控或者RDS服务异常，会出现fail。可提示用户诊断失败，请稍后重试。\n      * @param diagnoseDetail data\n      */\n\n  describeDiagnose (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDiagnose\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeDiagnose\"\n      )\n    }\n    if (opts.diagnoseId === undefined || opts.diagnoseId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.diagnoseId' when calling describeDiagnose\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid,\n      diagnoseId: opts.diagnoseId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDiagnose with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/diagnoses/{diagnoseId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取实例的巡检记录列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.startTime - 查询开始时间，格式为：2006-01-02T15:04:05Z\n      * @param {string} opts.endTime - 查询截止时间，格式为：2006-01-02T15:04:05Z\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageIndex 为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]，用于查询列表的接口  optional\n      * @param {string} [opts.instanceGid] - 实例id  optional\n      * @param {string} [opts.instanceName] - 实例名称  optional\n      * @param {string} [opts.dbType] - 实例类型  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数\n      * @param inspectTaskModel data\n      */\n\n  describeInspectList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInspectList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeInspectList\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeInspectList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.instanceGid !== undefined && opts.instanceGid !== null) {\n      queryParams['instanceGid'] = opts.instanceGid\n    }\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      queryParams['instanceName'] = opts.instanceName\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInspectList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/inspects',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取巡检记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.inspectId - 巡检任务id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer score  巡检分值\n      * @param string beginTime  巡检范围的起始时间，如：2021-11-09T00:00:00Z\n      * @param string endTime  巡检范围的截至时间，如：2021-11-09T23:59:59Z\n      * @param systemView systemView  资源使用率\n      * @param connectView connectView  连接数\n      * @param engineView engineView  锁信息\n      * @param schemaView schemaView  库表空间\n      * @param diskView diskView  磁盘空间\n      * @param slowLowView slowLowView  慢sql\n      * @param kV detail\n      */\n\n  describeInspect (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInspect\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeInspect\"\n      )\n    }\n    if (opts.inspectId === undefined || opts.inspectId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.inspectId' when calling describeInspect\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid,\n      inspectId: opts.inspectId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInspect with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/inspects/{inspectId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取待接入的mysql实例\n      * @param {Object} opts - parameters\n      * @param {string} [opts.dbType] - 实例类型，支持MySQL/Percona，默认MySQL  optional\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageIndex 为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数\n      * @param instancesInfo data\n      */\n\n  toBeConnectClusters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  toBeConnectClusters\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call toBeConnectClusters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/waitcutin',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取已接入mysql实例列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageIndex 为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]，用于查询列表的接口  optional\n      * @param {string} [opts.gid] - 实例gid  optional\n      * @param {string} [opts.instanceName] - 实例名称  optional\n      * @param {string} [opts.dbSource] - 接入来源  optional\n      * @param {string} [opts.status] - 实例状态  optional\n      * @param {string} [opts.dbType] - 实例类型，默认MySQL  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数\n      * @param integer checkOkCount  连接正常数\n      * @param integer checkFailCount  连接异常数\n      * @param instancesInfo data\n      */\n\n  describeClusterList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeClusterList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.gid !== undefined && opts.gid !== null) {\n      queryParams['gid'] = opts.gid\n    }\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      queryParams['instanceName'] = opts.instanceName\n    }\n    if (opts.dbSource !== undefined && opts.dbSource !== null) {\n      queryParams['dbSource'] = opts.dbSource\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeClusterList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/hadcutin',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新接入mysql实例\n      * @param {Object} opts - parameters\n      * @param {array} opts.gidList - 待接入实例gid列表\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数\n      * @param instancesInfo data\n      */\n\n  createCluster (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createCluster\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.gidList === undefined || opts.gidList === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.gidList' when calling createCluster\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.gidList !== undefined && opts.gidList !== null) {\n      postBody['gidList'] = opts.gidList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCluster with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/newcutin',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  取消实例接入\n      * @param {Object} opts - parameters\n      * @param {array} opts.gidList - 取消的实例gid列表\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数\n      * @param instancesInfo data\n      */\n\n  cancleConnect (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  cancleConnect\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.gidList === undefined || opts.gidList === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.gidList' when calling cancleConnect\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.gidList !== undefined && opts.gidList !== null) {\n      postBody['gidList'] = opts.gidList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cancleConnect with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/cancelinstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取实例详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param clusterDetail data\n      */\n\n  describeClusterDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeClusterDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeClusterDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeClusterDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/describeClusterDetail',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取锁诊断详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.analyseId - 锁诊断Id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string analyseId  锁诊断记录Id\n      * @param string occurTime  锁发生时间\n      * @param string deadLockLog  死锁日志详情\n      * @param deadLockDetail data\n      */\n\n  describeLockAnalyse (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeLockAnalyse\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeLockAnalyse\"\n      )\n    }\n    if (opts.analyseId === undefined || opts.analyseId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.analyseId' when calling describeLockAnalyse\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.analyseId !== undefined && opts.analyseId !== null) {\n      queryParams['analyseId'] = opts.analyseId\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLockAnalyse with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/lockAnalyse',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  死锁诊断\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string analyseId  锁诊断id\n      * @param string state  诊断完成状态：complete\\fail\n      * @param string message  状态说明信息\n      */\n\n  createLockAnalyse (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createLockAnalyse\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling createLockAnalyse\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createLockAnalyse with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/lockAnalyse',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前实例的所有诊断记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageIndex 为-1时，返回所有数据页码  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]，用于查询列表的接口  optional\n      * @param {string} opts.startTime - 查询开始时间，格式为：2006-01-02T15:04:05Z\n      * @param {string} opts.endTime - 查询截止时间，格式为：2006-01-02T15:04:05Z\n      * @param {boolean} [opts.state] - 是否只过滤死锁存在的记录  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数\n      * @param deadLockOverview data\n      */\n\n  describeAnalyseList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAnalyseList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeAnalyseList\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeAnalyseList\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeAnalyseList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.state !== undefined && opts.state !== null) {\n      queryParams['state'] = opts.state\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAnalyseList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/analyseList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加监控大盘\n      * @param {Object} opts - parameters\n      * @param {} [opts.name] - 监控大盘名称，最长32位  optional\n      * @param {} [opts.dbType] - 数据库类型,默认MySQL  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string name  监控大盘名称\n      * @param string panelGid  监控大盘id\n      */\n\n  createPanel (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createPanel\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      postBody['dbType'] = opts.dbType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createPanel with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/panel',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取监控大盘列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.dbType] - 数据库类型,默认MySQL  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param panel data\n      */\n\n  describePanelList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePanelList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePanelList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/panels',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取关联实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.panelGid - 监控大盘id\n      * @param {string} [opts.dbType] - 数据库类型,默认MySQL  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param panelClusterItem data\n      */\n\n  getPanelRelateClusters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getPanelRelateClusters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.panelGid === undefined || opts.panelGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.panelGid' when calling getPanelRelateClusters\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      panelGid: opts.panelGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPanelRelateClusters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/panels/{panelGid}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改关联实例，每次都是全量下发\n      * @param {Object} opts - parameters\n      * @param {string} opts.panelGid - 监控大盘id\n      * @param {} [opts.instanceIdList]   optional\n      * @param {} [opts.dbType] - 数据库类型,默认MySQL  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updatePanelClusters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updatePanelClusters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.panelGid === undefined || opts.panelGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.panelGid' when calling updatePanelClusters\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceIdList !== undefined && opts.instanceIdList !== null) {\n      postBody['instanceIdList'] = opts.instanceIdList\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      postBody['dbType'] = opts.dbType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      panelGid: opts.panelGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updatePanelClusters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/panels/{panelGid}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除监控大盘\n      * @param {Object} opts - parameters\n      * @param {string} opts.panelGid - 监控大盘id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deletePanel (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deletePanel\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.panelGid === undefined || opts.panelGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.panelGid' when calling deletePanel\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      panelGid: opts.panelGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deletePanel with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/panels/{panelGid}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询监控大盘监控值\n      * @param {Object} opts - parameters\n      * @param {string} opts.panelGid - 监控大盘id\n      * @param {string} opts.metric - 监控指标，如： tps、qps 等，在supportMetrics接口有返回\n      * @param {string} opts.startTime - 查询起始时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} opts.endTime - 查询截止时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} [opts.dbType] - 数据库类型,默认MySQL  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metricData metricDatas\n      */\n\n  describePanelMetricValueByGid (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePanelMetricValueByGid\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.panelGid === undefined || opts.panelGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.panelGid' when calling describePanelMetricValueByGid\"\n      )\n    }\n    if (opts.metric === undefined || opts.metric === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metric' when calling describePanelMetricValueByGid\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describePanelMetricValueByGid\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describePanelMetricValueByGid\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      panelGid: opts.panelGid,\n      metric: opts.metric\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePanelMetricValueByGid with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/panels/{panelGid}/metric/{metric}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询支持自定义的监控指标\n      * @param {Object} opts - parameters\n      * @param {string} opts.panelType - 展示类型，取值为： real_time 表示实时监控页面支持的自定义类型, monitor 表示性能趋势页面支持的类型, market 表示监控大盘\n      * @param {string} opts.dbType - 数据库库类型，目前只支持MySQL\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param supportMetric sys\n      * @param supportMetric server\n      */\n\n  describeSupportMetrics (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSupportMetrics\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.panelType === undefined || opts.panelType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.panelType' when calling describeSupportMetrics\"\n      )\n    }\n    if (opts.dbType === undefined || opts.dbType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbType' when calling describeSupportMetrics\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.panelType !== undefined && opts.panelType !== null) {\n      queryParams['panelType'] = opts.panelType\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSupportMetrics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/supportMetrics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询实例已经绑定的监控项\n      * @param {Object} opts - parameters\n      * @param {string} opts.gid - panelType为real_time/monitor时,代表实例Id, panelType为market时，代表大盘 panelGid\n      * @param {string} opts.panelType - 展示类型，取值为： real_time 表示实时监控页面支持的自定义类型, monitor 表示性能趋势页面支持的类型\n      * @param {string} opts.dbType - 数据库库类型，目前只支持MySQL\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param supportMetric sys\n      * @param supportMetric server\n      */\n\n  getBindMetrics (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getBindMetrics\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.gid === undefined || opts.gid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.gid' when calling getBindMetrics\"\n      )\n    }\n    if (opts.panelType === undefined || opts.panelType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.panelType' when calling getBindMetrics\"\n      )\n    }\n    if (opts.dbType === undefined || opts.dbType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbType' when calling getBindMetrics\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.panelType !== undefined && opts.panelType !== null) {\n      queryParams['panelType'] = opts.panelType\n    }\n    if (opts.dbType !== undefined && opts.dbType !== null) {\n      queryParams['dbType'] = opts.dbType\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      gid: opts.gid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getBindMetrics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{gid}/getBindMetrics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关联实例自定义监控项，每次都要求全量提交\n      * @param {Object} opts - parameters\n      * @param {} [opts.metricIds] - 自定义的监控项id数组  optional\n      * @param {} [opts.panelType] - 展示类型，取值为： real_time 表示实时监控页面, monitor 表示性能趋势页面 market 表示监控大盘  optional\n      * @param {} [opts.gid] - RDS 实例ID，唯一标识一个RDS实例。如果全部实例生效，可以传all  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  bindMetrics (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  bindMetrics\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.metricIds !== undefined && opts.metricIds !== null) {\n      postBody['metricIds'] = opts.metricIds\n    }\n    if (opts.panelType !== undefined && opts.panelType !== null) {\n      postBody['panelType'] = opts.panelType\n    }\n    if (opts.gid !== undefined && opts.gid !== null) {\n      postBody['gid'] = opts.gid\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bindMetrics with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bindMetrics',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询监控值\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {string} opts.metric - metric名称\n      * @param {string} opts.startTime - 查询开始时间，格式为：2006-01-02T15:04:05Z\n      * @param {string} opts.endTime - 查询截止时间，格式为：2006-01-02T15:04:05Z\n      * @param {string} [opts.role] - 实例角色，默认master  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dataPoint itemData\n      * @param metric metricInfo  metric元信息\n      */\n\n  describeMetricValueByGid (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMetricValueByGid\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeMetricValueByGid\"\n      )\n    }\n    if (opts.metric === undefined || opts.metric === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metric' when calling describeMetricValueByGid\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeMetricValueByGid\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeMetricValueByGid\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.metric !== undefined && opts.metric !== null) {\n      queryParams['metric'] = opts.metric\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.role !== undefined && opts.role !== null) {\n      queryParams['role'] = opts.role\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMetricValueByGid with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/metrics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前实例的会话信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer upTime  实例已运行时间，单位:s\n      * @param integer activeSession  运行中会话总数\n      * @param integer maxActiveTime  运行中会话最长时间\n      * @param integer waitSession  存在事务等待的会话\n      * @param integer totalSession  会话总数\n      * @param integer systemsSession  DMS（系统）会话总数\n      * @param integer totalCount  总数\n      * @param session sessions  实时会话明细\n      * @param userStatistic userStatistics  按用户统计\n      * @param hostStatistic hostStatistics  按访问来源统计\n      * @param dBStatistic dbStatistics  按数据库统计\n      */\n\n  describeSessions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSessions\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeSessions\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSessions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/describeSessions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取实时会话信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageIndex 为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数\n      * @param nowSession data  实时会话\n      */\n\n  describeNowSessions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNowSessions\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeNowSessions\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNowSessions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/describeNowSessions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取事务锁信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageIndex 为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数\n      * @param lockStatistic data  事务锁\n      */\n\n  describeTrxLocks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTrxLocks\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeTrxLocks\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTrxLocks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/describeTrxLocks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取非事务锁信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageIndex 为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数\n      * @param untrxLock data  非事务锁\n      */\n\n  describeUntrxLocks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeUntrxLocks\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeUntrxLocks\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUntrxLocks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/describeUntrxLocks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取未提交事务信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageIndex 为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总数\n      * @param unCommitTrx data  未提交事务\n      */\n\n  describeUnCommitTrxs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeUnCommitTrxs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeUnCommitTrxs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUnCommitTrxs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/describeUnCommitTrxs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  kill当前实例指定的会话\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {} [opts.sessionId]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  killSession (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  killSession\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling killSession\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sessionId !== undefined && opts.sessionId !== null) {\n      postBody['sessionId'] = opts.sessionId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call killSession with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/killSession',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前实例指定时间的慢SQL明细\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - 实例ID\n      * @param {string} opts.startTime - 查询开始时间，格式为：2006-01-02T15:04:05Z\n      * @param {string} opts.endTime - 查询截止时间，格式为：2006-01-02T15:04:05Z\n      * @param {string} [opts.dbName] - 过滤条件：数据库名  optional\n      * @param {string} [opts.userName] - 过滤条件：client 用户名  optional\n      * @param {string} [opts.clientIP] - 过滤条件：client IP  optional\n      * @param {string} [opts.keyword4Search] - 模糊查询关键字，只支持单个单词  optional\n      * @param {string} [opts.field] - 排序的字段，支持 execTime,lockTime,rowsExamined,rowsSent,startTime 默认是 startTime  optional\n      * @param {string} [opts.sort] - 排序方式，默认desc  optional\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageIndex 为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param slowLog data\n      * @param integer totalCount  总数\n      */\n\n  describeSlowLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSlowLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeSlowLog\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeSlowLog\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeSlowLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      queryParams['dbName'] = opts.dbName\n    }\n    if (opts.userName !== undefined && opts.userName !== null) {\n      queryParams['userName'] = opts.userName\n    }\n    if (opts.clientIP !== undefined && opts.clientIP !== null) {\n      queryParams['clientIP'] = opts.clientIP\n    }\n    if (opts.keyword4Search !== undefined && opts.keyword4Search !== null) {\n      queryParams['keyword4Search'] = opts.keyword4Search\n    }\n    if (opts.field !== undefined && opts.field !== null) {\n      queryParams['field'] = opts.field\n    }\n    if (opts.sort !== undefined && opts.sort !== null) {\n      queryParams['sort'] = opts.sort\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSlowLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/slowLog',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前实例指定时间的慢SQL统计\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - 实例ID\n      * @param {string} opts.startTime - 查询开始时间，格式为：2006-01-02T15:04:05Z\n      * @param {string} opts.endTime - 查询截止时间，格式为：2006-01-02T15:04:05Z\n      * @param {string} [opts.dbName] - 过滤条件：数据库名  optional\n      * @param {string} [opts.userName] - 过滤条件：client 用户名  optional\n      * @param {string} [opts.clientIP] - 过滤条件：client IP  optional\n      * @param {string} [opts.keyword4Search] - 模糊查询关键字，只支持单个单词  optional\n      * @param {string} [opts.sort] - 按queryCount的排序方式，默认desc  optional\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageIndex 为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param slowDigestLog data\n      * @param integer totalCount  总数\n      */\n\n  describeSlowDigestLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSlowDigestLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeSlowDigestLog\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeSlowDigestLog\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeSlowDigestLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      queryParams['dbName'] = opts.dbName\n    }\n    if (opts.userName !== undefined && opts.userName !== null) {\n      queryParams['userName'] = opts.userName\n    }\n    if (opts.clientIP !== undefined && opts.clientIP !== null) {\n      queryParams['clientIP'] = opts.clientIP\n    }\n    if (opts.keyword4Search !== undefined && opts.keyword4Search !== null) {\n      queryParams['keyword4Search'] = opts.keyword4Search\n    }\n    if (opts.sort !== undefined && opts.sort !== null) {\n      queryParams['sort'] = opts.sort\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSlowDigestLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/slowDigestLog',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取实例时间范围内按 dbName、userName、clientIP 分组统计的慢sql条数信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - 实例ID\n      * @param {string} opts.startTime - 查询开始时间，格式为：2021-11-12T15:04:05Z\n      * @param {string} opts.endTime - 查询截止时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object dbName  数据库名信息\n      * @param object userName  访问的用户名信息\n      * @param object clientIP  客户端IP信息\n      */\n\n  describeSlowLogDimensionsStatistic (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSlowLogDimensionsStatistic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeSlowLogDimensionsStatistic\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeSlowLogDimensionsStatistic\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeSlowLogDimensionsStatistic\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSlowLogDimensionsStatistic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/SlowLogDimensionsStatistic',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  SQL explain执行计划\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - 实例ID\n      * @param {} [opts.database] - 数据库名  optional\n      * @param {} [opts.sql] - SQL语句  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param executionPlan data\n      */\n\n  explainSql (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  explainSql\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling explainSql\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.database !== undefined && opts.database !== null) {\n      postBody['database'] = opts.database\n    }\n    if (opts.sql !== undefined && opts.sql !== null) {\n      postBody['sql'] = opts.sql\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call explainSql with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/explainSql',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  SQL优化\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - 实例ID\n      * @param {} [opts.database] - 数据库名  optional\n      * @param {} [opts.sql] - SQL语句  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tuningAdvice tuningAdvice  优化结果\n      */\n\n  turningSql (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  turningSql\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling turningSql\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.database !== undefined && opts.database !== null) {\n      postBody['database'] = opts.database\n    }\n    if (opts.sql !== undefined && opts.sql !== null) {\n      postBody['sql'] = opts.sql\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call turningSql with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/tuningSql',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询慢sql次数及分布\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - 实例ID\n      * @param {string} opts.metric - metric名称\n      * @param {string} opts.startTime - 查询开始时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} opts.endTime - 查询截止时间，格式为：2021-11-11T15:04:05Z\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dataPoint itemData\n      * @param metric metricInfo  metric元信息\n      */\n\n  describeSlowSqlMetric (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSlowSqlMetric\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeSlowSqlMetric\"\n      )\n    }\n    if (opts.metric === undefined || opts.metric === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metric' when calling describeSlowSqlMetric\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeSlowSqlMetric\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeSlowSqlMetric\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.metric !== undefined && opts.metric !== null) {\n      queryParams['metric'] = opts.metric\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSlowSqlMetric with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/sqlMetrics',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取冗余索引和未使用索引的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {string} opts.indexType - 索引类型\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageIndex 为-1时，返回所有数据页码；  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param indexInfo data\n      */\n\n  describeIndexs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeIndexs\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeIndexs\"\n      )\n    }\n    if (opts.indexType === undefined || opts.indexType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.indexType' when calling describeIndexs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.indexType !== undefined && opts.indexType !== null) {\n      queryParams['indexType'] = opts.indexType\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeIndexs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/describeIndexs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取空间信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string totalDiskSize  总空间(单位：G)\n      * @param string usedDiskSize  已用空间(单位：G)\n      * @param string totalIncreaseSize  最近一周增长量(单位：G)\n      * @param string averageIncrease  最近一周平均增长率\n      * @param string freeDiskSize  剩余空间(单位：G)\n      * @param string predictAvailableDays  预计剩余可用天数\n      */\n\n  describeStorages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeStorages\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeStorages\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStorages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/describeStorages',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取空间趋势\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {string} opts.startTime - 查询开始时间，格式为：2006-01-02T15:04:05Z\n      * @param {string} opts.endTime - 查询截止时间，格式为：2006-01-02T15:04:05Z\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metricData data\n      */\n\n  describeStorageTrend (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeStorageTrend\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeStorageTrend\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling describeStorageTrend\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling describeStorageTrend\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStorageTrend with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/describeStorageTrend',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  表空间Top 10\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {string} [opts.sortField] - 排序字段：表空间(totalSize)、表数据空间(dataSize)、索引空间(idxSize)、碎片率(fragment)、行数(dataRows)  optional\n      * @param {string} [opts.sortType] - 排序类型，desc 降序、asc 升序，默认降序  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tableStorageInfo data\n      */\n\n  describeTableSpaceTop (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTableSpaceTop\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeTableSpaceTop\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.sortField !== undefined && opts.sortField !== null) {\n      queryParams['sortField'] = opts.sortField\n    }\n    if (opts.sortType !== undefined && opts.sortType !== null) {\n      queryParams['sortType'] = opts.sortType\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTableSpaceTop with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/tableSpaceTop',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  库空间Top 10\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {string} [opts.sortField] - 排序字段：表空间(totalSize)、表数据空间(dataSize)、索引空间(idxSize)、碎片率(fragment)、行数(dataRows)  optional\n      * @param {string} [opts.sortType] - 排序类型，desc 降序、asc 升序，默认降序  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tableStorageInfo data\n      */\n\n  describeSchemaSpaceTop (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSchemaSpaceTop\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeSchemaSpaceTop\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.sortField !== undefined && opts.sortField !== null) {\n      queryParams['sortField'] = opts.sortField\n    }\n    if (opts.sortType !== undefined && opts.sortType !== null) {\n      queryParams['sortType'] = opts.sortType\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSchemaSpaceTop with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/schemaSpaceTop',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  空间明细\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {string} [opts.sortField] - 排序字段：表空间(totalSize)、表数据空间(dataSize)、索引空间(idxSize)、碎片率(fragment)、行数(dataRows)  optional\n      * @param {string} [opts.sortType] - 排序类型，desc 降序、asc 升序，默认降序  optional\n      * @param {string} [opts.dbName] - 过滤的数据库名  optional\n      * @param {string} [opts.tableName] - 过滤的表名  optional\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageIndex 为-1时，返回所有数据页码  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tableStorageInfo data\n      * @param integer totalCount  总数\n      */\n\n  describeTableSpaceDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTableSpaceDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeTableSpaceDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.sortField !== undefined && opts.sortField !== null) {\n      queryParams['sortField'] = opts.sortField\n    }\n    if (opts.sortType !== undefined && opts.sortType !== null) {\n      queryParams['sortType'] = opts.sortType\n    }\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      queryParams['dbName'] = opts.dbName\n    }\n    if (opts.tableName !== undefined && opts.tableName !== null) {\n      queryParams['tableName'] = opts.tableName\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTableSpaceDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/tableSpaceDetail',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  实例所有的库名\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  describeAllDbInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAllDbInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeAllDbInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAllDbInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/allDbInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取指定库下的所有表名\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例。\n      * @param {string} [opts.dbName] - 数据库名  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  describeAllTableInfoForDb (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAllTableInfoForDb\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeAllTableInfoForDb\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      queryParams['dbName'] = opts.dbName\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAllTableInfoForDb with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/allTableInfoForDb',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前实例系统信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bufferPoolInfo bufferPoolInfo  Buffer Pool信息\n      * @param connectionInfo connectionInfo  连接信息\n      * @param serverInfo serverInfo  Server信息\n      */\n\n  describeSystemInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSystemInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling describeSystemInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSystemInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/systemInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询支持诊断的类型\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param table data\n      */\n\n  checkTableTypes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkTableTypes\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling checkTableTypes\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkTableTypes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/checkTableTypes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据诊断id进行表诊断\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceGid - 实例ID\n      * @param {integer} opts.checkTypeId - 诊断类型id\n      * @param {integer} [opts.pageIndex] - 显示数据的页码，默认为1，取值范围：[-1,∞)  pageIndex 为-1时，返回所有数据页码  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[1,100]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param fieldList data\n      * @param integer totalCount  总条数\n      */\n\n  checkTableByType (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkTableByType\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceGid === undefined || opts.instanceGid === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceGid' when calling checkTableByType\"\n      )\n    }\n    if (opts.checkTypeId === undefined || opts.checkTypeId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.checkTypeId' when calling checkTableByType\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.checkTypeId !== undefined && opts.checkTypeId !== null) {\n      queryParams['checkTypeId'] = opts.checkTypeId\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceGid: opts.instanceGid\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  smartdba/2.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkTableByType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceGid}/checkTables',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = SMARTDBA\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/sms/v1/sms.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Send-Message-Related-APIs\n * 模版相关API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'sms'\nService._services[serviceId] = true\n\n/**\n * sms service.\n * @version 1.3.3\n */\n\nclass SMS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'sms.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  指定模板群发短信接口。接口调用需要使用京东云统一鉴权的SDK方式接入，以下文档仅是接口出参、入参描述，并不是最终程序实现逻辑的范例，具体接口实现请查看SDK参考：https://docs.jdcloud.com/cn/text-message/java\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板Id\n      * @param {string} opts.signId - 签名Id\n      * @param {array} [opts.phoneList] - 群发的国内电话号码,群发时一次最多不要超过100个手机号  optional\n      * @param {array} [opts.params] - 短信模板变量对应的数据值,Array格式  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param batchSendResp data  指定短信Id群发短信响应参数\n      * @param boolean status  请求状态\n      * @param integer code  错误码\n      * @param string message  错误消息\n      */\n\n  batchSend (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  batchSend\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling batchSend\"\n      )\n    }\n    if (opts.signId === undefined || opts.signId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signId' when calling batchSend\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n    if (opts.signId !== undefined && opts.signId !== null) {\n      postBody['signId'] = opts.signId\n    }\n    if (opts.phoneList !== undefined && opts.phoneList !== null) {\n      postBody['phoneList'] = opts.phoneList\n    }\n    if (opts.params !== undefined && opts.params !== null) {\n      postBody['params'] = opts.params\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  sms/1.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchSend with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/batchSend',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  短信发送回执接口。接口调用需要使用京东云统一鉴权的SDK方式接入，以下文档仅是接口出参、入参描述，并不是最终程序实现逻辑的范例，具体接口实现请查看SDK参考：https://docs.jdcloud.com/cn/text-message/java\n      * @param {Object} opts - parameters\n      * @param {string} opts.sequenceNumber - 发送短信的序列号\n      * @param {array} [opts.phoneList] - 需要获取回执的手机号码列表，选填  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param statusReportResp data\n      * @param boolean status  请求状态\n      * @param integer code  错误码\n      * @param string message  错误消息\n      */\n\n  statusReport (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  statusReport\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.sequenceNumber === undefined || opts.sequenceNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sequenceNumber' when calling statusReport\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sequenceNumber !== undefined && opts.sequenceNumber !== null) {\n      postBody['sequenceNumber'] = opts.sequenceNumber\n    }\n    if (opts.phoneList !== undefined && opts.phoneList !== null) {\n      postBody['phoneList'] = opts.phoneList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  sms/1.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call statusReport with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/statusReport',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  短信回复接口。 接口调用需要使用京东云统一鉴权的SDK方式接入，以下文档仅是接口出参、入参描述，并不是最终程序实现逻辑的范例，具体接口实现请查看SDK参考：https://docs.jdcloud.com/cn/text-message/java\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用Id\n      * @param {string} opts.dataDate - 查询时间\n      * @param {array} [opts.phoneList] - 手机号列表（选填）  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param replyResp data\n      * @param boolean status  请求状态\n      * @param integer code  错误码\n      * @param string message  错误消息\n      */\n\n  reply (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  reply\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling reply\"\n      )\n    }\n    if (opts.dataDate === undefined || opts.dataDate === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataDate' when calling reply\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.dataDate !== undefined && opts.dataDate !== null) {\n      postBody['dataDate'] = opts.dataDate\n    }\n    if (opts.phoneList !== undefined && opts.phoneList !== null) {\n      postBody['phoneList'] = opts.phoneList\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  sms/1.3.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call reply with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/reply',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = SMS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/sop/v1/sop.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 敏感操作配置\n * 操作敏感操作配置接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'sop'\nService._services[serviceId] = true\n\n/**\n * sop service.\n * @version 0.1.0\n */\n\nJDCloud.SOP = class SOP extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'sop.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  获取Token\n      * @param {Object} opts - parameters\n      * @param {getSecurityTokenInfo} opts.getSecurityTokenInfo - 获取SecurityToken参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string securityToken  安全令牌\n      */\n\n  getSecurityToken (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getSecurityToken\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.getSecurityTokenInfo === undefined ||\n      opts.getSecurityTokenInfo === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.getSecurityTokenInfo' when calling getSecurityToken\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.getSecurityTokenInfo !== undefined &&\n      opts.getSecurityTokenInfo !== null\n    ) {\n      postBody['getSecurityTokenInfo'] = opts.getSecurityTokenInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  sop/0.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSecurityToken with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/securityToken:getSecurityToken',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取操作保护设置信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.action - 操作action serviceName:actionName\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer status  操作保护启用状态：0-未启用, 1-已启用\n      * @param integer type  操作保护验证方式：0-无, 1-短信, 2-邮箱, 3-MFA\n      * @param string extInfo  扩展信息，type&#x3D;1时为掩码后的手机号码 type&#x3D;2时为掩码后的邮箱地址\n      */\n\n  getSensitiveOpSetting (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getSensitiveOpSetting\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.action === undefined || opts.action === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.action' when calling getSensitiveOpSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.action !== undefined && opts.action !== null) {\n      queryParams['action'] = opts.action\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  sop/0.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSensitiveOpSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/sensitiveOpSetting',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.SOP\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/ssl/v1/ssl.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SSL Certificate Manager\n * SSL数字证书信息管理接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ssl'\nService._services[serviceId] = true\n\n/**\n * ssl service.\n * @version 1.0.2\n */\n\nJDCloud.SSL = class SSL extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'ssl.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查看证书列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 第几页，从1开始计数  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数目  optional\n      * @param {string} [opts.domainName] - 域名，支持按照域名检索证书  optional\n      * @param {string} [opts.certIds] - 证书id/别名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param certListDetail certListDetails\n      * @param integer totalCount  总数量\n      */\n\n  describeCerts (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.domainName !== undefined && opts.domainName !== null) {\n      queryParams['domainName'] = opts.domainName\n    }\n    if (opts.certIds !== undefined && opts.certIds !== null) {\n      queryParams['certIds'] = opts.certIds\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ssl/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCerts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/sslCert',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看证书详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.certId - 证书 Id\n      * @param {integer} [opts.pageNumber] - 第几页，从1开始计数  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数目  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param certDescDetail certDescDetail\n      */\n\n  describeCert (opts, callback) {\n    opts = opts || {}\n\n    if (opts.certId === undefined || opts.certId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certId' when calling describeCert\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      certId: opts.certId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ssl/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/sslCert/{certId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除证书 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.certId - 证书 Id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  状态码\n      * @param string message  消息\n      */\n\n  deleteCerts (opts, callback) {\n    opts = opts || {}\n\n    if (opts.certId === undefined || opts.certId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certId' when calling deleteCerts\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      certId: opts.certId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ssl/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCerts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/sslCert/{certId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上传证书\n      * @param {Object} opts - parameters\n      * @param {string} opts.certName - 证书名称\n      * @param {string} opts.keyFile - 私钥\n      * @param {string} opts.certFile - 证书\n      * @param {string} [opts.aliasName] - 证书别名  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string certId\n      * @param string digest  对私钥文件使用sha256算法计算的摘要信息\n      */\n\n  uploadCert (opts, callback) {\n    opts = opts || {}\n\n    if (opts.certName === undefined || opts.certName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certName' when calling uploadCert\"\n      )\n    }\n    if (opts.keyFile === undefined || opts.keyFile === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyFile' when calling uploadCert\"\n      )\n    }\n    if (opts.certFile === undefined || opts.certFile === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certFile' when calling uploadCert\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.certName !== undefined && opts.certName !== null) {\n      postBody['certName'] = opts.certName\n    }\n    if (opts.keyFile !== undefined && opts.keyFile !== null) {\n      postBody['keyFile'] = opts.keyFile\n    }\n    if (opts.certFile !== undefined && opts.certFile !== null) {\n      postBody['certFile'] = opts.certFile\n    }\n    if (opts.aliasName !== undefined && opts.aliasName !== null) {\n      postBody['aliasName'] = opts.aliasName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ssl/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call uploadCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/sslCert:upload',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  下载证书 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.certId - 证书 Id\n      * @param {string} opts.serverType - 证书应用的服务器类型(Nginx Apache Tomcat IIS Other)\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param downloadCertDesc certDesc\n      */\n\n  downloadCert (opts, callback) {\n    opts = opts || {}\n\n    if (opts.certId === undefined || opts.certId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certId' when calling downloadCert\"\n      )\n    }\n    if (opts.serverType === undefined || opts.serverType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serverType' when calling downloadCert\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.serverType !== undefined && opts.serverType !== null) {\n      queryParams['serverType'] = opts.serverType\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      certId: opts.certId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ssl/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call downloadCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/sslCert/{certId}:download',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改证书名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.certId - 证书Id\n      * @param {string} opts.certName - 证书名称\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer code  状态码\n      * @param string message  消息\n      */\n\n  updateCertName (opts, callback) {\n    opts = opts || {}\n\n    if (opts.certId === undefined || opts.certId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certId' when calling updateCertName\"\n      )\n    }\n    if (opts.certName === undefined || opts.certName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certName' when calling updateCertName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.certId !== undefined && opts.certId !== null) {\n      postBody['certId'] = opts.certId\n    }\n    if (opts.certName !== undefined && opts.certName !== null) {\n      postBody['certName'] = opts.certName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ssl/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateCertName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/sslCert:updateName',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新证书 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.certId - 证书ID\n      * @param {string} opts.keyFile - 私钥\n      * @param {string} opts.certFile - 证书\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string certId  待更新证书ID\n      * @param string digest  对私钥文件使用sha256算法计算的摘要信息\n      */\n\n  updateCert (opts, callback) {\n    opts = opts || {}\n\n    if (opts.certId === undefined || opts.certId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certId' when calling updateCert\"\n      )\n    }\n    if (opts.keyFile === undefined || opts.keyFile === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyFile' when calling updateCert\"\n      )\n    }\n    if (opts.certFile === undefined || opts.certFile === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.certFile' when calling updateCert\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.certId !== undefined && opts.certId !== null) {\n      postBody['certId'] = opts.certId\n    }\n    if (opts.keyFile !== undefined && opts.keyFile !== null) {\n      postBody['keyFile'] = opts.keyFile\n    }\n    if (opts.certFile !== undefined && opts.certFile !== null) {\n      postBody['certFile'] = opts.certFile\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ssl/1.0.2'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/sslCert:updateCert',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.SSL\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/starshield/v1/starshield.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Zone-Settings\n * A Zone setting changes how the Zone works in relation to caching, security, or other features of JDC StarShield\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'starshield'\nService._services[serviceId] = true\n\n/**\n * starshield service.\n * @version 0.0.14\n */\n\nclass STARSHIELD extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'starshield.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  The dashboard view provides both totals and timeseries data for the given zone and time period across the entire scdn network.\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.zoneName\n      * @param {string} opts.since\n      * @param {string} opts.until\n      * @param {string} [opts.category]   optional\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneAnalytics zoneAnalytics\n      */\n\n  dashboard (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling dashboard\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling dashboard\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling dashboard\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling dashboard\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      queryParams['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      queryParams['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      queryParams['until'] = opts.until\n    }\n    if (opts.category !== undefined && opts.category !== null) {\n      queryParams['category'] = opts.category\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      queryParams['filters'] = opts.filters\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call dashboard with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$dashboard',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按请求次数统计。获取国家/地区的请求分布情况；获取路径、主机、设备类型的TopK.\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {} [opts.topK]   optional\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param topkAnalytics topkAnalytics\n      */\n\n  topK (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling topK\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.topK !== undefined && opts.topK !== null) {\n      postBody['topK'] = opts.topK\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call topK with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$topK',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按响应带宽统计。获取国家/地区的请求分布情况；获取路径、主机、设备类型的TopK.\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {} [opts.topK]   optional\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param topkAnalytics topkAnalytics\n      */\n\n  bandwidthTopK (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling bandwidthTopK\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.topK !== undefined && opts.topK !== null) {\n      postBody['topK'] = opts.topK\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bandwidthTopK with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$bandwidthTopK',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按请求次数统计，返回日期直方图.\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {} [opts.topK]   optional\n      * @param {} [opts.criterionName]   optional\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  dateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling dateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.topK !== undefined && opts.topK !== null) {\n      postBody['topK'] = opts.topK\n    }\n    if (opts.criterionName !== undefined && opts.criterionName !== null) {\n      postBody['criterionName'] = opts.criterionName\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call dateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$dateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按响应带宽统计，返回日期直方图.\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {} [opts.topK]   optional\n      * @param {} [opts.criterionName]   optional\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  dateHistogramBandwidth (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling dateHistogramBandwidth\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.topK !== undefined && opts.topK !== null) {\n      postBody['topK'] = opts.topK\n    }\n    if (opts.criterionName !== undefined && opts.criterionName !== null) {\n      postBody['criterionName'] = opts.criterionName\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call dateHistogramBandwidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$dateHistogramBandwidth',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按请求或响应带宽统计，返回日期直方图.\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {} [opts.direction]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param simpleDateHistogram data\n      */\n\n  bandwidthTrend (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling bandwidthTrend\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.direction !== undefined && opts.direction !== null) {\n      postBody['direction'] = opts.direction\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bandwidthTrend with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$bandwidthTrend',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按请求次数统计。获取内容类型、路径、主机、设备类型、国家/地区、状态代码的TopK.\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {} [opts.topK]   optional\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param topkAnalytics topkAnalytics\n      */\n\n  cacheTopK (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling cacheTopK\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.topK !== undefined && opts.topK !== null) {\n      postBody['topK'] = opts.topK\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cacheTopK with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$cacheTopK',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按响应带宽统计。获取内容类型、路径、主机、设备类型、国家/地区、状态代码的TopK.\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {} [opts.topK]   optional\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param topkAnalytics topkAnalytics\n      */\n\n  cacheBandwidthTopK (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling cacheBandwidthTopK\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.topK !== undefined && opts.topK !== null) {\n      postBody['topK'] = opts.topK\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cacheBandwidthTopK with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$cacheBandwidthTopK',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按请求次数统计，返回日期直方图.\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {} [opts.topK]   optional\n      * @param {} [opts.criterionName]   optional\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  cacheDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling cacheDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.topK !== undefined && opts.topK !== null) {\n      postBody['topK'] = opts.topK\n    }\n    if (opts.criterionName !== undefined && opts.criterionName !== null) {\n      postBody['criterionName'] = opts.criterionName\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cacheDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$cacheDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按响应带宽统计，返回日期直方图。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {} [opts.topK]   optional\n      * @param {} [opts.criterionName]   optional\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  cacheDateHistogramBandwidth (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling cacheDateHistogramBandwidth\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.topK !== undefined && opts.topK !== null) {\n      postBody['topK'] = opts.topK\n    }\n    if (opts.criterionName !== undefined && opts.criterionName !== null) {\n      postBody['criterionName'] = opts.criterionName\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cacheDateHistogramBandwidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$cacheDateHistogramBandwidth',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按防火墙事件数量统计。获取IP地址、用户代理、路径、主机、国家/地区、HTTP方法的TopK。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {} [opts.topK]   optional\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param topkAnalytics topkAnalytics\n      */\n\n  firewallTopK (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling firewallTopK\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.topK !== undefined && opts.topK !== null) {\n      postBody['topK'] = opts.topK\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call firewallTopK with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$firewallTopK',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按防火墙事件数量统计，返回日期直方图.\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {} [opts.topK]   optional\n      * @param {} [opts.criterionName]   optional\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  firewallDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling firewallDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.topK !== undefined && opts.topK !== null) {\n      postBody['topK'] = opts.topK\n    }\n    if (opts.criterionName !== undefined && opts.criterionName !== null) {\n      postBody['criterionName'] = opts.criterionName\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call firewallDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$firewallDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  qps on Zone\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.queryMode]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param simpleDateHistogram data\n      */\n\n  qpsZone (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling qpsZone\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call qpsZone with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/qps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域的每秒指标，request/bandwidth/waf/l7ddos/firewallRules\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.queryMode]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param simpleDateHistogram data\n      */\n\n  xps (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling xps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call xps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/xps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  qps\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId\n      * @param {} [opts.queryMode]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param simpleDateHistogram data\n      */\n\n  qpsInstance (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling qpsInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call qpsInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/qps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  bps on Zone\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.queryMode]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param simpleDateHistogram data\n      */\n\n  bpsZone (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling bpsZone\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bpsZone with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/bps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  bps\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId\n      * @param {} [opts.queryMode]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param simpleDateHistogram data\n      */\n\n  bpsInstance (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling bpsInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bpsInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/bps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  活动日志.\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {} [opts.pageNumber]   optional\n      * @param {} [opts.pageSize]   optional\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param number total\n      * @param activityLog activityLogs\n      */\n\n  firewallActivityLog (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling firewallActivityLog\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call firewallActivityLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$firewallActivityLog',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  访问日志.\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zoneName]   optional\n      * @param {} [opts.since]   optional\n      * @param {} [opts.until]   optional\n      * @param {} [opts.pageNumber]   optional\n      * @param {} [opts.pageSize]   optional\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param number total\n      * @param accessLog dataList\n      */\n\n  accessLog (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling accessLog\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call accessLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$accessLog',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  分组统计。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.zoneName\n      * @param {string} opts.since\n      * @param {string} opts.until\n      * @param {string} opts.criterionName\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param item items\n      */\n\n  groupBy (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling groupBy\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling groupBy\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling groupBy\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling groupBy\"\n      )\n    }\n    if (opts.criterionName === undefined || opts.criterionName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.criterionName' when calling groupBy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      queryParams['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      queryParams['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      queryParams['until'] = opts.until\n    }\n    if (opts.criterionName !== undefined && opts.criterionName !== null) {\n      queryParams['criterionName'] = opts.criterionName\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call groupBy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/analytics$$groupBy',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  listAvailablePageRuleSetting\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param availablePageRule dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  listAvailablePageRuleSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling listAvailablePageRuleSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listAvailablePageRuleSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/pagerules$$settings',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  Bot日期直方图.\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId - 域名标识\n      * @param {string} opts.since - 开始时间\n      * @param {string} opts.until - 结束时间\n      * @param {botFilter} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param botDateHistogram botDateHistogram\n      */\n\n  botDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling botDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling botDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling botDateHistogram\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.since !== undefined && opts.since !== null) {\n      queryParams['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      queryParams['until'] = opts.until\n    }\n    Object.assign(queryParams, super.buildArrayParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zoneId: opts.zoneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call botDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zoneId}/analyticsBotDateHistogram',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对于给定域，列出所有激活的证书包\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} [opts.status] - 包括所有状态的证书包，而不仅仅是激活状态的证书包。  optional\n      * @param {number} [opts.page] - 分页结果的页码  optional\n      * @param {number} [opts.per_page] - 每页的域数  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param certificatePack dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  listCertificatePacks (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling listCertificatePacks\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.page !== undefined && opts.page !== null) {\n      queryParams['page'] = opts.page\n    }\n    if (opts.per_page !== undefined && opts.per_page !== null) {\n      queryParams['per_page'] = opts.per_page\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listCertificatePacks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/ssl$$certificate_packs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对于给定域，删除高级证书包\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  deleteAdvancedCertificateManagerCertificatePack (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling deleteAdvancedCertificateManagerCertificatePack\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling deleteAdvancedCertificateManagerCertificatePack\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteAdvancedCertificateManagerCertificatePack with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/ssl$$certificate_packs/{identifier}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对于一个特定域，订购一个高级证书包\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.ty_pe] - 证书包的类型  optional\n      * @param {} [opts.hosts] - 以逗号分隔的证书包的有效主机名称列表。必须包含域的顶级域名，不得包含50个以上的主机，也不得为空。  optional\n      * @param {} [opts.validation_method] - 为订阅选择的验证方法  optional\n      * @param {} [opts.validity_days] - 为订阅选择的有效日期  optional\n      * @param {} [opts.certificate_authority] - 为该订阅选择的证书颁发机构。选择Let&#39;s Encrypt将减少对其他字段的定制。\nvalidation_method必须是&#39;txt&#39;，validity_days必须是90，cloudflare_branding必须省略，hosts必须只包含两个条目。\n一个是域名，一个是域名的子域通配符（例如 example.com, *.example.com）。\n  optional\n      * @param {} [opts.cloudflare_branding] - 是否为订阅添加星盾品牌。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param certificatePack data\n      */\n\n  orderAdvancedCertificateManagerCertificatePack (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling orderAdvancedCertificateManagerCertificatePack\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ty_pe !== undefined && opts.ty_pe !== null) {\n      postBody['ty_pe'] = opts.ty_pe\n    }\n    if (opts.hosts !== undefined && opts.hosts !== null) {\n      postBody['hosts'] = opts.hosts\n    }\n    if (\n      opts.validation_method !== undefined &&\n      opts.validation_method !== null\n    ) {\n      postBody['validation_method'] = opts.validation_method\n    }\n    if (opts.validity_days !== undefined && opts.validity_days !== null) {\n      postBody['validity_days'] = opts.validity_days\n    }\n    if (\n      opts.certificate_authority !== undefined &&\n      opts.certificate_authority !== null\n    ) {\n      postBody['certificate_authority'] = opts.certificate_authority\n    }\n    if (\n      opts.cloudflare_branding !== undefined &&\n      opts.cloudflare_branding !== null\n    ) {\n      postBody['cloudflare_branding'] = opts.cloudflare_branding\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call orderAdvancedCertificateManagerCertificatePack with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/ssl$$certificate_packs$$order',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域可以使用的可用自定义页面列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param customPage dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  listAvailableCustomPages (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling listAvailableCustomPages\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listAvailableCustomPages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/custom_pages',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新自定义页面URL\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.identifier\n      * @param {} [opts.url] - 与自定义页面关联的URL。  optional\n      * @param {} [opts.state] - 自定义页面状态  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param customPage data\n      */\n\n  updateCustomPageURL (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling updateCustomPageURL\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling updateCustomPageURL\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.url !== undefined && opts.url !== null) {\n      postBody['url'] = opts.url\n    }\n    if (opts.state !== undefined && opts.state !== null) {\n      postBody['state'] = opts.state\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateCustomPageURL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/custom_pages/{identifier}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  列出、搜索和筛选所有自定义SSL证书。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} [opts.status] - 域的自定义SSL的状态  optional\n      * @param {number} [opts.page] - 分页结果的页码  optional\n      * @param {number} [opts.per_page] - 每页的域数  optional\n      * @param {string} [opts.match] - 是否匹配所有搜索要求或至少一个（任何）  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param customSSL dataList\n      */\n\n  listSSLConfigurations (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling listSSLConfigurations\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.page !== undefined && opts.page !== null) {\n      queryParams['page'] = opts.page\n    }\n    if (opts.per_page !== undefined && opts.per_page !== null) {\n      queryParams['per_page'] = opts.per_page\n    }\n    if (opts.match !== undefined && opts.match !== null) {\n      queryParams['match'] = opts.match\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSSLConfigurations with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/custom_certificates',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上载域的新SSL证书\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.certificate] - 域的SSL证书或证书以及中间证书  optional\n      * @param {} [opts.private_key] - 域的私钥  optional\n      * @param {} [opts.bundle_method] - 合法值ubiquitous/optimal/force，默认值ubiquitous。\nubiquitous：SSL泛捆绑在各处有着最高的概率被验证，甚至能被使用过时的或不寻常的信任存储的客户端验证。\noptimal：最佳捆绑使用最短的认证链和最新的中间证书。\nforce：强制捆绑会验证证书链，但不以其他方式修改证书链。\n  optional\n      * @param {} [opts.geo_restrictions]   optional\n      * @param {} [opts.ty_pe] - “legacy_custom”类型支持在TLS握手中不包含SNI的传统客户端。\n合法值：\nlegacy_custom\nsni_custom\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param customSSL data\n      */\n\n  createSSLConfiguration (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling createSSLConfiguration\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.certificate !== undefined && opts.certificate !== null) {\n      postBody['certificate'] = opts.certificate\n    }\n    if (opts.private_key !== undefined && opts.private_key !== null) {\n      postBody['private_key'] = opts.private_key\n    }\n    if (opts.bundle_method !== undefined && opts.bundle_method !== null) {\n      postBody['bundle_method'] = opts.bundle_method\n    }\n    if (opts.geo_restrictions !== undefined && opts.geo_restrictions !== null) {\n      postBody['geo_restrictions'] = opts.geo_restrictions\n    }\n    if (opts.ty_pe !== undefined && opts.ty_pe !== null) {\n      postBody['ty_pe'] = opts.ty_pe\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSSLConfiguration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/custom_certificates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  上传SSL证书的新私钥和/或PEM/CRT。\n注意，更新sni_custom证书的配置将导致返回新的资源id，并删除之前的资源id。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.identifier\n      * @param {} [opts.private_key] - 域的私钥  optional\n      * @param {} [opts.certificate] - 域的SSL证书或证书以及中间证书  optional\n      * @param {} [opts.bundle_method] - 合法值ubiquitous/optimal/force，默认值ubiquitous。\nubiquitous：SSL泛捆绑在各处有着最高的概率被验证，甚至能被使用过时的或不寻常的信任存储的客户端验证。\noptimal：最佳捆绑使用最短的认证链和最新的中间证书。\nforce：强制捆绑会验证证书链，但不以其他方式修改证书链。\n  optional\n      * @param {} [opts.geo_restrictions]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param customSSL data\n      */\n\n  editSSLConfiguration (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling editSSLConfiguration\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling editSSLConfiguration\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.private_key !== undefined && opts.private_key !== null) {\n      postBody['private_key'] = opts.private_key\n    }\n    if (opts.certificate !== undefined && opts.certificate !== null) {\n      postBody['certificate'] = opts.certificate\n    }\n    if (opts.bundle_method !== undefined && opts.bundle_method !== null) {\n      postBody['bundle_method'] = opts.bundle_method\n    }\n    if (opts.geo_restrictions !== undefined && opts.geo_restrictions !== null) {\n      postBody['geo_restrictions'] = opts.geo_restrictions\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call editSSLConfiguration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/custom_certificates/{identifier}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  从域中删除SSL证书。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  deleteSSLConfiguration (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling deleteSSLConfiguration\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling deleteSSLConfiguration\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSSLConfiguration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/custom_certificates/{identifier}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  列出、搜索、排序和筛选域的DNS记录。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} [opts.match] - 是否匹配所有搜索要求或至少一个（任何）  optional\n      * @param {string} [opts.name] - DNS record name  optional\n      * @param {string} [opts.order] - 用于排序的字段  optional\n      * @param {number} [opts.page] - 分页结果的页码  optional\n      * @param {number} [opts.per_page] - 每页的DNS记录数  optional\n      * @param {string} [opts.content] - DNS记录内容  optional\n      * @param {string} [opts.type] - DNS记录类型  optional\n      * @param {boolean} [opts.proxied] - DNS记录代理状态  optional\n      * @param {string} [opts.direction] - asc - 升序；desc - 降序  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dnsRecord dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  listDNSRecords (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling listDNSRecords\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.match !== undefined && opts.match !== null) {\n      queryParams['match'] = opts.match\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.order !== undefined && opts.order !== null) {\n      queryParams['order'] = opts.order\n    }\n    if (opts.page !== undefined && opts.page !== null) {\n      queryParams['page'] = opts.page\n    }\n    if (opts.per_page !== undefined && opts.per_page !== null) {\n      queryParams['per_page'] = opts.per_page\n    }\n    if (opts.content !== undefined && opts.content !== null) {\n      queryParams['content'] = opts.content\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n    if (opts.proxied !== undefined && opts.proxied !== null) {\n      queryParams['proxied'] = opts.proxied\n    }\n    if (opts.direction !== undefined && opts.direction !== null) {\n      queryParams['direction'] = opts.direction\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listDNSRecords with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/dns_records',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建DNS记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.ty_pe] - DNS记录类型  optional\n      * @param {} opts.name - DNS记录名称\n      * @param {} opts.content - DNS记录内容\n      * @param {} opts.ttl - DNS记录的生存时间。值为1是 &quot;自动&quot;。\n      * @param {} [opts.priority] - 与一些记录如MX和SRV一起使用，以确定优先级。如果你没有为MX记录提供一个优先级，默认值为0将被设置。  optional\n      * @param {} [opts.proxied] - 是否利用星盾的性能和安全优势  optional\n      * @param {} [opts.srvData]   optional\n      * @param {} [opts.caaData]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dnsRecord data\n      */\n\n  createDNSRecord (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling createDNSRecord\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createDNSRecord\"\n      )\n    }\n    if (opts.content === undefined || opts.content === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.content' when calling createDNSRecord\"\n      )\n    }\n    if (opts.ttl === undefined || opts.ttl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ttl' when calling createDNSRecord\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ty_pe !== undefined && opts.ty_pe !== null) {\n      postBody['ty_pe'] = opts.ty_pe\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.content !== undefined && opts.content !== null) {\n      postBody['content'] = opts.content\n    }\n    if (opts.ttl !== undefined && opts.ttl !== null) {\n      postBody['ttl'] = opts.ttl\n    }\n    if (opts.priority !== undefined && opts.priority !== null) {\n      postBody['priority'] = opts.priority\n    }\n    if (opts.proxied !== undefined && opts.proxied !== null) {\n      postBody['proxied'] = opts.proxied\n    }\n    if (opts.srvData !== undefined && opts.srvData !== null) {\n      postBody['srvData'] = opts.srvData\n    }\n    if (opts.caaData !== undefined && opts.caaData !== null) {\n      postBody['caaData'] = opts.caaData\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDNSRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/dns_records',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  updateDNSRecord\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.identifier\n      * @param {} [opts.ty_pe] - DNS记录类型  optional\n      * @param {} opts.name - DNS记录名称\n      * @param {} opts.content - DNS记录内容\n      * @param {} opts.ttl - DNS记录的生存时间。值为1是 &quot;自动&quot;。\n      * @param {} [opts.proxied] - 是否利用星盾的性能和安全优势  optional\n      * @param {} [opts.priority] - 如果是MX记录，该属性是必需的  optional\n      * @param {} [opts.srvData]   optional\n      * @param {} [opts.caaData]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dnsRecord data\n      */\n\n  updateDNSRecord (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling updateDNSRecord\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling updateDNSRecord\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling updateDNSRecord\"\n      )\n    }\n    if (opts.content === undefined || opts.content === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.content' when calling updateDNSRecord\"\n      )\n    }\n    if (opts.ttl === undefined || opts.ttl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ttl' when calling updateDNSRecord\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ty_pe !== undefined && opts.ty_pe !== null) {\n      postBody['ty_pe'] = opts.ty_pe\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.content !== undefined && opts.content !== null) {\n      postBody['content'] = opts.content\n    }\n    if (opts.ttl !== undefined && opts.ttl !== null) {\n      postBody['ttl'] = opts.ttl\n    }\n    if (opts.proxied !== undefined && opts.proxied !== null) {\n      postBody['proxied'] = opts.proxied\n    }\n    if (opts.priority !== undefined && opts.priority !== null) {\n      postBody['priority'] = opts.priority\n    }\n    if (opts.srvData !== undefined && opts.srvData !== null) {\n      postBody['srvData'] = opts.srvData\n    }\n    if (opts.caaData !== undefined && opts.caaData !== null) {\n      postBody['caaData'] = opts.caaData\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateDNSRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/dns_records/{identifier}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  deleteDNSRecord\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  deleteDNSRecord (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling deleteDNSRecord\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling deleteDNSRecord\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDNSRecord with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/dns_records/{identifier}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建新过滤器\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param filter dataList\n      */\n\n  createFilters (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling createFilters\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.filters !== undefined && opts.filters !== null) {\n      postBody['filters'] = opts.filters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createFilters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/filters',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新一个现有的筛选器。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.id\n      * @param {} [opts.expression] - 要使用的筛选器表达式  optional\n      * @param {} [opts.paused] - 此筛选器当前是否已暂停  optional\n      * @param {} [opts.description] - 可用于描述过滤器用途的注释  optional\n      * @param {} [opts.ref] - 短引用标记，用于快速选择相关规则。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param filter data\n      */\n\n  updateIndividualFilter (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling updateIndividualFilter\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling updateIndividualFilter\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.expression !== undefined && opts.expression !== null) {\n      postBody['expression'] = opts.expression\n    }\n    if (opts.paused !== undefined && opts.paused !== null) {\n      postBody['paused'] = opts.paused\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.ref !== undefined && opts.ref !== null) {\n      postBody['ref'] = opts.ref\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateIndividualFilter with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/filters/{id}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  列出当前定义的所有防火墙规则。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} [opts.id] - 防火墙规则标识符  optional\n      * @param {string} [opts.description] - 描述中不区分大小写的搜索  optional\n      * @param {string} [opts.action] - 规则操作上的精确匹配  optional\n      * @param {boolean} [opts.paused] - 此防火墙规则当前是否已暂停。  optional\n      * @param {number} [opts.page] - 分页结果的页码  optional\n      * @param {number} [opts.per_page] - 每页的防火墙规则数  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param firewallRule dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  listOfFirewallRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling listOfFirewallRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.id !== undefined && opts.id !== null) {\n      queryParams['id'] = opts.id\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      queryParams['description'] = opts.description\n    }\n    if (opts.action !== undefined && opts.action !== null) {\n      queryParams['action'] = opts.action\n    }\n    if (opts.paused !== undefined && opts.paused !== null) {\n      queryParams['paused'] = opts.paused\n    }\n    if (opts.page !== undefined && opts.page !== null) {\n      queryParams['page'] = opts.page\n    }\n    if (opts.per_page !== undefined && opts.per_page !== null) {\n      queryParams['per_page'] = opts.per_page\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listOfFirewallRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/firewall$$rules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建新的防火墙规则。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.firewallRules]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param firewallRule dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  createFirewallRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling createFirewallRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.firewallRules !== undefined && opts.firewallRules !== null) {\n      postBody['firewallRules'] = opts.firewallRules\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createFirewallRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/firewall$$rules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新一个单独的现有防火墙规则。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.id\n      * @param {} [opts.action] - 应用于匹配请求的行动。注意，行动 &quot;log &quot;只适用于企业客户。  optional\n      * @param {} [opts.filter]   optional\n      * @param {} [opts.products]   optional\n      * @param {} [opts.priority] - 规则的优先级，允许控制处理顺序。一个较小的数字表示高优先级。如果不提供，任何有优先权的规则将在没有优先权的规则之前排序。  optional\n      * @param {} [opts.paused] - 此防火墙规则当前是否已暂停。  optional\n      * @param {} [opts.ref] - 短引用标记，用于快速选择相关规则。  optional\n      * @param {} [opts.action_parameters]   optional\n      * @param {} [opts.description] - 对规则的描述，以帮助识别它。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param firewallRule data\n      */\n\n  updateIndividualFirewallRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling updateIndividualFirewallRule\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling updateIndividualFirewallRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.action !== undefined && opts.action !== null) {\n      postBody['action'] = opts.action\n    }\n    if (opts.filter !== undefined && opts.filter !== null) {\n      postBody['filter'] = opts.filter\n    }\n    if (opts.products !== undefined && opts.products !== null) {\n      postBody['products'] = opts.products\n    }\n    if (opts.priority !== undefined && opts.priority !== null) {\n      postBody['priority'] = opts.priority\n    }\n    if (opts.paused !== undefined && opts.paused !== null) {\n      postBody['paused'] = opts.paused\n    }\n    if (opts.ref !== undefined && opts.ref !== null) {\n      postBody['ref'] = opts.ref\n    }\n    if (\n      opts.action_parameters !== undefined &&\n      opts.action_parameters !== null\n    ) {\n      postBody['action_parameters'] = opts.action_parameters\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateIndividualFirewallRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/firewall$$rules/{id}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除现有防火墙规则。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.id\n      * @param {boolean} [opts.delete_filter_if_unused]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param firewallRule data\n      */\n\n  deleteIndividualFirewallRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling deleteIndividualFirewallRules\"\n      )\n    }\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling deleteIndividualFirewallRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (\n      opts.delete_filter_if_unused !== undefined &&\n      opts.delete_filter_if_unused !== null\n    ) {\n      queryParams['delete_filter_if_unused'] = opts.delete_filter_if_unused\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteIndividualFirewallRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/firewall$$rules/{id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询Bot开启状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string zoneId  zone id\n      * @param string instanceId  套餐实例id\n      * @param string subscriptionType  订阅类型\n      * @param string subscriptionId  订阅id\n      * @param string switchStatus  开关状态\n      */\n\n  describeBotStatus (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling describeBotStatus\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zoneId: opts.zoneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBotStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/bot/{zoneId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启BOT\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  操作是否成功\n      */\n\n  openFirewallBot (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling openFirewallBot\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zoneId: opts.zoneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call openFirewallBot with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/bot/{zoneId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭BOT\n      * @param {Object} opts - parameters\n      * @param {string} opts.zoneId\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  操作是否成功\n      */\n\n  closeFirewallBot (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling closeFirewallBot\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zoneId: opts.zoneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call closeFirewallBot with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/bot/{zoneId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  套餐实例列表信息查询\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageSize] - 页容量，默认10, 范围（1-100）  optional\n      * @param {integer} [opts.pageNumber] - 页序号，默认1，不能小于1  optional\n      * @param {string} [opts.instanceName] - 实例名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeInstancesRes dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      queryParams['instanceName'] = opts.instanceName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建套餐实例，调用成功，将自动扣费（请保证账户充足，否则无法成功创建实例）。\n\n      * @param {Object} opts - parameters\n      * @param {} [opts.chargeMode] - 计费模式（CONFIG、FLOW、MONTHLY、ONCE）\nCONFIG 按配置\nFLOW 按用量\nMONTHLY 包年包月\nONCE 一次性\n  optional\n      * @param {} [opts.packType] - 套餐类型（BASIC、PROFESSIONAL、ENTERPRISE、ULTIMATE、SMB_EXPERIENCE、SMB_BASIC、SMB_BUSINESS）\nBASIC 包年包月 基础版\nPROFESSIONAL 包年包月 专业版\nENTERPRISE 包年包月 企业版\nULTIMATE 包年包月 旗舰版\n--------------------------\nSMB_EXPERIENCE 按流量 体验版\nSMB_BASIC 按流量 基础版\nSMB_BUSINESS 按流量 商业版\n  optional\n      * @param {} [opts.zonePackNum] - 域名增量包数量  optional\n      * @param {} [opts.duration] - 计费时长  optional\n      * @param {} [opts.durationUnit] - 计费时长单位（MONTH、YEAR）  optional\n      * @param {} [opts.autoRenewStatus] - 自动续费状态(OPEN-&gt;开通自动续费 CLOSE-&gt;关闭自动续费)  optional\n      * @param {} [opts.instanceName] - 实例名称  optional\n      * @param {} [opts.memo] - 备注  optional\n      * @param {} [opts.returnUrl] - 支付成功返回路径  optional\n      * @param {} [opts.buyScenario] - 购买上下文JSON字符串  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string buyId  购买ID，可通过调用describeInstanceByOrderNo接口获取实例详情\n      */\n\n  createInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.chargeMode !== undefined && opts.chargeMode !== null) {\n      postBody['chargeMode'] = opts.chargeMode\n    }\n    if (opts.packType !== undefined && opts.packType !== null) {\n      postBody['packType'] = opts.packType\n    }\n    if (opts.zonePackNum !== undefined && opts.zonePackNum !== null) {\n      postBody['zonePackNum'] = opts.zonePackNum\n    }\n    if (opts.duration !== undefined && opts.duration !== null) {\n      postBody['duration'] = opts.duration\n    }\n    if (opts.durationUnit !== undefined && opts.durationUnit !== null) {\n      postBody['durationUnit'] = opts.durationUnit\n    }\n    if (opts.autoRenewStatus !== undefined && opts.autoRenewStatus !== null) {\n      postBody['autoRenewStatus'] = opts.autoRenewStatus\n    }\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n    if (opts.memo !== undefined && opts.memo !== null) {\n      postBody['memo'] = opts.memo\n    }\n    if (opts.returnUrl !== undefined && opts.returnUrl !== null) {\n      postBody['returnUrl'] = opts.returnUrl\n    }\n    if (opts.buyScenario !== undefined && opts.buyScenario !== null) {\n      postBody['buyScenario'] = opts.buyScenario\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  购买流量包，调用成功，将自动扣费（请保证账户充足，否则无法成功创建流量包）。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} [opts.fixedFlowPackType] - 定量流量包类型(1-&gt;10TB 2-&gt;50TB 3-&gt;200TB 4-&gt;1PB 5-&gt;5PB)  optional\n      * @param {} [opts.fixedFlowPackNum] - 定量流量包数量  optional\n      * @param {} [opts.flowPackNum] - 按需购买流量包数量  optional\n      * @param {} [opts.returnUrl] - 支付成功返回路径  optional\n      * @param {} [opts.buyScenario] - 购买上下文JSON字符串  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string buyId  购买ID，购买ID，可通过调用describeInstanceByOrderNo接口获取流量包实例详情\n      */\n\n  createFlowPack (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createFlowPack\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createFlowPack\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.fixedFlowPackType !== undefined &&\n      opts.fixedFlowPackType !== null\n    ) {\n      postBody['fixedFlowPackType'] = opts.fixedFlowPackType\n    }\n    if (opts.fixedFlowPackNum !== undefined && opts.fixedFlowPackNum !== null) {\n      postBody['fixedFlowPackNum'] = opts.fixedFlowPackNum\n    }\n    if (opts.flowPackNum !== undefined && opts.flowPackNum !== null) {\n      postBody['flowPackNum'] = opts.flowPackNum\n    }\n    if (opts.returnUrl !== undefined && opts.returnUrl !== null) {\n      postBody['returnUrl'] = opts.returnUrl\n    }\n    if (opts.buyScenario !== undefined && opts.buyScenario !== null) {\n      postBody['buyScenario'] = opts.buyScenario\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createFlowPack with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/flowPack',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  升级套餐实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} [opts.packType] - 套餐类型  optional\n      * @param {} [opts.zonePackNum] - 域名增量包数量  optional\n      * @param {} [opts.returnUrl] - 支付成功后返回到该路径  optional\n      * @param {} [opts.buyScenario] - 购买上下文JSON字符串  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string buyId  购买ID\n      */\n\n  modifyInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.packType !== undefined && opts.packType !== null) {\n      postBody['packType'] = opts.packType\n    }\n    if (opts.zonePackNum !== undefined && opts.zonePackNum !== null) {\n      postBody['zonePackNum'] = opts.zonePackNum\n    }\n    if (opts.returnUrl !== undefined && opts.returnUrl !== null) {\n      postBody['returnUrl'] = opts.returnUrl\n    }\n    if (opts.buyScenario !== undefined && opts.buyScenario !== null) {\n      postBody['buyScenario'] = opts.buyScenario\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{instanceId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据订单号查询套餐实例详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.orderNumber\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeInstancesRes describeInstancesRes\n      */\n\n  describeInstanceByOrderNo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceByOrderNo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.orderNumber === undefined || opts.orderNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.orderNumber' when calling describeInstanceByOrderNo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      orderNumber: opts.orderNumber\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceByOrderNo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instance/{orderNumber}/describeInstance',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  套餐实例续费回调查询\n      * @param {Object} opts - parameters\n      * @param {string} opts.resourceList - 资源列表\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object data\n      */\n\n  selectDetailList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  selectDetailList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.resourceList === undefined || opts.resourceList === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceList' when calling selectDetailList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.resourceList !== undefined && opts.resourceList !== null) {\n      queryParams['resourceList'] = opts.resourceList\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call selectDetailList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:selectDetailList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  检查实例名称\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceName - 实例名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  checkInstancesName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  checkInstancesName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling checkInstancesName\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      queryParams['instanceName'] = opts.instanceName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkInstancesName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:checkName',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  星盾节点信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string jdcloudCidrs\n      */\n\n  ips (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  ips\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call ips with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ips',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  请求下单\n      * @param {Object} opts - parameters\n      * @param {} [opts.buyId] - 购买ID  optional\n      * @param {} [opts.autoPay] - 自动支付标识，当为true,才会发生自动支付，后付费的订单直接支付0元，预付费的订单（余额+代金劵）&gt; 订单应付金额，成功，否则支付失败  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string orderNumber  订单号\n      * @param boolean autoPay  自动支付标识\n      * @param string message  下单结果消息\n      */\n\n  submitOrder (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  submitOrder\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.buyId !== undefined && opts.buyId !== null) {\n      postBody['buyId'] = opts.buyId\n    }\n    if (opts.autoPay !== undefined && opts.autoPay !== null) {\n      postBody['autoPay'] = opts.autoPay\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call submitOrder with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:submitOrder',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  平均峰值带宽。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cdnSingleMetric cdnSingleMetric\n      */\n\n  instanceBandwidthAvg (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceBandwidthAvg\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling instanceBandwidthAvg\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceBandwidthAvg\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceBandwidthAvg\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceBandwidthAvg with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/instanceBandwidthAvg',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  带宽峰值。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cdnBandwidthMax cdnBandwidthMax\n      */\n\n  instanceBandwidthMax (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceBandwidthMax\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling instanceBandwidthMax\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceBandwidthMax\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceBandwidthMax\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceBandwidthMax with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/instanceBandwidthMax',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  95峰值带宽。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cdnSingleMetric cdnSingleMetric\n      */\n\n  instanceBandwidthP95 (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceBandwidthP95\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling instanceBandwidthP95\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceBandwidthP95\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceBandwidthP95\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceBandwidthP95 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/instanceBandwidthP95',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  带宽图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param simpleDateHistogram data\n      */\n\n  instanceBandwidthDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceBandwidthDateHistogram\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling instanceBandwidthDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceBandwidthDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceBandwidthDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceBandwidthDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/instanceBandwidthDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  多指标的带宽图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryModes - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\nall/normal/mitigation/cache/origin的任意组合\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  instanceBandwidthMultiDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceBandwidthMultiDateHistogram\"\n      )\n    }\n    if (opts.queryModes === undefined || opts.queryModes === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryModes' when calling instanceBandwidthMultiDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceBandwidthMultiDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceBandwidthMultiDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryModes !== undefined && opts.queryModes !== null) {\n      postBody['queryModes'] = opts.queryModes\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceBandwidthMultiDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/instanceBandwidthMultiDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  TopK域名的带宽图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  bandwidthDateHistogramTopK (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling bandwidthDateHistogramTopK\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling bandwidthDateHistogramTopK\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling bandwidthDateHistogramTopK\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling bandwidthDateHistogramTopK\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bandwidthDateHistogramTopK with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/bandwidthDateHistogramTopK',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按域名的TopK峰值带宽。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param topK data\n      */\n\n  bandwidthTopK (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling bandwidthTopK\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling bandwidthTopK\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling bandwidthTopK\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling bandwidthTopK\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bandwidthTopK with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/bandwidthTopK',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域名带宽列表，按带宽降序排列。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {} opts.pageNumber - 页码。当页码为-1时，返回所有记录\n      * @param {} [opts.pageSize] - 每页显示记录数。当pageNumber的值大于0时，该字段必须赋值  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param number total\n      * @param cdnZoneBandwidth cdnZoneBandwidths\n      */\n\n  instanceBandwidthList (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceBandwidthList\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling instanceBandwidthList\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceBandwidthList\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceBandwidthList\"\n      )\n    }\n    if (opts.pageNumber === undefined || opts.pageNumber === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageNumber' when calling instanceBandwidthList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceBandwidthList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/instanceBandwidthList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  总流量。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cdnSingleMetric cdnSingleMetric\n      */\n\n  instanceTrafficSum (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceTrafficSum\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling instanceTrafficSum\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceTrafficSum\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceTrafficSum\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceTrafficSum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/instanceTrafficSum',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  流量图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param simpleDateHistogram data\n      */\n\n  instanceTrafficDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceTrafficDateHistogram\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling instanceTrafficDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceTrafficDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceTrafficDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceTrafficDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/instanceTrafficDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  多指标的流量图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryModes - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\nall/normal/mitigation/cache/origin的任意组合\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  instanceTrafficMultiDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceTrafficMultiDateHistogram\"\n      )\n    }\n    if (opts.queryModes === undefined || opts.queryModes === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryModes' when calling instanceTrafficMultiDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceTrafficMultiDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceTrafficMultiDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryModes !== undefined && opts.queryModes !== null) {\n      postBody['queryModes'] = opts.queryModes\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceTrafficMultiDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/instanceTrafficMultiDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  TopK域名的流量图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  trafficDateHistogramTopK (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling trafficDateHistogramTopK\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling trafficDateHistogramTopK\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling trafficDateHistogramTopK\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling trafficDateHistogramTopK\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call trafficDateHistogramTopK with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/trafficDateHistogramTopK',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按域名的TopK总流量。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param topK data\n      */\n\n  trafficTopK (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling trafficTopK\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling trafficTopK\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling trafficTopK\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling trafficTopK\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call trafficTopK with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/trafficTopK',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  总请求量。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cdnSingleMetric cdnSingleMetric\n      */\n\n  instanceRequestSum (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceRequestSum\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling instanceRequestSum\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceRequestSum\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceRequestSum\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceRequestSum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/instanceRequestSum',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  请求量图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param simpleDateHistogram data\n      */\n\n  instanceRequestDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceRequestDateHistogram\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling instanceRequestDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceRequestDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceRequestDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceRequestDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/instanceRequestDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  多指标的请求量图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryModes - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\nall/normal/mitigation/cache/origin的任意组合\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  instanceRequestMultiDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceRequestMultiDateHistogram\"\n      )\n    }\n    if (opts.queryModes === undefined || opts.queryModes === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryModes' when calling instanceRequestMultiDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceRequestMultiDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceRequestMultiDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryModes !== undefined && opts.queryModes !== null) {\n      postBody['queryModes'] = opts.queryModes\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceRequestMultiDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/instanceRequestMultiDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  TopK域名的请求量图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  requestDateHistogramTopK (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling requestDateHistogramTopK\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling requestDateHistogramTopK\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling requestDateHistogramTopK\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling requestDateHistogramTopK\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call requestDateHistogramTopK with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/requestDateHistogramTopK',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  按域名的TopK总请求量。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.since - 查询开始时间\n      * @param {} opts.until - 查询结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param topK data\n      */\n\n  requestTopK (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling requestTopK\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling requestTopK\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling requestTopK\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling requestTopK\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call requestTopK with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/requestTopK',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  列出域的日志推送作业\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param logpushJob dataList\n      */\n\n  listLogpushJobs (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling listLogpushJobs\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listLogpushJobs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/logpush$$jobs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为域创建新的日志推送作业\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.zone_name] - 域名  optional\n      * @param {} [opts.destination_conf] - 唯一标识数据推送目的地的字符串。可能包括目的地支持的其他参数。\n例如：splunk://splunk.cf-analytics.com:8088/services/collector/raw?channel&#x3D;xxx&amp;header_Authorization&#x3D;Splunk xxx&amp;sourcetype&#x3D;xxx&amp;insecure-skip-verify&#x3D;false\n  optional\n      * @param {} [opts.name] - 可选的用户可读的作业名称。不是独一无二的。使用户更容易识别工作。建议包含域名称。  optional\n      * @param {} [opts.enabled] - 默认值false  optional\n      * @param {} [opts.dataset] - 要推送的数据集。合法值为：http/firewall。  optional\n      * @param {} [opts.logpull_options] - 它指定了诸如请求的字段和时间戳格式之类的内容。例如：fields&#x3D;fieldName1,fieldName2,fileNamek&amp;timestamps&#x3D;rfc3339&amp;sample&#x3D;0.1  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param logpushJob data\n      */\n\n  createLogpushJob (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling createLogpushJob\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zone_name !== undefined && opts.zone_name !== null) {\n      postBody['zone_name'] = opts.zone_name\n    }\n    if (opts.destination_conf !== undefined && opts.destination_conf !== null) {\n      postBody['destination_conf'] = opts.destination_conf\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n    if (opts.dataset !== undefined && opts.dataset !== null) {\n      postBody['dataset'] = opts.dataset\n    }\n    if (opts.logpull_options !== undefined && opts.logpull_options !== null) {\n      postBody['logpull_options'] = opts.logpull_options\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createLogpushJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/logpush$$jobs',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  数据集可用的所有字段的列表。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.dataset\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param logModule dataList\n      */\n\n  fields (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling fields\"\n      )\n    }\n    if (opts.dataset === undefined || opts.dataset === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataset' when calling fields\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      dataset: opts.dataset\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call fields with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/logpush$$datasets/{dataset}/fields',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  数据集可用的所有默认字段列表。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.dataset\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param logModule dataList\n      */\n\n  fieldsDefault (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling fieldsDefault\"\n      )\n    }\n    if (opts.dataset === undefined || opts.dataset === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dataset' when calling fieldsDefault\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      dataset: opts.dataset\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call fieldsDefault with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/logpush$$datasets/{dataset}/fieldsDefault',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新日志推送作业\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.job_identifier\n      * @param {} [opts.enabled]   optional\n      * @param {} [opts.logpull_options] - 它指定了诸如请求的字段和时间戳格式之类的内容。例如：fields&#x3D;fieldName1,fieldName2,fileNamek&amp;timestamps&#x3D;rfc3339&amp;sample&#x3D;0.1  optional\n      * @param {} [opts.destination_conf] - 唯一标识数据推送目的地的字符串。可能包括目的地支持的其他参数。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param logpushJob data\n      */\n\n  updateLogpushJob (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling updateLogpushJob\"\n      )\n    }\n    if (opts.job_identifier === undefined || opts.job_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.job_identifier' when calling updateLogpushJob\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n    if (opts.logpull_options !== undefined && opts.logpull_options !== null) {\n      postBody['logpull_options'] = opts.logpull_options\n    }\n    if (opts.destination_conf !== undefined && opts.destination_conf !== null) {\n      postBody['destination_conf'] = opts.destination_conf\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      job_identifier: opts.job_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateLogpushJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/logpush$$jobs/{job_identifier}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除日志推送作业\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.job_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param logpushJob data\n      */\n\n  deleteLogpushJob (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling deleteLogpushJob\"\n      )\n    }\n    if (opts.job_identifier === undefined || opts.job_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.job_identifier' when calling deleteLogpushJob\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      job_identifier: opts.job_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteLogpushJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/logpush$$jobs/{job_identifier}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  检查是否存在作业，处理该目标。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.destination_conf] - 唯一标识数据推送目的地的字符串。可能包括目的地支持的其他参数。\n例如：splunk://splunk.cf-analytics.com:8088/services/collector/raw?channel&#x3D;xxx&amp;header_Authorization&#x3D;Splunk xxx&amp;sourcetype&#x3D;xxx&amp;insecure-skip-verify&#x3D;false\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean data\n      */\n\n  checkDestinationExists (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling checkDestinationExists\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.destination_conf !== undefined && opts.destination_conf !== null) {\n      postBody['destination_conf'] = opts.destination_conf\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call checkDestinationExists with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/logpush$$validate$$destination$$exists',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  套餐包列表查询\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageSize] - 页容量，默认10, 范围（1-100）  optional\n      * @param {integer} [opts.pageNumber] - 页序号，默认1，不能小于1  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describePackRes dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  describePackages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePackages\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePackages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/packages',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  套餐包详情查询\n      * @param {Object} opts - parameters\n      * @param {integer} opts.packType - 套餐类型\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describePackRes describePackRes\n      */\n\n  describePackage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describePackage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.packType === undefined || opts.packType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.packType' when calling describePackage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      packType: opts.packType\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describePackage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/packages/{packType}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取页面规则列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} [opts.status] - 页面规则的状态  optional\n      * @param {string} [opts.order] - 用于按顺序排列页面规则的字段  optional\n      * @param {string} [opts.direction] - asc - 升序；desc - 降序  optional\n      * @param {string} [opts.match] - 是否匹配所有搜索要求或至少一个（任何）  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pageRule dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  listPageRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling listPageRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.order !== undefined && opts.order !== null) {\n      queryParams['order'] = opts.order\n    }\n    if (opts.direction !== undefined && opts.direction !== null) {\n      queryParams['direction'] = opts.direction\n    }\n    if (opts.match !== undefined && opts.match !== null) {\n      queryParams['match'] = opts.match\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listPageRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/pagerules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建页面规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.targets] - 根据请求评估的目标  optional\n      * @param {} [opts.actions] - 如果此规则的目标与请求匹配，则要执行的操作集。操作可以将url重定向到另一个url或覆盖设置（但不能同时覆盖两者）  optional\n      * @param {} [opts.priority] - 一个数字，表示一个页面规则优先于另一个页面规则。\n如果您可能有一个全面的页面规则（例如#1 “/images/”）\n但是想要更具体的规则优先（例如#2 &#39;/images/special/&#39;），\n您需要在后者（#2）上指定更高的优先级，以便它将覆盖第一个优先级。\n  optional\n      * @param {} [opts.status] - 页面规则的状态  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pageRule data\n      */\n\n  createPageRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling createPageRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.targets !== undefined && opts.targets !== null) {\n      postBody['targets'] = opts.targets\n    }\n    if (opts.actions !== undefined && opts.actions !== null) {\n      postBody['actions'] = opts.actions\n    }\n    if (opts.priority !== undefined && opts.priority !== null) {\n      postBody['priority'] = opts.priority\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createPageRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/pagerules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  替换页面规则。最终规则将与此请求传递的数据完全匹配。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.identifier\n      * @param {} [opts.targets] - 根据请求评估的目标  optional\n      * @param {} [opts.actions] - 如果此规则的目标与请求匹配，则要执行的操作集。操作可以将url重定向到另一个url或覆盖设置（但不能同时覆盖两者）  optional\n      * @param {} [opts.priority] - 一个数字，表示一个页面规则优先于另一个页面规则。\n如果您可能有一个全面的页面规则（例如#1 “/images/”）\n但是想要更具体的规则优先（例如#2 &#39;/images/special/&#39;），\n您需要在后者（#2）上指定更高的优先级，以便它将覆盖第一个优先级。\n  optional\n      * @param {} [opts.status] - 页面规则的状态  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pageRule data\n      */\n\n  updatePageRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling updatePageRule\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling updatePageRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.targets !== undefined && opts.targets !== null) {\n      postBody['targets'] = opts.targets\n    }\n    if (opts.actions !== undefined && opts.actions !== null) {\n      postBody['actions'] = opts.actions\n    }\n    if (opts.priority !== undefined && opts.priority !== null) {\n      postBody['priority'] = opts.priority\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updatePageRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/pagerules/{identifier}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除页面规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string data\n      */\n\n  deletePageRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling deletePageRule\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling deletePageRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deletePageRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/pagerules/{identifier}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取规则集。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_id\n      * @param {string} opts.phase - 执行规则集的阶段，有效值http_ratelimit（速率限制阶段）/http_request_late_transform（转换阶段）/http_request_firewall_custom（防火墙规则）/http_request_firewall_managed（托管阶段）\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ruleSet data\n      */\n\n  getRuleSet (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_id === undefined || opts.zone_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_id' when calling getRuleSet\"\n      )\n    }\n    if (opts.phase === undefined || opts.phase === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.phase' when calling getRuleSet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_id: opts.zone_id,\n      phase: opts.phase\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRuleSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_id}/rulesets$$phases/{phase}/entrypoint',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建规则集\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_id\n      * @param {string} opts.phase - 执行规则集的阶段，有效值http_ratelimit http_request_late_transform。\n      * @param {} [opts.rules]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ruleSet data\n      */\n\n  createRuleSet (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_id === undefined || opts.zone_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_id' when calling createRuleSet\"\n      )\n    }\n    if (opts.phase === undefined || opts.phase === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.phase' when calling createRuleSet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.rules !== undefined && opts.rules !== null) {\n      postBody['rules'] = opts.rules\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_id: opts.zone_id,\n      phase: opts.phase\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRuleSet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_id}/rulesets$$phases/{phase}/entrypoint',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_id\n      * @param {string} opts.ruleset_id\n      * @param {} [opts.enabled] - 是否开启规则，有效值true/false。  optional\n      * @param {} [opts.description] - 规则的描述。  optional\n      * @param {} [opts.expression] - 表达式。  optional\n      * @param {} [opts.action] - 当表达式匹配时，采取的措施。有效值block（阻止）/challenge（交互式质询）/js_challenge（JS质询）/managed_challenge（托管质询）/log（记录）/rewrite/skip（跳过）/execute。  optional\n      * @param {} [opts.action_parameters]   optional\n      * @param {} [opts.ratelimit]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ruleSet data\n      */\n\n  createRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_id === undefined || opts.zone_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_id' when calling createRule\"\n      )\n    }\n    if (opts.ruleset_id === undefined || opts.ruleset_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleset_id' when calling createRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.expression !== undefined && opts.expression !== null) {\n      postBody['expression'] = opts.expression\n    }\n    if (opts.action !== undefined && opts.action !== null) {\n      postBody['action'] = opts.action\n    }\n    if (\n      opts.action_parameters !== undefined &&\n      opts.action_parameters !== null\n    ) {\n      postBody['action_parameters'] = opts.action_parameters\n    }\n    if (opts.ratelimit !== undefined && opts.ratelimit !== null) {\n      postBody['ratelimit'] = opts.ratelimit\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_id: opts.zone_id,\n      ruleset_id: opts.ruleset_id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_id}/rulesets/{ruleset_id}/rules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新规则。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_id\n      * @param {string} opts.ruleset_id\n      * @param {string} opts.rule_id\n      * @param {} [opts.enabled] - 是否开启规则，有效值true/false。  optional\n      * @param {} [opts.description] - 规则的描述。  optional\n      * @param {} [opts.expression] - 表达式。  optional\n      * @param {} [opts.action] - 当表达式匹配时，采取的措施。有效值block（阻止）/challenge（交互式质询）/js_challenge（JS质询）/managed_challenge（托管质询）/log（记录）/rewrite/skip（跳过）。  optional\n      * @param {} [opts.action_parameters]   optional\n      * @param {} [opts.ratelimit]   optional\n      * @param {} [opts.logging]   optional\n      * @param {} [opts.position]   optional\n      * @param {} [opts.id] - 规则标识。  optional\n      * @param {} [opts.version] - 规则版本。  optional\n      * @param {} [opts.last_updated] - 最近更新时间。  optional\n      * @param {} [opts.ref] - 规则引用（默认是规则标识）。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ruleSet data\n      */\n\n  updateRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_id === undefined || opts.zone_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_id' when calling updateRule\"\n      )\n    }\n    if (opts.ruleset_id === undefined || opts.ruleset_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleset_id' when calling updateRule\"\n      )\n    }\n    if (opts.rule_id === undefined || opts.rule_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.rule_id' when calling updateRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.expression !== undefined && opts.expression !== null) {\n      postBody['expression'] = opts.expression\n    }\n    if (opts.action !== undefined && opts.action !== null) {\n      postBody['action'] = opts.action\n    }\n    if (\n      opts.action_parameters !== undefined &&\n      opts.action_parameters !== null\n    ) {\n      postBody['action_parameters'] = opts.action_parameters\n    }\n    if (opts.ratelimit !== undefined && opts.ratelimit !== null) {\n      postBody['ratelimit'] = opts.ratelimit\n    }\n    if (opts.logging !== undefined && opts.logging !== null) {\n      postBody['logging'] = opts.logging\n    }\n    if (opts.position !== undefined && opts.position !== null) {\n      postBody['position'] = opts.position\n    }\n    if (opts.id !== undefined && opts.id !== null) {\n      postBody['id'] = opts.id\n    }\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n    if (opts.last_updated !== undefined && opts.last_updated !== null) {\n      postBody['last_updated'] = opts.last_updated\n    }\n    if (opts.ref !== undefined && opts.ref !== null) {\n      postBody['ref'] = opts.ref\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_id: opts.zone_id,\n      ruleset_id: opts.ruleset_id,\n      rule_id: opts.rule_id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_id}/rulesets/{ruleset_id}/rules/{rule_id}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除规则。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_id\n      * @param {string} opts.ruleset_id\n      * @param {string} opts.rule_id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param ruleSet data\n      */\n\n  deleteRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_id === undefined || opts.zone_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_id' when calling deleteRule\"\n      )\n    }\n    if (opts.ruleset_id === undefined || opts.ruleset_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleset_id' when calling deleteRule\"\n      )\n    }\n    if (opts.rule_id === undefined || opts.rule_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.rule_id' when calling deleteRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_id: opts.zone_id,\n      ruleset_id: opts.ruleset_id,\n      rule_id: opts.rule_id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_id}/rulesets/{ruleset_id}/rules/{rule_id}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  实例Spectrum应用流量统计.\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {string} opts.since - 开始时间\n      * @param {string} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param paDateHistogram paDateHistogram\n      */\n\n  instanceTrafficDateHistogram4Pa (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceTrafficDateHistogram4Pa\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceTrafficDateHistogram4Pa\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceTrafficDateHistogram4Pa\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.since !== undefined && opts.since !== null) {\n      queryParams['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      queryParams['until'] = opts.until\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceTrafficDateHistogram4Pa with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/paTrafficDateHistogram',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域名Spectrum应用流量统计.\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {string} opts.zoneId - 域名标识\n      * @param {string} opts.since - 开始时间\n      * @param {string} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param paDateHistogram paDateHistogram\n      */\n\n  zoneTrafficDateHistogram4Pa (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling zoneTrafficDateHistogram4Pa\"\n      )\n    }\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling zoneTrafficDateHistogram4Pa\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneTrafficDateHistogram4Pa\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneTrafficDateHistogram4Pa\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.since !== undefined && opts.since !== null) {\n      queryParams['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      queryParams['until'] = opts.until\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId,\n      zoneId: opts.zoneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneTrafficDateHistogram4Pa with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/zones/{zoneId}/paTrafficDateHistogram',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  Spectrum应用流量统计.\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {string} opts.zoneId - 域名标识\n      * @param {string} opts.spectrumAppId - 应用标识\n      * @param {string} opts.since - 开始时间\n      * @param {string} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param paDateHistogram paDateHistogram\n      */\n\n  spectrumAppTrafficDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling spectrumAppTrafficDateHistogram\"\n      )\n    }\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling spectrumAppTrafficDateHistogram\"\n      )\n    }\n    if (opts.spectrumAppId === undefined || opts.spectrumAppId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.spectrumAppId' when calling spectrumAppTrafficDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling spectrumAppTrafficDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling spectrumAppTrafficDateHistogram\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.since !== undefined && opts.since !== null) {\n      queryParams['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      queryParams['until'] = opts.until\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId,\n      zoneId: opts.zoneId,\n      spectrumAppId: opts.spectrumAppId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call spectrumAppTrafficDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/zones/{zoneId}/spectrumApps/{spectrumAppId}/paTrafficDateHistogram',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  实例Spectrum应用带宽统计.\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {string} opts.since - 开始时间\n      * @param {string} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param paDateHistogram paDateHistogram\n      */\n\n  instanceBandwidthDateHistogram4Pa (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling instanceBandwidthDateHistogram4Pa\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling instanceBandwidthDateHistogram4Pa\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling instanceBandwidthDateHistogram4Pa\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.since !== undefined && opts.since !== null) {\n      queryParams['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      queryParams['until'] = opts.until\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call instanceBandwidthDateHistogram4Pa with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/paBandwidthDateHistogram',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域名Spectrum应用带宽统计.\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {string} opts.zoneId - 域名标识\n      * @param {string} opts.since - 开始时间\n      * @param {string} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param paDateHistogram paDateHistogram\n      */\n\n  zoneBandwidthDateHistogram4Pa (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling zoneBandwidthDateHistogram4Pa\"\n      )\n    }\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling zoneBandwidthDateHistogram4Pa\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneBandwidthDateHistogram4Pa\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneBandwidthDateHistogram4Pa\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.since !== undefined && opts.since !== null) {\n      queryParams['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      queryParams['until'] = opts.until\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId,\n      zoneId: opts.zoneId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneBandwidthDateHistogram4Pa with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/zones/{zoneId}/paBandwidthDateHistogram',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  Spectrum应用带宽统计.\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例标识\n      * @param {string} opts.zoneId - 域名标识\n      * @param {string} opts.spectrumAppId - 应用标识\n      * @param {string} opts.since - 开始时间\n      * @param {string} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param paDateHistogram paDateHistogram\n      */\n\n  spectrumAppBandwidthDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling spectrumAppBandwidthDateHistogram\"\n      )\n    }\n    if (opts.zoneId === undefined || opts.zoneId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneId' when calling spectrumAppBandwidthDateHistogram\"\n      )\n    }\n    if (opts.spectrumAppId === undefined || opts.spectrumAppId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.spectrumAppId' when calling spectrumAppBandwidthDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling spectrumAppBandwidthDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling spectrumAppBandwidthDateHistogram\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.since !== undefined && opts.since !== null) {\n      queryParams['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      queryParams['until'] = opts.until\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId,\n      zoneId: opts.zoneId,\n      spectrumAppId: opts.spectrumAppId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call spectrumAppBandwidthDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/instances/{instanceId}/zones/{zoneId}/spectrumApps/{spectrumAppId}/paBandwidthDateHistogram',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取域的通用SSL证书设置\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param universalSSLSetting data\n      */\n\n  universalSSLSettingsDetails (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling universalSSLSettingsDetails\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call universalSSLSettingsDetails with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/ssl$$universal$$settings',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修补域的通用SSL设置\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.enabled] - 禁用通用SSL将从边缘上删除域的所有当前激活的通用SSL证书并且防止将来订购任何通用SSL证书。如果没有为域上载专用证书或自定义证书，访问者将无法通过HTTPS访问域。\n通过禁用通用SSL，您知道以下星盾设置和首选项将导致访问者无法访问您的域，除非您上载了自定义证书或购买了专用证书。\n  * HSTS\n  * Always Use HTTPS\n  * Opportunistic Encryption\n  * Onion Routing\n  * Any Page Rules redirecting traffic to HTTPS\n类似地，在启用星盾代理时，在源站将任何HTTP重定向到HTTPS将导致用户在星盾的边缘没有有效证书的情况下无法访问您的站点。\n如果您在星盾的边缘没有有效的自定义或专用证书，并且不确定是否启用了上述任何星盾设置，或者如果您的源站存在任何HTTP重定向，我们建议您的域保持启用通用SSL。\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param universalSSLSetting data\n      */\n\n  editUniversalSSLSettings (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling editUniversalSSLSettings\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call editUniversalSSLSettings with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/ssl$$universal$$settings',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  搜索、列出和排序包中包含的规则组\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.package_identifier\n      * @param {string} [opts.name] - 防火墙规则组名称  optional\n      * @param {string} [opts.mode] - 此组中包含的规则是否可配置/可用  optional\n      * @param {number} [opts.rules_count] - 此组中包含多少条规则  optional\n      * @param {number} [opts.page] - 分页结果的页码  optional\n      * @param {number} [opts.per_page] - 每页的组数  optional\n      * @param {string} [opts.order] - 按字段对组进行排序  optional\n      * @param {string} [opts.direction] - asc-升序；desc-降序  optional\n      * @param {string} [opts.match] - 是否匹配所有搜索要求或至少一个（任何）  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param wAFRuleGroup dataList\n      */\n\n  listRuleGroups (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling listRuleGroups\"\n      )\n    }\n    if (\n      opts.package_identifier === undefined ||\n      opts.package_identifier === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.package_identifier' when calling listRuleGroups\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.mode !== undefined && opts.mode !== null) {\n      queryParams['mode'] = opts.mode\n    }\n    if (opts.rules_count !== undefined && opts.rules_count !== null) {\n      queryParams['rules_count'] = opts.rules_count\n    }\n    if (opts.page !== undefined && opts.page !== null) {\n      queryParams['page'] = opts.page\n    }\n    if (opts.per_page !== undefined && opts.per_page !== null) {\n      queryParams['per_page'] = opts.per_page\n    }\n    if (opts.order !== undefined && opts.order !== null) {\n      queryParams['order'] = opts.order\n    }\n    if (opts.direction !== undefined && opts.direction !== null) {\n      queryParams['direction'] = opts.direction\n    }\n    if (opts.match !== undefined && opts.match !== null) {\n      queryParams['match'] = opts.match\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      package_identifier: opts.package_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listRuleGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/firewall$$waf$$packages/{package_identifier}/groups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取单个规则组\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.package_identifier\n      * @param {string} opts.identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param wAFRuleGroup data\n      */\n\n  ruleGroupDetails (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling ruleGroupDetails\"\n      )\n    }\n    if (\n      opts.package_identifier === undefined ||\n      opts.package_identifier === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.package_identifier' when calling ruleGroupDetails\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling ruleGroupDetails\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      package_identifier: opts.package_identifier,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call ruleGroupDetails with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/firewall$$waf$$packages/{package_identifier}/groups/{identifier}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新规则组的状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.package_identifier\n      * @param {string} opts.identifier\n      * @param {} [opts.mode] - 该组中包含的规则是否可配置/可使用  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param wAFRuleGroup data\n      */\n\n  editRuleGroup (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling editRuleGroup\"\n      )\n    }\n    if (\n      opts.package_identifier === undefined ||\n      opts.package_identifier === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.package_identifier' when calling editRuleGroup\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling editRuleGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.mode !== undefined && opts.mode !== null) {\n      postBody['mode'] = opts.mode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      package_identifier: opts.package_identifier,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call editRuleGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/firewall$$waf$$packages/{package_identifier}/groups/{identifier}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  检索域的防火墙包\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} [opts.name] - Name of the firewall package  optional\n      * @param {number} [opts.page] - Page number of paginated results  optional\n      * @param {number} [opts.per_page] - 每页的包数  optional\n      * @param {string} [opts.order] - 按字段对包排序  optional\n      * @param {string} [opts.direction] - asc - 升序；desc - 降序  optional\n      * @param {string} [opts.match] - 是否匹配所有搜索要求或至少一个（任何）  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param wAFRulePackage dataList\n      */\n\n  listFirewallPackages (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling listFirewallPackages\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.page !== undefined && opts.page !== null) {\n      queryParams['page'] = opts.page\n    }\n    if (opts.per_page !== undefined && opts.per_page !== null) {\n      queryParams['per_page'] = opts.per_page\n    }\n    if (opts.order !== undefined && opts.order !== null) {\n      queryParams['order'] = opts.order\n    }\n    if (opts.direction !== undefined && opts.direction !== null) {\n      queryParams['direction'] = opts.direction\n    }\n    if (opts.match !== undefined && opts.match !== null) {\n      queryParams['match'] = opts.match\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listFirewallPackages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/firewall$$waf$$packages',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取有关单个防火墙包的信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param wAFRulePackage data\n      */\n\n  firewallPackageDetails (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling firewallPackageDetails\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling firewallPackageDetails\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call firewallPackageDetails with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/firewall$$waf$$packages/{identifier}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更改异常检测类型WAF规则包的灵敏度和操作\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} opts.identifier\n      * @param {} [opts.sensitivity] - 防火墙包的敏感度。  optional\n      * @param {} [opts.action_mode] - 将对防火墙包下的规则执行的默认操作。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param wAFRulePackage data\n      */\n\n  editFirewallPackage (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling editFirewallPackage\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling editFirewallPackage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sensitivity !== undefined && opts.sensitivity !== null) {\n      postBody['sensitivity'] = opts.sensitivity\n    }\n    if (opts.action_mode !== undefined && opts.action_mode !== null) {\n      postBody['action_mode'] = opts.action_mode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call editFirewallPackage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/firewall$$waf$$packages/{identifier}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  包内的搜索、排序和筛选规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_id\n      * @param {string} opts.package_id\n      * @param {string} [opts.mode] - 已将规则覆盖到的设置  optional\n      * @param {string} [opts.priority] - 在相关组中执行单个规则的顺序  optional\n      * @param {string} [opts.match] - 是否匹配所有搜索要求或至少一个（任何）  optional\n      * @param {string} [opts.order] - 按指定字段排序  optional\n      * @param {number} [opts.page] - 分页结果的页码  optional\n      * @param {number} [opts.per_page] - 每页的规则数  optional\n      * @param {string} [opts.group_id] - WAF组标识符标签  optional\n      * @param {string} [opts.description] - 规则的公开说明  optional\n      * @param {string} [opts.direction] - asc-升序；desc-降序  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param wAFRule dataList\n      */\n\n  listRules (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_id === undefined || opts.zone_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_id' when calling listRules\"\n      )\n    }\n    if (opts.package_id === undefined || opts.package_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.package_id' when calling listRules\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.mode !== undefined && opts.mode !== null) {\n      queryParams['mode'] = opts.mode\n    }\n    if (opts.priority !== undefined && opts.priority !== null) {\n      queryParams['priority'] = opts.priority\n    }\n    if (opts.match !== undefined && opts.match !== null) {\n      queryParams['match'] = opts.match\n    }\n    if (opts.order !== undefined && opts.order !== null) {\n      queryParams['order'] = opts.order\n    }\n    if (opts.page !== undefined && opts.page !== null) {\n      queryParams['page'] = opts.page\n    }\n    if (opts.per_page !== undefined && opts.per_page !== null) {\n      queryParams['per_page'] = opts.per_page\n    }\n    if (opts.group_id !== undefined && opts.group_id !== null) {\n      queryParams['group_id'] = opts.group_id\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      queryParams['description'] = opts.description\n    }\n    if (opts.direction !== undefined && opts.direction !== null) {\n      queryParams['direction'] = opts.direction\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_id: opts.zone_id,\n      package_id: opts.package_id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_id}/firewall$$waf$$packages/{package_id}/rules',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  Individual information about a rule\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_id\n      * @param {string} opts.package_id\n      * @param {string} opts.identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param wAFRule data\n      */\n\n  ruleDetails (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_id === undefined || opts.zone_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_id' when calling ruleDetails\"\n      )\n    }\n    if (opts.package_id === undefined || opts.package_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.package_id' when calling ruleDetails\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling ruleDetails\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_id: opts.zone_id,\n      package_id: opts.package_id,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call ruleDetails with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_id}/firewall$$waf$$packages/{package_id}/rules/{identifier}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新规则在域上触发时将执行的操作\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_id\n      * @param {string} opts.package_id\n      * @param {string} opts.identifier\n      * @param {} [opts.mode] - 触发规则时使用的模式。值基于规则的allowed_modes进行限制。有效值default/disable/simulate/block/challenge/on/off  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param wAFRule data\n      */\n\n  editRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_id === undefined || opts.zone_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_id' when calling editRule\"\n      )\n    }\n    if (opts.package_id === undefined || opts.package_id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.package_id' when calling editRule\"\n      )\n    }\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling editRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.mode !== undefined && opts.mode !== null) {\n      postBody['mode'] = opts.mode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_id: opts.zone_id,\n      package_id: opts.package_id,\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call editRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_id}/firewall$$waf$$packages/{package_id}/rules/{identifier}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  平均峰值带宽。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier - 域名标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.zoneName - 域名\n      * @param {} opts.since - 开始时间\n      * @param {} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cdnSingleMetric cdnSingleMetric\n      */\n\n  zoneBandwidthAvg (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling zoneBandwidthAvg\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling zoneBandwidthAvg\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling zoneBandwidthAvg\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneBandwidthAvg\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneBandwidthAvg\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneBandwidthAvg with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/zoneBandwidthAvg',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  带宽峰值。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier - 域名标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.zoneName - 域名\n      * @param {} opts.since - 开始时间\n      * @param {} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cdnBandwidthMax cdnBandwidthMax\n      */\n\n  zoneBandwidthMax (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling zoneBandwidthMax\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling zoneBandwidthMax\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling zoneBandwidthMax\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneBandwidthMax\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneBandwidthMax\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneBandwidthMax with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/zoneBandwidthMax',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  95峰值带宽。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier - 域名标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.zoneName - 域名\n      * @param {} opts.since - 开始时间\n      * @param {} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cdnSingleMetric cdnSingleMetric\n      */\n\n  zoneBandwidthP95 (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling zoneBandwidthP95\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling zoneBandwidthP95\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling zoneBandwidthP95\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneBandwidthP95\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneBandwidthP95\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneBandwidthP95 with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/zoneBandwidthP95',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  带宽图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier - 域名标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.zoneName - 域名\n      * @param {} opts.since - 开始时间\n      * @param {} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param simpleDateHistogram data\n      */\n\n  zoneBandwidthDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling zoneBandwidthDateHistogram\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling zoneBandwidthDateHistogram\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling zoneBandwidthDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneBandwidthDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneBandwidthDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneBandwidthDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/zoneBandwidthDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  多指标的带宽图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier - 域名标识\n      * @param {} opts.queryModes - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\nall/normal/mitigation/cache/origin的任意组合\n\n      * @param {} opts.zoneName - 域名\n      * @param {} opts.since - 开始时间\n      * @param {} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  zoneBandwidthMultiDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling zoneBandwidthMultiDateHistogram\"\n      )\n    }\n    if (opts.queryModes === undefined || opts.queryModes === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryModes' when calling zoneBandwidthMultiDateHistogram\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling zoneBandwidthMultiDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneBandwidthMultiDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneBandwidthMultiDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryModes !== undefined && opts.queryModes !== null) {\n      postBody['queryModes'] = opts.queryModes\n    }\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneBandwidthMultiDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/zoneBandwidthMultiDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  总流量。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier - 域名标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.zoneName - 域名\n      * @param {} opts.since - 开始时间\n      * @param {} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cdnSingleMetric cdnSingleMetric\n      */\n\n  zoneTrafficSum (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling zoneTrafficSum\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling zoneTrafficSum\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling zoneTrafficSum\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneTrafficSum\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneTrafficSum\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneTrafficSum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/zoneTrafficSum',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  流量图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier - 域名标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.zoneName - 域名\n      * @param {} opts.since - 开始时间\n      * @param {} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param simpleDateHistogram data\n      */\n\n  zoneTrafficDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling zoneTrafficDateHistogram\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling zoneTrafficDateHistogram\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling zoneTrafficDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneTrafficDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneTrafficDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneTrafficDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/zoneTrafficDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  多指标的流量图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier - 域名标识\n      * @param {} opts.queryModes - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\nall/normal/mitigation/cache/origin的任意组合\n\n      * @param {} opts.zoneName - 域名\n      * @param {} opts.since - 开始时间\n      * @param {} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  zoneTrafficMultiDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling zoneTrafficMultiDateHistogram\"\n      )\n    }\n    if (opts.queryModes === undefined || opts.queryModes === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryModes' when calling zoneTrafficMultiDateHistogram\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling zoneTrafficMultiDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneTrafficMultiDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneTrafficMultiDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryModes !== undefined && opts.queryModes !== null) {\n      postBody['queryModes'] = opts.queryModes\n    }\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneTrafficMultiDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/zoneTrafficMultiDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  总请求量。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier - 域名标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.zoneName - 域名\n      * @param {} opts.since - 开始时间\n      * @param {} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cdnSingleMetric cdnSingleMetric\n      */\n\n  zoneRequestSum (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling zoneRequestSum\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling zoneRequestSum\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling zoneRequestSum\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneRequestSum\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneRequestSum\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneRequestSum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/zoneRequestSum',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  请求量图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier - 域名标识\n      * @param {} opts.queryMode - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\n\n      * @param {} opts.zoneName - 域名\n      * @param {} opts.since - 开始时间\n      * @param {} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param simpleDateHistogram data\n      */\n\n  zoneRequestDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling zoneRequestDateHistogram\"\n      )\n    }\n    if (opts.queryMode === undefined || opts.queryMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryMode' when calling zoneRequestDateHistogram\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling zoneRequestDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneRequestDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneRequestDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryMode !== undefined && opts.queryMode !== null) {\n      postBody['queryMode'] = opts.queryMode\n    }\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneRequestDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/zoneRequestDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  多指标的请求量图。查询范围最近6个月、查询最大跨度1个月。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier - 域名标识\n      * @param {} opts.queryModes - all - 所有\nnormal - 业务\nmitigation - 缓解\ncache - 缓存\norigin - 回源\nall/normal/mitigation/cache/origin的任意组合\n\n      * @param {} opts.zoneName - 域名\n      * @param {} opts.since - 开始时间\n      * @param {} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dateHistogram dateHistograms\n      * @param number timeScope\n      * @param string since\n      * @param string util\n      */\n\n  zoneRequestMultiDateHistogram (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling zoneRequestMultiDateHistogram\"\n      )\n    }\n    if (opts.queryModes === undefined || opts.queryModes === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryModes' when calling zoneRequestMultiDateHistogram\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling zoneRequestMultiDateHistogram\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneRequestMultiDateHistogram\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneRequestMultiDateHistogram\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.queryModes !== undefined && opts.queryModes !== null) {\n      postBody['queryModes'] = opts.queryModes\n    }\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneRequestMultiDateHistogram with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/zoneRequestMultiDateHistogram',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  安全报告导出\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier - 域名标识\n      * @param {} opts.zoneName - 域名\n      * @param {} opts.since - 开始时间\n      * @param {} opts.until - 结束时间\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSecurityReport zoneSecurityReport\n      */\n\n  zoneSecurityReport (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling zoneSecurityReport\"\n      )\n    }\n    if (opts.zoneName === undefined || opts.zoneName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zoneName' when calling zoneSecurityReport\"\n      )\n    }\n    if (opts.since === undefined || opts.since === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.since' when calling zoneSecurityReport\"\n      )\n    }\n    if (opts.until === undefined || opts.until === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.until' when calling zoneSecurityReport\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.zoneName !== undefined && opts.zoneName !== null) {\n      postBody['zoneName'] = opts.zoneName\n    }\n    if (opts.since !== undefined && opts.since !== null) {\n      postBody['since'] = opts.since\n    }\n    if (opts.until !== undefined && opts.until !== null) {\n      postBody['until'] = opts.until\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call zoneSecurityReport with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/zoneSecurityReport',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  列出、搜索、排序和筛选您的域\n      * @param {Object} opts - parameters\n      * @param {string} [opts.match] - 是否匹配所有搜索要求或至少一个（任何）  optional\n      * @param {string} [opts.name] - 域名  optional\n      * @param {string} [opts.__account__name] - 帐户名  optional\n      * @param {string} [opts.order] - 按字段对域进行排序  optional\n      * @param {number} [opts.page] - 分页结果的页码  optional\n      * @param {number} [opts.per_page] - 每页的域数  optional\n      * @param {string} [opts.status] - 域的状态  optional\n      * @param {string} [opts.__account__id] - 帐户标识符标签  optional\n      * @param {string} [opts.direction] - asc - 升序；desc - 降序  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zone dataList\n      * @param integer currentCount  当前页记录数量\n      * @param integer totalCount  总记录数量\n      * @param integer totalPage  总页数\n      */\n\n  listZones (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.match !== undefined && opts.match !== null) {\n      queryParams['match'] = opts.match\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n    if (opts.__account__name !== undefined && opts.__account__name !== null) {\n      queryParams['__account__name'] = opts.__account__name\n    }\n    if (opts.order !== undefined && opts.order !== null) {\n      queryParams['order'] = opts.order\n    }\n    if (opts.page !== undefined && opts.page !== null) {\n      queryParams['page'] = opts.page\n    }\n    if (opts.per_page !== undefined && opts.per_page !== null) {\n      queryParams['per_page'] = opts.per_page\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.__account__id !== undefined && opts.__account__id !== null) {\n      queryParams['__account__id'] = opts.__account__id\n    }\n    if (opts.direction !== undefined && opts.direction !== null) {\n      queryParams['direction'] = opts.direction\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listZones with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建域\n      * @param {Object} opts - parameters\n      * @param {} opts.name - 域名\n      * @param {} opts.account\n      * @param {} [opts.jump_start] - 自动尝试获取现有DNS记录  optional\n      * @param {} [opts.ty_pe] - 全接入域意味着DNS由星盾托管。半接入域通常是合作伙伴托管的域或CNAME设置。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zone data\n      */\n\n  createZone (opts, callback) {\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createZone\"\n      )\n    }\n    if (opts.account === undefined || opts.account === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.account' when calling createZone\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.account !== undefined && opts.account !== null) {\n      postBody['account'] = opts.account\n    }\n    if (opts.jump_start !== undefined && opts.jump_start !== null) {\n      postBody['jump_start'] = opts.jump_start\n    }\n    if (opts.ty_pe !== undefined && opts.ty_pe !== null) {\n      postBody['ty_pe'] = opts.ty_pe\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createZone with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除存在的域名\n      * @param {Object} opts - parameters\n      * @param {string} opts.identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zone data\n      */\n\n  deleteZone (opts, callback) {\n    opts = opts || {}\n\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling deleteZone\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteZone with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{identifier}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  从星盾的缓存中删除所有文件\n      * @param {Object} opts - parameters\n      * @param {string} opts.identifier\n      * @param {} opts.purge_everything - 指示星盾缓存中的所有资源都应该删除的标志。\n注意，执行此操作后，可能会对源服务器负载产生显著影响。\n\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zone data\n      */\n\n  purgeAllFiles (opts, callback) {\n    opts = opts || {}\n\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling purgeAllFiles\"\n      )\n    }\n    if (opts.purge_everything === undefined || opts.purge_everything === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.purge_everything' when calling purgeAllFiles\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.purge_everything !== undefined && opts.purge_everything !== null) {\n      postBody['purge_everything'] = opts.purge_everything\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call purgeAllFiles with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{identifier}/purge_cache__purgeAllFiles',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  通过指定URL，从星盾的缓存中细化删除一个或多个文件。\n要清除带有自定义缓存key的文件，请包括用于计算缓存key的报头。\n例如要清除缓存key中含有${geo}或${devicetype}的文件，请包括CF-Device-Type或CF-IPCountry报头。\n注意：当包含源报头时，请确保包括scheme协议和hostname主机名。如果是默认端口，可以省略端口号（http为80，https为443），否则必须包含端口号。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.identifier\n      * @param {} [opts.files] - 应从缓存中删除的URL数组  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zone data\n      */\n\n  purgeFilesByURL (opts, callback) {\n    opts = opts || {}\n\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling purgeFilesByURL\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.files !== undefined && opts.files !== null) {\n      postBody['files'] = opts.files\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call purgeFilesByURL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{identifier}/purge_cache__purgeFilesByURL',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  通过指定主机、关联的缓存标记或前缀，从星盾的缓存中精确删除一个或多个文件。\n注意，缓存标记、主机和前缀清除每24小时的速率限制为30000次清除API调用。一次API调用最多可以清除30个标记、主机或前缀。\n对于需要以更大容量进行清除的客户，可以提高此速率限制。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.identifier\n      * @param {} [opts.tags] - 如何资产携带Cache-Tag头，并且它的值与提供的值之一匹配的话，该资产将从星盾缓存中清除  optional\n      * @param {} [opts.hosts] - 如果资产的URL中的host与提供的值之一匹配的话，该资产将从星盾缓存中清除  optional\n      * @param {} [opts.prefixes] - URL上与前缀匹配的任何资产都将从星盾缓存中清除。\n例如, a.com/b 意味着 a.com/b/c/d.png 会被删除，而 a.com/bc.png 不会被删除。前缀a.com/b和a.com/b/c是冗余的。\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zone data\n      */\n\n  purgeFilesByCache_TagsAndHostOrPrefix (opts, callback) {\n    opts = opts || {}\n\n    if (opts.identifier === undefined || opts.identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.identifier' when calling purgeFilesByCache_TagsAndHostOrPrefix\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (opts.hosts !== undefined && opts.hosts !== null) {\n      postBody['hosts'] = opts.hosts\n    }\n    if (opts.prefixes !== undefined && opts.prefixes !== null) {\n      postBody['prefixes'] = opts.prefixes\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      identifier: opts.identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call purgeFilesByCache_TagsAndHostOrPrefix with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{identifier}/purge_cache__purgeFilesByCache_TagsAndHostOrPrefix',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  域的相关配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting dataList\n      */\n\n  getAllZoneSettings (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getAllZoneSettings\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAllZoneSettings with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量更新域的设置\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.items] - 一或多个域配置对象。必须包含ID和值。  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  editZoneSettingsInfo (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling editZoneSettingsInfo\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.items !== undefined && opts.items !== null) {\n      postBody['items'] = opts.items\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call editZoneSettingsInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对您的网站进行高级保护，防止分布式拒绝服务（DDoS）攻击。这是一个不可编辑的值。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param advancedDDoSProtection data\n      */\n\n  getAdvancedDDOSSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getAdvancedDDOSSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAdvancedDDOSSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$advanced_ddos',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前Always Online的配置。当Always Online开启时，在你的源站离线期间，星盾会提供已缓存过的页面。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param alwaysOnlineMode data\n      */\n\n  getAlwaysOnlineSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getAlwaysOnlineSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAlwaysOnlineSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$always_online',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  当开启时，在你的源站离线期间，星盾会提供已缓存过的页面。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param alwaysOnlineMode data\n      */\n\n  changeAlwaysOnlineSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeAlwaysOnlineSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeAlwaysOnlineSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$always_online',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对所有使用&quot;http&quot;的URL的请求，用301重定向到相应的 &quot;https&quot; URL。如果你只想对一个子集的请求进行重定向，可以考虑创建一个&quot;Always use HTTPS&quot;的页面规则。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  getAlwaysUseHTTPSSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getAlwaysUseHTTPSSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAlwaysUseHTTPSSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$always_use_https',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  对所有使用&quot;http&quot;的URL的请求，用301重定向到相应的 &quot;https&quot; URL。如果你只想对一个子集的请求进行重定向，可以考虑创建一个&quot;Always use HTTPS&quot;的页面规则。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  changeAlwaysUseHTTPSSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeAlwaysUseHTTPSSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeAlwaysUseHTTPSSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$always_use_https',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为该域启用自动HTTPS重写功能。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  getAutomaticHTTPSRewritesSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getAutomaticHTTPSRewritesSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAutomaticHTTPSRewritesSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$automatic_https_rewrites',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为该域启用自动HTTPS重写功能。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  changeAutomaticHTTPSRewritesSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeAutomaticHTTPSRewritesSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeAutomaticHTTPSRewritesSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$automatic_https_rewrites',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  浏览器缓存TTL（以秒为单位）指定星盾缓存资源将在访问者的计算机上保留多长时间。星盾将遵守服务器指定的任何更长时间。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param browserCacheTTL data\n      */\n\n  getBrowserCacheTTLSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getBrowserCacheTTLSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getBrowserCacheTTLSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$browser_cache_ttl',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  浏览器缓存TTL（以秒为单位）指定星盾缓存资源将在访问者的计算机上保留多长时间。星盾将遵守服务器指定的任何更长时间。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - 该设置的有效值  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param browserCacheTTL data\n      */\n\n  changeBrowserCacheTTLSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeBrowserCacheTTLSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeBrowserCacheTTLSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$browser_cache_ttl',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  浏览器完整性检查与不良行为检查类似，寻找最常被垃圾邮件发送者滥用的常见HTTP头，并拒绝他们访问您的页面。它还会对没有用户代理或非标准用户代理（也是滥用机器人、爬虫或访客常用的）的访客提出挑战质询。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param browserCheck data\n      */\n\n  getBrowserCheckSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getBrowserCheckSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getBrowserCheckSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$browser_check',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  浏览器完整性检查与不良行为检查类似，寻找最常被垃圾邮件发送者滥用的常见HTTP头，并拒绝他们访问您的页面。它还会对没有用户代理或非标准用户代理（也是滥用机器人、爬虫或访客常用的）的访客提出挑战质询。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param browserCheck data\n      */\n\n  changeBrowserCheckSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeBrowserCheckSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeBrowserCheckSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$browser_check',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  缓存级别的功能是基于设置的级别。\nbasic设置将缓存大多数静态资源（即css、图片和JavaScript）。\nsimplified设置将在提供缓存的资源时忽略查询字符串。\naggressive设置将缓存所有的静态资源，包括有查询字符串的资源。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - 该设置的有效值  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param cloudflareCacheLevel data\n      */\n\n  changeCacheLevelSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeCacheLevelSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeCacheLevelSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$cache_level',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  指定访问者在成功完成一项挑战（如验证码）后允许访问您的网站多长时间。在TTL过期后，访问者将不得不完成新的挑战。我们建议设置为15-45分钟，并将尝试遵守任何超过45分钟的设置。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param challengePageTTL data\n      */\n\n  getChallengeTTLSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getChallengeTTLSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getChallengeTTLSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$challenge_ttl',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  指定访问者在成功完成一项挑战（如验证码）后允许访问您的网站多长时间。在TTL过期后，访问者将不得不完成新的挑战。我们建议设置为15-45分钟，并将尝试遵守任何超过45分钟的设置。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - 该设置的有效值  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param challengePageTTL data\n      */\n\n  changeChallengeTTLSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeChallengeTTLSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeChallengeTTLSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$challenge_ttl',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  如果你需要对你的网站进行修改，开发模式可以让你暂时进入网站的开发模式。这将绕过星盾的加速缓存，并降低您的网站速度。\n但如果您正在对可缓存的内容（如图片、css 或 JavaScript）进行更改，并希望立即看到这些更改，这时就很有用。一旦进入，开发模式将持续3小时，然后自动切换关闭。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param developmentMode data\n      */\n\n  getDevelopmentModeSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getDevelopmentModeSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDevelopmentModeSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$development_mode',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  如果你需要对你的网站进行修改，开发模式可以让你暂时进入网站的开发模式。这将绕过星盾的加速缓存，并降低您的网站速度。\n但如果您正在对可缓存的内容（如图片、css 或 JavaScript）进行更改，并希望立即看到这些更改，这时就很有用。一旦进入，开发模式将持续3小时，然后自动切换关闭。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param developmentMode data\n      */\n\n  changeDevelopmentModeSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeDevelopmentModeSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeDevelopmentModeSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$development_mode',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  在你的网页上对电子邮件地址进行加密，以防止机器人入侵，同时保持它们对人类可见。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param emailObfuscation data\n      */\n\n  getEmailObfuscationSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getEmailObfuscationSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getEmailObfuscationSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$email_obfuscation',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  在你的网页上对电子邮件地址进行加密，以防止机器人入侵，同时保持它们对人类可见。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param emailObfuscation data\n      */\n\n  changeEmailObfuscationSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeEmailObfuscationSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeEmailObfuscationSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$email_obfuscation',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用后，热链路保护选项可确保其他网站无法通过建立使用您网站上托管的图像的页面来占用您的带宽。只要您的网站上的图像请求被星盾选中，我们就会检查以确保这不是其他网站在请求它们。\n人们仍然能够从你的网页上下载和查看图像，但其他网站将无法窃取它们用于自己的网页。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param hotlinkProtection data\n      */\n\n  getHotlinkProtectionSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getHotlinkProtectionSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getHotlinkProtectionSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$hotlink_protection',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用后，热链路保护选项可确保其他网站无法通过建立使用您网站上托管的图像的页面来占用您的带宽。只要您的网站上的图像请求被星盾选中，我们就会检查以确保这不是其他网站在请求它们。\n人们仍然能够从你的网页上下载和查看图像，但其他网站将无法窃取它们用于自己的网页。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param hotlinkProtection data\n      */\n\n  changeHotlinkProtectionSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeHotlinkProtectionSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeHotlinkProtectionSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$hotlink_protection',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用IP地理定位，让星盾对您网站的访问者进行地理定位，并将国家代码传递给您。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param iPGeolocation data\n      */\n\n  getIPGeolocationSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getIPGeolocationSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getIPGeolocationSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$ip_geolocation',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用IP地理定位，让星盾对您网站的访问者进行地理定位，并将国家代码传递给您。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param iPGeolocation data\n      */\n\n  changeIPGeolocationSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeIPGeolocationSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeIPGeolocationSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$ip_geolocation',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  在所有启用星盾的子域上启用 IPv6。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param iPv6 data\n      */\n\n  getIPv6Setting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getIPv6Setting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getIPv6Setting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$ipv6',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  在所有启用星盾的子域上启用 IPv6。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param iPv6 data\n      */\n\n  changeIPv6Setting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeIPv6Setting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeIPv6Setting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$ipv6',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取你的网站自动最小化资产的配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param auto_MinifyAssets data\n      */\n\n  getMinifySetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getMinifySetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getMinifySetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$minify',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为你的网站自动最小化某些资产\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param auto_MinifyAssets data\n      */\n\n  changeMinifySetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeMinifySetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeMinifySetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$minify',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  自动将移动设备上的访问者重定向到一个移动优化的子域上\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param mobileRedirect data\n      */\n\n  getMobileRedirectSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getMobileRedirectSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getMobileRedirectSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$mobile_redirect',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  自动将移动设备上的访问者重定向到一个移动优化的子域上\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param mobileRedirect data\n      */\n\n  changeMobileRedirectSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeMobileRedirectSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeMobileRedirectSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$mobile_redirect',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  自动优化移动设备上网站访问者的图像加载\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param mirageImageOptimization data\n      */\n\n  getMirageSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getMirageSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getMirageSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$mirage',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  自动优化移动设备上网站访问者的图像加载\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param mirageImageOptimization data\n      */\n\n  changeMirageSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeMirageSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeMirageSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$mirage',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  星盾将代源服务器上任何 502、504 错误的客户错误页面，而不是显示默认的星盾错误页面。这不适用于 522 错误，并且仅限于企业级域。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  getEnableErrorPagesOnSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getEnableErrorPagesOnSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getEnableErrorPagesOnSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$origin_error_page_pass_thru',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  星盾将代理源服务器上任何 502、504 错误的客户错误页面，而不是显示默认的星盾错误页面。这不适用于 522 错误，并且仅限于企业级域。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  changeEnableErrorPagesOnSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeEnableErrorPagesOnSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeEnableErrorPagesOnSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$origin_error_page_pass_thru',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前域随机加密设置\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneEnableOpportunisticEncryption data\n      */\n\n  getOpportunisticEncryptionSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getOpportunisticEncryptionSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getOpportunisticEncryptionSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$opportunistic_encryption',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为当前域启用随机加密\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneEnableOpportunisticEncryption data\n      */\n\n  changeOpportunisticEncryptionSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeOpportunisticEncryptionSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeOpportunisticEncryptionSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$opportunistic_encryption',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  剥离元数据并压缩你的图像，以加快页面加载时间。\nBasic（无损），减少PNG、JPEG和GIF文件的大小 - 对视觉质量没有影响。\nBasic+JPEG（有损），进一步减少JPEG文件的大小，以加快图像加载。\n较大的JPEG文件被转换为渐进式图像，首先加载较低分辨率的图像，最后是较高的分辨率版本。\n不建议用于高像素的摄影网站。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param polishImageOptimization data\n      */\n\n  getPolishSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getPolishSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPolishSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$polish',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  剥离元数据并压缩你的图像，以加快页面加载时间。\nBasic（无损），减少PNG、JPEG和GIF文件的大小 - 对视觉质量没有影响。\nBasic+JPEG（有损），进一步减少JPEG文件的大小，以加快图像加载。\n较大的JPEG文件被转换为渐进式图像，首先加载较低分辨率的图像，最后是较高的分辨率版本。\n不建议用于高像素的摄影网站。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - 该设置的有效值  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param polishImageOptimization data\n      */\n\n  changePolishSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changePolishSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changePolishSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$polish',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  当请求图像的客户端支持WebP图像编解码器时。当WebP比原始图像格式具有性能优势时，星盾将提供WebP版本的图像。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param polishWebPConversion data\n      */\n\n  getWebPSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getWebPSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getWebPSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$webp',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  当请求图像的客户端支持WebP图像编解码器时。当WebP比原始图像格式具有性能优势时，星盾将提供WebP版本的图像。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param polishWebPConversion data\n      */\n\n  changeWebPSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeWebPSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeWebPSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$webp',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  当请求资产的客户端支持brotli压缩算法时，星盾将提供资产的brotli压缩版本。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param brotliCompression data\n      */\n\n  changeBrotliSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeBrotliSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeBrotliSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$brotli',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  星盾将预取包含在响应标头中的任何 URL。这只限于企业级域。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  getPrefetchPreloadSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getPrefetchPreloadSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPrefetchPreloadSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$prefetch_preload',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  星盾将预取包含在响应标头中的任何 URL。这只限于企业级域。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param prefetchPreload data\n      */\n\n  changePrefetchPreloadSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changePrefetchPreloadSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changePrefetchPreloadSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$prefetch_preload',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  Privacy Pass是一个由Privacy Pass团队开发的浏览器扩展，旨在改善您的访客的浏览体验。启用Privacy Pass将减少显示给你的访客的验证码的数量。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param privacyPass data\n      */\n\n  getPrivacyPassSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getPrivacyPassSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPrivacyPassSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$privacy_pass',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  Privacy Pass是一个由Privacy Pass团队开发的浏览器扩展，旨在改善您的访客的浏览体验。启用Privacy Pass将减少显示给你的访客的验证码的数量。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param privacyPass data\n      */\n\n  changePrivacyPassSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changePrivacyPassSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changePrivacyPassSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$privacy_pass',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  Rocket Loader是一个通用的异步JavaScript优化，它优先渲染你的内容同时异步加载你的网站的Javascript。\n开启Rocket Loader将立即改善网页的渲染时间，有时以首次绘制时间（TTFP）以及window.onload时间（假设页面上有JavaScript）来衡量，这对你的搜索排名会产生积极影响。\n当打开时，Rocket Loader将自动推迟加载你的HTML中引用的所有Javascript，而不需要配置。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rocketLoader data\n      */\n\n  getRocketLoaderSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getRocketLoaderSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRocketLoaderSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$rocket_loader',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  Rocket Loader是一个通用的异步JavaScript优化，它优先渲染你的内容同时异步加载你的网站的Javascript。\n开启Rocket Loader将立即改善网页的渲染时间，有时以首次绘制时间（TTFP）以及window.onload时间（假设页面上有JavaScript）来衡量，这对你的搜索排名会产生积极影响。\n当打开时，Rocket Loader将自动推迟加载你的HTML中引用的所有Javascript，而不需要配置。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rocketLoader data\n      */\n\n  changeRocketLoaderSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeRocketLoaderSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeRocketLoaderSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$rocket_loader',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  星盾域的安全标头。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param securityHeader data\n      */\n\n  getSecurityHeaderHSTSSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getSecurityHeaderHSTSSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSecurityHeaderHSTSSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$security_header',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为你的网站选择适当的安全配置文件，这将自动调整每个安全设置。如果你选择定制一个单独的安全设置，该配置文件将成为自定义。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param securityLevel data\n      */\n\n  getSecurityLevelSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getSecurityLevelSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSecurityLevelSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$security_level',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为你的网站选择适当的安全配置文件，这将自动调整每个安全设置。如果你选择定制一个单独的安全设置，该配置文件将成为自定义。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - 该设置的有效值  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param securityLevel data\n      */\n\n  changeSecurityLevelSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeSecurityLevelSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeSecurityLevelSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$security_level',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  如果你的网站上有敏感的内容，你想让真正的访问者看到，但你想对可疑的访问者进行隐藏，你所要做的就是用星盾SSE标签来包装这些内容。\n用下面的SSE标签包住任何你想不让可疑访客看到的内容，&lt;!--sse--&gt;&lt;!--/sse--&gt;。\n例如，&lt;!--sse--&gt;不好的访问者不会看到我的电话号码，555-555-5555&lt;!--/sse--&gt;。注意，SSE只对HTML起作用。\n如果你启用了HTML最小化功能，当你的HTML源代码通过星盾提供服务时，你不会看到SSE标签。\n在这种情况下，SSE 仍将发挥作用，因为星盾的 HTML 缩减和 SSE 功能是在资源通过我们的网络传输给我们时即时发生的。当资源通过我们的网络移动到访问者的计算机上时，SSE 仍会发挥作用。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param serverSideExclude data\n      */\n\n  getServerSideExcludeSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getServerSideExcludeSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getServerSideExcludeSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$server_side_exclude',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  如果你的网站上有敏感的内容，你想让真正的访问者看到，但你想对可疑的访问者进行隐藏，你所要做的就是用星盾SSE标签来包装这些内容。\n用下面的SSE标签包住任何你想不让可疑访客看到的内容，&lt;!--sse--&gt;&lt;!--/sse--&gt;。\n例如，&lt;!--sse--&gt;不好的访问者不会看到我的电话号码，555-555-5555&lt;!--/sse--&gt;。注意，SSE只对HTML起作用。\n如果你启用了HTML最小化功能，当你的HTML源代码通过星盾提供服务时，你不会看到SSE标签。\n在这种情况下，SSE 仍将发挥作用，因为星盾的 HTML 缩减和 SSE 功能是在资源通过我们的网络传输给我们时即时发生的。当资源通过我们的网络移动到访问者的计算机上时，SSE 仍会发挥作用。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param serverSideExclude data\n      */\n\n  changeServerSideExcludeSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeServerSideExcludeSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeServerSideExcludeSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$server_side_exclude',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  星盾将把具有相同查询字符串的文件视为缓存中的同一个文件，而不管查询字符串的顺序如何。这只限于企业级域。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  getEnableQueryStringSortSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getEnableQueryStringSortSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getEnableQueryStringSortSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$sort_query_string_for_cache',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  星盾将把具有相同查询字符串的文件视为缓存中的同一个文件，而不管查询字符串的顺序如何。这只限于企业级域。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  changeEnableQueryStringSortSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeEnableQueryStringSortSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeEnableQueryStringSortSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$sort_query_string_for_cache',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  SSL对访问者的连接进行加密，并保护信用卡号码和其他进出网站的个人数据。\nSSL最多需要5分钟才能完全激活。需要在星盾激活你的根域或www域。\nOff，访客和星盾之间没有SSL，星盾和你的Web服务器之间也没有SSL（所有HTTP流量）。\nFlexible, 访客和星盾之间的 SSL -- 访客在你的网站上看到 HTTPS，但星盾和你的 Web 服务器之间没有 SSL。您不需要在您的 Web 服务器上安装 SSL 证书，但您的访客仍会看到启用 HTTPS 的网站。\nFull, 访客和星盾之间的 SSL -- 访客在你的网站上看到 HTTPS，以及星盾和你的 Web 服务器之间的 SSL。您至少需要有自己的 SSL 证书或自签名的证书。\nFull (Strict), 访客和星盾之间的 SSL -- 访客在您的网站上看到 HTTPS，以及星盾和您的 Web 服务器之间的 SSL。你需要在你的网络服务器上安装一个有效的SSL证书。\n这个证书必须由一个证书机构签署，有一个在未来的到期日，并为请求的域名（主机名）作出回应。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param sSL data\n      */\n\n  getSSLSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getSSLSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSSLSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$ssl',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  SSL对访问者的连接进行加密，并保护信用卡号码和其他进出网站的个人数据。\nSSL最多需要5分钟才能完全激活。需要在星盾激活你的根域或www域。\nOff，访客和星盾之间没有SSL，星盾和你的Web服务器之间也没有SSL（所有HTTP流量）。\nFlexible, 访客和星盾之间的 SSL -- 访客在你的网站上看到 HTTPS，但星盾和你的 Web 服务器之间没有 SSL。您不需要在您的 Web 服务器上安装 SSL 证书，但您的访客仍会看到启用 HTTPS 的网站。\nFull, 访客和星盾之间的 SSL -- 访客在你的网站上看到 HTTPS，以及星盾和你的 Web 服务器之间的 SSL。您至少需要有自己的 SSL 证书或自签名的证书。\nFull (Strict), 访客和星盾之间的 SSL -- 访客在您的网站上看到 HTTPS，以及星盾和您的 Web 服务器之间的 SSL。你需要在你的网络服务器上安装一个有效的SSL证书。\n这个证书必须由一个证书机构签署，有一个在未来的到期日，并为请求的域名（主机名）作出回应。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - 该设置的有效值，off/flexible/full/strict  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param sSL data\n      */\n\n  changeSSLSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeSSLSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeSSLSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$ssl',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取HTTPS请求允许使用的TLS协议的最低版本。例如，如果是TLS 1.1，那么TLS 1.0连接将被拒绝，而1.1、1.2和1.3（如果启用）将被允许。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  getMinimumTLSVersionSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getMinimumTLSVersionSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getMinimumTLSVersionSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$min_tls_version',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置HTTPS请求使用的TLS协议的最低版本。例如，如果选择TLS 1.1，那么TLS 1.0连接将被拒绝，而1.1、1.2和1.3（如果启用）将被允许。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - TLS协议版本  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  changeMinimumTLSVersionSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeMinimumTLSVersionSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeMinimumTLSVersionSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$min_tls_version',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  一个用于TLS终端的密码允许列表。这些密码必须是BoringSSL的格式。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string dataList\n      */\n\n  getCiphersSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getCiphersSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getCiphersSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$ciphers',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  一个用于TLS终端的密码允许列表。这些密码必须是BoringSSL的格式。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - 该设置的值  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string dataList\n      */\n\n  changeCiphersSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeCiphersSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeCiphersSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$ciphers',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为该域启用加密TLS 1.3功能。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  getZoneEnableTLS1_3Setting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getZoneEnableTLS1_3Setting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getZoneEnableTLS1_3Setting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$tls_1_3',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  为该域启用加密TLS 1.3功能。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - 该设置的有效值  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  changeTLS1_3Setting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeTLS1_3Setting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeTLS1_3Setting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$tls_1_3',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  TLS 客户端授权要求星盾使用客户端证书连接到您的源服务器（Enterprise Only）。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tLSClientAuthentication data\n      */\n\n  getTLSClientAuthSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getTLSClientAuthSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTLSClientAuthSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$tls_client_auth',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  TLS 客户端授权要求星盾使用客户端证书连接到您的源服务器（Enterprise Only）。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tLSClientAuthentication data\n      */\n\n  changeTLSClientAuthSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeTLSClientAuthSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeTLSClientAuthSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$tls_client_auth',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  允许客户继续在我们发送给源的头中使用真正的客户IP。这只限于企业级域。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  getTrueClientIPSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getTrueClientIPSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTrueClientIPSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$true_client_ip_header',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  允许客户继续在我们发送给源的头中使用真正的客户IP。这只限于企业级域。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zoneSetting data\n      */\n\n  changeTrueClientIPSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeTrueClientIPSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeTrueClientIPSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$true_client_ip_header',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  WAF检查对您网站的HTTP请求。它检查GET和POST请求，并应用规则来帮助从合法的网站访问者中过滤出非法流量。星盾 WAF 检查网站地址或 URL 以检测任何不正常的东西。\n如果星盾 WAF确定了可疑的用户行为。那么 WAF 将用一个页面 &quot;挑战 &quot;网络访客，要求他们成功提交验证码以继续其行动。\n如果挑战失败，行动将被停止。这意味着 星盾 的 WAF 将在任何被识别为非法的流量到达您的源网络服务器之前将其阻止。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param webApplicationFirewall data\n      */\n\n  getWebApplicationFirewallWAFSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getWebApplicationFirewallWAFSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getWebApplicationFirewallWAFSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$waf',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  WAF检查对您网站的HTTP请求。它检查GET和POST请求，并应用规则来帮助从合法的网站访问者中过滤出非法流量。星盾 WAF 检查网站地址或 URL 以检测任何不正常的东西。\n如果星盾 WAF确定了可疑的用户行为。那么 WAF 将用一个页面 &quot;挑战 &quot;网络访客，要求他们成功提交验证码以继续其行动。\n如果挑战失败，行动将被停止。这意味着 星盾 的 WAF 将在任何被识别为非法的流量到达您的源网络服务器之前将其阻止。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param webApplicationFirewall data\n      */\n\n  changeWebApplicationFirewallWAFSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeWebApplicationFirewallWAFSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeWebApplicationFirewallWAFSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$waf',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取HTTP2设置的状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param hTTP2Value data\n      */\n\n  getHTTP2Setting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getHTTP2Setting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getHTTP2Setting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$http2',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启/关闭HTTP2\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param hTTP2Value data\n      */\n\n  changeHTTP2Setting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeHTTP2Setting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeHTTP2Setting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$http2',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取HTTP3设置的状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param hTTP3Value data\n      */\n\n  getHTTP3Setting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getHTTP3Setting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getHTTP3Setting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$http3',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启/关闭HTTP3\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param hTTP3Value data\n      */\n\n  changeHTTP3Setting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeHTTP3Setting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeHTTP3Setting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$http3',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  Value of the 0-RTT setting\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zero_RTTValue data\n      */\n\n  get0_RTTSessionResumptionSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling get0_RTTSessionResumptionSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call get0_RTTSessionResumptionSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$0rtt',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启/关闭 0-RTT\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param zero_RTTValue data\n      */\n\n  change0_RTTSessionResumptionSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling change0_RTTSessionResumptionSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call change0_RTTSessionResumptionSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$0rtt',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取Pseudo IPv4(IPv6到IPv4的转换服务)的设置\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pseudoIPv4Value data\n      */\n\n  getPseudoIPv4Setting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getPseudoIPv4Setting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPseudoIPv4Setting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$pseudo_ipv4',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置Pseudo IPv4(IPv6到IPv4的转换服务)\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - 该设置的有效值  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pseudoIPv4Value data\n      */\n\n  changePseudoIPv4Setting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changePseudoIPv4Setting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changePseudoIPv4Setting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$pseudo_ipv4',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  WebSockets是客户端和源服务器之间持续的开放连接。在WebSockets连接中，客户端和源服务器可以来回传递数据，而不需要重新建立会话。\n这使得在WebSockets连接中的数据交换非常快。WebSockets经常被用于实时应用，如即时聊天和游戏。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param webSockets data\n      */\n\n  getWebSocketsSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getWebSocketsSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getWebSocketsSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$websockets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  WebSockets是客户端和源服务器之间持续的开放连接。在WebSockets连接中，客户端和源服务器可以来回传递数据，而不需要重新建立会话。\n这使得在WebSockets连接中的数据交换非常快。WebSockets经常被用于实时应用，如即时聊天和游戏。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - on - 开启；off - 关闭  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param webSockets data\n      */\n\n  changeWebSocketsSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeWebSocketsSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeWebSocketsSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$websockets',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  图像调整为通过星盾的网络提供的图像提供按需调整、转换和优化。\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageResizing data\n      */\n\n  getImageResizingSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getImageResizingSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getImageResizingSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$image_resizing',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  HTTP/2边缘优化，优化了通过HTTP/2提供的资源交付，提高了页面加载性能。当与Worker结合使用时，它还支持对内容交付的精细控制。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param hTTP2EdgePrioritization data\n      */\n\n  getHTTP2EdgePrioritizationSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling getHTTP2EdgePrioritizationSetting\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getHTTP2EdgePrioritizationSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$h2_prioritization',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  HTTP/2边缘优化，优化了通过HTTP/2提供的资源交付，提高了页面加载性能。当与Worker结合使用时，它还支持对内容交付的精细控制。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value] - 该设置的有效值  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param hTTP2EdgePrioritization data\n      */\n\n  changeHTTP2EdgePrioritizationSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeHTTP2EdgePrioritizationSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeHTTP2EdgePrioritizationSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$h2_prioritization',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  变更上传文件的最大值\n      * @param {Object} opts - parameters\n      * @param {string} opts.zone_identifier\n      * @param {} [opts.value]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param maxUpload data\n      */\n\n  changeMaxUploadSetting (opts, callback) {\n    opts = opts || {}\n\n    if (opts.zone_identifier === undefined || opts.zone_identifier === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.zone_identifier' when calling changeMaxUploadSetting\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.value !== undefined && opts.value !== null) {\n      postBody['value'] = opts.value\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      zone_identifier: opts.zone_identifier\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  starshield/0.0.14'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call changeMaxUploadSetting with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/zones/{zone_identifier}/settings$$max_upload',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = STARSHIELD\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/streambus/v1/streambus.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ConsumerGroup相关 API\n * 流数据总线ConsumerGroup相关信息接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'streambus'\nService._services[serviceId] = true\n\n/**\n * streambus service.\n * @version 1.0.1\n */\n\nJDCloud.STREAMBUS = class STREAMBUS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'streambus.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询topic列表，返回topic的集合\n      * @param {Object} opts - parameters\n      * @param {string} [opts.keyword]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param topicListInfo topic\n      */\n\n  getTopicList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTopicList\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.keyword !== undefined && opts.keyword !== null) {\n      queryParams['keyword'] = opts.keyword\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streambus/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTopicList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topicList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定主题,如果已归档会返回归档信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param topicModel topic\n      */\n\n  describeTopic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeTopic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling describeTopic\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streambus/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTopic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topic',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建topic时，topicModel中只需要传topic参数，另外两个参数可为空\n      * @param {Object} opts - parameters\n      * @param {topicModel} opts.topicModel - 示例：{&quot;topicModel&quot;:{&quot;topic&quot;:{&quot;archived&quot;:0,&quot;id&quot;:&quot;&quot;,&quot;name&quot;:&quot;create&quot;,&quot;remark&quot;:&quot;备注&quot;,&quot;shardNum&quot;:1,&quot;partitionNum&quot;:2,&quot;lifecycle&quot;:3}}}\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message  状态信息\n      */\n\n  addTopic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addTopic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicModel === undefined || opts.topicModel === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicModel' when calling addTopic\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.topicModel !== undefined && opts.topicModel !== null) {\n      postBody['topicModel'] = opts.topicModel\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streambus/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addTopic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topic',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  此接口可以用来更新主题，创建归档，修改归档，删除归档，传入不同的参数可以实现不同的功能。修改归档只需要修改相应归档的参数，删除归档只需要把归档参数置为空即可\n      * @param {Object} opts - parameters\n      * @param {topicModel} opts.topicModel - 当更新主题时只需要修改topicModel中的topic中的属性即可；创建归档需要指定target以及归档的目的地(mysql,京东云 Elasticsearch,对象存储,数据计算服务)参数\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message  状态信息\n      */\n\n  updateTopic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateTopic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicModel === undefined || opts.topicModel === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicModel' when calling updateTopic\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.topicModel !== undefined && opts.topicModel !== null) {\n      postBody['topicModel'] = opts.topicModel\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streambus/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateTopic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topic',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除topic\n      * @param {Object} opts - parameters\n      * @param {string} opts.name\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message  状态信息\n      */\n\n  deleteTopic (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteTopic\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling deleteTopic\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streambus/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTopic with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/topic',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看指定主题的所有消费组\n      * @param {Object} opts - parameters\n      * @param {integer} opts.topicId - 主题id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param consumerGroup consumerGroup\n      */\n\n  getConsumerGroupList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getConsumerGroupList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicId === undefined || opts.topicId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicId' when calling getConsumerGroupList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.topicId !== undefined && opts.topicId !== null) {\n      queryParams['topicId'] = opts.topicId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streambus/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getConsumerGroupList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/consumerGroupList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建consumerGroupName\n      * @param {Object} opts - parameters\n      * @param {consumerGroup} [opts.consumerGroupStr] - 消费组对象  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string message\n      * @param boolean status\n      */\n\n  createConsumerGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createConsumerGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.consumerGroupStr !== undefined && opts.consumerGroupStr !== null) {\n      postBody['consumerGroupStr'] = opts.consumerGroupStr\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streambus/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createConsumerGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/consumerGroup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除consumerGroupName\n      * @param {Object} opts - parameters\n      * @param {integer} opts.topicId - 主题ID\n      * @param {integer} opts.consumerGroupId - 消费组ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string message\n      * @param boolean status\n      */\n\n  deleteConsumerGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteConsumerGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.topicId === undefined || opts.topicId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.topicId' when calling deleteConsumerGroup\"\n      )\n    }\n    if (opts.consumerGroupId === undefined || opts.consumerGroupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.consumerGroupId' when calling deleteConsumerGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.topicId !== undefined && opts.topicId !== null) {\n      queryParams['topicId'] = opts.topicId\n    }\n    if (opts.consumerGroupId !== undefined && opts.consumerGroupId !== null) {\n      queryParams['consumerGroupId'] = opts.consumerGroupId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streambus/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteConsumerGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/consumerGroup',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.STREAMBUS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/streamcomputer/v1/streamcomputer.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * storage相关 API\n * 流计算storage相关信息接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'streamcomputer'\nService._services[serviceId] = true\n\n/**\n * streamcomputer service.\n * @version 1.0.1\n */\n\nJDCloud.STREAMCOMPUTER = class STREAMCOMPUTER extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'streamcompute.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询指定作业详情\n      * @param {Object} opts - parameters\n      * @param {integer} opts.jobId\n      * @param {integer} opts.namespaceId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param jobStr jobStr\n      */\n\n  describeJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.jobId === undefined || opts.jobId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jobId' when calling describeJob\"\n      )\n    }\n    if (opts.namespaceId === undefined || opts.namespaceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.namespaceId' when calling describeJob\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.jobId !== undefined && opts.jobId !== null) {\n      queryParams['jobId'] = opts.jobId\n    }\n    if (opts.namespaceId !== undefined && opts.namespaceId !== null) {\n      queryParams['namespaceId'] = opts.namespaceId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/job',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加或者更新job\n      * @param {Object} opts - parameters\n      * @param {jobStr} opts.jobStr - 创建作业的详情\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param okInfo okInfo  成功结果对象\n      */\n\n  addOrUpdateJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addOrUpdateJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.jobStr === undefined || opts.jobStr === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jobStr' when calling addOrUpdateJob\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.jobStr !== undefined && opts.jobStr !== null) {\n      postBody['jobStr'] = opts.jobStr\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addOrUpdateJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/job',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除作业\n      * @param {Object} opts - parameters\n      * @param {string} opts.namespaceId\n      * @param {integer} opts.jobId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string message  删除job返回信息\n      * @param boolean status\n      */\n\n  deleteJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.namespaceId === undefined || opts.namespaceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.namespaceId' when calling deleteJob\"\n      )\n    }\n    if (opts.jobId === undefined || opts.jobId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jobId' when calling deleteJob\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.namespaceId !== undefined && opts.namespaceId !== null) {\n      queryParams['namespaceId'] = opts.namespaceId\n    }\n    if (opts.jobId !== undefined && opts.jobId !== null) {\n      queryParams['jobId'] = opts.jobId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/job',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定应用下的所有job\n      * @param {Object} opts - parameters\n      * @param {string} opts.namespaceId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param jobStr data\n      */\n\n  getJobList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getJobList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.namespaceId === undefined || opts.namespaceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.namespaceId' when calling getJobList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.namespaceId !== undefined && opts.namespaceId !== null) {\n      queryParams['namespaceId'] = opts.namespaceId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getJobList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/jobList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  运行job\n      * @param {Object} opts - parameters\n      * @param {string} opts.namespaceId\n      * @param {integer} opts.jobId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string message  是否成功提交作业\n      */\n\n  startJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.namespaceId === undefined || opts.namespaceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.namespaceId' when calling startJob\"\n      )\n    }\n    if (opts.jobId === undefined || opts.jobId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jobId' when calling startJob\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.namespaceId !== undefined && opts.namespaceId !== null) {\n      queryParams['namespaceId'] = opts.namespaceId\n    }\n    if (opts.jobId !== undefined && opts.jobId !== null) {\n      queryParams['jobId'] = opts.jobId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/job:start',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止作业运行job\n      * @param {Object} opts - parameters\n      * @param {string} opts.namespaceId\n      * @param {integer} opts.jobId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string message  成功启动作业返回信息\n      */\n\n  stopJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.namespaceId === undefined || opts.namespaceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.namespaceId' when calling stopJob\"\n      )\n    }\n    if (opts.jobId === undefined || opts.jobId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.jobId' when calling stopJob\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.namespaceId !== undefined && opts.namespaceId !== null) {\n      queryParams['namespaceId'] = opts.namespaceId\n    }\n    if (opts.jobId !== undefined && opts.jobId !== null) {\n      queryParams['jobId'] = opts.jobId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/job:stop',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询租户下的应用列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.keyword]   optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param namespace namespaces\n      */\n\n  queryNamespaces (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryNamespaces\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.keyword !== undefined && opts.keyword !== null) {\n      queryParams['keyword'] = opts.keyword\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryNamespaces with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/namespaces',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询某个应用详情\n      * @param {Object} opts - parameters\n      * @param {integer} opts.namespaceId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param namespace namespace  查询出的namespace对象\n      */\n\n  queryNamespaceDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  queryNamespaceDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.namespaceId === undefined || opts.namespaceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.namespaceId' when calling queryNamespaceDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.namespaceId !== undefined && opts.namespaceId !== null) {\n      queryParams['namespaceId'] = opts.namespaceId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryNamespaceDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/namespaceDetail',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建namespace\n      * @param {Object} opts - parameters\n      * @param {namespace} opts.namespaceStr\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  创建成功标志\n      */\n\n  createNamespace (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createNamespace\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.namespaceStr === undefined || opts.namespaceStr === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.namespaceStr' when calling createNamespace\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.namespaceStr !== undefined && opts.namespaceStr !== null) {\n      postBody['namespaceStr'] = opts.namespaceStr\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createNamespace with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/namespace',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新namespace\n      * @param {Object} opts - parameters\n      * @param {namespace} opts.namespaceStr\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  更新成功标志\n      */\n\n  updateNamespace (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateNamespace\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.namespaceStr === undefined || opts.namespaceStr === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.namespaceStr' when calling updateNamespace\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.namespaceStr !== undefined && opts.namespaceStr !== null) {\n      postBody['namespaceStr'] = opts.namespaceStr\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateNamespace with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/namespace',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除namespace,如果旗下关联有其他资源，不允许删除\n      * @param {Object} opts - parameters\n      * @param {integer} opts.namespaceId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status  删除namespace成功标志\n      */\n\n  deleteNamespace (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteNamespace\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.namespaceId === undefined || opts.namespaceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.namespaceId' when calling deleteNamespace\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.namespaceId !== undefined && opts.namespaceId !== null) {\n      queryParams['namespaceId'] = opts.namespaceId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteNamespace with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/namespace',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定输入\n      * @param {Object} opts - parameters\n      * @param {integer} opts.storageId - storageId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param storage data\n      */\n\n  describeStorage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeStorage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.storageId === undefined || opts.storageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.storageId' when calling describeStorage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.storageId !== undefined && opts.storageId !== null) {\n      queryParams['storageId'] = opts.storageId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeStorage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/storage',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建或者更新storage\n      * @param {Object} opts - parameters\n      * @param {storage} opts.storageStr - 创建或者更新storage的详情\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string message\n      * @param boolean status\n      */\n\n  addOrUpdateStorage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addOrUpdateStorage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.storageStr === undefined || opts.storageStr === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.storageStr' when calling addOrUpdateStorage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.storageStr !== undefined && opts.storageStr !== null) {\n      postBody['storageStr'] = opts.storageStr\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addOrUpdateStorage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/storage',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定输入\n      * @param {Object} opts - parameters\n      * @param {integer} opts.storageId - storageId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string message\n      */\n\n  deleteStorage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteStorage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.storageId === undefined || opts.storageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.storageId' when calling deleteStorage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.storageId !== undefined && opts.storageId !== null) {\n      queryParams['storageId'] = opts.storageId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteStorage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/storage',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建或者更新storage\n      * @param {Object} opts - parameters\n      * @param {string} opts.storageType - storage类型\n      * @param {string} opts.namespaceId - namespaceId\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param storage storageList\n      */\n\n  getStorageList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getStorageList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.storageType === undefined || opts.storageType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.storageType' when calling getStorageList\"\n      )\n    }\n    if (opts.namespaceId === undefined || opts.namespaceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.namespaceId' when calling getStorageList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.storageType !== undefined && opts.storageType !== null) {\n      queryParams['storageType'] = opts.storageType\n    }\n    if (opts.namespaceId !== undefined && opts.namespaceId !== null) {\n      queryParams['namespaceId'] = opts.namespaceId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  streamcomputer/1.0.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getStorageList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/storageList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.STREAMCOMPUTER\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/sts/v1/sts.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Security Token Service\n * Security Token Service API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'sts'\nService._services[serviceId] = true\n\n/**\n * sts service.\n * @version 0.1.0\n */\n\nJDCloud.STS = class STS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'sts.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  扮演用户角色，获取临时凭证\n      * @param {Object} opts - parameters\n      * @param {assumeRoleInfo} opts.assumeRoleInfo - 扮演角色参数\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param credentials credentials  凭证信息\n      */\n\n  assumeRole (opts, callback) {\n    opts = opts || {}\n\n    if (opts.assumeRoleInfo === undefined || opts.assumeRoleInfo === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.assumeRoleInfo' when calling assumeRole\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.assumeRoleInfo !== undefined && opts.assumeRoleInfo !== null) {\n      postBody['assumeRoleInfo'] = opts.assumeRoleInfo\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  sts/0.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call assumeRole with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/sessionToken:assumeRole',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.STS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/tidb/v1/tidb.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * White-List\n * 白名单相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'tidb'\nService._services[serviceId] = true\n\n/**\n * tidb service.\n * @version 1.0.6\n */\n\nclass TIDB extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'tidb.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查看当前实例下的账号信息。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string accountName  账号名称\n      * @param string accountStatus  账号状态(&quot;BUILDING&quot;,&quot;RUNNING&quot;,&quot;RESETING&quot;)\n      * @param string createTime  创建时间，格式为：YYYY-MM-DD HH:mm:ss\n      */\n\n  describeAccounts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAccounts\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeAccounts\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAccounts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建数据库的高权限管理账号，用户可以使用客户端、应用程序等通过该账号和密码登录 TiDB 实例，然后通过SQL创建数据库和其他用户。一个数据库实例只能创建一个高权限账号。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} opts.accountName - 账号名\n      * @param {} opts.accountPassword - 密码\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling createAccount\"\n      )\n    }\n    if (opts.accountPassword === undefined || opts.accountPassword === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountPassword' when calling createAccount\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountName !== undefined && opts.accountName !== null) {\n      postBody['accountName'] = opts.accountName\n    }\n    if (opts.accountPassword !== undefined && opts.accountPassword !== null) {\n      postBody['accountPassword'] = opts.accountPassword\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重置 TiDB 实例的高权限账号的密码。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.accountName - 账号名\n      * @param {} opts.accountPassword - 新密码\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resetPassword (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resetPassword\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling resetPassword\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling resetPassword\"\n      )\n    }\n    if (opts.accountPassword === undefined || opts.accountPassword === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountPassword' when calling resetPassword\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountPassword !== undefined && opts.accountPassword !== null) {\n      postBody['accountPassword'] = opts.accountPassword\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resetPassword with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/accounts/{accountName}:resetPassword',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看该实例下所有备份的详细信息。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID，唯一标识一个实例\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页。  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为10，取值范围：[10,100]，且为10的整数倍。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param backup backups\n      * @param integer totalCount  总记录数\n      */\n\n  describeBackups (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackups\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeBackups\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      queryParams['instanceId'] = opts.instanceId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  进行 TiDB 实例的全量备份，对实例中所有的数据库进行备份。同一时间，只能有一个正在运行的备份任务。\n      * @param {Object} opts - parameters\n      * @param {} opts.instanceId - 实例ID，唯一标识一个实例\n      * @param {} opts.backupSpec - 备份创建信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string backupId  备份ID\n      */\n\n  createBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createBackup\"\n      )\n    }\n    if (opts.backupSpec === undefined || opts.backupSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupSpec' when calling createBackup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceId !== undefined && opts.instanceId !== null) {\n      postBody['instanceId'] = opts.instanceId\n    }\n    if (opts.backupSpec !== undefined && opts.backupSpec !== null) {\n      postBody['backupSpec'] = opts.backupSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backups',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除TiDB的备份，仅允许删除用户创建的备份，系统的自动备份不允许删除。\n      * @param {Object} opts - parameters\n      * @param {string} opts.backupId - 备份ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupId === undefined || opts.backupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupId' when calling deleteBackup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      backupId: opts.backupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/backups/{backupId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前用户售罄信息。\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer engineStatus\n      * @param az orderableAZs\n      */\n\n  describeOrderableInstanceType (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeOrderableInstanceType\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeOrderableInstanceType with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/orderableInstanceType',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询指定地域下 TiDB 服务支持的数据库版本。\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string versions\n      */\n\n  describeVersions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVersions\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVersions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/versions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个 TiDB 实例。创建时需要指定 TiDB 各类节点的数目，规格，存储空间等。 TiFlash和TiCDC节点在创建时不是必须的，可以在需要时，通过扩容的功能创建TiFlash和TiCDC节点。\n      * @param {Object} opts - parameters\n      * @param {tidbInstanceSpec} opts.instanceSpec - 新建实例规格\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId\n      * @param string orderId\n      */\n\n  createInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 TiDB 实例的详细信息，例如TiDB的具体版本号，各个节点的规格、存储空间以及连接信息等等。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tidbInstanceAttribute tidbInstanceAttributes\n      */\n\n  describeInstanceAttributes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceAttributes\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceAttributes\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceAttributes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定的 TiDB 实例。实例删除后，数据不可恢复，请谨慎使用。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询当前账号下所有的 TiDB 实例。\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页;  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为100，取值范围：[10,100]，用于查询列表的接口  optional\n      * @param {filter} [opts.filters] - 过滤参数，多个过滤参数之间的关系为“与”(and)\n支持以下属性的过滤：\ninstanceId, 支持operator选项：eq,ne\ninstanceName, 支持operator选项：eq,ne,like\ninstanceStatus, 支持operator选项：eq,ne\n  optional\n      * @param {tagFilter} [opts.tagFilters] - 资源标签  optional\n      * @param {string} [opts.resourceGroupIds] - 资源组id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instances\n      * @param number totalCount\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(\n      queryParams,\n      super.buildTagFilterParam(opts.tagFilters, 'tagFilters')\n    )\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.resourceGroupIds, 'resourceGroupIds')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:describeInstances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取各种 TiDB 节点支持的具体规格。\n      * @param {Object} opts - parameters\n      * @param {string} opts.storageType - 存储类型,目前只支持本地SSD;\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param nodeFlavor tidbFlavors\n      * @param nodeFlavor tikvFlavors\n      * @param nodeFlavor pdFlavors\n      * @param nodeFlavor monitorFlavors\n      * @param nodeFlavor tiflashFlavors\n      * @param nodeFlavor ticdcFlavors\n      */\n\n  describeInstanceClasses (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceClasses\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.storageType === undefined || opts.storageType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.storageType' when calling describeInstanceClasses\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.storageType !== undefined && opts.storageType !== null) {\n      queryParams['storageType'] = opts.storageType\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceClasses with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:describeInstanceClasses',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据日志备份创建一个新的 TiDB 实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} opts.restoreTime - 根据源实例的哪个时间点创建新实例, 北京时间，格式为&quot;YYYY-MM-DD HH:mm:ss&quot;\n      * @param {} opts.instanceSpec - 新建实例规格\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId\n      * @param string orderId\n      */\n\n  createInstanceByTime (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstanceByTime\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createInstanceByTime\"\n      )\n    }\n    if (opts.restoreTime === undefined || opts.restoreTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.restoreTime' when calling createInstanceByTime\"\n      )\n    }\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstanceByTime\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.restoreTime !== undefined && opts.restoreTime !== null) {\n      postBody['restoreTime'] = opts.restoreTime\n    }\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstanceByTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:createInstanceByTime',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个新的 TiDB 实例，并将指定的备份恢复到该实例上。\n      * @param {Object} opts - parameters\n      * @param {} opts.backupId - 要恢复的备份的ID\n      * @param {} opts.instanceSpec - 新建实例规格\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceId\n      * @param string orderId\n      */\n\n  createInstanceFromBackup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstanceFromBackup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.backupId === undefined || opts.backupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.backupId' when calling createInstanceFromBackup\"\n      )\n    }\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstanceFromBackup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.backupId !== undefined && opts.backupId !== null) {\n      postBody['backupId'] = opts.backupId\n    }\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstanceFromBackup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:createInstanceFromBackup',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取实例按时间点创建时间，可选择的最早时间和最晚时间\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startTime  实例按时间点创建时,可恢复到的最早时间点, 北京时间, 格式为&quot;YYYY-MM-DD HH:mm:ss&quot;； 字段值为空字符串表示没有最早时间点\n\n      * @param string endTime  实例按时间点创建时,可恢复到的最新时间点, 北京时间, 格式为&quot;YYYY-MM-DD HH:mm:ss&quot;；字段值为空字符串表示没有最新时间点\n\n      */\n\n  describeRestoreTimeInterval (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRestoreTimeInterval\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeRestoreTimeInterval\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRestoreTimeInterval with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeRestoreTimeInterval',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看实例当前的备份策略。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string startWindow  自动备份开始时间窗口，范围00:00-23:59，时间范围差不得小于30分钟。\n例如：00:00-01:00，表示0点到1点开始进行数据库自动备份，备份完成时间则跟实例大小有关，不保证在这个时间范围中完成\n\n      * @param integer retentionPeriod  自动备份保留周期，单位天,缺省为7天，范围7-730\n      * @param string backupPeriod  自动备份的周期，多个取值用英文逗号分隔，支持以下参数，不区分大小写：\n- Monday：周一\n- Tuesday：周二\n- Wednesday：周三\n- Thursday：周四\n- Friday：周五\n- Saturday：周六\n- Sunday：周日\n例如定义周一和周三备份，则输入为Monday,Wednesday\n\n      * @param boolean autoIncBackup  是否开启自动增量备份\n      */\n\n  describeBackupPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBackupPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeBackupPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBackupPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeBackupPolicy',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改 TiDB 实例备份策略，例如全量备份的日期，时间等。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} [opts.startWindow] - 自动备份开始时间窗口,例如：00:00-01:00，表示0点到1点开始进行数据库自动备份，备份完成时间则跟实例大小有关，不一定在这个时间范围中该参数只能是以下取值:00:00-01:0001:00-02:00......23:00-24:00  optional\n      * @param {} [opts.backupPeriod] - 自动备份的周期，多个取值用英文逗号分隔，支持以下参数，不区分大小写:- Monday：周一 - Tuesday：周二 - Wednesday：周三 - Thursday：周四 - Friday：周五- Saturday：周六- Sunday：周日 例如定义周一和周三备份，则输入为Monday,Wednesday  optional\n      * @param {} [opts.autoIncBackup] - 是否开启自动增量备份。 开启后会在没有全量备份的日期自动进行一次增量备份  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyBackupPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBackupPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyBackupPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.startWindow !== undefined && opts.startWindow !== null) {\n      postBody['startWindow'] = opts.startWindow\n    }\n    if (opts.backupPeriod !== undefined && opts.backupPeriod !== null) {\n      postBody['backupPeriod'] = opts.backupPeriod\n    }\n    if (opts.autoIncBackup !== undefined && opts.autoIncBackup !== null) {\n      postBody['autoIncBackup'] = opts.autoIncBackup\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBackupPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyBackupPolicy',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改实例名称，可支持中文，实例名的具体规则可参见帮助中心文档。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} opts.instanceName - 实例名称，名称支持中文，实例名的具体规则可参见帮助中心文档\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceName (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceName\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceName\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling modifyInstanceName\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceName with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceName',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改 TiDB 实例中各类节点的数量。如果当前实例无TiFlash和TiCDC节点，那么在增加TiFlash和TiCDC节点数目时，可同时指定其规格。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} [opts.tidbNodeNum] - 调整后的tidb节点数  optional\n      * @param {} [opts.tikvNodeNum] - 调整后的tikv节点数  optional\n      * @param {} [opts.pdNodeNum] - 调整后的pd节点数  optional\n      * @param {} [opts.tiflashNodeSpec] - TiFlash节点规格和数目  optional\n      * @param {} [opts.ticdcNodeSpec] - Ticdc节点规格和数目  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string orderId\n      */\n\n  modifyNodeNum (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyNodeNum\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyNodeNum\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.tidbNodeNum !== undefined && opts.tidbNodeNum !== null) {\n      postBody['tidbNodeNum'] = opts.tidbNodeNum\n    }\n    if (opts.tikvNodeNum !== undefined && opts.tikvNodeNum !== null) {\n      postBody['tikvNodeNum'] = opts.tikvNodeNum\n    }\n    if (opts.pdNodeNum !== undefined && opts.pdNodeNum !== null) {\n      postBody['pdNodeNum'] = opts.pdNodeNum\n    }\n    if (opts.tiflashNodeSpec !== undefined && opts.tiflashNodeSpec !== null) {\n      postBody['tiflashNodeSpec'] = opts.tiflashNodeSpec\n    }\n    if (opts.ticdcNodeSpec !== undefined && opts.ticdcNodeSpec !== null) {\n      postBody['ticdcNodeSpec'] = opts.ticdcNodeSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyNodeNum with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyNodeNum',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改 TiDB 实例中各类节点中的数目与规格。支持 TiDB 节点和 Monitor 节点数目和规格的同时调整。 如果当前实例无 TiFlash 和 TiCDC 节点，那么在增加 TiFlash 和 TiCDC 节点数目时，可同时指定其规格。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} [opts.tikvNodeNum] - 调整后的tikv节点数  optional\n      * @param {} [opts.pdNodeNum] - 调整后的pd节点数  optional\n      * @param {} [opts.tidbNodeSpec] - TiDB节点规格和数目  optional\n      * @param {} [opts.tiflashNodeSpec] - TiFlash节点规格和数目  optional\n      * @param {} [opts.ticdcNodeSpec] - Ticdc节点规格和数目  optional\n      * @param {} [opts.monitorNodeSpec] - Monitor节点规格和数目  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string orderId\n      */\n\n  modifyInstanceSpec (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceSpec\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceSpec\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.tikvNodeNum !== undefined && opts.tikvNodeNum !== null) {\n      postBody['tikvNodeNum'] = opts.tikvNodeNum\n    }\n    if (opts.pdNodeNum !== undefined && opts.pdNodeNum !== null) {\n      postBody['pdNodeNum'] = opts.pdNodeNum\n    }\n    if (opts.tidbNodeSpec !== undefined && opts.tidbNodeSpec !== null) {\n      postBody['tidbNodeSpec'] = opts.tidbNodeSpec\n    }\n    if (opts.tiflashNodeSpec !== undefined && opts.tiflashNodeSpec !== null) {\n      postBody['tiflashNodeSpec'] = opts.tiflashNodeSpec\n    }\n    if (opts.ticdcNodeSpec !== undefined && opts.ticdcNodeSpec !== null) {\n      postBody['ticdcNodeSpec'] = opts.ticdcNodeSpec\n    }\n    if (opts.monitorNodeSpec !== undefined && opts.monitorNodeSpec !== null) {\n      postBody['monitorNodeSpec'] = opts.monitorNodeSpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceSpec with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceSpec',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取某个实例下的所有节点的主要性能信息，如CPU，内存，存储空间等。 该性能信息从云监控获取，为上一个监控周期的数据。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页;  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为50，取值范围：[50,100]，用于查询列表的接口  optional\n      * @param {filter} [opts.filters] - nodeType, 支持operator选项：eq,ne\nnodeStatus, 支持operator选项：eq ne\n  optional\n      * @param {sort} [opts.sorts] - cpuUtil - CPU使用率\nmemeryUtil - 内存使用率\ndiskUsage - 磁盘使用率\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tiDBNode nodes\n      * @param number totalCount  总记录数\n      */\n\n  describeNodes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNodes\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeNodes\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNodes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/nodes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看TiDB实例的主要配置参数。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param describeParam parameters\n      */\n\n  describeParameters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeParameters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeParameters\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeParameters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/parameters',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改TiDB实例的配置参数。部分参数修改后，需要重启才能生效，具体可以参考PingCAP的相关文档。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} opts.parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyParameters (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyParameters\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyParameters\"\n      )\n    }\n    if (opts.parameters === undefined || opts.parameters === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.parameters' when calling modifyParameters\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.parameters !== undefined && opts.parameters !== null) {\n      postBody['parameters'] = opts.parameters\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyParameters with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/parameters',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  重启实例的某类节点。重启采用滚动重启的方式，如果该类节点有多个，通常不会中断实例的服务。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} opts.nodeType - 重启指定类型的pod,支持Tikv,TiDB,PD,TiFlash\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  rebootPod (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  rebootPod\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling rebootPod\"\n      )\n    }\n    if (opts.nodeType === undefined || opts.nodeType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.nodeType' when calling rebootPod\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.nodeType !== undefined && opts.nodeType !== null) {\n      postBody['nodeType'] = opts.nodeType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call rebootPod with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:rebootpod',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  升级TiDB引擎版本，例如从4.0.8 升级到 5.4.0等。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} [opts.version] - 升级后的版本号  optional\n      * @param {} [opts.timing] - 版本升级的时间点,时间格式yyyy-mm-dd hh:mm:ss。不传或者传入空表示取消升级  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  upgradeEngineVersion (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  upgradeEngineVersion\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling upgradeEngineVersion\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.version !== undefined && opts.version !== null) {\n      postBody['version'] = opts.version\n    }\n    if (opts.timing !== undefined && opts.timing !== null) {\n      postBody['timing'] = opts.timing\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call upgradeEngineVersion with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:upgradeEngineVersion',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前 TiDB 实例可升级到的目标版本。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string versions\n      */\n\n  describeUpgradeVersions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeUpgradeVersions\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeUpgradeVersions\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUpgradeVersions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeUpgradeVersions',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询当前 TiDB 实例的升级计划。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string newVersion  升级后的新版本\n      * @param string upgradeTime  计划开始升级的时间\n      * @param string status  任务状态 - 未开始 - 进行中 - 失败\n      */\n\n  describeUpgradePlan (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeUpgradePlan\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeUpgradePlan\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUpgradePlan with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:describeUpgradePlan',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启 TiDB 实例的 Internet 公网服务。开启后，并配置 IP 白名单后，可以在 VPC 外通过公网域名访问 TiDB 实例。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.serviceType - 按照service type (database pd monitor)开启公网域名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableInternetAccess (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableInternetAccess\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableInternetAccess\"\n      )\n    }\n    if (opts.serviceType === undefined || opts.serviceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceType' when calling enableInternetAccess\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.serviceType !== undefined && opts.serviceType !== null) {\n      postBody['serviceType'] = opts.serviceType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableInternetAccess with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:enableInternetAccess',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭 TiDB 实例的 Internet 公网服务。 关闭后，将不能在 VPC 外访问 TiDB 实例。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.serviceType - 按照service type (database pd monitor)关闭公网域名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableInternetAccess (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableInternetAccess\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableInternetAccess\"\n      )\n    }\n    if (opts.serviceType === undefined || opts.serviceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceType' when calling disableInternetAccess\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.serviceType !== undefined && opts.serviceType !== null) {\n      postBody['serviceType'] = opts.serviceType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableInternetAccess with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:disableInternetAccess',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开启 TiDB 和 MySQL 客户端之间的 SSL 连接功能。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableSSL (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableSSL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling enableSSL\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableSSL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ssl:enableSSL',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  关闭 TiDB 和 MySQL 客户端之间的 SSL 连接功能。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableSSL (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableSSL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disableSSL\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableSSL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ssl:disableSSL',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 TiDB 实例的 SSL 的开启状态。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean available  SSL开启状态，已开启为true，关闭为false\n      */\n\n  describeSSL (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSSL\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeSSL\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSSL with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/ssl',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 TiDB支持的基本信息。\n      * @param {Object} opts - parameters\n      * @param {string} [opts.azs] - 用户可用区[多个使用,分隔]  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string engineVersion\n      * @param string architectureType\n      * @param architectureVersion architectureVersion\n      */\n\n  describeAvailableDBInfoInternel (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeAvailableDBInfoInternel\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.azs !== undefined && opts.azs !== null) {\n      queryParams['azs'] = opts.azs\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeAvailableDBInfoInternel with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:describeAvailableDBInfoInternel',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询 TiDB 数据迁移任务的详细信息，例如任务的开始、完成时间，任务状态等等。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} [opts.queryStartTime] - 查询迁移任务的起始时间，结束时间为当前时间。按任务开始时间查询，默认查询7天（包含当天）  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param migrationTask migrationTasks\n      */\n\n  describeDataMigration (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeDataMigration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeDataMigration\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.queryStartTime !== undefined && opts.queryStartTime !== null) {\n      queryParams['queryStartTime'] = opts.queryStartTime\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDataMigration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/migration',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个数据迁移任务，可以将对象存储 OSS 中的数据导入到 TiDB 实例中，具体可以参考帮助文档。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} opts.migrationType - 迁移任务类型，支持以下类型（大小写不敏感）：&lt;br&gt;-FULL_IMPORT:全量数据导入\n      * @param {} opts.importTask - 使用 TiDB Lightning 进行的数据迁移任务\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createDataMigration (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDataMigration\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createDataMigration\"\n      )\n    }\n    if (opts.migrationType === undefined || opts.migrationType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.migrationType' when calling createDataMigration\"\n      )\n    }\n    if (opts.importTask === undefined || opts.importTask === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.importTask' when calling createDataMigration\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.migrationType !== undefined && opts.migrationType !== null) {\n      postBody['migrationType'] = opts.migrationType\n    }\n    if (opts.importTask !== undefined && opts.importTask !== null) {\n      postBody['importTask'] = opts.importTask\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDataMigration with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/migration',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  校验需要导入的备份文件在OSS上是否存在，需要的读取权限是否具备。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} opts.ossLink - 要校验的文件bucket及路径,例如Bucket为db_bak,文件路径为test_server/db1/20181013.bak,则ossLink为db_bak/test_server/db1/20181013.bak\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string success  true：成功false:失败,文件不存在，类型不对或需要的权限不正确\n      * @param string errMsg  具体的错误信息\n      */\n\n  verifyFilefromOSS (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  verifyFilefromOSS\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling verifyFilefromOSS\"\n      )\n    }\n    if (opts.ossLink === undefined || opts.ossLink === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ossLink' when calling verifyFilefromOSS\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ossLink !== undefined && opts.ossLink !== null) {\n      postBody['ossLink'] = opts.ossLink\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call verifyFilefromOSS with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/migration:verifyFilefromOSS',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询当前实例下所有的复制任务。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer totalCount  总记录数\n      * @param replicationTask replications  要复制的对象\n      */\n\n  describeReplications (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeReplications\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeReplications\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeReplications with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/replications',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个数据复制任务，可以将 TiDB 的增量数据同步到下游的 MySQL， TiDB 或者 Kafka 中。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {replicationSpec} opts.replication - 数据复制任务的详细信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string replicationId  复制任务ID\n      */\n\n  createReplication (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createReplication\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createReplication\"\n      )\n    }\n    if (opts.replication === undefined || opts.replication === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.replication' when calling createReplication\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.replication !== undefined && opts.replication !== null) {\n      postBody['replication'] = opts.replication\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createReplication with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/replications',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定的复制任务。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.taskId - 复制任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteReplication (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteReplication\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteReplication\"\n      )\n    }\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling deleteReplication\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteReplication with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/replications/{taskId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  继续处于“暂停”状态的复制任务。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.taskId - 复制任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resumeReplication (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resumeReplication\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling resumeReplication\"\n      )\n    }\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling resumeReplication\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resumeReplication with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/replications/{taskId}:resumeReplication',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  暂停指定的复制任务。注意：如果暂停的时间过长，会导致 TiCDC 节点的磁盘空间写满，导致复制任务错误或失败。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.taskId - 复制任务ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopReplication (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopReplication\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling stopReplication\"\n      )\n    }\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling stopReplication\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopReplication with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/replications/{taskId}:stopReplication',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改复制任务，修改前需要先暂停复制任务。为保证复制任务的可靠性，目前仅允许修改部分配置。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.taskId - 复制任务ID\n      * @param {string} opts.taskId - 复制任务ID\n      * @param {string} [opts.targetComment] - 目标实例备注说明  optional\n      * @param {string} [opts.targetUser] - 目标类型为TiDB或MySQL时，连接目标实例的用户名  optional\n      * @param {string} [opts.targetPassword] - 目标类型为TiDB或MySQL时，连接目标实例的密码  optional\n      * @param {string} [opts.kafkaTopic] - Kafka的Topic  optional\n      * @param {string} [opts.kafkaVersion] - Kafka的版本  optional\n      * @param {array} [opts.replicationObjects] - 过滤规则列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyReplication (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyReplication\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyReplication\"\n      )\n    }\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling modifyReplication\"\n      )\n    }\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling modifyReplication\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskId !== undefined && opts.taskId !== null) {\n      postBody['taskId'] = opts.taskId\n    }\n    if (opts.targetComment !== undefined && opts.targetComment !== null) {\n      postBody['targetComment'] = opts.targetComment\n    }\n    if (opts.targetUser !== undefined && opts.targetUser !== null) {\n      postBody['targetUser'] = opts.targetUser\n    }\n    if (opts.targetPassword !== undefined && opts.targetPassword !== null) {\n      postBody['targetPassword'] = opts.targetPassword\n    }\n    if (opts.kafkaTopic !== undefined && opts.kafkaTopic !== null) {\n      postBody['kafkaTopic'] = opts.kafkaTopic\n    }\n    if (opts.kafkaVersion !== undefined && opts.kafkaVersion !== null) {\n      postBody['kafkaVersion'] = opts.kafkaVersion\n    }\n    if (\n      opts.replicationObjects !== undefined &&\n      opts.replicationObjects !== null\n    ) {\n      postBody['replicationObjects'] = opts.replicationObjects\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyReplication with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/replications/{taskId}:modifyReplication',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看实例当前白名单。白名单是允许访问当前实例的IP/IP段列表，缺省情况下，白名单对本VPC开放。如果用户开启了外网访问的功能，还需要对外网的IP配置白名单。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param whiteList whiteLists\n      */\n\n  describeWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeWhiteList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/whiteList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  增加白名单分组，用于用户管理不同类型或者来源的 IP 白名单。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {} opts.name - 白名单分组名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addWhiteListGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addWhiteListGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling addWhiteListGroup\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling addWhiteListGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addWhiteListGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/whiteList',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改允许访问实例的IP白名单。白名单是允许访问当前实例的IP/IP段列表，缺省情况下，白名单对本VPC开放。如果用户开启了外网访问的功能，还需要对外网的IP配置白名单。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.ips - IP或IP段，不同的IP/IP段之间用英文逗号分隔，例如0.0.0.0/0,192.168.0.10\n      * @param {string} opts.name - 白名单分组名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyWhiteList\"\n      )\n    }\n    if (opts.ips === undefined || opts.ips === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ips' when calling modifyWhiteList\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling modifyWhiteList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ips !== undefined && opts.ips !== null) {\n      postBody['ips'] = opts.ips\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/whiteList',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除指定的白名单分组。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例ID\n      * @param {string} opts.name - 白名单分组名\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteWhiteListGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteWhiteListGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteWhiteListGroup\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling deleteWhiteListGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      queryParams['name'] = opts.name\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  tidb/1.0.6'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteWhiteListGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/whiteList',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = TIDB\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/user/v1/user.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 账号报备管理\n * 账号报备管理接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'user'\nService._services[serviceId] = true\n\n/**\n * user service.\n * @version 0.2.8\n */\n\nclass USER extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'user.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询用户信息\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string pin  用户Pin\n      * @param string loginName  登录名\n      * @param string accountId  用户唯一id\n      * @param integer userAuth  实名认证状态:0-未认证 1-已认证（个人） 2-已认证（企业） 3-已认证（个人和企业）\n      */\n\n  describeUser (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  user/0.2.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/describeUser',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建免登录ticket\n      * @param {Object} opts - parameters\n      * @param {} [opts.expire] - 有效期（默认24，最小1，最大24，单位小时）  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string ticket  免登录ticket\n      */\n\n  createTicket (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.expire !== undefined && opts.expire !== null) {\n      postBody['expire'] = opts.expire\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  user/0.2.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createTicket with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/user:createTicket',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = USER\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/userpool/v1/userpool.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 用户管理\n * 用户管理接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'userpool'\nService._services[serviceId] = true\n\n/**\n * userpool service.\n * @version 0.1.0\n */\n\nJDCloud.USERPOOL = class USERPOOL extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'userpool.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  批量查询Pool用户信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.poolName - PoolName\n      * @param {string} [opts.userNames] - 用户信息(userName)  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param poolUserResVo poolUsers\n      */\n\n  adminGetUsers (opts, callback) {\n    opts = opts || {}\n\n    if (opts.poolName === undefined || opts.poolName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.poolName' when calling adminGetUsers\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(\n      queryParams,\n      this.buildArrayParam(opts.userNames, 'userNames')\n    )\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      poolName: opts.poolName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  userpool/0.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call adminGetUsers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/poolName/{poolName}/user',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建Mine craft用户\n      * @param {Object} opts - parameters\n      * @param {string} opts.poolName - PoolName\n      * @param {array} opts.poolUsers - Pool用户信息列表\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param failedMsg failedList\n      * @param poolUserResVo users\n      */\n\n  adminCreateUser (opts, callback) {\n    opts = opts || {}\n\n    if (opts.poolName === undefined || opts.poolName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.poolName' when calling adminCreateUser\"\n      )\n    }\n    if (opts.poolUsers === undefined || opts.poolUsers === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.poolUsers' when calling adminCreateUser\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.poolUsers !== undefined && opts.poolUsers !== null) {\n      postBody['poolUsers'] = opts.poolUsers\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      poolName: opts.poolName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  userpool/0.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call adminCreateUser with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/poolName/{poolName}/user',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询Pool用户信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.poolName - PoolName\n      * @param {integer} [opts.currentPage] - 页号(起始页1)  optional\n      * @param {integer} [opts.pageSize] - 页大小(最大100,默认10)  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param pageInfo pageInfo\n      * @param poolUserResVo poolUsers\n      */\n\n  listUsers (opts, callback) {\n    opts = opts || {}\n\n    if (opts.poolName === undefined || opts.poolName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.poolName' when calling listUsers\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.currentPage !== undefined && opts.currentPage !== null) {\n      queryParams['currentPage'] = opts.currentPage\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      poolName: opts.poolName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  userpool/0.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listUsers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/poolName/{poolName}/user:list',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  管理员批量设置Pool用户密码\n      * @param {Object} opts - parameters\n      * @param {string} opts.poolName - PoolName\n      * @param {array} opts.userPasswords - Pool用户名和密码\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  adminSetUsersPassword (opts, callback) {\n    opts = opts || {}\n\n    if (opts.poolName === undefined || opts.poolName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.poolName' when calling adminSetUsersPassword\"\n      )\n    }\n    if (opts.userPasswords === undefined || opts.userPasswords === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userPasswords' when calling adminSetUsersPassword\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.userPasswords !== undefined && opts.userPasswords !== null) {\n      postBody['userPasswords'] = opts.userPasswords\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      poolName: opts.poolName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  userpool/0.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call adminSetUsersPassword with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/poolName/{poolName}/user:adminSetUsersPassword',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.USERPOOL\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/vm/v1/vm.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Task\n * 与任务相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'vm'\nService._services[serviceId] = true\n\n/**\n * vm service.\n * @version 1.6.1\n */\n\nclass VM extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'vm.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *\n查询镜像详情。\n\n详细操作说明请参考帮助文档：[镜像概述](https://docs.jdcloud.com/cn/virtual-machines/image-overview)\n\n## 接口说明\n- 该接口与查询镜像信息列表返回的信息一致。\n- 只需要查询单个镜像信息的时候可以调用该接口。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageId - 镜像ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param image image  镜像信息。\n      */\n\n  describeImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling describeImage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageId: opts.imageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images/{imageId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n删除一个私有镜像。\n\n详细操作说明请参考帮助文档：[删除私有镜像](https://docs.jdcloud.com/cn/virtual-machines/delete-private-image)\n\n## 接口说明\n- 已共享的私有镜像在取消共享关系前不可以删除，如私有镜像已共享给其他用户，请取消共享后再进行删除。\n- 本地系统盘镜像在有基于其创建的云主机时，将无法删除。\n- 只能操作私有镜像。\n- 私有镜像没有正在处理中的任务时才可以删除。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageId - 镜像ID。\n      * @param {boolean} [opts.deleteSnapshot] - 删除镜像时是否删除关联的快照。默认为 &#x60;false&#x60;；如果指定为 &#x60;true&#x60;, 将会删除镜像关联的快照。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling deleteImage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deleteSnapshot !== undefined && opts.deleteSnapshot !== null) {\n      queryParams['deleteSnapshot'] = opts.deleteSnapshot\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      imageId: opts.imageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images/{imageId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n基于快照制作私有镜像，支持指定单个快照创建系统盘镜像；指定多个快照组合创建整机镜像\n\n## 接口说明\n- 快照须为可用状态，且需有指定快照的权限，快照数量为1-8块。\n- 单块快照创建镜像，设备名必须为vda；多块快照创建镜像，设备名必须包含vda。\n- 设置云盘的容量需大于快照容量。\n- 调用接口后，需要等待镜像状态变为 ready 后，才能正常使用镜像。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 镜像名称，长度为2\\~32个字符，只允许中文、数字、大小写字母、英文下划线（\\_）、连字符（-）及点（.）。\n\n      * @param {string} [opts.description] - 镜像描述，256字符以内。\n  optional\n      * @param {string} opts.platform - 镜像的操作系统类型, 可选值：CentOS、Ubuntu、Windows Server、OpenEuler、Rocky Linux、Others Linux。\n\n      * @param {string} [opts.osVersion] - 操作系统版本。如：7.9\n  optional\n      * @param {string} opts.architecture - 操作系统架构, 可选值：x86_64、arm64。\n\n      * @param {array} [opts.cloudDisks] - 云盘快照信息。\n  optional\n      * @param {string} [opts.clientToken] - 用于保证请求的幂等性。由客户端生成，并确保不同请求中该参数唯一，长度不能超过64个字符。\n  optional\n      * @param {string} opts.bootMode - 启动模式，支持uefi、bios。\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string imageId  镜像ID。\n      */\n\n  createImageFromSnapshots (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createImageFromSnapshots\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createImageFromSnapshots\"\n      )\n    }\n    if (opts.platform === undefined || opts.platform === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.platform' when calling createImageFromSnapshots\"\n      )\n    }\n    if (opts.architecture === undefined || opts.architecture === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.architecture' when calling createImageFromSnapshots\"\n      )\n    }\n    if (opts.bootMode === undefined || opts.bootMode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bootMode' when calling createImageFromSnapshots\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.platform !== undefined && opts.platform !== null) {\n      postBody['platform'] = opts.platform\n    }\n    if (opts.osVersion !== undefined && opts.osVersion !== null) {\n      postBody['osVersion'] = opts.osVersion\n    }\n    if (opts.architecture !== undefined && opts.architecture !== null) {\n      postBody['architecture'] = opts.architecture\n    }\n    if (opts.cloudDisks !== undefined && opts.cloudDisks !== null) {\n      postBody['cloudDisks'] = opts.cloudDisks\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.bootMode !== undefined && opts.bootMode !== null) {\n      postBody['bootMode'] = opts.bootMode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createImageFromSnapshots with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images:createImageFromSnapshots',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询镜像信息列表。\n\n详细操作说明请参考帮助文档：[镜像概述](https://docs.jdcloud.com/cn/virtual-machines/image-overview)\n\n## 接口说明\n- 通过此接口可以查询到京东云官方镜像、第三方镜像、镜像市场、私有镜像、或其他用户共享给您的镜像。\n- 请求参数即过滤条件，每个条件之间的关系为逻辑与（AND）的关系。\n- 如果使用子帐号查询，只会查询到该子帐号有权限的镜像。关于资源权限请参考 [IAM概述](https://docs.jdcloud.com/cn/iam/product-overview)。\n- 单次查询最大可查询100条镜像信息。\n- 尽量一次调用接口查询多条数据，不建议使用该批量查询接口一次查询一条数据，如果使用不当导致查询过于密集，可能导致网关触发限流。\n- 由于该接口为 &#x60;GET&#x60; 方式请求，最终参数会转换为 &#x60;URL&#x60; 上的参数，但是 &#x60;HTTP&#x60; 协议下的 &#x60;GET&#x60; 请求参数长度是有大小限制的，使用者需要注意参数超长的问题。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.imageSource] - 镜像来源，如果没有指定 &#x60;ids&#x60; 参数，此参数必传。取值范围：\n&#x60;public&#x60;：官方镜像。\n&#x60;thirdparty&#x60;：镜像市场镜像。\n&#x60;private&#x60;：用户自己的私有镜像。\n&#x60;shared&#x60;：其他用户分享的镜像。\n&#x60;community&#x60;：社区镜像。\n  optional\n      * @param {boolean} [opts.offline] - 查询已经下线的镜像时使用。\n只有查询 &#x60;官方镜像&#x60; 或者 &#x60;镜像市场镜像&#x60; 时，此参数才有意义，其它情况下此参数无效。\n指定 &#x60;ids&#x60; 查询时，此参数无效。\n  optional\n      * @param {string} [opts.platform] - 根据镜像的操作系统发行版查询。\n取值范围：&#x60;Ubuntu、CentOS、Windows Server&#x60;。\n  optional\n      * @param {string} [opts.imageName] - 根据镜像名称模糊查询。  optional\n      * @param {string} [opts.rootDeviceType] - 根据镜像支持的系统盘类型查询。支持范围：&#x60;localDisk&#x60; 本地系统盘镜像；&#x60;cloudDisk&#x60; 云盘系统盘镜像。  optional\n      * @param {string} [opts.launchPermission] - 根据镜像的使用权限查询，可选参数，仅当 &#x60;imageSource&#x60; 为 &#x60;private&#x60; 时有效。取值范围：\n&#x60;all&#x60;：没有限制，所有人均可以使用。\n&#x60;specifiedUsers&#x60;：只有共享用户可以使用。\n&#x60;ownerOnly&#x60;：镜像拥有者自己可以使用。\n  optional\n      * @param {string} [opts.status] - 根据镜像状态查询。参考 [镜像状态](https://docs.jdcloud.com/virtual-machines/api/image_status)  optional\n      * @param {string} [opts.serviceCode] - 已废弃。  optional\n      * @param {string} [opts.architecture] - CPU架构。支持范围：&#x60;x86_64&#x60;、&#x60;arm64&#x60;。  optional\n      * @param {integer} [opts.pageNumber] - 页码；默认为1。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；&lt;br&gt;默认为20；取值范围[10, 100]。  optional\n      * @param {string} [opts.bootMode] - 镜像启动模式，默认bios，支持范围：&#x60;bios&#x60;、&#x60;uefi&#x60;。  optional\n      * @param {string} [opts.ids] - 指定镜像ID查询，如果指定了此参数，其它参数可以不传。\n  optional\n      * @param {string} [opts.instanceIds] - 虚机ID， 精确匹配  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param image images\n      * @param integer totalCount  本次查询可匹配到的总记录数，使用者需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      */\n\n  describeImages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeImages\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.imageSource !== undefined && opts.imageSource !== null) {\n      queryParams['imageSource'] = opts.imageSource\n    }\n    if (opts.offline !== undefined && opts.offline !== null) {\n      queryParams['offline'] = opts.offline\n    }\n    if (opts.platform !== undefined && opts.platform !== null) {\n      queryParams['platform'] = opts.platform\n    }\n    if (opts.imageName !== undefined && opts.imageName !== null) {\n      queryParams['imageName'] = opts.imageName\n    }\n    if (opts.rootDeviceType !== undefined && opts.rootDeviceType !== null) {\n      queryParams['rootDeviceType'] = opts.rootDeviceType\n    }\n    if (opts.launchPermission !== undefined && opts.launchPermission !== null) {\n      queryParams['launchPermission'] = opts.launchPermission\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.architecture !== undefined && opts.architecture !== null) {\n      queryParams['architecture'] = opts.architecture\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.bootMode !== undefined && opts.bootMode !== null) {\n      queryParams['bootMode'] = opts.bootMode\n    }\n    Object.assign(queryParams, super.buildArrayParam(opts.ids, 'ids'))\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.instanceIds, 'instanceIds')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeImages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询单个镜像的实例规格限制。\n\n详细操作说明请参考帮助文档：[镜像概述](https://docs.jdcloud.com/cn/virtual-machines/image-overview)\n\n## 接口说明\n- 该接口与批量查询镜像的实例规格限制返回的信息一致。\n- 通过此接口可以查询镜像的实例规格限制信息。\n- 只有官方镜像、第三方镜像有实例规格的限制，用户的私有镜像没有此限制。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageId - 镜像ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageConstraint imageConstraints  镜像限制信息。\n      */\n\n  describeImageConstraints (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeImageConstraints\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling describeImageConstraints\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageId: opts.imageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeImageConstraints with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images/{imageId}/constraints',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n批量查询镜像的实例规格限制。\n\n详细操作说明请参考帮助文档：[镜像概述](https://docs.jdcloud.com/cn/virtual-machines/image-overview)\n\n## 接口说明\n- 通过此接口可以查询镜像的实例规格限制信息。\n- 只有官方镜像、第三方镜像有实例规格的限制，用户的私有镜像没有此限制。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.ids] - 要查询的镜像ID列表，只支持官方镜像和第三方镜像。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageConstraint imageConstraints\n      */\n\n  describeImageConstraintsBatch (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeImageConstraintsBatch\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildArrayParam(opts.ids, 'ids'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeImageConstraintsBatch with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/imageConstraints',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n共享私有镜像。\n\n详细操作说明请参考帮助文档：[共享私有镜像](https://docs.jdcloud.com/cn/virtual-machines/share-image)\n\n## 接口说明\n- 只允许共享用户的私有镜像。\n- 单个镜像最多可以共享给20个京东云帐户、不可以共享给自己。\n- 带有加密快照的打包镜像无法共享。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageId - 镜像ID。\n      * @param {array} [opts.pins] - 共享的目标用户pin列表。  optional\n      * @param {array} [opts.loginNames] - 共享的目标京东云帐户列表。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  shareImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  shareImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling shareImage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.pins !== undefined && opts.pins !== null) {\n      postBody['pins'] = opts.pins\n    }\n    if (opts.loginNames !== undefined && opts.loginNames !== null) {\n      postBody['loginNames'] = opts.loginNames\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageId: opts.imageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call shareImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images/{imageId}:share',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n取消共享私有镜像。\n\n详细操作说明请参考帮助文档：[取消共享私有镜像](https://docs.jdcloud.com/cn/virtual-machines/cancel-share-image)\n\n## 接口说明\n- 只允许操作用户的私有镜像。\n- 原被共享用户将无法再使用该镜像创建云主机实例，同时使用该镜像创建的云主机实例也无法重置为原始系统状态。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageId - 镜像ID。\n      * @param {array} [opts.pins] - 需要取消的用户pin列表。  optional\n      * @param {array} [opts.loginNames] - 需要取消的京东云帐户列表。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  unShareImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  unShareImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling unShareImage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.pins !== undefined && opts.pins !== null) {\n      postBody['pins'] = opts.pins\n    }\n    if (opts.loginNames !== undefined && opts.loginNames !== null) {\n      postBody['loginNames'] = opts.loginNames\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageId: opts.imageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call unShareImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images/{imageId}:unshare',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n发布社区镜像。\n\n详细操作说明请参考帮助文档：[镜像概述](https://docs.jdcloud.com/cn/virtual-machines/image-overview)\n\n## 接口说明\n- 只允许发布用户的私有镜像。\n- 仅支持云盘系统盘的私有镜像。\n- 带有加密快照的打包镜像无法发布为社区镜像。\n- 发布为社区镜像后会撤销共享关系。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageId - 镜像ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  releaseImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  releaseImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling releaseImage\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageId: opts.imageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call releaseImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images/{imageId}:release',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n撤销社区镜像。\n\n详细操作说明请参考帮助文档：[镜像概述](https://docs.jdcloud.com/cn/virtual-machines/image-overview)\n\n## 接口说明\n- 只允许撤销用户的私有镜像。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageId - 镜像ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  unReleaseImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  unReleaseImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling unReleaseImage\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageId: opts.imageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call unReleaseImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images/{imageId}:unrelease',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询私有镜像共享给哪些京东云帐户。\n\n详细操作说明请参考帮助文档：[共享私有镜像](https://docs.jdcloud.com/cn/virtual-machines/share-image)\n\n## 接口说明\n- 只允许查询用户的私有镜像。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageId - 镜像ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string pins\n      * @param string loginNames\n      */\n\n  describeImageMembers (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeImageMembers\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling describeImageMembers\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageId: opts.imageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeImageMembers with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images/{imageId}/members',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n镜像复制。\n\n详细操作说明请参考帮助文档：[镜像复制](https://docs.jdcloud.com/cn/virtual-machines/copy-image)\n\n## 接口说明\n- 调用该接口可以复制私有或共享镜像。\n- 复制私有镜像时，只允许镜像拥有者进行复制。\n- 复制共享镜像时，允许共享的用户将镜像复制为私有镜像。\n- 支持同地域复制镜像。\n- 只支持云盘系统盘的镜像。\n- 不支持带有加密快照的镜像。\n\n      * @param {Object} opts - parameters\n      * @param {array} [opts.sourceImageIds] - 要复制的私有镜像ID列表，最多支持10个。  optional\n      * @param {string} opts.destinationRegion - 目标地域。\n      * @param {string} [opts.name] - 复制出新镜像的名称，长度为1\\~32个字符，只允许中文、数字、大小写字母、英文下划线（\\_）、连字符（-）及点（.）。\n指定该参数时，所有复制出的镜像都设置相同的名称。\n不指定该参数时，复制的镜像使用源镜像名称。\n  optional\n      * @param {string} [opts.description] - 复制出新镜像的描述，不超过256个字符。\n指定该参数时，所有复制出的镜像都设置相同的描述。\n不指定该参数时，复制的镜像使用系统生成的描述信息。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param copyImage copyImages\n      */\n\n  copyImages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  copyImages\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.destinationRegion === undefined ||\n      opts.destinationRegion === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.destinationRegion' when calling copyImages\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.sourceImageIds !== undefined && opts.sourceImageIds !== null) {\n      postBody['sourceImageIds'] = opts.sourceImageIds\n    }\n    if (\n      opts.destinationRegion !== undefined &&\n      opts.destinationRegion !== null\n    ) {\n      postBody['destinationRegion'] = opts.destinationRegion\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call copyImages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images:copyImages',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n修改镜像属性。\n\n详细操作说明请参考帮助文档：[镜像概述](https://docs.jdcloud.com/cn/virtual-machines/image-overview)\n\n## 接口说明\n- 只支持修改镜像名称或描述。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageId - 镜像ID。\n      * @param {string} [opts.name] - 镜像名称。参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。  optional\n      * @param {string} [opts.description] - 镜像描述。参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyImageAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyImageAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling modifyImageAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageId: opts.imageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyImageAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images/{imageId}:modifyImageAttribute',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n导入私有镜像。\n\n详细操作说明请参考帮助文档：[导入私有镜像](https://docs.jdcloud.com/cn/virtual-machines/import-private-image)\n\n## 接口说明\n- 导入后的镜像将以 &#x60;云硬盘系统盘镜像&#x60; 格式作为私有镜像使用，同时会自动生成与导入镜像关联的快照。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.architecture - 镜像架构。取值范围：&#x60;x86_64、arm64&#x60;。\n      * @param {string} opts.osType - 镜像的操作系统类型。取值范围：&#x60;windows、linux&#x60;。\n      * @param {string} opts.platform - 镜像的操作系统平台名称。\n取值范围：&#x60;Ubuntu、CentOS、Windows Server、Other Linux、Other Windows&#x60;。\n\n      * @param {string} opts.diskFormat - 磁盘格式，取值范围：&#x60;qcow2、vhd、vmdk、raw&#x60;。\n      * @param {integer} opts.systemDiskSizeGB - 以此镜像需要制作的系统盘的默认大小，单位GB。最小值40，最大值500，要求值是10的整数倍。\n      * @param {string} opts.imageUrl - 要导入镜像的对象存储外链地址。\n      * @param {string} [opts.osVersion] - 镜像的操作系统版本。  optional\n      * @param {string} opts.imageName - 导入镜像的自定义名称。参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。\n      * @param {string} [opts.description] - 导入镜像的描述信息。参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。  optional\n      * @param {boolean} [opts.forceImport] - 是否强制导入。强制导入会忽略镜像的合规性检测。默认为false。  optional\n      * @param {array} [opts.dataDisks] - 云盘快照信息。\n  optional\n      * @param {string} [opts.clientToken] - 用户导出镜像的幂等性保证。每次导出请传入不同的值，如果传值与某次的clientToken相同，则返还同一个请求结果，不能超过64个字符。  optional\n      * @param {string} [opts.bootMode] - 镜像启动模式，默认bios，支持范围：&#x60;bios&#x60;、&#x60;uefi&#x60;。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string imageId  镜像id。\n      * @param string taskId  导入任务id。\n      */\n\n  importImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  importImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.architecture === undefined || opts.architecture === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.architecture' when calling importImage\"\n      )\n    }\n    if (opts.osType === undefined || opts.osType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.osType' when calling importImage\"\n      )\n    }\n    if (opts.platform === undefined || opts.platform === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.platform' when calling importImage\"\n      )\n    }\n    if (opts.diskFormat === undefined || opts.diskFormat === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.diskFormat' when calling importImage\"\n      )\n    }\n    if (opts.systemDiskSizeGB === undefined || opts.systemDiskSizeGB === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.systemDiskSizeGB' when calling importImage\"\n      )\n    }\n    if (opts.imageUrl === undefined || opts.imageUrl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageUrl' when calling importImage\"\n      )\n    }\n    if (opts.imageName === undefined || opts.imageName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageName' when calling importImage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.architecture !== undefined && opts.architecture !== null) {\n      postBody['architecture'] = opts.architecture\n    }\n    if (opts.osType !== undefined && opts.osType !== null) {\n      postBody['osType'] = opts.osType\n    }\n    if (opts.platform !== undefined && opts.platform !== null) {\n      postBody['platform'] = opts.platform\n    }\n    if (opts.diskFormat !== undefined && opts.diskFormat !== null) {\n      postBody['diskFormat'] = opts.diskFormat\n    }\n    if (opts.systemDiskSizeGB !== undefined && opts.systemDiskSizeGB !== null) {\n      postBody['systemDiskSizeGB'] = opts.systemDiskSizeGB\n    }\n    if (opts.imageUrl !== undefined && opts.imageUrl !== null) {\n      postBody['imageUrl'] = opts.imageUrl\n    }\n    if (opts.osVersion !== undefined && opts.osVersion !== null) {\n      postBody['osVersion'] = opts.osVersion\n    }\n    if (opts.imageName !== undefined && opts.imageName !== null) {\n      postBody['imageName'] = opts.imageName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.forceImport !== undefined && opts.forceImport !== null) {\n      postBody['forceImport'] = opts.forceImport\n    }\n    if (opts.dataDisks !== undefined && opts.dataDisks !== null) {\n      postBody['dataDisks'] = opts.dataDisks\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.bootMode !== undefined && opts.bootMode !== null) {\n      postBody['bootMode'] = opts.bootMode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call importImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images:import',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n导出私有镜像。\n\n将京东云私有镜像导出至京东云以外环境。\n\n详细操作说明请参考帮助文档：[导出私有镜像](https://docs.jdcloud.com/cn/virtual-machines/export-private-image)\n\n## 接口说明\n- 调用此接口将私有镜像导出到京东云对象存储空间中。\n- 仅支持系统盘镜像导出，即使镜像有关联的数据盘快照，也仅会导出系统盘镜像文件。\n- 导出的镜像文件格式为QCOW2。\n- &#x60;Windows Server&#x60; 操作系统的镜像不支持导出（若镜像来源为导入镜像，则无此限制）。\n- 镜像必须为 &#x60;云硬盘系统盘&#x60; 镜像，如您的镜像是 &#x60;本地盘系统盘&#x60; 镜像，可以通过镜像类型转换功能转换为云盘系统盘镜像后再导出。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.imageId - 镜像ID。\n      * @param {string} opts.roleName - 用户创建的服务角色名称。\n      * @param {string} opts.ossUrl - 存储导出镜像文件的 &#x60;oss bucket&#x60; 的域名，请填写以 https:// 开头的完整url。\n      * @param {string} [opts.ossPrefix] - 导出镜像文件名前缀，仅支持英文字母和数字，不能超过32个字符。  optional\n      * @param {string} [opts.clientToken] - 用户导出镜像的幂等性保证。每次导出请传入不同的值，如果传值与某次的clientToken相同，则返还同一个请求结果，不能超过64个字符。  optional\n      * @param {boolean} [opts.isAllDisk] - 是否导出整机镜像（包含数据盘），默认为false，仅导出系统盘。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId  导出任务id。\n      */\n\n  exportImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  exportImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.imageId === undefined || opts.imageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imageId' when calling exportImage\"\n      )\n    }\n    if (opts.roleName === undefined || opts.roleName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.roleName' when calling exportImage\"\n      )\n    }\n    if (opts.ossUrl === undefined || opts.ossUrl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ossUrl' when calling exportImage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.roleName !== undefined && opts.roleName !== null) {\n      postBody['roleName'] = opts.roleName\n    }\n    if (opts.ossUrl !== undefined && opts.ossUrl !== null) {\n      postBody['ossUrl'] = opts.ossUrl\n    }\n    if (opts.ossPrefix !== undefined && opts.ossPrefix !== null) {\n      postBody['ossPrefix'] = opts.ossPrefix\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.isAllDisk !== undefined && opts.isAllDisk !== null) {\n      postBody['isAllDisk'] = opts.isAllDisk\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      imageId: opts.imageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call exportImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/images/{imageId}:exportImage',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询镜像任务详情。\n\n将京东云私有镜像导出至京东云以外环境。\n\n详细操作说明请参考帮助文档：\n[导入私有镜像](https://docs.jdcloud.com/cn/virtual-machines/import-private-image)\n[导出私有镜像](https://docs.jdcloud.com/cn/virtual-machines/export-private-image)\n\n## 接口说明\n- 调用该接口可查询镜像导入或导出的任务详情。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.taskAction] - 任务操作类型。支持范围：&#x60;ImportImage、ExportImage&#x60;。  optional\n      * @param {string} [opts.taskStatus] - 任务状态。支持范围：&#x60;pending、running、failed、finished&#x60;。  optional\n      * @param {string} [opts.startTime] - 任务开始时间  optional\n      * @param {string} [opts.endTime] - 任务结束时间  optional\n      * @param {integer} [opts.pageNumber] - 页码；默认为1。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；取值范围[10, 100]。  optional\n      * @param {string} [opts.taskIds] - 任务id列表。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param taskInfo taskSet\n      * @param integer totalCount  总数量\n      */\n\n  imageTasks (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  imageTasks\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.taskAction !== undefined && opts.taskAction !== null) {\n      queryParams['taskAction'] = opts.taskAction\n    }\n    if (opts.taskStatus !== undefined && opts.taskStatus !== null) {\n      queryParams['taskStatus'] = opts.taskStatus\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildArrayParam(opts.taskIds, 'taskIds'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call imageTasks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/imageTasks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询一台或多台云主机实例的详细信息。\n\n详细操作说明请参考帮助文档：[查找实例](https://docs.jdcloud.com/cn/virtual-machines/search-instance)\n\n## 接口说明\n- 使用 &#x60;filters&#x60; 过滤器进行条件筛选，每个 &#x60;filter&#x60; 之间的关系为逻辑与（AND）的关系。\n- 如果使用子帐号查询，只会查询到该子帐号有权限的云主机实例。关于资源权限请参考 [IAM概述](https://docs.jdcloud.com/cn/iam/product-overview)。\n- 单次查询最大可查询100条云主机实例数据。\n- 尽量一次调用接口查询多条数据，不建议使用该批量查询接口一次查询一条数据，如果使用不当导致查询过于密集，可能导致网关触发限流。\n- 由于该接口为 &#x60;GET&#x60; 方式请求，最终参数会转换为 &#x60;URL&#x60; 上的参数，但是 &#x60;HTTP&#x60; 协议下的 &#x60;GET&#x60; 请求参数长度是有大小限制的，使用者需要注意参数超长的问题。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；&lt;br&gt;默认为20；取值范围[10, 100]。  optional\n      * @param {filter} [opts.filters] - &lt;b&gt;filters 中支持使用以下关键字进行过滤&lt;/b&gt;\n&#x60;instanceId&#x60;: 云主机ID，精确匹配，支持多个\n&#x60;privateIpAddress&#x60;: 云主机挂载的网卡内网主IP地址，模糊匹配，支持多个\n&#x60;az&#x60;: 可用区，精确匹配，支持多个\n&#x60;vpcId&#x60;: 私有网络ID，精确匹配，支持多个\n&#x60;status&#x60;: 云主机状态，精确匹配，支持多个，参考 [云主机状态](https://docs.jdcloud.com/virtual-machines/api/vm_status)\n&#x60;name&#x60;: 云主机名称，模糊匹配，支持单个\n&#x60;imageId&#x60;: 镜像ID，精确匹配，支持多个\n&#x60;networkInterfaceId&#x60;: 弹性网卡ID，精确匹配，支持多个\n&#x60;subnetId&#x60;: 子网ID，精确匹配，支持多个\n&#x60;agId&#x60;: 使用可用组id，支持单个\n&#x60;faultDomain&#x60;: 错误域，支持多个\n&#x60;dedicatedHostId&#x60;: 专有宿主机ID，精确匹配，支持多个\n&#x60;dedicatedPoolId&#x60;: 专有宿主机池ID，精确匹配，支持多个\n&#x60;instanceType&#x60;: 实例规格，精确匹配，支持多个，可通过查询 [DescribeInstanceTypes](https://docs.jdcloud.com/virtual-machines/api/describeinstancetypes) 接口获得实例规格\n&#x60;elasticIpAddress&#x60;: 公网IP地址，精确匹配，支持单个。该条件会将公网IP转换成 &#x60;networkInterfaceId&#x60; 进行查询，所以与 &#x60;networkInterfaceId&#x60; 为或者的关系。\n  optional\n      * @param {tagFilter} [opts.tags] - Tag筛选条件。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instances\n      * @param number totalCount  本次查询可匹配到的总记录数，使用者需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      */\n\n  describeInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n创建一台或多台指定配置的云主机实例。\n\n实例有三种创建方式，不同方式下传参详见下方的请求[参数说明](createInstance#requestparameters)，也可参考请求[示例](createInstance#examples)。\n\n1、自定义创建：按配置要求逐一指定参数创建；\n2、使用实例模板创建：[实例模板](https://docs.jdcloud.com/virtual-machines/instance-template-overview)是实例配置信息的预配置，通过实例模板可快速创建实例，省去逐一配置参数的步骤。指定实例模板创建时，如不额外指定模板包含的参数将以模板为准创建实例，模板中未包含的参数，如可用区、内网IPv4地址、名称等仍需指定；\n3、基于高可用组创建：[高可用组](https://docs.jdcloud.com/availability-group/product-overview)是一种高可用部署解决方案，提供了组内实例在数据中心内横跨多个故障域均衡部署的机制。高可用组须搭配实例模板使用，基于高可用组创建的实例将在其指定的可用区内以实例模板配置按一定分散机制创建实例。此创建方式下，实例创建参数除内网IPv4地址、名称等外均以实例模板为准且不支持再次指定。\n\n详细操作说明请参考帮助文档：[创建实例](https://docs.jdcloud.com/cn/virtual-machines/create-instance)\n\n## 接口说明\n- 创建实例前，请参考 [创建前准备](https://docs.jdcloud.com/virtual-machines/account-preparation-linux) 完成实名认证、支付方式确认、计费类型选择等准备工作。\n- 创建实例的配置说明和选择指导，请参考 [配置项说明](https://docs.jdcloud.com/cn/virtual-machines/select-configuration-linux)。\n- 各地域下实例及关联资源（云硬盘、弹性公网IP）的可创建数量受配额限制，创建前请通过 [DescribeQuotas](https://docs.jdcloud.com/cn/virtual-machines/api/describequotas?content&#x3D;API) 确认配额，如须提升请[提交工单](https://ticket.jdcloud.com/applyorder/submit)或联系京东云客服。\n- 不同地域及可用区下售卖的实例规格有差异，可通过 [DescribeInstanceTypes](https://docs.jdcloud.com/virtual-machines/api/describeinstancetypes?content&#x3D;API) 查询在售规格及规格详细信息。\n- 通过本接口创建包年包月实例时将自动从账户扣款（代金券优先），如需使用第三方支付方式请通过控制台创建。\n- 单次请求最多支持创建 &#x60;100&#x60; 台实例。\n- 本接口为异步接口，请求下发成功后会返回RequestId和实例ID，此时实例处于 &#x60;Pending&#x60;（创建中）状态。如创建成功则实例自动变为 &#x60;Running&#x60;（运行中）状态；如创建失败则短暂处于 &#x60;Error&#x60;（错误）状态，随后将自动删除（创建失败的实例不会收费且会自动释放占用的配额）。实例状态可以通过 [describeInstanceStatus](https://docs.jdcloud.com/virtual-machines/api/describeinstancestatus?content&#x3D;API) 接口查询。\n- 批量创建多台实例时系统将尽可能完成目标创建数量，但受底层资源、配额等因素影响，可能存在部分成功部分失败的情况，还请关注最终完成数量，如有失败情况请尝试重新申请或联系客服。\n\n      * @param {Object} opts - parameters\n      * @param {instanceSpec} opts.instanceSpec - 实例配置。\n\n      * @param {integer} [opts.maxCount] - 创建实例的数量，不能超过用户配额。\n取值范围：[1,100]；默认值：1。\n  optional\n      * @param {string} [opts.clientToken] - 用于保证请求的幂等性。由客户端生成，并确保不同请求中该参数唯一，长度不能超过64个字符。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceIds\n      */\n\n  createInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceSpec === undefined || opts.instanceSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceSpec' when calling createInstances\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceSpec !== undefined && opts.instanceSpec !== null) {\n      postBody['instanceSpec'] = opts.instanceSpec\n    }\n    if (opts.maxCount !== undefined && opts.maxCount !== null) {\n      postBody['maxCount'] = opts.maxCount\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询一台或多台云主机实例的详细信息。该接口为轻量级接口，不返回云盘、网络、计费、标签等关联信息。如果不需要关联资源属性，尽量选择使用该接口。\n\n详细操作说明请参考帮助文档：[查找实例](https://docs.jdcloud.com/cn/virtual-machines/search-instance)\n\n## 接口说明\n- 使用 &#x60;filters&#x60; 过滤器进行条件筛选，每个 &#x60;filter&#x60; 之间的关系为逻辑与（AND）的关系。\n- 如果使用子帐号查询，只会查询到该子帐号有权限的云主机实例。关于资源权限请参考 [IAM概述](https://docs.jdcloud.com/cn/iam/product-overview)。\n- 单次查询最大可查询100条云主机实例数据。\n- 尽量一次调用接口查询多条数据，不建议使用该批量查询接口一次查询一条数据，如果使用不当导致查询过于密集，可能导致网关触发限流。\n- 由于该接口为 &#x60;GET&#x60; 方式请求，最终参数会转换为 &#x60;URL&#x60; 上的参数，但是 &#x60;HTTP&#x60; 协议下的 &#x60;GET&#x60; 请求参数长度是有大小限制的，使用者需要注意参数超长的问题。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；&lt;br&gt;默认为20；取值范围[10, 100]。  optional\n      * @param {filter} [opts.filters] - &lt;b&gt;filters 中支持使用以下关键字进行过滤&lt;/b&gt;\n&#x60;instanceId&#x60;: 云主机ID，精确匹配，支持多个\n&#x60;privateIpAddress&#x60;: 云主机挂载的网卡内网主IP地址，模糊匹配，支持多个\n&#x60;az&#x60;: 可用区，精确匹配，支持多个\n&#x60;vpcId&#x60;: 私有网络ID，精确匹配，支持多个\n&#x60;status&#x60;: 云主机状态，精确匹配，支持多个，参考 [云主机状态](https://docs.jdcloud.com/virtual-machines/api/vm_status)\n&#x60;name&#x60;: 云主机名称，模糊匹配，支持单个\n&#x60;imageId&#x60;: 镜像ID，精确匹配，支持多个\n&#x60;networkInterfaceId&#x60;: 弹性网卡ID，精确匹配，支持多个\n&#x60;subnetId&#x60;: 子网ID，精确匹配，支持多个\n&#x60;agId&#x60;: 使用可用组id，支持单个\n&#x60;faultDomain&#x60;: 错误域，支持多个\n&#x60;dedicatedHostId&#x60;: 专有宿主机ID，精确匹配，支持多个\n&#x60;dedicatedPoolId&#x60;: 专有宿主机池ID，精确匹配，支持多个\n&#x60;instanceType&#x60;: 实例规格，精确匹配，支持多个，可通过查询 [DescribeInstanceTypes](https://docs.jdcloud.com/virtual-machines/api/describeinstancetypes) 接口获得实例规格\n&#x60;elasticIpAddress&#x60;: 公网IP地址，精确匹配，支持单个。该条件会将公网IP转换成 &#x60;networkInterfaceId&#x60; 进行查询，所以与 &#x60;networkInterfaceId&#x60; 为或者的关系。\n  optional\n      * @param {tagFilter} [opts.tags] - Tag筛选条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param briefInstance instances\n      * @param number totalCount  本次查询可匹配到的总记录数，用户需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      */\n\n  describeBriefInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBriefInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBriefInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:describeBriefInstances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询一台云主机实例的详细信息。\n\n详细操作说明请参考帮助文档：[查找实例](https://docs.jdcloud.com/cn/virtual-machines/search-instance)\n\n## 接口说明\n- 该接口与查询云主机列表返回的信息一致。\n- 只需要查询单个云主机实例详细信息的时候可以调用该接口。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instance  响应结果。\n      */\n\n  describeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n删除一台云主机实例。\n\n详细操作说明请参考帮助文档：[删除实例](https://docs.jdcloud.com/cn/virtual-machines/delete-instance)\n\n## 接口说明\n- 不可以删除包年包月未到期的云主机。如果云主机为包年包月已到期的，并且用户处于白名单中，也不允许删除。\n- 不可以删除没有计费信息的云主机，该情况只限于创建过程中出现了异常。\n- 云主机状态必须为运行 &#x60;running&#x60;、停止 &#x60;stopped&#x60;、错误 &#x60;error&#x60;、状态，同时云主机没有正在进行中的任务才可以删除。\n- 如果云主机中挂载的数据盘为按配置计费的云硬盘且 &#x60;AutoDelete&#x60; 属性为 &#x60;true&#x60;，那么数据盘会随云主机一起删除。\n- 云主机中绑定的弹性公网IP可以选择是否随云主机一起删除。\n- 如出现不能删除的情况请 [提交工单](https://ticket.jdcloud.com/applyorder/submit) 或联系京东云客服。\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {boolean} [opts.deletePrimaryNetworkInterfaceAllElasticIp] - 是否删除主机的主网卡绑定的所有弹性公网IP，默认为否。可选值：&#x60;true&#x60;，&#x60;false&#x60;。\n当回收站功能关闭的时候，此参数生效。\n当回收站功能开启的时候，且参数 &#x60;destroy&#x60; 为 &#x60;true&#x60; 的时候，此参数生效。\n当回收站功能开启的时候，且参数 &#x60;destroy&#x60; 为 &#x60;false&#x60; 的时候，此参数不生效。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (\n      opts.deletePrimaryNetworkInterfaceAllElasticIp !== undefined &&\n      opts.deletePrimaryNetworkInterfaceAllElasticIp !== null\n    ) {\n      queryParams['deletePrimaryNetworkInterfaceAllElasticIp'] =\n        opts.deletePrimaryNetworkInterfaceAllElasticIp\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询一台或多台云主机实例的状态。\n\n云主机实例的状态说明请参考帮助文档：[云主机状态](https://docs.jdcloud.com/cn/virtual-machines/api/vm_status)\n\n## 接口说明\n- 使用 &#x60;filters&#x60; 过滤器进行条件筛选，每个 &#x60;filter&#x60; 之间的关系为逻辑与（AND）的关系。\n- 单次查询最大可查询100条云主机状态。\n- 尽量一次调用接口查询多条数据，不建议使用该批量查询接口一次查询一条数据，如果使用不当导致查询过于密集，可能导致网关触发限流。\n- 由于该接口为 &#x60;GET&#x60; 方式请求，最终参数会转换为 &#x60;URL&#x60; 上的参数，但是 &#x60;HTTP&#x60; 协议下的 &#x60;GET&#x60; 请求参数长度是有大小限制的，使用者需要注意参数超长的问题。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；&lt;br&gt;默认为20；取值范围[10, 100]。  optional\n      * @param {filter} [opts.filters] - &lt;b&gt;filters 中支持使用以下关键字进行过滤&lt;/b&gt;\n&#x60;instanceId&#x60;: 云主机ID，精确匹配，支持多个\n&#x60;privateIpAddress&#x60;: 主网卡内网主IP地址，模糊匹配，支持多个\n&#x60;vpcId&#x60;: 私有网络ID，精确匹配，支持多个\n&#x60;status&#x60;: 云主机状态，精确匹配，支持多个，参考 [云主机状态](https://docs.jdcloud.com/virtual-machines/api/vm_status)\n&#x60;name&#x60;: 云主机名称，模糊匹配，支持单个\n&#x60;imageId&#x60;: 镜像ID，精确匹配，支持多个\n&#x60;agId&#x60;: 使用可用组id，支持单个\n&#x60;faultDomain&#x60;: 错误域，支持多个\n&#x60;networkInterfaceId&#x60;: 弹性网卡ID，精确匹配，支持多个\n&#x60;subnetId&#x60;: 子网ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceStatus instanceStatuses\n      * @param number totalCount  本次查询可匹配到的总记录数，使用者需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      */\n\n  describeInstanceStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询一台或多台云主机实例的主网卡内网主IP地址。\n\n弹性网卡说明请参考帮助文档：[弹性网卡](https://docs.jdcloud.com/cn/virtual-machines/attach-eni)\n\n## 接口说明\n- 使用 &#x60;filters&#x60; 过滤器进行条件筛选，每个 &#x60;filter&#x60; 之间的关系为逻辑与（AND）的关系。\n- 单次查询最大可查询100条云主机实例数据。\n- 尽量一次调用接口查询多条数据，不建议使用该批量查询接口一次查询一条数据，如果使用不当导致查询过于密集，可能导致网关触发限流。\n- 由于该接口为 &#x60;GET&#x60; 方式请求，最终参数会转换为 &#x60;URL&#x60; 上的参数，但是 &#x60;HTTP&#x60; 协议下的 &#x60;GET&#x60; 请求参数长度是有大小限制的，使用者需要注意参数超长的问题。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；&lt;br&gt;默认为20；取值范围[10, 100]。  optional\n      * @param {filter} [opts.filters] - &lt;b&gt;filters 中支持使用以下关键字进行过滤&lt;/b&gt;\n&#x60;instanceId&#x60;: 云主机ID，精确匹配，支持多个\n&#x60;privateIpAddress&#x60;: 主网卡内网主IP地址，模糊匹配，支持多个\n&#x60;vpcId&#x60;: 私有网络ID，精确匹配，支持多个\n&#x60;status&#x60;: 云主机状态，精确匹配，支持多个，参考 [云主机状态](https://docs.jdcloud.com/virtual-machines/api/vm_status)\n&#x60;name&#x60;: 云主机名称，模糊匹配，支持单个\n&#x60;imageId&#x60;: 镜像ID，精确匹配，支持多个\n&#x60;agId&#x60;: 使用可用组id，支持单个\n&#x60;faultDomain&#x60;: 错误域，支持多个\n&#x60;networkInterfaceId&#x60;: 弹性网卡ID，精确匹配，支持多个\n&#x60;subnetId&#x60;: 子网ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instancePrivateIpAddress instancePrivateIpAddress\n      * @param number totalCount  本次查询可匹配到的总记录数，用户需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      */\n\n  describeInstancePrivateIpAddress (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstancePrivateIpAddress\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstancePrivateIpAddress with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instancePrivateIpAddress',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n停止云主机实例。\n\n详细操作说明请参考帮助文档：[停止实例](https://docs.jdcloud.com/cn/virtual-machines/stop-instance)\n\n## 接口说明\n- 实例状态必须为运行 &#x60;running&#x60; 状态，同时实例没有正在进行中的任务时才可停止。\n- 如果云主机实例属性 &#x60;chargeOnStopped&#x60; 的值为 &#x60;stopCharging&#x60;，实例关机之后，实例部分将停止计费，且释放实例自身包含的资源（CPU/内存/GPU/本地数据盘）。需要使用者注意的是，实例一旦释放自身资源，再次启动时有可能因为库存资源不足而导致无法启动。\n- &#x60;chargeOnStopped&#x60; 该参数仅对按配置计费且系统盘为云硬盘的实例生效，并且不是专有宿主机中的实例。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} [opts.chargeOnStopped] - 停机不计费模式。\n该参数仅对按配置计费且系统盘为云硬盘的实例生效，并且不是专有宿主机中的实例。\n配置停机不计费且停机后，实例部分将停止计费，且释放实例自身包含的资源（CPU/内存/GPU/本地数据盘）。\n可选值：\n&#x60;keepCharging&#x60;：停机后保持计费，不释放资源。\n&#x60;stopCharging&#x60;：停机后停止计费，释放实例资源。默认值为空。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling stopInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.chargeOnStopped !== undefined && opts.chargeOnStopped !== null) {\n      postBody['chargeOnStopped'] = opts.chargeOnStopped\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:stopInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n启动云主机实例。\n\n详细操作说明请参考帮助文档：[启动实例](https://docs.jdcloud.com/cn/virtual-machines/start-instance)\n\n## 接口说明\n- 实例状态必须为停止 &#x60;stopped&#x60; 状态，同时实例没有正在进行中的任务时才可以启动。\n- 如果实例为停机不计费模式，启动时有可能因为库存资源不足而导致无法启动。\n- 如果云主机实例已欠费或已到期，则无法启动。\n- 如果实例系统盘是云硬盘，启动之前请确保系统盘处于正常挂载状态。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling startInstance\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:startInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n重启云主机实例。\n\n详细操作说明请参考帮助文档：[重启实例](https://docs.jdcloud.com/cn/virtual-machines/reboot-instance)\n\n## 接口说明\n- 实例状态必须为运行 &#x60;running&#x60; 状态，同时实例没有正在进行中的任务时才可以重启。\n- 如果云主机实例已欠费或已到期，则无法重启。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  rebootInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  rebootInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling rebootInstance\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call rebootInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:rebootInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n重新部署主机实例。\n\n详细操作说明请参考帮助文档：[重新部署实例](https://docs.jdcloud.com/cn/virtual-machines/redeploy-instance)\n\n## 接口说明\n- 必须是已隔离的实例，推荐关机状态。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  redeployInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  redeployInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling redeployInstance\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call redeployInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:redeployInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n为云主机绑定弹性网卡。\n\n详细操作说明请参考帮助文档：[绑定弹性网卡](https://docs.jdcloud.com/cn/virtual-machines/attach-eni)\n\n## 接口说明\n- 实例状态必须为 &#x60;running&#x60; 或 &#x60;stopped&#x60; 状态，同时实例没有正在进行中的任务时才可以操作。\n- 实例中的主网卡是不可以解绑和绑定的，绑定弹性网卡只支持绑定辅助网卡。\n- 目标弹性网卡上如果绑定了弹性公网IP，那么其所在的可用区需要与云主机的可用区保持一致，或者弹性公网IP是全可用区类型的，才允许绑定该弹性网卡。\n- 弹性网卡与云主机必须在相同vpc下。\n- 对于受管网卡，授权中不能含有 &#x60;instance-attach&#x60; 用户才可以挂载。\n- 对于授信网卡，授权中必须含有 &#x60;instance-attach&#x60; 用户才可以挂载。\n- 实例挂载弹性网卡的数量，不能超过实例规格的限制。可查询 [DescribeInstanceTypes](https://docs.jdcloud.com/virtual-machines/api/describeinstancetypes) 接口获得指定规格可挂载弹性网卡的数量上限。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} opts.networkInterfaceId - 弹性网卡ID。\n      * @param {boolean} [opts.autoDelete] - 随云主机实例自动删除，默认为False。\n受管网卡或授信网卡默认为False并且不支持修改。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  attachNetworkInterface (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  attachNetworkInterface\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling attachNetworkInterface\"\n      )\n    }\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling attachNetworkInterface\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.networkInterfaceId !== undefined &&\n      opts.networkInterfaceId !== null\n    ) {\n      postBody['networkInterfaceId'] = opts.networkInterfaceId\n    }\n    if (opts.autoDelete !== undefined && opts.autoDelete !== null) {\n      postBody['autoDelete'] = opts.autoDelete\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call attachNetworkInterface with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:attachNetworkInterface',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n为云主机解绑弹性网卡。\n\n详细操作说明请参考帮助文档：[解绑弹性网卡](https://docs.jdcloud.com/cn/virtual-machines/detach-eni)\n\n## 接口说明\n- 实例状态必须为 &#x60;running&#x60; 或 &#x60;stopped&#x60; 状态，同时实例没有正在进行中的任务时才可以操作。\n- 实例中的主网卡是不可以解绑和绑定的，解绑弹性网卡只支持解绑辅助网卡。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} opts.networkInterfaceId - 弹性网卡ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  detachNetworkInterface (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  detachNetworkInterface\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling detachNetworkInterface\"\n      )\n    }\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling detachNetworkInterface\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.networkInterfaceId !== undefined &&\n      opts.networkInterfaceId !== null\n    ) {\n      postBody['networkInterfaceId'] = opts.networkInterfaceId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call detachNetworkInterface with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:detachNetworkInterface',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n修改云主机弹性网卡属性。\n\n详细操作说明请参考帮助文档：[配置弹性网卡删除属性](https://docs.jdcloud.com/cn/virtual-machines/configurate-eni-delete-attributes)\n\n## 接口说明\n- 当前只支持修改随云主机实例删除的属性。\n- 不支持修改主网卡。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {array} [opts.networks] - 弹性网卡列表。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceNetworkAttribute (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceNetworkAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceNetworkAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.networks !== undefined && opts.networks !== null) {\n      postBody['networks'] = opts.networks\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceNetworkAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceNetworkAttribute',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n为云主机绑定弹性公网IP。\n\n详细操作说明请参考帮助文档：[绑定弹性公网IP](https://docs.jdcloud.com/cn/virtual-machines/associate-elastic-ip)\n\n## 接口说明\n- 该接口只支持在实例的主网卡的主内网IP上绑定弹性公网IP。\n- 一台云主机的主网卡的主内网IP只能绑定一个弹性公网IP，若已绑定弹性公网IP，操作绑定会返回错误。\n- 弹性公网IP所在的可用区需要与云主机的可用区保持一致，或者弹性公网IP是全可用区类型的，才允许绑定操作。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} opts.elasticIpId - 弹性公网IP的ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  associateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling associateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling associateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:associateElasticIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n为云主机解绑弹性公网IP。\n\n详细操作说明请参考帮助文档：[解绑弹性公网IP](https://docs.jdcloud.com/cn/virtual-machines/disassociate-elastic-ip)\n\n## 接口说明\n- 该接口只支持解绑实例的主网卡的主内网IP上的弹性公网IP。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} opts.elasticIpId - 弹性公网IP的ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disassociateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling disassociateElasticIp\"\n      )\n    }\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling disassociateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:disassociateElasticIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n为云主机制作私有镜像。\n\n详细操作说明请参考帮助文档：[基于实例创建私有镜像](https://docs.jdcloud.com/cn/virtual-machines/create-private-image)\n\n## 接口说明\n- 云主机实例没有正在进行中的任务时才可制作镜像。\n- 本地系统盘的实例，仅支持关机（已停止）状态下制作私有镜像。\n- 云盘系统盘的实例，支持开机(运行中)/关机（已停止）状态下制作私有镜像。\n- 调用接口后，需要等待镜像状态变为 &#x60;ready&#x60; 后，才能正常使用镜像。\n- 若当前实例系统盘为本地盘，则创建完成后的私有镜像为本地盘系统盘镜像；若当前实例系统盘为云硬盘，则创建完成后的私有镜像为云硬盘系统盘镜像。您可通过镜像类型转换 [convertImage](https://docs.jdcloud.com/Image/api/convertimage) 将本地盘系统盘镜像转换为云硬盘系统盘镜像后使用。\n- 默认情况下，制作的镜像中包括数据盘中的云硬盘（制作快照），但是不包含本地数据盘。\n- 如果需要变更打包镜像中的一些数据盘、或排除一些数据盘不需要制作快照，可通过 &#x60;dataDisks&#x60; 中的参数进行控制。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} opts.name - 镜像名称，长度为2\\~32个字符，只允许中文、数字、大小写字母、英文下划线（\\_）、连字符（-）及点（.）。\n\n      * @param {string} [opts.description] - 镜像描述。256字符以内。\n  optional\n      * @param {array} [opts.dataDisks] - 数据盘列表。\n在不指定该参数的情况下，制作镜像的过程中会将该实例中的所有云盘数据盘制作快照，并与系统盘一起，制作成打包镜像。\n如果不希望将实例中的某个云盘数据盘制作快照，可使用 &#x60;noDevice&#x60; 的方式排除，例如：&#x60;deviceName&#x3D;vdb&#x60;、&#x60;noDevice&#x3D;true&#x60; 就不会将 &#x60;vdb&#x60; 制作快照。\n如果希望在打包镜像中插入一块新盘，该盘不在实例中，可通过指定新的 &#x60;deviceName&#x60; 的方式实现，例如：&#x60;deviceName&#x3D;vdx&#x60; 将会在打包镜像中插入一块盘符为 &#x60;vdx&#x60; 的新盘，支持新盘使用或不使用快照都可以。\n如果使用 &#x60;deviceName&#x60; 指定了与实例中相同的盘符，那么实例中对应的云盘数据盘也不会制作快照，并使用新指定的参数进行替换。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string imageId  镜像ID。\n      */\n\n  createImage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createImage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createImage\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createImage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.dataDisks !== undefined && opts.dataDisks !== null) {\n      postBody['dataDisks'] = opts.dataDisks\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createImage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:createImage',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n为一台云主机挂载云硬盘。\n\n详细操作说明请参考帮助文档：[挂载云硬盘](https://docs.jdcloud.com/cn/virtual-machines/attach-cloud-disk)\n\n## 接口说明\n- 云主机和云硬盘都没有正在进行中的的任务时才可以操作。\n- 云主机状态必须是 &#x60;running&#x60; 或 &#x60;stopped&#x60; 状态。操作系统盘时必须先停止实例。\n- 实例挂载云硬盘的数量，不能超过实例规格的限制。可查询  [DescribeInstanceTypes](https://docs.jdcloud.com/virtual-machines/api/describeinstancetypes)  接口获得指定规格可挂载云硬盘的数量上限。\n- 实例可挂载的云硬盘类型，受实例规格限制。可查询  [DescribeInstanceTypes](https://docs.jdcloud.com/virtual-machines/api/describeinstancetypes)  接口获得指定规格支持挂载的云硬盘类型。\n- 云硬盘作为系统盘时，容量不能小于40GB，并且不能超过500GB。\n- 待挂载的云硬盘与云主机实例必须在同一个可用区下。\n- 共享型云硬盘最多可挂载16个云主机实例，并且只能用作数据盘，不能用于系统盘。非共享型云盘最多只能挂载一个云主机实例。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} opts.diskId - 云硬盘ID。\n      * @param {string} [opts.deviceName] - 磁盘逻辑挂载点。\n**系统盘**：必须指定并且只能是vda。\n**数据盘**：取值范围：&#x60;[vdb~vdbm]&#x60;。\n  optional\n      * @param {boolean} [opts.autoDelete] - 是否随实例一起删除，即删除实例时是否自动删除此磁盘。此参数仅对按配置计费的非多点挂载云硬盘生效。\n可选值：\n&#x60;true&#x60;：随实例删除。\n&#x60;false&#x60;（默认值）：不随实例删除。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  attachDisk (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  attachDisk\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling attachDisk\"\n      )\n    }\n    if (opts.diskId === undefined || opts.diskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.diskId' when calling attachDisk\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.diskId !== undefined && opts.diskId !== null) {\n      postBody['diskId'] = opts.diskId\n    }\n    if (opts.deviceName !== undefined && opts.deviceName !== null) {\n      postBody['deviceName'] = opts.deviceName\n    }\n    if (opts.autoDelete !== undefined && opts.autoDelete !== null) {\n      postBody['autoDelete'] = opts.autoDelete\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call attachDisk with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:attachDisk',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n为一台云主机缷载云硬盘\n\n详细操作说明请参考帮助文档：[缷载云硬盘](https://docs.jdcloud.com/cn/virtual-machines/detach-cloud-disk)\n\n## 接口说明\n- 云主机和云硬盘都没有正在进行中的的任务时才可以操作。\n- 云主机状态必须是 &#x60;running&#x60; 或 &#x60;stopped&#x60; 状态。操作系统盘时必须先停止实例。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} opts.diskId - 云硬盘ID。\n      * @param {boolean} [opts.force] - 是否强制缷载，默认False。\n如果此参数传值为True，数据盘的IO会被强制断掉。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  detachDisk (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  detachDisk\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling detachDisk\"\n      )\n    }\n    if (opts.diskId === undefined || opts.diskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.diskId' when calling detachDisk\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.diskId !== undefined && opts.diskId !== null) {\n      postBody['diskId'] = opts.diskId\n    }\n    if (opts.force !== undefined && opts.force !== null) {\n      postBody['force'] = opts.force\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call detachDisk with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:detachDisk',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n修改一台云主机中的云硬盘属性。\n\n详细操作说明请参考帮助文档：[配置云硬盘删除属性](https://docs.jdcloud.com/cn/virtual-machines/configurate-delete-attributes)\n\n## 接口说明\n- 该接口当前只能修改实例中的云硬盘随实例删除属性。\n- 仅按配置计费、并且非共享型的云硬盘支持修改。\n- 包年包月计费的云硬盘该属性不生效，实例删除时云硬盘将保留。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {array} [opts.dataDisks] - 云硬盘列表。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceDiskAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceDiskAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceDiskAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dataDisks !== undefined && opts.dataDisks !== null) {\n      postBody['dataDisks'] = opts.dataDisks\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceDiskAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceDiskAttribute',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n修改一台云主机的属性。\n\n详细操作说明请参考帮助文档：\n[修改实例名称](https://docs.jdcloud.com/cn/virtual-machines/modify-instance-name)\n[自定义数据](https://docs.jdcloud.com/cn/virtual-machines/userdata)\n[实例元数据](https://docs.jdcloud.com/cn/virtual-machines/instance-metadata)\n\n## 接口说明\n- 支持修改实例的名称、描述、hostname、自定义数据、实例元数据。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} [opts.name] - 实例名称。长度为2\\~128个字符，只允许中文、数字、大小写字母、英文下划线（\\_）、连字符（-）及点（.），不能以（.）作为首尾。\n  optional\n      * @param {string} [opts.description] - 实例描述。256字符以内。\n  optional\n      * @param {string} [opts.hostname] - 实例hostname。\n**Windows系统**：长度为2\\~15个字符，允许大小写字母、数字或连字符（-），不能以连字符（-）开头或结尾，不能连续使用连字符（-），也不能全部使用数字。不支持点号（.）。\n**Linux系统**：长度为2-64个字符，允许支持多个点号，点之间为一段，每段允许使用大小写字母、数字或连字符（-），但不能连续使用点号（.）或连字符（-），不能以点号（.）或连字符（-）开头或结尾。\n  optional\n      * @param {array} [opts.metadata] - 用户自定义元数据。\n以 &#x60;key-value&#x60; 键值对形式指定，可在实例系统内通过元数据服务查询获取。最多支持40对键值对，且 &#x60;key&#x60; 不超过256字符，&#x60;value&#x60; 不超过16KB，不区分大小写。\n注意：&#x60;key&#x60; 不要以连字符(-)结尾，否则此 &#x60;key&#x60; 不生效。\n  optional\n      * @param {array} [opts.userdata] - 自定义脚本。\n目前仅支持启动脚本，即 &#x60;launch-script&#x60;，须Base64编码且编码前数据长度不能超过16KB。\n**linux系统**：支持bash和python，编码前须分别以 &#x60;#!/bin/bash&#x60; 和 &#x60;#!/usr/bin/env python&#x60; 作为内容首行。\n**Windows系统**：支持 &#x60;bat&#x60; 和 &#x60;powershell&#x60; ，编码前须分别以 &#x60;&lt;cmd&gt;&lt;/cmd&gt;和&lt;powershell&gt;&lt;/powershell&gt;&#x60; 作为内容首、尾行。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.hostname !== undefined && opts.hostname !== null) {\n      postBody['hostname'] = opts.hostname\n    }\n    if (opts.metadata !== undefined && opts.metadata !== null) {\n      postBody['metadata'] = opts.metadata\n    }\n    if (opts.userdata !== undefined && opts.userdata !== null) {\n      postBody['userdata'] = opts.userdata\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceAttribute',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n修改一台云主机的子网或内网IP地址。\n\n详细操作说明请参考帮助文档：[修改网络配置](https://docs.jdcloud.com/cn/virtual-machines/modify-vpc-attribute)\n\n## 接口说明\n- 调该接口之前实例必须处于停止 &#x60;stopped&#x60; 状态。\n- 修改VPC及子网\n  - 内网IPv4：可指定或由系统分配。\n  - IPv6：如新子网支持IPv6，可选是否分配，如果选择分配但不指定Ipv6地址，系统会自动分配。\n  - 安全组：须指定新VPC下的安全组。\n- 不修改VPC，仅修改子网\n  - 内网IPv4：可指定或由系统分配。\n  - IPv6：如新子网支持IPv6，可选是否分配，如分配仅支持系统分配。\n  - 安全组：不支持绑定新安全组。\n- 不修改VPC及子网，仅更换内网IP\n  - 内网IPv4：须指定IP地址。\n  - IPv6：不支持修改。\n  - 安全组：不支持绑定新安全组。\n- 一些限制及注意事项：\n  - 已加入负载均衡-后端服务器组中的实例不允许修改。\n  - 绑定弹性网卡的实例不支持修改VPC，仅支持在同VPC下修改子网和内网IP。\n  - 主网卡分配了辅助内网IP的实例不支持修改VPC和子网，仅支持在同子网下修改内网IP。\n  - 如实例在高可用组内，则不允许修改VPC，仅可在同VPC内修改子网或内网IPv4地址。\n  - 仅在更换VPC时传入安全组ID才有效，且安全组须隶属于目标VPC。\n  - 如指定内网IPv4，须确保IP地址在子网网段内且未被占用；如不指定则随机分配，须确保子网可用IP充足。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} opts.subnetId - 子网Id。\n      * @param {boolean} [opts.assignIpv6] - &#x60;true&#x60;: 分配IPV6地址。\n&#x60;false&#x60;: 不分配IPV6地址。\n  optional\n      * @param {string} [opts.ipv6Address] - 切换子网后的IPV6地址，不可与assignIpv6同时指定。\n  optional\n      * @param {string} [opts.privateIpAddress] - Ipv4地址。\n不变更 &#x60;vpc&#x60; 及子网时必须指定Ipv4地址\n  optional\n      * @param {array} [opts.securityGroups] - 安全组列表。\n更换 &#x60;vpc&#x60; 时必须指定新的安全组。\n不更换 &#x60;vpc&#x60; 时不可以指定安全组。\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceVpcAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceVpcAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstanceVpcAttribute\"\n      )\n    }\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling modifyInstanceVpcAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n    if (opts.assignIpv6 !== undefined && opts.assignIpv6 !== null) {\n      postBody['assignIpv6'] = opts.assignIpv6\n    }\n    if (opts.ipv6Address !== undefined && opts.ipv6Address !== null) {\n      postBody['ipv6Address'] = opts.ipv6Address\n    }\n    if (opts.privateIpAddress !== undefined && opts.privateIpAddress !== null) {\n      postBody['privateIpAddress'] = opts.privateIpAddress\n    }\n    if (opts.securityGroups !== undefined && opts.securityGroups !== null) {\n      postBody['securityGroups'] = opts.securityGroups\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceVpcAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstanceVpcAttribute',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n修改云主机密码。\n\n详细操作说明请参考帮助文档：[重置密码](https://docs.jdcloud.com/cn/virtual-machines/reset-password)\n\n## 接口说明\n- 实例没有正在进行中的任务时才可操作。\n- 重置密码后，需要重启云主机后生效。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} opts.password - 实例密码。\n可用于SSH登录和VNC登录。\n长度为8\\~30个字符，必须同时包含大、小写英文字母、数字和特殊符号中的三类字符。特殊符号包括：&#x60;\\(\\)\\&#x60;~!@#$%^&amp;\\*\\_-+&#x3D;\\|{}\\[ ]:&quot;;&#39;&lt;&gt;,.?/，&#x60;。\n更多密码输入要求请参见 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstancePassword (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstancePassword\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstancePassword\"\n      )\n    }\n    if (opts.password === undefined || opts.password === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.password' when calling modifyInstancePassword\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.password !== undefined && opts.password !== null) {\n      postBody['password'] = opts.password\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstancePassword with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstancePassword',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n获取云主机vnc地址。\n\n详细操作说明请参考帮助文档：[连接实例](https://docs.jdcloud.com/cn/virtual-machines/connect-to-instance)\n\n## 接口说明\n- 实例仅 &#x60;running&#x60; 状态时才可获取到 &#x60;vnc&#x60; 地址。\n- 调用该接口可获取云主机 &#x60;vnc&#x60; 地址，用于远程连接管理云主机。\n- &#x60;vnc&#x60; 地址的有效期为1个小时，调用接口获取vnc地址后如果1个小时内没有使用，&#x60;vnc&#x60; 地址将自动失效，再次使用需要重新获取。\n- 裸金属实例目前不支持通过 &#x60;vnc&#x60; 登录。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string vncUrl  远程vnc地址。\n      */\n\n  describeInstanceVncUrl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceVncUrl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceVncUrl\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceVncUrl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}/vnc',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n变更云主机实例配置。\n\n详细操作说明请参考帮助文档：[调整配置](https://docs.jdcloud.com/cn/virtual-machines/resize-instance)\n\n## 接口说明\n  - 云主机的状态必须为 &#x60;stopped&#x60; 状态。\n  - 16年创建的云硬盘做系统盘的云主机，实例规格不允许跨代调配。\n  - 若当前实例系统盘为本地盘，则不允许跨代调配，例如第一代云主机不允许与第二代云主机互相调配，且不允许调整至第一代存储优化大数据型 &#x60;s.d1&#x60; 及第二代存储优化大数据型 &#x60;s.d2&#x60;。\n  - 若当前实例在高可用组内，则不允许调配至除GPU类型外的第一代云主机，受限于高可用组支持的规格情况。\n  - 若当前实例已挂载加密云盘，则不允许调配至第一代云主机，受限于支持加密盘的规格情况。\n  - 裸金属实例规格主机暂不支持调配，即不支持从其他规格调整为裸金属规格或从裸金属规格调整为其他规格。\n  - 对于按配置计费实例，调整配置后将按照新规格计费，调整前规格会立即出账结算（即对上次整点结算时间至当前时间产生的费用进行结算）。\n  - 若当前实例带有本地数据盘，需清除本地盘内数据才可调整配置，还请谨慎操作。\n  - 对于包年包月计费云主机：\n\t- 若调配后规格价格低于调配前规格价格，则将延长云主机到期时间；\n\t- 若调配后规格价格高于调配前规格价格，需要支付到期前的差价。\n  - 如果当前主机中的弹性网卡数量，超过了目标实例规格允许的弹性网卡数量，会返回错误。可查询 [DescribeInstanceTypes](https://docs.jdcloud.com/virtual-machines/api/describeinstancetypes) 接口获得实例规格允许的弹性网卡数量。\n  - 如果当前主机中的云硬盘数据，超过了目标实例规格允许的云硬盘数量，会返回错误。可查询 [DescribeInstanceTypes](https://docs.jdcloud.com/virtual-machines/api/describeinstancetypes) 接口获得实例规格允许的云硬盘数量。\n  - 当前主机所使用的镜像，需要支持目标实例规格，否则返回错误。可查询 [DescribeImageConstraints](docs.jdcloud.com/virtual-machines/api/describeimageconstraints) 接口获得指定镜像的实例规格限制信息。\n  - 云主机欠费或到期时，无法更改实例规格。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} opts.instanceType - 实例规格，可查询 [DescribeInstanceTypes](https://docs.jdcloud.com/virtual-machines/api/describeinstancetypes) 接口获得指定地域或可用区的规格信息。\n      * @param {boolean} [opts.force] - 是否强制调配，默认为 &#x60;false&#x60;。如果指定为 &#x60;true&#x60;, 将会清除本地数据盘。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resizeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resizeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling resizeInstance\"\n      )\n    }\n    if (opts.instanceType === undefined || opts.instanceType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceType' when calling resizeInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceType !== undefined && opts.instanceType !== null) {\n      postBody['instanceType'] = opts.instanceType\n    }\n    if (opts.force !== undefined && opts.force !== null) {\n      postBody['force'] = opts.force\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resizeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:resizeInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n重置云主机系统。\n\n需要注意的是，重装系统会导致系统盘的内容全部丢失，数据盘的数据不受影响（但需要重新识别）。因此，在需要保留系统运行数据的情况下，强烈建议您在重置系统前制作私有镜像，之后重置时选择该私有镜像即可实现保留系统运行数据。\n\n详细操作说明请参考帮助文档：[重置系统](https://docs.jdcloud.com/cn/virtual-machines/rebuild-instance)\n\n## 接口说明\n- 云主机的状态必须为 &#x60;stopped&#x60; 状态。\n- 若实例基于私有镜像创建，而私有镜像已被删除，则无法使用原镜像重置系统，即无法恢复至刚创建时的系统状态，建议保留被实例引用的私有镜像。\n- 重置系统需要重新指定密码，对于 &#x60;Linux&#x60; 系统您还可以重新指定 &#x60;SSH密钥&#x60;。\n- 对于云盘作系统盘的实例，当前系统盘大小不能超过目标镜像对应系统盘快照的容量。\n- 云主机系统盘类型必须与待更换镜像支持的系统盘类型保持一致，若当前云主机系统盘为 &#x60;local&#x60; 类型，则更换镜像的系统盘类型必须为 &#x60;loaclDisk&#x60; 类型；同理，若当前云主机系统盘为 &#x60;cloud&#x60; 类型，则更换镜像的系统盘类型必须为 &#x60;cloudDisk&#x60; 类型。可查询 [DescribeImages](https://docs.jdcloud.com/virtual-machines/api/describeimages) 接口获得指定地域的镜像信息。\n- 指定的镜像必须能够支持当前主机的实例规格 &#x60;instanceType&#x60;，否则会返回错误。可查询 [DescribeImageConstraints](docs.jdcloud.com/virtual-machines/api/describeimageconstraints) 接口获得指定镜像支持的系统盘类型信息。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} [opts.password] - 实例密码。\n可用于SSH登录和VNC登录。\n长度为8\\~30个字符，必须同时包含大、小写英文字母、数字和特殊符号中的三类字符。特殊符号包括：&#x60;\\(\\)\\&#x60;~!@#$%^&amp;\\*\\_-+&#x3D;\\|{}\\[ ]:&quot;;&#39;&lt;&gt;,.?/，&#x60;。\n更多密码输入要求请参见 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。\n  optional\n      * @param {string} [opts.imageId] - 镜像ID。\n若不指定镜像ID，默认使用当前主机的原镜像重置系统。\n可查询 [DescribeImages](https://docs.jdcloud.com/virtual-machines/api/describeimages) 接口获得指定地域的镜像信息。\n  optional\n      * @param {array} [opts.keyNames] - 密钥对名称。仅Linux系统下该参数生效，当前仅支持输入单个密钥。\n  optional\n      * @param {string} [opts.hostname] - 实例hostname。\n若不指定hostname，则默认以实例名称&#x60;name&#x60;作为hostname，但是会以RFC 952和RFC 1123命名规范做一定转义。\n**Windows系统**：长度为2\\~15个字符，允许大小写字母、数字或连字符（-），不能以连字符（-）开头或结尾，不能连续使用连字符（-），也不能全部使用数字。不支持点号（.）。\n**Linux系统**：长度为2-64个字符，允许支持多个点号，点之间为一段，每段允许使用大小写字母、数字或连字符（-），但不能连续使用点号（.）或连字符（-），不能以点号（.）或连字符（-）开头或结尾。\n  optional\n      * @param {array} [opts.metadata] - 用户自定义元数据。\n以 &#x60;key-value&#x60; 键值对形式指定，可在实例系统内通过元数据服务查询获取。最多支持40对键值对，且 &#x60;key&#x60; 不超过256字符，&#x60;value&#x60; 不超过16KB，不区分大小写。\n注意：&#x60;key&#x60; 不要以连字符(-)结尾，否则此 &#x60;key&#x60; 不生效。\n  optional\n      * @param {array} [opts.userdata] - 自定义脚本。\n目前仅支持启动脚本，即 &#x60;launch-script&#x60;，须Base64编码且编码前数据长度不能超过16KB。\n**linux系统**：支持bash和python，编码前须分别以 &#x60;#!/bin/bash&#x60; 和 &#x60;#!/usr/bin/env python&#x60; 作为内容首行。\n**Windows系统**：支持 &#x60;bat&#x60; 和 &#x60;powershell&#x60;，编码前须分别以 &#x60;&lt;cmd&gt;&lt;/cmd&gt;和&lt;powershell&gt;&lt;/powershell&gt;&#x60; 作为内容首、尾行。\n  optional\n      * @param {string} [opts.passWordAuth] - 密码授权，若存在密匙，则根据此参数决定是否使用密码，若没有密匙，此参数无效，会强制使用密码。\n若不使用密码，且密匙对解绑后，用户需重置密码，方可使用密码登录。\n此参数在windows系统中必须为yes。\n  optional\n      * @param {string} [opts.imageInherit] - 继承镜像中的登录验证方式，&quot;yes&quot;为使用，&quot;no&quot;为不使用，&quot;&quot;默认为&quot;no&quot;  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  rebuildInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  rebuildInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling rebuildInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.password !== undefined && opts.password !== null) {\n      postBody['password'] = opts.password\n    }\n    if (opts.imageId !== undefined && opts.imageId !== null) {\n      postBody['imageId'] = opts.imageId\n    }\n    if (opts.keyNames !== undefined && opts.keyNames !== null) {\n      postBody['keyNames'] = opts.keyNames\n    }\n    if (opts.hostname !== undefined && opts.hostname !== null) {\n      postBody['hostname'] = opts.hostname\n    }\n    if (opts.metadata !== undefined && opts.metadata !== null) {\n      postBody['metadata'] = opts.metadata\n    }\n    if (opts.userdata !== undefined && opts.userdata !== null) {\n      postBody['userdata'] = opts.userdata\n    }\n    if (opts.passWordAuth !== undefined && opts.passWordAuth !== null) {\n      postBody['passWordAuth'] = opts.passWordAuth\n    }\n    if (opts.imageInherit !== undefined && opts.imageInherit !== null) {\n      postBody['imageInherit'] = opts.imageInherit\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call rebuildInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:rebuildInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n批量查询云主机用户自定义元数据。\n\n详细操作说明请参考帮助文档：[自定义元数据](https://docs.jdcloud.com/cn/virtual-machines/userdata)\n\n## 接口说明\n- 使用 &#x60;filters&#x60; 过滤器进行条件筛选，每个 &#x60;filter&#x60; 之间的关系为逻辑与（AND）的关系。\n- 单次查询最大可查询10台云主机实例自定义元数据。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为10；取值范围[1, 10]。  optional\n      * @param {filter} [opts.filters] - &lt;b&gt;filters 中支持使用以下关键字进行过滤&lt;/b&gt;\n&#x60;instanceId&#x60;: 云主机ID，精确匹配，支持多个\n&#x60;privateIpAddress&#x60;: 主网卡内网主IP地址，模糊匹配，支持多个\n&#x60;vpcId&#x60;: 私有网络ID，精确匹配，支持多个\n&#x60;status&#x60;: 云主机状态，精确匹配，支持多个，参考 [云主机状态](https://docs.jdcloud.com/virtual-machines/api/vm_status)\n&#x60;name&#x60;: 云主机名称，模糊匹配，支持单个\n&#x60;imageId&#x60;: 镜像ID，精确匹配，支持多个\n&#x60;agId&#x60;: 使用可用组id，支持单个\n&#x60;faultDomain&#x60;: 错误域，支持多个\n&#x60;networkInterfaceId&#x60;: 弹性网卡ID，精确匹配，支持多个\n&#x60;subnetId&#x60;: 子网ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param customData customData\n      * @param number totalCount  本次查询可匹配到的总记录数，使用者需要结合&#x60;pageNumber&#x60;和&#x60;pageSize&#x60;计算是否可以继续分页。\n      */\n\n  describeInstancesCustomData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstancesCustomData\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstancesCustomData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instancesCustomData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n存量主机加入高可用组。\n\n存量主机加入高可用组，或者主机从一个高可用组移动到另一个高可用组\n\n## 接口说明\n- 不支持专属宿主机上的实例调整高可用组。\n- 除GPU、vGPU（以P开头）外的一代机暂不支持调整高可用组。\n- 与该高可用组关联实例模板的VPC不同的不支持调整高可用组。\n- 与该高可用组可用区不匹配的实例不支持调整高可用组。\n- 本地系统盘机型不支持强制均衡。\n- 仅支持实例状态为已停止的实例强制均衡调整高可用组。\n- 若不强制均衡，仅支持实例状态为运行中或已停止的实例调整高可用组。\n- 若强制均衡，带本地数据盘的实例需确认清除本地盘数据。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} [opts.agId] - 高可用组Id，必填项。\n可查询 [DescribeAgs](https://docs.jdcloud.com/cn/availability-group/api/describeags) 接口获得高可用组信息。\n  optional\n      * @param {boolean} [opts.balance] - 是否强制均衡，默认 false\n  optional\n      * @param {boolean} [opts.clearLocalDisk] - 是否确认清除本地盘数据，默认 false\n  optional\n      * @param {boolean} [opts.isManaged] - 是否托管实例的生命周期，默认为false；若为包年包月实例，可加入但不支持托管；该字段仅AG开启AS时生效。托管实例将在缩容或健康检查失败时被删除，非托管实例仅移出伸缩组\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstancePlacement (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstancePlacement\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyInstancePlacement\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.agId !== undefined && opts.agId !== null) {\n      postBody['agId'] = opts.agId\n    }\n    if (opts.balance !== undefined && opts.balance !== null) {\n      postBody['balance'] = opts.balance\n    }\n    if (opts.clearLocalDisk !== undefined && opts.clearLocalDisk !== null) {\n      postBody['clearLocalDisk'] = opts.clearLocalDisk\n    }\n    if (opts.isManaged !== undefined && opts.isManaged !== null) {\n      postBody['isManaged'] = opts.isManaged\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstancePlacement with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:modifyInstancePlacement',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n暂停云主机实例。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  suspendInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  suspendInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling suspendInstance\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call suspendInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:suspendInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n恢复云主机实例。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  resumeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  resumeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling resumeInstance\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call resumeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances/{instanceId}:resumeInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更改云主机定时删除信息。\n\n      * @param {Object} opts - parameters\n      * @param {array} [opts.instanceIds] - 需要更改定时删除信息的云主机id列表。\n  optional\n      * @param {string} [opts.autoReleaseTime] - ｜ 为云主机设置或修改定时删除时间，如果为空，若云主机存在定时删除任务，则取消其定时删除任务。 支持的时间范围为当前时间+1小时至当前时间+10年。示例：&quot;2025-01-01 00:00:00&quot;  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyInstanceReleaseTime (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyInstanceReleaseTime\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.instanceIds !== undefined && opts.instanceIds !== null) {\n      postBody['instanceIds'] = opts.instanceIds\n    }\n    if (opts.autoReleaseTime !== undefined && opts.autoReleaseTime !== null) {\n      postBody['autoReleaseTime'] = opts.autoReleaseTime\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyInstanceReleaseTime with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instances:modifyInstanceReleaseTime',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询实例模板列表。\n\n详细操作说明请参考帮助文档：[实例模板](https://docs.jdcloud.com/cn/virtual-machines/instance-template-overview)\n\n## 接口说明\n- 使用 &#x60;filters&#x60; 过滤器进行条件筛选，每个 &#x60;filter&#x60; 之间的关系为逻辑与（AND）的关系。\n- 单次查询最大可查询100条实例模板数据。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；&lt;br&gt;默认为20；取值范围[10, 100]。  optional\n      * @param {filter} [opts.filters] - &lt;b&gt;filters 中支持使用以下关键字进行过滤&lt;/b&gt;\n&#x60;name&#x60;: 实例模板名称，模糊匹配，支持多个\n&#x60;instanceTemplateId&#x60;: 实例模板ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceTemplate instanceTemplates\n      * @param number totalCount  本次查询可匹配到的总记录数，使用者需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      */\n\n  describeInstanceTemplates (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceTemplates\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceTemplates',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n创建实例模板。\n\n实例模板是创建云主机实例的配置信息模板，包括镜像、实例规格、系统盘及数据盘类型和容量、私有网络及子网配置、安全组及登录信息等。实例模板可用于创建实例及用于配置高可用组（创建高可用组时必须指定实例模板）。使用实例模板创建实例时，无需重新指定实例模板已包括的参数，缩短您的部署时间。\n\n请注意：实例模板一经创建后其属性将不能编辑，如需调整参数请重新创建实例模板替换使用。\n\n详细操作说明请参考帮助文档：[创建实例模板](https://docs.jdcloud.com/cn/virtual-machines/create-instance-template)\n\n## 接口说明\n- 创建实例模板的限制基本与创建云主机一致，可参考 [创建云主机](https://docs.jdcloud.com/cn/virtual-machines/create-instance)。\n- 实例模板中包含创建云主机的大部分配置参数，可以避免每次创建云主机时的重复性配置参数的工作。\n- 使用实例模板创建云主机时，如果再次指定了某些参数，并且与实例模板中的参数相冲突，那么新指定的参数会替换模板中的参数，以新指定的参数为准。\n- 使用实例模板创建云主机时，如果再次指定了镜像ID，并且与模板中的镜像ID不一致，那么模板中的 &#x60;systemDisk&#x60; 和 &#x60;dataDisks&#x60; 配置会失效，以新指定的镜像为准。\n- 如果使用高可用组(Ag)创建云主机，那么Ag所关联的模板中的参数都不可以被调整，只能以模板为准。\n\n      * @param {Object} opts - parameters\n      * @param {instanceTemplateSpec} opts.instanceTemplateData - 实例模板配置信息。\n      * @param {string} opts.name - 实例模板的名称，参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。\n      * @param {string} [opts.description] - 实例模板的描述，参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceTemplateId  实例模板ID。\n      */\n\n  createInstanceTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstanceTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.instanceTemplateData === undefined ||\n      opts.instanceTemplateData === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceTemplateData' when calling createInstanceTemplate\"\n      )\n    }\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createInstanceTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.instanceTemplateData !== undefined &&\n      opts.instanceTemplateData !== null\n    ) {\n      postBody['instanceTemplateData'] = opts.instanceTemplateData\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstanceTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceTemplates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询实例模板详情。\n\n详细操作说明请参考帮助文档：[实例模板](https://docs.jdcloud.com/cn/virtual-machines/instance-template-overview)\n\n## 接口说明\n- 该接口与查询实例模板列表返回的信息一致。\n- 只需要查询单个实例模板详细信息的时候可以调用该接口。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceTemplateId - 实例模板ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceTemplate instanceTemplate  响应结果。\n      */\n\n  describeInstanceTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.instanceTemplateId === undefined ||\n      opts.instanceTemplateId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceTemplateId' when calling describeInstanceTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceTemplateId: opts.instanceTemplateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceTemplates/{instanceTemplateId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n修改实例模板属性。\n\n详细操作说明请参考帮助文档：[实例模板](https://docs.jdcloud.com/cn/virtual-machines/instance-template-overview)\n\n## 接口说明\n- 名称、描述、实例模板配置信息至少要传一项。\n- 参数为 null 时，对应的参数不做更改。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceTemplateId - 实例模板ID。\n      * @param {string} [opts.name] - 实例模板的名称，参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。  optional\n      * @param {string} [opts.description] - 实例模板的描述，参考 [公共参数规范](https://docs.jdcloud.com/virtual-machines/api/general_parameters)。  optional\n      * @param {updateInstanceTemplateSpec} [opts.instanceTemplateData] - 实例模板配置信息。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateInstanceTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateInstanceTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.instanceTemplateId === undefined ||\n      opts.instanceTemplateId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceTemplateId' when calling updateInstanceTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (\n      opts.instanceTemplateData !== undefined &&\n      opts.instanceTemplateData !== null\n    ) {\n      postBody['instanceTemplateData'] = opts.instanceTemplateData\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceTemplateId: opts.instanceTemplateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateInstanceTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceTemplates/{instanceTemplateId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n删除单个实例模板。\n\n详细操作说明请参考帮助文档：[删除实例模板](https://docs.jdcloud.com/cn/virtual-machines/delete-instance-template)\n\n## 接口说明\n- 关联了高可用组的实例模板不可以删除。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceTemplateId - 实例模板ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteInstanceTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteInstanceTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.instanceTemplateId === undefined ||\n      opts.instanceTemplateId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceTemplateId' when calling deleteInstanceTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceTemplateId: opts.instanceTemplateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteInstanceTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceTemplates/{instanceTemplateId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n校验实例模板的有效性。\n\n详细操作说明请参考帮助文档：[实例模板](https://docs.jdcloud.com/cn/virtual-machines/instance-template-overview)\n\n## 接口说明\n- 调用该接口可以校验实例模板是否有效，例如某些关联资源可能已经被删除了，此刻实例模板可能已经失效了。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceTemplateId - 实例模板ID。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  verifyInstanceTemplate (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  verifyInstanceTemplate\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.instanceTemplateId === undefined ||\n      opts.instanceTemplateId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceTemplateId' when calling verifyInstanceTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceTemplateId: opts.instanceTemplateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call verifyInstanceTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceTemplates/{instanceTemplateId}:verify',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询实例模板上的自定义元数据。\n\n详细操作说明请参考帮助文档：[实例模板](https://docs.jdcloud.com/cn/virtual-machines/instance-template-overview)\n\n## 接口说明\n- 一般情况下由于自定义元数据比较大，所以限制每次最多查询10个实例模板。\n\n      * @param {Object} opts - parameters\n      * @param {filter} [opts.filters] - &lt;b&gt;filters 中支持使用以下关键字进行过滤&lt;/b&gt;\n&#x60;instanceTemplateId&#x60;: 实例模板ID，精确匹配，最多支持10个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceTemplateCustomData instanceTemplatesCustomData\n      * @param number totalCount  本次查询的总记录数。\n      */\n\n  describeInstanceTemplatesCustomdata (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceTemplatesCustomdata\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceTemplatesCustomdata with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceTemplatesCustomData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询实例规格列表。\n\n详细操作说明请参考帮助文档：[实例规格类型](https://docs.jdcloud.com/cn/virtual-machines/instance-type-family)\n\n## 接口说明\n- 调用该接口可查询全量实例规格信息。\n- 可查询实例规格的CPU、内存大小、可绑定的弹性网卡数量、可挂载的云硬盘数量，是否售卖等信息。\n- GPU 或 本地存储型的规格可查询 GPU型号、GPU卡数量、本地盘数量。\n- 尽量使用过滤器查询关心的实例规格，并适当缓存这些信息。否则全量查询可能响应较慢。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.serviceName] - 产品线类型，默认为 &#x60;vm&#x60;。支持范围：&#x60;vm&#x60; 云主机，&#x60;nc&#x60; 原生容器。  optional\n      * @param {string} [opts.chargeMode] - 目前支持postpaid_by_spot：抢占式实例(后付费)。  optional\n      * @param {filter} [opts.filters] - &lt;b&gt;filters 中支持使用以下关键字进行过滤&lt;/b&gt;\n&#x60;instanceTypes&#x60;: 实例规格，精确匹配，支持多个\n&#x60;az&#x60;: 可用区，精确匹配，支持多个\n&#x60;architecture&#x60;: CPU架构，精确匹配，支持单个，可选范围:x86_64或arm64\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instanceType instanceTypes\n      * @param instanceType specificInstanceTypes\n      * @param integer totalCount  本次查询到的所有实例规格数量。\n      */\n\n  describeInstanceTypes (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceTypes\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.serviceName !== undefined && opts.serviceName !== null) {\n      queryParams['serviceName'] = opts.serviceName\n    }\n    if (opts.chargeMode !== undefined && opts.chargeMode !== null) {\n      queryParams['chargeMode'] = opts.chargeMode\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceTypes with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/instanceTypes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n批量查询密钥对。\n\n详细操作说明请参考帮助文档：[密钥概述](https://docs.jdcloud.com/cn/virtual-machines/keypair-overview)\n\n## 接口说明\n- 使用 &#x60;filters&#x60; 过滤器进行条件筛选，每个 &#x60;filter&#x60; 之间的关系为逻辑与（AND）的关系。\n- 单次查询最大可查询100条密钥数据。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1。  optional\n      * @param {integer} [opts.pageSize] - 分页大小；&lt;br&gt;默认为20；取值范围[10, 100]。  optional\n      * @param {filter} [opts.filters] - &lt;b&gt;filters 中支持使用以下关键字进行过滤&lt;/b&gt;\n&#x60;keyNames&#x60;: 密钥对名称，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param keypair keypairs\n      * @param number totalCount  本次查询可匹配到的总记录数，使用者需要结合 &#x60;pageNumber&#x60; 和 &#x60;pageSize&#x60; 计算是否可以继续分页。\n      */\n\n  describeKeypairs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeKeypairs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeKeypairs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n创建密钥。\n\n公钥和私钥都由京东云生成，公钥保存在京东云，私钥返回给用户，由用户保存。\n\n详细操作说明请参考帮助文档：[创建密钥](https://docs.jdcloud.com/cn/virtual-machines/create-keypair)\n\n## 接口说明\n- 调用该接口创建密钥后，公钥部分存储在京东云，并返回未加密的 &#x60;PEM&#x60; 编码的 &#x60;PKCS#8&#x60; 格式私钥，您只有一次机会保存您的私钥。请妥善保管。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyName - 密钥对名称，需要全局唯一。\n只允许数字、大小写字母、下划线“_”及中划线“-”，不超过32个字符。\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string keyName  密钥对名称。\n      * @param string privateKey  密钥对的私钥部分，&#x60;PEM PKCS#8&#x60; 格式。\n      * @param string keyFingerprint  密钥对的指纹，根据 &#x60;RFC4716&#x60; 定义的公钥指纹格式，采用 &#x60;MD5&#x60; 信息摘要算法。\n      */\n\n  createKeypair (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createKeypair\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keyName === undefined || opts.keyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyName' when calling createKeypair\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.keyName !== undefined && opts.keyName !== null) {\n      postBody['keyName'] = opts.keyName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createKeypair with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n导入密钥。\n\n与创建密钥不同的是，导入的密钥是由用户生成的。生成之后将公钥部分导入到京东云。\n\n详细操作说明请参考帮助文档：[创建密钥](https://docs.jdcloud.com/cn/virtual-machines/create-keypair)\n\n## 接口说明\n- 调用该接口导入由其他工具生成的密钥对的公钥部分。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyName - 密钥对名称，需要全局唯一。\n只允许数字、大小写字母、下划线“_”及中划线“-”，不超过32个字符。\n\n      * @param {string} opts.publicKey - 密钥对的公钥部分。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string keyName  密钥对名称。\n      * @param string keyFingerprint  密钥对的指纹，根据 &#x60;RFC4716&#x60; 定义的公钥指纹格式，采用 &#x60;MD5&#x60; 信息摘要算法。\n      */\n\n  importKeypair (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  importKeypair\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keyName === undefined || opts.keyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyName' when calling importKeypair\"\n      )\n    }\n    if (opts.publicKey === undefined || opts.publicKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publicKey' when calling importKeypair\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.keyName !== undefined && opts.keyName !== null) {\n      postBody['keyName'] = opts.keyName\n    }\n    if (opts.publicKey !== undefined && opts.publicKey !== null) {\n      postBody['publicKey'] = opts.publicKey\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call importKeypair with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs:import',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n删除密钥。\n\n详细操作说明请参考帮助文档：[删除密钥](https://docs.jdcloud.com/cn/virtual-machines/delete-keypair)\n\n## 接口说明\n- 密钥删除后，使用该密钥的实例仍可正常使用与之匹配的本地私钥登录，且密钥仍会显示在实例详情中。\n- 密钥删除后，与之关联的实例模板将变为不可用，并且与该实例模板关联的高可用组也会变为不可用。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyName - 密钥名称。\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteKeypair (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteKeypair\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keyName === undefined || opts.keyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyName' when calling deleteKeypair\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      keyName: opts.keyName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteKeypair with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs/{keyName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n为云主机实例绑定密钥。\n\n详细操作说明请参考帮助文档：[绑定密钥](https://docs.jdcloud.com/cn/virtual-machines/bind-keypair)\n\n## 接口说明\n- 只支持为 linux 云主机实例绑定密钥。\n- 每台云主机实例只支持绑定一个密钥。如果云主机绑定的密钥被删除了，那么该云主机还可以再次绑定密钥。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyName - 密钥名称。\n      * @param {array} [opts.instanceIds] - 要绑定的云主机Id列表。  optional\n      * @param {string} opts.passWordAuth - 绑定密钥后，根据此参数决定是否允许使用密码登录。可选范围：\n&#x60;yes&#x60;：允许SSH密码登录。\n&#x60;no&#x60;：禁止SSH密码登录。\n\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string successInstanceId\n      * @param string failInstanceId\n      */\n\n  attachKeypair (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  attachKeypair\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keyName === undefined || opts.keyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyName' when calling attachKeypair\"\n      )\n    }\n    if (opts.passWordAuth === undefined || opts.passWordAuth === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.passWordAuth' when calling attachKeypair\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceIds !== undefined && opts.instanceIds !== null) {\n      postBody['instanceIds'] = opts.instanceIds\n    }\n    if (opts.passWordAuth !== undefined && opts.passWordAuth !== null) {\n      postBody['passWordAuth'] = opts.passWordAuth\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      keyName: opts.keyName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call attachKeypair with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs/{keyName}:attach',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n为云主机实例解绑密钥。\n\n详细操作说明请参考帮助文档：[绑定密钥](https://docs.jdcloud.com/cn/virtual-machines/bind-keypair)\n\n## 接口说明\n- 调用该接口解绑云主机实例中的密钥。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.keyName - 密钥名称。\n      * @param {array} [opts.instanceIds] - 要解绑的云主机实例ID列表。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string successInstanceId\n      * @param string failInstanceId\n      */\n\n  detachKeypair (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  detachKeypair\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.keyName === undefined || opts.keyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.keyName' when calling detachKeypair\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceIds !== undefined && opts.instanceIds !== null) {\n      postBody['instanceIds'] = opts.instanceIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      keyName: opts.keyName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call detachKeypair with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/keypairs/{keyName}:detach',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n查询资源配额。\n\n## 接口说明\n- 调用该接口可查询 &#x60;云主机&#x60;、&#x60;云主机的CPU&#x60;、&#x60;云主机的内存&#x60;、&#x60;云主机的本地盘&#x60;、&#x60;镜像&#x60;、&#x60;密钥&#x60;、&#x60;实例模板&#x60;、&#x60;镜像共享&#x60; 的配额。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.imageId] - 私有镜像Id。\n查询镜像共享 &#x60;imageShare&#x60; 的配额时，此参数必传。\n  optional\n      * @param {filter} [opts.filters] - &lt;b&gt;filters 中支持使用以下关键字进行过滤&lt;/b&gt;\n&#x60;resourceTypes&#x60;: 资源类型，支持多个，可选范围：&#x60;instance、instance_cpu、instance_memory、instance_local_disk、keypair、image、instanceTemplate、imageShare&#x60;\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param quota quotas\n      */\n\n  describeQuotas (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuotas\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.imageId !== undefined && opts.imageId !== null) {\n      queryParams['imageId'] = opts.imageId\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vm/1.6.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuotas with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/quotas',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = VM\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/vod/v1/vod.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Watermark\n * 水印管理相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'vod'\nService._services[serviceId] = true\n\n/**\n * vod service.\n * @version 1.2.1\n */\n\nclass VOD extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'vod.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询分类列表。按照分页方式，返回分类列表信息。\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {sort} [opts.sorts]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listCategoriesResultObject resultObject\n      */\n\n  listCategories (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listCategories with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/categories',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加分类\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 分类名称\n      * @param {integer} [opts.parentId] - 父分类ID，取值为 0 或 null 时，表示该分类为一级分类\n  optional\n      * @param {string} [opts.description] - 分类描述信息  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param categoryObject resultObject\n      */\n\n  createCategory (opts, callback) {\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createCategory\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.parentId !== undefined && opts.parentId !== null) {\n      postBody['parentId'] = opts.parentId\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createCategory with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/categories',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询所有分类\n      * @param {Object} opts - parameters\n      * @param {boolean} [opts.flatMode] - 是否返回平坦结构结果,默认为false（flatMode和treeMode不能同时为false）  optional\n      * @param {boolean} [opts.treeMode] - 是否返回树结构结果,默认为false（flatMode和treeMode不能同时为false）  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listAllCategoriesResultObject resultObject\n      */\n\n  listAllCategories (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.flatMode !== undefined && opts.flatMode !== null) {\n      queryParams['flatMode'] = opts.flatMode\n    }\n    if (opts.treeMode !== undefined && opts.treeMode !== null) {\n      queryParams['treeMode'] = opts.treeMode\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listAllCategories with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/categories:listAll',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询分类及其子分类，若指定的分类ID为0，则返回一个根分类及其子分类（即一级分类）.\n      * @param {Object} opts - parameters\n      * @param {integer} opts.categoryId - 分类ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param getCategoryWithChildrenResultObject resultObject\n      */\n\n  getCategoryWithChildren (opts, callback) {\n    opts = opts || {}\n\n    if (opts.categoryId === undefined || opts.categoryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.categoryId' when calling getCategoryWithChildren\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      categoryId: opts.categoryId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getCategoryWithChildren with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/categories/{categoryId}:getWithChildren',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询分类\n      * @param {Object} opts - parameters\n      * @param {integer} opts.categoryId - 分类ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param categoryObject resultObject\n      */\n\n  getCategory (opts, callback) {\n    opts = opts || {}\n\n    if (opts.categoryId === undefined || opts.categoryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.categoryId' when calling getCategory\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      categoryId: opts.categoryId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getCategory with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/categories/{categoryId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改分类\n      * @param {Object} opts - parameters\n      * @param {integer} opts.categoryId - 分类ID\n      * @param {string} [opts.name] - 分类名称  optional\n      * @param {integer} [opts.parentId] - 父分类ID，取值为 0 或 null 时，表示该分类为一级分类\n  optional\n      * @param {string} [opts.description] - 分类描述信息  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param categoryObject resultObject\n      */\n\n  updateCategory (opts, callback) {\n    opts = opts || {}\n\n    if (opts.categoryId === undefined || opts.categoryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.categoryId' when calling updateCategory\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.parentId !== undefined && opts.parentId !== null) {\n      postBody['parentId'] = opts.parentId\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      categoryId: opts.categoryId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateCategory with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/categories/{categoryId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除分类\n      * @param {Object} opts - parameters\n      * @param {integer} opts.categoryId - 分类ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteCategory (opts, callback) {\n    opts = opts || {}\n\n    if (opts.categoryId === undefined || opts.categoryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.categoryId' when calling deleteCategory\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      categoryId: opts.categoryId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteCategory with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/categories/{categoryId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {sort} [opts.sorts]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listDomainsResultObject resultObject\n      */\n\n  listDomains (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listDomains with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加域名\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 域名名称\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainObject resultObject\n      */\n\n  createDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param domainObject resultObject\n      */\n\n  getDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling getDomain\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除域名。执行该操作，需确保域名已被停用。\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling deleteDomain\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启用域名\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling enableDomain\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:enable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停用域名\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling disableDomain\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:disable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设为默认域名\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setDefaultDomain (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling setDefaultDomain\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setDefaultDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:setDefault',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置域名访问头参数\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {string} opts.headerName - 头参数名。当前支持的访问头参数取值范围：\n  Content-Disposition\n  Content-Language\n  Expires\n  Access-Control-Allow-Origin\n  Access-Control-Allow-Methods\n  Access-Control-Max-Age\n  Access-Control-Expose-Headers\n\n      * @param {string} opts.headerValue - 头参数值\n      * @param {string} opts.headerType - 头参数类型，取值范围：req、resp\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setHeader (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling setHeader\"\n      )\n    }\n    if (opts.headerName === undefined || opts.headerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.headerName' when calling setHeader\"\n      )\n    }\n    if (opts.headerValue === undefined || opts.headerValue === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.headerValue' when calling setHeader\"\n      )\n    }\n    if (opts.headerType === undefined || opts.headerType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.headerType' when calling setHeader\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.headerName !== undefined && opts.headerName !== null) {\n      postBody['headerName'] = opts.headerName\n    }\n    if (opts.headerValue !== undefined && opts.headerValue !== null) {\n      postBody['headerValue'] = opts.headerValue\n    }\n    if (opts.headerType !== undefined && opts.headerType !== null) {\n      postBody['headerType'] = opts.headerType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setHeader with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:setHeader',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询域名访问头参数列表\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listHeadersResultObject resultObject\n      */\n\n  listHeaders (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling listHeaders\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listHeaders with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:listHeaders',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除域名访问头参数\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {string} opts.headerName - 头参数名。当前支持的访问头参数取值范围：\n  Content-Disposition\n  Content-Language\n  Expires\n  Access-Control-Allow-Origin\n  Access-Control-Allow-Methods\n  Access-Control-Max-Age\n  Access-Control-Expose-Headers\n\n      * @param {string} opts.headerType - 头参数类型，取值范围：req、resp\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteHeader (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling deleteHeader\"\n      )\n    }\n    if (opts.headerName === undefined || opts.headerName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.headerName' when calling deleteHeader\"\n      )\n    }\n    if (opts.headerType === undefined || opts.headerType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.headerType' when calling deleteHeader\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.headerName !== undefined && opts.headerName !== null) {\n      postBody['headerName'] = opts.headerName\n    }\n    if (opts.headerType !== undefined && opts.headerType !== null) {\n      postBody['headerType'] = opts.headerType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteHeader with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:deleteHeader',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置CDN域名Referer防盗链规则\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {refererRuleConfigObject} opts.config - Referer防盗链规则配置对象\n      * @param {boolean} opts.enabled - 是否启用该规则\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setRefererRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling setRefererRule\"\n      )\n    }\n    if (opts.config === undefined || opts.config === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.config' when calling setRefererRule\"\n      )\n    }\n    if (opts.enabled === undefined || opts.enabled === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.enabled' when calling setRefererRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.config !== undefined && opts.config !== null) {\n      postBody['config'] = opts.config\n    }\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setRefererRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:setRefererRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询CDN域名Referer防盗链规则配置\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param getRefererRuleResultObject resultObject\n      */\n\n  getRefererRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling getRefererRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRefererRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:getRefererRule',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置CDN域名URL鉴权规则\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {uRLRuleConfigObject} opts.config - URL鉴权规则配置对象\n      * @param {boolean} opts.enabled - 是否启用该规则\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setURLRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling setURLRule\"\n      )\n    }\n    if (opts.config === undefined || opts.config === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.config' when calling setURLRule\"\n      )\n    }\n    if (opts.enabled === undefined || opts.enabled === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.enabled' when calling setURLRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.config !== undefined && opts.config !== null) {\n      postBody['config'] = opts.config\n    }\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setURLRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:setURLRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询CDN域名URL鉴权规则配置\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param getURLRuleResultObject resultObject\n      */\n\n  getURLRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling getURLRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getURLRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:getURLRule',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置CDN域名IP黑名单规则\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {iPRuleConfigObject} opts.config - IP黑名单规则配置对象\n      * @param {boolean} opts.enabled - 是否启用该规则\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setIPRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling setIPRule\"\n      )\n    }\n    if (opts.config === undefined || opts.config === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.config' when calling setIPRule\"\n      )\n    }\n    if (opts.enabled === undefined || opts.enabled === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.enabled' when calling setIPRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.config !== undefined && opts.config !== null) {\n      postBody['config'] = opts.config\n    }\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setIPRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:setIPRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询CDN域名IP黑名单规则配置\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param getIPRuleResultObject resultObject\n      */\n\n  getIPRule (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling getIPRule\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getIPRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:getIPRule',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置CDN域名SSL配置\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {string} [opts.source] - 证书来源。取值范围：default  optional\n      * @param {string} [opts.title] - 证书标题  optional\n      * @param {string} [opts.sslCert] - 证书内容  optional\n      * @param {string} [opts.sslKey] - 证书私钥  optional\n      * @param {string} [opts.jumpType] - 跳转类型。取值范围：\ndefault - 采用回源域名的默认协议\nhttp - 强制采用http协议回源\nhttps - 强制采用https协议回源\n  optional\n      * @param {boolean} [opts.enabled] - SSL配置启用状态  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setHttpSsl (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling setHttpSsl\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.source !== undefined && opts.source !== null) {\n      postBody['source'] = opts.source\n    }\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.sslCert !== undefined && opts.sslCert !== null) {\n      postBody['sslCert'] = opts.sslCert\n    }\n    if (opts.sslKey !== undefined && opts.sslKey !== null) {\n      postBody['sslKey'] = opts.sslKey\n    }\n    if (opts.jumpType !== undefined && opts.jumpType !== null) {\n      postBody['jumpType'] = opts.jumpType\n    }\n    if (opts.enabled !== undefined && opts.enabled !== null) {\n      postBody['enabled'] = opts.enabled\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setHttpSsl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:setHttpSsl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询CDN域名SSL配置\n      * @param {Object} opts - parameters\n      * @param {integer} opts.domainId - 域名ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param getHttpSslResultObject resultObject\n      */\n\n  getHttpSsl (opts, callback) {\n    opts = opts || {}\n\n    if (opts.domainId === undefined || opts.domainId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.domainId' when calling getHttpSsl\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      domainId: opts.domainId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getHttpSsl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/domains/{domainId}:getHttpSsl',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建直播转点播任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.title - 视频标题\n      * @param {string} opts.fileName - 文件名称\n      * @param {integer} [opts.fileSize] - 文件大小  optional\n      * @param {string} [opts.coverUrl] - 封面地址  optional\n      * @param {string} [opts.description] - 视频描述  optional\n      * @param {integer} [opts.categoryId] - 分类ID  optional\n      * @param {array} [opts.tags] - 视频标签集合  optional\n      * @param {string} [opts.transcodeTemplateGroupId] - 转码模板组ID。若此字段不为空，则将以模板组方式提交转码作业，transcodeTemplateIds字段将被忽略。  optional\n      * @param {array} [opts.transcodeTemplateIds] - 转码模板ID集合  optional\n      * @param {array} [opts.watermarkIds] - 水印ID集合  optional\n      * @param {string} opts.publishDomain - 推流域名\n      * @param {string} opts.appName - 应用名称\n      * @param {string} opts.streamName - 流名称\n      * @param {array} [opts.recordTimes] - 录制时间段集合\n- 支持自定义1-10个时间段,拼接成一个文件\n- 每个时间段不小于10s\n- 总跨度不超过12小时\n- 时间段按升序排列且无重叠\n  optional\n      * @param {string} opts.recordFileType - 录制文件类型:\n- 取值: ts, flv, mp4\n- 不区分大小写\n\n      * @param {string} [opts.taskExternalId] - 直播录制任务外键  optional\n      * @param {string} [opts.priority] - 任务优先级:\n- 取值: low, medium, high\n- 不区分大小写\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string flowId  业务流ID\n      */\n\n  createLiveToVodTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.title === undefined || opts.title === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.title' when calling createLiveToVodTask\"\n      )\n    }\n    if (opts.fileName === undefined || opts.fileName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileName' when calling createLiveToVodTask\"\n      )\n    }\n    if (opts.publishDomain === undefined || opts.publishDomain === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.publishDomain' when calling createLiveToVodTask\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling createLiveToVodTask\"\n      )\n    }\n    if (opts.streamName === undefined || opts.streamName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.streamName' when calling createLiveToVodTask\"\n      )\n    }\n    if (opts.recordFileType === undefined || opts.recordFileType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.recordFileType' when calling createLiveToVodTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.fileName !== undefined && opts.fileName !== null) {\n      postBody['fileName'] = opts.fileName\n    }\n    if (opts.fileSize !== undefined && opts.fileSize !== null) {\n      postBody['fileSize'] = opts.fileSize\n    }\n    if (opts.coverUrl !== undefined && opts.coverUrl !== null) {\n      postBody['coverUrl'] = opts.coverUrl\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.categoryId !== undefined && opts.categoryId !== null) {\n      postBody['categoryId'] = opts.categoryId\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (\n      opts.transcodeTemplateGroupId !== undefined &&\n      opts.transcodeTemplateGroupId !== null\n    ) {\n      postBody['transcodeTemplateGroupId'] = opts.transcodeTemplateGroupId\n    }\n    if (\n      opts.transcodeTemplateIds !== undefined &&\n      opts.transcodeTemplateIds !== null\n    ) {\n      postBody['transcodeTemplateIds'] = opts.transcodeTemplateIds\n    }\n    if (opts.watermarkIds !== undefined && opts.watermarkIds !== null) {\n      postBody['watermarkIds'] = opts.watermarkIds\n    }\n    if (opts.publishDomain !== undefined && opts.publishDomain !== null) {\n      postBody['publishDomain'] = opts.publishDomain\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.streamName !== undefined && opts.streamName !== null) {\n      postBody['streamName'] = opts.streamName\n    }\n    if (opts.recordTimes !== undefined && opts.recordTimes !== null) {\n      postBody['recordTimes'] = opts.recordTimes\n    }\n    if (opts.recordFileType !== undefined && opts.recordFileType !== null) {\n      postBody['recordFileType'] = opts.recordFileType\n    }\n    if (opts.taskExternalId !== undefined && opts.taskExternalId !== null) {\n      postBody['taskExternalId'] = opts.taskExternalId\n    }\n    if (opts.priority !== undefined && opts.priority !== null) {\n      postBody['priority'] = opts.priority\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createLiveToVodTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/createLiveToVodTask',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取视频上传地址和凭证\n      * @param {Object} opts - parameters\n      * @param {string} [opts.httpMethod] - HTTP 请求方法，上传支持 PUT 和 POST 方法，默认值为 PUT 。\n通过该接口获取到上传地址和凭证之后，后续的上传动作，必须使用和该值一致的方法进行文件上传。\n  optional\n      * @param {string} opts.title - 视频标题\n      * @param {string} opts.fileName - 文件名称\n      * @param {integer} [opts.fileSize] - 文件大小  optional\n      * @param {string} [opts.coverUrl] - 封面地址  optional\n      * @param {string} [opts.description] - 视频描述  optional\n      * @param {integer} [opts.categoryId] - 分类ID  optional\n      * @param {array} [opts.tags] - 视频标签集合  optional\n      * @param {string} [opts.transcodeTemplateGroupId] - 转码模板组ID  optional\n      * @param {array} [opts.transcodeTemplateIds] - 转码模板ID集合  optional\n      * @param {array} [opts.watermarkIds] - 水印ID集合  optional\n      * @param {string} [opts.userData] - 自定义数据  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param videoUploadTaskObject resultObject\n      */\n\n  createVideoUploadTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.title === undefined || opts.title === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.title' when calling createVideoUploadTask\"\n      )\n    }\n    if (opts.fileName === undefined || opts.fileName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileName' when calling createVideoUploadTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.httpMethod !== undefined && opts.httpMethod !== null) {\n      postBody['httpMethod'] = opts.httpMethod\n    }\n    if (opts.title !== undefined && opts.title !== null) {\n      postBody['title'] = opts.title\n    }\n    if (opts.fileName !== undefined && opts.fileName !== null) {\n      postBody['fileName'] = opts.fileName\n    }\n    if (opts.fileSize !== undefined && opts.fileSize !== null) {\n      postBody['fileSize'] = opts.fileSize\n    }\n    if (opts.coverUrl !== undefined && opts.coverUrl !== null) {\n      postBody['coverUrl'] = opts.coverUrl\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.categoryId !== undefined && opts.categoryId !== null) {\n      postBody['categoryId'] = opts.categoryId\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (\n      opts.transcodeTemplateGroupId !== undefined &&\n      opts.transcodeTemplateGroupId !== null\n    ) {\n      postBody['transcodeTemplateGroupId'] = opts.transcodeTemplateGroupId\n    }\n    if (\n      opts.transcodeTemplateIds !== undefined &&\n      opts.transcodeTemplateIds !== null\n    ) {\n      postBody['transcodeTemplateIds'] = opts.transcodeTemplateIds\n    }\n    if (opts.watermarkIds !== undefined && opts.watermarkIds !== null) {\n      postBody['watermarkIds'] = opts.watermarkIds\n    }\n    if (opts.userData !== undefined && opts.userData !== null) {\n      postBody['userData'] = opts.userData\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVideoUploadTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/videoUploadTask',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  刷新视频上传地址和凭证\n      * @param {Object} opts - parameters\n      * @param {string} opts.videoId - 视频地址\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param videoUploadTaskObject resultObject\n      */\n\n  refreshVideoUploadTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.videoId === undefined || opts.videoId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.videoId' when calling refreshVideoUploadTask\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.videoId !== undefined && opts.videoId !== null) {\n      queryParams['videoId'] = opts.videoId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call refreshVideoUploadTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/videoUploadTask:refresh',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取图片上传地址和凭证\n      * @param {Object} opts - parameters\n      * @param {string} [opts.httpMethod] - HTTP 请求方法，上传支持 PUT 和 POST 方法，默认值为 PUT 。  optional\n      * @param {string} opts.fileName - 文件名称\n      * @param {integer} [opts.fileSize] - 文件大小  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param imageUploadTaskObject resultObject\n      */\n\n  createImageUploadTask (opts, callback) {\n    opts = opts || {}\n\n    if (opts.fileName === undefined || opts.fileName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileName' when calling createImageUploadTask\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.httpMethod !== undefined && opts.httpMethod !== null) {\n      postBody['httpMethod'] = opts.httpMethod\n    }\n    if (opts.fileName !== undefined && opts.fileName !== null) {\n      postBody['fileName'] = opts.fileName\n    }\n    if (opts.fileSize !== undefined && opts.fileSize !== null) {\n      postBody['fileSize'] = opts.fileSize\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createImageUploadTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/imageUploadTask',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  提交质检作业\n      * @param {Object} opts - parameters\n      * @param {string} [opts.mediaId] - 媒资ID  optional\n      * @param {array} [opts.templateIds] - 质检模板ID列表  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  submitQualityDetectionJob (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.mediaId !== undefined && opts.mediaId !== null) {\n      postBody['mediaId'] = opts.mediaId\n    }\n    if (opts.templateIds !== undefined && opts.templateIds !== null) {\n      postBody['templateIds'] = opts.templateIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call submitQualityDetectionJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionJobs:submit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量提交质检作业\n      * @param {Object} opts - parameters\n      * @param {array} [opts.bulkItems]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  batchSubmitQualityDetectionJobs (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bulkItems !== undefined && opts.bulkItems !== null) {\n      postBody['bulkItems'] = opts.bulkItems\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchSubmitQualityDetectionJobs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionJobs:batchSubmit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询质测模板列表。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listQualityDetectionTemplatesResultObject resultObject\n      */\n\n  listQualityDetectionTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listQualityDetectionTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionTemplates',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建质检模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 模板名称。长度不超过128个字符。UTF-8编码。\n\n      * @param {string} opts.templateType - 模板类型，区分该模板的检测内容。目前只支持 video 。\n      * @param {array} [opts.detections] - 检测项列表。取值范围：\n  blackScreen - 黑场\n  pureColor - 纯色\n  colorCast - 偏色\n  frozenFrame - 静帧\n  brightness - 亮度\n  contrast - 对比度\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param qualityDetectionTemplateObject resultObject\n      */\n\n  createQualityDetectionTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createQualityDetectionTemplate\"\n      )\n    }\n    if (opts.templateType === undefined || opts.templateType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateType' when calling createQualityDetectionTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.templateType !== undefined && opts.templateType !== null) {\n      postBody['templateType'] = opts.templateType\n    }\n    if (opts.detections !== undefined && opts.detections !== null) {\n      postBody['detections'] = opts.detections\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createQualityDetectionTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionTemplates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询质检模板\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param qualityDetectionTemplateObject resultObject\n      */\n\n  getQualityDetectionTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling getQualityDetectionTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getQualityDetectionTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionTemplates/{templateId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改质检模板\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} [opts.name] - 模板名称。长度不超过128个字符。UTF-8编码。\n  optional\n      * @param {array} [opts.detections] - 检测项列表。取值范围：\n  blackScreen - 黑场\n  pureColor - 纯色\n  colorCast - 偏色\n  frozenFrame - 静帧\n  brightness - 亮度\n  contrast - 对比度\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param qualityDetectionTemplateObject resultObject\n      */\n\n  updateQualityDetectionTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling updateQualityDetectionTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.detections !== undefined && opts.detections !== null) {\n      postBody['detections'] = opts.detections\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateQualityDetectionTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionTemplates/{templateId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除质检模板\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteQualityDetectionTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling deleteQualityDetectionTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteQualityDetectionTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/qualityDetectionTemplates/{templateId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  提交截图作业\n\n      * @param {Object} opts - parameters\n      * @param {array} [opts.videoIds] - 视频ID列表  optional\n      * @param {array} [opts.templateIds] - 转码模板ID列表  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param submitSnapshotJobsResult resultObject\n      */\n\n  submitSnapshotTask (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.videoIds !== undefined && opts.videoIds !== null) {\n      postBody['videoIds'] = opts.videoIds\n    }\n    if (opts.templateIds !== undefined && opts.templateIds !== null) {\n      postBody['templateIds'] = opts.templateIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call submitSnapshotTask with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotJobs:submit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询视频截图任务列表\n支持过滤查询：\n  - createTime,ge 最早任务创建时间\n  - createTime,le 最晚任务创建时间\n  - status,in 任务状态IN查询\n  - taskId,eq 任务ID精确查询\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotTaskSummaryPageInfo resultObject\n      */\n\n  listSnapshotTasks (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSnapshotTasks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTasks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询截图模板列表。\n允许通过条件过滤查询，支持的过滤字段如下：\n  - snapshotType[eq] 按模板类型精确查询\n  - templateId[eq] 按模板ID精确查询\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotTemplatePageInfo resultObject\n      */\n\n  listSnapshotTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSnapshotTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTemplates',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建截图模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateName - 模板标题。长度不超过 128 个字节。UTF-8 编码。\n      * @param {string} [opts.snapshotType] - 模板类型。取值范围：\n  sample - 采样截图模板\n  sprite - 雪碧图模板\n  optional\n      * @param {imageSampleConfig} [opts.imageSampleConfig] - 采样截图模板配置  optional\n      * @param {imageSpriteConfig} [opts.imageSpriteConfig] - 雪碧图模板配置  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotTemplateInfo resultObject\n      */\n\n  createSnapshotTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateName === undefined || opts.templateName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateName' when calling createSnapshotTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.templateName !== undefined && opts.templateName !== null) {\n      postBody['templateName'] = opts.templateName\n    }\n    if (opts.snapshotType !== undefined && opts.snapshotType !== null) {\n      postBody['snapshotType'] = opts.snapshotType\n    }\n    if (\n      opts.imageSampleConfig !== undefined &&\n      opts.imageSampleConfig !== null\n    ) {\n      postBody['imageSampleConfig'] = opts.imageSampleConfig\n    }\n    if (\n      opts.imageSpriteConfig !== undefined &&\n      opts.imageSpriteConfig !== null\n    ) {\n      postBody['imageSpriteConfig'] = opts.imageSpriteConfig\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSnapshotTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTemplates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询截图模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotTemplateInfo resultObject\n      */\n\n  getSnapshotTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling getSnapshotTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSnapshotTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTemplates/{templateId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改截图模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板ID\n      * @param {string} [opts.templateName] - 模板标题。长度不超过 128 个字节。UTF-8 编码。  optional\n      * @param {string} [opts.snapshotType] - 模板类型。取值范围：\n  sample - 采样截图模板\n  sprite - 雪碧图模板\n  optional\n      * @param {imageSampleConfig} [opts.imageSampleConfig] - 采样截图模板配置  optional\n      * @param {imageSpriteConfig} [opts.imageSpriteConfig] - 雪碧图模板配置  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param snapshotTemplateInfo resultObject\n      */\n\n  updateSnapshotTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling updateSnapshotTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.templateName !== undefined && opts.templateName !== null) {\n      postBody['templateName'] = opts.templateName\n    }\n    if (opts.snapshotType !== undefined && opts.snapshotType !== null) {\n      postBody['snapshotType'] = opts.snapshotType\n    }\n    if (\n      opts.imageSampleConfig !== undefined &&\n      opts.imageSampleConfig !== null\n    ) {\n      postBody['imageSampleConfig'] = opts.imageSampleConfig\n    }\n    if (\n      opts.imageSpriteConfig !== undefined &&\n      opts.imageSpriteConfig !== null\n    ) {\n      postBody['imageSpriteConfig'] = opts.imageSpriteConfig\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateSnapshotTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTemplates/{templateId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除截图模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSnapshotTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling deleteSnapshotTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSnapshotTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/snapshotTemplates/{templateId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  提交转码作业\n      * @param {Object} opts - parameters\n      * @param {string} [opts.videoId] - 视频ID  optional\n      * @param {string} [opts.templateGroupId] - 转码模板组ID。若此字段不为空，则以模板组方式提交作业，templateIds字段将被忽略。  optional\n      * @param {array} [opts.templateIds] - 转码模板ID列表  optional\n      * @param {array} [opts.watermarkIds] - 水印ID列表  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param submitTranscodeJobResultObject resultObject\n      */\n\n  submitTranscodeJob (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.videoId !== undefined && opts.videoId !== null) {\n      postBody['videoId'] = opts.videoId\n    }\n    if (opts.templateGroupId !== undefined && opts.templateGroupId !== null) {\n      postBody['templateGroupId'] = opts.templateGroupId\n    }\n    if (opts.templateIds !== undefined && opts.templateIds !== null) {\n      postBody['templateIds'] = opts.templateIds\n    }\n    if (opts.watermarkIds !== undefined && opts.watermarkIds !== null) {\n      postBody['watermarkIds'] = opts.watermarkIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call submitTranscodeJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTasks:submitJob',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量提交转码作业\n      * @param {Object} opts - parameters\n      * @param {array} [opts.bulkItems]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param batchSubmitTranscodeJobsResultObject resultObject\n      */\n\n  batchSubmitTranscodeJobs (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bulkItems !== undefined && opts.bulkItems !== null) {\n      postBody['bulkItems'] = opts.bulkItems\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchSubmitTranscodeJobs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTasks:batchSubmitJobs',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询视频转码摘要\n      * @param {Object} opts - parameters\n      * @param {string} [opts.videoIds]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeSummaries resultObject\n      */\n\n  getTranscodeSummaries (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildArrayParam(opts.videoIds, 'videoIds'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTranscodeSummaries with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcode:summary',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码作业摘要\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.jobIds]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeJobSummaries resultObject\n      */\n\n  getTranscodeJobSummaries (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildArrayParam(opts.jobIds, 'jobIds'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTranscodeJobSummaries with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeJobs:summary',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码任务摘要\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.taskIds]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeTaskSummaries resultObject\n      */\n\n  getTranscodeTaskSummaries (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    Object.assign(queryParams, super.buildArrayParam(opts.taskIds, 'taskIds'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTranscodeTaskSummaries with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTasks:summary',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  提交转码作业\n      * @param {Object} opts - parameters\n      * @param {string} [opts.videoId] - 视频ID  optional\n      * @param {array} [opts.templateIds] - 转码模板ID列表  optional\n      * @param {array} [opts.watermarkIds] - 水印ID列表  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param submitTranscodeJobResultObject resultObject\n      */\n\n  submitTranscodeJob (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.videoId !== undefined && opts.videoId !== null) {\n      postBody['videoId'] = opts.videoId\n    }\n    if (opts.templateIds !== undefined && opts.templateIds !== null) {\n      postBody['templateIds'] = opts.templateIds\n    }\n    if (opts.watermarkIds !== undefined && opts.watermarkIds !== null) {\n      postBody['watermarkIds'] = opts.watermarkIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call submitTranscodeJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTasks:submitJob',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量提交转码作业\n      * @param {Object} opts - parameters\n      * @param {array} [opts.bulkItems]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param batchSubmitTranscodeJobsResultObject resultObject\n      */\n\n  batchSubmitTranscodeJobs (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bulkItems !== undefined && opts.bulkItems !== null) {\n      postBody['bulkItems'] = opts.bulkItems\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchSubmitTranscodeJobs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTasks:batchSubmitJobs',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码模板列表。\n允许通过条件过滤查询，支持的过滤字段如下：\n  - source[eq] 按模板来源精确查询\n  - templateType[eq] 按模板类型精确查询\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listTranscodeTemplatesResultObject resultObject\n      */\n\n  listTranscodeTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listTranscodeTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplates',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建转码模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 模板名称。长度不超过128个字符。UTF-8编码。\n\n      * @param {video} opts.video - 视频参数配置\n      * @param {audio} opts.audio - 音频参数配置\n      * @param {encapsulation} opts.encapsulation - 封装配置\n      * @param {outFile} [opts.outFile] - 输出文件配置  optional\n      * @param {string} opts.definition - 清晰度规格标记。取值范围：\n  SD - 标清\n  HD - 高清\n  FHD - 超清\n  2K\n  4K\n\n      * @param {string} [opts.templateType] - 模板类型。取值范围：\n  jdchd - 京享超清\n  jdchs - 极速转码\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeTemplateObject resultObject\n      */\n\n  createTranscodeTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createTranscodeTemplate\"\n      )\n    }\n    if (opts.video === undefined || opts.video === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.video' when calling createTranscodeTemplate\"\n      )\n    }\n    if (opts.audio === undefined || opts.audio === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.audio' when calling createTranscodeTemplate\"\n      )\n    }\n    if (opts.encapsulation === undefined || opts.encapsulation === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.encapsulation' when calling createTranscodeTemplate\"\n      )\n    }\n    if (opts.definition === undefined || opts.definition === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.definition' when calling createTranscodeTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.video !== undefined && opts.video !== null) {\n      postBody['video'] = opts.video\n    }\n    if (opts.audio !== undefined && opts.audio !== null) {\n      postBody['audio'] = opts.audio\n    }\n    if (opts.encapsulation !== undefined && opts.encapsulation !== null) {\n      postBody['encapsulation'] = opts.encapsulation\n    }\n    if (opts.outFile !== undefined && opts.outFile !== null) {\n      postBody['outFile'] = opts.outFile\n    }\n    if (opts.definition !== undefined && opts.definition !== null) {\n      postBody['definition'] = opts.definition\n    }\n    if (opts.templateType !== undefined && opts.templateType !== null) {\n      postBody['templateType'] = opts.templateType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createTranscodeTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码模板\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeTemplateObject resultObject\n      */\n\n  getTranscodeTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling getTranscodeTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTranscodeTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplates/{templateId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改转码模板\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} [opts.name] - 模板名称。长度不超过128个字符。UTF-8编码。\n  optional\n      * @param {video} [opts.video] - 视频参数配置  optional\n      * @param {audio} [opts.audio] - 音频参数配置  optional\n      * @param {encapsulation} [opts.encapsulation] - 封装配置  optional\n      * @param {outFile} [opts.outFile] - 输出文件配置  optional\n      * @param {string} [opts.definition] - 清晰度规格标记。取值范围：\n  SD - 标清\n  HD - 高清\n  FHD - 超清\n  2K\n  4K\n  optional\n      * @param {string} [opts.templateType] - 模板类型。取值范围：\n  jdchd - 京享超清\n  jdchs - 极速转码\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeTemplateObject resultObject\n      */\n\n  updateTranscodeTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling updateTranscodeTemplate\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.video !== undefined && opts.video !== null) {\n      postBody['video'] = opts.video\n    }\n    if (opts.audio !== undefined && opts.audio !== null) {\n      postBody['audio'] = opts.audio\n    }\n    if (opts.encapsulation !== undefined && opts.encapsulation !== null) {\n      postBody['encapsulation'] = opts.encapsulation\n    }\n    if (opts.outFile !== undefined && opts.outFile !== null) {\n      postBody['outFile'] = opts.outFile\n    }\n    if (opts.definition !== undefined && opts.definition !== null) {\n      postBody['definition'] = opts.definition\n    }\n    if (opts.templateType !== undefined && opts.templateType !== null) {\n      postBody['templateType'] = opts.templateType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateTranscodeTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplates/{templateId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除转码模板\n      * @param {Object} opts - parameters\n      * @param {integer} opts.templateId - 模板ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteTranscodeTemplate (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling deleteTranscodeTemplate\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTranscodeTemplate with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplates/{templateId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码模板组列表。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeTemplateGroupPageData resultObject\n      */\n\n  listTranscodeTemplateGroups (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listTranscodeTemplateGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplateGroups',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建转码模板组\n      * @param {Object} opts - parameters\n      * @param {string} [opts.groupName] - 转码模板组名称  optional\n      * @param {array} [opts.templates]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeTemplateGroupData resultObject\n      */\n\n  createTranscodeTemplateGroup (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.groupName !== undefined && opts.groupName !== null) {\n      postBody['groupName'] = opts.groupName\n    }\n    if (opts.templates !== undefined && opts.templates !== null) {\n      postBody['templates'] = opts.templates\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createTranscodeTemplateGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplateGroups',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询转码模板组\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupId - 模板组ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeTemplateGroupData resultObject\n      */\n\n  getTranscodeTemplateGroup (opts, callback) {\n    opts = opts || {}\n\n    if (opts.groupId === undefined || opts.groupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupId' when calling getTranscodeTemplateGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      groupId: opts.groupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTranscodeTemplateGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplateGroups/{groupId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改转码模板组\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupId - 模板组ID\n      * @param {string} [opts.groupName] - 转码模板组名称  optional\n      * @param {array} [opts.templates]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param transcodeTemplateGroupData resultObject\n      */\n\n  updateTranscodeTemplateGroup (opts, callback) {\n    opts = opts || {}\n\n    if (opts.groupId === undefined || opts.groupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupId' when calling updateTranscodeTemplateGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.groupName !== undefined && opts.groupName !== null) {\n      postBody['groupName'] = opts.groupName\n    }\n    if (opts.templates !== undefined && opts.templates !== null) {\n      postBody['templates'] = opts.templates\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      groupId: opts.groupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateTranscodeTemplateGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplateGroups/{groupId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除转码模板组\n      * @param {Object} opts - parameters\n      * @param {string} opts.groupId - 模板组ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteTranscodeTemplateGroup (opts, callback) {\n    opts = opts || {}\n\n    if (opts.groupId === undefined || opts.groupId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.groupId' when calling deleteTranscodeTemplateGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      groupId: opts.groupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTranscodeTemplateGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplateGroups/{groupId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除转码模板组中的模板。\n\n      * @param {Object} opts - parameters\n      * @param {string} [opts.groupId] - 模板组ID  optional\n      * @param {integer} [opts.templateIds] - 待删除的模板ID列表  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deleteGroupedTranscodeTemplatesResData resultObject\n      */\n\n  deleteGroupedTranscodeTemplates (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.groupId !== undefined && opts.groupId !== null) {\n      postBody['groupId'] = opts.groupId\n    }\n    if (opts.templateIds !== undefined && opts.templateIds !== null) {\n      postBody['templateIds'] = opts.templateIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteGroupedTranscodeTemplates with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/transcodeTemplateGroups:deleteGroupedTranscodeTemplates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建视频剪辑作业\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.projectName - 工程名称\n      * @param {string} [opts.description] - 工程描述  optional\n      * @param {timeline} opts.timeline - 时间线信息\n      * @param {mediaMetadata} [opts.mediaMetadata] - 剪辑合成媒资元数据  optional\n      * @param {string} [opts.userData] - 用户数据，JSON格式的字符串。\n在Timeline中的所有MediaClip中，若有2个或以上的不同MediaId，即素材片段来源于2个或以上不同视频，则在提交剪辑作业时，必须在UserData中指明合并后的视频画面的宽高。\n如 {\\&quot;extendData\\&quot;: {\\&quot;width\\&quot;: 720, \\&quot;height\\&quot;: 500}}，其中width和height必须为[16, 4096]之间的偶数\nvideoMode 支持 normal 普通模式 screen_record 屏幕录制模式 两种模式，默认为 normal。\n如 &quot;{\\&quot;extendData\\&quot;:{\\&quot;videoMode\\&quot;:\\&quot;screen_record\\&quot;}}&quot;\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param submittedVeditJob resultObject\n      */\n\n  createVeditJob (opts, callback) {\n    opts = opts || {}\n\n    if (opts.projectName === undefined || opts.projectName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.projectName' when calling createVeditJob\"\n      )\n    }\n    if (opts.timeline === undefined || opts.timeline === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.timeline' when calling createVeditJob\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.projectName !== undefined && opts.projectName !== null) {\n      postBody['projectName'] = opts.projectName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.timeline !== undefined && opts.timeline !== null) {\n      postBody['timeline'] = opts.timeline\n    }\n    if (opts.mediaMetadata !== undefined && opts.mediaMetadata !== null) {\n      postBody['mediaMetadata'] = opts.mediaMetadata\n    }\n    if (opts.userData !== undefined && opts.userData !== null) {\n      postBody['userData'] = opts.userData\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVeditJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/veditJobs',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  提交视频剪辑作业\n      * @param {Object} opts - parameters\n      * @param {integer} opts.projectId - 工程ID\n      * @param {mediaMetadata} [opts.mediaMetadata] - 合成媒资元数据  optional\n      * @param {string} [opts.userData] - 用户数据，JSON格式的字符串。\n在Timeline中的所有MediaClip中，若有2个或以上的不同MediaId，即素材片段来源于2个或以上不同视频，则在提交剪辑作业时，必须在UserData中指明合并后的视频画面的宽高。\n如 {\\&quot;extendData\\&quot;: {\\&quot;width\\&quot;: 720, \\&quot;height\\&quot;: 500}}，其中width和height必须为[16, 4096]之间的偶数\nvideoMode 支持 normal 普通模式 screen_record 屏幕录制模式 两种模式，默认为 normal。\n如 &quot;{\\&quot;extendData\\&quot;:{\\&quot;videoMode\\&quot;:\\&quot;screen_record\\&quot;}}&quot;\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param submittedVeditJob resultObject\n      */\n\n  submitVeditJob (opts, callback) {\n    opts = opts || {}\n\n    if (opts.projectId === undefined || opts.projectId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.projectId' when calling submitVeditJob\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.projectId !== undefined && opts.projectId !== null) {\n      postBody['projectId'] = opts.projectId\n    }\n    if (opts.mediaMetadata !== undefined && opts.mediaMetadata !== null) {\n      postBody['mediaMetadata'] = opts.mediaMetadata\n    }\n    if (opts.userData !== undefined && opts.userData !== null) {\n      postBody['userData'] = opts.userData\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call submitVeditJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/veditJobs:submit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询视频剪辑工程列表。\n允许通过条件过滤查询，支持的过滤字段如下：\n  - projectId[eq] 按照工程ID精确查询\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param veditProjectPageData resultObject\n      */\n\n  listVeditProjects (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listVeditProjects with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/veditProjects',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建视频剪辑工程\n      * @param {Object} opts - parameters\n      * @param {string} opts.projectName - 工程名称\n      * @param {string} [opts.description] - 工程描述  optional\n      * @param {timeline} opts.timeline - 时间线信息\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param veditProjectData resultObject\n      */\n\n  createVeditProject (opts, callback) {\n    opts = opts || {}\n\n    if (opts.projectName === undefined || opts.projectName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.projectName' when calling createVeditProject\"\n      )\n    }\n    if (opts.timeline === undefined || opts.timeline === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.timeline' when calling createVeditProject\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.projectName !== undefined && opts.projectName !== null) {\n      postBody['projectName'] = opts.projectName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.timeline !== undefined && opts.timeline !== null) {\n      postBody['timeline'] = opts.timeline\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVeditProject with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/veditProjects',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询视频剪辑工程详情\n      * @param {Object} opts - parameters\n      * @param {integer} opts.projectId - 视频剪辑工程ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param veditProjectData resultObject\n      */\n\n  getVeditProject (opts, callback) {\n    opts = opts || {}\n\n    if (opts.projectId === undefined || opts.projectId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.projectId' when calling getVeditProject\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      projectId: opts.projectId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVeditProject with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/veditProjects/{projectId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改视频剪辑工程信息\n      * @param {Object} opts - parameters\n      * @param {integer} opts.projectId - 视频剪辑工程ID\n      * @param {string} [opts.projectName] - 工程名称  optional\n      * @param {string} [opts.description] - 工程描述  optional\n      * @param {timeline} [opts.timeline] - 时间线信息  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param veditProjectData resultObject\n      */\n\n  updateVeditProject (opts, callback) {\n    opts = opts || {}\n\n    if (opts.projectId === undefined || opts.projectId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.projectId' when calling updateVeditProject\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.projectName !== undefined && opts.projectName !== null) {\n      postBody['projectName'] = opts.projectName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.timeline !== undefined && opts.timeline !== null) {\n      postBody['timeline'] = opts.timeline\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      projectId: opts.projectId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateVeditProject with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/veditProjects/{projectId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除视频剪辑工程\n      * @param {Object} opts - parameters\n      * @param {integer} opts.projectId - 视频剪辑工程ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVeditProject (opts, callback) {\n    opts = opts || {}\n\n    if (opts.projectId === undefined || opts.projectId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.projectId' when calling deleteVeditProject\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      projectId: opts.projectId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVeditProject with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/veditProjects/{projectId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询视频列表信息。\n允许通过条件过滤查询，支持的过滤字段如下：\n  - status[eq] 按视频状态精确查询\n  - categoryId[eq] 按分类ID精确查询\n  - videoId[eq] 按视频ID精确查询\n  - name[eq] 按视频名称精确查询\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {filter} [opts.filters]   optional\n      * @param {sort} [opts.sorts]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listVideosResultObject resultObject\n      */\n\n  listVideos (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildSortParam(opts.sorts, 'sorts'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listVideos with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/videos',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询单个视频信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.videoId - 视频ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param videoObject resultObject\n      */\n\n  getVideo (opts, callback) {\n    opts = opts || {}\n\n    if (opts.videoId === undefined || opts.videoId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.videoId' when calling getVideo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      videoId: opts.videoId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVideo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/videos/{videoId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改视频信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.videoId - 视频ID\n      * @param {string} [opts.name] - 视频名称  optional\n      * @param {integer} [opts.categoryId] - 分类ID  optional\n      * @param {array} [opts.tags] - 标签  optional\n      * @param {string} [opts.coverUrl] - 封面地址  optional\n      * @param {string} [opts.description] - 视频描述信息  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param videoObject resultObject\n      */\n\n  updateVideo (opts, callback) {\n    opts = opts || {}\n\n    if (opts.videoId === undefined || opts.videoId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.videoId' when calling updateVideo\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.categoryId !== undefined && opts.categoryId !== null) {\n      postBody['categoryId'] = opts.categoryId\n    }\n    if (opts.tags !== undefined && opts.tags !== null) {\n      postBody['tags'] = opts.tags\n    }\n    if (opts.coverUrl !== undefined && opts.coverUrl !== null) {\n      postBody['coverUrl'] = opts.coverUrl\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      videoId: opts.videoId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateVideo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/videos/{videoId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除视频，调用该接口会同时删除与指定视频相关的所有信息，包括转码任务信息、转码流数据等，同时清除云存储中相关文件资源。\n      * @param {Object} opts - parameters\n      * @param {string} opts.videoId - 视频ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVideo (opts, callback) {\n    opts = opts || {}\n\n    if (opts.videoId === undefined || opts.videoId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.videoId' when calling deleteVideo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      videoId: opts.videoId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVideo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/videos/{videoId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量删除视频，调用该接口会同时删除与指定视频相关的所有信息，包括转码任务信息、转码流数据等，同时清除云存储中相关文件资源。\n      * @param {Object} opts - parameters\n      * @param {array} [opts.videoIds] - 视频ID集合  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param batchDeleteVideosResultObject resultObject\n      */\n\n  batchDeleteVideos (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.videoIds !== undefined && opts.videoIds !== null) {\n      postBody['videoIds'] = opts.videoIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchDeleteVideos with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/videos:batchDelete',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量修改视频信息\n      * @param {Object} opts - parameters\n      * @param {array} [opts.bulkItems] - 批量更新视频的条目集合  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param batchUpdateVideosResultObject resultObject\n      */\n\n  batchUpdateVideos (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n    if (opts.bulkItems !== undefined && opts.bulkItems !== null) {\n      postBody['bulkItems'] = opts.bulkItems\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchUpdateVideos with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/videos:batchUpdate',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取视频播放信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.videoId - 视频ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param getPlayInfoResultObject resultObject\n      */\n\n  getVideoPlayInfo (opts, callback) {\n    opts = opts || {}\n\n    if (opts.videoId === undefined || opts.videoId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.videoId' when calling getVideoPlayInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      videoId: opts.videoId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVideoPlayInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/videos/{videoId}:getPlayInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除视频转码流\n      * @param {Object} opts - parameters\n      * @param {string} opts.videoId - 视频ID\n      * @param {array} [opts.taskIds]   optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param deleteVideoStreamsResultObject resultObject\n      */\n\n  deleteVideoStreams (opts, callback) {\n    opts = opts || {}\n\n    if (opts.videoId === undefined || opts.videoId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.videoId' when calling deleteVideoStreams\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.taskIds !== undefined && opts.taskIds !== null) {\n      postBody['taskIds'] = opts.taskIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      videoId: opts.videoId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVideoStreams with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/videos/{videoId}:deleteStreams',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  视频审核\n视频在上传中或者转码中不允许更改视频审核状态，即视频只有在正常或屏蔽状态下才可以调用此接口设置审核状态\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.videoId - 视频ID\n      * @param {string} opts.auditResult - 审核结果，取值范围:\n block(封禁)\n unblock(解封)\n\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  videoAudit (opts, callback) {\n    opts = opts || {}\n\n    if (opts.videoId === undefined || opts.videoId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.videoId' when calling videoAudit\"\n      )\n    }\n    if (opts.auditResult === undefined || opts.auditResult === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.auditResult' when calling videoAudit\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.auditResult !== undefined && opts.auditResult !== null) {\n      postBody['auditResult'] = opts.auditResult\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      videoId: opts.videoId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call videoAudit with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/videos/{videoId}:audit',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取视频源文件信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.videoId - 视频ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param getPlayInfoResultObject resultObject\n      */\n\n  getVideoSourceInfo (opts, callback) {\n    opts = opts || {}\n\n    if (opts.videoId === undefined || opts.videoId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.videoId' when calling getVideoSourceInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      videoId: opts.videoId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getVideoSourceInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/videos/{videoId}:getSourceInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询水印列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认值为 1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认值为 10；取值范围 [10, 100]  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param listWatermarksResultObject resultObject\n      */\n\n  listWatermarks (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listWatermarks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加水印\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 水印名称。只支持中英文、数字。长度不超过128个字符。UTF-8编码。\n\n      * @param {string} opts.imgUrl - 图片地址\n      * @param {string} opts.width - 水印宽度。\n当 sizeUnit &#x3D; pixel 时，取值范围为 [8, 4096] 整数\n当 sizeUnit &#x3D; percent 时，取值范围为 [0, 100] 小数\n\n      * @param {string} opts.height - 水印高度。\n当 sizeUnit &#x3D; pixel 时，取值范围为 [8, 4096] 整数\n当 sizeUnit &#x3D; percent 时，取值范围为 [0, 100] 小数\n\n      * @param {string} [opts.sizeUnit] - 尺寸单位。取值范围：\n  pixel - 像素\n  percent - 百分比\n默认值为 pixel\n  optional\n      * @param {string} [opts.widthRef]   optional\n      * @param {string} [opts.heightRef] - 高度参考，仅当 siteUnit &#x3D; percent 时生效。\n取值说明：\n  w: 输出水印高度 &#x3D; height * 水印原图高度\n  v: 等同于 vh\n  vw: 输出水印高度 &#x3D; height * 输出视频宽度\n  vh: 输出水印高度 &#x3D; height * 输出视频高度\n  vls: 输出水印高度 &#x3D; height * 输出视频长边\n  vss: 输出水印高度 &#x3D; height * 输出视频短边\n  optional\n      * @param {string} opts.position - 水印位置。取值范围：\n  LT - 左上\n  RT - 右上\n  LB - 左下\n  RB - 右下\n\n      * @param {string} opts.offsetX - 水平偏移。\n当 offsetUnit &#x3D; pixel 时，取值范围为 [8, 4088] 整数\n当 offsetUnit &#x3D; percent 时，取值范围为 [0, 100] 小数\n\n      * @param {string} opts.offsetY - 竖直偏移。\n当 offsetUnit &#x3D; pixel 时，取值范围为 [8, 4088] 整数\n当 offsetUnit &#x3D; percent 时，取值范围为 [0, 100] 小数\n\n      * @param {string} [opts.offsetUnit] - 偏移单位。取值范围：\n  pixel - 像素\n  percent - 百分比\n默认值为 pixel\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param watermarkObject resultObject\n      */\n\n  createWatermark (opts, callback) {\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createWatermark\"\n      )\n    }\n    if (opts.imgUrl === undefined || opts.imgUrl === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.imgUrl' when calling createWatermark\"\n      )\n    }\n    if (opts.width === undefined || opts.width === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.width' when calling createWatermark\"\n      )\n    }\n    if (opts.height === undefined || opts.height === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.height' when calling createWatermark\"\n      )\n    }\n    if (opts.position === undefined || opts.position === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.position' when calling createWatermark\"\n      )\n    }\n    if (opts.offsetX === undefined || opts.offsetX === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.offsetX' when calling createWatermark\"\n      )\n    }\n    if (opts.offsetY === undefined || opts.offsetY === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.offsetY' when calling createWatermark\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.imgUrl !== undefined && opts.imgUrl !== null) {\n      postBody['imgUrl'] = opts.imgUrl\n    }\n    if (opts.width !== undefined && opts.width !== null) {\n      postBody['width'] = opts.width\n    }\n    if (opts.height !== undefined && opts.height !== null) {\n      postBody['height'] = opts.height\n    }\n    if (opts.sizeUnit !== undefined && opts.sizeUnit !== null) {\n      postBody['sizeUnit'] = opts.sizeUnit\n    }\n    if (opts.widthRef !== undefined && opts.widthRef !== null) {\n      postBody['widthRef'] = opts.widthRef\n    }\n    if (opts.heightRef !== undefined && opts.heightRef !== null) {\n      postBody['heightRef'] = opts.heightRef\n    }\n    if (opts.position !== undefined && opts.position !== null) {\n      postBody['position'] = opts.position\n    }\n    if (opts.offsetX !== undefined && opts.offsetX !== null) {\n      postBody['offsetX'] = opts.offsetX\n    }\n    if (opts.offsetY !== undefined && opts.offsetY !== null) {\n      postBody['offsetY'] = opts.offsetY\n    }\n    if (opts.offsetUnit !== undefined && opts.offsetUnit !== null) {\n      postBody['offsetUnit'] = opts.offsetUnit\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createWatermark with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarks',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询水印\n      * @param {Object} opts - parameters\n      * @param {integer} opts.watermarkId - 水印ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param watermarkObject resultObject\n      */\n\n  getWatermark (opts, callback) {\n    opts = opts || {}\n\n    if (opts.watermarkId === undefined || opts.watermarkId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.watermarkId' when calling getWatermark\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      watermarkId: opts.watermarkId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getWatermark with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarks/{watermarkId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改水印\n      * @param {Object} opts - parameters\n      * @param {integer} opts.watermarkId - 水印ID\n      * @param {string} [opts.name] - 水印名称。只支持中英文、数字。长度不超过128个字符。UTF-8编码。\n  optional\n      * @param {string} [opts.imgUrl] - 图片地址  optional\n      * @param {string} [opts.width] - 水印宽度。\n当 sizeUnit &#x3D; pixel 时，取值范围为 [8, 4096] 整数\n当 sizeUnit &#x3D; percent 时，取值范围为 [0, 100] 小数\n  optional\n      * @param {string} [opts.height] - 水印高度。\n当 sizeUnit &#x3D; pixel 时，取值范围为 [8, 4096] 整数\n当 sizeUnit &#x3D; percent 时，取值范围为 [0, 100] 小数\n  optional\n      * @param {string} [opts.sizeUnit] - 尺寸单位。取值范围：\n  pixel - 像素\n  percent - 百分比\n默认值为 pixel\n  optional\n      * @param {string} [opts.widthRef]   optional\n      * @param {string} [opts.heightRef] - 高度参考，仅当 siteUnit &#x3D; percent 时生效。\n取值说明：\n  w: 输出水印高度 &#x3D; height * 水印原图高度\n  v: 等同于 vh\n  vw: 输出水印高度 &#x3D; height * 输出视频宽度\n  vh: 输出水印高度 &#x3D; height * 输出视频高度\n  vls: 输出水印高度 &#x3D; height * 输出视频长边\n  vss: 输出水印高度 &#x3D; height * 输出视频短边\n  optional\n      * @param {string} [opts.position] - 水印位置。取值范围：\n  LT - 左上\n  RT - 右上\n  LB - 左下\n  RB - 右下\n  optional\n      * @param {string} [opts.offsetX] - 水平偏移。\n当 offsetUnit &#x3D; pixel 时，取值范围为 [8, 4088] 整数\n当 offsetUnit &#x3D; percent 时，取值范围为 [0, 100] 小数\n  optional\n      * @param {string} [opts.offsetY] - 竖直偏移。\n当 offsetUnit &#x3D; pixel 时，取值范围为 [8, 4088] 整数\n当 offsetUnit &#x3D; percent 时，取值范围为 [0, 100] 小数\n  optional\n      * @param {string} [opts.offsetUnit] - 偏移单位。取值范围：\n  pixel - 像素\n  percent - 百分比\n默认值为 pixel\n  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param watermarkObject resultObject\n      */\n\n  updateWatermark (opts, callback) {\n    opts = opts || {}\n\n    if (opts.watermarkId === undefined || opts.watermarkId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.watermarkId' when calling updateWatermark\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.imgUrl !== undefined && opts.imgUrl !== null) {\n      postBody['imgUrl'] = opts.imgUrl\n    }\n    if (opts.width !== undefined && opts.width !== null) {\n      postBody['width'] = opts.width\n    }\n    if (opts.height !== undefined && opts.height !== null) {\n      postBody['height'] = opts.height\n    }\n    if (opts.sizeUnit !== undefined && opts.sizeUnit !== null) {\n      postBody['sizeUnit'] = opts.sizeUnit\n    }\n    if (opts.widthRef !== undefined && opts.widthRef !== null) {\n      postBody['widthRef'] = opts.widthRef\n    }\n    if (opts.heightRef !== undefined && opts.heightRef !== null) {\n      postBody['heightRef'] = opts.heightRef\n    }\n    if (opts.position !== undefined && opts.position !== null) {\n      postBody['position'] = opts.position\n    }\n    if (opts.offsetX !== undefined && opts.offsetX !== null) {\n      postBody['offsetX'] = opts.offsetX\n    }\n    if (opts.offsetY !== undefined && opts.offsetY !== null) {\n      postBody['offsetY'] = opts.offsetY\n    }\n    if (opts.offsetUnit !== undefined && opts.offsetUnit !== null) {\n      postBody['offsetUnit'] = opts.offsetUnit\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      watermarkId: opts.watermarkId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateWatermark with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarks/{watermarkId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除水印\n      * @param {Object} opts - parameters\n      * @param {integer} opts.watermarkId - 水印ID\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteWatermark (opts, callback) {\n    opts = opts || {}\n\n    if (opts.watermarkId === undefined || opts.watermarkId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.watermarkId' when calling deleteWatermark\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      watermarkId: opts.watermarkId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vod/1.2.1'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteWatermark with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/watermarks/{watermarkId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = VOD\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/vpc/v1/vpc.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Vpc-Policy\n * vpc支持oss权限访问控制相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'vpc'\nService._services[serviceId] = true\n\n/**\n * vpc service.\n * @version 1.1.5\n */\n\nclass VPC extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'vpc.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *\n查询共享带宽包列表\n\n## 接口说明\n\n- 使用 &#x60;filters&#x60; 过滤器进行条件筛选，每个 &#x60;filter&#x60; 之间的关系为逻辑与（AND）的关系。\n\n- 如果使用子帐号查询，只会查询到该子帐号有权限的云主机实例。关于资源权限请参考 [IAM概述](https://docs.jdcloud.com/cn/iam/product-overview)。\n\n- 单次查询最大可查询100条共享带宽包数据。\n\n- 尽量一次调用接口查询多条数据，不建议使用该批量查询接口一次查询一条数据，如果使用不当导致查询过于密集，可能导致网关触发限流。\n\n- 由于该接口为 &#x60;GET&#x60; 方式请求，最终参数会转换为 &#x60;URL&#x60; 上的参数，但是 &#x60;HTTP&#x60; 协议下的 &#x60;GET&#x60; 请求参数长度是有大小限制的，使用者需要注意参数超长的问题。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围为[10,100]  optional\n      * @param {filter} [opts.filters] - bwpIds - 共享带宽包ID，支持多个进行精确搜索\nname - 共享带宽包名称，支持单个进行精确搜索\n  optional\n      * @param {tagFilter} [opts.tags] - Tag筛选条件  optional\n      * @param {string} [opts.resourceGroupIds] - 资源组筛选条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bandwidthPackage bandwidthPackages\n      * @param integer totalCount  总数量\n      */\n\n  describeBandwidthPackages (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBandwidthPackages\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.resourceGroupIds, 'resourceGroupIds')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBandwidthPackages with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  指定地域创建共享带宽包实例。\n\n## 接口说明\n\n- 需要接口完成实名认证、支付方式确认、计费类型选择等准备工作。\n\n- 各地域下包年包月和按配置计费的共享带宽包不受配额限制，按用量计费的共享带宽包可创建数量受配额限制，创建前请通过 [DescribeQuotas](https://docs.jdcloud.com/cn/shared-bandwidth-package/api/describequotas?content&#x3D;API) 确认配额，如须提升请[提交工单](https://ticket.jdcloud.com/applyorder/submit)或联系京东云客服。\n\n- 通过本接口创建包年包月资源时将自动从账户扣款（代金券优先），如需使用第三方支付方式请通过控制台创建。\n\n- 按用量计费模式需提工单申请使用权限，默认支持增强95消峰计费。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 名称，只支持中文、数字、大小写字母、英文下划线“_”及中划线“-”，且长度不超过32个字符\n      * @param {string} [opts.description] - 描述，长度不超过256个字符  optional\n      * @param {integer} opts.bandwidthMbps - 共享带宽包带宽上限，取值范围200-5000，单位为Mbps，保底带宽 &#x3D; 共享带宽包带宽上限 * 20%\n      * @param {string} [opts.provider] - 线路信息，默认bgp，目前只支持中心节点的BGP线路  optional\n      * @param {chargeSpec} [opts.chargeSpec] - 计费配置。支持包年包月、按配置、按用量计费模式  optional\n      * @param {array} [opts.userTags] - 用户标签  optional\n      * @param {string} [opts.resourceGroupId] - 资源所属资源组ID  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string bandwidthPackageId  共享带宽包ID\n      * @param string requestId  请求ID\n      */\n\n  createBandwidthPackage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createBandwidthPackage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createBandwidthPackage\"\n      )\n    }\n    if (opts.bandwidthMbps === undefined || opts.bandwidthMbps === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthMbps' when calling createBandwidthPackage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.bandwidthMbps !== undefined && opts.bandwidthMbps !== null) {\n      postBody['bandwidthMbps'] = opts.bandwidthMbps\n    }\n    if (opts.provider !== undefined && opts.provider !== null) {\n      postBody['provider'] = opts.provider\n    }\n    if (opts.chargeSpec !== undefined && opts.chargeSpec !== null) {\n      postBody['chargeSpec'] = opts.chargeSpec\n    }\n    if (opts.userTags !== undefined && opts.userTags !== null) {\n      postBody['userTags'] = opts.userTags\n    }\n    if (opts.resourceGroupId !== undefined && opts.resourceGroupId !== null) {\n      postBody['resourceGroupId'] = opts.resourceGroupId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createBandwidthPackage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n共享带宽包资源信息详情\n\n## 接口说明\n\n- 该接口与查询共享带宽包列表返回的信息一致。\n\n- 只需要查询单个共享带宽包详细信息的时候可以调用该接口。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bandwidthPackageId - 共享带宽包ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param bandwidthPackage bandwidthPackage  共享带宽包资源信息\n      */\n\n  describeBandwidthPackage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeBandwidthPackage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.bandwidthPackageId === undefined ||\n      opts.bandwidthPackageId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthPackageId' when calling describeBandwidthPackage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bandwidthPackageId: opts.bandwidthPackageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeBandwidthPackage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/{bandwidthPackageId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n修改共享带宽包信息，包括带宽上限及共享带宽包名称、描述信息。\n\n## 接口说明\n\n- 如共享带宽包中的弹性公网 IP 有单独限速。共享带宽包的带宽上限值不能低于其包含任一弹性公网IP的带宽上限值。\n\n- 欠费或到期的共享带宽包资源不支持修改带宽上限。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bandwidthPackageId - 共享带宽包ID\n      * @param {integer} [opts.bandwidthMbps] - 共享带宽包带宽上限，取值范围200-5000，单位为Mbps，且不能低于共享带宽包内公网IP带宽上限  optional\n      * @param {string} [opts.name] - 名称，只支持中文、数字、大小写字母、英文下划线“_”及中划线“-”，且长度不超过32个字符  optional\n      * @param {string} [opts.description] - 描述，长度不超过256个字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyBandwidthPackage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBandwidthPackage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.bandwidthPackageId === undefined ||\n      opts.bandwidthPackageId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthPackageId' when calling modifyBandwidthPackage\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.bandwidthMbps !== undefined && opts.bandwidthMbps !== null) {\n      postBody['bandwidthMbps'] = opts.bandwidthMbps\n    }\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bandwidthPackageId: opts.bandwidthPackageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBandwidthPackage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/{bandwidthPackageId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除共享带宽包\n\n## 接口说明\n\n- 当共享带宽包内有公网IP存在时、包年包月类型的共享带宽包未到期时、按用量计费的共享带宽包使用时长未满一个完整的自然月时均不支持删除共享带宽包\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bandwidthPackageId - 共享带宽包ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteBandwidthPackage (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteBandwidthPackage\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.bandwidthPackageId === undefined ||\n      opts.bandwidthPackageId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthPackageId' when calling deleteBandwidthPackage\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bandwidthPackageId: opts.bandwidthPackageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteBandwidthPackage with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/{bandwidthPackageId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n向共享带宽包内增加公网IP\n\n## 接口说明\n\n- 确保已有至少一个共享带宽包资源。\n\n- 添加弹性公网IP前，需确保弹性公网IP所在地域与共享带宽包地域和线路相同，弹性公网IP的计费模式为按配置或按用量计费，且未加入其他的共享带宽包资源。\n\n- 已欠费的、包年包月的公网IP不能加入共享带宽包。\n\n- 一个公网IP同时只能加入一个共享带宽包。\n\n- 共享带宽包中可添加的弹性公网IP受配额限制，添加前请通过 [DescribeQuotas](https://docs.jdcloud.com/cn/shared-bandwidth-package/api/describequotas?content&#x3D;API) 确认配额，如须提升请[提交工单](https://ticket.jdcloud.com/applyorder/submit)或联系京东云客服。\n\n- 弹性公网IP加入共享带宽包后，弹性公网 IP 会原有的计费和带宽上限暂时失效，已共享带宽包进行计费，带宽上限默认为共享带宽包的带宽上限，可通过[modifyBandwidthPackageIpBandwidth](https://docs.jdcloud.com/cn/shared-bandwidth-package/api/modifybandwidthpackageIpbandwidth)进行修改。\n\n- 共享带宽包欠费或到期停服后不支持添加弹性公网IP。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bandwidthPackageId - 共享带宽包ID\n      * @param {array} [opts.bandwidthPackageIPSpecs] - Ip列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addBandwidthPackageIP (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addBandwidthPackageIP\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.bandwidthPackageId === undefined ||\n      opts.bandwidthPackageId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthPackageId' when calling addBandwidthPackageIP\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.bandwidthPackageIPSpecs !== undefined &&\n      opts.bandwidthPackageIPSpecs !== null\n    ) {\n      postBody['bandwidthPackageIPSpecs'] = opts.bandwidthPackageIPSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bandwidthPackageId: opts.bandwidthPackageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addBandwidthPackageIP with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/{bandwidthPackageId}:addBandwidthPackageIP',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n从共享带宽包内移除公网IP\n\n## 接口说明\n\n-  弹性公网IP从共享带宽包中移除后，恢复原有的计费模式和带宽上限。\n\n-  共享带宽包是否计费与共享带宽包中有无弹性公网IP无关，如共享带宽包中无弹性公网IP资源时请及时删除资源，避免产生额外费用\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bandwidthPackageId - 共享带宽包ID\n      * @param {array} [opts.bandwidthPackageIPSpecs] - 公网IP列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removeBandwidthPackageIP (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  removeBandwidthPackageIP\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.bandwidthPackageId === undefined ||\n      opts.bandwidthPackageId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthPackageId' when calling removeBandwidthPackageIP\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.bandwidthPackageIPSpecs !== undefined &&\n      opts.bandwidthPackageIPSpecs !== null\n    ) {\n      postBody['bandwidthPackageIPSpecs'] = opts.bandwidthPackageIPSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bandwidthPackageId: opts.bandwidthPackageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeBandwidthPackageIP with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/{bandwidthPackageId}:removeBandwidthPackageIP',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *\n修改共享带宽包内弹性公网 IP 的带宽上限。\n\n## 接口说明\n\n- 共享带宽包中弹性公网IP的带宽上限不能高于共享带宽包的带宽上限。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.bandwidthPackageId - 共享带宽包ID\n      * @param {array} [opts.bandwidthPackageIPSpecs] - Ip列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyBandwidthPackageIpBandwidth (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyBandwidthPackageIpBandwidth\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.bandwidthPackageId === undefined ||\n      opts.bandwidthPackageId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthPackageId' when calling modifyBandwidthPackageIpBandwidth\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.bandwidthPackageIPSpecs !== undefined &&\n      opts.bandwidthPackageIPSpecs !== null\n    ) {\n      postBody['bandwidthPackageIPSpecs'] = opts.bandwidthPackageIPSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      bandwidthPackageId: opts.bandwidthPackageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyBandwidthPackageIpBandwidth with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/bandwidthPackages/{bandwidthPackageId}:modifyBandwidthPackageIpBandwidth',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询弹性公网IP列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - elasticIpIds - elasticip id数组条件，支持多个\nelasticIpAddress - eip的IP地址，支持单个\nchargeStatus - eip的费用支付状态,normal(正常状态) or overdue(预付费已到期) or arrear(欠费状态)，支持单个\nipType - eip类型，取值：all(所有类型)、standard(标准弹性IP)、edge(边缘弹性IP)，默认standard，支持单个\nazs - eip可用区，支持多个\nbandwidthPackageId - 共享带宽包ID，支持单个\nstatus - IP是否被绑定，取值：ASSOCIATED（被绑定）、NOT_ASSOCIATED（未被绑定）、ALL（全部）。支持单个\n  optional\n      * @param {tagFilter} [opts.tags] - Tag筛选条件  optional\n      * @param {string} [opts.resourceGroupIds] - 资源组筛选条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param elasticIp elasticIps\n      * @param integer totalCount  总数量\n      */\n\n  describeElasticIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeElasticIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n    Object.assign(\n      queryParams,\n      super.buildArrayParam(opts.resourceGroupIds, 'resourceGroupIds')\n    )\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeElasticIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个或者多个弹性公网IP\n      * @param {Object} opts - parameters\n      * @param {integer} opts.maxCount - 购买弹性ip数量；取值范围：[1,100]\n      * @param {string} [opts.elasticIpAddress] - 指定弹性ip地址进行创建，当申请创建多个弹性ip时，必须为空  optional\n      * @param {elasticIpSpec} opts.elasticIpSpec - 弹性ip规格\n      * @param {array} [opts.userTags] - 用户标签  optional\n      * @param {string} [opts.ipType] - 弹性ip类型，取值：standard(标准公网IP)，edge(边缘公网IP)，默认为standard  optional\n      * @param {string} [opts.resourceGroupId] - 资源所属资源组ID  optional\n      * @param {boolean} [opts.dryRun] - 预检标识，默认false，dryRun为true时只作检查，不做变更  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string elasticIpIds  弹性公网IP ID\n      * @param string requestId  请求ID\n      */\n\n  createElasticIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createElasticIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.maxCount === undefined || opts.maxCount === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.maxCount' when calling createElasticIps\"\n      )\n    }\n    if (opts.elasticIpSpec === undefined || opts.elasticIpSpec === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpSpec' when calling createElasticIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.maxCount !== undefined && opts.maxCount !== null) {\n      postBody['maxCount'] = opts.maxCount\n    }\n    if (opts.elasticIpAddress !== undefined && opts.elasticIpAddress !== null) {\n      postBody['elasticIpAddress'] = opts.elasticIpAddress\n    }\n    if (opts.elasticIpSpec !== undefined && opts.elasticIpSpec !== null) {\n      postBody['elasticIpSpec'] = opts.elasticIpSpec\n    }\n    if (opts.userTags !== undefined && opts.userTags !== null) {\n      postBody['userTags'] = opts.userTags\n    }\n    if (opts.ipType !== undefined && opts.ipType !== null) {\n      postBody['ipType'] = opts.ipType\n    }\n    if (opts.resourceGroupId !== undefined && opts.resourceGroupId !== null) {\n      postBody['resourceGroupId'] = opts.resourceGroupId\n    }\n    if (opts.dryRun !== undefined && opts.dryRun !== null) {\n      postBody['dryRun'] = opts.dryRun\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createElasticIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  ElasticIp资源信息详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.elasticIpId - ElasticIp ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param elasticIp elasticIp  elasticIp资源信息\n      */\n\n  describeElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling describeElasticIp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      elasticIpId: opts.elasticIpId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps/{elasticIpId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改弹性公网IP，当弹性公网IP加入共享带宽包后，此公网IP限速需要调用共享带宽包的接口（修改共享带宽包内公网IP带宽上限）\n      * @param {Object} opts - parameters\n      * @param {string} opts.elasticIpId - ElasticIp ID\n      * @param {integer} opts.bandwidthMbps - 弹性公网IP的限速（单位：Mbps），取值范围为[1-200]\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling modifyElasticIp\"\n      )\n    }\n    if (opts.bandwidthMbps === undefined || opts.bandwidthMbps === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.bandwidthMbps' when calling modifyElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.bandwidthMbps !== undefined && opts.bandwidthMbps !== null) {\n      postBody['bandwidthMbps'] = opts.bandwidthMbps\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      elasticIpId: opts.elasticIpId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps/{elasticIpId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除弹性公网IP，已加入共享带宽包的公网IP不能删除，需要先从共享带宽包移出\n      * @param {Object} opts - parameters\n      * @param {string} opts.elasticIpId - ElasticIp ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.elasticIpId === undefined || opts.elasticIpId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpId' when calling deleteElasticIp\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      elasticIpId: opts.elasticIpId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/elasticIps/{elasticIpId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询NAT网关列表接口\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - natGatewayIds - NAT网关ID列表，支持多个\nnatGatewayNames - NAT网关名称列表，支持多个\nnatGatewayPublicIp - NAT网关公网IP，支持单个，即将废弃，请使用elasticIpAddress\nelasticIpAddress - 公网IP，支持单个\nnatGatewayPrivateIp - NAT网关私网IP，支持单个\nvpcId - NAT网关所属VPC ID，支持单个\nsubnetId - NAT网关所属子网ID，支持单个\n  optional\n      * @param {tagFilter} [opts.tags] - Tag筛选条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param natGateway natGateways\n      * @param number totalCount  总数量\n      */\n\n  describeNatGateways (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNatGateways\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNatGateways with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/natGateways/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建NAT网关接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.natGatewayName - NAT网关名称\n      * @param {string} [opts.natGatewaySpec] - NAT网关规格，取值small（100万并发连接数），medium（300万并发连接数），large（1000万并发连接数），默认small  optional\n      * @param {string} opts.vpcId - 私有网络ID\n      * @param {string} opts.subnetId - 子网ID\n      * @param {array} [opts.azIpSpecs] - NAT网关的可用区属性，即将废弃  optional\n      * @param {array} [opts.azs] - NAT网关可用区  optional\n      * @param {array} [opts.elasticIpIds] - 选择已有公网IP列表。选择已有和新购公网IP可以同时配置，也可以配置其一  optional\n      * @param {integer} [opts.elasticIpCount] - 新购公网IP数量  optional\n      * @param {elasticIpSpec} [opts.elasticIpSpec] - 新购公网IP配置。NAT网关仅支持打包创建标准公网IP，不支持边缘公网IP。且标准公网IP仅支持按配置、按用量两种计费模式。  optional\n      * @param {chargeSpec} [opts.natGatewayCharge] - 计费配置，仅支持按配置，默认按配置  optional\n      * @param {string} [opts.description] - 描述,​ 允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string natGatewayId  NAT网关ID\n      */\n\n  createNatGateway (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createNatGateway\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.natGatewayName === undefined || opts.natGatewayName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.natGatewayName' when calling createNatGateway\"\n      )\n    }\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling createNatGateway\"\n      )\n    }\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling createNatGateway\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.natGatewayName !== undefined && opts.natGatewayName !== null) {\n      postBody['natGatewayName'] = opts.natGatewayName\n    }\n    if (opts.natGatewaySpec !== undefined && opts.natGatewaySpec !== null) {\n      postBody['natGatewaySpec'] = opts.natGatewaySpec\n    }\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      postBody['vpcId'] = opts.vpcId\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n    if (opts.azIpSpecs !== undefined && opts.azIpSpecs !== null) {\n      postBody['azIpSpecs'] = opts.azIpSpecs\n    }\n    if (opts.azs !== undefined && opts.azs !== null) {\n      postBody['azs'] = opts.azs\n    }\n    if (opts.elasticIpIds !== undefined && opts.elasticIpIds !== null) {\n      postBody['elasticIpIds'] = opts.elasticIpIds\n    }\n    if (opts.elasticIpCount !== undefined && opts.elasticIpCount !== null) {\n      postBody['elasticIpCount'] = opts.elasticIpCount\n    }\n    if (opts.elasticIpSpec !== undefined && opts.elasticIpSpec !== null) {\n      postBody['elasticIpSpec'] = opts.elasticIpSpec\n    }\n    if (opts.natGatewayCharge !== undefined && opts.natGatewayCharge !== null) {\n      postBody['natGatewayCharge'] = opts.natGatewayCharge\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createNatGateway with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/natGateways/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询NAT网关信息详情接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.natGatewayId - natGateway ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param natGateway natGateway  natGateway资源信息\n      */\n\n  describeNatGateway (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNatGateway\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.natGatewayId === undefined || opts.natGatewayId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.natGatewayId' when calling describeNatGateway\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      natGatewayId: opts.natGatewayId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNatGateway with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/natGateways/{natGatewayId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改NAT网关接口，修改网关规格或带宽需要先停止网关\n      * @param {Object} opts - parameters\n      * @param {string} opts.natGatewayId - natGateway ID\n      * @param {string} [opts.natGatewayName] - NAT网关名称  optional\n      * @param {string} [opts.description] - 描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} [opts.natGatewaySpec] - NAT网关规格，取值small（100万并发连接数）,medium(300万并发连接数),large（1000万并发连接数）  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyNatGateway (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyNatGateway\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.natGatewayId === undefined || opts.natGatewayId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.natGatewayId' when calling modifyNatGateway\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.natGatewayName !== undefined && opts.natGatewayName !== null) {\n      postBody['natGatewayName'] = opts.natGatewayName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.natGatewaySpec !== undefined && opts.natGatewaySpec !== null) {\n      postBody['natGatewaySpec'] = opts.natGatewaySpec\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      natGatewayId: opts.natGatewayId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyNatGateway with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/natGateways/{natGatewayId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除NAT网关接口，NAT网关需要先停止再删除\n      * @param {Object} opts - parameters\n      * @param {string} opts.natGatewayId - natGateway ID\n      * @param {boolean} [opts.deleteElasticIp] - 是否打包删除公网IP，取值范围：true、false，默认false。true表示删除NAT网关时打包删除其绑定的所有公网IP；false表示删除NAT网关时不删除其绑定的所有公网IP。包年包月公网IP不支持打包删除  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param failedIp failedList\n      */\n\n  deleteNatGateway (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteNatGateway\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.natGatewayId === undefined || opts.natGatewayId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.natGatewayId' when calling deleteNatGateway\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.deleteElasticIp !== undefined && opts.deleteElasticIp !== null) {\n      queryParams['deleteElasticIp'] = opts.deleteElasticIp\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      natGatewayId: opts.natGatewayId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteNatGateway with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/natGateways/{natGatewayId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动NAT网关接口，欠费停服客户不允许启动\n      * @param {Object} opts - parameters\n      * @param {string} opts.natGatewayId - natGateway ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  startNatGateway (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  startNatGateway\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.natGatewayId === undefined || opts.natGatewayId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.natGatewayId' when calling startNatGateway\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      natGatewayId: opts.natGatewayId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call startNatGateway with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/natGateways/{natGatewayId}:startNatGateway',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  停止NAT网关接口，非欠费停服，由客户自己停止的NAT网关继续计费\n      * @param {Object} opts - parameters\n      * @param {string} opts.natGatewayId - natGateway ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  stopNatGateway (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  stopNatGateway\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.natGatewayId === undefined || opts.natGatewayId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.natGatewayId' when calling stopNatGateway\"\n      )\n    }\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      natGatewayId: opts.natGatewayId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call stopNatGateway with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/natGateways/{natGatewayId}:stopNatGateway',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  NAT网关绑定已有公网IP接口，NAT网关支持绑定一个或多个公网IP。当NAT网关绑定多个公网IP时，同一内网服务器的业务流量出公网将随机选取其中一个公网IP。由于每个内网服务器的业务流量大小不同，可能出现NAT多公网IP流量不均的情况。建议将多公网IP加入同一个共享带宽包，避免因业务流量达到单公网IP带宽上限，影响业务转发。\n      * @param {Object} opts - parameters\n      * @param {string} opts.natGatewayId - natGateway ID\n      * @param {array} opts.elasticIpIds - 公网IP列表\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  associateElasticIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateElasticIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.natGatewayId === undefined || opts.natGatewayId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.natGatewayId' when calling associateElasticIps\"\n      )\n    }\n    if (opts.elasticIpIds === undefined || opts.elasticIpIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.elasticIpIds' when calling associateElasticIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpIds !== undefined && opts.elasticIpIds !== null) {\n      postBody['elasticIpIds'] = opts.elasticIpIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      natGatewayId: opts.natGatewayId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateElasticIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/natGateways/{natGatewayId}:associateElasticIps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  解绑NAT网关上的公网IP接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.natGatewayId - natGateway ID\n      * @param {array} [opts.elasticIpIds] - 公网IP ID，当为弹性公网IP时，为elasticIpId。  optional\n      * @param {boolean} [opts.deleteElasticIp] - 解绑后是否删除公网IP，取值范围：true、false,默认为false.true表示解绑公网IP时删除该公网IP;false表示解绑公网IP时不删除公网IP  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param failedIp failedList\n      */\n\n  disassociateElasticIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateElasticIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.natGatewayId === undefined || opts.natGatewayId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.natGatewayId' when calling disassociateElasticIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpIds !== undefined && opts.elasticIpIds !== null) {\n      postBody['elasticIpIds'] = opts.elasticIpIds\n    }\n    if (opts.deleteElasticIp !== undefined && opts.deleteElasticIp !== null) {\n      postBody['deleteElasticIp'] = opts.deleteElasticIp\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      natGatewayId: opts.natGatewayId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateElasticIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/natGateways/{natGatewayId}:disassociateElasticIps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置NAT网关已绑定的公网IP状态接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.natGatewayId - natGateway ID\n      * @param {array} [opts.elasticIpIds] - 公网IP列表  optional\n      * @param {string} opts.status - 公网ip状态，取值范围：online、offline。online表示将NAT绑定的公网IP上线，上线后公网IP可正常转发流量;offline表示将NAT绑定的公网IP下线，下线后，公网IP将不再接受新建连接，已有连接将继续转发流量，从而实现公网IP平滑下线。已下线的公网IP不会自动从NAT网关解绑，如需解绑请执行解绑操作\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setElasticIpStatus (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setElasticIpStatus\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.natGatewayId === undefined || opts.natGatewayId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.natGatewayId' when calling setElasticIpStatus\"\n      )\n    }\n    if (opts.status === undefined || opts.status === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.status' when calling setElasticIpStatus\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpIds !== undefined && opts.elasticIpIds !== null) {\n      postBody['elasticIpIds'] = opts.elasticIpIds\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      postBody['status'] = opts.status\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      natGatewayId: opts.natGatewayId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setElasticIpStatus with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/natGateways/{natGatewayId}:setElasticIpStatus',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询Acl列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - networkAclIds - networkAcl ID列表，支持多个\nnetworkAclNames - networkAcl名称列表，支持多个\nvpcId - networkAcl所属vpc Id，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param networkAcl networkAcls\n      * @param number totalCount  总数量\n      */\n\n  describeNetworkAcls (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNetworkAcls\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNetworkAcls with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkAcls/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建networkAcl接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - 私有网络id\n      * @param {string} opts.networkAclName - networkAcl名称\n      * @param {string} [opts.description] - 描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string networkAclId  networkAcl ID\n      */\n\n  createNetworkAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createNetworkAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling createNetworkAcl\"\n      )\n    }\n    if (opts.networkAclName === undefined || opts.networkAclName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkAclName' when calling createNetworkAcl\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      postBody['vpcId'] = opts.vpcId\n    }\n    if (opts.networkAclName !== undefined && opts.networkAclName !== null) {\n      postBody['networkAclName'] = opts.networkAclName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createNetworkAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkAcls/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询networkAcl资源详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkAclId - networkAclId ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param networkAcl networkAcl  networkAcl资源信息\n      */\n\n  describeNetworkAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNetworkAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.networkAclId === undefined || opts.networkAclId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkAclId' when calling describeNetworkAcl\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkAclId: opts.networkAclId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNetworkAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkAcls/{networkAclId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改networkAcl接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkAclId - networkAclId ID\n      * @param {string} [opts.networkAclName] - networkAcl名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符  optional\n      * @param {string} [opts.description] - 描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyNetworkAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyNetworkAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.networkAclId === undefined || opts.networkAclId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkAclId' when calling modifyNetworkAcl\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.networkAclName !== undefined && opts.networkAclName !== null) {\n      postBody['networkAclName'] = opts.networkAclName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkAclId: opts.networkAclId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyNetworkAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkAcls/{networkAclId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除networkAcl接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkAclId - networkAclId ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteNetworkAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteNetworkAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.networkAclId === undefined || opts.networkAclId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkAclId' when calling deleteNetworkAcl\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkAclId: opts.networkAclId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteNetworkAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkAcls/{networkAclId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  给子网绑定networkAcl接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkAclId - networkAclId ID\n      * @param {array} opts.subnetIds - networkAcl要绑定的子网ID列表, subnet已被其他networkAcl绑定时，自动解绑\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  associateNetworkAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateNetworkAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.networkAclId === undefined || opts.networkAclId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkAclId' when calling associateNetworkAcl\"\n      )\n    }\n    if (opts.subnetIds === undefined || opts.subnetIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetIds' when calling associateNetworkAcl\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subnetIds !== undefined && opts.subnetIds !== null) {\n      postBody['subnetIds'] = opts.subnetIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkAclId: opts.networkAclId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateNetworkAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkAcls/{networkAclId}:associateNetworkAcl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  给子网解绑NetworkAcl接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkAclId - networkAclId ID\n      * @param {string} opts.subnetId - networkAcl要解绑的子网ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disassociateNetworkAcl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateNetworkAcl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.networkAclId === undefined || opts.networkAclId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkAclId' when calling disassociateNetworkAcl\"\n      )\n    }\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling disassociateNetworkAcl\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkAclId: opts.networkAclId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateNetworkAcl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkAcls/{networkAclId}:disassociateNetworkAcl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加networkAcl规则接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkAclId - networkAclId ID\n      * @param {array} [opts.networkAclRuleSpecs] - networkAcl规则列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addNetworkAclRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addNetworkAclRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.networkAclId === undefined || opts.networkAclId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkAclId' when calling addNetworkAclRules\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.networkAclRuleSpecs !== undefined &&\n      opts.networkAclRuleSpecs !== null\n    ) {\n      postBody['networkAclRuleSpecs'] = opts.networkAclRuleSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkAclId: opts.networkAclId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addNetworkAclRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkAcls/{networkAclId}:addNetworkAclRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  移除networkAcl规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkAclId - networkAclId ID\n      * @param {array} opts.ruleIds - networkAcl规则ID列表\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removeNetworkAclRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  removeNetworkAclRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.networkAclId === undefined || opts.networkAclId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkAclId' when calling removeNetworkAclRules\"\n      )\n    }\n    if (opts.ruleIds === undefined || opts.ruleIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleIds' when calling removeNetworkAclRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ruleIds !== undefined && opts.ruleIds !== null) {\n      postBody['ruleIds'] = opts.ruleIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkAclId: opts.networkAclId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeNetworkAclRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkAcls/{networkAclId}:removeNetworkAclRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改networkAcl接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkAclId - networkAclId ID\n      * @param {array} [opts.modifyNetworkAclRuleSpecs] - networkAcl规则列表  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyNetworkAclRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyNetworkAclRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.networkAclId === undefined || opts.networkAclId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkAclId' when calling modifyNetworkAclRules\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.modifyNetworkAclRuleSpecs !== undefined &&\n      opts.modifyNetworkAclRuleSpecs !== null\n    ) {\n      postBody['modifyNetworkAclRuleSpecs'] = opts.modifyNetworkAclRuleSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkAclId: opts.networkAclId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyNetworkAclRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkAcls/{networkAclId}:modifyNetworkAclRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询弹性网卡列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - networkInterfaceIds - 弹性网卡ID列表，支持多个\nnetworkInterfaceNames - 弹性网卡名称列表，支持多个\nvpcId - 弹性网卡所属vpc Id，支持单个\nsubnetId - 弹性网卡所属子网Id，支持单个\nrole - 网卡角色，取值范围：Primary（主网卡）、Secondary（辅助网卡）、Managed （受管网卡），支持多个\nazType - 网卡 az类型，取值：all(全部类型)，standard(标准Az网卡)，edge(边缘Az网卡)，默认为all，支持单个\nazs - 可用区 az名，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param networkInterface networkInterfaces\n      * @param number totalCount  总数量\n      */\n\n  describeNetworkInterfaces (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNetworkInterfaces\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNetworkInterfaces with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkInterfaces/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建网卡接口，只能创建辅助网卡\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - 子网ID\n      * @param {string} [opts.az] - 可用区，用户的默认可用区，该参数无效，不建议使用  optional\n      * @param {string} [opts.networkInterfaceName] - 网卡名称，只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符。  optional\n      * @param {string} [opts.primaryIpAddress] - 网卡主IP，如果不指定，会自动从子网中分配  optional\n      * @param {array} [opts.secondaryIpAddresses] - SecondaryIp列表  optional\n      * @param {integer} [opts.secondaryIpCount] - 自动分配的SecondaryIp数量  optional\n      * @param {array} [opts.securityGroups] - 要绑定的安全组ID列表，最多指定5个安全组  optional\n      * @param {integer} [opts.sanityCheck] - 源和目标IP地址校验，取值为0或者1,默认为1  optional\n      * @param {string} [opts.description] - 描述,​ 允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string networkInterfaceId  弹性网卡Id\n      */\n\n  createNetworkInterface (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createNetworkInterface\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling createNetworkInterface\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n    if (opts.az !== undefined && opts.az !== null) {\n      postBody['az'] = opts.az\n    }\n    if (\n      opts.networkInterfaceName !== undefined &&\n      opts.networkInterfaceName !== null\n    ) {\n      postBody['networkInterfaceName'] = opts.networkInterfaceName\n    }\n    if (opts.primaryIpAddress !== undefined && opts.primaryIpAddress !== null) {\n      postBody['primaryIpAddress'] = opts.primaryIpAddress\n    }\n    if (\n      opts.secondaryIpAddresses !== undefined &&\n      opts.secondaryIpAddresses !== null\n    ) {\n      postBody['secondaryIpAddresses'] = opts.secondaryIpAddresses\n    }\n    if (opts.secondaryIpCount !== undefined && opts.secondaryIpCount !== null) {\n      postBody['secondaryIpCount'] = opts.secondaryIpCount\n    }\n    if (opts.securityGroups !== undefined && opts.securityGroups !== null) {\n      postBody['securityGroups'] = opts.securityGroups\n    }\n    if (opts.sanityCheck !== undefined && opts.sanityCheck !== null) {\n      postBody['sanityCheck'] = opts.sanityCheck\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createNetworkInterface with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkInterfaces/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询弹性网卡信息详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkInterfaceId - networkInterface ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param networkInterface networkInterface  networkInterface资源信息\n      */\n\n  describeNetworkInterface (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNetworkInterface\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling describeNetworkInterface\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkInterfaceId: opts.networkInterfaceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNetworkInterface with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkInterfaces/{networkInterfaceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改弹性网卡信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkInterfaceId - networkInterface ID\n      * @param {string} [opts.networkInterfaceName] - 弹性网卡名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符  optional\n      * @param {string} [opts.description] - 描述,允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {array} [opts.securityGroups] - 以覆盖原有安全组的方式更新的安全组。如果更新安全组ID列表，最多5个安全组  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyNetworkInterface (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyNetworkInterface\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling modifyNetworkInterface\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.networkInterfaceName !== undefined &&\n      opts.networkInterfaceName !== null\n    ) {\n      postBody['networkInterfaceName'] = opts.networkInterfaceName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.securityGroups !== undefined && opts.securityGroups !== null) {\n      postBody['securityGroups'] = opts.securityGroups\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkInterfaceId: opts.networkInterfaceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyNetworkInterface with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkInterfaces/{networkInterfaceId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除弹性网卡\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkInterfaceId - networkInterface ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteNetworkInterface (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteNetworkInterface\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling deleteNetworkInterface\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkInterfaceId: opts.networkInterfaceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteNetworkInterface with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkInterfaces/{networkInterfaceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  给网卡绑定弹性Ip接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkInterfaceId - networkInterface ID\n      * @param {string} [opts.elasticIpId] - 绑定的弹性Ip Id  optional\n      * @param {string} [opts.privateIpAddress] - 绑定弹性Ip到指定的privateIp  optional\n      * @param {string} [opts.elasticIpAddress] - 绑定的弹性Ip地址  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  associateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling associateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n    if (opts.privateIpAddress !== undefined && opts.privateIpAddress !== null) {\n      postBody['privateIpAddress'] = opts.privateIpAddress\n    }\n    if (opts.elasticIpAddress !== undefined && opts.elasticIpAddress !== null) {\n      postBody['elasticIpAddress'] = opts.elasticIpAddress\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkInterfaceId: opts.networkInterfaceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkInterfaces/{networkInterfaceId}:associateElasticIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  给网卡解绑弹性Ip接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkInterfaceId - networkInterface ID\n      * @param {string} [opts.elasticIpId] - 指定解绑的弹性Ip Id  optional\n      * @param {string} [opts.elasticIpAddress] - 指定解绑的弹性Ip地址  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disassociateElasticIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateElasticIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling disassociateElasticIp\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.elasticIpId !== undefined && opts.elasticIpId !== null) {\n      postBody['elasticIpId'] = opts.elasticIpId\n    }\n    if (opts.elasticIpAddress !== undefined && opts.elasticIpAddress !== null) {\n      postBody['elasticIpAddress'] = opts.elasticIpAddress\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkInterfaceId: opts.networkInterfaceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateElasticIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkInterfaces/{networkInterfaceId}:disassociateElasticIp',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  给网卡分配secondaryIp\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkInterfaceId - networkInterface ID\n      * @param {boolean} [opts.force] - secondary ip被其他接口占用时，是否抢占。false：非抢占重分配，true：抢占重分配；按网段分配时，默认非抢占重分配，指定IP或者个数时，默认抢占重分配。  optional\n      * @param {array} [opts.secondaryIps] - 指定分配的secondaryIp地址  optional\n      * @param {number} [opts.secondaryIpCount] - 指定自动分配的secondaryIp个数  optional\n      * @param {integer} [opts.secondaryIpMaskLen] - 指定分配的网段掩码长度, 支持24-28位掩码长度，不能与secondaryIpCount或secondaryIps同时指定，不支持抢占重分配  optional\n      * @param {string} [opts.secondaryIpAddress] - 指定分配的网段中第一个secondaryIp地址，不能与secondaryIpCount或secondaryIps同时指定，secondaryIpAddress与secondaryIpMaskLen需要保持一致，否则无法创建  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  assignSecondaryIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  assignSecondaryIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling assignSecondaryIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.force !== undefined && opts.force !== null) {\n      postBody['force'] = opts.force\n    }\n    if (opts.secondaryIps !== undefined && opts.secondaryIps !== null) {\n      postBody['secondaryIps'] = opts.secondaryIps\n    }\n    if (opts.secondaryIpCount !== undefined && opts.secondaryIpCount !== null) {\n      postBody['secondaryIpCount'] = opts.secondaryIpCount\n    }\n    if (\n      opts.secondaryIpMaskLen !== undefined &&\n      opts.secondaryIpMaskLen !== null\n    ) {\n      postBody['secondaryIpMaskLen'] = opts.secondaryIpMaskLen\n    }\n    if (\n      opts.secondaryIpAddress !== undefined &&\n      opts.secondaryIpAddress !== null\n    ) {\n      postBody['secondaryIpAddress'] = opts.secondaryIpAddress\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkInterfaceId: opts.networkInterfaceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call assignSecondaryIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkInterfaces/{networkInterfaceId}:assignSecondaryIps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  给网卡删除secondaryIp\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkInterfaceId - networkInterface ID\n      * @param {array} [opts.secondaryIps] - 指定删除的secondaryIp地址  optional\n      * @param {array} [opts.secondaryCidrs] - 指定删除的secondaryIp网段  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  unassignSecondaryIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  unassignSecondaryIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling unassignSecondaryIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.secondaryIps !== undefined && opts.secondaryIps !== null) {\n      postBody['secondaryIps'] = opts.secondaryIps\n    }\n    if (opts.secondaryCidrs !== undefined && opts.secondaryCidrs !== null) {\n      postBody['secondaryCidrs'] = opts.secondaryCidrs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkInterfaceId: opts.networkInterfaceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call unassignSecondaryIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkInterfaces/{networkInterfaceId}:unassignSecondaryIps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询安全组列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - networkSecurityGroupIds - 安全组ID列表，支持多个\nnetworkSecurityGroupNames - 安全组名称列表，支持多个\nvpcId - 安全组所属vpc Id，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param networkSecurityGroup networkSecurityGroups\n      * @param number totalCount  总数量\n      */\n\n  describeNetworkSecurityGroups (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNetworkSecurityGroups\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNetworkSecurityGroups with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkSecurityGroups/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建安全组\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - 私有网络ID\n      * @param {string} opts.networkSecurityGroupName - 安全组名称，只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符。\n      * @param {string} [opts.description] - 描述,​ 允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string networkSecurityGroupId  安全组ID\n      */\n\n  createNetworkSecurityGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createNetworkSecurityGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling createNetworkSecurityGroup\"\n      )\n    }\n    if (\n      opts.networkSecurityGroupName === undefined ||\n      opts.networkSecurityGroupName === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkSecurityGroupName' when calling createNetworkSecurityGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      postBody['vpcId'] = opts.vpcId\n    }\n    if (\n      opts.networkSecurityGroupName !== undefined &&\n      opts.networkSecurityGroupName !== null\n    ) {\n      postBody['networkSecurityGroupName'] = opts.networkSecurityGroupName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createNetworkSecurityGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkSecurityGroups/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询安全组信息详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkSecurityGroupId - NetworkSecurityGroup ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param networkSecurityGroup networkSecurityGroup  安全组资源信息\n      */\n\n  describeNetworkSecurityGroup (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNetworkSecurityGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkSecurityGroupId === undefined ||\n      opts.networkSecurityGroupId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkSecurityGroupId' when calling describeNetworkSecurityGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkSecurityGroupId: opts.networkSecurityGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNetworkSecurityGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkSecurityGroups/{networkSecurityGroupId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改安全组属性\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkSecurityGroupId - NetworkSecurityGroup ID\n      * @param {string} [opts.networkSecurityGroupName] - 安全组的名字。名称取值范围：1-32个中文、英文大小写的字母、数字和下划线分隔符  optional\n      * @param {string} [opts.description] - 安全组的描述，取值范围：0-256个UTF-8编码下的全部字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyNetworkSecurityGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyNetworkSecurityGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkSecurityGroupId === undefined ||\n      opts.networkSecurityGroupId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkSecurityGroupId' when calling modifyNetworkSecurityGroup\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.networkSecurityGroupName !== undefined &&\n      opts.networkSecurityGroupName !== null\n    ) {\n      postBody['networkSecurityGroupName'] = opts.networkSecurityGroupName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkSecurityGroupId: opts.networkSecurityGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyNetworkSecurityGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkSecurityGroups/{networkSecurityGroupId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除安全组\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkSecurityGroupId - NetworkSecurityGroup ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteNetworkSecurityGroup (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteNetworkSecurityGroup\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkSecurityGroupId === undefined ||\n      opts.networkSecurityGroupId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkSecurityGroupId' when calling deleteNetworkSecurityGroup\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkSecurityGroupId: opts.networkSecurityGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteNetworkSecurityGroup with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkSecurityGroups/{networkSecurityGroupId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加安全组规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkSecurityGroupId - NetworkSecurityGroup ID\n      * @param {array} [opts.networkSecurityGroupRuleSpecs] - 安全组规则信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param securityGroupRule securityGroupRules\n      */\n\n  addNetworkSecurityGroupRules (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addNetworkSecurityGroupRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkSecurityGroupId === undefined ||\n      opts.networkSecurityGroupId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkSecurityGroupId' when calling addNetworkSecurityGroupRules\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.networkSecurityGroupRuleSpecs !== undefined &&\n      opts.networkSecurityGroupRuleSpecs !== null\n    ) {\n      postBody['networkSecurityGroupRuleSpecs'] =\n        opts.networkSecurityGroupRuleSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkSecurityGroupId: opts.networkSecurityGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addNetworkSecurityGroupRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkSecurityGroups/{networkSecurityGroupId}:addNetworkSecurityGroupRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  移除安全组规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkSecurityGroupId - NetworkSecurityGroup ID\n      * @param {array} opts.ruleIds - 安全组规则Id列表\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removeNetworkSecurityGroupRules (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  removeNetworkSecurityGroupRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkSecurityGroupId === undefined ||\n      opts.networkSecurityGroupId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkSecurityGroupId' when calling removeNetworkSecurityGroupRules\"\n      )\n    }\n    if (opts.ruleIds === undefined || opts.ruleIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleIds' when calling removeNetworkSecurityGroupRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ruleIds !== undefined && opts.ruleIds !== null) {\n      postBody['ruleIds'] = opts.ruleIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkSecurityGroupId: opts.networkSecurityGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeNetworkSecurityGroupRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkSecurityGroups/{networkSecurityGroupId}:removeNetworkSecurityGroupRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改安全组规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkSecurityGroupId - NetworkSecurityGroup ID\n      * @param {array} [opts.modifySecurityGroupRuleSpecs] - 安全组规则信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyNetworkSecurityGroupRules (\n    opts,\n    regionId = this.config.regionId,\n    callback\n  ) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyNetworkSecurityGroupRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkSecurityGroupId === undefined ||\n      opts.networkSecurityGroupId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkSecurityGroupId' when calling modifyNetworkSecurityGroupRules\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.modifySecurityGroupRuleSpecs !== undefined &&\n      opts.modifySecurityGroupRuleSpecs !== null\n    ) {\n      postBody['modifySecurityGroupRuleSpecs'] =\n        opts.modifySecurityGroupRuleSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkSecurityGroupId: opts.networkSecurityGroupId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyNetworkSecurityGroupRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/networkSecurityGroups/{networkSecurityGroupId}:modifyNetworkSecurityGroupRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询配额信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.type - 资源类型，取值范围：vpc、elastic_ip、subnet、security_group、vpcpeering、network_interface（配额只统计辅助网卡）、acl、aclRule、routeTable、staticRoute、propagatedRoute、securityGroupRule、network_interface_cidr、bwpByUsage、bandwidthPackageIp、natGateway、natGatewayFip、trafficMirrorSession、trafficMirrorFilter、trafficMirrorFilterRule、trafficMirrorSource,haVip,haVipBinding\n      * @param {string} [opts.parentResourceId] - type为vpc、elastic_ip、network_interface、bwpByUsage、natGateway、trafficMirrorSession、trafficMirrorFilter不设置, type为subnet、security_group、vpcpeering、acl、routeTable设置为vpcId, type为aclRule设置为aclId, type为staticRoute、propagatedRoute设置为routeTableId, type为securityGroupRule为securityGroupId, type为network_interface_cidr设置为networkInterfaceId，type为bandwidthPackageIp设置为bandwidthPackageId，natGatewayFip设置为natGatewayId,trafficMirrorFilterRule设置为trafficMirrorFilterId,trafficMirrorSource设置为trafficMirrorSessionId,haVip设置为vpcId,haVipBinding设置为haVipId  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object quota\n      */\n\n  describeQuota (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeQuota\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.type === undefined || opts.type === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.type' when calling describeQuota\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n    if (opts.parentResourceId !== undefined && opts.parentResourceId !== null) {\n      queryParams['parentResourceId'] = opts.parentResourceId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeQuota with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/quotas/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询路由表列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - routeTableIds - 路由表ID列表，支持多个\nrouteTableNames - 路由表名称列表，支持多个\nvpcId - 路由表所属vpc Id，支持单个\nazType - 路由表az类型，取值：all(全部类型)，standard(标准路由表)，edge(边缘路由表)，默认standard ，支持单个\nassociateType - 绑定资源类型，取值：subnet，gateway，支持单个\nazs - 可用区，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param routeTable routeTables\n      * @param number totalCount  总数量\n      */\n\n  describeRouteTables (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRouteTables\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRouteTables with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/routeTables/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建路由表\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - 路由表所属的私有网络ID\n      * @param {string} opts.routeTableName - 路由表名称，只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符。\n      * @param {string} [opts.description] - 描述，允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} [opts.associateType] - 绑定资源类型，取值：subnet(缺省时默认值)，gateway  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string routeTableId  路由表ID\n      */\n\n  createRouteTable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createRouteTable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling createRouteTable\"\n      )\n    }\n    if (opts.routeTableName === undefined || opts.routeTableName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.routeTableName' when calling createRouteTable\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      postBody['vpcId'] = opts.vpcId\n    }\n    if (opts.routeTableName !== undefined && opts.routeTableName !== null) {\n      postBody['routeTableName'] = opts.routeTableName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.associateType !== undefined && opts.associateType !== null) {\n      postBody['associateType'] = opts.associateType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRouteTable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/routeTables/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询路由表信息详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.routeTableId - RouteTable ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param routeTable routeTable  路由表资源信息\n      */\n\n  describeRouteTable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRouteTable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.routeTableId === undefined || opts.routeTableId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.routeTableId' when calling describeRouteTable\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      routeTableId: opts.routeTableId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRouteTable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/routeTables/{routeTableId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改路由表属性\n      * @param {Object} opts - parameters\n      * @param {string} opts.routeTableId - RouteTable ID\n      * @param {string} [opts.routeTableName] - 路由表的名字。名称取值范围：1-32个中文、英文大小写的字母、数字和下划线分隔符  optional\n      * @param {string} [opts.description] - 路由表的描述，取值范围：0-256个UTF-8编码下的全部字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyRouteTable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyRouteTable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.routeTableId === undefined || opts.routeTableId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.routeTableId' when calling modifyRouteTable\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.routeTableName !== undefined && opts.routeTableName !== null) {\n      postBody['routeTableName'] = opts.routeTableName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      routeTableId: opts.routeTableId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyRouteTable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/routeTables/{routeTableId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除路由表\n      * @param {Object} opts - parameters\n      * @param {string} opts.routeTableId - RouteTable ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRouteTable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRouteTable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.routeTableId === undefined || opts.routeTableId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.routeTableId' when calling deleteRouteTable\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      routeTableId: opts.routeTableId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRouteTable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/routeTables/{routeTableId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加路由表规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.routeTableId - RouteTable ID\n      * @param {array} [opts.routeTableRuleSpecs] - 路由表规则信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addRouteTableRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addRouteTableRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.routeTableId === undefined || opts.routeTableId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.routeTableId' when calling addRouteTableRules\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.routeTableRuleSpecs !== undefined &&\n      opts.routeTableRuleSpecs !== null\n    ) {\n      postBody['routeTableRuleSpecs'] = opts.routeTableRuleSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      routeTableId: opts.routeTableId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addRouteTableRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/routeTables/{routeTableId}:addRouteTableRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  移除路由表规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.routeTableId - RouteTable ID\n      * @param {array} opts.ruleIds - 路由表规则Id列表\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  removeRouteTableRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  removeRouteTableRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.routeTableId === undefined || opts.routeTableId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.routeTableId' when calling removeRouteTableRules\"\n      )\n    }\n    if (opts.ruleIds === undefined || opts.ruleIds === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ruleIds' when calling removeRouteTableRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ruleIds !== undefined && opts.ruleIds !== null) {\n      postBody['ruleIds'] = opts.ruleIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      routeTableId: opts.routeTableId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call removeRouteTableRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/routeTables/{routeTableId}:removeRouteTableRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改路由表规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.routeTableId - RouteTable ID\n      * @param {array} [opts.modifyRouteTableRuleSpecs] - 路由表规则信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyRouteTableRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyRouteTableRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.routeTableId === undefined || opts.routeTableId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.routeTableId' when calling modifyRouteTableRules\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.modifyRouteTableRuleSpecs !== undefined &&\n      opts.modifyRouteTableRuleSpecs !== null\n    ) {\n      postBody['modifyRouteTableRuleSpecs'] = opts.modifyRouteTableRuleSpecs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      routeTableId: opts.routeTableId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyRouteTableRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/routeTables/{routeTableId}:modifyRouteTableRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  路由表绑定子网接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.routeTableId - RouteTable ID\n      * @param {array} [opts.subnetIds] - 路由表要绑定的子网ID列表, 只有associateType是subnet类型的路由表才支持绑定；subnet已被其他路由表绑定时，自动解绑。路由表绑定的子网属性要相同，或者都是标准子网，或者都是相同边缘可用区的边缘子网。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  associateRouteTable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  associateRouteTable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.routeTableId === undefined || opts.routeTableId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.routeTableId' when calling associateRouteTable\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subnetIds !== undefined && opts.subnetIds !== null) {\n      postBody['subnetIds'] = opts.subnetIds\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      routeTableId: opts.routeTableId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call associateRouteTable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/routeTables/{routeTableId}:associateRouteTable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  给路由表解绑子网接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.routeTableId - RouteTable ID\n      * @param {string} opts.subnetId - 路由表要解绑的子网ID，解绑后子网绑定默认路由表\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disassociateRouteTable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disassociateRouteTable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.routeTableId === undefined || opts.routeTableId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.routeTableId' when calling disassociateRouteTable\"\n      )\n    }\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling disassociateRouteTable\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      routeTableId: opts.routeTableId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disassociateRouteTable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/routeTables/{routeTableId}:disassociateRouteTable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询边缘公网IP可用线路列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - providers - 边缘公网IP的线路，命名规则：[线路接入区].[资源关联范围].[服务类型]，示例如cn-n1-jinan1.ez.bgp，支持多个\npointsOfAccess - 边缘公网IP的线路接入区，提供线路接入区具体位置信息，支持多个\nassociationScope - 边缘公网IP的资源关联范围，取值ez(边缘可用区)和az(中心可用区，暂不支持),支持单个\nserviceTypes - 边缘公网IP的服务类型，取值：bgp(动态)，unicom(联通)，telecom(电信)，mobile(移动)，支持多个\nazs - 边缘公网IP的可用区，分为全可用区（暂不支持）和边缘可用区ID(同线路接入区])，示例如cn-n1-sqxx1，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param edgeIpProvider edgeIpProviders\n      * @param integer totalCount  总数量\n      */\n\n  describeEdgeIpProviders (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeEdgeIpProviders\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeEdgeIpProviders with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/edgeIpProviders/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子网列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - subnetIds - subnet ID列表，支持多个\nsubnetNames - subnet名称列表，支持多个\nrouteTableId - 子网关联路由表Id，支持单个\naclId - 子网关联acl Id，支持单个\nvpcId - 子网所属VPC Id，支持单个\nsubnetType - 子网类型，取值：all(全部类型)，standard(标准子网)，edge(边缘子网)，默认standard ，支持单个\nazs - 可用区，支持多个\nazType - VPC az类型，取值：all(全部类型)，standard(标准可用区子网)，edge(边缘可用区子网)，默认all，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subnet subnets\n      * @param number totalCount  总数量\n      */\n\n  describeSubnets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSubnets\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubnets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建子网\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - 子网所属vpc的Id\n      * @param {string} opts.subnetName - 子网名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符。\n      * @param {string} opts.addressPrefix - 子网网段，vpc内子网网段不能重叠，cidr的取值范围：10.0.0.0/8、172.16.0.0/12和192.168.0.0/16及它们包含的子网，且子网掩码长度为16-28之间，如果vpc含有cidr，则必须为vpc所在cidr的子网\n      * @param {string} [opts.routeTableId] - 子网关联的路由表Id, 默认为vpc的默认路由表,子网关联路由表需检查路由表中已绑定的子网与本子网类型是否一致（一致标准为：或者都为标准子网，或者都为相同边缘可用区的边缘子网）  optional\n      * @param {string} [opts.description] - 子网描述信息,允许输入UTF-8编码下的全部字符，不超过256字符。  optional\n      * @param {integer} [opts.ipMaskLen] - 子网内预留网段掩码长度，此网段IP地址按照单个申请，子网内其余部分IP地址以网段形式分配。此参数非必选，缺省值为0，代表子网内所有IP地址都按照单个申请  optional\n      * @param {array} [opts.domainNames] - 域名后缀，不限制个数。总长度最长254个字符，仅支持字母，数字，中划线，下划线和点。  optional\n      * @param {array} [opts.domainNameServers] - 域名服务器地址。最多支持5个IPv4地址，不同IPv4地址使用逗号分隔。如不输入或输入空数组，默认使用京东云默认DNS域名服务器地址。如不添加默认DNS域名服务器，可能会导致您无法访问京东云云上基础服务，请谨慎操作  optional\n      * @param {boolean} [opts.dryRun] - 是否只预检此次请求。true：不会创建子网，只会对参数进行校验；false：正常的创建请求。默认为false。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string subnetId  子网ID\n      */\n\n  createSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling createSubnet\"\n      )\n    }\n    if (opts.subnetName === undefined || opts.subnetName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetName' when calling createSubnet\"\n      )\n    }\n    if (opts.addressPrefix === undefined || opts.addressPrefix === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.addressPrefix' when calling createSubnet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      postBody['vpcId'] = opts.vpcId\n    }\n    if (opts.subnetName !== undefined && opts.subnetName !== null) {\n      postBody['subnetName'] = opts.subnetName\n    }\n    if (opts.addressPrefix !== undefined && opts.addressPrefix !== null) {\n      postBody['addressPrefix'] = opts.addressPrefix\n    }\n    if (opts.routeTableId !== undefined && opts.routeTableId !== null) {\n      postBody['routeTableId'] = opts.routeTableId\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.ipMaskLen !== undefined && opts.ipMaskLen !== null) {\n      postBody['ipMaskLen'] = opts.ipMaskLen\n    }\n    if (opts.domainNames !== undefined && opts.domainNames !== null) {\n      postBody['domainNames'] = opts.domainNames\n    }\n    if (\n      opts.domainNameServers !== undefined &&\n      opts.domainNameServers !== null\n    ) {\n      postBody['domainNameServers'] = opts.domainNameServers\n    }\n    if (opts.dryRun !== undefined && opts.dryRun !== null) {\n      postBody['dryRun'] = opts.dryRun\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子网信息详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - Subnet ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subnet subnet  子网资源信息\n      */\n\n  describeSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling describeSubnet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subnetId: opts.subnetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets/{subnetId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改子网接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - Subnet ID\n      * @param {string} [opts.subnetName] - 子网名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符。  optional\n      * @param {string} [opts.description] - 子网描述信息，允许输入UTF-8编码下的全部字符，不超过256字符。  optional\n      * @param {integer} [opts.ipMaskLen] - 子网内预留网段掩码长度，此网段IP地址按照单个申请，子网内其余部分IP地址以网段形式分配。此参数非必选，缺省值为0，代表子网内所有IP地址都按照单个申请  optional\n      * @param {array} [opts.domainNames] - 域名后缀，不限制个数。总长度最长254个字符，仅支持字母，数字，中划线，下划线和点。  optional\n      * @param {array} [opts.domainNameServers] - 域名服务器地址。最多支持5个IPv4地址，不同IPv4地址使用逗号分隔。如输入空数组，默认使用京东云默认DNS域名服务器地址。如不添加默认DNS域名服务器，可能会导致您无法访问京东云云上基础服务，请谨慎操作  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifySubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifySubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling modifySubnet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subnetName !== undefined && opts.subnetName !== null) {\n      postBody['subnetName'] = opts.subnetName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.ipMaskLen !== undefined && opts.ipMaskLen !== null) {\n      postBody['ipMaskLen'] = opts.ipMaskLen\n    }\n    if (opts.domainNames !== undefined && opts.domainNames !== null) {\n      postBody['domainNames'] = opts.domainNames\n    }\n    if (\n      opts.domainNameServers !== undefined &&\n      opts.domainNameServers !== null\n    ) {\n      postBody['domainNameServers'] = opts.domainNameServers\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subnetId: opts.subnetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifySubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets/{subnetId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除子网\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - Subnet ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling deleteSubnet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subnetId: opts.subnetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/subnets/{subnetId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询私有网络列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - vpcIds - vpc ID列表，支持多个\nvpcNames - vpc名称列表,支持多个\nazType - VPC az类型，取值：all(全部类型)，standard(标准VPC)，edge(边缘VPC)，默认all，支持单个\nazs - 可用区，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpc vpcs\n      * @param number totalCount  总数量\n      */\n\n  describeVpcs (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVpcs\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVpcs with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建私有网络\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcName - 私有网络名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符。\n      * @param {string} [opts.addressPrefix] - 如果为空，则不限制网段，如果不为空，10.0.0.0/8、172.16.0.0/12和192.168.0.0/16及它们包含的子网，且子网掩码长度为16-28之间  optional\n      * @param {string} [opts.description] - vpc描述，允许输入UTF-8编码下的全部字符，不超过256字符。  optional\n      * @param {boolean} [opts.enableMulticast] - 取值包括true、false，默认为false，不开启组播。  optional\n      * @param {string} [opts.azType] - VPC az类型，取值：standard(标准VPC)，edge(边缘VPC)  optional\n      * @param {string} [opts.az] - VPC可用区，边缘VPC必须指定可用区  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string vpcId  私有网络ID\n      */\n\n  createVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcName === undefined || opts.vpcName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcName' when calling createVpc\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vpcName !== undefined && opts.vpcName !== null) {\n      postBody['vpcName'] = opts.vpcName\n    }\n    if (opts.addressPrefix !== undefined && opts.addressPrefix !== null) {\n      postBody['addressPrefix'] = opts.addressPrefix\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.enableMulticast !== undefined && opts.enableMulticast !== null) {\n      postBody['enableMulticast'] = opts.enableMulticast\n    }\n    if (opts.azType !== undefined && opts.azType !== null) {\n      postBody['azType'] = opts.azType\n    }\n    if (opts.az !== undefined && opts.az !== null) {\n      postBody['az'] = opts.az\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询虚拟网络信息详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - Vpc ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpc vpc  Vpc资源信息\n      */\n\n  describeVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling describeVpc\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcId: opts.vpcId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs/{vpcId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改私有网络接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - Vpc ID\n      * @param {string} [opts.vpcName] - 私有网络名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符。  optional\n      * @param {string} [opts.description] - vpc描述，允许输入UTF-8编码下的全部字符，不超过256字符。  optional\n      * @param {boolean} [opts.enableMulticast] - 取值包括true、false，默认为false，不开启组播。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling modifyVpc\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vpcName !== undefined && opts.vpcName !== null) {\n      postBody['vpcName'] = opts.vpcName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.enableMulticast !== undefined && opts.enableMulticast !== null) {\n      postBody['enableMulticast'] = opts.enableMulticast\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcId: opts.vpcId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs/{vpcId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除私有网络\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - Vpc ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVpc (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVpc\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling deleteVpc\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcId: opts.vpcId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVpc with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcs/{vpcId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询VpcPeering资源列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - vpcPeeringIds - vpcPeering ID，支持多个\nvpcPeeringNames - vpcPeering名称列表，支持多个\nvpcId - vpcPeering本端Vpc Id，支持单个\nremoteVpcId - vpcPeering对端Vpc Id，支持单个\nazType - vpcPeering本端VPC az类型，取值：all(全部类型)，standard(标准VPC)，edge(边缘VPC)，默认standard ，支持单个\nazs - vpcPeering本端VPC可用区，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpcPeering vpcPeerings\n      * @param number totalCount  总数量\n      */\n\n  describeVpcPeerings (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVpcPeerings\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVpcPeerings with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcPeerings/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建VpcPeering接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcPeeringName - VpcPeering的名字,不为空。名称取值范围：1-32个中文、英文大小写的字母、数字和下划线分隔符\n      * @param {string} opts.vpcId - VpcPeering本端Vpc的Id\n      * @param {string} opts.remoteVpcId - VpcPeering对端Vpc的Id\n      * @param {string} [opts.description] - VpcPeering 描述，取值范围：0-256个中文、英文大小写的字母、数字和下划线分隔符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpcPeering vpcPeering  VpcPeering资源信息\n      */\n\n  createVpcPeering (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVpcPeering\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcPeeringName === undefined || opts.vpcPeeringName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcPeeringName' when calling createVpcPeering\"\n      )\n    }\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling createVpcPeering\"\n      )\n    }\n    if (opts.remoteVpcId === undefined || opts.remoteVpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.remoteVpcId' when calling createVpcPeering\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vpcPeeringName !== undefined && opts.vpcPeeringName !== null) {\n      postBody['vpcPeeringName'] = opts.vpcPeeringName\n    }\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      postBody['vpcId'] = opts.vpcId\n    }\n    if (opts.remoteVpcId !== undefined && opts.remoteVpcId !== null) {\n      postBody['remoteVpcId'] = opts.remoteVpcId\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVpcPeering with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcPeerings/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询VpcPeering资源详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcPeeringId - vpcPeeringId ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpcPeering vpcPeering  VpcPeering资源信息\n      */\n\n  describeVpcPeering (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVpcPeering\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcPeeringId === undefined || opts.vpcPeeringId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcPeeringId' when calling describeVpcPeering\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcPeeringId: opts.vpcPeeringId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVpcPeering with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcPeerings/{vpcPeeringId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改VpcPeering接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcPeeringId - vpcPeeringId ID\n      * @param {string} [opts.vpcPeeringName] - VpcPeering的名字,不为空。名称取值范围：1-32个中文、英文大小写的字母、数字和下划线分隔符  optional\n      * @param {string} [opts.description] - VpcPeering 描述，取值范围：0-256个中文、英文大小写的字母、数字和下划线分隔符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyVpcPeering (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyVpcPeering\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcPeeringId === undefined || opts.vpcPeeringId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcPeeringId' when calling modifyVpcPeering\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vpcPeeringName !== undefined && opts.vpcPeeringName !== null) {\n      postBody['vpcPeeringName'] = opts.vpcPeeringName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcPeeringId: opts.vpcPeeringId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyVpcPeering with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcPeerings/{vpcPeeringId}',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除VpcPeering接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcPeeringId - vpcPeeringId ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVpcPeering (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVpcPeering\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcPeeringId === undefined || opts.vpcPeeringId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcPeeringId' when calling deleteVpcPeering\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcPeeringId: opts.vpcPeeringId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVpcPeering with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcPeerings/{vpcPeeringId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建VpcPolicy接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcPolicyName - 访问控制策略名称。取值范围：1-32个中文、英文大小写的字母、数字和下划线分隔符\n      * @param {string} opts.vpcId - 访问控制策略所属vpc id\n      * @param {string} opts.policyDocument - 具体策略内容(格式参考样例)\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string vpcPolicyId  访问控制策略ID\n      */\n\n  createVpcPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createVpcPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcPolicyName === undefined || opts.vpcPolicyName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcPolicyName' when calling createVpcPolicy\"\n      )\n    }\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling createVpcPolicy\"\n      )\n    }\n    if (opts.policyDocument === undefined || opts.policyDocument === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.policyDocument' when calling createVpcPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vpcPolicyName !== undefined && opts.vpcPolicyName !== null) {\n      postBody['vpcPolicyName'] = opts.vpcPolicyName\n    }\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      postBody['vpcId'] = opts.vpcId\n    }\n    if (opts.policyDocument !== undefined && opts.policyDocument !== null) {\n      postBody['policyDocument'] = opts.policyDocument\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createVpcPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcPolicy/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询VpcPolicy资源详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcPolicyId - policy ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param vpcPolicy vpcPolicy  Vpc访问控制策略资源信息\n      */\n\n  describeVpcPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVpcPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcPolicyId === undefined || opts.vpcPolicyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcPolicyId' when calling describeVpcPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcPolicyId: opts.vpcPolicyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVpcPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcPolicy/{vpcPolicyId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改VPC Policy接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcPolicyId - policy ID\n      * @param {string} opts.vpcPolicyId - 访问控制策略的Id\n      * @param {string} [opts.vpcPolicyName] - VpcPolicy的名称,不为空(有变更再传)。取值范围：1-32个中文、英文大小写的字母、数字和下划线分隔符  optional\n      * @param {string} [opts.policyDocument] - 具体策略内容(格式参考样例)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyVpcPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyVpcPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcPolicyId === undefined || opts.vpcPolicyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcPolicyId' when calling modifyVpcPolicy\"\n      )\n    }\n    if (opts.vpcPolicyId === undefined || opts.vpcPolicyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcPolicyId' when calling modifyVpcPolicy\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vpcPolicyId !== undefined && opts.vpcPolicyId !== null) {\n      postBody['vpcPolicyId'] = opts.vpcPolicyId\n    }\n    if (opts.vpcPolicyName !== undefined && opts.vpcPolicyName !== null) {\n      postBody['vpcPolicyName'] = opts.vpcPolicyName\n    }\n    if (opts.policyDocument !== undefined && opts.policyDocument !== null) {\n      postBody['policyDocument'] = opts.policyDocument\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcPolicyId: opts.vpcPolicyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyVpcPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcPolicy/{vpcPolicyId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除VpcPolicy接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcPolicyId - policy ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteVpcPolicy (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteVpcPolicy\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcPolicyId === undefined || opts.vpcPolicyId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcPolicyId' when calling deleteVpcPolicy\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      vpcPolicyId: opts.vpcPolicyId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  vpc/1.1.5'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteVpcPolicy with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/vpcPolicy/{vpcPolicyId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = VPC\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/waf/v1/waf.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Warning\n * Warning API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'waf'\nService._services[serviceId] = true\n\n/**\n * waf service.\n * @version 1.0.8\n */\n\nclass WAF extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'waf.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  获取回源ip段\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param object list\n      */\n\n  describeLbOutIp (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeLbOutIp\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeLbOutIp with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/admin:lboutIp',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  升配订单\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {orderReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string buyId  订单编号\n      * @param string wafInstanceId  wafInstancdId\n      * @param string orderNumber  orderNumber\n      */\n\n  upgradeInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  upgradeInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling upgradeInstance\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling upgradeInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call upgradeInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/billing:upgradeInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建waf实例\n      * @param {Object} opts - parameters\n      * @param {orderReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string buyId  buyId\n      * @param string wafInstanceId  wafInstanceId\n      * @param string orderNumber  orderNumber\n      */\n\n  createInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling createInstance\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/billing:createInstance',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取域名可用证书列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {getAvailableCertReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string bindCertId  现绑定证书id\n      * @param string bindCertName  现绑定证书名称\n      * @param string certIds\n      * @param string certNames\n      * @param integer count  可用证书个数\n      * @param string domain  域名\n      */\n\n  getAvailableCertForDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getAvailableCertForDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling getAvailableCertForDomain\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling getAvailableCertForDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAvailableCertForDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/cert:availableForDomain',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  绑定证书\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {assignCertReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  bindCert (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  bindCert\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling bindCert\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling bindCert\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call bindCert with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/cert:bindCert',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站在一定时间内的bps信息。\n      * @param {Object} opts - parameters\n      * @param {getChartReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer timeScope\n      * @param bps bps  bps数据\n      */\n\n  getBpsData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getBpsData\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling getBpsData\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getBpsData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/chart:getBpsData',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站在一定时间内的qps信息。\n      * @param {Object} opts - parameters\n      * @param {getChartReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer timeScope\n      * @param qps qps  qps数据\n      */\n\n  getQpsData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getQpsData\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling getQpsData\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getQpsData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/chart:getQpsData',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站在一定时间内的状态码报表信息。\n      * @param {Object} opts - parameters\n      * @param {getStatusCodeReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param statusCodeData statusCodeData  状态码TopN\n      */\n\n  getStatusCodeInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getStatusCodeInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling getStatusCodeInfo\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getStatusCodeInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/chart:getStatusCodeInfo',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站在一定时间内主要的防护信息,新接口，无url响应时间分布。\n      * @param {Object} opts - parameters\n      * @param {getChartReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer ip  ip访问量\n      * @param integer ipPre  之前ip访问量，当时间跨度大于7天时，该值无意义。\n      * @param integer pv  PV访问量\n      * @param integer pvPre  之前PV访问量，当时间跨度大于7天时，该值无意义。\n      * @param integer maxBps  流量峰值\n      * @param integer maxBpsPre  之前流量峰值，当时间跨度大于7天时，该值无意义。\n      * @param integer wafAnti  Web防护攻击数\n      * @param integer wafAntiPre  之前Web防护攻击数，当时间跨度大于7天时，该值无意义。\n      * @param integer domainCount  防护网站数\n      * @param integer aclAnti  自定义规则防护攻击数\n      * @param integer aclAntiPre  之前自定义规则防护攻击数\n      * @param integer ccAnti  cc防护攻击数\n      * @param integer ccAntiPre  之前cc防护攻击数\n      * @param integer botAnti  bot防护攻击数\n      * @param integer botAntiPre  之前bot防护攻击数\n      */\n\n  getMainAntiInfoNew (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getMainAntiInfoNew\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling getMainAntiInfoNew\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getMainAntiInfoNew with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/chart:getMainAntiInfoNew',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站在一定时间内的日志详情。\n      * @param {Object} opts - parameters\n      * @param {string} [opts.wafInstanceId] - 实例id，代表要查询的WAF实例，为空时表示当前用户下的所有实例  optional\n      * @param {string} [opts.domain] - 域名，为空时表示当前实例下的所有域名  optional\n      * @param {string} [opts.remote_addr] - 来源ip，检索字段  optional\n      * @param {string} [opts.document_uri] - URI，检索字段  optional\n      * @param {string} [opts.url] - url，检索字段  optional\n      * @param {string} [opts.anti_geo] - 来源地域，检索字段  optional\n      * @param {string} [opts.request_method] - 请求方法，检索字段  optional\n      * @param {string} [opts.action] - 动作，检索字段，支持类型：&quot;&quot;(为空时，默认查询全部动作类型)，&quot;-&quot;(放行)，&quot;notice&quot;(观察)，&quot;forbidden OR status&quot;(拦截)，&quot;redirect&quot;(浏览器跳转)，&quot;verify&quot;(人机交互)  optional\n      * @param {string} [opts.status] - 状态码，检索字段  optional\n      * @param {string} [opts.logId] - 日志Id，检索字段  optional\n      * @param {string} [opts.request_id] - 请求Id，检索字段  optional\n      * @param {integer} opts.start - 开始时间戳，单位秒，时间间隔要求大于5分钟，小于30天。\n      * @param {integer} opts.end - 结束时间戳，单位秒，时间间隔要求大于5分钟，小于30天。\n      * @param {integer} opts.pageSize - 每页显示的个数，默认是10。\n      * @param {integer} opts.pageIndex - 页数，默认是1。\n      * @param {string} [opts.logType] - 日志类型，检索字段，支持类型：&quot;&quot;(为空时，默认查询全部日志类型)，&quot;access&quot;(访问日志)，&quot;waf&quot;(wafSDK)，&quot;acl&quot;(自定义规则)，&quot;skip&quot;(白名单)，&quot;deny&quot;(黑名单)，&quot;cc&quot;(CC攻击)，&quot;webcache&quot;(网页防篡改)，&quot;css&quot;(跨站脚本攻击)，&quot;sqli&quot;(SQL注入攻击)，&quot;&quot;fileinc&quot;(文件读取/包含攻击)，&quot;cmding&quot;(命令/代码执行攻击)，&quot;sdd&quot;(敏感文件探测)，&quot;malscan&quot;(恶意扫描攻击)，&quot;bckack&quot;(恶意/后门文件攻击)，&quot;xmli&quot;(XML注入攻击)，&quot;dirt&quot;(目录遍历攻击)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageSize  每页显示的个数。\n      * @param integer pageIndex  页数。\n      * @param integer total  总个数。\n      * @param esLogEvent events\n      */\n\n  getEsLogDetail (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getEsLogDetail\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.start === undefined || opts.start === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.start' when calling getEsLogDetail\"\n      )\n    }\n    if (opts.end === undefined || opts.end === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.end' when calling getEsLogDetail\"\n      )\n    }\n    if (opts.pageSize === undefined || opts.pageSize === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageSize' when calling getEsLogDetail\"\n      )\n    }\n    if (opts.pageIndex === undefined || opts.pageIndex === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pageIndex' when calling getEsLogDetail\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.wafInstanceId !== undefined && opts.wafInstanceId !== null) {\n      queryParams['wafInstanceId'] = opts.wafInstanceId\n    }\n    if (opts.domain !== undefined && opts.domain !== null) {\n      queryParams['domain'] = opts.domain\n    }\n    if (opts.remote_addr !== undefined && opts.remote_addr !== null) {\n      queryParams['remote_addr'] = opts.remote_addr\n    }\n    if (opts.document_uri !== undefined && opts.document_uri !== null) {\n      queryParams['document_uri'] = opts.document_uri\n    }\n    if (opts.url !== undefined && opts.url !== null) {\n      queryParams['url'] = opts.url\n    }\n    if (opts.anti_geo !== undefined && opts.anti_geo !== null) {\n      queryParams['anti_geo'] = opts.anti_geo\n    }\n    if (opts.request_method !== undefined && opts.request_method !== null) {\n      queryParams['request_method'] = opts.request_method\n    }\n    if (opts.action !== undefined && opts.action !== null) {\n      queryParams['action'] = opts.action\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.logId !== undefined && opts.logId !== null) {\n      queryParams['logId'] = opts.logId\n    }\n    if (opts.request_id !== undefined && opts.request_id !== null) {\n      queryParams['request_id'] = opts.request_id\n    }\n    if (opts.start !== undefined && opts.start !== null) {\n      queryParams['start'] = opts.start\n    }\n    if (opts.end !== undefined && opts.end !== null) {\n      queryParams['end'] = opts.end\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.pageIndex !== undefined && opts.pageIndex !== null) {\n      queryParams['pageIndex'] = opts.pageIndex\n    }\n    Object.assign(queryParams, super.buildArrayParam(opts.logType, 'logType'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getEsLogDetail with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/chart:getEsLog',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站在一定时间内的报表详情。\n      * @param {Object} opts - parameters\n      * @param {getAntiEventReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageSize  每页显示的个数。\n      * @param integer pageIndex  页数。\n      * @param integer total  总个数。\n      * @param antiEvent events\n      */\n\n  getAntiEvent (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getAntiEvent\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling getAntiEvent\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getAntiEvent with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/chart:getAntiEvent',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站lb配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {commonReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string wafInstanceId  实例id\n      * @param lbConfig config  网站lb配置\n      */\n\n  getDomainLbConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDomainLbConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling getDomainLbConfig\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling getDomainLbConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDomainLbConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/domain:getDomainLbConfig',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新增网站\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {addDomain} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling addDomain\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling addDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/domain:add',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新网站\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {addDomain} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling updateDomain\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling updateDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/domain:update',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除网站\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {commonReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteDomain (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDomain\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling deleteDomain\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling deleteDomain\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDomain with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/domain:delete',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {listDomains} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string wafInstanceId  实例id\n      * @param string list\n      * @param integer pageIndex  页码\n      * @param integer pageSize  页大小\n      * @param integer totalCount  该实例下总共的域名数量\n      * @param integer maxLimit  最大支持的数目\n      */\n\n  listDomains (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listDomains\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling listDomains\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling listDomains\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listDomains with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/domain:list',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取域名防护配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {commonReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string domain  域名\n      * @param integer disableWaf  waf状态 1表示关闭waf\n      * @param integer enableJs  js验证全局开关 0表示关闭\n      * @param aclConf aclConf  网站waf防护配置\n      * @param spiderConf antispiderConf  网站防爬虫防护配置\n      * @param ccConf ccConf  网站cc防护配置\n      * @param denyConf denyConf  网站黑名单防护配置\n      * @param intSemConf intSemConf  网站智能语义引擎防护配置\n      * @param ipbanConf ipbanConf  网站恶意ip防护配置\n      * @param ipbanUsrConf ipbanUsrConf  网站恶意ip自定义防护配置\n      * @param ratelimitConf ratelimitConf  网站限速规则防护配置\n      * @param enableConf threatinfoConf  网站威胁情报防护配置\n      * @param userDefPageConf userDefPageConf  网站自定义页面配置\n      * @param wafConf wafConf  网站waf防护配置\n      * @param webUserdefConf webUserdefConf  网站web自定义规则防护配置\n      * @param enableConf webcacheConf  网站防篡改防护配置\n      * @param skipConf skipConf  网站白名单防护配置\n      * @param filterHeaderConf filterHeaderConf  网站请求头管理防护配置\n      * @param filterSenseConf filterSenseConf  网站敏感信息防护配置\n      * @param statusConf statusConf  状态码修改配置\n      * @param uriRewriteConf uriRewriteConf  网站uri重写规则配置\n      * @param enableConf proxycacheConf  proxy缓存配置\n      * @param riskConf riskConf  risk配置\n      * @param botConf botConf  bot配置\n      */\n\n  getDomainAntiConfig (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDomainAntiConfig\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling getDomainAntiConfig\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling getDomainAntiConfig\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDomainAntiConfig with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/domain:getAntiConfig',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  cname解析到回源\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {activeFuncReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableCname2RsExternal (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableCname2RsExternal\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling enableCname2RsExternal\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling enableCname2RsExternal\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableCname2RsExternal with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/domain:enableCname2RsExternal',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {listDomains} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string wafInstanceId  实例id\n      * @param domainMainConfig list\n      * @param integer pageIndex  页码\n      * @param integer pageSize  页大小\n      * @param integer maxLimit  最大支持的数目\n      * @param integer totalCount  当前实例域名总数\n      * @param integer tldLimit  最大支持一级域名的数目\n      * @param integer tldNum  一级域名个数\n      * @param integer count  本次查询域名个数\n      * @param string invalidRegion\n      * @param integer invalidIpv6  Ipv6是否故障,1:故障 0:健康\n      */\n\n  listMainCfg (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listMainCfg\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling listMainCfg\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling listMainCfg\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listMainCfg with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/domain:listMainCfg',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  规则开关\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {disableRulesReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  disableRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  disableRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling disableRules\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling disableRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call disableRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/domain:disableRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  激活waf\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {enableReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableWaf (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableWaf\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling enableWaf\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling enableWaf\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableWaf with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/waf:enable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置waf防护模式\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {antiModeWafReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  antiModeWaf (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  antiModeWaf\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling antiModeWaf\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling antiModeWaf\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call antiModeWaf with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/waf:antiMode',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置waf策略等级\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {antiLevelWafReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  antiLevelWaf (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  antiLevelWaf\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling antiLevelWaf\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling antiLevelWaf\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call antiLevelWaf with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/waf:antiLevel',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  激活waf自定义规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {setWafUserDefineReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  enableWafUserDefine (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  enableWafUserDefine\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling enableWafUserDefine\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling enableWafUserDefine\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call enableWafUserDefine with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/waf:setWafUserDefine',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置waf自定义规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {setWafRuleReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setWafRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setWafRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling setWafRule\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling setWafRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setWafRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/waf:setRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除waf自定义规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {delRulesReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  delWafRule (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  delWafRule\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling delWafRule\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling delWafRule\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call delWafRule with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/waf:delRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站的waf自定义规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {listWafRulesReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageIndex  页码\n      * @param integer pageSize  页大小\n      * @param integer totalCount  配置总数\n      * @param listWafRuleCfg list\n      */\n\n  listWafRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listWafRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling listWafRules\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling listWafRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listWafRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/waf:listRules',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置网站黑白名单ip配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {setIpReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling addIps\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling addIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/userdefine:addIps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  更新网站黑白名单ip配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {setIpReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  updateIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  updateIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling updateIps\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling updateIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call updateIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/userdefine:updateIps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站黑白名单ip配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {listDenySkipRulesReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string wafInstanceId  实例id\n      * @param string domain  域名\n      * @param string iswhite  0表示黑名单 1表示白名单\n      * @param integer pageIndex  页码，[1-100]\n      * @param integer pageSize  页大小，[1-100]\n      * @param integer count  总数\n      * @param ipListCfg data\n      */\n\n  listIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling listIps\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling listIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/userdefine:listIps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除网站黑白名单ip配置\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {delRulesReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  delIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  delIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling delIps\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling delIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call delIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/userdefine:delIps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  设置网站waf自定义防护条件\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {setWafConditionReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  setWafCondition (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  setWafCondition\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling setWafCondition\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling setWafCondition\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call setWafCondition with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/waf:setCondition',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除网站waf自定义防护条件\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {delRulesReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  delWafCondition (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  delWafCondition\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling delWafCondition\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling delWafCondition\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call delWafCondition with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/waf:delCondition',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站waf自定义防护条件\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {listWafConditionsReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageIndex  页码\n      * @param integer pageSize  页大小\n      * @param integer totalCount  配置总数\n      * @param listWafConditionCfg list\n      */\n\n  listWafConditions (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listWafConditions\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling listWafConditions\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling listWafConditions\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listWafConditions with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/waf:listConditions',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站waf自定义防护过滤器\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {listWafFilterReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageIndex  页码\n      * @param integer pageSize  页大小\n      * @param integer totalCount  配置总数\n      * @param listWafFilterCfg list  网站waf自定义防护过滤器设置\n      */\n\n  listWafFilter (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listWafFilter\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling listWafFilter\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling listWafFilter\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listWafFilter with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/waf:listFilter',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  新增防篡改条目\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {setWebcacheUrlReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  addWebcacheUrl (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  addWebcacheUrl\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling addWebcacheUrl\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling addWebcacheUrl\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addWebcacheUrl with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/webcache:addWebcacheUrl',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  刷新某条防篡改条目\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {commonNameReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  refreshUrlCache (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  refreshUrlCache\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling refreshUrlCache\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling refreshUrlCache\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call refreshUrlCache with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/webcache:refreshUrlCache',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取网站已知类型bot规则\n      * @param {Object} opts - parameters\n      * @param {string} opts.wafInstanceId - 实例Id\n      * @param {listBotStdRuleReq} opts.req - 请求\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer pageIndex  页码\n      * @param integer pageSize  页大小\n      * @param integer totalCount  配置总数\n      * @param stdBotRules list\n      */\n\n  listBotStdRules (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listBotStdRules\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.wafInstanceId === undefined || opts.wafInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.wafInstanceId' when calling listBotStdRules\"\n      )\n    }\n    if (opts.req === undefined || opts.req === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.req' when calling listBotStdRules\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.req !== undefined && opts.req !== null) {\n      postBody['req'] = opts.req\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      wafInstanceId: opts.wafInstanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listBotStdRules with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/wafInstanceIds/{wafInstanceId}/bot:listStdRule',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取实例ID及相关信息列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.idc] - 所属地区， 模糊匹配  optional\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} [opts.sourceIds] - 资源id 多个时，以逗号,分隔。  optional\n      * @param {filter} [opts.filters] - wafInstanceId - 实例id  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer total  总个数。\n      * @param instanceIdCfg instanceIdCfg\n      */\n\n  getWafInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getWafInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.idc !== undefined && opts.idc !== null) {\n      queryParams['idc'] = opts.idc\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.sourceIds !== undefined && opts.sourceIds !== null) {\n      queryParams['sourceIds'] = opts.sourceIds\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  waf/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getWafInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/user:getWafInstance',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = WAF\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/xdata/v1/xdata.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * table\n * API related to XDATA-DW table\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'xdata'\nService._services[serviceId] = true\n\n/**\n * xdata service.\n * @version 1.1.0\n */\n\nJDCloud.XDATA = class XDATA extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'xdata.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询用户实例的所有数据库信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceName - 实例名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      * @param dwDatabaseInfo data\n      */\n\n  listDatabaseInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listDatabaseInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling listDatabaseInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      queryParams['instanceName'] = opts.instanceName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listDatabaseInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwDatabase',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户实例的指定数据库信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.databaseName - 数据库名\n      * @param {string} opts.instanceName - 实例名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      * @param dwDatabase data\n      */\n\n  getDatabaseInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getDatabaseInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.databaseName === undefined || opts.databaseName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.databaseName' when calling getDatabaseInfo\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling getDatabaseInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      queryParams['instanceName'] = opts.instanceName\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      databaseName: opts.databaseName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getDatabaseInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwDatabase/{databaseName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建属于用户实例的数据库\n      * @param {Object} opts - parameters\n      * @param {string} opts.databaseName - 数据库名\n      * @param {string} opts.instanceName - 实例名称\n      * @param {string} [opts.description] - 数据库描述信息  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      */\n\n  createDatabase (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createDatabase\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.databaseName === undefined || opts.databaseName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.databaseName' when calling createDatabase\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling createDatabase\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      databaseName: opts.databaseName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createDatabase with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwDatabase/{databaseName}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除用户实例的指定数据库\n      * @param {Object} opts - parameters\n      * @param {string} opts.databaseName - 数据库名\n      * @param {string} opts.instanceName - 实例名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      */\n\n  deleteDatabase (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteDatabase\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.databaseName === undefined || opts.databaseName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.databaseName' when calling deleteDatabase\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling deleteDatabase\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      queryParams['instanceName'] = opts.instanceName\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      databaseName: opts.databaseName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDatabase with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwDatabase/{databaseName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户所属的实例信息\n      * @param {Object} opts - parameters\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      * @param dwInstance data\n      */\n\n  listInstanceInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listInstanceInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listInstanceInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwInstance',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  执行用户编写的Spark SQL脚本\n      * @param {Object} opts - parameters\n      * @param {string} [opts.databaseName] - 数据库名称  optional\n      * @param {string} opts.sql - sql脚本\n      * @param {string} opts.userName - 用户名称\n      * @param {string} [opts.queueName] - 队列名称  optional\n      * @param {string} [opts.source] - 资源名称  optional\n      * @param {string} [opts.callBackURL] - 回调地址名称  optional\n      * @param {string} opts.instanceName - 实例名称\n      * @param {string} [opts.instanceOwnerName] - 实例拥有者名称  optional\n      * @param {string} [opts.isExplain] - 是否需要解释  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      * @param integer data\n      */\n\n  executeRasQuery (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  executeRasQuery\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.sql === undefined || opts.sql === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.sql' when calling executeRasQuery\"\n      )\n    }\n    if (opts.userName === undefined || opts.userName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userName' when calling executeRasQuery\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling executeRasQuery\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.databaseName !== undefined && opts.databaseName !== null) {\n      postBody['databaseName'] = opts.databaseName\n    }\n    if (opts.sql !== undefined && opts.sql !== null) {\n      postBody['sql'] = opts.sql\n    }\n    if (opts.userName !== undefined && opts.userName !== null) {\n      postBody['userName'] = opts.userName\n    }\n    if (opts.queueName !== undefined && opts.queueName !== null) {\n      postBody['queueName'] = opts.queueName\n    }\n    if (opts.source !== undefined && opts.source !== null) {\n      postBody['source'] = opts.source\n    }\n    if (opts.callBackURL !== undefined && opts.callBackURL !== null) {\n      postBody['callBackURL'] = opts.callBackURL\n    }\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n    if (\n      opts.instanceOwnerName !== undefined &&\n      opts.instanceOwnerName !== null\n    ) {\n      postBody['instanceOwnerName'] = opts.instanceOwnerName\n    }\n    if (opts.isExplain !== undefined && opts.isExplain !== null) {\n      postBody['isExplain'] = opts.isExplain\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call executeRasQuery with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwQuery:executeRasQuery',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  执行用户编写的PySpark脚本\n      * @param {Object} opts - parameters\n      * @param {string} opts.script - PySpark脚本\n      * @param {string} opts.userName - 用户名称\n      * @param {string} opts.instanceName - 实例名称\n      * @param {string} [opts.instanceOwnerName] - 实例拥有者名称  optional\n      * @param {string} [opts.scriptType] - 脚本类型名称  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      * @param integer data\n      */\n\n  executePySparkQuery (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  executePySparkQuery\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.script === undefined || opts.script === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.script' when calling executePySparkQuery\"\n      )\n    }\n    if (opts.userName === undefined || opts.userName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userName' when calling executePySparkQuery\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling executePySparkQuery\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.script !== undefined && opts.script !== null) {\n      postBody['script'] = opts.script\n    }\n    if (opts.userName !== undefined && opts.userName !== null) {\n      postBody['userName'] = opts.userName\n    }\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n    if (\n      opts.instanceOwnerName !== undefined &&\n      opts.instanceOwnerName !== null\n    ) {\n      postBody['instanceOwnerName'] = opts.instanceOwnerName\n    }\n    if (opts.scriptType !== undefined && opts.scriptType !== null) {\n      postBody['scriptType'] = opts.scriptType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call executePySparkQuery with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwQuery:executePySparkQuery',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取用户Spark SQL脚本的查询状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.userName - 用户名称\n      * @param {string} opts.queryId - 查询id名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      * @param string data\n      */\n\n  getRasQueryState (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRasQueryState\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.userName === undefined || opts.userName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userName' when calling getRasQueryState\"\n      )\n    }\n    if (opts.queryId === undefined || opts.queryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryId' when calling getRasQueryState\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.userName !== undefined && opts.userName !== null) {\n      queryParams['userName'] = opts.userName\n    }\n    if (opts.queryId !== undefined && opts.queryId !== null) {\n      queryParams['queryId'] = opts.queryId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRasQueryState with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwQuery:getRasQueryState',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取用户PySpark脚本的执行状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.userName - 用户名称\n      * @param {string} opts.queryId - 查询id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      * @param string data\n      */\n\n  getPySparkExecuteState (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getPySparkExecuteState\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.userName === undefined || opts.userName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userName' when calling getPySparkExecuteState\"\n      )\n    }\n    if (opts.queryId === undefined || opts.queryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryId' when calling getPySparkExecuteState\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.userName !== undefined && opts.userName !== null) {\n      queryParams['userName'] = opts.userName\n    }\n    if (opts.queryId !== undefined && opts.queryId !== null) {\n      queryParams['queryId'] = opts.queryId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPySparkExecuteState with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwQuery:getPySparkExecuteState',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取用户Spark SQL脚本的查询日志\n      * @param {Object} opts - parameters\n      * @param {string} opts.userName - 用户名称\n      * @param {string} opts.queryId - 查询id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      */\n\n  getRasQueryLog (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRasQueryLog\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.userName === undefined || opts.userName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userName' when calling getRasQueryLog\"\n      )\n    }\n    if (opts.queryId === undefined || opts.queryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryId' when calling getRasQueryLog\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.userName !== undefined && opts.userName !== null) {\n      queryParams['userName'] = opts.userName\n    }\n    if (opts.queryId !== undefined && opts.queryId !== null) {\n      queryParams['queryId'] = opts.queryId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRasQueryLog with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwQuery:getRasQueryLog',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取用户Spark SQL脚本的查询结果\n      * @param {Object} opts - parameters\n      * @param {string} opts.userName - 用户名称\n      * @param {string} opts.queryId - 查询id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      */\n\n  getRasQueryResult (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getRasQueryResult\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.userName === undefined || opts.userName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userName' when calling getRasQueryResult\"\n      )\n    }\n    if (opts.queryId === undefined || opts.queryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryId' when calling getRasQueryResult\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.userName !== undefined && opts.userName !== null) {\n      queryParams['userName'] = opts.userName\n    }\n    if (opts.queryId !== undefined && opts.queryId !== null) {\n      queryParams['queryId'] = opts.queryId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getRasQueryResult with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwQuery:getRasQueryResult',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取用户PySpark脚本的执行结果\n      * @param {Object} opts - parameters\n      * @param {string} opts.userName - 用户名称\n      * @param {string} opts.queryId - 查询id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      */\n\n  getPySparkExecuteResult (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getPySparkExecuteResult\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.userName === undefined || opts.userName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userName' when calling getPySparkExecuteResult\"\n      )\n    }\n    if (opts.queryId === undefined || opts.queryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryId' when calling getPySparkExecuteResult\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.userName !== undefined && opts.userName !== null) {\n      queryParams['userName'] = opts.userName\n    }\n    if (opts.queryId !== undefined && opts.queryId !== null) {\n      queryParams['queryId'] = opts.queryId\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getPySparkExecuteResult with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwQuery:getPySparkExecuteResult',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  终止用户Spark SQL脚本查询\n      * @param {Object} opts - parameters\n      * @param {string} opts.userName - 用户名称\n      * @param {string} opts.queryId - 查询id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      */\n\n  cancelRasQuery (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  cancelRasQuery\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.userName === undefined || opts.userName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userName' when calling cancelRasQuery\"\n      )\n    }\n    if (opts.queryId === undefined || opts.queryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryId' when calling cancelRasQuery\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.userName !== undefined && opts.userName !== null) {\n      postBody['userName'] = opts.userName\n    }\n    if (opts.queryId !== undefined && opts.queryId !== null) {\n      postBody['queryId'] = opts.queryId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cancelRasQuery with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwQuery:cancelRasQuery',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  终止用户PySpark脚本任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.userName - 用户名称\n      * @param {string} opts.queryId - 查询id\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      */\n\n  cancelPySparkJob (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  cancelPySparkJob\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.userName === undefined || opts.userName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.userName' when calling cancelPySparkJob\"\n      )\n    }\n    if (opts.queryId === undefined || opts.queryId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.queryId' when calling cancelPySparkJob\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.userName !== undefined && opts.userName !== null) {\n      postBody['userName'] = opts.userName\n    }\n    if (opts.queryId !== undefined && opts.queryId !== null) {\n      postBody['queryId'] = opts.queryId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call cancelPySparkJob with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwQuery:cancelPySparkQuery',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户实例指定数据库下的所有数据表信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceName - 实例名称\n      * @param {string} opts.databaseName - 数据库名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      * @param dwTable data\n      */\n\n  listTableInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  listTableInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling listTableInfo\"\n      )\n    }\n    if (opts.databaseName === undefined || opts.databaseName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.databaseName' when calling listTableInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      queryParams['instanceName'] = opts.instanceName\n    }\n    if (opts.databaseName !== undefined && opts.databaseName !== null) {\n      queryParams['databaseName'] = opts.databaseName\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listTableInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwTable',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建用户实例的数据表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceName - 实例名称\n      * @param {dwTableDesc} opts.dbModelDBTable - 数据表描述信息\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      */\n\n  createTable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createTable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling createTable\"\n      )\n    }\n    if (opts.dbModelDBTable === undefined || opts.dbModelDBTable === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbModelDBTable' when calling createTable\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      postBody['instanceName'] = opts.instanceName\n    }\n    if (opts.dbModelDBTable !== undefined && opts.dbModelDBTable !== null) {\n      postBody['dbModelDBTable'] = opts.dbModelDBTable\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createTable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwTable',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户实例的指定数据表信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.tableName - 数据表名\n      * @param {string} opts.instanceName - 实例名称\n      * @param {string} opts.databaseName - 数据库名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      * @param dwTable data\n      */\n\n  getTableInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  getTableInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.tableName === undefined || opts.tableName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tableName' when calling getTableInfo\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling getTableInfo\"\n      )\n    }\n    if (opts.databaseName === undefined || opts.databaseName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.databaseName' when calling getTableInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      queryParams['instanceName'] = opts.instanceName\n    }\n    if (opts.databaseName !== undefined && opts.databaseName !== null) {\n      queryParams['databaseName'] = opts.databaseName\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      tableName: opts.tableName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getTableInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwTable/{tableName}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除用户实例的指定数据表\n      * @param {Object} opts - parameters\n      * @param {string} opts.tableName - 数据表名\n      * @param {string} opts.instanceName - 实例名称\n      * @param {string} opts.databaseName - 数据库名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean status\n      * @param string message\n      * @param object data\n      */\n\n  deleteTable (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteTable\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.tableName === undefined || opts.tableName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.tableName' when calling deleteTable\"\n      )\n    }\n    if (opts.instanceName === undefined || opts.instanceName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceName' when calling deleteTable\"\n      )\n    }\n    if (opts.databaseName === undefined || opts.databaseName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.databaseName' when calling deleteTable\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.instanceName !== undefined && opts.instanceName !== null) {\n      queryParams['instanceName'] = opts.instanceName\n    }\n    if (opts.databaseName !== undefined && opts.databaseName !== null) {\n      queryParams['databaseName'] = opts.databaseName\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      tableName: opts.tableName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  xdata/1.1.0'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteTable with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/regions/{regionId}/dwTable/{tableName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.XDATA\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/ydsms/v1/ydsms.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 云鼎短信服务-用户相关接口\n * 云鼎短信服务-用户相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ydsms'\nService._services[serviceId] = true\n\n/**\n * ydsms service.\n * @version 1.0.8\n */\n\nclass YDSMS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'ydsms.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询应用列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} [opts.status] - 状态，0 停用 1 启用  optional\n      * @param {string} [opts.appName] - 应用名称  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param smsAppVO smsApps\n      * @param integer totalCount\n      */\n\n  listSmsAppsUsingGET (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      queryParams['appName'] = opts.appName\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSmsAppsUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsApps',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建短信应用\n      * @param {Object} opts - parameters\n      * @param {} opts.appDesc - 应用描述\n      * @param {} [opts.appId] - 云鼎应用id  optional\n      * @param {} opts.appName - 应用名称\n      * @param {} [opts.accessKeyId] - accessKeyId  optional\n      * @param {} [opts.accessKeySecret] - accessKeySecret  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string appId  应用id\n      */\n\n  createSmsAppUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appDesc === undefined || opts.appDesc === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appDesc' when calling createSmsAppUsingPOST\"\n      )\n    }\n    if (opts.appName === undefined || opts.appName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appName' when calling createSmsAppUsingPOST\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appDesc !== undefined && opts.appDesc !== null) {\n      postBody['appDesc'] = opts.appDesc\n    }\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n    if (opts.accessKeyId !== undefined && opts.accessKeyId !== null) {\n      postBody['accessKeyId'] = opts.accessKeyId\n    }\n    if (opts.accessKeySecret !== undefined && opts.accessKeySecret !== null) {\n      postBody['accessKeySecret'] = opts.accessKeySecret\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSmsAppUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsApps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询应用详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param smsAppVO smsAppVO\n      */\n\n  getSmsAppByIdUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling getSmsAppByIdUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSmsAppByIdUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsApps/{appId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  编辑短信应用\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - appId\n      * @param {} [opts.appDesc] - 应用描述  optional\n      * @param {} [opts.appName] - 应用名称  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string appId  应用id\n      */\n\n  modifySmsAppUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling modifySmsAppUsingPOST\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appDesc !== undefined && opts.appDesc !== null) {\n      postBody['appDesc'] = opts.appDesc\n    }\n    if (opts.appName !== undefined && opts.appName !== null) {\n      postBody['appName'] = opts.appName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifySmsAppUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsApps/{appId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询应用secretKey\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string secretKey  密钥\n      */\n\n  querySecretKeyUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling querySecretKeyUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call querySecretKeyUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsApps/{appId}:querySecretKey',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改应用启停状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用id\n      * @param {integer} [opts.status] - 应用状态,0 停用 1 启用  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string appId  应用id\n      */\n\n  modifyStatusUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling modifyStatusUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyStatusUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsApps/{appId}:modifyStatus',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询应用发送短信总体情况\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用id，传all查询所有应用的数据总和\n      * @param {integer} [opts.packageType] - 套餐包类型，1普通短信 2官方短信，默认为1  optional\n      * @param {string} [opts.templateId] - 模板id  optional\n      * @param {string} opts.endTime - 结束时间,pattern &#x3D;&quot;yyyy-MM-dd HH:mm:ss&quot;,timezone&#x3D;&quot;GMT+8&quot;\n      * @param {string} opts.startTime - 开始时间,pattern &#x3D;&quot;yyyy-MM-dd HH:mm:ss&quot;,timezone&#x3D;&quot;GMT+8&quot;\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string pin  pin\n      * @param string appId  应用id\n      * @param sendOverviewVO sendOverviewVOList\n      */\n\n  listSmsSendOverviewUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling listSmsSendOverviewUsingGET\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling listSmsSendOverviewUsingGET\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling listSmsSendOverviewUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.packageType !== undefined && opts.packageType !== null) {\n      queryParams['packageType'] = opts.packageType\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      queryParams['templateId'] = opts.templateId\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSmsSendOverviewUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsApps/{appId}:overview',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询短信发送记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用id\n      * @param {integer} [opts.sendStatus] - 发送状态，0 全部状态 1 发送成功 2 发送失败 3 已发送未回执， 默认为0  optional\n      * @param {string} [opts.sendNumber] - 手机号码  optional\n      * @param {string} [opts.templateId] - 模板id  optional\n      * @param {string} [opts.sign_id] - 签名id  optional\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} opts.endTime - 结束时间,pattern &#x3D;&quot;yyyy-MM-dd HH:mm:ss&quot;,timezone&#x3D;&quot;GMT+8&quot;\n      * @param {string} opts.startTime - 开始时间,pattern &#x3D;&quot;yyyy-MM-dd HH:mm:ss&quot;,timezone&#x3D;&quot;GMT+8&quot;\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param sendRecord sendRecords\n      * @param integer totalCount\n      */\n\n  querySendRecordUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling querySendRecordUsingGET\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling querySendRecordUsingGET\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling querySendRecordUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.sendStatus !== undefined && opts.sendStatus !== null) {\n      queryParams['sendStatus'] = opts.sendStatus\n    }\n    if (opts.sendNumber !== undefined && opts.sendNumber !== null) {\n      queryParams['sendNumber'] = opts.sendNumber\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      queryParams['templateId'] = opts.templateId\n    }\n    if (opts.sign_id !== undefined && opts.sign_id !== null) {\n      queryParams['sign_id'] = opts.sign_id\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call querySendRecordUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsApps/{appId}:querySendRecord',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询短信回复记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用id\n      * @param {string} [opts.sendNumber] - 手机号码  optional\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} opts.endTime - 结束时间,pattern &#x3D;&quot;yyyy-MM-dd HH:mm:ss&quot;,timezone&#x3D;&quot;GMT+8&quot;\n      * @param {string} opts.startTime - 开始时间,pattern &#x3D;&quot;yyyy-MM-dd HH:mm:ss&quot;,timezone&#x3D;&quot;GMT+8&quot;\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param replyRecord replyRecords\n      * @param integer totalCount\n      */\n\n  queryReplyRecordUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling queryReplyRecordUsingGET\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling queryReplyRecordUsingGET\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling queryReplyRecordUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.sendNumber !== undefined && opts.sendNumber !== null) {\n      queryParams['sendNumber'] = opts.sendNumber\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryReplyRecordUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsApps/{appId}:queryReplyRecord',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询短信回执记录\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用id\n      * @param {string} opts.endTime - 结束时间,pattern &#x3D;&quot;yyyy-MM-dd HH:mm:ss&quot;,timezone&#x3D;&quot;GMT+8&quot;\n      * @param {string} opts.startTime - 开始时间,pattern &#x3D;&quot;yyyy-MM-dd HH:mm:ss&quot;,timezone&#x3D;&quot;GMT+8&quot;\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string pin  pin\n      * @param string appId  应用id\n      * @param receiptRecord receiptRecords\n      */\n\n  queryReceiptRecordUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling queryReceiptRecordUsingGET\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling queryReceiptRecordUsingGET\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling queryReceiptRecordUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryReceiptRecordUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsApps/{appId}:queryReceiptRecord',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询应用通用设置列表\n      * @param {Object} opts - parameters\n      * @param {string} [opts.appId] - 应用id  optional\n      * @param {integer} [opts.type] - 通用设置类型，0发送频率设置 1发送超量提醒 2短信发送状态回调地址  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param generalSettings appGeneralSettings\n      */\n\n  listSmsAppGeneralSettingsUsingGET (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      queryParams['appId'] = opts.appId\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSmsAppGeneralSettingsUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsAppGeneralSettings',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改应用通用设置\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.id] - id  optional\n      * @param {string} [opts.settingValue] - 设置的值  optional\n      * @param {integer} [opts.status] - 是否启用，当前设置是否生效，0未生效 1生效  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  是否修改成功\n      */\n\n  modifyAppGeneralSettingById (opts, callback) {\n    opts = opts || {}\n\n    if (opts.id === undefined || opts.id === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.id' when calling modifyAppGeneralSettingById\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.settingValue !== undefined && opts.settingValue !== null) {\n      queryParams['settingValue'] = opts.settingValue\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      id: opts.id\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyAppGeneralSettingById with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsAppGeneralSettings/{id}:modify',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询短信签名证明材料类型列表\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param certificateType certificateTypes\n      */\n\n  listSmsCertificateTypesUsingGET (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSmsCertificateTypesUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsCertificateTypes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询应用发送短信总体情况\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用id\n      * @param {string} opts.endTime - 结束时间\n      * @param {string} opts.startTime - 开始时间\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  listSmsSendOverviewUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling listSmsSendOverviewUsingGET\"\n      )\n    }\n    if (opts.endTime === undefined || opts.endTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.endTime' when calling listSmsSendOverviewUsingGET\"\n      )\n    }\n    if (opts.startTime === undefined || opts.startTime === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.startTime' when calling listSmsSendOverviewUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      appId: opts.appId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSmsSendOverviewUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/apps/{appId}:overview',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询套餐包列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.packageType] - 套餐包类型:1通道短信，2官方短信  optional\n      * @param {integer} [opts.pageNumber] - pageNumber  optional\n      * @param {integer} [opts.pageSize] - pageSize  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param smsPackageVO smsPackages\n      * @param integer totalCount\n      */\n\n  listSmsPackagesUsingGET (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.packageType !== undefined && opts.packageType !== null) {\n      queryParams['packageType'] = opts.packageType\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSmsPackagesUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsPackages',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建套餐包\n      * @param {Object} opts - parameters\n      * @param {} opts.packageCount - 套餐包数量\n      * @param {} opts.packageType - 套餐包类型，1通道短信，2官方短信\n      * @param {} opts.specification - 套餐包规格\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string buyId  购物车id，预付费需登陆控制台https://buy.jdcloud.com/confirm?buyId&#x3D;xxx 确认订单\n      */\n\n  createSmsPackageUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    if (opts.packageCount === undefined || opts.packageCount === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.packageCount' when calling createSmsPackageUsingPOST\"\n      )\n    }\n    if (opts.packageType === undefined || opts.packageType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.packageType' when calling createSmsPackageUsingPOST\"\n      )\n    }\n    if (opts.specification === undefined || opts.specification === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.specification' when calling createSmsPackageUsingPOST\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.packageCount !== undefined && opts.packageCount !== null) {\n      postBody['packageCount'] = opts.packageCount\n    }\n    if (opts.packageType !== undefined && opts.packageType !== null) {\n      postBody['packageType'] = opts.packageType\n    }\n    if (opts.specification !== undefined && opts.specification !== null) {\n      postBody['specification'] = opts.specification\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSmsPackageUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsPackages',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询套餐包详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.packageId - 套餐包id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param smsPackageVO smsPackageVO\n      */\n\n  getSmsPackageByIdUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.packageId === undefined || opts.packageId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.packageId' when calling getSmsPackageByIdUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      packageId: opts.packageId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSmsPackageByIdUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsPackages/{packageId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询套餐包规格列表\n      * @param {Object} opts - parameters\n      * @param {integer} opts.packageType - 套餐包类型，1通道短信 2官方短信\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param specificationVO specificationVOS\n      */\n\n  getSmsPackageSpecificationsUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.packageType === undefined || opts.packageType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.packageType' when calling getSmsPackageSpecificationsUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      packageType: opts.packageType\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSmsPackageSpecificationsUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsPackages/{packageType}:querySpecifications',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量发送短信\n      * @param {Object} opts - parameters\n      * @param {} opts.appId - 应用id\n      * @param {} [opts.params] - 短信模板变量对应的数据值  optional\n      * @param {} opts.phoneList - 群发的国内电话号码,群发时一次最多不要超过100个手机号\n      * @param {} opts.signId - 签名id\n      * @param {} opts.templateId - 模板id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param mtResVO mtResVO\n      */\n\n  sendMessagesUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling sendMessagesUsingPOST\"\n      )\n    }\n    if (opts.phoneList === undefined || opts.phoneList === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.phoneList' when calling sendMessagesUsingPOST\"\n      )\n    }\n    if (opts.signId === undefined || opts.signId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signId' when calling sendMessagesUsingPOST\"\n      )\n    }\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling sendMessagesUsingPOST\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.params !== undefined && opts.params !== null) {\n      postBody['params'] = opts.params\n    }\n    if (opts.phoneList !== undefined && opts.phoneList !== null) {\n      postBody['phoneList'] = opts.phoneList\n    }\n    if (opts.signId !== undefined && opts.signId !== null) {\n      postBody['signId'] = opts.signId\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call sendMessagesUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsSendMessages',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据订单号发送短信\n      * @param {Object} opts - parameters\n      * @param {} opts.appId - 应用id\n      * @param {} opts.signId - 签名id\n      * @param {} opts.templateId - 模板id\n      * @param {} opts.venderId - 商家id\n      * @param {} opts.orderId - 订单编号\n      * @param {} [opts.params] - 短信模板变量对应的数据值  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param mtResVO mtResVO\n      */\n\n  sendMessagesByOrderIdUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling sendMessagesByOrderIdUsingPOST\"\n      )\n    }\n    if (opts.signId === undefined || opts.signId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signId' when calling sendMessagesByOrderIdUsingPOST\"\n      )\n    }\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling sendMessagesByOrderIdUsingPOST\"\n      )\n    }\n    if (opts.venderId === undefined || opts.venderId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.venderId' when calling sendMessagesByOrderIdUsingPOST\"\n      )\n    }\n    if (opts.orderId === undefined || opts.orderId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.orderId' when calling sendMessagesByOrderIdUsingPOST\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.signId !== undefined && opts.signId !== null) {\n      postBody['signId'] = opts.signId\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n    if (opts.venderId !== undefined && opts.venderId !== null) {\n      postBody['venderId'] = opts.venderId\n    }\n    if (opts.orderId !== undefined && opts.orderId !== null) {\n      postBody['orderId'] = opts.orderId\n    }\n    if (opts.params !== undefined && opts.params !== null) {\n      postBody['params'] = opts.params\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call sendMessagesByOrderIdUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/sendMessagesByOrderId',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据pin发送短信\n      * @param {Object} opts - parameters\n      * @param {} opts.appId - 应用id\n      * @param {} opts.signId - 签名id\n      * @param {} opts.templateId - 模板id\n      * @param {} opts.pin - 用户pin\n      * @param {} [opts.params] - 短信模板变量对应的数据值  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param mtResVO mtResVO\n      */\n\n  sendMessagesByPinUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling sendMessagesByPinUsingPOST\"\n      )\n    }\n    if (opts.signId === undefined || opts.signId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signId' when calling sendMessagesByPinUsingPOST\"\n      )\n    }\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling sendMessagesByPinUsingPOST\"\n      )\n    }\n    if (opts.pin === undefined || opts.pin === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.pin' when calling sendMessagesByPinUsingPOST\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.signId !== undefined && opts.signId !== null) {\n      postBody['signId'] = opts.signId\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n    if (opts.pin !== undefined && opts.pin !== null) {\n      postBody['pin'] = opts.pin\n    }\n    if (opts.params !== undefined && opts.params !== null) {\n      postBody['params'] = opts.params\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call sendMessagesByPinUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/sendMessagesByPin',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据加密pin发送短信\n      * @param {Object} opts - parameters\n      * @param {} opts.appId - 应用id\n      * @param {} opts.signId - 签名id\n      * @param {} opts.templateId - 模板id\n      * @param {} opts.encPins - 加密pin集合，不能超过100个\n      * @param {} [opts.params] - 短信模板变量对应的数据值  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param mtResVO mtResVO\n      */\n\n  sendMessagesByEncPinUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling sendMessagesByEncPinUsingPOST\"\n      )\n    }\n    if (opts.signId === undefined || opts.signId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signId' when calling sendMessagesByEncPinUsingPOST\"\n      )\n    }\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling sendMessagesByEncPinUsingPOST\"\n      )\n    }\n    if (opts.encPins === undefined || opts.encPins === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.encPins' when calling sendMessagesByEncPinUsingPOST\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.signId !== undefined && opts.signId !== null) {\n      postBody['signId'] = opts.signId\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n    if (opts.encPins !== undefined && opts.encPins !== null) {\n      postBody['encPins'] = opts.encPins\n    }\n    if (opts.params !== undefined && opts.params !== null) {\n      postBody['params'] = opts.params\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call sendMessagesByEncPinUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/sendMessagesByEncPin',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询短信签名列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用id\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} [opts.status] - 状态，1申请中 2拒绝 3通过  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param smsSignVO smsSigns\n      * @param integer totalCount\n      */\n\n  listSmsSignsUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling listSmsSignsUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      queryParams['appId'] = opts.appId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSmsSignsUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsSigns',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建短信签名\n      * @param {Object} opts - parameters\n      * @param {} opts.appId - 应用id\n      * @param {} [opts.applyExplanation] - 申请说明  optional\n      * @param {} [opts.signAttorneyUrl] - 授权委托下载地址，若短信签名用途为他用，涉及第三方权益需上传，上传至 oss  optional\n      * @param {} opts.signCertificateUrl - 证明材料下载地址，上传至 oss\n      * @param {} opts.signContent - 若签名内容侵犯到第三方权益必须获得第三方真实授权，长度为 2~12 个字符无须添加【】、()、[] 符号，签名发送会自带【】符号，避免重复\n      * @param {} [opts.signOtherCertificateUrl] - 其他证明材料下载地址 上传至 oss  optional\n      * @param {} opts.signPurpose - 签名用途，0自用 1他用\n      * @param {} opts.signTypeId - 签名类型id，调用listSmsSignTypesUsingGET 接口获取\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string signId  签名id\n      */\n\n  createSmsSignUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling createSmsSignUsingPOST\"\n      )\n    }\n    if (\n      opts.signCertificateUrl === undefined ||\n      opts.signCertificateUrl === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signCertificateUrl' when calling createSmsSignUsingPOST\"\n      )\n    }\n    if (opts.signContent === undefined || opts.signContent === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signContent' when calling createSmsSignUsingPOST\"\n      )\n    }\n    if (opts.signPurpose === undefined || opts.signPurpose === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signPurpose' when calling createSmsSignUsingPOST\"\n      )\n    }\n    if (opts.signTypeId === undefined || opts.signTypeId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signTypeId' when calling createSmsSignUsingPOST\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.applyExplanation !== undefined && opts.applyExplanation !== null) {\n      postBody['applyExplanation'] = opts.applyExplanation\n    }\n    if (opts.signAttorneyUrl !== undefined && opts.signAttorneyUrl !== null) {\n      postBody['signAttorneyUrl'] = opts.signAttorneyUrl\n    }\n    if (\n      opts.signCertificateUrl !== undefined &&\n      opts.signCertificateUrl !== null\n    ) {\n      postBody['signCertificateUrl'] = opts.signCertificateUrl\n    }\n    if (opts.signContent !== undefined && opts.signContent !== null) {\n      postBody['signContent'] = opts.signContent\n    }\n    if (\n      opts.signOtherCertificateUrl !== undefined &&\n      opts.signOtherCertificateUrl !== null\n    ) {\n      postBody['signOtherCertificateUrl'] = opts.signOtherCertificateUrl\n    }\n    if (opts.signPurpose !== undefined && opts.signPurpose !== null) {\n      postBody['signPurpose'] = opts.signPurpose\n    }\n    if (opts.signTypeId !== undefined && opts.signTypeId !== null) {\n      postBody['signTypeId'] = opts.signTypeId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSmsSignUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsSigns',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询短信签名详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.signId - 签名id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param smsSignVO smsSignVO\n      */\n\n  getSmsSignByIdUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.signId === undefined || opts.signId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signId' when calling getSmsSignByIdUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      signId: opts.signId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSmsSignByIdUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsSigns/{signId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  编辑短信签名\n      * @param {Object} opts - parameters\n      * @param {string} opts.signId - 签名id\n      * @param {} opts.appId - 应用id\n      * @param {} [opts.applyExplanation] - 申请说明  optional\n      * @param {} [opts.signAttorneyUrl] - 授权委托下载地址，若短信签名用途为他用，涉及第三方权益需上传，上传至 oss  optional\n      * @param {} opts.signCertificateUrl - 证明材料下载地址，上传至 oss\n      * @param {} opts.signContent - 若签名内容侵犯到第三方权益必须获得第三方真实授权，长度为 2~12 个字符无须添加【】、()、[] 符号，签名发送会自带【】符号，避免重复\n      * @param {} [opts.signOtherCertificateUrl] - 其他证明材料下载地址 上传至 oss  optional\n      * @param {} opts.signPurpose - 签名用途，0自用 1他用\n      * @param {} opts.signTypeId - 签名类型id，调用listSmsSignTypesUsingGET 接口获取\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string signId  签名id\n      */\n\n  modifySmsSignUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    if (opts.signId === undefined || opts.signId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signId' when calling modifySmsSignUsingPOST\"\n      )\n    }\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling modifySmsSignUsingPOST\"\n      )\n    }\n    if (\n      opts.signCertificateUrl === undefined ||\n      opts.signCertificateUrl === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signCertificateUrl' when calling modifySmsSignUsingPOST\"\n      )\n    }\n    if (opts.signContent === undefined || opts.signContent === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signContent' when calling modifySmsSignUsingPOST\"\n      )\n    }\n    if (opts.signPurpose === undefined || opts.signPurpose === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signPurpose' when calling modifySmsSignUsingPOST\"\n      )\n    }\n    if (opts.signTypeId === undefined || opts.signTypeId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signTypeId' when calling modifySmsSignUsingPOST\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.applyExplanation !== undefined && opts.applyExplanation !== null) {\n      postBody['applyExplanation'] = opts.applyExplanation\n    }\n    if (opts.signAttorneyUrl !== undefined && opts.signAttorneyUrl !== null) {\n      postBody['signAttorneyUrl'] = opts.signAttorneyUrl\n    }\n    if (\n      opts.signCertificateUrl !== undefined &&\n      opts.signCertificateUrl !== null\n    ) {\n      postBody['signCertificateUrl'] = opts.signCertificateUrl\n    }\n    if (opts.signContent !== undefined && opts.signContent !== null) {\n      postBody['signContent'] = opts.signContent\n    }\n    if (\n      opts.signOtherCertificateUrl !== undefined &&\n      opts.signOtherCertificateUrl !== null\n    ) {\n      postBody['signOtherCertificateUrl'] = opts.signOtherCertificateUrl\n    }\n    if (opts.signPurpose !== undefined && opts.signPurpose !== null) {\n      postBody['signPurpose'] = opts.signPurpose\n    }\n    if (opts.signTypeId !== undefined && opts.signTypeId !== null) {\n      postBody['signTypeId'] = opts.signTypeId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      signId: opts.signId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifySmsSignUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsSigns/{signId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询短信签名类型列表\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param signType signTypes\n      */\n\n  listSmsSignTypesUsingGET (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSmsSignTypesUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsSignTypes',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询短信发送任务列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用id\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {integer} [opts.status] - 状态，1申请中 2拒绝 3通过  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param smsTaskVO smsTasks\n      * @param integer totalCount\n      */\n\n  listSmsTasksUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling listSmsTasksUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      queryParams['appId'] = opts.appId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSmsTasksUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsTasks',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建短信发送任务\n      * @param {Object} opts - parameters\n      * @param {} opts.appId - 应用id\n      * @param {} [opts.sendNumberUrl] - 短信发送号码集合文件  optional\n      * @param {} [opts.sendTime] - 短信发送时间，不传表示立即发送  optional\n      * @param {} opts.signId - 短信签名id\n      * @param {} opts.taskName - 任务名称\n      * @param {} opts.templateId - 短信模板id\n      * @param {} [opts.taskType] - 任务类型，1：通道短信 2：营销短信  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId  任务id\n      */\n\n  createSmsTaskUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling createSmsTaskUsingPOST\"\n      )\n    }\n    if (opts.signId === undefined || opts.signId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signId' when calling createSmsTaskUsingPOST\"\n      )\n    }\n    if (opts.taskName === undefined || opts.taskName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskName' when calling createSmsTaskUsingPOST\"\n      )\n    }\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling createSmsTaskUsingPOST\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.sendNumberUrl !== undefined && opts.sendNumberUrl !== null) {\n      postBody['sendNumberUrl'] = opts.sendNumberUrl\n    }\n    if (opts.sendTime !== undefined && opts.sendTime !== null) {\n      postBody['sendTime'] = opts.sendTime\n    }\n    if (opts.signId !== undefined && opts.signId !== null) {\n      postBody['signId'] = opts.signId\n    }\n    if (opts.taskName !== undefined && opts.taskName !== null) {\n      postBody['taskName'] = opts.taskName\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n    if (opts.taskType !== undefined && opts.taskType !== null) {\n      postBody['taskType'] = opts.taskType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSmsTaskUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsTasks',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询短信发送任务详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param smsTaskVO smsTaskVO\n      */\n\n  getSmsTaskIdUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling getSmsTaskIdUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSmsTaskIdUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsTasks/{taskId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  编辑短信发送任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务id\n      * @param {} opts.appId - 应用id\n      * @param {} [opts.sendNumberUrl] - 短信发送号码集合文件  optional\n      * @param {} [opts.sendTime] - 短信发送时间，不传表示立即发送  optional\n      * @param {} opts.signId - 短信签名id\n      * @param {} opts.taskName - 任务名称\n      * @param {} opts.templateId - 短信模板id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string taskId  任务id\n      */\n\n  modifySmsTaskUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling modifySmsTaskUsingPOST\"\n      )\n    }\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling modifySmsTaskUsingPOST\"\n      )\n    }\n    if (opts.signId === undefined || opts.signId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signId' when calling modifySmsTaskUsingPOST\"\n      )\n    }\n    if (opts.taskName === undefined || opts.taskName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskName' when calling modifySmsTaskUsingPOST\"\n      )\n    }\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling modifySmsTaskUsingPOST\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.sendNumberUrl !== undefined && opts.sendNumberUrl !== null) {\n      postBody['sendNumberUrl'] = opts.sendNumberUrl\n    }\n    if (opts.sendTime !== undefined && opts.sendTime !== null) {\n      postBody['sendTime'] = opts.sendTime\n    }\n    if (opts.signId !== undefined && opts.signId !== null) {\n      postBody['signId'] = opts.signId\n    }\n    if (opts.taskName !== undefined && opts.taskName !== null) {\n      postBody['taskName'] = opts.taskName\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      postBody['templateId'] = opts.templateId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifySmsTaskUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsTasks/{taskId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  任务删除是否成功\n      */\n\n  taskDeleteUsingDelete (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling taskDeleteUsingDelete\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call taskDeleteUsingDelete with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsTasks/{taskId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  启动任务\n      * @param {Object} opts - parameters\n      * @param {string} opts.taskId - 任务id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  任务启动是否成功\n      */\n\n  taskStartUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.taskId === undefined || opts.taskId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.taskId' when calling taskStartUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      taskId: opts.taskId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call taskStartUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsTasks/{taskId}:start',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取短信任务中的短信内容及计费条数\n      * @param {Object} opts - parameters\n      * @param {string} opts.signId - 签名id\n      * @param {string} opts.templateId - 模板id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string content  短信内容预览\n      * @param integer chargeCount  计费条数\n      */\n\n  getSmsTaskContentUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.signId === undefined || opts.signId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.signId' when calling getSmsTaskContentUsingGET\"\n      )\n    }\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling getSmsTaskContentUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.signId !== undefined && opts.signId !== null) {\n      queryParams['signId'] = opts.signId\n    }\n    if (opts.templateId !== undefined && opts.templateId !== null) {\n      queryParams['templateId'] = opts.templateId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSmsTaskContentUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsTasks:getSmsTaskContent',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询短信模板列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.appId - 应用id\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 分页大小  optional\n      * @param {string} [opts.status] - 状态，1申请中 2拒绝 3通过  optional\n      * @param {string} [opts.templateTypes] - 要查询的模板类型，多个以 , 隔开(0 验证码短信,1 通知短信,2 推广短信)  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param smsTemplateVO smsTemplates\n      * @param integer totalCount\n      */\n\n  listSmsTemplatesUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling listSmsTemplatesUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      queryParams['appId'] = opts.appId\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.status !== undefined && opts.status !== null) {\n      queryParams['status'] = opts.status\n    }\n    if (opts.templateTypes !== undefined && opts.templateTypes !== null) {\n      queryParams['templateTypes'] = opts.templateTypes\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call listSmsTemplatesUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsTemplates',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建短信模板\n      * @param {Object} opts - parameters\n      * @param {} opts.appId - 应用id\n      * @param {} [opts.applyExplanation] - 申请说明  optional\n      * @param {} opts.templateContent - 模板内容\n      * @param {} opts.templateName - 模板名称\n      * @param {} opts.templateType - 模板类型:0 验证码短信,1 通知短信,2 推广短信\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string templateId  模板id\n      */\n\n  createSmsTemplateUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling createSmsTemplateUsingPOST\"\n      )\n    }\n    if (opts.templateContent === undefined || opts.templateContent === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateContent' when calling createSmsTemplateUsingPOST\"\n      )\n    }\n    if (opts.templateName === undefined || opts.templateName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateName' when calling createSmsTemplateUsingPOST\"\n      )\n    }\n    if (opts.templateType === undefined || opts.templateType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateType' when calling createSmsTemplateUsingPOST\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.applyExplanation !== undefined && opts.applyExplanation !== null) {\n      postBody['applyExplanation'] = opts.applyExplanation\n    }\n    if (opts.templateContent !== undefined && opts.templateContent !== null) {\n      postBody['templateContent'] = opts.templateContent\n    }\n    if (opts.templateName !== undefined && opts.templateName !== null) {\n      postBody['templateName'] = opts.templateName\n    }\n    if (opts.templateType !== undefined && opts.templateType !== null) {\n      postBody['templateType'] = opts.templateType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSmsTemplateUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsTemplates',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询短信模板详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param smsTemplateVO smsTemplateVO\n      */\n\n  getSmsTemplateByIdUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling getSmsTemplateByIdUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call getSmsTemplateByIdUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsTemplates/{templateId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  编辑短信模板\n      * @param {Object} opts - parameters\n      * @param {string} opts.templateId - 模板id\n      * @param {} opts.appId - 应用id\n      * @param {} [opts.applyExplanation] - 申请说明  optional\n      * @param {} opts.templateContent - 模板内容\n      * @param {} opts.templateName - 模板名称\n      * @param {} opts.templateType - 模板类型:0 验证码短信,1 通知短信,2 推广短信\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string templateId  模板id\n      */\n\n  modifySmsTemplateUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    if (opts.templateId === undefined || opts.templateId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateId' when calling modifySmsTemplateUsingPOST\"\n      )\n    }\n    if (opts.appId === undefined || opts.appId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appId' when calling modifySmsTemplateUsingPOST\"\n      )\n    }\n    if (opts.templateContent === undefined || opts.templateContent === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateContent' when calling modifySmsTemplateUsingPOST\"\n      )\n    }\n    if (opts.templateName === undefined || opts.templateName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateName' when calling modifySmsTemplateUsingPOST\"\n      )\n    }\n    if (opts.templateType === undefined || opts.templateType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.templateType' when calling modifySmsTemplateUsingPOST\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appId !== undefined && opts.appId !== null) {\n      postBody['appId'] = opts.appId\n    }\n    if (opts.applyExplanation !== undefined && opts.applyExplanation !== null) {\n      postBody['applyExplanation'] = opts.applyExplanation\n    }\n    if (opts.templateContent !== undefined && opts.templateContent !== null) {\n      postBody['templateContent'] = opts.templateContent\n    }\n    if (opts.templateName !== undefined && opts.templateName !== null) {\n      postBody['templateName'] = opts.templateName\n    }\n    if (opts.templateType !== undefined && opts.templateType !== null) {\n      postBody['templateType'] = opts.templateType\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      templateId: opts.templateId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifySmsTemplateUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsTemplates/{templateId}',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  开通云鼎短信服务\n      * @param {Object} opts - parameters\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  是否开通成功\n      */\n\n  openServiceUsingPOST (opts, callback) {\n    opts = opts || {}\n\n    let postBody = {}\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call openServiceUsingPOST with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsUsers',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询用户短信余量\n      * @param {Object} opts - parameters\n      * @param {integer} opts.packageType - 通道类型，1通道短信，2官方短信\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer packageType  套餐包类型 1通道短信，2官方短信\n      * @param integer remaining  剩余可调用次数\n      * @param integer totalCount  总量\n      * @param string remainingRate  剩余百分比\n      */\n\n  queryRemainingUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.packageType === undefined || opts.packageType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.packageType' when calling queryRemainingUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      packageType: opts.packageType\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryRemainingUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsUsers/{packageType}:queryRemaining',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询当前自然月内所有应用发送量总和\n      * @param {Object} opts - parameters\n      * @param {integer} opts.packageType - 通道类型，1通道短信，2官方短信\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer packageType  套餐包类型 1通道短信，2官方短信\n      * @param integer amount  发送量\n      */\n\n  queryAmountUsingGET (opts, callback) {\n    opts = opts || {}\n\n    if (opts.packageType === undefined || opts.packageType === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.packageType' when calling queryAmountUsingGET\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      packageType: opts.packageType\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  ydsms/1.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call queryAmountUsingGET with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/smsUsers/{packageType}:queryAmount',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = YDSMS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/yunding/v2/yunding.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * yunding-user\n * 云鼎-用户操作相关接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'yunding'\nService._services[serviceId] = true\n\n/**\n * yunding service.\n * @version 2.0.8\n */\n\nclass YUNDING extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'yunding.jdcloud-api.com'\n    options.basePath = '/v2' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  云拔测-可用性agent任务查询接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 实例 Id\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param tasksInfo tasks\n      */\n\n  describeTasks (opts, callback) {\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeTasks\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud',\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeTasks with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/agentTasks/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  监控数据上报。\n      * @param {Object} opts - parameters\n      * @param {string} opts.appCode - 目前统一用jcloud\n      * @param {string} opts.serviceCode - 资源的类型，取值vm,ip,database,storage,disk,cdn,redis,balance,nat_gw,db_ro,vpn,ddos等,新接入的产品要求与opentapi命名的产品线名称一致\n      * @param {string} opts.region - 地域信息，如 cn-north-1 等\n      * @param {string} opts.resourceId - 资源的唯一表示，一般为uuid\n      * @param {array} [opts.dataPoints] - 监控数据点  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer failed  失败数量\n      * @param integer success  成功数量\n      */\n\n  put (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  put\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.appCode === undefined || opts.appCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appCode' when calling put\"\n      )\n    }\n    if (opts.serviceCode === undefined || opts.serviceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceCode' when calling put\"\n      )\n    }\n    if (opts.region === undefined || opts.region === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.region' when calling put\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling put\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.region !== undefined && opts.region !== null) {\n      postBody['region'] = opts.region\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      postBody['resourceId'] = opts.resourceId\n    }\n    if (opts.dataPoints !== undefined && opts.dataPoints !== null) {\n      postBody['dataPoints'] = opts.dataPoints\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call put with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/put',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  监控数据上报。\n      * @param {Object} opts - parameters\n      * @param {string} opts.appCode - 目前统一用jcloud\n      * @param {string} opts.serviceCode - 资源的类型，取值vm,ip,database,storage,disk,cdn,redis,balance,nat_gw,db_ro,vpn,ddos等,新接入的产品要求与opentapi命名的产品线名称一致\n      * @param {string} opts.region - 地域信息，如 cn-north-1 等\n      * @param {string} opts.resourceId - 资源的唯一表示，一般为uuid\n      * @param {array} [opts.dataPoints] - 监控数据点  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param integer failed  失败数量\n      * @param integer success  成功数量\n      */\n\n  putProductMetricData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  putProductMetricData\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.appCode === undefined || opts.appCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appCode' when calling putProductMetricData\"\n      )\n    }\n    if (opts.serviceCode === undefined || opts.serviceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceCode' when calling putProductMetricData\"\n      )\n    }\n    if (opts.region === undefined || opts.region === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.region' when calling putProductMetricData\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling putProductMetricData\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.appCode !== undefined && opts.appCode !== null) {\n      postBody['appCode'] = opts.appCode\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n    if (opts.region !== undefined && opts.region !== null) {\n      postBody['region'] = opts.region\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      postBody['resourceId'] = opts.resourceId\n    }\n    if (opts.dataPoints !== undefined && opts.dataPoints !== null) {\n      postBody['dataPoints'] = opts.dataPoints\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call putProductMetricData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/put',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询监控图可用的产品线列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.productType] - 要查询的产品线类型   0：all    1：资源监控   2：其它   默认：1。若指定了查询的serviceCode，则忽略该参数  optional\n      * @param {filter} [opts.filters] - 服务码列表\nfilter name 为serviceCodes表示查询多个产品线的规则  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param serviceInfoV2 services\n      */\n\n  describeServices (opts, callback) {\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.productType !== undefined && opts.productType !== null) {\n      queryParams['productType'] = opts.productType\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeServices with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/ydServices',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  根据不同的聚合方式将metric的数据聚合为一个点。downAggrType：last(最后一个点)、max(最大值)、min(最小值)、avg(平均值)。该接口返回值为上报metric的原始值，没有做单位转换。metric介绍：&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;Metrics&lt;/a&gt;\n      * @param {Object} opts - parameters\n      * @param {string} opts.metric - 监控项英文标识(id)\n      * @param {string} opts.serviceCode - 资源的类型，取值vm, lb, ip, database 等。可用的serviceCode请使用describeServices接口查询\n      * @param {string} [opts.dimension] - 资源的维度。serviceCode下可用的dimension请使用describeServices接口查询  optional\n      * @param {string} opts.resourceId - 资源的uuid，支持多个resourceId批量查询，每个id用竖线分隔。 如：id1|id2|id3|id4\n      * @param {string} [opts.startTime] - 查询时间范围的开始时间， UTC时间，格式：2016-12-11T00:00:00+0800（早于30d时，将被重置为30d）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.endTime] - 查询时间范围的结束时间， UTC时间，格式：2016-12-11T00:00:00+0800（为空时，将由startTime与timeInterval计算得出）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.timeInterval] - 查询的时间间隔，最大不超过30天，支持分钟级别,小时级别，天级别，例如：1m、1h、1d  optional\n      * @param {string} [opts.aggrType] - 聚合方式：max avg min等,用于不同维度之间聚合  optional\n      * @param {string} [opts.downAggrType] - 聚合方式：max avg min等,用于将维度内一个周期数据聚合为一个点的聚合方式,默认last  optional\n      * @param {tagFilter} [opts.tags] - 自定义标签  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param lastDownsampleRespItem items\n      */\n\n  lastDownsample (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  lastDownsample\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.metric === undefined || opts.metric === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metric' when calling lastDownsample\"\n      )\n    }\n    if (opts.serviceCode === undefined || opts.serviceCode === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.serviceCode' when calling lastDownsample\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling lastDownsample\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.dimension !== undefined && opts.dimension !== null) {\n      queryParams['dimension'] = opts.dimension\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      queryParams['timeInterval'] = opts.timeInterval\n    }\n    if (opts.aggrType !== undefined && opts.aggrType !== null) {\n      queryParams['aggrType'] = opts.aggrType\n    }\n    if (opts.downAggrType !== undefined && opts.downAggrType !== null) {\n      queryParams['downAggrType'] = opts.downAggrType\n    }\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId,\n      metric: opts.metric\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call lastDownsample with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydMetrics/{metric}/lastDownsample',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看某资源单个监控项数据，metric介绍：&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;Metrics&lt;/a&gt;，可以使用接口&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;describeMetrics&lt;/a&gt;：查询产品线可用的metric列表。\n      * @param {Object} opts - parameters\n      * @param {string} opts.metric - 监控项英文标识(id)\n      * @param {string} [opts.aggrType] - 聚合方式，用于不同时间轴上的聚合。如balance产品同一个resourceId下存在port&#x3D;80和port&#x3D;8080等多种维度。可选值参考:sum、avg、min、max  optional\n      * @param {string} [opts.downSampleType] - 采样方式，用于在时间轴维度上将聚合周期内的数据聚合为一个点。可选值参考：sum(聚合周期内的数据求和)、avg(求平均)、last(最新值)、min(最小值)、max(最大值)  optional\n      * @param {string} [opts.startTime] - 查询时间范围的开始时间， UTC时间，格式：2016-12-11T00:00:00+0800（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.endTime] - 查询时间范围的结束时间， UTC时间，格式：2016-12-11T00:00:00+0800（为空时，将由startTime与timeInterval计算得出）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.timeInterval] - 时间间隔：1h，6h，12h，1d，3d，7d，14d，固定时间间隔，timeInterval默认为1h，当前时间往 前1h  optional\n      * @param {boolean} [opts.groupBy] - 是否对查询的tags分组  optional\n      * @param {boolean} [opts.rate] - 是否求速率  optional\n      * @param {string} [opts.serviceCode] - 资源的类型，取值vm, lb, ip, database 等,&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/api/describeservices?content&#x3D;API&amp;SOP&#x3D;JDCloud&quot;&gt;describeServices&lt;/a&gt;：查询己接入云监控的产品线列表  optional\n      * @param {string} [opts.dimension] - 资源的维度。查询serviceCode下可用的维度请使用describeServices接口  optional\n      * @param {string} opts.resourceId - 资源的uuid\n      * @param {tagFilter} [opts.tags] - 监控指标数据的维度信息,根据tags来筛选指标数据不同的维度  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metricData metricDatas\n      */\n\n  describeMetricData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMetricData\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.metric === undefined || opts.metric === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.metric' when calling describeMetricData\"\n      )\n    }\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling describeMetricData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.aggrType !== undefined && opts.aggrType !== null) {\n      queryParams['aggrType'] = opts.aggrType\n    }\n    if (opts.downSampleType !== undefined && opts.downSampleType !== null) {\n      queryParams['downSampleType'] = opts.downSampleType\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      queryParams['timeInterval'] = opts.timeInterval\n    }\n    if (opts.groupBy !== undefined && opts.groupBy !== null) {\n      queryParams['groupBy'] = opts.groupBy\n    }\n    if (opts.rate !== undefined && opts.rate !== null) {\n      queryParams['rate'] = opts.rate\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.dimension !== undefined && opts.dimension !== null) {\n      queryParams['dimension'] = opts.dimension\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId,\n      metric: opts.metric\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMetricData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydMetrics/{metric}/metricData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看某资源多个监控项数据，metric介绍：&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;Metrics&lt;/a&gt;，可以使用接口&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/metrics&quot;&gt;describeMetrics&lt;/a&gt;：查询产品线可用的metric列表。\n      * @param {Object} opts - parameters\n      * @param {string} [opts.aggrType] - 聚合方式，用于不同时间轴上的聚合。如balance产品同一个resourceId下存在port&#x3D;80和port&#x3D;8080等多种维度。可选值参考:sum、avg、min、max  optional\n      * @param {string} [opts.downSampleType] - 采样方式，用于在时间轴维度上将聚合周期内的数据聚合为一个点。可选值参考：sum(聚合周期内的数据求和)、avg(求平均)、last(最新值)、min(最小值)、max(最大值)  optional\n      * @param {string} [opts.startTime] - 查询时间范围的开始时间， UTC时间，格式：2016-12-11T00:00:00+0800（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.endTime] - 查询时间范围的结束时间， UTC时间，格式：2016-12-11T00:00:00+0800（为空时，将由startTime与timeInterval计算得出）（注意在url中+要转译为%2B故url中为2016-12-11T00:00:00%2B0800）  optional\n      * @param {string} [opts.timeInterval] - 时间间隔：1h，6h，12h，1d，3d，7d，14d，固定时间间隔，timeInterval默认为1h，当前时间往 前1h  optional\n      * @param {boolean} [opts.groupBy] - 是否对查询的tags分组  optional\n      * @param {boolean} [opts.rate] - 是否求速率  optional\n      * @param {string} [opts.serviceCode] - 资源的类型，取值vm, lb, ip, database 等,&lt;a href&#x3D;&quot;https://docs.jdcloud.com/cn/monitoring/api/describeservices?content&#x3D;API&amp;SOP&#x3D;JDCloud&quot;&gt;describeServices&lt;/a&gt;：查询己接入云监控的产品线列表  optional\n      * @param {string} [opts.dimension] - 资源的维度。查询serviceCode下可用的维度请使用describeServices接口  optional\n      * @param {string} opts.resourceId - 资源的uuid\n      * @param {boolean} [opts.multiResources] - 是否跨资源查询，默认为false。当该字段为false时，取resourceId字段进行查询；当该子弹为true时，忽略resourceId字段，从tags中取resourceId作为实际的多资源id处理。  optional\n      * @param {filter} [opts.filters] - 自定义过滤标签，查询时必须在filters中指定要查询的metric，支持多个metric。如：  name&#x3D;&#39;metric&#39;,values&#x3D;[&quot;metric1&quot;,&quot;metric2&quot;]  optional\n      * @param {tagFilter} [opts.tags] - 监控指标数据的维度信息,根据tags来筛选指标数据不同的维度  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param metricData metricDatas\n      */\n\n  batchDescribeMetricData (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  batchDescribeMetricData\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.resourceId === undefined || opts.resourceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.resourceId' when calling batchDescribeMetricData\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.aggrType !== undefined && opts.aggrType !== null) {\n      queryParams['aggrType'] = opts.aggrType\n    }\n    if (opts.downSampleType !== undefined && opts.downSampleType !== null) {\n      queryParams['downSampleType'] = opts.downSampleType\n    }\n    if (opts.startTime !== undefined && opts.startTime !== null) {\n      queryParams['startTime'] = opts.startTime\n    }\n    if (opts.endTime !== undefined && opts.endTime !== null) {\n      queryParams['endTime'] = opts.endTime\n    }\n    if (opts.timeInterval !== undefined && opts.timeInterval !== null) {\n      queryParams['timeInterval'] = opts.timeInterval\n    }\n    if (opts.groupBy !== undefined && opts.groupBy !== null) {\n      queryParams['groupBy'] = opts.groupBy\n    }\n    if (opts.rate !== undefined && opts.rate !== null) {\n      queryParams['rate'] = opts.rate\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      queryParams['serviceCode'] = opts.serviceCode\n    }\n    if (opts.dimension !== undefined && opts.dimension !== null) {\n      queryParams['dimension'] = opts.dimension\n    }\n    if (opts.resourceId !== undefined && opts.resourceId !== null) {\n      queryParams['resourceId'] = opts.resourceId\n    }\n    if (opts.multiResources !== undefined && opts.multiResources !== null) {\n      queryParams['multiResources'] = opts.multiResources\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call batchDescribeMetricData with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydMetricsData',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  给网卡分配secondaryIp接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkInterfaceId - networkInterface ID\n      * @param {boolean} [opts.force] - secondary ip被其他接口占用时，是否抢占。false：非抢占重分配，true：抢占重分配；按网段分配时，默认非抢占重分配，指定IP或者个数时，默认抢占重分配。  optional\n      * @param {array} [opts.secondaryIps] - 指定分配的secondaryIp地址  optional\n      * @param {number} [opts.secondaryIpCount] - 指定自动分配的secondaryIp个数  optional\n      * @param {integer} [opts.secondaryIpMaskLen] - 指定分配的网段掩码长度, 支持24-28位掩码长度，不能与secondaryIpCount或secondaryIps同时指定，不支持抢占重分配  optional\n      * @param {string} [opts.secondaryIpAddress] - 指定分配的网段中第一个secondaryIp地址，不能与secondaryIpCount或secondaryIps同时指定，secondaryIpAddress与secondaryIpMaskLen需要保持一致，否则无法创建  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  assignSecondaryIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  assignSecondaryIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling assignSecondaryIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.force !== undefined && opts.force !== null) {\n      postBody['force'] = opts.force\n    }\n    if (opts.secondaryIps !== undefined && opts.secondaryIps !== null) {\n      postBody['secondaryIps'] = opts.secondaryIps\n    }\n    if (opts.secondaryIpCount !== undefined && opts.secondaryIpCount !== null) {\n      postBody['secondaryIpCount'] = opts.secondaryIpCount\n    }\n    if (\n      opts.secondaryIpMaskLen !== undefined &&\n      opts.secondaryIpMaskLen !== null\n    ) {\n      postBody['secondaryIpMaskLen'] = opts.secondaryIpMaskLen\n    }\n    if (\n      opts.secondaryIpAddress !== undefined &&\n      opts.secondaryIpAddress !== null\n    ) {\n      postBody['secondaryIpAddress'] = opts.secondaryIpAddress\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkInterfaceId: opts.networkInterfaceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call assignSecondaryIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydNetworkInterfaces/{networkInterfaceId}:assignSecondaryIps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  给网卡删除secondaryIp接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkInterfaceId - networkInterface ID\n      * @param {array} [opts.secondaryIps] - 指定删除的secondaryIp地址  optional\n      * @param {array} [opts.secondaryCidrs] - 指定删除的secondaryIp网段  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  unassignSecondaryIps (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  unassignSecondaryIps\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling unassignSecondaryIps\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.secondaryIps !== undefined && opts.secondaryIps !== null) {\n      postBody['secondaryIps'] = opts.secondaryIps\n    }\n    if (opts.secondaryCidrs !== undefined && opts.secondaryCidrs !== null) {\n      postBody['secondaryCidrs'] = opts.secondaryCidrs\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkInterfaceId: opts.networkInterfaceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call unassignSecondaryIps with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydNetworkInterfaces/{networkInterfaceId}:unassignSecondaryIps',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询弹性网卡信息详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkInterfaceId - networkInterface ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param networkInterface networkInterface  networkInterface资源信息\n      */\n\n  describeNetworkInterface (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNetworkInterface\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling describeNetworkInterface\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkInterfaceId: opts.networkInterfaceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNetworkInterface with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydNetworkInterfaces/{networkInterfaceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除弹性网卡接口\n      * @param {Object} opts - parameters\n      * @param {string} opts.networkInterfaceId - networkInterface ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteNetworkInterface (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteNetworkInterface\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling deleteNetworkInterface\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      networkInterfaceId: opts.networkInterfaceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteNetworkInterface with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydNetworkInterfaces/{networkInterfaceId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询弹性网卡列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - networkInterfaceIds - 弹性网卡ID列表，支持多个\nnetworkInterfaceNames - 弹性网卡名称列表，支持多个\nvpcId - 弹性网卡所属vpc Id，支持单个\nsubnetId - 弹性网卡所属子网Id，支持单个\nrole - 网卡角色，取值范围：Primary（主网卡）、Secondary（辅助网卡）、Managed （受管网卡），支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param networkInterface networkInterfaces\n      * @param number totalCount  总数量\n      */\n\n  describeNetworkInterfaces (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeNetworkInterfaces\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeNetworkInterfaces with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydNetworkInterfaces',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建网卡接口，只能创建辅助网卡\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - 子网ID\n      * @param {string} [opts.az] - 可用区，用户的默认可用区，该参数无效，不建议使用  optional\n      * @param {string} [opts.networkInterfaceName] - 网卡名称，只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符。  optional\n      * @param {string} [opts.primaryIpAddress] - 网卡主IP，如果不指定，会自动从子网中分配  optional\n      * @param {array} [opts.secondaryIpAddresses] - SecondaryIp列表  optional\n      * @param {integer} [opts.secondaryIpCount] - 自动分配的SecondaryIp数量  optional\n      * @param {array} [opts.securityGroups] - 要绑定的安全组ID列表，最多指定5个安全组  optional\n      * @param {integer} [opts.sanityCheck] - 源和目标IP地址校验，取值为0或者1,默认为1  optional\n      * @param {string} [opts.description] - 描述,​ 允许输入UTF-8编码下的全部字符，不超过256字符  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string networkInterfaceId  弹性网卡Id\n      */\n\n  createNetworkInterface (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createNetworkInterface\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling createNetworkInterface\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n    if (opts.az !== undefined && opts.az !== null) {\n      postBody['az'] = opts.az\n    }\n    if (\n      opts.networkInterfaceName !== undefined &&\n      opts.networkInterfaceName !== null\n    ) {\n      postBody['networkInterfaceName'] = opts.networkInterfaceName\n    }\n    if (opts.primaryIpAddress !== undefined && opts.primaryIpAddress !== null) {\n      postBody['primaryIpAddress'] = opts.primaryIpAddress\n    }\n    if (\n      opts.secondaryIpAddresses !== undefined &&\n      opts.secondaryIpAddresses !== null\n    ) {\n      postBody['secondaryIpAddresses'] = opts.secondaryIpAddresses\n    }\n    if (opts.secondaryIpCount !== undefined && opts.secondaryIpCount !== null) {\n      postBody['secondaryIpCount'] = opts.secondaryIpCount\n    }\n    if (opts.securityGroups !== undefined && opts.securityGroups !== null) {\n      postBody['securityGroups'] = opts.securityGroups\n    }\n    if (opts.sanityCheck !== undefined && opts.sanityCheck !== null) {\n      postBody['sanityCheck'] = opts.sanityCheck\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createNetworkInterface with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydNetworkInterfaces',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询云数据库实例列表信息&lt;br&gt;此接口支持分页查询，默认每页20条。\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页;  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为100，取值范围：[10,100]，用于查询列表的接口  optional\n      * @param {integer} [opts.type] - 资源类型，MySQL：1，SqlServer：2  optional\n      * @param {filter} [opts.filters] - 过滤参数，多个过滤参数之间的关系为“与”(and)\n支持以下属性的过滤：\ninstanceId, 支持operator选项：eq\ninstanceName, 支持operator选项：eq\nengine, 支持operator选项：eq\nengineVersion, 支持operator选项：eq\ninstanceStatus, 支持operator选项：eq\nchargeMode, 支持operator选项：eq\nvpcId, 支持operator选项：eq\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dBInstance dbInstances\n      * @param integer totalCount\n      */\n\n  describeRdsInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRdsInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRdsInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydRdsInstances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询RDS实例（MySQL、SQL Server等）的详细信息以及MySQL只读实例详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param dBInstanceAttribute dbInstanceAttributes\n      */\n\n  describeRdsInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRdsInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeRdsInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRdsInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydRdsInstances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询RDS实例（MySQL、SQL Server等）的真实状态\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string instanceStatus  实例状态，参见[枚举参数定义](../Enum-Definitions/Enum-Definitions.md)\n      * @param string internalDns  内部floatIP的DNS，目前主要给云鼎使用，支持MySQL，SQL Server\n      */\n\n  describeInstanceInfo (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeInstanceInfo\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeInstanceInfo\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeInstanceInfo with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydRdsInstances/{instanceId}:describeInstanceInfo',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看RDS实例当前白名单。白名单是允许访问当前实例的IP/IP段列表，缺省情况下，白名单对本VPC开放。如果用户开启了外网访问的功能，还需要对外网的IP配置白名单。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param whiteList whiteLists\n      */\n\n  describeRdsWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRdsWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeRdsWhiteList\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRdsWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydRdsInstances/{instanceId}/whiteList',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改允许访问实例的IP白名单。白名单是允许访问当前实例的IP/IP段列表，缺省情况下，白名单对本VPC开放。如果用户开启了外网访问的功能，还需要对外网的IP配置白名单。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.ips - IP或IP段，不同的IP/IP段之间用英文逗号分隔，例如0.0.0.0/0,192.168.0.10\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyRdsWhiteList (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyRdsWhiteList\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling modifyRdsWhiteList\"\n      )\n    }\n    if (opts.ips === undefined || opts.ips === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ips' when calling modifyRdsWhiteList\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.ips !== undefined && opts.ips !== null) {\n      postBody['ips'] = opts.ips\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyRdsWhiteList with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydRdsInstances/{instanceId}/whiteList',\n      'PUT',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查看某个RDS实例下所有账号信息，包括账号名称、对各个数据库的访问权限信息等\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页;  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为100，取值范围：[10,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param account accounts\n      * @param integer totalCount\n      */\n\n  describeRdsAccounts (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRdsAccounts\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeRdsAccounts\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRdsAccounts with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydRdsInstances/{instanceId}/accounts',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建数据库账号，用户可以使用客户端，应用程序等通过该账号和密码登录RDS数据库实例。&lt;br&gt;为便于管理和恢复，RDS对账号进行了限制，数据库账号只能通过控制台或者OpenAPI进行创建、删除账号以及对账号授权等，用户不能通过SQL语句对账号进行相关操作。\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.accountName - 账号名，在同一个RDS实例中，账号名不能重复。账号名的具体规则可参见帮助中心文档:[名称及密码限制](../../../documentation/Database-and-Cache-Service/RDS/Introduction/Restrictions/SQLServer-Restrictions.md)\n      * @param {} opts.accountPassword - 密码,密码的具体规则可参见帮助中心文档:[名称及密码限制](../../../documentation/Database-and-Cache-Service/RDS/Introduction/Restrictions/SQLServer-Restrictions.md)\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createRdsAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createRdsAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createRdsAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling createRdsAccount\"\n      )\n    }\n    if (opts.accountPassword === undefined || opts.accountPassword === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountPassword' when calling createRdsAccount\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.accountName !== undefined && opts.accountName !== null) {\n      postBody['accountName'] = opts.accountName\n    }\n    if (opts.accountPassword !== undefined && opts.accountPassword !== null) {\n      postBody['accountPassword'] = opts.accountPassword\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRdsAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydRdsInstances/{instanceId}/accounts',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除数据库账号，账号删除后不可恢复，用户无法再使用该账号登录RDS实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.accountName - 账号名，在同一个实例中账号名不能重复\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRdsAccount (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRdsAccount\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteRdsAccount\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling deleteRdsAccount\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRdsAccount with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydRdsInstances/{instanceId}/accounts/{accountName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  授予账号的数据库访问权限，即该账号对数据库拥有什么权限。一个账号可以对多个数据库具有访问权限。&lt;br&gt;为便于管理，RDS对权限进行了归类，目前提供以下两种权限&lt;br&gt;- ro：只读权限，用户只能读取数据库中的数据，不能进行创建、插入、删除、更改等操作。&lt;br&gt;- rw：读写权限，用户可以对数据库进行增删改查等操作\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.accountName - 账号名，在同一个实例中账号名不能重复\n      * @param {array} opts.accountPrivileges - 账号的访问权限\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  grantRdsPrivilege (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  grantRdsPrivilege\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling grantRdsPrivilege\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling grantRdsPrivilege\"\n      )\n    }\n    if (\n      opts.accountPrivileges === undefined ||\n      opts.accountPrivileges === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountPrivileges' when calling grantRdsPrivilege\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.accountPrivileges !== undefined &&\n      opts.accountPrivileges !== null\n    ) {\n      postBody['accountPrivileges'] = opts.accountPrivileges\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call grantRdsPrivilege with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydRdsInstances/{instanceId}/accounts/{accountName}:grantPrivilege',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  取消该账号对某个数据库的所有权限。权限取消后，该账号将不能访问此数据库。取消账号对某个数据库的访问权限，不影响该账号对其他数据库的访问权限\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.accountName - 账号名，在同一个实例中账号名不能重复\n      * @param {array} [opts.dbNames] - 需要取消授权的数据库的名称。权限取消后，该账号将不能访问此数据库  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  revokePrivilege (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  revokePrivilege\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling revokePrivilege\"\n      )\n    }\n    if (opts.accountName === undefined || opts.accountName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.accountName' when calling revokePrivilege\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dbNames !== undefined && opts.dbNames !== null) {\n      postBody['dbNames'] = opts.dbNames\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      accountName: opts.accountName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call revokePrivilege with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydRdsInstances/{instanceId}/accounts/{accountName}:revokePrivilege',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  获取当前实例的所有数据库详细信息的列表\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} [opts.dbName] - 数据库名。如果不指定数据库名，则返回所有数据库列表&lt;br&gt;- **MySQL：不支持该字段**&lt;br&gt;- **SQL Server：支持该字段**  optional\n      * @param {integer} [opts.pageNumber] - 显示数据的页码，默认为1，取值范围：[-1,∞)。pageNumber为-1时，返回所有数据页码；超过总页数时，显示最后一页;  optional\n      * @param {integer} [opts.pageSize] - 每页显示的数据条数，默认为100，取值范围：[10,100]，用于查询列表的接口  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param database databases\n      * @param integer totalCount\n      */\n\n  describeRdsDatabases (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeRdsDatabases\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeRdsDatabases\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      queryParams['dbName'] = opts.dbName\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRdsDatabases with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydRdsInstances/{instanceId}/databases',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建一个数据库。 为了实例的管理和数据恢复，RDS对用户权限进行了限制，用户仅能通过控制台或本接口创建数据库\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {} opts.dbName - 数据库名，数据库名称的限制请参考[帮助中心文档](../../../documentation/Database-and-Cache-Service/RDS/Introduction/Restrictions/SQLServer-Restrictions.md)\n      * @param {} opts.characterSetName - 数据库的字符集名，当前支持的字符集请查看[枚举参数定义](../Enum-Definitions/Enum-Definitions.md)\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  createRdsDatabase (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createRdsDatabase\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling createRdsDatabase\"\n      )\n    }\n    if (opts.dbName === undefined || opts.dbName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbName' when calling createRdsDatabase\"\n      )\n    }\n    if (opts.characterSetName === undefined || opts.characterSetName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.characterSetName' when calling createRdsDatabase\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.dbName !== undefined && opts.dbName !== null) {\n      postBody['dbName'] = opts.dbName\n    }\n    if (opts.characterSetName !== undefined && opts.characterSetName !== null) {\n      postBody['characterSetName'] = opts.characterSetName\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createRdsDatabase with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydRdsInstances/{instanceId}/databases',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  从RDS实例中删除数据库。为便于管理和数据恢复，RDS对用户权限进行了控制，用户仅能通过控制台或本接口删除数据库 [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - RDS 实例ID，唯一标识一个RDS实例\n      * @param {string} opts.dbName - 库名称\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteRdsDatabase (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteRdsDatabase\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling deleteRdsDatabase\"\n      )\n    }\n    if (opts.dbName === undefined || opts.dbName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.dbName' when calling deleteRdsDatabase\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId,\n      dbName: opts.dbName\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteRdsDatabase with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydRdsInstances/{instanceId}/databases/{dbName}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询云鼎数据库实例列表\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.appKey - 应用appKey;\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rdsInstance clusters\n      * @param integer totalCount\n      */\n\n  describeYdRdsInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeYdRdsInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.appKey === undefined || opts.appKey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appKey' when calling describeYdRdsInstances\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.appKey !== undefined && opts.appKey !== null) {\n      queryParams['appKey'] = opts.appKey\n    }\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeYdRdsInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/rdsInstances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子网列表\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞), 页码超过总页数时, 显示最后一页  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {integer} [opts.type] - 子网类型，主机等资源子网：1；LB子网：2；数据库子网：3  optional\n      * @param {filter} [opts.filters] - subnetIds - subnet ID列表，支持多个\nsubnetNames - subnet名称列表，支持多个\nrouteTableId - 子网关联路由表Id，支持单个\naclId - 子网关联acl Id，支持单个\nvpcId - 子网所属VPC Id，支持单个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subnet subnets\n      * @param number totalCount  总数量\n      */\n\n  describeSubnets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSubnets\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.type !== undefined && opts.type !== null) {\n      queryParams['type'] = opts.type\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubnets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydSubnets/',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  创建子网\n      * @param {Object} opts - parameters\n      * @param {string} opts.vpcId - 子网所属vpc的Id\n      * @param {string} opts.subnetName - 子网名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”，不允许为空且不超过32字符。\n      * @param {string} opts.addressPrefix - 子网网段，vpc内子网网段不能重叠，cidr的取值范围：10.0.0.0/8、172.16.0.0/12和192.168.0.0/16及它们包含的子网，且子网掩码长度为16-28之间，如果vpc含有cidr，则必须为vpc所在cidr的子网\n      * @param {string} [opts.routeTableId] - 子网关联的路由表Id, 默认为vpc的默认路由表,子网关联路由表需检查路由表中已绑定的子网与本子网类型是否一致（一致标准为：或者都为标准子网，或者都为相同边缘可用区的边缘子网）  optional\n      * @param {string} [opts.description] - 子网描述信息,允许输入UTF-8编码下的全部字符，不超过256字符。  optional\n      * @param {integer} [opts.ipMaskLen] - 子网内预留网段掩码长度，此网段IP地址按照单个申请，子网内其余部分IP地址以网段形式分配。此参数非必选，缺省值为0，代表子网内所有IP地址都按照单个申请  optional\n      * @param {array} [opts.domainNames] - 域名后缀，不限制个数。总长度最长254个字符，仅支持字母，数字，中划线，下划线和点。  optional\n      * @param {array} [opts.domainNameServers] - 域名服务器地址。最多支持5个IPv4地址，不同IPv4地址使用逗号分隔。如不输入或输入空数组，默认使用京东云默认DNS域名服务器地址。如不添加默认DNS域名服务器，可能会导致您无法访问京东云云上基础服务，请谨慎操作  optional\n      * @param {boolean} [opts.dryRun] - 是否只预检此次请求。true：不会创建子网，只会对参数进行校验；false：正常的创建请求。默认为false。  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string subnetId  子网ID\n      */\n\n  createSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling createSubnet\"\n      )\n    }\n    if (opts.subnetName === undefined || opts.subnetName === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetName' when calling createSubnet\"\n      )\n    }\n    if (opts.addressPrefix === undefined || opts.addressPrefix === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.addressPrefix' when calling createSubnet\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      postBody['vpcId'] = opts.vpcId\n    }\n    if (opts.subnetName !== undefined && opts.subnetName !== null) {\n      postBody['subnetName'] = opts.subnetName\n    }\n    if (opts.addressPrefix !== undefined && opts.addressPrefix !== null) {\n      postBody['addressPrefix'] = opts.addressPrefix\n    }\n    if (opts.routeTableId !== undefined && opts.routeTableId !== null) {\n      postBody['routeTableId'] = opts.routeTableId\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.ipMaskLen !== undefined && opts.ipMaskLen !== null) {\n      postBody['ipMaskLen'] = opts.ipMaskLen\n    }\n    if (opts.domainNames !== undefined && opts.domainNames !== null) {\n      postBody['domainNames'] = opts.domainNames\n    }\n    if (\n      opts.domainNameServers !== undefined &&\n      opts.domainNameServers !== null\n    ) {\n      postBody['domainNameServers'] = opts.domainNameServers\n    }\n    if (opts.dryRun !== undefined && opts.dryRun !== null) {\n      postBody['dryRun'] = opts.dryRun\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydSubnets/',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询子网信息详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - Subnet ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param subnet subnet  子网资源信息\n      */\n\n  describeSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling describeSubnet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subnetId: opts.subnetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydSubnets/{subnetId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除子网\n      * @param {Object} opts - parameters\n      * @param {string} opts.subnetId - Subnet ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteSubnet (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteSubnet\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling deleteSubnet\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      subnetId: opts.subnetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteSubnet with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydSubnets/{subnetId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  批量查询云主机列表信息&lt;br&gt;此接口支持分页查询，默认每页20条。\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码；默认为1  optional\n      * @param {integer} [opts.pageSize] - 分页大小；默认为20；取值范围[10, 100]  optional\n      * @param {filter} [opts.filters] - instanceId - 云主机ID，精确匹配，支持多个\nprivateIpAddress - 主网卡内网主IP地址，模糊匹配，支持多个\naz - 可用区，精确匹配，支持多个\nvpcId - 私有网络ID，精确匹配，支持多个\nstatus - 云主机状态，精确匹配，支持多个，&lt;a href&#x3D;&quot;http://docs.jdcloud.com/virtual-machines/api/vm_status&quot;&gt;参考云主机状态&lt;/a&gt;\nname - 云主机名称，模糊匹配，支持单个\nimageId - 镜像ID，精确匹配，支持多个\nnetworkInterfaceId - 弹性网卡ID，精确匹配，支持多个\nsubnetId - 子网ID，精确匹配，支持多个\nagId - 使用可用组id，支持单个\nfaultDomain - 错误域，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instances\n      * @param number totalCount\n      */\n\n  describeVmInstances (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVmInstances\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVmInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydVmInstances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询一台云主机的详细信息\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param instance instance\n      */\n\n  describeVmInstance (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeVmInstance\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling describeVmInstance\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeVmInstance with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydVmInstances/{instanceId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  云主机绑定一块弹性网卡。&lt;br&gt;\n云主机状态必须为&lt;b&gt;running&lt;/b&gt;或&lt;b&gt;stopped&lt;/b&gt;状态，并且没有正在进行中的任务才可操作。&lt;br&gt;\n弹性网卡上如果绑定了弹性公网IP，那么其所在az需要与云主机的az保持一致，或者为全可用区型弹性公网IP，才可挂载该网卡。&lt;br&gt;\n云主机挂载弹性网卡的数量，不能超过实例规格的限制。可查询&lt;a href&#x3D;&quot;http://docs.jdcloud.com/virtual-machines/api/describeinstancetypes&quot;&gt;DescribeInstanceTypes&lt;/a&gt;接口获得指定规格可挂载弹性网卡的数量上限。&lt;br&gt;\n弹性网卡与云主机必须在相同vpc下。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID\n      * @param {string} opts.networkInterfaceId - 弹性网卡ID\n      * @param {boolean} [opts.autoDelete] - 随云主机删除而自动删除，默认为False  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  attachNetworkInterface (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  attachNetworkInterface\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling attachNetworkInterface\"\n      )\n    }\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling attachNetworkInterface\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.networkInterfaceId !== undefined &&\n      opts.networkInterfaceId !== null\n    ) {\n      postBody['networkInterfaceId'] = opts.networkInterfaceId\n    }\n    if (opts.autoDelete !== undefined && opts.autoDelete !== null) {\n      postBody['autoDelete'] = opts.autoDelete\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call attachNetworkInterface with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydVmInstances/{instanceId}:attachNetworkInterface',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  云主机缷载一块弹性网卡。&lt;br&gt;\n云主机状态必须为&lt;b&gt;running&lt;/b&gt;或&lt;b&gt;stopped&lt;/b&gt;状态，并且没有正在进行中的任务才可操作。&lt;br&gt;\n不能缷载主网卡。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.instanceId - 云主机ID\n      * @param {string} opts.networkInterfaceId - 弹性网卡ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  detachNetworkInterface (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  detachNetworkInterface\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.instanceId === undefined || opts.instanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.instanceId' when calling detachNetworkInterface\"\n      )\n    }\n    if (\n      opts.networkInterfaceId === undefined ||\n      opts.networkInterfaceId === null\n    ) {\n      throw new Error(\n        \"Missing the required parameter 'opts.networkInterfaceId' when calling detachNetworkInterface\"\n      )\n    }\n\n    let postBody = {}\n    if (\n      opts.networkInterfaceId !== undefined &&\n      opts.networkInterfaceId !== null\n    ) {\n      postBody['networkInterfaceId'] = opts.networkInterfaceId\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      instanceId: opts.instanceId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yunding/2.0.8'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call detachNetworkInterface with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/ydVmInstances/{instanceId}:detachNetworkInterface',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = YUNDING\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/yundingdatapush/v1/yundingdatapush.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * yunding-datapush\n * 云鼎数据推送OPENAPI接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'yundingdatapush'\nService._services[serviceId] = true\n\n/**\n * yundingdatapush service.\n * @version 1.0.3\n */\n\nJDCloud.YUNDINGDATAPUSH = class YUNDINGDATAPUSH extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'yundingdatapush.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  查询已经开通的用户\n      * @param {Object} opts - parameters\n      * @param {string} opts.appkey - appkey\n      * @param {integer} [opts.pageNumber] - 页码  optional\n      * @param {integer} [opts.pageSize] - 页大小  optional\n      * @param {string} [opts.ydRdsInstanceId] - 云鼎数据库实例ID  optional\n      * @param {string} [opts.rdsInstanceName] - 数据库实例名称  optional\n      * @param {string} [opts.venderId] - 商家ID  optional\n      * @param {string} [opts.venderName] - 商家店铺名称  optional\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param venderShow venders\n      */\n\n  describeDatapushVenders (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appkey === undefined || opts.appkey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appkey' when calling describeDatapushVenders\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.appkey !== undefined && opts.appkey !== null) {\n      queryParams['appkey'] = opts.appkey\n    }\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    if (opts.ydRdsInstanceId !== undefined && opts.ydRdsInstanceId !== null) {\n      queryParams['ydRdsInstanceId'] = opts.ydRdsInstanceId\n    }\n    if (opts.rdsInstanceName !== undefined && opts.rdsInstanceName !== null) {\n      queryParams['rdsInstanceName'] = opts.rdsInstanceName\n    }\n    if (opts.venderId !== undefined && opts.venderId !== null) {\n      queryParams['venderId'] = opts.venderId\n    }\n    if (opts.venderName !== undefined && opts.venderName !== null) {\n      queryParams['venderName'] = opts.venderName\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yundingdatapush/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeDatapushVenders with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/datapushVenders',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  添加数据推送用户\n      * @param {Object} opts - parameters\n      * @param {vender} opts.datapushVender - 添加数据推送用户对象\n\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  操作是否成功\n      */\n\n  addDatapushVender (opts, callback) {\n    opts = opts || {}\n\n    if (opts.datapushVender === undefined || opts.datapushVender === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.datapushVender' when calling addDatapushVender\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.datapushVender !== undefined && opts.datapushVender !== null) {\n      postBody['datapushVender'] = opts.datapushVender\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yundingdatapush/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call addDatapushVender with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/datapushVenders',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  删除数据推送用户\n      * @param {Object} opts - parameters\n      * @param {string} opts.appkey - appkey\n      * @param {string} opts.ydRdsInstanceId - 云鼎数据库实例ID\n      * @param {string} opts.venderId - 商家ID\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param boolean success  操作是否成功\n      */\n\n  deleteDatapushVender (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appkey === undefined || opts.appkey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appkey' when calling deleteDatapushVender\"\n      )\n    }\n    if (opts.ydRdsInstanceId === undefined || opts.ydRdsInstanceId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.ydRdsInstanceId' when calling deleteDatapushVender\"\n      )\n    }\n    if (opts.venderId === undefined || opts.venderId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.venderId' when calling deleteDatapushVender\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.appkey !== undefined && opts.appkey !== null) {\n      queryParams['appkey'] = opts.appkey\n    }\n    if (opts.ydRdsInstanceId !== undefined && opts.ydRdsInstanceId !== null) {\n      queryParams['ydRdsInstanceId'] = opts.ydRdsInstanceId\n    }\n    if (opts.venderId !== undefined && opts.venderId !== null) {\n      queryParams['venderId'] = opts.venderId\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yundingdatapush/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteDatapushVender with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/datapushVenders',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询已绑定数据推送的数据库实例\n      * @param {Object} opts - parameters\n      * @param {string} opts.appkey - appkey\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param rdsInstance rdsInstances\n      */\n\n  describeRdsInstances (opts, callback) {\n    opts = opts || {}\n\n    if (opts.appkey === undefined || opts.appkey === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.appkey' when calling describeRdsInstances\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.appkey !== undefined && opts.appkey !== null) {\n      queryParams['appkey'] = opts.appkey\n    }\n\n    let pathParams = {\n      regionId: 'jdcloud'\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  yundingdatapush/1.0.3'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeRdsInstances with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = this.makeRequest(\n      '/describeRdsInstances',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = JDCloud.YUNDINGDATAPUSH\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/repo/zfs/v1/zfs.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Mount-Target\n * 挂载目标相关接口。\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nrequire('../../../lib/node_loader')\nvar JDCloud = require('../../../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'zfs'\nService._services[serviceId] = true\n\n/**\n * zfs service.\n * @version 1.0.9\n */\n\nclass ZFS extends Service {\n  constructor (options = {}) {\n    options._defaultEndpoint = {}\n    options._defaultEndpoint.protocol =\n      options._defaultEndpoint.protocol || 'https'\n    options._defaultEndpoint.host =\n      options._defaultEndpoint.host || 'cfs.jdcloud-api.com'\n    options.basePath = '/v1' // 默认要设为空\"\"\n    super(serviceId, options)\n  }\n\n  /**\n      *  -   查询文件系统列表。\n-   filters多个过滤条件之间是逻辑与(AND)，每个条件内部的多个取值是逻辑或(OR)\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - fileSystemId - 文件系统ID，精确匹配，支持多个\nname - 文件系统名称，模糊匹配，支持单个\nstatus - 文件系统状态，精确匹配，支持多个 FileSystem Status/creating、available、in-use\n  optional\n      * @param {tagFilter} [opts.tags] - Tag筛选条件  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param fileSystem fileSystems\n      * @param integer totalCount  查询的文件系统数目\n      */\n\n  describeFileSystems (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeFileSystems\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n    Object.assign(queryParams, super.buildTagFilterParam(opts.tags, 'tags'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  zfs/1.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeFileSystems with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/fileSystems',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  - 创建一个新的文件系统，为这个文件系统分配一个Id\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.name - 文件系统名称\n      * @param {string} opts.description - 文件系统描述\n      * @param {string} opts.clientToken - 幂等性参数(只支持数字、大小写字母，且不能超过64字符)\n      * @param {string} [opts.fileSystemType] - 文件系统类型(通用型:gp1,容量型:std1),默认为通用型  optional\n      * @param {string} [opts.serviceCode] - 文件系统的serviceCode，默认为zfs  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string fileSystemId  文件系统 ID\n      */\n\n  createFileSystem (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createFileSystem\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.name === undefined || opts.name === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.name' when calling createFileSystem\"\n      )\n    }\n    if (opts.description === undefined || opts.description === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.description' when calling createFileSystem\"\n      )\n    }\n    if (opts.clientToken === undefined || opts.clientToken === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clientToken' when calling createFileSystem\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n    if (opts.fileSystemType !== undefined && opts.fileSystemType !== null) {\n      postBody['fileSystemType'] = opts.fileSystemType\n    }\n    if (opts.serviceCode !== undefined && opts.serviceCode !== null) {\n      postBody['serviceCode'] = opts.serviceCode\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  zfs/1.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createFileSystem with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/fileSystems',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询文件系统详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.fileSystemId - 文件系统ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param fileSystem fileSystem\n      */\n\n  describeFileSystem (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeFileSystem\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.fileSystemId === undefined || opts.fileSystemId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileSystemId' when calling describeFileSystem\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      fileSystemId: opts.fileSystemId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  zfs/1.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeFileSystem with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/fileSystems/{fileSystemId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  修改文件系统属性(name 和 description 必须要指定一个)\n      * @param {Object} opts - parameters\n      * @param {string} opts.fileSystemId - 文件系统ID\n      * @param {string} [opts.name] - 文件系统名称(参数规则：不可为空，只支持中文、数字、大小写字母、英文下划线“_”及中划线“-”，且不能超过32字符)  optional\n      * @param {string} [opts.description] - 文件系统描述(参数规则：不能超过256字符)  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  modifyFileSystemAttribute (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  modifyFileSystemAttribute\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.fileSystemId === undefined || opts.fileSystemId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileSystemId' when calling modifyFileSystemAttribute\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.name !== undefined && opts.name !== null) {\n      postBody['name'] = opts.name\n    }\n    if (opts.description !== undefined && opts.description !== null) {\n      postBody['description'] = opts.description\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      fileSystemId: opts.fileSystemId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  zfs/1.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call modifyFileSystemAttribute with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/fileSystems/{fileSystemId}',\n      'PATCH',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   删除一个文件系统，一旦删除，该文件系统将不存在，也无法访问已删除的文件系统里的任何内容。\n [MFA enabled]\n      * @param {Object} opts - parameters\n      * @param {string} opts.fileSystemId - 文件系统ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteFileSystem (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteFileSystem\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.fileSystemId === undefined || opts.fileSystemId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileSystemId' when calling deleteFileSystem\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      fileSystemId: opts.fileSystemId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  zfs/1.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteFileSystem with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/fileSystems/{fileSystemId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询挂载客户端IP\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为10，取值范围：[10,100]  optional\n      * @param {string} opts.fileSystemId - 文件系统ID\n      * @param {string} [opts.mountTargetId] - 挂载目标ID  optional\n      * @param {array} [opts.clientIP] - 查询客户端IP数组  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string clientsIPs\n      * @param integer totalCount  结果集数目\n      */\n\n  describeMountedClients (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMountedClients\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.fileSystemId === undefined || opts.fileSystemId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileSystemId' when calling describeMountedClients\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      postBody['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      postBody['pageSize'] = opts.pageSize\n    }\n    if (opts.fileSystemId !== undefined && opts.fileSystemId !== null) {\n      postBody['fileSystemId'] = opts.fileSystemId\n    }\n    if (opts.mountTargetId !== undefined && opts.mountTargetId !== null) {\n      postBody['mountTargetId'] = opts.mountTargetId\n    }\n    if (opts.clientIP !== undefined && opts.clientIP !== null) {\n      postBody['clientIP'] = opts.clientIP\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  zfs/1.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMountedClients with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/describeMountedClients',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   查询挂载目标列表。\n\n      * @param {Object} opts - parameters\n      * @param {integer} [opts.pageNumber] - 页码, 默认为1, 取值范围：[1,∞)  optional\n      * @param {integer} [opts.pageSize] - 分页大小，默认为20，取值范围：[10,100]  optional\n      * @param {filter} [opts.filters] - fileSystemId - 文件系统ID，精确匹配，支持多个\nmountTargetId - 挂载目标ID，精确匹配，支持多个\n  optional\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param mountTarget mountTargets\n      * @param integer totalCount  查询的挂载目标数目\n      */\n\n  describeMountTargets (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMountTargets\"\n      )\n    }\n\n    opts = opts || {}\n\n    let postBody = null\n    let queryParams = {}\n    if (opts.pageNumber !== undefined && opts.pageNumber !== null) {\n      queryParams['pageNumber'] = opts.pageNumber\n    }\n    if (opts.pageSize !== undefined && opts.pageSize !== null) {\n      queryParams['pageSize'] = opts.pageSize\n    }\n    Object.assign(queryParams, super.buildFilterParam(opts.filters, 'filters'))\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  zfs/1.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMountTargets with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/mountTargets',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  - 为一个文件系统创建一个挂载目标。通过这个挂载目标,你可以挂载将一个文件系统挂载到主机实例上。\n- 创建一个挂载目标，为这个挂载目标分配一个Id\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.fileSystemId - 创建挂载目标的文件系统\n      * @param {string} opts.subnetId - 子网id\n      * @param {string} opts.vpcId - vpcId\n      * @param {string} [opts.securityGroupId] - 安全组id  optional\n      * @param {string} opts.clientToken - 幂等性参数(只支持数字、大小写字母，且不能超过64字符)\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param string mountTargetId  挂载目标 ID\n      */\n\n  createMountTarget (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  createMountTarget\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.fileSystemId === undefined || opts.fileSystemId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.fileSystemId' when calling createMountTarget\"\n      )\n    }\n    if (opts.subnetId === undefined || opts.subnetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.subnetId' when calling createMountTarget\"\n      )\n    }\n    if (opts.vpcId === undefined || opts.vpcId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.vpcId' when calling createMountTarget\"\n      )\n    }\n    if (opts.clientToken === undefined || opts.clientToken === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.clientToken' when calling createMountTarget\"\n      )\n    }\n\n    let postBody = {}\n    if (opts.fileSystemId !== undefined && opts.fileSystemId !== null) {\n      postBody['fileSystemId'] = opts.fileSystemId\n    }\n    if (opts.subnetId !== undefined && opts.subnetId !== null) {\n      postBody['subnetId'] = opts.subnetId\n    }\n    if (opts.vpcId !== undefined && opts.vpcId !== null) {\n      postBody['vpcId'] = opts.vpcId\n    }\n    if (opts.securityGroupId !== undefined && opts.securityGroupId !== null) {\n      postBody['securityGroupId'] = opts.securityGroupId\n    }\n    if (opts.clientToken !== undefined && opts.clientToken !== null) {\n      postBody['clientToken'] = opts.clientToken\n    }\n\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  zfs/1.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call createMountTarget with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/mountTargets',\n      'POST',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  查询挂载目标详情\n      * @param {Object} opts - parameters\n      * @param {string} opts.mountTargetId - 挂载目标ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      * @param mountTarget mountTarget\n      */\n\n  describeMountTarget (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  describeMountTarget\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.mountTargetId === undefined || opts.mountTargetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.mountTargetId' when calling describeMountTarget\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      mountTargetId: opts.mountTargetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  zfs/1.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call describeMountTarget with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/mountTargets/{mountTargetId}',\n      'GET',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  /**\n      *  -   删除挂载目标的同时会删除相关的网络接口。\n\n      * @param {Object} opts - parameters\n      * @param {string} opts.mountTargetId - 挂载目标ID\n      * @param {string} regionId - ID of the region\n      * @param {string} callback - callback\n      @return {Object} result\n      */\n\n  deleteMountTarget (opts, regionId = this.config.regionId, callback) {\n    if (typeof regionId === 'function') {\n      callback = regionId\n      regionId = this.config.regionId\n    }\n\n    if (regionId === undefined || regionId === null) {\n      throw new Error(\n        \"Missing the required parameter 'regionId' when calling  deleteMountTarget\"\n      )\n    }\n\n    opts = opts || {}\n\n    if (opts.mountTargetId === undefined || opts.mountTargetId === null) {\n      throw new Error(\n        \"Missing the required parameter 'opts.mountTargetId' when calling deleteMountTarget\"\n      )\n    }\n\n    let postBody = null\n    let queryParams = {}\n\n    let pathParams = {\n      regionId: regionId,\n      mountTargetId: opts.mountTargetId\n    }\n\n    let headerParams = {\n      'User-Agent': 'JdcloudSdkNode/1.0.0  zfs/1.0.9'\n    }\n\n    let contentTypes = ['application/json']\n    let accepts = ['application/json']\n\n    // 扩展自定义头\n    if (opts['x-extra-header']) {\n      for (let extraHeader in opts['x-extra-header']) {\n        headerParams[extraHeader] = opts['x-extra-header'][extraHeader]\n      }\n\n      if (Array.isArray(opts['x-extra-header']['content-type'])) {\n        contentTypes = opts['x-extra-header']['content-type']\n      } else if (typeof opts['x-extra-header']['content-type'] === 'string') {\n        contentTypes = opts['x-extra-header']['content-type'].split(',')\n      }\n\n      if (Array.isArray(opts['x-extra-header']['accept'])) {\n        accepts = opts['x-extra-header']['accept']\n      } else if (typeof opts['x-extra-header']['accept'] === 'string') {\n        accepts = opts['x-extra-header']['accept'].split(',')\n      }\n    }\n\n    let formParams = {}\n\n    let returnType = null\n\n    this.config.logger(\n      `call deleteMountTarget with params:\\npathParams:${JSON.stringify(\n        pathParams\n      )},\\nqueryParams:${JSON.stringify(\n        queryParams\n      )}, \\nheaderParams:${JSON.stringify(\n        headerParams\n      )}, \\nformParams:${JSON.stringify(\n        formParams\n      )}, \\npostBody:${JSON.stringify(postBody)}`,\n      'DEBUG'\n    )\n\n    let request = super.makeRequest(\n      '/regions/{regionId}/mountTargets/{mountTargetId}',\n      'DELETE',\n      pathParams,\n      queryParams,\n      headerParams,\n      formParams,\n      postBody,\n      contentTypes,\n      accepts,\n      returnType,\n      callback\n    )\n\n    return request.then(\n      function (result) {\n        if (callback && typeof callback === 'function') {\n          return callback(null, result)\n        }\n        return result\n      },\n      function (error) {\n        if (callback && typeof callback === 'function') {\n          return callback(error)\n        }\n        return Promise.reject(error)\n      }\n    )\n  }\n}\nmodule.exports = ZFS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/.gitkeep",
    "content": ""
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/ag.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Quota\n * 关于高可用组配额的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ag'\nService._services[serviceId] = true\n\n/**\n * ag service.\n */\n\nJDCloud.AG = class AG {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'ag'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.AG\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/all.js",
    "content": "module.exports = {\n  RDTS: require('./rdts'),\n  VQD: require('./vqd'),\n  SMARTDBA: require('./smartdba'),\n  DMS: require('./dms'),\n  STREAMCOMPUTER: require('./streamcomputer'),\n  FLOWLOG: require('./flowlog'),\n  SSL: require('./ssl'),\n  OSS: require('./oss'),\n  REDIS: require('./redis'),\n  DOMAINSERVICE: require('./domainservice'),\n  BILLING: require('./billing'),\n  GCS: require('./gcs'),\n  QUOTA: require('./quota'),\n  BRI: require('./bri'),\n  EDCPS: require('./edcps'),\n  BASTION: require('./bastion'),\n  PORTAL: require('./portal'),\n  ORDER: require('./order'),\n  CLOUDDNSSERVICE: require('./clouddnsservice'),\n  AG: require('./ag'),\n  INSTANCEVOUCHER: require('./instancevoucher'),\n  CDN: require('./cdn'),\n  IV: require('./iv'),\n  STREAMBUS: require('./streambus'),\n  APIGATEWAY: require('./apigateway'),\n  MPS: require('./mps'),\n  STS: require('./sts'),\n  KAFKA: require('./kafka'),\n  DOMAIN: require('./domain'),\n  NATIVECONTAINER: require('./nativecontainer'),\n  PRIVATEZONE: require('./privatezone'),\n  STARSHIELD: require('./starshield'),\n  REFUND: require('./refund'),\n  EID: require('./eid'),\n  POD: require('./pod'),\n  JKE: require('./jke'),\n  DATASTAR: require('./datastar'),\n  USERPOOL: require('./userpool'),\n  KMS: require('./kms'),\n  ELITE: require('./elite'),\n  IAM: require('./iam'),\n  IOTHUB: require('./iothub'),\n  SMS: require('./sms'),\n  JCQ: require('./jcq'),\n  RESOURCETAG: require('./resourcetag'),\n  IAS: require('./ias'),\n  JDFUSION: require('./jdfusion'),\n  DETECTION: require('./detection'),\n  RENEWAL: require('./renewal'),\n  IOTLINK: require('./iotlink'),\n  YUNDING: require('./yunding'),\n  CP: require('./cp'),\n  CR: require('./cr'),\n  PIPELINE: require('./pipeline'),\n  CONTAINERREGISTRY: require('./containerregistry'),\n  PARTNER: require('./partner'),\n  LB: require('./lb'),\n  IOTCARD: require('./iotcard'),\n  CENSOR: require('./censor'),\n  INDUSTRYDATA: require('./industrydata'),\n  JDW: require('./jdw'),\n  ASSET: require('./asset'),\n  AUTOTASKPOLICY: require('./autotaskpolicy'),\n  RDS: require('./rds'),\n  KUBERNETES: require('./kubernetes'),\n  DH: require('./dh'),\n  TIDB: require('./tidb'),\n  IPANTI: require('./ipanti'),\n  ANTIPRO: require('./antipro'),\n  JMR: require('./jmr'),\n  DEPLOY: require('./deploy'),\n  COMPILE: require('./compile'),\n  SOP: require('./sop'),\n  CAPTCHA: require('./captcha'),\n  FUNCTION: require('./function'),\n  RESERVEDINSTANCE: require('./reservedinstance'),\n  RMS: require('./rms'),\n  LOGS: require('./logs'),\n  JDCCS: require('./jdccs'),\n  IOTEDGE: require('./iotedge'),\n  CPS: require('./cps'),\n  DBAUDIT: require('./dbaudit'),\n  HUFU: require('./hufu'),\n  ES: require('./es'),\n  HTTPDNS: require('./httpdns'),\n  DISK: require('./disk'),\n  DBS: require('./dbs'),\n  NC: require('./nc'),\n  YDSMS: require('./ydsms'),\n  CLICKHOUSE: require('./clickhouse'),\n  VM: require('./vm'),\n  FC: require('./fc'),\n  DCAP: require('./dcap'),\n  CLOUDAUTH: require('./cloudauth'),\n  IOTCORE: require('./iotcore'),\n  AMS: require('./ams'),\n  JDRO: require('./jdro'),\n  ZFS: require('./zfs'),\n  VOD: require('./vod'),\n  YUNDINGDATAPUSH: require('./yundingdatapush'),\n  OSSOPENAPI: require('./ossopenapi'),\n  BGW: require('./bgw'),\n  CLOUDSIGN: require('./cloudsign'),\n  BASEANTI: require('./baseanti'),\n  MONGODB: require('./mongodb'),\n  WAF: require('./waf'),\n  LIVE: require('./live'),\n  LAVM: require('./lavm'),\n  JDWORKSPACE: require('./jdworkspace'),\n  DTS: require('./dts'),\n  ASSISTANT: require('./assistant'),\n  VPC: require('./vpc'),\n  MONITOR: require('./monitor'),\n  XDATA: require('./xdata'),\n  OPENJRTC: require('./openjrtc'),\n  IOTCLOUDGATEWAY: require('./iotcloudgateway'),\n  INVOICE: require('./invoice'),\n  USER: require('./user')\n}\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/ams.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 应用管理平台API (仅对授权用户使用)\n * 应用管理平台API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ams'\nService._services[serviceId] = true\n\n/**\n * ams service.\n */\n\nJDCloud.AMS = class AMS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'ams'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.AMS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/antipro.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Operation Records APIs\n * Anti DDoS Protection Package Operation Records APIs\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'antipro'\nService._services[serviceId] = true\n\n/**\n * antipro service.\n */\n\nJDCloud.ANTIPRO = class ANTIPRO {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'antipro'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.ANTIPRO\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/apigateway.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 自定义域名\n * api 自定义域名 service\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'apigateway'\nService._services[serviceId] = true\n\n/**\n * apigateway service.\n */\n\nJDCloud.APIGATEWAY = class APIGATEWAY {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'apigateway'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.APIGATEWAY\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/asset.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * JDCLOUD asset API\n * API JDCLOUD asset API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'asset'\nService._services[serviceId] = true\n\n/**\n * asset service.\n */\n\nJDCloud.ASSET = class ASSET {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'asset'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.ASSET\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/assistant.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * LogConfig\n * 用户日志相关配置\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'assistant'\nService._services[serviceId] = true\n\n/**\n * assistant service.\n */\n\nJDCloud.ASSISTANT = class ASSISTANT {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'assistant'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.ASSISTANT\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/autotaskpolicy.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 配额\n * 与配额相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'autotaskpolicy'\nService._services[serviceId] = true\n\n/**\n * autotaskpolicy service.\n */\n\nJDCloud.AUTOTASKPOLICY = class AUTOTASKPOLICY {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'autotaskpolicy'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.AUTOTASKPOLICY\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/baseanti.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * IP Resource APIs\n * Anti DDoS Basic IP Resource APIs\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'baseanti'\nService._services[serviceId] = true\n\n/**\n * baseanti service.\n */\n\nJDCloud.BASEANTI = class BASEANTI {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'baseanti'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.BASEANTI\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/bastion.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * statistics\n * 堡垒机规格分布数量信息\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'bastion'\nService._services[serviceId] = true\n\n/**\n * bastion service.\n */\n\nJDCloud.BASTION = class BASTION {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'bastion'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.BASTION\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/bgw.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * instances\n * 续费查询实例信息接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'bgw'\nService._services[serviceId] = true\n\n/**\n * bgw service.\n */\n\nJDCloud.BGW = class BGW {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'bgw'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.BGW\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/billing.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 停删规则\n * 停删规则\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'billing'\nService._services[serviceId] = true\n\n/**\n * billing service.\n */\n\nJDCloud.BILLING = class BILLING {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'billing'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.BILLING\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/bri.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 页面测试检测接口\n * 京东云信用评分-OpenAPI页面测试检测接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'bri'\nService._services[serviceId] = true\n\n/**\n * bri service.\n */\n\nJDCloud.BRI = class BRI {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'bri'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.BRI\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/captcha.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 运营后台类接口\n * 京东云验证码-OpenAPI应用管理类接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'captcha'\nService._services[serviceId] = true\n\n/**\n * captcha service.\n */\n\nJDCloud.CAPTCHA = class CAPTCHA {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'captcha'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.CAPTCHA\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/cdn.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SCDN相关接口\n * Openapi For JCLOUD cdn\n *\n * OpenAPI spec version: v1\n * Contact: pid-cdn@jd.com\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'cdn'\nService._services[serviceId] = true\n\n/**\n * cdn service.\n */\n\nJDCloud.CDN = class CDN {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'cdn'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.CDN\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/censor.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 站点检测类接口\n * 京东云内容安全-OpenAPI站点检测类接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'censor'\nService._services[serviceId] = true\n\n/**\n * censor service.\n */\n\nJDCloud.CENSOR = class CENSOR {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'censor'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.CENSOR\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/clickhouse.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 白名单\n * 白名单相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'clickhouse'\nService._services[serviceId] = true\n\n/**\n * clickhouse service.\n */\n\nJDCloud.CLICKHOUSE = class CLICKHOUSE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'clickhouse'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.CLICKHOUSE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/cloudauth.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 用户管理接口\n * 实名认证-用户管理接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'cloudauth'\nService._services[serviceId] = true\n\n/**\n * cloudauth service.\n */\n\nJDCloud.CLOUDAUTH = class CLOUDAUTH {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'cloudauth'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.CLOUDAUTH\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/clouddnsservice.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 实例信息\n * 云解析OpenAPI实例信息接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'clouddnsservice'\nService._services[serviceId] = true\n\n/**\n * clouddnsservice service.\n */\n\nJDCloud.CLOUDDNSSERVICE = class CLOUDDNSSERVICE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'clouddnsservice'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.CLOUDDNSSERVICE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/cloudsign.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * OLD合同模板管理接口\n * OLD合同模板管理接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'cloudsign'\nService._services[serviceId] = true\n\n/**\n * cloudsign service.\n */\n\nJDCloud.CLOUDSIGN = class CLOUDSIGN {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'cloudsign'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.CLOUDSIGN\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/compile.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * code api\n * API related to build\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'compile'\nService._services[serviceId] = true\n\n/**\n * compile service.\n */\n\nJDCloud.COMPILE = class COMPILE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'compile'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.COMPILE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/containerregistry.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Repository\n * 容器镜像仓库相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'containerregistry'\nService._services[serviceId] = true\n\n/**\n * containerregistry service.\n */\n\nJDCloud.CONTAINERREGISTRY = class CONTAINERREGISTRY {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'containerregistry'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.CONTAINERREGISTRY\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/cp.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Partner UserAuth Management\n * Partner UserAuth Management API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'cp'\nService._services[serviceId] = true\n\n/**\n * cp service.\n */\n\nJDCloud.CP = class CP {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'cp'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.CP\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/cps.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Cloud-Physical-Server\n * 云物理服务器私有网络操作相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'cps'\nService._services[serviceId] = true\n\n/**\n * cps service.\n */\n\nJDCloud.CPS = class CPS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'cps'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.CPS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/cr.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Repository\n * 容器镜像仓库相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'cr'\nService._services[serviceId] = true\n\n/**\n * cr service.\n */\n\nJDCloud.CR = class CR {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'cr'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.CR\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/datastar.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 大屏数据查询接口\n * 陕西苹果大屏数据查询接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'datastar'\nService._services[serviceId] = true\n\n/**\n * datastar service.\n */\n\nJDCloud.DATASTAR = class DATASTAR {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'datastar'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.DATASTAR\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/dbaudit.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Rule Interface\n * Rule Interface\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'dbaudit'\nService._services[serviceId] = true\n\n/**\n * dbaudit service.\n */\n\nJDCloud.DBAUDIT = class DBAUDIT {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'dbaudit'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.DBAUDIT\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/dbs.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 数据库备份服务\n * 数据库备份服务接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'dbs'\nService._services[serviceId] = true\n\n/**\n * dbs service.\n */\n\nJDCloud.DBS = class DBS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'dbs'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.DBS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/dcap.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * UserPackage\n * 敏感数据保护-用户套餐相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'dcap'\nService._services[serviceId] = true\n\n/**\n * dcap service.\n */\n\nJDCloud.DCAP = class DCAP {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'dcap'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.DCAP\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/deploy.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 依赖\n * 云部署依赖相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'deploy'\nService._services[serviceId] = true\n\n/**\n * deploy service.\n */\n\nJDCloud.DEPLOY = class DEPLOY {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'deploy'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.DEPLOY\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/detection.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Task related APIs\n * 云拔测-任务相关接口\n *\n * OpenAPI spec version: v3\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'detection'\nService._services[serviceId] = true\n\n/**\n * detection service.\n */\n\nJDCloud.DETECTION = class DETECTION {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'detection'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v3'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.DETECTION\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/dh.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Quota\n * 与配额相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'dh'\nService._services[serviceId] = true\n\n/**\n * dh service.\n */\n\nJDCloud.DH = class DH {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'dh'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.DH\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/disk.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 售罄相关接口\n * 查询售罄情况\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'disk'\nService._services[serviceId] = true\n\n/**\n * disk service.\n */\n\nJDCloud.DISK = class DISK {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'disk'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.DISK\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/dms.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * DmsView\n * 视图相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'dms'\nService._services[serviceId] = true\n\n/**\n * dms service.\n */\n\nJDCloud.DMS = class DMS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'dms'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.DMS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/domain.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Domain-Template\n * 域名模板相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'domain'\nService._services[serviceId] = true\n\n/**\n * domain service.\n */\n\nJDCloud.DOMAIN = class DOMAIN {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'domain'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.DOMAIN\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/domainservice.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 实例信息\n * 云解析OpenAPI实例信息接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'domainservice'\nService._services[serviceId] = true\n\n/**\n * domainservice service.\n */\n\nJDCloud.DOMAINSERVICE = class DOMAINSERVICE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'domainservice'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.DOMAINSERVICE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/dts.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 数据传输服务\n * 数据传输服务相关接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'dts'\nService._services[serviceId] = true\n\n/**\n * dts service.\n */\n\nJDCloud.DTS = class DTS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'dts'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.DTS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/edcps.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Distributed-Cloud-Physical-Server\n * 分布式云物理服务器私有网络操作相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'edcps'\nService._services[serviceId] = true\n\n/**\n * edcps service.\n */\n\nJDCloud.EDCPS = class EDCPS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'edcps'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.EDCPS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/eid.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 页面测试检测接口\n * 京东云信用评分-OpenAPI页面测试检测接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'eid'\nService._services[serviceId] = true\n\n/**\n * eid service.\n */\n\nJDCloud.EID = class EID {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'eid'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.EID\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/elite.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * elite云存服务相关接口\n * elite云存服务相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'elite'\nService._services[serviceId] = true\n\n/**\n * elite service.\n */\n\nJDCloud.ELITE = class ELITE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'elite'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.ELITE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/es.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ES Snapshot API\n * es快照创建、查询，自动快照的设置、查询接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'es'\nService._services[serviceId] = true\n\n/**\n * es service.\n */\n\nJDCloud.ES = class ES {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'es'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.ES\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/fc.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Trigger\n * Trigger 相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'fc'\nService._services[serviceId] = true\n\n/**\n * fc service.\n */\n\nJDCloud.FC = class FC {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'fc'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.FC\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/flowlog.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Quota\n * 配额的相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'flowlog'\nService._services[serviceId] = true\n\n/**\n * flowlog service.\n */\n\nJDCloud.FLOWLOG = class FLOWLOG {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'flowlog'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.FLOWLOG\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/function.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Function OpenAPI\n *\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'function'\nService._services[serviceId] = true\n\n/**\n * function service.\n */\n\nJDCloud.FUNCTION = class FUNCTION {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'function'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.FUNCTION\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/gcs.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * GPU-Computing-Service\n * GPU算力服务网盘相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'gcs'\nService._services[serviceId] = true\n\n/**\n * gcs service.\n */\n\nJDCloud.GCS = class GCS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'gcs'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.GCS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/httpdns.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 域名\n * httpdns OpenAPI域名接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'httpdns'\nService._services[serviceId] = true\n\n/**\n * httpdns service.\n */\n\nJDCloud.HTTPDNS = class HTTPDNS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'httpdns'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.HTTPDNS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/hufu.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * hufu-wx\n * 虎符商业化相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'hufu'\nService._services[serviceId] = true\n\n/**\n * hufu service.\n */\n\nJDCloud.HUFU = class HUFU {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'hufu'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.HUFU\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/iam.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * User Management\n * User Management API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iam'\nService._services[serviceId] = true\n\n/**\n * iam service.\n */\n\nJDCloud.IAM = class IAM {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'iam'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.IAM\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/ias.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * JDCLOUD IAS Services API\n * 京东云联合登陆Api\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ias'\nService._services[serviceId] = true\n\n/**\n * ias service.\n */\n\nJDCloud.IAS = class IAS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'ias'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.IAS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/industrydata.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 大屏数据查询接口\n * 陕西苹果大屏数据查询接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'industrydata'\nService._services[serviceId] = true\n\n/**\n * industrydata service.\n */\n\nJDCloud.INDUSTRYDATA = class INDUSTRYDATA {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'industrydata'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.INDUSTRYDATA\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/instancevoucher.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Instance-Voucher\n * 实例抵扣券相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'instancevoucher'\nService._services[serviceId] = true\n\n/**\n * instancevoucher service.\n */\n\nJDCloud.INSTANCEVOUCHER = class INSTANCEVOUCHER {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'instancevoucher'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.INSTANCEVOUCHER\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/invoice.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * JDCLOUD Invoice API\n * 京东云发票\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'invoice'\nService._services[serviceId] = true\n\n/**\n * invoice service.\n */\n\nJDCloud.INVOICE = class INVOICE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'invoice'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.INVOICE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/iotcard.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * iot-card-Related-API\n * 物联网卡服务相关API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iotcard'\nService._services[serviceId] = true\n\n/**\n * iotcard service.\n */\n\nJDCloud.IOTCARD = class IOTCARD {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'iotcard'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.IOTCARD\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/iotcloudgateway.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * iotcloudgateway开通接口\n * 用户开通iotcloudgateway服务相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iotcloudgateway'\nService._services[serviceId] = true\n\n/**\n * iotcloudgateway service.\n */\n\nJDCloud.IOTCLOUDGATEWAY = class IOTCLOUDGATEWAY {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'iotcloudgateway'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.IOTCLOUDGATEWAY\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/iotcore.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * IoTHubInstance\n * IoT Hub共享模式和独享模式共用接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iotcore'\nService._services[serviceId] = true\n\n/**\n * iotcore service.\n */\n\nJDCloud.IOTCORE = class IOTCORE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'iotcore'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.IOTCORE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/iotedge.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * EdgeSubDeviceManager\n * iotcore-Edge子设备管理\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iotedge'\nService._services[serviceId] = true\n\n/**\n * iotedge service.\n */\n\nJDCloud.IOTEDGE = class IOTEDGE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'iotedge'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.IOTEDGE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/iothub.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * IoTHubInstance\n * IoT Hub共享模式和独享模式共用接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iothub'\nService._services[serviceId] = true\n\n/**\n * iothub service.\n */\n\nJDCloud.IOTHUB = class IOTHUB {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'iothub'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.IOTHUB\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/iotlink.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Iotlink-Related-API\n * 物联网卡服务相关API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iotlink'\nService._services[serviceId] = true\n\n/**\n * iotlink service.\n */\n\nJDCloud.IOTLINK = class IOTLINK {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'iotlink'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.IOTLINK\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/ipanti.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Anti DDoS Pro Web Rule Configuration APIs\n * Anti DDoS Pro Web Rule Configuration APIs\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ipanti'\nService._services[serviceId] = true\n\n/**\n * ipanti service.\n */\n\nJDCloud.IPANTI = class IPANTI {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'ipanti'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.IPANTI\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/iv.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Vi Template\n * 视频审查模板管理相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'iv'\nService._services[serviceId] = true\n\n/**\n * iv service.\n */\n\nJDCloud.IV = class IV {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'iv'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.IV\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/jcq.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Topic\n * Topic相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jcq'\nService._services[serviceId] = true\n\n/**\n * jcq service.\n */\n\nJDCloud.JCQ = class JCQ {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'jcq'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.JCQ\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/jdccs.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Ticket API\n * 云托管服务的工单API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jdccs'\nService._services[serviceId] = true\n\n/**\n * jdccs service.\n */\n\nJDCloud.JDCCS = class JDCCS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'jdccs'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.JDCCS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/jdfusion.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Vpc-VserverGroup\n * 与服务器组相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jdfusion'\nService._services[serviceId] = true\n\n/**\n * jdfusion service.\n */\n\nJDCloud.JDFUSION = class JDFUSION {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'jdfusion'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.JDFUSION\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/jdro.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Template\n * Interface of Template\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jdro'\nService._services[serviceId] = true\n\n/**\n * jdro service.\n */\n\nJDCloud.JDRO = class JDRO {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'jdro'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.JDRO\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/jdw.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 实例管理\n * 实例管理相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jdw'\nService._services[serviceId] = true\n\n/**\n * jdw service.\n */\n\nJDCloud.JDW = class JDW {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'jdw'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.JDW\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/jdworkspace.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * JDCLOUD 态势感知续费管理 API\n * 态势感知续费管理相关信息接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jdworkspace'\nService._services[serviceId] = true\n\n/**\n * jdworkspace service.\n */\n\nJDCloud.JDWORKSPACE = class JDWORKSPACE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'jdworkspace'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.JDWORKSPACE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/jke.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 配额\n * k8s 集群配额相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jke'\nService._services[serviceId] = true\n\n/**\n * jke service.\n */\n\nJDCloud.JKE = class JKE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'jke'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.JKE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/jmr.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 集群管理\n * JMR集群管理相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'jmr'\nService._services[serviceId] = true\n\n/**\n * jmr service.\n */\n\nJDCloud.JMR = class JMR {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'jmr'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.JMR\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/kafka.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * kafka topic 相关接口\n * kafka topic 相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'kafka'\nService._services[serviceId] = true\n\n/**\n * kafka service.\n */\n\nJDCloud.KAFKA = class KAFKA {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'kafka'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.KAFKA\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/kms.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Statistics Service\n * 基于硬件保护密钥的安全数据托管服务\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'kms'\nService._services[serviceId] = true\n\n/**\n * kms service.\n */\n\nJDCloud.KMS = class KMS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'kms'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.KMS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/kubernetes.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ServerlessCluster\n * Serverless集群相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'kubernetes'\nService._services[serviceId] = true\n\n/**\n * kubernetes service.\n */\n\nJDCloud.KUBERNETES = class KUBERNETES {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'kubernetes'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.KUBERNETES\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/lavm.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * quota\n * 轻量应用云主机配额模型的相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'lavm'\nService._services[serviceId] = true\n\n/**\n * lavm service.\n */\n\nJDCloud.LAVM = class LAVM {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'lavm'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.LAVM\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/lb.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Forwarding-Rules-Group\n * 转发规则组相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'lb'\nService._services[serviceId] = true\n\n/**\n * lb service.\n */\n\nJDCloud.LB = class LB {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'lb'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.LB\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/live.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Live-Video\n * 直播管理API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'live'\nService._services[serviceId] = true\n\n/**\n * live service.\n */\n\nJDCloud.LIVE = class LIVE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'live'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.LIVE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/logs.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * WebConf APIs\n * 日志服务webconf相关的管理控制接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'logs'\nService._services[serviceId] = true\n\n/**\n * logs service.\n */\n\nJDCloud.LOGS = class LOGS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'logs'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.LOGS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/mongodb.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 安全管理\n * API related to MONGODB security\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'mongodb'\nService._services[serviceId] = true\n\n/**\n * mongodb service.\n */\n\nJDCloud.MONGODB = class MONGODB {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'mongodb'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.MONGODB\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/monitor.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * maintainAuxiliaryTags APIs\n * 一组资源增加删除标签\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'monitor'\nService._services[serviceId] = true\n\n/**\n * monitor service.\n */\n\nJDCloud.MONITOR = class MONITOR {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'monitor'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.MONITOR\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/monitorcm.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 监控项相关接口\n * 监控项相关接口，提供自定义监控数据上报功能\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'monitorcm'\nService._services[serviceId] = true\n\n/**\n * monitorcm service.\n */\n\nJDCloud.MONITORCM = class MONITORCM {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'monitorcm'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    if (!this.service) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.MONITORCM\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/mps.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 媒体处理相关接口\n * 多媒体处理服务API，包括截图、转码、媒体处理消息通知等操作。本文档详细说明了媒体处理API及用法，适合开发人员阅读。\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'mps'\nService._services[serviceId] = true\n\n/**\n * mps service.\n */\n\nJDCloud.MPS = class MPS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'mps'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.MPS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/nativecontainer.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 用户设置\n * 查询用户设置接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'nativecontainer'\nService._services[serviceId] = true\n\n/**\n * nativecontainer service.\n */\n\nJDCloud.NATIVECONTAINER = class NATIVECONTAINER {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'nativecontainer'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.NATIVECONTAINER\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/nc.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 镜像仓库认证信息\n * 关于镜像仓库认证信息的相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'nc'\nService._services[serviceId] = true\n\n/**\n * nc service.\n */\n\nJDCloud.NC = class NC {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'nc'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.NC\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/openjrtc.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * UserRoom\n * 用户房间号管理\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'openjrtc'\nService._services[serviceId] = true\n\n/**\n * openjrtc service.\n */\n\nJDCloud.OPENJRTC = class OPENJRTC {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'openjrtc'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.OPENJRTC\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/order.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 相关接口\n * API related to order\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'order'\nService._services[serviceId] = true\n\n/**\n * order service.\n */\n\nJDCloud.ORDER = class ORDER {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'order'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.ORDER\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/oss.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * OSS相关接口\n * OSS相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'oss'\nService._services[serviceId] = true\n\n/**\n * oss service.\n */\n\nJDCloud.OSS = class OSS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'oss'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.OSS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/ossopenapi.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * vpc policy openapi v1\n * vpc policy openapi v1\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ossopenapi'\nService._services[serviceId] = true\n\n/**\n * ossopenapi service.\n */\n\nJDCloud.OSSOPENAPI = class OSSOPENAPI {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'ossopenapi'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.OSSOPENAPI\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/partner.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 合作信息管理\n * 合作信息管理\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'partner'\nService._services[serviceId] = true\n\n/**\n * partner service.\n */\n\nJDCloud.PARTNER = class PARTNER {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'partner'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.PARTNER\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/pipeline.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * tools\n * API OF tools Create|Update|Read|Delete|Execute\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'pipeline'\nService._services[serviceId] = true\n\n/**\n * pipeline service.\n */\n\nJDCloud.PIPELINE = class PIPELINE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'pipeline'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.PIPELINE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/pod.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 用户设置\n * 查询用户设置接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'pod'\nService._services[serviceId] = true\n\n/**\n * pod service.\n */\n\nJDCloud.POD = class POD {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'pod'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.POD\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/portal.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * search\n * 搜索相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'portal'\nService._services[serviceId] = true\n\n/**\n * portal service.\n */\n\nJDCloud.PORTAL = class PORTAL {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'portal'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.PORTAL\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/privatezone.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 私有域名zone\n * 私有域名zone API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'privatezone'\nService._services[serviceId] = true\n\n/**\n * privatezone service.\n */\n\nJDCloud.PRIVATEZONE = class PRIVATEZONE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'privatezone'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.PRIVATEZONE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/quota.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * JDCLOUD remote quota API\n * API JDCLOUD remote quota API\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'quota'\nService._services[serviceId] = true\n\n/**\n * quota service.\n */\n\nJDCloud.QUOTA = class QUOTA {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'quota'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.QUOTA\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/rds.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 白名单\n * 白名单相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'rds'\nService._services[serviceId] = true\n\n/**\n * rds service.\n */\n\nJDCloud.RDS = class RDS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'rds'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.RDS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/rdts.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * operation\n * 查询异步请求结果\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'rdts'\nService._services[serviceId] = true\n\n/**\n * rdts service.\n */\n\nJDCloud.RDTS = class RDTS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'rdts'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.RDTS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/redis.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Redis SpecConfig API\n * 缓存Redis实例规格配置接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'redis'\nService._services[serviceId] = true\n\n/**\n * redis service.\n */\n\nJDCloud.REDIS = class REDIS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'redis'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.REDIS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/refund.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 退款策略中心\n * 退款策略中心接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'refund'\nService._services[serviceId] = true\n\n/**\n * refund service.\n */\n\nJDCloud.REFUND = class REFUND {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'refund'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.REFUND\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/renewal.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Renew Management APIs\n * 续费管理相关接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'renewal'\nService._services[serviceId] = true\n\n/**\n * renewal service.\n */\n\nJDCloud.RENEWAL = class RENEWAL {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'renewal'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.RENEWAL\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/reservedinstance.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * sysConfig APIs\n * 系统参数配置\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'reservedinstance'\nService._services[serviceId] = true\n\n/**\n * reservedinstance service.\n */\n\nJDCloud.RESERVEDINSTANCE = class RESERVEDINSTANCE {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'reservedinstance'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.RESERVEDINSTANCE\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/resourcetag.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Resource-Tag-APIs\n * 资源标签接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'resourcetag'\nService._services[serviceId] = true\n\n/**\n * resourcetag service.\n */\n\nJDCloud.RESOURCETAG = class RESOURCETAG {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'resourcetag'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.RESOURCETAG\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/rms.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Message-Content-APIs\n * 富媒体模板内容创建、查询相关接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'rms'\nService._services[serviceId] = true\n\n/**\n * rms service.\n */\n\nJDCloud.RMS = class RMS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'rms'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.RMS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/smartdba.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Table-Check\n * 表诊断相关接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'smartdba'\nService._services[serviceId] = true\n\n/**\n * smartdba service.\n */\n\nJDCloud.SMARTDBA = class SMARTDBA {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'smartdba'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.SMARTDBA\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/sms.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Send-Message-Related-APIs\n * 模版相关API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'sms'\nService._services[serviceId] = true\n\n/**\n * sms service.\n */\n\nJDCloud.SMS = class SMS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'sms'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.SMS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/sop.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 敏感操作配置\n * 操作敏感操作配置接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'sop'\nService._services[serviceId] = true\n\n/**\n * sop service.\n */\n\nJDCloud.SOP = class SOP {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'sop'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.SOP\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/ssl.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SSL Certificate Manager\n * SSL数字证书信息管理接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ssl'\nService._services[serviceId] = true\n\n/**\n * ssl service.\n */\n\nJDCloud.SSL = class SSL {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'ssl'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.SSL\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/starshield.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Zone-Settings\n * A Zone setting changes how the Zone works in relation to caching, security, or other features of JDC StarShield\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'starshield'\nService._services[serviceId] = true\n\n/**\n * starshield service.\n */\n\nJDCloud.STARSHIELD = class STARSHIELD {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'starshield'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.STARSHIELD\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/streambus.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ConsumerGroup相关 API\n * 流数据总线ConsumerGroup相关信息接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'streambus'\nService._services[serviceId] = true\n\n/**\n * streambus service.\n */\n\nJDCloud.STREAMBUS = class STREAMBUS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'streambus'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.STREAMBUS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/streamcomputer.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * storage相关 API\n * 流计算storage相关信息接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'streamcomputer'\nService._services[serviceId] = true\n\n/**\n * streamcomputer service.\n */\n\nJDCloud.STREAMCOMPUTER = class STREAMCOMPUTER {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'streamcomputer'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.STREAMCOMPUTER\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/sts.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Security Token Service\n * Security Token Service API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'sts'\nService._services[serviceId] = true\n\n/**\n * sts service.\n */\n\nJDCloud.STS = class STS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'sts'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.STS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/tidb.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * White-List\n * 白名单相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'tidb'\nService._services[serviceId] = true\n\n/**\n * tidb service.\n */\n\nJDCloud.TIDB = class TIDB {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'tidb'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.TIDB\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/user.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 账号报备管理\n * 账号报备管理接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'user'\nService._services[serviceId] = true\n\n/**\n * user service.\n */\n\nJDCloud.USER = class USER {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'user'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.USER\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/userpool.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 用户管理\n * 用户管理接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'userpool'\nService._services[serviceId] = true\n\n/**\n * userpool service.\n */\n\nJDCloud.USERPOOL = class USERPOOL {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'userpool'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.USERPOOL\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/vm.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Task\n * 与任务相关的接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'vm'\nService._services[serviceId] = true\n\n/**\n * vm service.\n */\n\nJDCloud.VM = class VM {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'vm'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.VM\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/vod.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Watermark\n * 水印管理相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'vod'\nService._services[serviceId] = true\n\n/**\n * vod service.\n */\n\nJDCloud.VOD = class VOD {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'vod'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.VOD\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/vpc.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Vpc-Policy\n * vpc支持oss权限访问控制相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'vpc'\nService._services[serviceId] = true\n\n/**\n * vpc service.\n */\n\nJDCloud.VPC = class VPC {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'vpc'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.VPC\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/vqd.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Vqd Template\n * 视频质检模板管理相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'vqd'\nService._services[serviceId] = true\n\n/**\n * vqd service.\n */\n\nJDCloud.VQD = class VQD {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'vqd'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.VQD\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/waf.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Warning\n * Warning API\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'waf'\nService._services[serviceId] = true\n\n/**\n * waf service.\n */\n\nJDCloud.WAF = class WAF {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'waf'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.WAF\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/xdata.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * table\n * API related to XDATA-DW table\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'xdata'\nService._services[serviceId] = true\n\n/**\n * xdata service.\n */\n\nJDCloud.XDATA = class XDATA {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'xdata'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.XDATA\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/ydsms.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * 云鼎短信服务-用户相关接口\n * 云鼎短信服务-用户相关接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'ydsms'\nService._services[serviceId] = true\n\n/**\n * ydsms service.\n */\n\nJDCloud.YDSMS = class YDSMS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'ydsms'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.YDSMS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/yunding.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * yunding-user\n * 云鼎-用户操作相关接口\n *\n * OpenAPI spec version: v2\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'yunding'\nService._services[serviceId] = true\n\n/**\n * yunding service.\n */\n\nJDCloud.YUNDING = class YUNDING {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'yunding'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v2'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.YUNDING\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/yundingdatapush.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * yunding-datapush\n * 云鼎数据推送OPENAPI接口\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'yundingdatapush'\nService._services[serviceId] = true\n\n/**\n * yundingdatapush service.\n */\n\nJDCloud.YUNDINGDATAPUSH = class YUNDINGDATAPUSH {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'yundingdatapush'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.YUNDINGDATAPUSH\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/src/services/zfs.js",
    "content": "/*\n * Copyright 2018 JDCLOUD.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *    http:#www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Mount-Target\n * 挂载目标相关接口。\n *\n * OpenAPI spec version: v1\n * Contact:\n *\n * NOTE: This class is auto generated by the jdcloud code generator program.\n */\n\nconst JDCloud = require('../lib/core')\nvar Service = JDCloud.Service\nvar serviceId = 'zfs'\nService._services[serviceId] = true\n\n/**\n * zfs service.\n */\n\nJDCloud.ZFS = class ZFS {\n  constructor (config = {}) {\n    this.init(config)\n    return new this.service(config)\n  }\n  init (config) {\n    let serviceName = 'zfs'\n    let version = config.version || JDCloud.config.version\n    let versionFlag = 'v1'\n    if (version && version[serviceName]) {\n      versionFlag = version[serviceName]\n    }\n    try {\n      this.service = require(`../repo/${serviceName}/${versionFlag}/${serviceName}`)\n    } catch (e) {\n      throw new Error(\n        `The version '${versionFlag}' of API ${serviceName} is undefined!`\n      )\n    }\n  }\n}\n\nmodule.exports = JDCloud.ZFS\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/test/callStyle.spec.js",
    "content": "var NC = require('../src/services/nc')\nvar config = require('config')\nvar global = config.get('global')\nvar expec = require('chai').expect\ndescribe('JDCloud.CallStyle', function () {\n  var nc = new NC({\n    credentials: {\n      accessKeyId: global.accessKeyId,\n      secretAccessKey: global.secretAccessKey\n    }\n  })\n  it('use Promise style', function () {\n    return nc.describeContainers(\n      {\n      },\n      'cn-north-1'\n    )\n  })\n  it('use callback style', function (done) {\n    nc.describeContainers({}, 'cn-north-1', function (err, data) {\n      if (err) {\n        done(err)\n      } else {\n        done()\n      }\n    })\n  })\n})\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/test/config/default.yml",
    "content": "global:\n    accessKeyId : ak\n    secretAccessKey: sk\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/test/config.spec.js",
    "content": "var JDCloud = require('../src/lib/jc')\nvar config = require('config')\nvar global = config.get('global')\nvar expect = require('chai').expect\n\ndescribe('JDCloud.Config', function () {\n  describe('constructor', function () {\n    it('should be able to bass in a Config object as parameter', function () {\n      var config = new JDCloud.Config({\n        apiVersions: '1',\n        vm: {\n          apiVersions: '2'\n        }\n      })\n      var copyConfig = new JDCloud.Config(config)\n      expect(copyConfig).not.to.equal(config)\n      expect(config.apiVersions).to.equal('1')\n      expect(copyConfig.apiVersions).to.equal('1')\n    })\n    it('should be able to pass credential values directly', function () {\n      var config = new JDCloud.Config({\n        accessKeyId: 'akid',\n        secretAccessKey: 'secret'\n      })\n      expect(config.credentials.accessKeyId).to.equal('akid')\n      expect(config.credentials.secretAccessKey).to.equal('secret')\n    })\n\n    it('should use right config value', function () {\n      var NC = require('../src/services/nc')\n      var nc = new NC()\n      expect(nc.config.endpoint.host).to.not.be.empty\n\n      var config = new JDCloud.Config({\n        endpoint: {\n          host: 'globalHost.com'\n        }\n      })\n      JDCloud.config.update(config)\n      var ncUseGlobal = new NC()\n      expect(ncUseGlobal.config.endpoint.host).to.equal('globalHost.com')\n\n      config = new JDCloud.Config({\n        endpoint: {\n          host: 'globalHost.com'\n        },\n        nc: {\n          endpoint: {\n            host: 'globalNCHost.com'\n          }\n        }\n      })\n      JDCloud.config.update(config)\n      var ncUseGlobalNCConfig = new NC()\n      expect(ncUseGlobalNCConfig.config.endpoint.host).to.equal(\n        'globalNCHost.com'\n      )\n\n      var ncUseSelf = new NC({\n        endpoint: {\n          host: 'ncSelfHost.com'\n        }\n      })\n      expect(ncUseSelf.config.endpoint.host).to.equal('ncSelfHost.com')\n    })\n  })\n  describe('usage', function () {\n    it('should use default regionId', function () {\n      JDCloud.config = new JDCloud.Config()\n      var nc = new JDCloud.NC({\n        regionId: 'cn-north-1',\n        credentials: {\n          accessKeyId: global.accessKeyId,\n          secretAccessKey: global.secretAccessKey\n        },\n        logger: function (str, level = 'INFO') {\n          if (level === 'INFO') {\n            console.log(str)\n          }\n        }\n      })\n      return nc.describeContainers()\n    })\n  })\n})\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/test/services/monitor.spec.js",
    "content": "var MONITOR = require('../../src/services/monitor')\nvar config = require('config')\nvar global = config.get('global')\nvar expect = require('chai').expect\n\ndescribe('JDCloud.MONITOR', function () {\n    var monitor = new MONITOR({\n        credentials: {\n            accessKeyId: global.accessKeyId,\n            secretAccessKey: global.secretAccessKey\n        },\n        version: {\n            monitor: 'v1'\n        },\n        regionId: 'cn-north-1'\n    })\n\n    it('describeMetrics', function () {\n        return monitor.describeMetrics({\n            serviceCode: 'vm',\n        })\n            .then(function (data) {\n                console.log(data)\n            })\n    })\n\n\n    it('describeMetricData', function () {\n        return monitor.describeMetricData({\n            serviceCode: 'vm',\n            resourceId: 'i-p1jskbki8',\n            metric: 'cpu_util',\n            timeInterval: '1h'\n        }, 'cn-north-1')\n            .then(function (data) {\n                console.log(data)\n            })\n    })\n\n    it('createAlarm', function () {\n        return monitor.createAlarm({\n            createAlarmSpec: {\n                serviceCode: 'vm',\n                resourceIds: ['i-p1jskbki8'],\n                metric: 'cpu_util',\n                period: 2,\n                calculation: 'max',\n                operation: '==',\n                threshold: 100.0,\n                times: 1\n            },\n            clientToken: 'dsf4safd6hjsfssdf567jaf'\n        }, 'cn-north-1')\n            .then(function (data) {\n                console.log(data)\n            })\n    })\n\n    it('updateAlarm', function () {\n        return monitor.updateAlarm({\n            alarmId: '265945',\n            serviceCode: 'vm',\n            resourceIds: ['i-p1jskbki8'],\n            metric: 'cpu_util',\n            period: 2,\n            calculation: 'max',\n            operation: '==',\n            threshold: 99.0,\n            times: 1\n        }, 'cn-north-1')\n            .then(function (data) {\n                console.log(data)\n            })\n    })\n\n    it('disableAlarm', function () {\n        return monitor.disableAlarm({\n            alarmId: '265945',\n        }, 'cn-north-1')\n            .then(function (data) {\n                console.log(data)\n            })\n    })\n\n    it('enableAlarm', function () {\n        return monitor.enableAlarm({\n            alarmId: '265945',\n        }, 'cn-north-1')\n            .then(function (data) {\n                console.log(data)\n            })\n    })\n\n    it('describeAlarmsByID', function () {\n        return monitor.describeAlarmsByID({\n            alarmId: '265945',\n        }, 'cn-north-1')\n            .then(function (data) {\n                console.log(data)\n            })\n    })\n\n    it('describeAlarms', function () {\n        return monitor.describeAlarms({\n            pageNumber: 1,\n            pageSize: 50\n        }, 'cn-north-1')\n            .then(function (data) {\n                console.log(data)\n            })\n    })\n\n    it('deleteAlarms', function () {\n        return monitor.deleteAlarms({\n            ids: '265945',\n        }, 'cn-north-1')\n            .then(function (data) {\n                console.log(data)\n            })\n    })\n\n})\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/test/services/nc.spec.js",
    "content": "var NC = require('../../src/services/nativecontainer')\nvar config = require('config')\nvar global = config.get('global')\ndescribe('JDCloud.NC', function () {\n    var nc = new NATIVECONTAINER({\n        credentials: {\n            accessKeyId: global.accessKeyId,\n            secretAccessKey: global.secretAccessKey\n        },\n        endpoint: {\n            host: 'nativecontainer.internal.cn-north-1.jdcloud-api.com', //指定非默认Endpoint\n            protocol: 'http' //设置使用HTTP而不是HTTPS，vpc专用域名不支持HTTPS\n        },\n        'x-extra-header': { //指定额外header\n            \"x-jdcloud-security-token\" : \"xxx\", //要调用开启了MFA操作保护的接口需要传递\n            \"x-jdcloud-content-sha256\" : \"xxx\", //body过大，希望用此value替代对body进行哈希的过程\n            \"MyOwn\" : \"xxx\"\n        },\n        version: {\n            nativecontainer: 'v1'\n        }\n    })\n    // var nc = new NC();\n    describe('describeContainers', function () {\n        it('should be able to get nc list', function () {\n            return nc.describeContainers({\n                filters: [\n                    {name: 'containerId', values: ['c-rxjwzysxu', 'c-73woiy7iz']}\n                ],\n            }, 'cn-north-1')\n        })\n    })\n})\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/test/services/oss.spec.js",
    "content": "var OSS = require('../../src/services/oss')\nvar config = require('config')\nvar global = config.get('global')\nvar expect = require('chai').expect\n\ndescribe('JDCloud.OSS', function () {\n\n    var oss = new OSS({\n        credentials: {\n            accessKeyId: global.accessKeyId,\n            secretAccessKey: global.secretAccessKey\n        },\n        version: {\n            oss: 'v1'\n        },\n        basePath : '/v1', //默认要设为空\"\"\n    })\n\n    describe('listBucket', function () {\n        it('should be able to get bucket list', function () {\n            return oss.listBuckets({\n            },'cn-east-1')\n                .then(function (data) {\n                    console.log(data)\n                })\n        })\n    })\n\n    describe('putBucket', function () {\n        it('should be able to put bucket', function () {\n            return oss.putBucket({\n                bucketname : \"apitest\"\n            },'cn-east-1')\n                .then(function (data) {\n                    console.log(data)\n                })\n        })\n    })\n\n    describe('headBucket', function () {\n        it('should be able to get head', function () {\n            return oss.headBucket({\n                bucketname : \"apitest\"\n            },'cn-east-1')\n                .then(function (data) {\n                    console.log(data)\n                })\n        })\n    })\n\n    describe('deleteBucket', function () {\n        it('should be able to get head', function () {\n            return oss.deleteBucket({\n                bucketname : \"apitest\"\n            },'cn-east-1')\n                .then(function (data) {\n                    console.log(data)\n                })\n        })\n    })\n})\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/test/services/vm.spec.js",
    "content": "var VM = require('../../src/services/vm')\nvar config = require('config')\nvar global = config.get('global')\nvar expect = require('chai').expect\n\ndescribe('JDCloud.VM', function () {\n    var vm = new VM({\n        credentials: {\n            accessKeyId: global.accessKeyId,\n            secretAccessKey: global.secretAccessKey\n        },\n        regionId: 'cn-north-1',\n        version: {\n            vm: 'v1'\n        }\n    })\n    it('describeInstances', function () {\n        console.log(\"========DescribeInstances=======\");\n        return vm.describeInstances({\n            filters: [{ name: \"name\" , values:[ \"i-6za0ovr24v\",\n                \"i-rj5ve7jegu\",\n                \"i-rj5ve7jegu1\",\n                \"i-rj5ve7jegu2\",\n                \"i-rj5ve7jegu3\",\n                \"i-rj5ve7jegu4\",\n                \"i-rj5ve7jegdu\"] ,operator: \"eq\"}]\n        }, 'cn-north-1')\n            .then(function (data) {\n                console.log(data)\n            })\n    })\n    describe('should create and delete a instance', function () {\n        var instanceId = null\n        it('createInstances', function () {\n            return vm\n                .createInstances({\n                    instanceSpec: {\n                        instanceType: 'g.s1.micro',\n                        az: 'cn-north-1a',\n                        imageId: '9d44a0f-88c1-451a-8971-f1f769073b6c',\n                        name: 'node-sdk-test',\n                        elasticIp: { bandwidthMbps: 2, provider: 'BGP' },\n                        primaryNetworkInterface: {\n                            networkInterface: {\n                                subnetId: 'subnet-3dm3k30gh',\n                                az: 'cn-north-1a'\n                            }\n                        },\n                        systemDisk: { diskCategory: 'local' },\n                        description: 'sdk'\n                    },\n                    maxCount: 1\n                }, 'cn-north-1')\n                .then(function (data) {\n\n                    // instanceIds = data.data.instanceIds\n                    // return expec(instanceIds[0]).to.not.be.empty\n                })\n        })\n        it('deleteInstance', function () {\n            if (instanceId) {\n                return vm.deleteInstance({\n                    instanceId: instanceId\n                })\n            } else {\n                this.skip()\n            }\n        })\n    })\n})\n"
  },
  {
    "path": "packages/libs/lib-jdcloud/tsconfig.json",
    "content": "{\n  \"compileOnSave\": true,\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"esModuleInterop\": true,\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"noImplicitThis\": true,\n    \"noUnusedLocals\": true,\n    \"stripInternal\": true,\n    \"importHelpers\": true,\n    \"skipLibCheck\": true,\n    \"pretty\": true,\n    \"declaration\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"typeRoots\": [ \"./typings\", \"./node_modules/@types\"],\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"composite\": false,\n    \"useDefineForClassFields\": true,\n    \"strict\": false,\n    \"sourceMap\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": false,\n    \"lib\": [\"ESNext\", \"DOM\"],\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"src/**/*.d.ts\",\n    \"src/**/*.js\",\n    \"src/**/*.json\"\n  ],\n  \"exclude\": [\n    \"*.ts\",\n    \"dist\",\n    \"node_modules\",\n    \"test\"\n  ],\n}\n"
  },
  {
    "path": "packages/libs/lib-k8s/.eslintrc",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"plugins\": [\n    \"@typescript-eslint\"\n  ],\n  \"extends\": [\n    \"plugin:@typescript-eslint/recommended\",\n    \"plugin:prettier/recommended\",\n    \"prettier\"\n  ],\n  \"env\": {\n    \"mocha\": true\n  },\n  \"rules\": {\n    \"@typescript-eslint/no-var-requires\": \"off\",\n    \"@typescript-eslint/ban-ts-comment\": \"off\",\n    \"@typescript-eslint/ban-ts-ignore\": \"off\",\n    \"@typescript-eslint/no-explicit-any\": \"off\",\n    \"@typescript-eslint/no-empty-function\": \"off\",\n//    \"no-unused-expressions\": \"off\",\n    \"max-len\": [0, 160, 2, { \"ignoreUrls\": true }]\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-k8s/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n\nsrc/test/user.secret.ts\n\nsrc/**/*.js"
  },
  {
    "path": "packages/libs/lib-k8s/.npmignore",
    "content": "node_modules\nsrc"
  },
  {
    "path": "packages/libs/lib-k8s/.prettierrc",
    "content": "{\n  \"printWidth\": 220,\n  \"bracketSpacing\": true,\n  \"singleQuote\": false,\n  \"trailingComma\": \"es5\",\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "packages/libs/lib-k8s/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.31.10](https://github.com/certd/certd/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.31.9](https://github.com/certd/certd/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)\n\n### Performance Improvements\n\n* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))\n\n## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)\n\n### Performance Improvements\n\n* 支持k8s ingress secret ([e5a5d0a](https://github.com/certd/certd/commit/e5a5d0a607bb6b4e1a1f7a1a419bada5f2dee59f))\n\n## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.24.2](https://github.com/certd/certd/compare/v1.24.1...v1.24.2) (2024-09-06)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.24.1](https://github.com/certd/certd/compare/v1.24.0...v1.24.1) (2024-09-02)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.24.0](https://github.com/certd/certd/compare/v1.23.1...v1.24.0) (2024-08-25)\n\n### Performance Improvements\n\n* 更新k8s底层api库 ([746bb9d](https://github.com/certd/certd/commit/746bb9d385e2f397daef4976eca1d4782a2f5ebd))\n\n## [1.23.1](https://github.com/certd/certd/compare/v1.23.0...v1.23.1) (2024-08-06)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.8](https://github.com/certd/certd/compare/v1.22.7...v1.22.8) (2024-08-05)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.7](https://github.com/certd/certd/compare/v1.22.6...v1.22.7) (2024-08-04)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.6](https://github.com/certd/certd/compare/v1.22.5...v1.22.6) (2024-08-03)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.5](https://github.com/certd/certd/compare/v1.22.4...v1.22.5) (2024-07-26)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.3](https://github.com/certd/certd/compare/v1.22.2...v1.22.3) (2024-07-25)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.2](https://github.com/certd/certd/compare/v1.22.1...v1.22.2) (2024-07-23)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20)\n\n**Note:** Version bump only for package @certd/lib-k8s\n\n# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)\n\n### Features\n\n* 升级midway，支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))\n* 支持postgresql ([3b19bfb](https://github.com/certd/certd/commit/3b19bfb4291e89064b3b407a80dae092d54747d5))\n"
  },
  {
    "path": "packages/libs/lib-k8s/LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "packages/libs/lib-k8s/README.md",
    "content": "# Vue 3 + TypeScript + Vite\n\nThis template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.\n\n## Recommended IDE Setup\n\n- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar)\n\n## Type Support For `.vue` Imports in TS\n\nSince TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates. However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can enable Volar's Take Over mode by following these steps:\n\n1. Run `Extensions: Show Built-in Extensions` from VS Code's command palette, look for `TypeScript and JavaScript Language Features`, then right click and select `Disable (Workspace)`. By default, Take Over mode will enable itself if the default TypeScript extension is disabled.\n2. Reload the VS Code window by running `Developer: Reload Window` from the command palette.\n\nYou can learn more about Take Over mode [here](https://github.com/johnsoncodehk/volar/discussions/471).\n"
  },
  {
    "path": "packages/libs/lib-k8s/fix-esm-import-paths.js",
    "content": "import * as fs from \"fs\";\nimport * as path from \"path\";\n\n// https://gist.github.com/lovasoa/8691344\nasync function* walk(dir) {\n  for await (const d of await fs.promises.opendir(dir)) {\n    const entry = path.join(dir, d.name);\n    if (d.isDirectory()) {\n      yield* walk(entry);\n    } else if (d.isFile()) {\n      yield entry;\n    }\n  }\n}\n\nfunction resolveImportPath(sourceFile, importPath, options) {\n  const sourceFileAbs = path.resolve(process.cwd(), sourceFile);\n  const root = path.dirname(sourceFileAbs);\n  const { moduleFilter = defaultModuleFilter } = options;\n\n  if (moduleFilter(importPath)) {\n    const importPathAbs = path.resolve(root, importPath);\n    let possiblePath = [path.resolve(importPathAbs, \"./index.ts\"), path.resolve(importPathAbs, \"./index.js\"), importPathAbs + \".ts\", importPathAbs + \".js\"];\n\n    if (possiblePath.length) {\n      for (let i = 0; i < possiblePath.length; i++) {\n        let entry = possiblePath[i];\n        if (fs.existsSync(entry)) {\n          const resolved = path.relative(root, entry.replace(/\\.ts$/, \".js\"));\n\n          if (!resolved.startsWith(\".\")) {\n            return \"./\" + resolved;\n          }\n\n          return resolved;\n        }\n      }\n    }\n  }\n\n  return null;\n}\n\nfunction replace(filePath, outFilePath, options) {\n  const code = fs.readFileSync(filePath).toString();\n  const newCode = code.replace(/(import|export) (.+?) from ('[^\\n']+'|\"[^\\n\"]+\");/gs, function (found, action, imported, from) {\n    const importPath = from.slice(1, -1);\n    let resolvedPath = resolveImportPath(filePath, importPath, options);\n\n    if (resolvedPath) {\n      resolvedPath = resolvedPath.replaceAll(\"\\\\\", \"/\");\n      console.log(\"\\t\", importPath, resolvedPath);\n      return `${action} ${imported} from \"${resolvedPath}\";`;\n    }\n\n    return found;\n  });\n\n  if (code !== newCode) {\n    fs.writeFileSync(outFilePath, newCode);\n  }\n}\n\n// Then, use it with a simple async for loop\nasync function run(srcDir, options = defaultOptions) {\n  const { sourceFileFilter = defaultSourceFileFilter } = options;\n\n  for await (const entry of walk(srcDir)) {\n    if (sourceFileFilter(entry)) {\n      console.log(entry);\n      replace(entry, entry, options);\n    }\n  }\n}\n\nconst defaultSourceFileFilter = function (sourceFilePath) {\n  return /\\.(js|ts)$/.test(sourceFilePath) && !/node_modules/.test(sourceFilePath);\n};\n\nconst defaultModuleFilter = function (importedModule) {\n  return !path.isAbsolute(importedModule) && !importedModule.startsWith(\"@\") && !importedModule.endsWith(\".js\");\n};\n\nconst defaultOptions = {\n  sourceFileFilter: defaultSourceFileFilter,\n  moduleFilter: defaultModuleFilter,\n};\n\n// Switch this to test on one file or directly run on a directory.\nconst DEBUG = false;\n\nif (DEBUG) {\n  replace(\"./src/index.ts\", \"./out.ts\", defaultOptions);\n} else {\n  await run(\"./src/\", defaultOptions);\n}\n"
  },
  {
    "path": "packages/libs/lib-k8s/package.json",
    "content": "{\n  \"name\": \"@certd/lib-k8s\",\n  \"private\": false,\n  \"version\": \"1.36.10\",\n  \"type\": \"module\",\n  \"main\": \"./dist/index.js\",\n  \"module\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.ts\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"before-build\": \"rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache\",\n    \"build\": \"npm run before-build && tsc --skipLibCheck\",\n    \"dev-build\": \"npm run build\",\n    \"build3\": \"rollup -c\",\n    \"build2\": \"vue-tsc --noEmit && vite build\",\n    \"preview\": \"vite preview\",\n    \"pub\": \"npm publish\"\n  },\n  \"dependencies\": {\n    \"@certd/basic\": \"^1.36.10\",\n    \"@kubernetes/client-node\": \"0.21.0\"\n  },\n  \"devDependencies\": {\n    \"@types/chai\": \"^4.3.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.26.1\",\n    \"@typescript-eslint/parser\": \"^8.26.1\",\n    \"eslint\": \"^8.24.0\",\n    \"eslint-config-prettier\": \"^8.5.0\",\n    \"eslint-plugin-prettier\": \"^4.2.1\",\n    \"prettier\": \"^2.8.8\",\n    \"rimraf\": \"^5.0.5\",\n    \"tslib\": \"^2.8.1\",\n    \"typescript\": \"^5.4.2\"\n  },\n  \"gitHead\": \"085bdf5cfa9140903611aa12cdd2542d05aba321\"\n}\n"
  },
  {
    "path": "packages/libs/lib-k8s/src/index.ts",
    "content": "export * from './lib/k8s.client.js';\n"
  },
  {
    "path": "packages/libs/lib-k8s/src/lib/k8s.client.ts",
    "content": "import { CoreV1Api, KubeConfig, NetworkingV1Api, V1Ingress, V1Secret } from '@kubernetes/client-node';\nimport dns from 'dns';\nimport { ILogger } from '@certd/basic';\nimport _ from 'lodash-es';\n\nexport type K8sClientOpts = {\n  kubeConfigStr: string;\n  logger: ILogger;\n  //{  [domain]:{ip:'xxx.xx.xxx'} }\n  //暂时没用\n  lookup?: any;\n};\nexport class K8sClient {\n  kubeconfig!: KubeConfig;\n  kubeConfigStr: string;\n  lookup!: (hostnameReq: any, options: any, callback: any) => void;\n  client!: CoreV1Api;\n  logger: ILogger;\n  constructor(opts: K8sClientOpts) {\n    this.kubeConfigStr = opts.kubeConfigStr;\n    this.logger = opts.logger;\n    this.setLookup(opts.lookup);\n    this.init();\n  }\n\n  init() {\n    const kubeconfig = new KubeConfig();\n    kubeconfig.loadFromString(this.kubeConfigStr);\n    this.kubeconfig = kubeconfig;\n    this.client = kubeconfig.makeApiClient(CoreV1Api);\n\n    // const reqOpts = { kubeconfig, request: {} } as any;\n    // if (this.lookup) {\n    //   reqOpts.request.lookup = this.lookup;\n    // }\n    //\n    // const backend = new Request(reqOpts);\n    // this.client = new Client({ backend, version: '1.13' });\n  }\n\n  /**\n   *\n   * @param localRecords {  [domain]:{ip:'xxx.xx.xxx'} }\n   */\n  setLookup(localRecords: { [key: string]: { ip: string } }) {\n    if (localRecords == null) {\n      return;\n    }\n    this.lookup = (hostnameReq: any, options: any, callback: any) => {\n      this.logger.info('custom lookup', hostnameReq, localRecords);\n      if (localRecords[hostnameReq]) {\n        this.logger.info('local record', hostnameReq, localRecords[hostnameReq]);\n        callback(null, localRecords[hostnameReq].ip, 4);\n      } else {\n        dns.lookup(hostnameReq, options, callback);\n      }\n    };\n  }\n\n  /**\n   * 查询 secret列表\n   * @param opts = {namespace:default}\n   * @returns secretsList\n   */\n  async getSecrets(opts: { namespace: string }) {\n    const namespace = opts.namespace || 'default';\n    return await this.client.listNamespacedSecret(namespace);\n  }\n\n  /**\n   * 创建Secret\n   * @param opts {namespace:default, body:yamlStr}\n   * @returns {Promise<*>}\n   */\n  async createSecret(opts: { namespace: string; body: V1Secret }) {\n    const namespace = opts.namespace || 'default';\n    const created = await this.client.createNamespacedSecret(namespace, opts.body);\n    this.logger.info('new secrets:', opts.body);\n    return created.body;\n  }\n\n  // async updateSecret(opts: any) {\n  //   const namespace = opts.namespace || 'default';\n  //   const secretName = opts.secretName;\n  //   if (secretName == null) {\n  //     throw new Error('secretName 不能为空');\n  //   }\n  //   return await this.client.replaceNamespacedSecret(secretName, namespace, opts.body);\n  // }\n\n  async patchSecret(opts: { namespace: string; secretName: string; body: V1Secret }) {\n    const namespace = opts.namespace || 'default';\n    const secretName = opts.secretName;\n    if (secretName == null) {\n      throw new Error('secretName 不能为空');\n    }\n    this.logger.info('patch secret:', secretName, namespace);\n    const oldSecret = await this.client.readNamespacedSecret(secretName, namespace);\n    const newSecret = _.merge(oldSecret.body, opts.body);\n    const res = await this.client.replaceNamespacedSecret(secretName, namespace, newSecret);\n    this.logger.info('secret updated');\n    return res.body;\n  }\n\n  async getIngressList(opts: { namespace: string }) {\n    const namespace = opts.namespace || 'default';\n    const client = this.kubeconfig.makeApiClient(NetworkingV1Api);\n    const res = await client.listNamespacedIngress(namespace);\n    this.logger.info('ingress list get:', res.body);\n    return res.body;\n  }\n\n  // async getIngress(opts: { namespace: string; ingressName: string }) {\n  //   const namespace = opts.namespace || 'default';\n  //   const ingressName = opts.ingressName;\n  //   if (!ingressName) {\n  //     throw new Error('ingressName 不能为空');\n  //   }\n  //   const client = this.kubeconfig.makeApiClient(NetworkingV1Api);\n  //   const res = await client.listNamespacedIngress();\n  //   return await this.client.apis.extensions.v1beta1.namespaces(namespace).ingresses(ingressName).get();\n  // }\n\n  async patchIngress(opts: { namespace: string; ingressName: string; body: V1Ingress }) {\n    const namespace = opts.namespace || 'default';\n    const ingressName = opts.ingressName;\n    if (!ingressName) {\n      throw new Error('ingressName 不能为空');\n    }\n    this.logger.info('patch ingress:', ingressName, namespace);\n    const client = this.kubeconfig.makeApiClient(NetworkingV1Api);\n    const oldIngress = await client.readNamespacedIngress(ingressName, namespace);\n    const newIngress = _.merge(oldIngress.body, opts.body);\n    const res = await client.replaceNamespacedIngress(ingressName, namespace, newIngress);\n    this.logger.info('ingress patched', opts.body);\n    return res;\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-k8s/tsconfig.json",
    "content": "{\n  \"compileOnSave\": true,\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"esModuleInterop\": true,\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"inlineSourceMap\":true,\n    \"noImplicitThis\": true,\n    \"noUnusedLocals\": true,\n    \"stripInternal\": true,\n    \"skipLibCheck\": true,\n    \"importHelpers\": true,\n    \"pretty\": true,\n    \"declaration\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"typeRoots\": [ \"./typings\", \"./node_modules/@types\"],\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"composite\": false,\n    \"useDefineForClassFields\": true,\n    \"strict\": false,\n//    \"sourceMap\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"src/**/*.d.ts\",\n    \"src/**/*.json\"\n  ],\n  \"exclude\": [\n    \"*.js\",\n    \"*.ts\",\n    \"dist\",\n    \"node_modules\",\n    \"src/test\"\n  ],\n}\n"
  },
  {
    "path": "packages/libs/lib-server/.dockerignore",
    "content": "logs/\nnpm-debug.log\nyarn-error.log\nnode_modules/\npackage-lock.json\nyarn.lock\ncoverage/\n!dist/\n.idea/\nrun/\n.DS_Store\n*.sw*\n*.un~\n.tsbuildinfo\n.tsbuildinfo.*\n/data/db.sqlite\n"
  },
  {
    "path": "packages/libs/lib-server/.editorconfig",
    "content": "# 🎨 editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_style = space\nindent_size = 2\ntrim_trailing_whitespace = true\ninsert_final_newline = true"
  },
  {
    "path": "packages/libs/lib-server/.eslintrc.json",
    "content": "{\n  \"extends\": \"./node_modules/mwts/\",\n  \"ignorePatterns\": [\"node_modules\", \"dist\", \"test\", \"jest.config.js\", \"typings\"],\n  \"env\": {\n    \"jest\": true\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n\ntest/user.secret.ts\n\ntsconfig.tsbuildinfo\n"
  },
  {
    "path": "packages/libs/lib-server/.npmignore",
    "content": "node_modules\nsrc"
  },
  {
    "path": "packages/libs/lib-server/.prettierrc",
    "content": "{\n  \"printWidth\": 220,\n  \"bracketSpacing\": true,\n  \"singleQuote\": false,\n  \"trailingComma\": \"es5\",\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "packages/libs/lib-server/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n### Performance Improvements\n\n* 优化流水线列表页面、详情页面性能，精简返回数据 ([609ac9c](https://github.com/certd/certd/commit/609ac9c9a2dde605eb09834ae59693c1cb238765))\n* OpenAPI支持autoApply参数 ([42f4d14](https://github.com/certd/certd/commit/42f4d1477dc791520a874aed56035abcbc8c433b))\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n**Note:** Version bump only for package @certd/lib-server\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n### Performance Improvements\n\n* 支持s3 access做测试 ([f00aeac](https://github.com/certd/certd/commit/f00aeacb8b5c81f0bafa4c1b76723dec2b6b7784))\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n**Note:** Version bump only for package @certd/lib-server\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n### Performance Improvements\n\n* 支持设置用户有效期 ([6ac3bc5](https://github.com/certd/certd/commit/6ac3bc564f407dad2cd0b0b0744e887387aa5da3))\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n### Performance Improvements\n\n* 邮箱支持保存和选择 ([f7b0b44](https://github.com/certd/certd/commit/f7b0b44ef6044bec36510a6f0b06d8dca5bfce49))\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n### Performance Improvements\n\n* 站点证书监控增加通知设置 ([3422a1a](https://github.com/certd/certd/commit/3422a1a59fd0d2c0f17fa9c7e8988ac527ecfdd9))\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n### Performance Improvements\n\n* 小助手可以关闭 ([3e2101a](https://github.com/certd/certd/commit/3e2101aa5b56548614102e900d59819ce8c7e97c))\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n### Performance Improvements\n\n* 支持设置网安备案号 ([d18e431](https://github.com/certd/certd/commit/d18e431e2f08e6b37704032c4ea6fbdd8e971442))\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n**Note:** Version bump only for package @certd/lib-server\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n### Performance Improvements\n\n* 登录支持双重认证 ([48aef25](https://github.com/certd/certd/commit/48aef25b3f6499d674ca4e4ef16f4c62399fb735))\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n**Note:** Version bump only for package @certd/lib-server\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n**Note:** Version bump only for package @certd/lib-server\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.31.10](https://github.com/certd/certd/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.31.9](https://github.com/certd/certd/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n**Note:** Version bump only for package @certd/lib-server\n\n# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n### Performance Improvements\n\n* 升级midwayjs版本 ([057b0b4](https://github.com/certd/certd/commit/057b0b4565e19bb93195633f767b2942e8e40e59))\n* 是否允许爬虫爬取增加ui设置选项 ([779db9d](https://github.com/certd/certd/commit/779db9da705d2dfef36fec21f52bd38af9fc5f2e))\n\n## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n**Note:** Version bump only for package @certd/lib-server\n\n# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n### Features\n\n* 支持open api接口，根据域名获取证书 ([52a4fd3](https://github.com/certd/certd/commit/52a4fd33180e9b3f71b8dc9f7671d7cd8e448c3b))\n\n## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n### Bug Fixes\n\n* 修复系统级授权无法查看密钥的bug ([8644348](https://github.com/certd/certd/commit/8644348fc41ae2e1672f946ca37e5d3a674e0218))\n\n## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n**Note:** Version bump only for package @certd/lib-server\n\n# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n### Features\n\n* 基础版不再限制流水线数量 ([cb27d4b](https://github.com/certd/certd/commit/cb27d4b4906b2782eaceb0a95bbdc5d0534370d2))\n* 套餐购买支持易支付、支付宝支付 ([faa28f8](https://github.com/certd/certd/commit/faa28f88f954cba4c1dd29125562e5acd2fd99af))\n* 用户套餐，用户支付功能 ([a019956](https://github.com/certd/certd/commit/a019956698acaf2c4beb620b5ad8c18918ead6a1))\n\n### Performance Improvements\n\n* 站点证书监控通知发送，每天定时检查 ([bb4910f](https://github.com/certd/certd/commit/bb4910f4e57234e42b44505f4620ae7af66025c5))\n\n## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n### Performance Improvements\n\n* favicon支持自定义 ([8b9c47d](https://github.com/certd/certd/commit/8b9c47daf194515006689a212ae9cf586bdf5993))\n\n# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n### Performance Improvements\n\n* 登录失败增加重试次数限制及冷却时间 ([954b6df](https://github.com/certd/certd/commit/954b6df3608695fe074130f8149a33e311d80cc4))\n* 流水线支持批量修改分组，批量删除 ([a847e66](https://github.com/certd/certd/commit/a847e66c4fc843b98f1520b2b8072d3586ce8b81))\n* 支持短信验证码登录 ([387bcc5](https://github.com/certd/certd/commit/387bcc5fa418cdeea81a06da5e3f8cd6b43cd082))\n\n## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n### Bug Fixes\n\n* 修复vip试用secret报错的bug ([018dee6](https://github.com/certd/certd/commit/018dee6c383233560f078dfd30f6c2857a7e15ee))\n\n## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n### Performance Improvements\n\n* 专业版试用，无需绑定账号 ([c7c4318](https://github.com/certd/certd/commit/c7c4318c11b65a76089787aa58939832d338a232))\n\n## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n### Performance Improvements\n\n* 公共cname服务支持关闭 ([f4ae512](https://github.com/certd/certd/commit/f4ae5125dc4cd97816976779cb3586b5ee78947e))\n\n## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n### Performance Improvements\n\n* ipv6支持 ([da6ac16](https://github.com/certd/certd/commit/da6ac1626b3574be2fabeeb18a1f10d60bdcbe49))\n\n## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n### Performance Improvements\n\n* 优化部署到阿里云CDN插件，支持多域名，更易用 ([80c500f](https://github.com/certd/certd/commit/80c500f618b169a1f64c57fe442242a4d0d9d833))\n* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941))\n\n## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n### Performance Improvements\n\n* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9))\n\n# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n### Performance Improvements\n\n* 限制其他用户流水线数量 ([315e437](https://github.com/certd/certd/commit/315e43746baf01682737f82e41579237a48409af))\n* 用户管理优化头像上传 ([661293c](https://github.com/certd/certd/commit/661293c189a3abf3cdc953b5225192372f57930d))\n\n## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n### Bug Fixes\n\n* 申请证书没有使用到系统设置的http代理的bug ([3db216f](https://github.com/certd/certd/commit/3db216f515ba404cb4330fdab452971b22a50f08))\n\n### Performance Improvements\n\n* 申请证书启用新的反代地址 ([a705182](https://github.com/certd/certd/commit/a705182b85e51157883e48f23463263793bf3c12))\n\n## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n### Bug Fixes\n\n* 修复无法设置角色的bug ([02fe704](https://github.com/certd/certd/commit/02fe704769edb25fea5ffd85a51a5530864b37b3))\n\n### Performance Improvements\n\n* 密钥备份 ([1c6028a](https://github.com/certd/certd/commit/1c6028abcf8849163462bb2f8441b6838357e09b))\n\n## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n### Bug Fixes\n\n* 修复siteInfo每次都要重新设置的bug ([36b26ae](https://github.com/certd/certd/commit/36b26ae9f5c7a53c1c2546fb79b2ea451b854abf))\n\n## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n### Bug Fixes\n\n* 修复排序失效的bug ([1f0742e](https://github.com/certd/certd/commit/1f0742ef9f0caae0c7e713acf0fd3cebf5d63875))\n\n## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n**Note:** Version bump only for package @certd/lib-server\n\n## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n### Performance Improvements\n\n* [comm] 支持插件管理 ([e8b617b](https://github.com/certd/certd/commit/e8b617b80ce882dd63006f0cfc719a80a1cc6acc))\n* 新增代理设置功能 ([273ab61](https://github.com/certd/certd/commit/273ab6139f5807f4d7fe865cc353b97f51b9a668))\n* EAB授权支持绑定邮箱，支持公共EAB设置 ([07043af](https://github.com/certd/certd/commit/07043aff0ca7fd29c56dd3c363002cb15d78b464))\n\n## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n### Performance Improvements\n\n* 优化系统设置加载时机 ([7396253](https://github.com/certd/certd/commit/73962536d5a4769902d760d005f3f879465addcc))\n\n## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n### Bug Fixes\n\n* 修复某些情况下bindUrl失败的bug ([91fc1cd](https://github.com/certd/certd/commit/91fc1cd7353be4a22be951239ed70b38baebc74e))\n\n### Performance Improvements\n\n* 邮箱设置改为系统设置，普通用户无需配置发件邮箱 ([4244569](https://github.com/certd/certd/commit/42445692117184a3293e63bef84a74cbb5984b0e))\n\n## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package @certd/lib-server\n\n# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n### Bug Fixes\n\n* 修复历史记录根据流水线名称查询报错的bug ([ce9a986](https://github.com/certd/certd/commit/ce9a9862f122fce2186e7727eaa4b251b59e6032))\n\n### Features\n\n* 域名验证方法支持CNAME间接方式，此方式支持所有域名注册商，且无需提供Access授权，但是需要手动添加cname解析 ([f3d3508](https://github.com/certd/certd/commit/f3d35084ed44f9f33845f7045e520be5c27eed93))\n* 站点个性化设置 ([11a9fe9](https://github.com/certd/certd/commit/11a9fe9014d96cba929e5a066e78f2af7ae59d14))\n\n### Performance Improvements\n\n* 调整全部静态资源到static目录 ([a218890](https://github.com/certd/certd/commit/a21889080d6c7ffdf0af526a3a21f0b2d1c77288))\n* 检查cname是否正确配置 ([b5d8935](https://github.com/certd/certd/commit/b5d8935159374fbe7fc7d4c48ae0ed9396861bdd))\n\n## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)\n\n### Performance Improvements\n\n* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))\n\n## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.22.6](https://github.com/certd/certd/compare/v1.22.5...v1.22.6) (2024-08-03)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.22.3](https://github.com/certd/certd/compare/v1.22.2...v1.22.3) (2024-07-25)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.22.2](https://github.com/certd/certd/compare/v1.22.1...v1.22.2) (2024-07-23)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)\n\n### Features\n\n* 升级midway，支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))\n* 支持postgresql ([3b19bfb](https://github.com/certd/certd/commit/3b19bfb4291e89064b3b407a80dae092d54747d5))\n"
  },
  {
    "path": "packages/libs/lib-server/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 Greper\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": "packages/libs/lib-server/README.md",
    "content": "# Vue 3 + TypeScript + Vite\n\nThis template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.\n\n## Recommended IDE Setup\n\n- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar)\n\n## Type Support For `.vue` Imports in TS\n\nSince TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates. However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can enable Volar's Take Over mode by following these steps:\n\n1. Run `Extensions: Show Built-in Extensions` from VS Code's command palette, look for `TypeScript and JavaScript Language Features`, then right click and select `Disable (Workspace)`. By default, Take Over mode will enable itself if the default TypeScript extension is disabled.\n2. Reload the VS Code window by running `Developer: Reload Window` from the command palette.\n\nYou can learn more about Take Over mode [here](https://github.com/johnsoncodehk/volar/discussions/471).\n"
  },
  {
    "path": "packages/libs/lib-server/README_zhCN.md",
    "content": "# midway-flyway-js\n\n[English](./README.md) | [简体中文](./README_zhCN.md)\n\n\n`midway-flyway-js`是基于typeorm的flyway的js实现。\n本项目被构建为midway组件，可与midway无缝集成。\n\n# flyway\nflyway是一款java版本的数据库升级迁移解决方案。\n它能在server启动时自动检查脚本目录，执行sql升级脚本，记录执行历史。\n\n本项目根据类似flyway的思路实现数据库升级迁移方案\n\n# 快速开始\n\n## 1. 准备\n* nodejs环境\n* midway项目\n* [配置typeorm](https://www.yuque.com/midwayjs/midway_v2/orm)\n\n## 2. 安装\n```\nnpm install midway-flyway-js\n# or\nyarn add midway-flyway-js\n```\n## 3. 集成\n```js\nimport * as orm from 'typeorm';\nimport * as flyway from 'midway-flyway-js';\n@Configuration({\n  imports: [\n    orm, // 加载 orm 组件\n    flyway, //加载flyway组件\n  ],\n})\nexport class ContainerConfiguration {}\n```\n\n\n## 4. 配置参数【可选】\n`/src/config/config.default.js`文件\n```js\nexport const flyway ={\n  // 脚本目录\n  // 默认值 \"./db/migrition\"\n  scriptDir:\"./db/migrition\",\n  // 基线，基线脚本及之前的脚本都跳过不执行\n  // 默认值：null\n  // 如果你原本就是空数据库，那么不需要配置此项\n  baseline: 'v1__init.sql',\n  // 执行记录表名\n  // 默认值 flyway_history\n  flywayTableName:'flyway_history',\n  // 是否允许hash值不同\n  // 默认值：false\n  // 相同名称sql文件被改动后，hash会变化\n  // 此时运行会报hash conflict错误\n  // 配置此参数为true，将忽略hash conflict错误\n  allowHashNotMatch:false\n}\n\n```\n## 5. 编写升级sql\n\n将你的sql升级脚本，放到 `/src/db/migrition`目录下\n\n建议命名规则`v{version}__{name}.sql`,例如`v1__init.sql`\n\n\n## 6. 启动你的midway服务\n```\nnpm run dev\n```\n\n## 7. 运行效果\n以下效果为midway自动启动后，自动执行`v1__init.sql`脚本的记录\n```\n2021-06-26 15:45:39,630 INFO 12245 [ midfly ] start-------------\nquery: SELECT * FROM \"sqlite_master\" WHERE \"type\" = 'table' AND \"name\" = 'flyway_history'\nquery: CREATE TABLE \"flyway_history\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"timestamp\" bigint NOT NULL, \"name\" varchar NOT NULL, \"hash\" varchar, \"success\" boolean)\nquery: BEGIN TRANSACTION\nquery: SELECT \"FlywayHistory\".\"id\" AS \"FlywayHistory_id\", \"FlywayHistory\".\"name\" AS \"FlywayHistory_name\", \"FlywayHistory\".\"hash\" AS \"FlywayHistory_hash\", \"FlywayHistory\".\"timestamp\" AS \"FlywayHistory_timestamp\", \"FlywayHistory\".\"success\" AS \"FlywayHistory_success\" FROM \"flyway_history\" \"FlywayHistory\" WHERE \"FlywayHistory\".\"name\" = ? AND \"FlywayHistory\".\"success\" = ? LIMIT 1 -- PARAMETERS: [\"v1__init.sql\",1]\n2021-06-26 15:45:39,664 INFO 12245 need exec script file:\n2021-06-26 15:45:39,666 INFO 12245 [ midfly ] exec\nquery: -- 表：sys_permission\nCREATE TABLE \"sys_permission\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"title\" varchar(100) NOT NULL, \"permission\" varchar(100), \"parent_id\" integer NOT NULL DEFAULT (-1), \"sort\" integer NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nquery: INSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (1, '系统管理', 'sys', -1, 1, 1, 1624085863636);\nquery: -- 表：sys_role\nCREATE TABLE \"sys_role\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"name\" varchar(100) NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nquery: INSERT INTO sys_role (id, name, create_time, update_time) VALUES (1, '管理员', 1, 1623749138537);\nquery: -- 表：sys_role_permission\nCREATE TABLE \"sys_role_permission\" (\"role_id\" integer NOT NULL, \"permission_id\" integer NOT NULL, PRIMARY KEY (\"role_id\", \"permission_id\"));\nquery: INSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 1);\nquery: -- 表：sys_user\nCREATE TABLE \"sys_user\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"username\" varchar(100) NOT NULL, \"password\" varchar(50) NOT NULL, \"nick_name\" varchar(50), \"avatar\" varchar(255), \"phone_code\" varchar(20), \"mobile\" varchar(20), \"email\" varchar(100),\"remark\" varchar(100), \"status\" integer NOT NULL DEFAULT (1), \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nquery: INSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 'admin', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,NULL);\nquery: -- 表：sys_user_role\nCREATE TABLE \"sys_user_role\" (\"role_id\" integer NOT NULL, \"user_id\" integer NOT NULL, PRIMARY KEY (\"role_id\", \"user_id\"));\nquery: INSERT INTO sys_user_role (role_id, user_id) VALUES (1, 1);\nquery: -- 索引：IDX_223de54d6badbe43a5490450c3\nCREATE UNIQUE INDEX \"IDX_223de54d6badbe43a5490450c3\" ON \"sys_role\" (\"name\");\nquery: -- 索引：IDX_9e7164b2f1ea1348bc0eb0a7da\nCREATE UNIQUE INDEX \"IDX_9e7164b2f1ea1348bc0eb0a7da\" ON \"sys_user\" (\"username\");\nquery: DELETE FROM \"flyway_history\" WHERE \"name\" = ? -- PARAMETERS: [\"v1__init.sql\"]\nquery: INSERT INTO \"flyway_history\"(\"id\", \"name\", \"hash\", \"timestamp\", \"success\") VALUES (NULL, ?, ?, ?, ?) -- PARAMETERS: [\"v1__init.sql\",\"0c661bd7afebac224bbaa60bc5bb56e9\",1624693539781,1]\nquery: SELECT \"FlywayHistory\".\"id\" AS \"FlywayHistory_id\", \"FlywayHistory\".\"success\" AS \"FlywayHistory_success\" FROM \"flyway_history\" \"FlywayHistory\" WHERE \"FlywayHistory\".\"id\" = ? -- PARAMETERS: [1]\nquery: COMMIT\n2021-06-26 15:45:39,800 INFO 12245 [ midfly ] end-------------\n```\n\n# 注意事项\n1. 升级sql文件最后一行请不要有注释，应该以一条sql语句的分号结尾。\n\n# 他们在用\n* [fs-server-js](https://github.com/fast-crud/fs-server-js)\n\n# 参考项目\n* [flyway](https://github.com/flyway/flyway) : java版flyway\n* [flyway-js](https://github.com/wanglihui/flyway-js) : Sequelize版flyway\n\n感谢以上项目\n\n\n"
  },
  {
    "path": "packages/libs/lib-server/jest.config.js",
    "content": "module.exports = {\n  preset: 'ts-jest',\n  testEnvironment: 'node',\n  testPathIgnorePatterns: ['<rootDir>/test/fixtures'],\n  coveragePathIgnorePatterns: ['<rootDir>/test/'],\n};\n"
  },
  {
    "path": "packages/libs/lib-server/ormconfig.json",
    "content": "{\n  \"type\": \"sqlite\",\n  \"database\": \"./data/db.sqlite\",\n  \"synchronize\": false,\n  \"logging\": true,\n  \"entities\": [ \"src/**/entity.ts\"]\n}\n"
  },
  {
    "path": "packages/libs/lib-server/package.json",
    "content": "{\n  \"name\": \"@certd/lib-server\",\n  \"version\": \"1.36.10\",\n  \"description\": \"midway with flyway, sql upgrade way \",\n  \"private\": false,\n  \"type\": \"module\",\n  \"module\": \"./dist/index.js\",\n  \"main\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.ts\",\n  \"scripts\": {\n    \"before-build\": \"rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache\",\n    \"build\": \"npm run before-build && tsc --skipLibCheck\",\n    \"dev-build\": \"npm run build\",\n    \"test\": \"midway-bin test --ts -V\",\n    \"test1\": \"midway-bin test --ts -V -f test/blank.test.ts -t 'hash-check'\",\n    \"cov\": \"midway-bin cov --ts\",\n    \"lint\": \"mwts check\",\n    \"lint:fix\": \"mwts fix\",\n    \"prepublish\": \"npm run build\",\n    \"pub\": \"npm publish\"\n  },\n  \"keywords\": [],\n  \"author\": \"greper\",\n  \"files\": [\n    \"dist/**/*.js\",\n    \"dist/**/*.d.ts\"\n  ],\n  \"license\": \"AGPL\",\n  \"dependencies\": {\n    \"@certd/acme-client\": \"^1.36.10\",\n    \"@certd/basic\": \"^1.36.10\",\n    \"@certd/pipeline\": \"^1.36.10\",\n    \"@certd/plus-core\": \"^1.36.10\",\n    \"@midwayjs/cache\": \"~3.14.0\",\n    \"@midwayjs/core\": \"~3.20.3\",\n    \"@midwayjs/i18n\": \"~3.20.3\",\n    \"@midwayjs/info\": \"~3.20.3\",\n    \"@midwayjs/koa\": \"~3.20.3\",\n    \"@midwayjs/logger\": \"~3.4.2\",\n    \"@midwayjs/typeorm\": \"~3.20.3\",\n    \"@midwayjs/upload\": \"^3.20.3\",\n    \"better-sqlite3\": \"^11.1.2\",\n    \"cross-env\": \"^7.0.3\",\n    \"dayjs\": \"^1.11.7\",\n    \"lodash-es\": \"^4.17.21\",\n    \"mwts\": \"^1.3.0\",\n    \"mwtsc\": \"^1.4.0\",\n    \"typeorm\": \"^0.3.20\"\n  },\n  \"devDependencies\": {\n    \"@types/chai\": \"^4.3.3\",\n    \"@types/node\": \"^18\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.26.1\",\n    \"@typescript-eslint/parser\": \"^8.26.1\",\n    \"eslint\": \"^8.24.0\",\n    \"eslint-config-prettier\": \"^8.5.0\",\n    \"eslint-plugin-prettier\": \"^4.2.1\",\n    \"prettier\": \"^2.8.8\",\n    \"rimraf\": \"^5.0.5\",\n    \"tslib\": \"^2.8.1\",\n    \"typeorm\": \"^0.3.11\",\n    \"typescript\": \"^5.4.2\"\n  },\n  \"gitHead\": \"085bdf5cfa9140903611aa12cdd2542d05aba321\"\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/base-controller.ts",
    "content": "import { Inject } from '@midwayjs/core';\nimport * as koa from '@midwayjs/koa';\nimport { Constants } from './constants.js';\n\nexport abstract class BaseController {\n  @Inject()\n  ctx: koa.Context;\n\n  /**\n   * 成功返回\n   * @param data 返回数据\n   */\n  ok(data?: any) {\n    const res = {\n      ...Constants.res.success,\n      data: undefined,\n    };\n    if (data) {\n      res.data = data;\n    }\n    return res;\n  }\n  /**\n   * 失败返回\n   * @param msg\n   * @param code\n   */\n  fail(msg: string, code?: any) {\n    return {\n      code: code ? code : Constants.res.error.code,\n      msg: msg ? msg : Constants.res.error.code,\n    };\n  }\n\n  getUserId() {\n    const userId = this.ctx.user?.id;\n    if (userId == null) {\n      throw new Error('Token已过期');\n    }\n    return userId;\n  }\n\n  getLoginUser() {\n    const user = this.ctx.user;\n    if (user == null) {\n      throw new Error('Token已过期');\n    }\n    return user;\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/base-service.ts",
    "content": "import { PermissionException, ValidateException } from './exception/index.js';\nimport { In, Repository, SelectQueryBuilder } from 'typeorm';\nimport { Inject } from '@midwayjs/core';\nimport { TypeORMDataSourceManager } from '@midwayjs/typeorm';\nimport { EntityManager } from 'typeorm/entity-manager/EntityManager.js';\nimport { FindManyOptions } from 'typeorm';\n\nexport type PageReq<T = any> = {\n  page?: { offset: number; limit: number };\n} & ListReq<T>;\n\nexport type ListReq<T = any> = {\n  query?: Partial<T>;\n  sort?: {\n    prop: string;\n    asc: boolean;\n  };\n  buildQuery?: (bq: SelectQueryBuilder<any>) => void;\n  select?: any;\n};\n\n/**\n * 服务基类\n */\nexport abstract class BaseService<T> {\n  @Inject()\n  dataSourceManager: TypeORMDataSourceManager;\n\n  abstract getRepository(): Repository<T>;\n\n  async transaction(callback: (entityManager: EntityManager) => Promise<any>) {\n    const dataSource = this.dataSourceManager.getDataSource('default');\n    return await dataSource.transaction(callback as any);\n  }\n\n  /**\n   * 获得单个ID\n   * @param id ID\n   * @param infoIgnoreProperty 忽略返回属性\n   */\n  async info(id, infoIgnoreProperty?): Promise<T | null> {\n    if (!id) {\n      throw new ValidateException('id不能为空');\n    }\n    const info = await this.getRepository().findOneBy({ id } as any);\n    if (info && infoIgnoreProperty) {\n      for (const property of infoIgnoreProperty) {\n        delete info[property];\n      }\n    }\n    return info;\n  }\n\n  /**\n   * 非分页查询\n   * @param options\n   */\n  async find(options: FindManyOptions<T>) {\n    return await this.getRepository().find(options);\n  }\n\n  /**\n   *\n   * @param where\n   */\n  async deleteWhere(where: any) {\n    await this.getRepository().delete({\n      ...where,\n    });\n  }\n\n  /**\n   * 删除\n   * @param ids 删除的ID集合 如：[1,2,3] 或者 1,2,3\n   * @param where\n   */\n  async delete(ids: string | any[], where?: any) {\n    const idArr = this.resolveIdArr(ids);\n    if (idArr.length === 0) {\n      return;\n    }\n    await this.getRepository().delete({\n      id: In(idArr),\n      ...where,\n    });\n    await this.modifyAfter(idArr);\n    return ids\n  }\n\n  resolveIdArr(ids: string | any[]) {\n    if (!ids) {\n      throw new ValidateException('ids不能为空');\n    }\n    if (typeof ids === 'string') {\n      return ids.split(',');\n    } else {\n      return ids;\n    }\n  }\n\n  /**\n   * 新增|修改\n   * @param param 数据\n   */\n  async addOrUpdate(param: any) {\n    await this.getRepository().save(param);\n  }\n\n  /**\n   * 新增\n   * @param param 数据\n   */\n  async add(param: any) {\n    const now = new Date();\n    param.createTime = now;\n    param.updateTime = now;\n    await this.addOrUpdate(param);\n    await this.modifyAfter(param);\n    return {\n      id: param.id,\n    };\n  }\n\n  /**\n   * 修改\n   * @param param 数据\n   */\n  async update(param: any) {\n    if (!param.id) throw new ValidateException('id 不能为空');\n    param.updateTime = new Date();\n    await this.addOrUpdate(param);\n    await this.modifyAfter(param);\n  }\n\n  /**\n   * 新增|修改|删除 之后的操作\n   * @param data 对应数据\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  async modifyAfter(data: any) {}\n\n  /**\n   * 分页查询\n   */\n  async page(pageReq: PageReq<T>) {\n    const { page } = pageReq;\n    if (page.offset == null) {\n      page.offset = 0;\n    }\n    if (page.limit == null) {\n      page.limit = 20;\n    }\n    const qb = this.buildListQuery(pageReq);\n\n    qb.offset(page.offset).limit(page.limit);\n    const list = await qb.getMany();\n    const total = await qb.getCount();\n    return {\n      records: list,\n      total,\n      offset: page.offset,\n      limit: page.limit,\n    };\n  }\n\n  private buildListQuery(listReq: ListReq<T>) {\n    const { query, sort, buildQuery,select } = listReq;\n    const qb = this.getRepository().createQueryBuilder('main');\n    if (select) {\n      qb.setFindOptions({select});\n    }\n    if (query) {\n      const keys = Object.keys(query);\n      for (const key of keys) {\n        const value = query[key];\n        if (value == null) {\n          delete query[key];\n        }\n      }\n      qb.where(query);\n    }\n    if (sort && sort.prop) {\n      const found = this.getRepository().metadata.columns.find(column => {\n        if (column.propertyName === sort.prop) {\n          return true;\n        }\n      });\n      if (found) {\n        qb.addOrderBy('main.' + sort.prop, sort.asc ? 'ASC' : 'DESC');\n      }\n    }\n    qb.addOrderBy('id', 'DESC');\n    //自定义query\n    if (buildQuery) {\n      buildQuery(qb);\n    }\n\n    return qb;\n  }\n\n  /**\n   * 分页查询\n   */\n  async list(listReq: ListReq<T>) {\n    const qb = this.buildListQuery(listReq);\n    return await qb.getMany();\n  }\n\n  async checkUserId(id: any = 0, userId: number, userKey = 'userId') {\n    const res = await this.getRepository().findOne({\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      select: { [userKey]: true },\n      where: {\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        id,\n      },\n    });\n    if (!res || res[userKey] === userId) {\n      return;\n    }\n    throw new PermissionException('权限不足');\n  }\n\n  async batchDelete(ids: number[], userId: number) {\n    if(userId >0){\n      const list = await this.getRepository().find({\n        where: {\n          // @ts-ignore\n          id: In(ids),\n          userId,\n        },\n      })\n      // @ts-ignore\n      ids = list.map(item => item.id)\n    }\n\n    await this.delete(ids);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/constants.ts",
    "content": "export const Constants = {\n  dataDir: './data',\n  role: {\n    defaultUser: 3,\n  },\n  per: {\n    //无需登录\n    guest: '_guest_',\n    //无需登录\n    anonymous: '_guest_',\n    //仅需要登录\n    authOnly: '_authOnly_',\n    //仅需要登录\n    loginOnly: '_authOnly_',\n\n    open: '_open_',\n  },\n  res: {\n    serverError(message: string) {\n      return {\n        code: 1,\n        message,\n      };\n    },\n    error: {\n      code: 1,\n      message: 'Internal server error',\n    },\n    success: {\n      code: 0,\n      message: 'success',\n    },\n    validation: {\n      code: 10,\n      message: '参数错误',\n    },\n    needvip: {\n      code: 88,\n      message: '需要VIP',\n    },\n    needsuite: {\n      code: 89,\n      message: '需要购买或升级套餐',\n    },\n    loginError: {\n      code: 2,\n      message: '登录失败',\n    },\n    codeError: {\n      code: 3,\n      message: '验证码错误',\n    },\n    auth: {\n      code: 401,\n      message: '您还未登录或token已过期',\n    },\n    permission: {\n      code: 402,\n      message: '您没有权限',\n    },\n    param: {\n      code: 400,\n      message: '参数错误',\n    },\n    notFound: {\n      code: 404,\n      message: '页面/文件/资源不存在',\n    },\n\n    preview: {\n      code: 10001,\n      message: '对不起，预览环境不允许修改此数据',\n    },\n    siteOff:{\n      code: 10010,\n      message: '站点已关闭',\n    },\n    need2fa:{\n      code: 10020,\n      message: '需要2FA认证',\n    },\n    openKeyError: {\n      code: 20000,\n      message: 'ApiToken错误',\n    },\n    openKeySignError: {\n      code: 20001,\n      message: 'ApiToken签名错误',\n    },\n    openKeyExpiresError: {\n      code: 20002,\n      message: 'ApiToken时间戳错误',\n    },\n    openKeySignTypeError: {\n      code: 20003,\n      message: 'ApiToken签名类型不支持',\n    },\n    openParamError: {\n      code: 20010,\n      message: '请求参数错误',\n    },\n    openCertNotFound: {\n      code: 20011,\n      message: '证书不存在',\n    },\n    openCertNotReady: {\n      code: 20012,\n      message: '证书还未生成',\n    },\n    openCertApplying: {\n      code: 20013,\n      message: '证书正在申请中，请稍后重新获取',\n    },\n    openDomainNoVerifier:{\n      code: 20014,\n      message: '域名校验方式未配置',\n    },\n    openEmailNotFound: {\n      code: 20021,\n      message: '用户邮箱还未配置',\n    },\n  },\n};\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/crud-controller.ts",
    "content": "import { ALL, Body, Post, Query } from '@midwayjs/core';\nimport { BaseController } from './base-controller.js';\n\nexport abstract class CrudController<T> extends BaseController {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  abstract getService<T>();\n\n  @Post('/page')\n  async page(@Body(ALL) body: any) {\n    const pageRet = await this.getService().page({\n      query: body.query ?? {},\n      page: body.page,\n      sort: body.sort,\n      bq: body.bq,\n    });\n    return this.ok(pageRet);\n  }\n\n  @Post('/list')\n  async list(@Body(ALL) body: any) {\n    const listRet = await this.getService().list({\n      query: body.query ?? {},\n      order: body.order,\n    });\n    return this.ok(listRet);\n  }\n\n  @Post('/add')\n  async add(@Body(ALL) bean: any) {\n    delete bean.id;\n    const id = await this.getService().add(bean);\n    return this.ok(id);\n  }\n\n  @Post('/info')\n  async info(@Query('id') id: number) {\n    const bean = await this.getService().info(id);\n    return this.ok(bean);\n  }\n\n  @Post('/update')\n  async update(@Body(ALL) bean: any) {\n    await this.getService().update(bean);\n    return this.ok(null);\n  }\n\n  @Post('/delete')\n  async delete(@Query('id') id: number) {\n    await this.getService().delete([id]);\n    return this.ok(null);\n  }\n\n  @Post('/deleteByIds')\n  async deleteByIds(@Body('ids') ids: number[]) {\n    await this.getService().delete(ids);\n    return this.ok(null);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/enum-item.ts",
    "content": "export class EnumItem {\n  value: string;\n  label: string;\n  color: string;\n\n  constructor(value, label, color) {\n    this.value = value;\n    this.label = label;\n    this.color = color;\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/exception/auth-exception.ts",
    "content": "import { Constants } from '../constants.js';\nimport { BaseException } from './base-exception.js';\nimport { TextException } from \"./common-exception.js\";\n/**\n * 授权异常\n */\nexport class AuthException extends BaseException {\n  constructor(message?:string) {\n    super('AuthException', Constants.res.auth.code, message ? message : Constants.res.auth.message);\n  }\n}\n\n\nexport class Need2FAException extends TextException {\n  constructor(message:string,data:any) {\n    super('Need2FAException', Constants.res.need2fa.code, message ? message : Constants.res.need2fa.message,data);\n  }\n}\n\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/exception/base-exception.ts",
    "content": "/**\n * 异常基类\n */\nexport class BaseException extends Error {\n  code: number;\n  data?:any\n  constructor(name, code, message,data?:any) {\n    super(message);\n    this.name = name;\n    this.code = code;\n    this.data = data;\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/exception/code-error-exception.ts",
    "content": "import { Constants } from '../constants.js';\nimport { BaseException } from './base-exception.js';\n/**\n * 验证码异常\n */\nexport class CodeErrorException extends BaseException {\n  constructor(message) {\n    super('CodeErrorException', Constants.res.codeError.code, message ? message : Constants.res.codeError.message);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/exception/common-exception.ts",
    "content": "import { Constants } from \"../constants.js\";\nimport { BaseException } from \"./base-exception.js\";\n\n/**\n * 通用异常\n */\nexport class CommonException extends BaseException {\n  constructor(message) {\n    super(\"CommonException\", Constants.res.error.code, message ? message : Constants.res.error.message);\n  }\n}\n\nexport class CodeException extends BaseException {\n  constructor(res: { code: number; message: string; data?: any }) {\n    super(\"CodeException\", res.code, res.message, res.data);\n  }\n}\n\nexport class TextException extends BaseException {\n  constructor(name, code, message, data?) {\n    super(name, code, message, data);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/exception/index.ts",
    "content": "export * from './auth-exception.js';\nexport * from './base-exception.js';\nexport * from './permission-exception.js';\nexport * from './preview-exception.js';\nexport * from './validation-exception.js';\nexport * from './vip-exception.js';\nexport * from './common-exception.js';\nexport * from './not-found-exception.js';\nexport * from './param-exception.js';\nexport * from './site-off-exception.js';\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/exception/login-error-exception.ts",
    "content": "import { Constants } from '../constants.js';\nimport { BaseException } from './base-exception.js';\n/**\n * 通用异常\n */\nexport class LoginErrorException extends BaseException {\n  leftCount: number;\n  constructor(message, leftCount: number) {\n    super('LoginErrorException', Constants.res.loginError.code, message ? message : Constants.res.loginError.message);\n    this.leftCount = leftCount;\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/exception/not-found-exception.ts",
    "content": "import { Constants } from '../constants.js';\nimport { BaseException } from './base-exception.js';\n/**\n * 资源不存在\n */\nexport class NotFoundException extends BaseException {\n  constructor(message) {\n    super('NotFoundException', Constants.res.notFound.code, message ? message : Constants.res.notFound.message);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/exception/param-exception.ts",
    "content": "import { Constants } from '../constants.js';\nimport { BaseException } from './base-exception.js';\n/**\n * 参数异常\n */\nexport class ParamException extends BaseException {\n  constructor(message) {\n    super('ParamException', Constants.res.param.code, message ? message : Constants.res.param.message);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/exception/permission-exception.ts",
    "content": "import { Constants } from '../constants.js';\nimport { BaseException } from './base-exception.js';\n/**\n * 授权异常\n */\nexport class PermissionException extends BaseException {\n  constructor(message?: string) {\n    super('PermissionException', Constants.res.permission.code, message ? message : Constants.res.permission.message);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/exception/preview-exception.ts",
    "content": "import { Constants } from '../constants.js';\nimport { BaseException } from './base-exception.js';\n/**\n * 预览模式\n */\nexport class PreviewException extends BaseException {\n  constructor(message) {\n    super(\n      'PreviewException',\n      Constants.res.preview.code,\n      message ? message : Constants.res.preview.message\n    );\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/exception/site-off-exception.ts",
    "content": "import { Constants } from '../constants.js';\nimport { BaseException } from './base-exception.js';\n/**\n */\nexport class SiteOffException extends BaseException {\n  constructor(message) {\n    super('SiteOffException', Constants.res.siteOff.code, message ? message : Constants.res.siteOff.message);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/exception/validation-exception.ts",
    "content": "import { Constants } from '../constants.js';\nimport { BaseException } from './base-exception.js';\n/**\n * 校验异常\n */\nexport class ValidateException extends BaseException {\n  constructor(message) {\n    super('ValidateException', Constants.res.validation.code, message ? message : Constants.res.validation.message);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/exception/vip-exception.ts",
    "content": "import { Constants } from '../constants.js';\nimport { BaseException } from './base-exception.js';\n/**\n * 需要vip异常\n */\nexport class NeedVIPException extends BaseException {\n  constructor(message) {\n    super('NeedVIPException', Constants.res.needvip.code, message ? message : Constants.res.needvip.message);\n  }\n}\n\nexport class NeedSuiteException extends BaseException {\n  constructor(message) {\n    super('NeedSuiteException', Constants.res.needsuite.code, message ? message : Constants.res.needsuite.message);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/index.ts",
    "content": "export * from './base-controller.js';\nexport * from './constants.js';\nexport * from './crud-controller.js';\nexport * from './enum-item.js';\nexport * from './exception/index.js';\nexport * from './result.js';\nexport * from './base-service.js';\n"
  },
  {
    "path": "packages/libs/lib-server/src/basic/result.ts",
    "content": "export class Result<T> {\n  code: number;\n  msg: string;\n  data: T;\n\n  constructor(code, msg, data?) {\n    this.code = code;\n    this.msg = msg;\n    this.data = data;\n  }\n\n  static error(code = 1, msg, data?: any) {\n    return new Result(code, msg, data);\n  }\n\n  static success(msg, data?) {\n    return new Result(0, msg, data);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/configuration.ts",
    "content": "import type { IMidwayContainer } from '@midwayjs/core';\nimport { Configuration } from '@midwayjs/core';\nimport { logger } from '@certd/basic';\n@Configuration({\n  namespace: 'lib-server',\n})\nexport class LibServerConfiguration {\n  async onReady(container: IMidwayContainer) {\n    logger.info('lib start...');\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/index.ts",
    "content": "import { SysSettingsEntity } from './system/index.js';\nimport { AccessEntity } from './user/access/entity/access.js';\nexport * from './basic/index.js';\nexport * from './system/index.js';\nexport * from './user/index.js';\nexport { LibServerConfiguration as Configuration } from './configuration.js';\n\nexport const libServerEntities = [SysSettingsEntity, AccessEntity];\n"
  },
  {
    "path": "packages/libs/lib-server/src/system/basic/index.ts",
    "content": "export * from './service/plus-service.js';\nexport * from './service/file-service.js';\nexport * from './service/encryptor.js';\n"
  },
  {
    "path": "packages/libs/lib-server/src/system/basic/service/encryptor.ts",
    "content": "import crypto from 'crypto';\n\nexport class Encryptor {\n  secretKey: Buffer;\n  constructor(encryptSecret: string, encoding: BufferEncoding = 'base64') {\n    this.secretKey = Buffer.from(encryptSecret, encoding);\n  }\n  // 加密函数\n  encrypt(text: string) {\n    const iv = crypto.randomBytes(16); // 初始化向量\n    // const secretKey = crypto.randomBytes(32);\n    // const key = Buffer.from(secretKey);\n    const cipher = crypto.createCipheriv('aes-256-cbc', this.secretKey, iv);\n    let encrypted = cipher.update(text);\n    encrypted = Buffer.concat([encrypted, cipher.final()]);\n    return iv.toString('hex') + ':' + encrypted.toString('hex');\n  }\n\n  // 解密函数\n  decrypt(encryptedText: string) {\n    const textParts = encryptedText.split(':');\n    const iv = Buffer.from(textParts.shift(), 'hex');\n    const encrypted = Buffer.from(textParts.join(':'), 'hex');\n    const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(this.secretKey), iv);\n    let decrypted = decipher.update(encrypted);\n    decrypted = Buffer.concat([decrypted, decipher.final()]);\n    return decrypted.toString();\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/system/basic/service/file-service.ts",
    "content": "import { Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport dayjs from 'dayjs';\nimport path from 'path';\nimport fs from 'fs';\nimport { cache, logger, utils } from '@certd/basic';\nimport { NotFoundException, ParamException, PermissionException } from '../../../basic/index.js';\n\nexport type UploadFileItem = {\n  filename: string;\n  tmpFilePath: string;\n};\nconst uploadRootDir = './data/upload';\nexport const uploadTmpFileCacheKey = 'tmpfile_key_';\n/**\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class FileService {\n  async saveFile(userId: number, tmpCacheKey: any, permission: 'public' | 'private') {\n    if (tmpCacheKey.startsWith(`/${permission}`)) {\n      //已经保存过，不需要再次保存\n      return tmpCacheKey;\n    }\n    let fileName = '';\n    let tmpFilePath = tmpCacheKey;\n    if (uploadTmpFileCacheKey && tmpCacheKey.startsWith(uploadTmpFileCacheKey)) {\n      const tmpFile: UploadFileItem = cache.get(tmpCacheKey);\n      if (!tmpFile) {\n        throw new ParamException('文件已过期，请重新上传');\n      }\n      tmpFilePath = tmpFile.tmpFilePath;\n      fileName = tmpFile.filename || path.basename(tmpFilePath);\n    }\n    if (!tmpFilePath || !fs.existsSync(tmpFilePath)) {\n      throw new Error('文件不存在,请重新上传');\n    }\n    const date = dayjs().format('YYYY_MM_DD');\n    const random = Math.random().toString(36).substring(7);\n    const userIdMd5 = Buffer.from(Buffer.from(userId + '').toString('base64')).toString('hex');\n    const key = `/${permission}/${userIdMd5}/${date}/${random}_${fileName}`;\n    let savePath = path.join(uploadRootDir, key);\n    savePath = path.resolve(savePath);\n    const parentDir = path.dirname(savePath);\n    if (!fs.existsSync(parentDir)) {\n      fs.mkdirSync(parentDir, { recursive: true });\n    }\n    // eslint-disable-next-line node/no-unsupported-features/node-builtins\n    const copyFile = utils.promises.promisify(fs.copyFile);\n    await copyFile(tmpFilePath, savePath);\n    try {\n      fs.unlinkSync(tmpFilePath);\n    } catch (e) {\n      logger.error(e);\n    }\n\n    return key;\n  }\n\n  getFile(key: string, userId?: number) {\n    if (!key) {\n      throw new ParamException('参数错误');\n    }\n    if (key.indexOf('..') >= 0) {\n      //安全性判断\n      throw new ParamException('参数错误');\n    }\n    if (!key.startsWith('/')) {\n      throw new ParamException('参数错误');\n    }\n    const keyArr = key.split('/');\n    const permission = keyArr[1];\n    const userIdMd5 = keyArr[2];\n    if (permission !== 'public') {\n      //非公开文件需要验证用户\n      const userIdStr = Buffer.from(Buffer.from(userIdMd5, 'hex').toString('base64')).toString();\n      const userIdInt: number = parseInt(userIdStr, 10);\n      if (userId == null || userIdInt !== userId) {\n        throw new PermissionException('无访问权限');\n      }\n    }\n    const filePath = path.join(uploadRootDir, key);\n    if (!fs.existsSync(filePath)) {\n      throw new NotFoundException('文件不存在');\n    }\n    return filePath;\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/system/basic/service/plus-service.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { AppKey, PlusRequestService } from '@certd/plus-core';\nimport { cache, http, HttpRequestConfig, logger } from '@certd/basic';\nimport { SysInstallInfo, SysLicenseInfo, SysSettingsService } from '../../settings/index.js';\nimport { merge } from 'lodash-es';\n\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class PlusService {\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  plusRequestService: PlusRequestService;\n\n  async getPlusRequestService() {\n    if (this.plusRequestService) {\n      return this.plusRequestService;\n    }\n    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);\n\n    const subjectId = installInfo.siteId;\n    const bindUrl = installInfo.bindUrl;\n    const installTime = installInfo.installTime;\n    const saveLicense = async (license: string) => {\n      let licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo);\n      if (!licenseInfo) {\n        licenseInfo = new SysLicenseInfo();\n      }\n      licenseInfo.license = license;\n      await this.sysSettingsService.saveSetting(licenseInfo);\n    };\n\n    return new PlusRequestService({ subjectId, bindUrl, installTime, saveLicense });\n  }\n\n  async getSubjectId() {\n    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);\n    return installInfo.siteId;\n  }\n\n  async active(code: string, inviteCode?: string) {\n    const plusRequestService = await this.getPlusRequestService();\n    return await plusRequestService.active(code, inviteCode);\n  }\n\n  async updateLicense(license: string) {\n    const plusRequestService = await this.getPlusRequestService();\n    await plusRequestService.updateLicense({ license });\n  }\n  async verify() {\n    const plusRequestService = await this.getPlusRequestService();\n    const licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo);\n    await plusRequestService.verify({ license: licenseInfo.license });\n  }\n\n  async bindUrl(url: string) {\n    const plusRequestService = await this.getPlusRequestService();\n    const res = await plusRequestService.bindUrl(url);\n    this.plusRequestService = null;\n    return res;\n  }\n\n  async register() {\n    const plusRequestService = await this.getPlusRequestService();\n    const licenseInfo: SysLicenseInfo = await this.sysSettingsService.getSetting(SysLicenseInfo);\n    if (!licenseInfo.license) {\n      await plusRequestService.register();\n      logger.info('站点注册成功');\n      this.plusRequestService = null;\n    }\n  }\n\n  async userPreBind(userId: number) {\n    const plusRequestService = await this.getPlusRequestService();\n    await plusRequestService.requestWithoutSign({\n      url: '/activation/subject/preBind',\n      method: 'POST',\n      data: {\n        userId,\n        appKey: AppKey,\n        subjectId: plusRequestService.getSubjectId(),\n      },\n    });\n  }\n\n  async sendEmail(email: any) {\n    const plusRequestService = await this.getPlusRequestService();\n    await plusRequestService.request({\n      url: '/activation/emailSend',\n      data: {\n        subject: email.subject,\n        text: email.content,\n        to: email.receivers,\n      },\n    });\n  }\n\n  async getAccessToken() {\n    const cacheKey = 'certd:subject:access_token';\n    const token = cache.get(cacheKey);\n    if (token) {\n      return token;\n    }\n    const plusRequestService = await this.getPlusRequestService();\n    await this.register();\n    const res = await plusRequestService.getAccessToken();\n    const ttl = res.expiresIn * 1000 - Date.now().valueOf();\n    cache.set(cacheKey, res.accessToken, {\n      ttl,\n    });\n    return res.accessToken;\n  }\n\n  async getVipTrial() {\n    await this.register();\n    const plusRequestService = await this.getPlusRequestService();\n    const res = await plusRequestService.request({\n      url: '/activation/subject/vip/trialGet',\n      method: 'POST',\n    });\n    if (res.license) {\n      await this.updateLicense(res.license);\n      return {\n        duration: res.duration,\n      };\n    } else {\n      throw new Error('您已经领取过VIP试用了');\n    }\n  }\n\n  async requestWithToken(config: HttpRequestConfig) {\n    const plusRequestService = await this.getPlusRequestService();\n    const token = await this.getAccessToken();\n    merge(config, {\n      baseURL: plusRequestService.getBaseURL(),\n      method: 'post',\n      headers: {\n        Authorization: `Berear ${token}`,\n      },\n    });\n    const res = await http.request(config);\n    if (res.code !== 0) {\n      throw new Error(res.message);\n    }\n    return res.data;\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/system/index.ts",
    "content": "export * from './settings/index.js';\nexport * from './basic/index.js';\n"
  },
  {
    "path": "packages/libs/lib-server/src/system/settings/entity/sys-settings.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n/**\n */\n@Entity('sys_settings')\nexport class SysSettingsEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n  @Column({ comment: 'key', length: 100 })\n  key: string;\n  @Column({ comment: '名称', length: 100 })\n  title: string;\n\n  @Column({ name: 'setting', comment: '设置', length: 1024, nullable: true })\n  setting: string;\n\n  // public 公开读，私有写， private 私有读，私有写\n  @Column({ name: 'access', comment: '访问权限' })\n  access: string;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/system/settings/index.ts",
    "content": "export * from './service/sys-settings-service.js';\nexport * from './service/models.js';\nexport * from './entity/sys-settings.js';\n"
  },
  {
    "path": "packages/libs/lib-server/src/system/settings/service/models.ts",
    "content": "import { cloneDeep } from 'lodash-es';\n\nexport class BaseSettings {\n  static __key__: string;\n  static __title__: string;\n  static __access__ = 'private';\n\n  static getCacheKey() {\n    return 'settings.' + this.__key__;\n  }\n}\n\nexport class SysPublicSettings extends BaseSettings {\n  static __key__ = 'sys.public';\n  static __title__ = '系统公共设置';\n  static __access__ = 'public';\n\n  registerEnabled = false;\n  userValidTimeEnabled?:boolean = false;\n  passwordLoginEnabled = true;\n  usernameRegisterEnabled = true;\n  mobileRegisterEnabled = false;\n  smsLoginEnabled = false;\n  emailRegisterEnabled = false;\n\n  limitUserPipelineCount = 0;\n  managerOtherUserPipeline = false;\n  icpNo?: string;\n  mpsNo?: string;\n  robots?: boolean = true;\n  aiChatEnabled = true;\n}\n\nexport class SysPrivateSettings extends BaseSettings {\n  static __title__ = '系统私有设置';\n  static __access__ = 'private';\n  static __key__ = 'sys.private';\n  jwtKey?: string;\n  encryptSecret?: string;\n\n  httpsProxy? = '';\n  httpProxy? = '';\n  dnsResultOrder? = '';\n  commonCnameEnabled?: boolean = true;\n\n  sms?: {\n    type?: string;\n    config?: any;\n  } = {\n    type: 'aliyun',\n    config: {},\n  };\n\n  removeSecret() {\n    const clone = cloneDeep(this);\n    delete clone.jwtKey;\n    delete clone.encryptSecret;\n    return clone;\n  }\n}\n\nexport class SysInstallInfo extends BaseSettings {\n  static __title__ = '系统安装信息';\n  static __key__ = 'sys.install';\n  static __access__ = 'private';\n  installTime?: number;\n  siteId?: string;\n  bindUserId?: number;\n  bindUrl?: string;\n  accountServerBaseUrl?: string;\n  appKey?: string;\n}\n\nexport class SysLicenseInfo extends BaseSettings {\n  static __title__ = '授权许可信息';\n  static __key__ = 'sys.license';\n  static __access__ = 'private';\n  license?: string;\n}\n\nexport class SysEmailConf extends BaseSettings {\n  static __title__ = '邮箱配置';\n  static __key__ = 'sys.email';\n  static __access__ = 'private';\n\n  host: string;\n  port: number;\n  auth: {\n    user: string;\n    pass: string;\n  };\n  secure: boolean; // use TLS\n  tls: {\n    // do not fail on invalid certs\n    rejectUnauthorized: boolean;\n  };\n  sender: string;\n  usePlus?: boolean;\n}\n\nexport class SysSiteInfo extends BaseSettings {\n  static __title__ = '站点信息';\n  static __key__ = 'sys.site';\n  static __access__ = 'public';\n  title?: string;\n  slogan?: string;\n  logo?: string;\n  loginLogo?: string;\n}\n\nexport class SysSecretBackup extends BaseSettings {\n  static __title__ = '密钥信息备份';\n  static __key__ = 'sys.secret.backup';\n  static __access__ = 'private';\n  siteId?: string;\n  encryptSecret?: string;\n}\n\n/**\n * 不要修改\n */\nexport class SysSecret extends BaseSettings {\n  static __title__ = '密钥信息';\n  static __key__ = 'sys.secret';\n  static __access__ = 'private';\n  siteId?: string;\n  encryptSecret?: string;\n}\n\nexport class SysSiteEnv {\n  agent?: {\n    enabled?: boolean;\n    contactText?: string;\n    contactLink?: string;\n  };\n}\n\nexport type MenuItem = {\n  id: string;\n  title: string;\n  icon: string;\n  link: string;\n  auth: boolean;\n  permission?: string;\n  children?: MenuItem[];\n};\nexport class SysHeaderMenus extends BaseSettings {\n  static __title__ = '顶部菜单';\n  static __key__ = 'sys.header.menus';\n  static __access__ = 'public';\n\n  menus: MenuItem[];\n}\n\nexport type PaymentItem = {\n  enabled: boolean;\n  accessId?: number;\n};\n\nexport class SysPaymentSetting extends BaseSettings {\n  static __title__ = '支付设置';\n  static __key__ = 'sys.payment';\n  static __access__ = 'private';\n\n  yizhifu?: PaymentItem = { enabled: false };\n\n  alipay?: PaymentItem = { enabled: false };\n\n  wxpay?: PaymentItem = { enabled: false };\n}\n\nexport class SysSuiteSetting extends BaseSettings {\n  static __title__ = '套餐设置';\n  static __key__ = 'sys.suite';\n  static __access__ = 'private';\n\n  enabled:boolean = false;\n\n  registerGift?: {\n    productId: number;\n    duration: number;\n  };\n\n  intro?: string;\n}\n\n\nexport type SiteHidden = {\n  enabled: boolean;\n  openPath?: string;\n  //md5 hash 两次后保存\n  openPassword?: string;\n  autoHiddenTimes?: number;\n  hiddenOpenApi?: boolean\n};\nexport class SysSafeSetting extends BaseSettings {\n  static __title__ = '站点安全设置';\n  static __key__ = 'sys.safe';\n  static __access__ = 'private';\n\n  // 站点隐藏\n  hidden:SiteHidden = {\n    enabled: false,\n    hiddenOpenApi:false,\n    autoHiddenTimes: 5,\n  };\n}\n\n\n"
  },
  {
    "path": "packages/libs/lib-server/src/system/settings/service/sys-settings-service.ts",
    "content": "import { Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { InjectEntityModel } from '@midwayjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { SysSettingsEntity } from '../entity/sys-settings.js';\nimport { BaseSettings, SysInstallInfo, SysPrivateSettings, SysPublicSettings, SysSecret, SysSecretBackup } from './models.js';\n\nimport { BaseService } from '../../../basic/index.js';\nimport { cache, logger, setGlobalProxy } from '@certd/basic';\nimport * as dns from 'node:dns';\nimport {mergeUtils} from \"@certd/basic\";\nconst {merge} = mergeUtils;\n/**\n * 设置\n */\n@Provide()\n@Scope(ScopeEnum.Singleton)\nexport class SysSettingsService extends BaseService<SysSettingsEntity> {\n  @InjectEntityModel(SysSettingsEntity)\n  repository: Repository<SysSettingsEntity>;\n\n  getRepository() {\n    return this.repository;\n  }\n  async getById(id: any): Promise<SysSettingsEntity | null> {\n    const entity = await this.info(id);\n    if (!entity) {\n      return null;\n    }\n    const setting = JSON.parse(entity.setting);\n    return {\n      id: entity.id,\n      ...setting,\n    };\n  }\n\n  async getByKey(key: string): Promise<SysSettingsEntity | null> {\n    if (!key) {\n      return null;\n    }\n    return await this.repository.findOne({\n      where: {\n        key,\n      },\n    });\n  }\n\n  async getSettingByKey(key: string): Promise<any | null> {\n    const entity = await this.getByKey(key);\n    if (!entity) {\n      return null;\n    }\n    return JSON.parse(entity.setting);\n  }\n\n  async save(bean: SysSettingsEntity) {\n    const entity = await this.repository.findOne({\n      where: {\n        key: bean.key,\n      },\n    });\n    if (entity) {\n      entity.setting = bean.setting;\n      await this.repository.save(entity);\n    } else {\n      bean.title = bean.key;\n      await this.repository.save(bean);\n    }\n  }\n\n  async getSetting<T>(type: any): Promise<T> {\n    const key = type.__key__;\n    const cacheKey = type.getCacheKey();\n    const settings: T = cache.get(cacheKey);\n    if (settings) {\n      return settings;\n    }\n    let newSetting: T = new type();\n    const savedSettings = await this.getSettingByKey(key);\n    newSetting = merge(newSetting, savedSettings);\n    await this.saveSetting(newSetting);\n    cache.set(cacheKey, newSetting);\n    return newSetting;\n  }\n\n  async saveSetting<T extends BaseSettings>(bean: T) {\n    const type: any = bean.constructor;\n    const key = type.__key__;\n    const cacheKey = type.getCacheKey();\n\n    const entity = await this.getByKey(key);\n    if (entity) {\n      entity.setting = JSON.stringify(bean);\n      entity.access = type.__access__;\n\n      if (key === SysSecretBackup.__key__) {\n        //备份密钥不允许更新\n        return;\n      }\n\n      await this.repository.save(entity);\n    } else {\n      const newEntity = new SysSettingsEntity();\n      newEntity.key = key;\n      newEntity.title = type.__title__;\n      newEntity.setting = JSON.stringify(bean);\n      newEntity.access = type.__access__;\n      await this.repository.save(newEntity);\n    }\n\n    cache.set(cacheKey, bean);\n  }\n\n  async getPublicSettings(): Promise<SysPublicSettings> {\n    return await this.getSetting(SysPublicSettings);\n  }\n\n  async savePublicSettings(bean: SysPublicSettings) {\n    await this.saveSetting(bean);\n  }\n\n  async getPrivateSettings(): Promise<SysPrivateSettings> {\n    return await this.getSetting(SysPrivateSettings);\n  }\n\n  async savePrivateSettings(bean: SysPrivateSettings) {\n    await this.saveSetting(bean);\n\n    //让设置生效\n    await this.reloadPrivateSettings();\n  }\n\n  async reloadPrivateSettings() {\n    const bean = await this.getPrivateSettings();\n    const opts = {\n      httpProxy: bean.httpProxy,\n      httpsProxy: bean.httpsProxy,\n    };\n    setGlobalProxy(opts);\n\n    if (bean.dnsResultOrder) {\n      dns.setDefaultResultOrder(bean.dnsResultOrder as any);\n    }\n  }\n\n  async updateByKey(key: string, setting: any) {\n    const entity = await this.getByKey(key);\n    if (entity) {\n      entity.setting = JSON.stringify(setting);\n      await this.repository.save(entity);\n    } else {\n      throw new Error('该设置不存在');\n    }\n    cache.delete(`settings.${key}`);\n  }\n\n  async backupSecret() {\n    const settings = await this.getSettingByKey(SysSecretBackup.__key__);\n    const privateSettings = await this.getPrivateSettings();\n    const installInfo = await this.getSetting<SysInstallInfo>(SysInstallInfo);\n    if (settings == null) {\n      const backup = new SysSecretBackup();\n      if (installInfo.siteId == null || privateSettings.encryptSecret == null) {\n        logger.error('备份密钥失败，siteId或encryptSecret为空');\n        return;\n      }\n      backup.siteId = installInfo.siteId;\n      backup.encryptSecret = privateSettings.encryptSecret;\n      await this.saveSetting(backup);\n      logger.info('备份密钥成功');\n    } else {\n      //校验是否有变化\n      if (settings.siteId !== installInfo.siteId) {\n        throw new Error(`siteId与备份不一致，可能是数据异常，请检查：backup=${settings.siteId}, current=${installInfo.siteId}`);\n      }\n      if (settings.encryptSecret !== privateSettings.encryptSecret) {\n        throw new Error('encryptSecret与备份不一致，可能是数据异常，请检查');\n      }\n    }\n  }\n  async getSecret() {\n    const sysSecret = await this.getSetting<SysSecret>(SysSecret);\n    if (sysSecret.encryptSecret) {\n      return sysSecret;\n    }\n    //从备份中读取\n    const settings = await this.getSettingByKey(SysSecretBackup.__key__);\n    if (settings == null || !settings.encryptSecret) {\n      throw new Error('密钥备份不存在');\n    }\n    sysSecret.siteId = settings.siteId;\n    sysSecret.encryptSecret = settings.encryptSecret;\n    await this.saveSetting(sysSecret);\n    logger.info('密钥恢复成功');\n    return sysSecret;\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/user/access/entity/access.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n/**\n * 授权配置\n */\n@Entity('cd_access')\nexport class AccessEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n  @Column({ name: 'user_id', comment: '用户id' })\n  userId: number;\n  @Column({ comment: '名称', length: 100 })\n  name: string;\n\n  @Column({ comment: '类型', length: 100 })\n  type: string;\n\n  @Column({ name: 'setting', comment: '设置', length: 10240, nullable: true })\n  setting: string;\n\n  @Column({ name: 'encrypt_setting', comment: '已加密设置', length: 10240, nullable: true })\n  encryptSetting: string;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/user/access/index.ts",
    "content": "export * from './entity/access.js';\nexport * from './service/access-service.js';\nexport * from './service/access-sys-getter.js';\nexport * from './service/access-getter.js';\nexport * from './service/encrypt-service.js';\n"
  },
  {
    "path": "packages/libs/lib-server/src/user/access/service/access-getter.ts",
    "content": "import { IAccessService } from '@certd/pipeline';\n\nexport class AccessGetter implements IAccessService {\n  userId: number;\n  getter: <T>(id: any, userId?: number) => Promise<T>;\n  constructor(userId: number, getter: (id: any, userId: number) => Promise<any>) {\n    this.userId = userId;\n    this.getter = getter;\n  }\n\n  async getById<T = any>(id: any) {\n    return await this.getter<T>(id, this.userId);\n  }\n\n  async getCommonById<T = any>(id: any) {\n    return await this.getter<T>(id, 0);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/user/access/service/access-service.ts",
    "content": "import {Inject, Provide, Scope, ScopeEnum} from '@midwayjs/core';\nimport {InjectEntityModel} from '@midwayjs/typeorm';\nimport { In, Repository } from \"typeorm\";\nimport {AccessGetter, BaseService, PageReq, PermissionException, ValidateException} from '../../../index.js';\nimport {AccessEntity} from '../entity/access.js';\nimport {AccessDefine, accessRegistry, newAccess} from '@certd/pipeline';\nimport {EncryptService} from './encrypt-service.js';\n\n/**\n * 授权\n */\n@Provide()\n@Scope(ScopeEnum.Request, {allowDowngrade: true})\nexport class AccessService extends BaseService<AccessEntity> {\n  @InjectEntityModel(AccessEntity)\n  repository: Repository<AccessEntity>;\n\n  @Inject()\n  encryptService: EncryptService;\n\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async page(pageReq: PageReq<AccessEntity>) {\n    const res = await super.page(pageReq);\n    res.records = res.records.map(item => {\n      delete item.encryptSetting;\n      return item;\n    });\n    return res;\n  }\n\n  async add(param) {\n    this.encryptSetting(param, null);\n    return await super.add(param);\n  }\n\n  encryptSetting(param: any, oldSettingEntity?: AccessEntity) {\n    const accessType = param.type;\n    const accessDefine: AccessDefine = accessRegistry.getDefine(accessType);\n    if (!accessDefine) {\n      throw new ValidateException(`授权类型${accessType}不存在`);\n    }\n    const setting = param.setting;\n    if (!setting) {\n      return;\n    }\n    const json = JSON.parse(setting);\n    let oldSetting = {};\n    let encryptSetting = {};\n    const firstEncrypt = !oldSettingEntity || !oldSettingEntity.encryptSetting || oldSettingEntity.encryptSetting === '{}';\n    if (oldSettingEntity) {\n      oldSetting = JSON.parse(oldSettingEntity.setting || '{}');\n      encryptSetting = JSON.parse(oldSettingEntity.encryptSetting || '{}');\n    }\n    for (const key in json) {\n      //加密\n      let value = json[key];\n      if (value && typeof value === 'string') {\n        //去除前后空格\n        value = value.trim();\n        json[key] = value;\n      }\n      const accessInputDefine = accessDefine.input[key];\n      if (!accessInputDefine) {\n        continue;\n      }\n      if (!accessInputDefine.encrypt || !value || typeof value !== 'string') {\n        //定义无需加密、value为空、不是字符串 这些不需要加密\n        encryptSetting[key] = {\n          value: value,\n          encrypt: false,\n        };\n        continue;\n      }\n\n      if (firstEncrypt || oldSetting[key] !== value) {\n        //星号保护\n        const length = value.length;\n        const subIndex = Math.min(2, length);\n        let starLength = length - subIndex * 2;\n        starLength = Math.max(2, starLength);\n        const starString = '*'.repeat(starLength);\n        json[key] = value.substring(0, subIndex) + starString + value.substring(value.length - subIndex);\n        encryptSetting[key] = {\n          value: this.encryptService.encrypt(value),\n          encrypt: true,\n        };\n      }\n      //未改变情况下，不做修改\n    }\n    param.encryptSetting = JSON.stringify(encryptSetting);\n    param.setting = JSON.stringify(json);\n  }\n\n  /**\n   * 修改\n   * @param param 数据\n   */\n  async update(param) {\n    const oldEntity = await this.info(param.id);\n    if (oldEntity == null) {\n      throw new ValidateException('该授权配置不存在,请确认是否已被删除');\n    }\n    this.encryptSetting(param, oldEntity);\n    return await super.update(param);\n  }\n\n  async getSimpleInfo(id: number) {\n    const entity = await this.info(id);\n    if (entity == null) {\n      throw new ValidateException('该授权配置不存在,请确认是否已被删除');\n    }\n    return {\n      id: entity.id,\n      name: entity.name,\n      userId: entity.userId,\n    };\n  }\n\n  async getAccessById(id: any, checkUserId: boolean, userId?: number): Promise<any> {\n    const entity = await this.info(id);\n    if (entity == null) {\n      throw new Error(`该授权配置不存在,请确认是否已被删除:id=${id}`);\n    }\n    if (checkUserId) {\n      if (userId == null) {\n        throw new ValidateException('userId不能为空');\n      }\n      if (userId !== entity.userId) {\n        throw new PermissionException('您对该Access授权无访问权限');\n      }\n    }\n\n    // const access = accessRegistry.get(entity.type);\n    const setting = this.decryptAccessEntity(entity);\n    const input = {\n      id: entity.id,\n      ...setting,\n    };\n    const accessGetter = new AccessGetter(userId, this.getById.bind(this));\n    return await newAccess(entity.type, input,accessGetter);\n  }\n\n  async getById(id: any, userId: number): Promise<any> {\n    return await this.getAccessById(id, true, userId);\n  }\n\n  decryptAccessEntity(entity: AccessEntity): any {\n    let setting = {};\n    if (entity.encryptSetting && entity.encryptSetting !== '{}') {\n      setting = JSON.parse(entity.encryptSetting);\n      for (const key in setting) {\n        //解密\n        const encryptValue = setting[key];\n        let value = encryptValue.value;\n        if (encryptValue.encrypt) {\n          value = this.encryptService.decrypt(value);\n        }\n        setting[key] = value;\n      }\n    } else if (entity.setting) {\n      setting = JSON.parse(entity.setting);\n    }\n    return setting;\n  }\n\n  getDefineList() {\n    return accessRegistry.getDefineList();\n  }\n\n  getDefineByType(type: string) {\n    return accessRegistry.getDefine(type);\n  }\n\n\n  async getSimpleByIds(ids: number[], userId: any) {\n    if (ids.length === 0) {\n      return [];\n    }\n    if (!userId) {\n      return [];\n    }\n    return await this.repository.find({\n      where: {\n        id: In(ids),\n        userId,\n      },\n      select: {\n        id: true,\n        name: true,\n        type: true,\n        userId:true\n      },\n    });\n\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/user/access/service/access-sys-getter.ts",
    "content": "import { IAccessService } from '@certd/pipeline';\nimport { AccessService } from './access-service.js';\n\nexport class AccessSysGetter implements IAccessService {\n  accessService: AccessService;\n  constructor(accessService: AccessService) {\n    this.accessService = accessService;\n  }\n\n  async getById<T = any>(id: any) {\n    return await this.accessService.getAccessById(id, false);\n  }\n\n  async getCommonById<T = any>(id: any) {\n    return await this.accessService.getAccessById(id, false);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/user/access/service/encrypt-service.ts",
    "content": "import { Init, Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { Encryptor, SysSecret, SysSettingsService } from '../../../system/index.js';\n\n/**\n * 授权\n */\n@Provide()\n@Scope(ScopeEnum.Singleton)\nexport class EncryptService {\n  encryptor: Encryptor;\n\n  @Inject()\n  sysSettingService: SysSettingsService;\n\n  @Init()\n  async init() {\n    const secret: SysSecret = await this.sysSettingService.getSecret();\n    this.encryptor = new Encryptor(secret.encryptSecret);\n  }\n\n  // 加密函数\n  encrypt(text: string) {\n    return this.encryptor.encrypt(text);\n  }\n\n  // 解密函数\n  decrypt(encryptedText: string) {\n    return this.encryptor.decrypt(encryptedText);\n  }\n}\n"
  },
  {
    "path": "packages/libs/lib-server/src/user/index.ts",
    "content": "export * from './access/index.js';\n"
  },
  {
    "path": "packages/libs/lib-server/test.md",
    "content": "end -----\n```\n# test\nThe last line of the SQL file should be uncommented and should end with a semicolon of the SQL statement.\n"
  },
  {
    "path": "packages/libs/lib-server/tsconfig.json",
    "content": "{\n  \"compileOnSave\": true,\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"module\": \"NodeNext\",\n    \"moduleResolution\": \"NodeNext\",\n    \"esModuleInterop\": true,\n    \"isolatedModules\": true,\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"inlineSourceMap\":true,\n    \"noImplicitThis\": true,\n    \"noUnusedLocals\": true,\n    \"stripInternal\": true,\n    \"skipLibCheck\": true,\n    \"pretty\": true,\n    \"declaration\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"typeRoots\": [ \"./typings\", \"./node_modules/@types\"],\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"composite\": false,\n    \"useDefineForClassFields\": true,\n    \"strict\": false,\n    \"resolveJsonModule\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"src/**/*.d.ts\",\n    \"src/**/*.json\"\n  ],\n  \"exclude\": [\n    \"*.js\",\n    \"*.ts\",\n    \"dist\",\n    \"node_modules\",\n    \"test\"\n  ],\n}\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/.dockerignore",
    "content": "logs/\nnpm-debug.log\nyarn-error.log\nnode_modules/\npackage-lock.json\nyarn.lock\ncoverage/\n!dist/\n.idea/\nrun/\n.DS_Store\n*.sw*\n*.un~\n.tsbuildinfo\n.tsbuildinfo.*\n/data/db.sqlite\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/.editorconfig",
    "content": "# 🎨 editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_style = space\nindent_size = 2\ntrim_trailing_whitespace = true\ninsert_final_newline = true"
  },
  {
    "path": "packages/libs/midway-flyway-js/.eslintrc.json",
    "content": "{\n  \"extends\": \"./node_modules/mwts/\",\n  \"ignorePatterns\": [\"node_modules\", \"dist\", \"test\", \"jest.config.js\", \"typings\"],\n  \"env\": {\n    \"jest\": true\n  }\n}\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n\ntest/user.secret.ts\n\ntsconfig.tsbuildinfo\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/.npmignore",
    "content": "node_modules\nsrc"
  },
  {
    "path": "packages/libs/midway-flyway-js/.prettierrc",
    "content": "{\n  \"printWidth\": 220,\n  \"bracketSpacing\": true,\n  \"singleQuote\": false,\n  \"trailingComma\": \"es5\",\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.31.10](https://github.com/certd/certd/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.31.9](https://github.com/certd/certd/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n### Performance Improvements\n\n* 升级midwayjs版本 ([057b0b4](https://github.com/certd/certd/commit/057b0b4565e19bb93195633f767b2942e8e40e59))\n\n## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n### Performance Improvements\n\n* 检查cname是否正确配置 ([b5d8935](https://github.com/certd/certd/commit/b5d8935159374fbe7fc7d4c48ae0ed9396861bdd))\n\n## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)\n\n### Performance Improvements\n\n* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))\n\n## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.22.6](https://github.com/certd/certd/compare/v1.22.5...v1.22.6) (2024-08-03)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.22.3](https://github.com/certd/certd/compare/v1.22.2...v1.22.3) (2024-07-25)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.22.2](https://github.com/certd/certd/compare/v1.22.1...v1.22.2) (2024-07-23)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20)\n\n**Note:** Version bump only for package @certd/midway-flyway-js\n\n# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)\n\n### Features\n\n* 升级midway，支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))\n* 支持postgresql ([3b19bfb](https://github.com/certd/certd/commit/3b19bfb4291e89064b3b407a80dae092d54747d5))\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 Greper\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": "packages/libs/midway-flyway-js/README.md",
    "content": "# Vue 3 + TypeScript + Vite\n\nThis template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.\n\n## Recommended IDE Setup\n\n- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar)\n\n## Type Support For `.vue` Imports in TS\n\nSince TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates. However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can enable Volar's Take Over mode by following these steps:\n\n1. Run `Extensions: Show Built-in Extensions` from VS Code's command palette, look for `TypeScript and JavaScript Language Features`, then right click and select `Disable (Workspace)`. By default, Take Over mode will enable itself if the default TypeScript extension is disabled.\n2. Reload the VS Code window by running `Developer: Reload Window` from the command palette.\n\nYou can learn more about Take Over mode [here](https://github.com/johnsoncodehk/volar/discussions/471).\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/README_zhCN.md",
    "content": "# midway-flyway-js\n\n[English](./README.md) | [简体中文](./README_zhCN.md)\n\n\n`midway-flyway-js`是基于typeorm的flyway的js实现。\n本项目被构建为midway组件，可与midway无缝集成。\n\n# flyway\nflyway是一款java版本的数据库升级迁移解决方案。\n它能在server启动时自动检查脚本目录，执行sql升级脚本，记录执行历史。\n\n本项目根据类似flyway的思路实现数据库升级迁移方案\n\n# 快速开始\n\n## 1. 准备\n* nodejs环境\n* midway项目\n* [配置typeorm](https://www.yuque.com/midwayjs/midway_v2/orm)\n\n## 2. 安装\n```\nnpm install midway-flyway-js\n# or\nyarn add midway-flyway-js\n```\n## 3. 集成\n```js\nimport * as orm from 'typeorm';\nimport * as flyway from 'midway-flyway-js';\n@Configuration({\n  imports: [\n    orm, // 加载 orm 组件\n    flyway, //加载flyway组件\n  ],\n})\nexport class ContainerConfiguration {}\n```\n\n\n## 4. 配置参数【可选】\n`/src/config/config.default.js`文件\n```js\nexport const flyway ={\n  // 脚本目录\n  // 默认值 \"./db/migrition\"\n  scriptDir:\"./db/migrition\",\n  // 基线，基线脚本及之前的脚本都跳过不执行\n  // 默认值：null\n  // 如果你原本就是空数据库，那么不需要配置此项\n  baseline: 'v1__init.sql',\n  // 执行记录表名\n  // 默认值 flyway_history\n  flywayTableName:'flyway_history',\n  // 是否允许hash值不同\n  // 默认值：false\n  // 相同名称sql文件被改动后，hash会变化\n  // 此时运行会报hash conflict错误\n  // 配置此参数为true，将忽略hash conflict错误\n  allowHashNotMatch:false\n}\n\n```\n## 5. 编写升级sql\n\n将你的sql升级脚本，放到 `/src/db/migrition`目录下\n\n建议命名规则`v{version}__{name}.sql`,例如`v1__init.sql`\n\n\n## 6. 启动你的midway服务\n```\nnpm run dev\n```\n\n## 7. 运行效果\n以下效果为midway自动启动后，自动执行`v1__init.sql`脚本的记录\n```\n2021-06-26 15:45:39,630 INFO 12245 [ midfly ] start-------------\nquery: SELECT * FROM \"sqlite_master\" WHERE \"type\" = 'table' AND \"name\" = 'flyway_history'\nquery: CREATE TABLE \"flyway_history\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"timestamp\" bigint NOT NULL, \"name\" varchar NOT NULL, \"hash\" varchar, \"success\" boolean)\nquery: BEGIN TRANSACTION\nquery: SELECT \"FlywayHistory\".\"id\" AS \"FlywayHistory_id\", \"FlywayHistory\".\"name\" AS \"FlywayHistory_name\", \"FlywayHistory\".\"hash\" AS \"FlywayHistory_hash\", \"FlywayHistory\".\"timestamp\" AS \"FlywayHistory_timestamp\", \"FlywayHistory\".\"success\" AS \"FlywayHistory_success\" FROM \"flyway_history\" \"FlywayHistory\" WHERE \"FlywayHistory\".\"name\" = ? AND \"FlywayHistory\".\"success\" = ? LIMIT 1 -- PARAMETERS: [\"v1__init.sql\",1]\n2021-06-26 15:45:39,664 INFO 12245 need exec script file:\n2021-06-26 15:45:39,666 INFO 12245 [ midfly ] exec\nquery: -- 表：sys_permission\nCREATE TABLE \"sys_permission\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"title\" varchar(100) NOT NULL, \"permission\" varchar(100), \"parent_id\" integer NOT NULL DEFAULT (-1), \"sort\" integer NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nquery: INSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (1, '系统管理', 'sys', -1, 1, 1, 1624085863636);\nquery: -- 表：sys_role\nCREATE TABLE \"sys_role\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"name\" varchar(100) NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nquery: INSERT INTO sys_role (id, name, create_time, update_time) VALUES (1, '管理员', 1, 1623749138537);\nquery: -- 表：sys_role_permission\nCREATE TABLE \"sys_role_permission\" (\"role_id\" integer NOT NULL, \"permission_id\" integer NOT NULL, PRIMARY KEY (\"role_id\", \"permission_id\"));\nquery: INSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 1);\nquery: -- 表：sys_user\nCREATE TABLE \"sys_user\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"username\" varchar(100) NOT NULL, \"password\" varchar(50) NOT NULL, \"nick_name\" varchar(50), \"avatar\" varchar(255), \"phone_code\" varchar(20), \"mobile\" varchar(20), \"email\" varchar(100),\"remark\" varchar(100), \"status\" integer NOT NULL DEFAULT (1), \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nquery: INSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 'admin', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,NULL);\nquery: -- 表：sys_user_role\nCREATE TABLE \"sys_user_role\" (\"role_id\" integer NOT NULL, \"user_id\" integer NOT NULL, PRIMARY KEY (\"role_id\", \"user_id\"));\nquery: INSERT INTO sys_user_role (role_id, user_id) VALUES (1, 1);\nquery: -- 索引：IDX_223de54d6badbe43a5490450c3\nCREATE UNIQUE INDEX \"IDX_223de54d6badbe43a5490450c3\" ON \"sys_role\" (\"name\");\nquery: -- 索引：IDX_9e7164b2f1ea1348bc0eb0a7da\nCREATE UNIQUE INDEX \"IDX_9e7164b2f1ea1348bc0eb0a7da\" ON \"sys_user\" (\"username\");\nquery: DELETE FROM \"flyway_history\" WHERE \"name\" = ? -- PARAMETERS: [\"v1__init.sql\"]\nquery: INSERT INTO \"flyway_history\"(\"id\", \"name\", \"hash\", \"timestamp\", \"success\") VALUES (NULL, ?, ?, ?, ?) -- PARAMETERS: [\"v1__init.sql\",\"0c661bd7afebac224bbaa60bc5bb56e9\",1624693539781,1]\nquery: SELECT \"FlywayHistory\".\"id\" AS \"FlywayHistory_id\", \"FlywayHistory\".\"success\" AS \"FlywayHistory_success\" FROM \"flyway_history\" \"FlywayHistory\" WHERE \"FlywayHistory\".\"id\" = ? -- PARAMETERS: [1]\nquery: COMMIT\n2021-06-26 15:45:39,800 INFO 12245 [ midfly ] end-------------\n```\n\n# 注意事项\n1. 升级sql文件最后一行请不要有注释，应该以一条sql语句的分号结尾。\n\n# 他们在用\n* [fs-server-js](https://github.com/fast-crud/fs-server-js)\n\n# 参考项目\n* [flyway](https://github.com/flyway/flyway) : java版flyway\n* [flyway-js](https://github.com/wanglihui/flyway-js) : Sequelize版flyway\n\n感谢以上项目\n\n\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/jest.config.js",
    "content": "module.exports = {\n  preset: 'ts-jest',\n  testEnvironment: 'node',\n  testPathIgnorePatterns: ['<rootDir>/test/fixtures'],\n  coveragePathIgnorePatterns: ['<rootDir>/test/'],\n};\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/ormconfig.json",
    "content": "{\n  \"type\": \"sqlite\",\n  \"database\": \"./data/db.sqlite\",\n  \"synchronize\": false,\n  \"logging\": true,\n  \"entities\": [ \"src/**/entity.ts\"]\n}\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/package.json",
    "content": "{\n  \"name\": \"@certd/midway-flyway-js\",\n  \"version\": \"1.36.10\",\n  \"description\": \"midway with flyway, sql upgrade way \",\n  \"private\": false,\n  \"type\": \"module\",\n  \"module\": \"./dist/index.js\",\n  \"main\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.ts\",\n  \"scripts\": {\n    \"before-build\": \"rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache\",\n    \"build\": \"npm run before-build && tsc --skipLibCheck\",\n    \"dev-build\": \"npm run build\",\n    \"test\": \"midway-bin test --ts -V\",\n    \"test1\": \"midway-bin test --ts -V -f test/blank.test.ts -t 'hash-check'\",\n    \"cov\": \"midway-bin cov --ts\",\n    \"prepublish\": \"npm run build\",\n    \"pub\": \"npm publish\"\n  },\n  \"keywords\": [],\n  \"author\": \"greper\",\n  \"files\": [\n    \"dist/**/*.js\",\n    \"dist/**/*.d.ts\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@midwayjs/core\": \"~3.20.3\",\n    \"@midwayjs/logger\": \"~3.4.2\",\n    \"@midwayjs/typeorm\": \"~3.20.3\",\n    \"better-sqlite3\": \"^11.1.2\"\n  },\n  \"devDependencies\": {\n    \"@types/chai\": \"^4.3.3\",\n    \"@types/node\": \"^18\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.26.1\",\n    \"@typescript-eslint/parser\": \"^8.26.1\",\n    \"eslint\": \"^8.24.0\",\n    \"eslint-config-prettier\": \"^8.5.0\",\n    \"eslint-plugin-import\": \"^2.26.0\",\n    \"eslint-plugin-node\": \"^11.1.0\",\n    \"eslint-plugin-prettier\": \"^4.2.1\",\n    \"prettier\": \"^2.8.8\",\n    \"rimraf\": \"^5.0.5\",\n    \"tslib\": \"^2.8.1\",\n    \"typeorm\": \"^0.3.11\",\n    \"typescript\": \"^5.4.2\"\n  },\n  \"gitHead\": \"085bdf5cfa9140903611aa12cdd2542d05aba321\"\n}\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/src/configuration.ts",
    "content": "import { Config, Configuration, Logger } from '@midwayjs/core';\nimport { Flyway } from './flyway.js';\nimport type { ILogger } from '@midwayjs/logger';\nimport { TypeORMDataSourceManager } from '@midwayjs/typeorm';\nimport type { IMidwayContainer } from '@midwayjs/core';\n\n@Configuration({\n  namespace: 'flyway',\n  //importConfigs: [join(__dirname, './config')],\n})\nexport class FlywayConfiguration {\n  @Config()\n  flyway!: any;\n  @Logger()\n  logger!: ILogger;\n  async onReady(container: IMidwayContainer) {\n    this.logger.info('flyway start:' + JSON.stringify(this.flyway));\n    const dataSourceManager = await container.getAsync(TypeORMDataSourceManager);\n    const dataSourceName = this.flyway.dataSourceName || 'default';\n    const connection = dataSourceManager.getDataSource(dataSourceName);\n    await new Flyway({ ...this.flyway, logger: this.logger, connection }).run();\n  }\n}\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/src/entity.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity('flyway_history')\nexport class FlywayHistory {\n  @PrimaryGeneratedColumn()\n  id?: number;\n\n  @Column({ comment: '文件名', length: 100 })\n  name?: string;\n\n  @Column({ comment: 'hash', length: 32 })\n  hash?: string;\n\n  @Column({\n    comment: '执行时间',\n  })\n  timestamp?: Date;\n\n  @Column({\n    comment: '执行成功',\n    default: true,\n  })\n  success?: boolean;\n}\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/src/flyway.ts",
    "content": "import * as path from 'path';\nimport * as fs from 'fs';\nimport { QueryRunner, Table } from 'typeorm';\nimport { FlywayHistory } from './entity.js';\nimport * as crypto from 'crypto';\n\n/**\n * 脚本文件信息\n */\nclass ScriptFile {\n  script: string;\n  isBaseline = false;\n\n  constructor(fileName: any, isBaseline: any) {\n    this.script = fileName;\n    this.isBaseline = isBaseline;\n  }\n}\n\nconst DefaultLogger = {\n  debug: function (...args: any) {\n    console.log(args);\n  },\n  info: function (...args: any) {\n    console.log(args);\n  },\n  warn: function (...args: any) {\n    console.warn(args);\n  },\n  error: function (...args: any) {\n    console.error(args);\n  },\n};\nexport class Flyway {\n  scriptDir;\n  flywayTableName;\n  baseline;\n  allowHashNotMatch;\n  connection;\n  logger;\n  constructor(opts: any) {\n    this.scriptDir = opts.scriptDir ?? 'db/migration';\n    this.flywayTableName = opts.flywayTableName ?? 'flyway_history';\n    this.baseline = opts.baseline ?? false;\n    this.allowHashNotMatch = opts.allowHashNotMatch ?? false;\n    this.logger = opts.logger || DefaultLogger;\n    this.connection = opts.connection;\n  }\n\n  async run(ignores?: (RegExp | string)[]) {\n    this.logger.info('[ midfly ] start-------------');\n    if (!fs.existsSync(this.scriptDir)) {\n      this.logger.info('[ midfly ] scriptDir<' + this.scriptDir + '> not found');\n      return;\n    }\n\n    const scriptFiles = await this.loadScriptFiles();\n    const queryRunner = this.connection.createQueryRunner();\n    await this.prepare(queryRunner);\n    for (const file of scriptFiles) {\n      if (this.isNeedIgnore(file.script, ignores)) {\n        continue;\n      }\n      const filepath = path.resolve(this.scriptDir, file.script);\n\n      await queryRunner.startTransaction();\n      try {\n        //查找是否已经执行\n        if (await this.hasExec(file.script, filepath, queryRunner)) {\n          await queryRunner.commitTransaction();\n          continue;\n        }\n        if (!file.isBaseline) {\n          this.logger.info('need exec script file: ', file.script);\n          //执行sql文件\n          if (/\\.sql$/.test(file.script)) {\n            await this.execSql(filepath, queryRunner);\n          }\n          // 执行js或者ts\n          // if (/\\.(js|ts)$/.test(file.script)) {\n          //   await this.execJsOrTs(filepath, t);\n          // }\n        } else {\n          this.logger.info('baseline script file: ', file.script);\n        }\n        await this.storeSqlExecLog(file.script, filepath, true, queryRunner);\n        await queryRunner.commitTransaction();\n      } catch (err) {\n        this.logger.error(err);\n        await this.storeSqlExecLog(file.script, filepath, false, queryRunner);\n        await queryRunner.rollbackTransaction();\n        throw err;\n      }\n    }\n    this.logger.info('[ midfly ] end-------------');\n  }\n\n  private async storeSqlExecLog(filename: string, filepath: string, success: boolean, queryRunner: QueryRunner) {\n    const hash = await this.getFileHash(filepath);\n    //先删除\n    await queryRunner.manager.delete(FlywayHistory, {\n      name: filename,\n    });\n    const history = await queryRunner.manager.insert(FlywayHistory, {\n      name: filename,\n      hash,\n      timestamp: new Date().getTime(),\n      success,\n    });\n    return history;\n  }\n\n  /**\n   * 读取升级脚本文件\n   * @private\n   */\n  private async loadScriptFiles() {\n    const files = fs.readdirSync(this.scriptDir);\n    files.sort();\n    // 获取基准脚本的位置\n    const local = files.indexOf(this.baseline);\n    const scriptFiles = new Array<ScriptFile>();\n    files.forEach((file, index) => {\n      if (index <= local) {\n        // 基准脚本和基准脚本之前的脚本都不执行\n        scriptFiles.push(new ScriptFile(file, true));\n      } else {\n        scriptFiles.push(new ScriptFile(file, false));\n      }\n    });\n    return scriptFiles;\n  }\n\n  /**\n   * 创建history表\n   * @private\n   */\n  private async prepare(queryRunner: QueryRunner) {\n    await this.createFlywayTableIfNotExist(queryRunner);\n  }\n\n  /**\n   * Creates table \"flyway_history\" that will store information about executed migrations.\n   */\n  protected async createFlywayTableIfNotExist(queryRunner: QueryRunner): Promise<void> {\n    // If driver is mongo no need to create\n    // if (this.connection.driver instanceof MongoDriver) {\n    //   return;\n    // }\n    const tableExist = await queryRunner.hasTable(this.flywayTableName); // todo: table name should be configurable\n    if (!tableExist) {\n      await queryRunner.createTable(\n        new Table({\n          name: this.flywayTableName,\n          columns: [\n            {\n              name: 'id',\n              type: this.connection.driver.normalizeType({\n                type: this.connection.driver.mappedDataTypes.migrationId,\n              }),\n              isGenerated: true,\n              generationStrategy: 'increment',\n              isPrimary: true,\n              isNullable: false,\n            },\n            {\n              name: 'timestamp',\n              type: this.connection.driver.normalizeType({\n                type: this.connection.driver.mappedDataTypes.migrationTimestamp,\n              }),\n              isPrimary: false,\n              isNullable: false,\n            },\n            {\n              name: 'name',\n              type: this.connection.driver.normalizeType({\n                type: this.connection.driver.mappedDataTypes.migrationName,\n              }),\n              isNullable: false,\n            },\n            {\n              name: 'hash',\n              type: this.connection.driver.normalizeType({\n                type: this.connection.driver.mappedDataTypes.migrationName,\n              }),\n              isNullable: true,\n            },\n            {\n              name: 'success',\n              type: this.connection.driver.normalizeType({\n                type: 'boolean',\n              }),\n              isNullable: true,\n            },\n          ],\n        })\n      );\n    }\n  }\n\n  private isNeedIgnore(file: string, ignores?: (RegExp | string)[]): boolean {\n    if (!ignores) {\n      ignores = [/\\.js\\.map$/, /\\.d\\.ts$/];\n    }\n    let ret = false;\n    for (const ignore of ignores) {\n      if (typeof ignore === 'string' && file === ignore) {\n        ret = true;\n        break;\n      }\n      if (ignore instanceof RegExp && ignore.test(file)) {\n        ret = true;\n        break;\n      }\n    }\n    return ret;\n  }\n\n  private async hasExec(file: string, filepath: string, queryRunner: QueryRunner): Promise<boolean> {\n    const hash = await this.getFileHash(filepath);\n\n    const history = await queryRunner.manager.findOne(FlywayHistory, {\n      where: { name: file, success: true },\n    });\n\n    if (history) {\n      if (history.hash !== hash && this.allowHashNotMatch === false) {\n        throw new Error(file + `hash conflict ,old: ${history.hash} != new: ${hash}`);\n      }\n      this.logger.info('[ midfly ] script<' + file + '> already executed');\n      return true;\n    }\n    this.logger.info('[ midfly ] script<' + file + '> not yet execute');\n    return false;\n  }\n\n  private async getFileHash(filepath: string) {\n    const content = fs.readFileSync(filepath).toString();\n    return crypto.createHash('md5').update(content.toString()).digest('hex');\n  }\n\n  private async execSql(filepath: string, queryRunner: QueryRunner) {\n    this.logger.info('[ midfly ] exec ', filepath);\n    const content = fs.readFileSync(filepath).toString().trim();\n    const arr = this.splitSql2Array(content);\n    for (const s of arr) {\n      await this.execOnePart(s, queryRunner);\n    }\n  }\n\n  private async execOnePart(sql: string, queryRunner: QueryRunner) {\n    this.logger.debug('exec sql index: ', sql);\n    try {\n      await queryRunner.query(sql);\n    } catch (err: any) {\n      this.logger.error('exec sql error ： ', err.message, err);\n      throw err;\n    }\n  }\n\n  /**\n   * 将字符串分割为数组\n   * @param {string} str 字符串\n   */\n  splitSql2Array(str: any) {\n    if (!str) {\n      return [];\n    }\n\n    const temp = String(str).trim();\n\n    if (temp === 'null') {\n      return [];\n    }\n\n    const semicolon = ';';\n    const deepChars = ['\"', \"'\"];\n    const splits = [];\n\n    const deepQueue: any = [];\n    for (let i = 0; i < temp.length; i++) {\n      const charAt = temp.charAt(i);\n\n      if (deepChars.indexOf(charAt) >= 0) {\n        //如果是深度char\n        if (i !== 0 && temp.charAt(i - 1) === '\\\\') {\n          //如果前一个是转义字符，忽略它\n        } else {\n          //说明需要进出深度了\n          if (deepQueue.length === 0 || deepQueue[deepQueue.length - 1] !== charAt) {\n            //进入深度\n            deepQueue.push(charAt);\n          } else {\n            //退出深度\n            deepQueue.pop();\n          }\n        }\n      }\n      //当深度为0，则记录分割点\n      if (charAt === semicolon && deepQueue.length === 0) {\n        splits.push(i + 1);\n      }\n    }\n\n    //分割sql\n\n    const arr = [];\n    let lastIndex = 0;\n    for (const index of splits) {\n      const sql = temp.substring(lastIndex, index);\n      lastIndex = index;\n      arr.push(sql.trim());\n    }\n\n    return arr;\n  }\n}\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/src/index.ts",
    "content": "// src/index.ts\nexport { FlywayConfiguration as Configuration } from './configuration.js';\n// eslint-disable-next-line node/no-unpublished-import\nexport { Flyway } from './flyway.js';\n// eslint-disable-next-line node/no-unpublished-import\nexport { FlywayHistory } from './entity.js';\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test/db/baseline/v0__baseline.sql",
    "content": "-- no sql\n\nCREATE TABLE \"sys_permission\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"title\" varchar(100) NOT NULL, \"permission\" varchar(100), \"parent_id\" integer NOT NULL DEFAULT (-1), \"sort\" integer NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test/db/baseline/v1__init.sql",
    "content": "-- 表：sys_permission\nCREATE TABLE \"sys_permission\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"title\" varchar(100) NOT NULL, \"permission\" varchar(100), \"parent_id\" integer NOT NULL DEFAULT (-1), \"sort\" integer NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (1, '系统管理', 'sys', -1, 1, 1, 1624085863636);\n\n\n\n-- 表：sys_role\nCREATE TABLE \"sys_role\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"name\" varchar(100) NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_role (id, name, create_time, update_time) VALUES (1, '管理员', 1, 1623749138537);\nINSERT INTO sys_role (id, name, create_time, update_time) VALUES (2, '只读角色', 1, 1623749138537);\n\n-- 表：sys_role_permission\nCREATE TABLE \"sys_role_permission\" (\"role_id\" integer NOT NULL, \"permission_id\" integer NOT NULL, PRIMARY KEY (\"role_id\", \"permission_id\"));\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 1);\n\n-- 表：sys_user\nCREATE TABLE \"sys_user\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"username\" varchar(100) NOT NULL, \"password\" varchar(50) NOT NULL, \"nick_name\" varchar(50), \"avatar\" varchar(255), \"phone_code\" varchar(20), \"mobile\" varchar(20), \"email\" varchar(100),\"remark\" varchar(100), \"status\" integer NOT NULL DEFAULT (1), \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 'admin', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,NULL);\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (2, 'readonly', 'e10adc3949ba59abbe56e057f20f883e', '只读用户', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,'密码：123456');\n\n-- 表：sys_user_role\nCREATE TABLE \"sys_user_role\" (\"role_id\" integer NOT NULL, \"user_id\" integer NOT NULL, PRIMARY KEY (\"role_id\", \"user_id\"));\nINSERT INTO sys_user_role (role_id, user_id) VALUES (1, 1);\nINSERT INTO sys_user_role (role_id, user_id) VALUES (2, 2);\n\n-- 索引：IDX_223de54d6badbe43a5490450c3\nCREATE UNIQUE INDEX \"IDX_223de54d6badbe43a5490450c3\" ON \"sys_role\" (\"name\");\n\n-- 索引：IDX_9e7164b2f1ea1348bc0eb0a7da\nCREATE UNIQUE INDEX \"IDX_9e7164b2f1ea1348bc0eb0a7da\" ON \"sys_user\" (\"username\");\n\n\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test/db/blank/v1__blank.sql",
    "content": "\n-- this is blank sql, 注释不要放在结尾\nselect 1;\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test/db/hash-check/v1__init.sql",
    "content": "-- 表：sys_permission\nCREATE TABLE \"sys_permission\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"title\" varchar(100) NOT NULL, \"permission\" varchar(100), \"parent_id\" integer NOT NULL DEFAULT (-1), \"sort\" integer NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (1, '系统管理', 'sys', -1, 1, 1, 1624085863636);\n\n\n\n-- 表：sys_role\nCREATE TABLE \"sys_role\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"name\" varchar(100) NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_role (id, name, create_time, update_time) VALUES (1, '管理员', 1, 1623749138537);\nINSERT INTO sys_role (id, name, create_time, update_time) VALUES (2, '只读角色', 1, 1623749138537);\n\n-- 表：sys_role_permission\nCREATE TABLE \"sys_role_permission\" (\"role_id\" integer NOT NULL, \"permission_id\" integer NOT NULL, PRIMARY KEY (\"role_id\", \"permission_id\"));\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 1);\n\n-- 表：sys_user\nCREATE TABLE \"sys_user\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"username\" varchar(100) NOT NULL, \"password\" varchar(50) NOT NULL, \"nick_name\" varchar(50), \"avatar\" varchar(255), \"phone_code\" varchar(20), \"mobile\" varchar(20), \"email\" varchar(100),\"remark\" varchar(100), \"status\" integer NOT NULL DEFAULT (1), \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 'admin', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,NULL);\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (2, 'readonly', 'e10adc3949ba59abbe56e057f20f883e', '只读用户', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,'密码：123456');\n\n-- 表：sys_user_role\nCREATE TABLE \"sys_user_role\" (\"role_id\" integer NOT NULL, \"user_id\" integer NOT NULL, PRIMARY KEY (\"role_id\", \"user_id\"));\nINSERT INTO sys_user_role (role_id, user_id) VALUES (1, 1);\nINSERT INTO sys_user_role (role_id, user_id) VALUES (2, 2);\n\n-- 索引：IDX_223de54d6badbe43a5490450c3\nCREATE UNIQUE INDEX \"IDX_223de54d6badbe43a5490450c3\" ON \"sys_role\" (\"name\");\n\n-- 索引：IDX_9e7164b2f1ea1348bc0eb0a7da\nCREATE UNIQUE INDEX \"IDX_9e7164b2f1ea1348bc0eb0a7da\" ON \"sys_user\" (\"username\");\n\n\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test/db/hash-check/v2__add_user.sql",
    "content": "INSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (3, 'admin1', 'e10adc3949ba59abbe56e057f20f883e', 'admin', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,NULL);\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (4, 'readonly1', 'e10adc3949ba59abbe56e057f20f883e', '只读用户', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,'密码：123456');\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test/db/hash-check/v3__add_role.sql",
    "content": "INSERT INTO sys_role (id, name, create_time, update_time) VALUES (3, '管理员1', 1, 1623749138537);\n-- hash check\nselect 1;\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test/db/migration/v1__init.sql",
    "content": "-- 表：sys_permission\nCREATE TABLE \"sys_permission\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"title\" varchar(100) NOT NULL, \"permission\" varchar(100), \"parent_id\" integer NOT NULL DEFAULT (-1), \"sort\" integer NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (1, '系统管理', 'sys', -1, 1, 1, 1624085863636);\n\n\n\n-- 表：sys_role\nCREATE TABLE \"sys_role\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"name\" varchar(100) NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_role (id, name, create_time, update_time) VALUES (1, '管理员', 1, 1623749138537);\nINSERT INTO sys_role (id, name, create_time, update_time) VALUES (2, '只读角色', 1, 1623749138537);\n\n-- 表：sys_role_permission\nCREATE TABLE \"sys_role_permission\" (\"role_id\" integer NOT NULL, \"permission_id\" integer NOT NULL, PRIMARY KEY (\"role_id\", \"permission_id\"));\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 1);\n\n-- 表：sys_user\nCREATE TABLE \"sys_user\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"username\" varchar(100) NOT NULL, \"password\" varchar(50) NOT NULL, \"nick_name\" varchar(50), \"avatar\" varchar(255), \"phone_code\" varchar(20), \"mobile\" varchar(20), \"email\" varchar(100),\"remark\" varchar(100), \"status\" integer NOT NULL DEFAULT (1), \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 'admin', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,NULL);\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (2, 'readonly', 'e10adc3949ba59abbe56e057f20f883e', '只读用户', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,'密码：123456');\n\n-- 表：sys_user_role\nCREATE TABLE \"sys_user_role\" (\"role_id\" integer NOT NULL, \"user_id\" integer NOT NULL, PRIMARY KEY (\"role_id\", \"user_id\"));\nINSERT INTO sys_user_role (role_id, user_id) VALUES (1, 1);\nINSERT INTO sys_user_role (role_id, user_id) VALUES (2, 2);\n\n-- 索引：IDX_223de54d6badbe43a5490450c3\nCREATE UNIQUE INDEX \"IDX_223de54d6badbe43a5490450c3\" ON \"sys_role\" (\"name\");\n\n-- 索引：IDX_9e7164b2f1ea1348bc0eb0a7da\nCREATE UNIQUE INDEX \"IDX_9e7164b2f1ea1348bc0eb0a7da\" ON \"sys_user\" (\"username\");\n\n\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test/db/migration/v2__add_user.sql",
    "content": "INSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (3, 'admin1', 'e10adc3949ba59abbe56e057f20f883e', 'admin', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,NULL);\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (4, 'readonly1', 'e10adc3949ba59abbe56e057f20f883e', '只读用户', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,'密码：123456');\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test/db/migration/v3__add_role.sql",
    "content": "INSERT INTO sys_role (id, name, create_time, update_time) VALUES (3, '管理员1', 1, 1623749138537);\nINSERT INTO sys_role (id, name, create_time, update_time) VALUES (4, '只读角色1', 1, 1623749138537);\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test/db/semicolon/v1__init.sql",
    "content": "-- 表：sys_permission\nCREATE TABLE \"sys_permission\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"title\" varchar(100) NOT NULL, \"permission\" varchar(100), \"parent_id\" integer NOT NULL DEFAULT (-1), \"sort\" integer NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time)\n VALUES (1, '系统管理;', 'sys', -1, 1, 1, 1624085863636);\n\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test/db/split/split.sql",
    "content": "'\"test;\";\\'test;\\'';\n\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test/flyway.test.js",
    "content": "\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n    function verb(n) { return function (v) { return step([n, v]); }; }\n    function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (g && (g = 0, op[0] && (_ = 0)), _) try {\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n            if (y = 0, t) op = [op[0] & 2, t.value];\n            switch (op[0]) {\n                case 0: case 1: t = op; break;\n                case 4: _.label++; return { value: op[1], done: false };\n                case 5: _.label++; y = op[1]; op = [0]; continue;\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\n                default:\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                    if (t[2]) _.ops.pop();\n                    _.trys.pop(); continue;\n            }\n            op = body.call(thisArg, _);\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n    }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar flyway_1 = require(\"../src/flyway\");\nvar typeorm_1 = require(\"typeorm\");\nvar fs = require(\"fs\");\nvar entity_1 = require(\"../src/entity\");\nvar dbPath = \"./data/db.sqlite\";\nvar AppDataSource = new typeorm_1.DataSource({\n    type: \"sqlite\",\n    database: dbPath,\n    entities: [entity_1.FlywayHistory]\n});\ndescribe('test/flyway/flyway.test.ts', function () {\n    beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () {\n        return __generator(this, function (_a) {\n            switch (_a.label) {\n                case 0:\n                    if (fs.existsSync(dbPath)) {\n                        fs.rmSync(dbPath);\n                    }\n                    return [4 /*yield*/, AppDataSource.initialize()];\n                case 1:\n                    _a.sent();\n                    console.log('before each');\n                    return [2 /*return*/];\n            }\n        });\n    }); });\n    afterEach(function () { return __awaiter(void 0, void 0, void 0, function () {\n        return __generator(this, function (_a) {\n            switch (_a.label) {\n                case 0: \n                // close app\n                return [4 /*yield*/, AppDataSource.destroy()];\n                case 1:\n                    // close app\n                    _a.sent();\n                    if (fs.existsSync(dbPath)) {\n                        fs.rmSync(dbPath);\n                    }\n                    console.log('after each');\n                    return [2 /*return*/];\n            }\n        });\n    }); });\n    /**\n     * sql分割测试\n     */\n    it('split', function () { return __awaiter(void 0, void 0, void 0, function () {\n        var opts, content, sqlArray;\n        return __generator(this, function (_a) {\n            opts = {\n                scriptDir: \"./test/db/split\"\n            };\n            content = fs.readFileSync(\"./test/db/split/split.sql\").toString();\n            sqlArray = new flyway_1.Flyway(opts).splitSql2Array(content);\n            console.log('sql array', sqlArray);\n            expect(sqlArray.length).toBe(1);\n            return [2 /*return*/];\n        });\n    }); });\n    /**\n     * sql分号测试\n     */\n    it('semicolon', function () { return __awaiter(void 0, void 0, void 0, function () {\n        var connection, opts, queryRunner, flywayHistoryRet;\n        return __generator(this, function (_a) {\n            switch (_a.label) {\n                case 0:\n                    connection = AppDataSource;\n                    opts = {\n                        scriptDir: \"./test/db/semicolon\",\n                        connection: connection\n                    };\n                    return [4 /*yield*/, new flyway_1.Flyway(opts).run()];\n                case 1:\n                    _a.sent();\n                    queryRunner = connection.createQueryRunner();\n                    return [4 /*yield*/, queryRunner.query(\"select *  from flyway_history\")];\n                case 2:\n                    flywayHistoryRet = _a.sent();\n                    console.log('flywayHistoryRet', flywayHistoryRet);\n                    expect(flywayHistoryRet.length).toBe(1);\n                    return [2 /*return*/];\n            }\n        });\n    }); });\n    /**\n     * 正常执行\n     */\n    it('success', function () { return __awaiter(void 0, void 0, void 0, function () {\n        var connection, opts, queryRunner, ret, flywayHistoryRet, flywayHistoryRet2;\n        return __generator(this, function (_a) {\n            switch (_a.label) {\n                case 0:\n                    connection = AppDataSource;\n                    opts = {\n                        scriptDir: \"./test/db/migration\",\n                        connection: connection\n                    };\n                    return [4 /*yield*/, new flyway_1.Flyway(opts).run()];\n                case 1:\n                    _a.sent();\n                    queryRunner = connection.createQueryRunner();\n                    return [4 /*yield*/, queryRunner.query(\"select count(*) as count from sys_user\")];\n                case 2:\n                    ret = _a.sent();\n                    console.log('useCount', ret);\n                    expect(ret[0].count).toBe(4);\n                    return [4 /*yield*/, queryRunner.query(\"select *  from flyway_history\")];\n                case 3:\n                    flywayHistoryRet = _a.sent();\n                    console.log('flywayHistoryRet', flywayHistoryRet);\n                    expect(flywayHistoryRet.length).toBe(3);\n                    expect(flywayHistoryRet[0].id).toBe(1);\n                    expect(flywayHistoryRet[0].success).toBe(1);\n                    expect(flywayHistoryRet[0].name).toBe('v1__init.sql');\n                    //再运行一次，应该没有变化\n                    return [4 /*yield*/, new flyway_1.Flyway(opts).run()];\n                case 4:\n                    //再运行一次，应该没有变化\n                    _a.sent();\n                    return [4 /*yield*/, queryRunner.query(\"select *  from flyway_history\")];\n                case 5:\n                    flywayHistoryRet2 = _a.sent();\n                    expect(flywayHistoryRet.length).toBe(3);\n                    expect(flywayHistoryRet2[0].id).toBe(1);\n                    return [2 /*return*/];\n            }\n        });\n    }); });\n    /**\n     * 测试基准线，基准线之前的sql不执行\n     */\n    it('base line', function () { return __awaiter(void 0, void 0, void 0, function () {\n        var connection, opts, e_1, queryRunner, ret, flywayHistoryRet;\n        return __generator(this, function (_a) {\n            switch (_a.label) {\n                case 0:\n                    connection = AppDataSource;\n                    opts = {\n                        scriptDir: \"./test/db/baseline\",\n                        baseline: 'v0__baseline.sql',\n                        connection: connection\n                    };\n                    _a.label = 1;\n                case 1:\n                    _a.trys.push([1, 3, , 4]);\n                    return [4 /*yield*/, new flyway_1.Flyway(opts).run()];\n                case 2:\n                    _a.sent();\n                    return [3 /*break*/, 4];\n                case 3:\n                    e_1 = _a.sent();\n                    console.log('error', e_1);\n                    throw e_1;\n                case 4:\n                    queryRunner = connection.createQueryRunner();\n                    return [4 /*yield*/, queryRunner.query(\"select count(*) as count from sys_user\")];\n                case 5:\n                    ret = _a.sent();\n                    console.log('useCount', ret);\n                    expect(ret[0].count).toBe(2);\n                    return [4 /*yield*/, queryRunner.query(\"select *  from flyway_history\")];\n                case 6:\n                    flywayHistoryRet = _a.sent();\n                    console.log('flywayHistoryRet', flywayHistoryRet);\n                    expect(flywayHistoryRet.length).toBe(2);\n                    expect(flywayHistoryRet[0].id).toBe(1);\n                    expect(flywayHistoryRet[0].success).toBe(1);\n                    expect(flywayHistoryRet[0].name).toBe('v0__baseline.sql');\n                    expect(flywayHistoryRet[1].name).toBe('v1__init.sql');\n                    return [2 /*return*/];\n            }\n        });\n    }); });\n    it('hash check', function () { return __awaiter(void 0, void 0, void 0, function () {\n        var connection, opts, queryRunner, ret, error, e_2;\n        return __generator(this, function (_a) {\n            switch (_a.label) {\n                case 0:\n                    connection = AppDataSource;\n                    opts = {\n                        scriptDir: \"./test/db/migration\",\n                        connection: connection\n                    };\n                    return [4 /*yield*/, new flyway_1.Flyway(opts).run()];\n                case 1:\n                    _a.sent();\n                    queryRunner = connection.createQueryRunner();\n                    return [4 /*yield*/, queryRunner.query(\"select count(*) as count from sys_user\")];\n                case 2:\n                    ret = _a.sent();\n                    console.log('useCount', ret);\n                    expect(ret[0].count).toBe(4);\n                    _a.label = 3;\n                case 3:\n                    _a.trys.push([3, 5, , 6]);\n                    opts.scriptDir = \"./test/db/hash-check\";\n                    return [4 /*yield*/, new flyway_1.Flyway(opts).run()];\n                case 4:\n                    _a.sent();\n                    return [3 /*break*/, 6];\n                case 5:\n                    e_2 = _a.sent();\n                    error = e_2.message;\n                    return [3 /*break*/, 6];\n                case 6:\n                    expect(error).toContain('hash conflict');\n                    return [2 /*return*/];\n            }\n        });\n    }); });\n    it('blank sql', function () { return __awaiter(void 0, void 0, void 0, function () {\n        var connection, opts, queryRunner, flywayHistoryRet;\n        return __generator(this, function (_a) {\n            switch (_a.label) {\n                case 0:\n                    connection = AppDataSource;\n                    opts = {\n                        scriptDir: \"./test/db/blank\",\n                        connection: connection\n                    };\n                    return [4 /*yield*/, new flyway_1.Flyway(opts).run()];\n                case 1:\n                    _a.sent();\n                    queryRunner = connection.createQueryRunner();\n                    return [4 /*yield*/, queryRunner.query(\"select *  from flyway_history\")];\n                case 2:\n                    flywayHistoryRet = _a.sent();\n                    console.log('flywayHistoryRet', flywayHistoryRet);\n                    expect(flywayHistoryRet.length).toBe(1);\n                    return [2 /*return*/];\n            }\n        });\n    }); });\n});\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test/flyway.test.ts",
    "content": "import {Flyway} from \"../src/flyway\";\nimport {DataSource} from 'typeorm';\nimport * as fs from 'fs'\nimport {FlywayHistory} from \"../src/entity\";\n\nconst dbPath = \"./data/db.sqlite\"\nconst AppDataSource = new DataSource({\n  type: \"sqlite\",\n  database: dbPath,\n  entities: [FlywayHistory]\n})\n\ndescribe('test/flyway/flyway.test.ts', () => {\n\n  beforeEach(async () => {\n    if (fs.existsSync(dbPath)) {\n      fs.rmSync(dbPath)\n    }\n    await  AppDataSource.initialize()\n    console.log('before each')\n  });\n\n  afterEach(async () => {\n    // close app\n    await AppDataSource.destroy()\n    if (fs.existsSync(dbPath)) {\n      fs.rmSync(dbPath)\n    }\n    console.log('after each')\n  });\n\n  /**\n   * sql分割测试\n   */\n  it('split', async () => {\n    let opts = {\n      scriptDir: \"./test/db/split\"\n    };\n    const content = fs.readFileSync(\"./test/db/split/split.sql\").toString();\n    const sqlArray = new Flyway(opts).splitSql2Array(content)\n    console.log('sql array',sqlArray)\n    expect(sqlArray.length).toBe(1);\n  });\n\n  /**\n   * sql分号测试\n   */\n  it('semicolon', async () => {\n    const connection = AppDataSource\n    let opts = {\n      scriptDir: \"./test/db/semicolon\",\n      connection: connection\n    };\n    await new Flyway(opts).run();\n    const queryRunner = connection.createQueryRunner();\n    const flywayHistoryRet = await queryRunner.query(\"select *  from flyway_history\");\n    console.log('flywayHistoryRet', flywayHistoryRet)\n    expect(flywayHistoryRet.length).toBe(1);\n  });\n\n  /**\n   * 正常执行\n   */\n  it('success', async () => {\n    const connection = AppDataSource\n    let opts = {\n      scriptDir: \"./test/db/migration\",\n      connection: connection\n    };\n    await new Flyway(opts).run();\n    const queryRunner = connection.createQueryRunner();\n    const ret = await queryRunner.query(\"select count(*) as count from sys_user\");\n    console.log('useCount',ret)\n    expect(ret[0].count).toBe(4);\n\n    const flywayHistoryRet = await queryRunner.query(\"select *  from flyway_history\");\n    console.log('flywayHistoryRet',flywayHistoryRet)\n    expect(flywayHistoryRet.length).toBe(3);\n    expect(flywayHistoryRet[0].id).toBe(1);\n    expect(flywayHistoryRet[0].success).toBe(1);\n    expect(flywayHistoryRet[0].name).toBe('v1__init.sql');\n\n    //再运行一次，应该没有变化\n    await new Flyway(opts).run();\n    const flywayHistoryRet2 = await queryRunner.query(\"select *  from flyway_history\");\n    expect(flywayHistoryRet.length).toBe(3);\n    expect(flywayHistoryRet2[0].id).toBe(1);\n\n  });\n\n\n  /**\n   * 测试基准线，基准线之前的sql不执行\n   */\n  it('base line', async () => {\n    const connection = AppDataSource\n    let opts = {\n      scriptDir: \"./test/db/baseline\",\n      baseline: 'v0__baseline.sql',\n      connection\n    };\n    try {\n      await new Flyway(opts).run();\n    } catch (e) {\n      console.log('error',e)\n      throw e\n    }\n    const queryRunner = connection.createQueryRunner();\n    const ret = await queryRunner.query(\"select count(*) as count from sys_user\");\n    console.log('useCount', ret)\n    expect(ret[0].count).toBe(2);\n\n    const flywayHistoryRet = await queryRunner.query(\"select *  from flyway_history\");\n    console.log('flywayHistoryRet', flywayHistoryRet)\n    expect(flywayHistoryRet.length).toBe(2);\n    expect(flywayHistoryRet[0].id).toBe(1);\n    expect(flywayHistoryRet[0].success).toBe(1);\n    expect(flywayHistoryRet[0].name).toBe('v0__baseline.sql');\n    expect(flywayHistoryRet[1].name).toBe('v1__init.sql');\n\n  });\n\n  it('hash check', async () => {\n    const connection = AppDataSource;\n    let opts = {\n      scriptDir: \"./test/db/migration\",\n      connection\n    };\n    await new Flyway(opts).run();\n    const queryRunner = connection.createQueryRunner();\n    const ret = await queryRunner.query(\"select count(*) as count from sys_user\");\n    console.log('useCount',ret)\n    expect(ret[0].count).toBe(4);\n\n    //再运行一次，应该抛异常\n    let error\n    try{\n      opts.scriptDir=\"./test/db/hash-check\"\n      await new Flyway(opts).run();\n    }catch (e){\n      error = e.message;\n    }\n    expect(error).toContain('hash conflict');\n\n  });\n\n\n  it('blank sql', async () => {\n    const connection = AppDataSource;\n    let opts = {\n      scriptDir: \"./test/db/blank\",\n      connection\n    };\n    await new Flyway(opts).run();\n\n    const queryRunner = connection.createQueryRunner();\n    const flywayHistoryRet = await queryRunner.query(\"select *  from flyway_history\");\n    console.log('flywayHistoryRet', flywayHistoryRet)\n    expect(flywayHistoryRet.length).toBe(1);\n\n  });\n\n});\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/test.md",
    "content": "end -----\n```\n# test\nThe last line of the SQL file should be uncommented and should end with a semicolon of the SQL statement.\n"
  },
  {
    "path": "packages/libs/midway-flyway-js/tsconfig.json",
    "content": "{\n  \"compileOnSave\": true,\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"esModuleInterop\": true,\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"inlineSourceMap\":true,\n    \"noImplicitThis\": true,\n    \"noUnusedLocals\": true,\n    \"stripInternal\": true,\n    \"skipLibCheck\": true,\n    \"pretty\": true,\n    \"declaration\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"typeRoots\": [ \"./typings\", \"./node_modules/@types\"],\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"composite\": false,\n    \"useDefineForClassFields\": true,\n    \"strict\": false,\n//    \"sourceMap\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"src/**/*.d.ts\",\n    \"src/**/*.json\"\n  ],\n  \"exclude\": [\n    \"*.js\",\n    \"*.ts\",\n    \"dist\",\n    \"node_modules\",\n    \"test\"\n  ],\n}\n"
  },
  {
    "path": "packages/plugins/plugin-cert/.eslintrc",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"plugins\": [\n    \"@typescript-eslint\"\n  ],\n  \"extends\": [\n    \"plugin:@typescript-eslint/recommended\",\n    \"plugin:prettier/recommended\",\n    \"prettier\"\n  ],\n  \"env\": {\n    \"mocha\": true\n  },\n  \"rules\": {\n    \"@typescript-eslint/no-var-requires\": \"off\",\n    \"@typescript-eslint/ban-ts-comment\": \"off\",\n    \"@typescript-eslint/ban-ts-ignore\": \"off\",\n    \"@typescript-eslint/no-explicit-any\": \"off\",\n    \"@typescript-eslint/no-empty-function\": \"off\",\n    \"@typescript-eslint/no-unused-vars\": \"off\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-cert/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n\ntest/user.secret.*\n"
  },
  {
    "path": "packages/plugins/plugin-cert/.mocharc.json",
    "content": "{\n  \"extension\": [\"ts\"],\n  \"spec\": \"test/**/*.test.ts\",\n  \"require\": \"ts-node/register\"\n}"
  },
  {
    "path": "packages/plugins/plugin-cert/.npmignore",
    "content": "node_modules\nsrc"
  },
  {
    "path": "packages/plugins/plugin-cert/.npmrc",
    "content": "link-workspace-packages=deep\nprefer-workspace-packages=true\n"
  },
  {
    "path": "packages/plugins/plugin-cert/.prettierrc",
    "content": "{\n  \"printWidth\": 220,\n  \"bracketSpacing\": true,\n  \"singleQuote\": false,\n  \"trailingComma\": \"es5\",\n  \"arrowParens\": \"avoid\"\n}"
  },
  {
    "path": "packages/plugins/plugin-cert/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n### Performance Improvements\n\n* 支持邮箱发送证书 ([95332d5](https://github.com/certd/certd/commit/95332d5db96cd54ddab6ab737332417a09169b39))\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n### Performance Improvements\n\n* 支持自动选择校验方式申请证书 ([3f99432](https://github.com/certd/certd/commit/3f9943270cfb12946e38e6272bc5e8d95ad6ab9e))\n* OpenAPI支持autoApply参数 ([42f4d14](https://github.com/certd/certd/commit/42f4d1477dc791520a874aed56035abcbc8c433b))\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n### Performance Improvements\n\n* 优化证书进度条颜色 ([2af91db](https://github.com/certd/certd/commit/2af91dbf2ae36a4ed17c6788bc2a2a79a3bb29f8))\n* 支持部署到阿里云vod ([98da4e1](https://github.com/certd/certd/commit/98da4e1791ed8bb21daf2a9914fda875d14633c9))\n* output-selector from参数支持更丰富的过滤规则 ([87853a2](https://github.com/certd/certd/commit/87853a201535f3bfe8505c40f8f5229d82ffcc73))\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n### Performance Improvements\n\n* 模版导入流水线 ([dcc8c56](https://github.com/certd/certd/commit/dcc8c569693432579709ce63656665a76bcf9a44))\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n### Bug Fixes\n\n* 某些证书提供商的证书确实commonName导致无法转换证书的问题 ([ac87bc5](https://github.com/certd/certd/commit/ac87bc57e957ea4679707bfd38d6840e26319bed))\n\n### Performance Improvements\n\n* 证书申请支持letencrypt profile选项 ([2eb0e54](https://github.com/certd/certd/commit/2eb0e54909d8ad36708e07c12fd598998159bc43))\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n### Features\n\n* **lego:** support for command options ([b84159f](https://github.com/certd/certd/commit/b84159f2f11531f058837c2e82d66499f3740f20))\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n### Bug Fixes\n\n* 修复中文域名使用cname方式校验无法通过的问题 ([f7d5baa](https://github.com/certd/certd/commit/f7d5baa6d04cb83c572b06e62f885890cfa0143a))\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n### Performance Improvements\n\n* 邮箱支持保存和选择 ([f7b0b44](https://github.com/certd/certd/commit/f7b0b44ef6044bec36510a6f0b06d8dca5bfce49))\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n### Bug Fixes\n\n* 修复证书申请任务无法修改dns提供商类型的bug ([8802274](https://github.com/certd/certd/commit/88022747bebe2054223e0241d68d410771405e68))\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n### Bug Fixes\n\n* 修复公共插件配置修改不生效的bug，优化系统设置参数注入时机 ([e1e510c](https://github.com/certd/certd/commit/e1e510ce1e37a5ae82478226b6987a83f22d1ecb))\n* 修复lego模式下每次都重新申请证书的bug ([f807b8c](https://github.com/certd/certd/commit/f807b8cb465cc329fa034ecbef94e18ef394f870))\n* **cert:** 修正证书过期时间计算逻辑 ([a3086e6](https://github.com/certd/certd/commit/a3086e6a5bec8b07f5e1d21a2ca8bd969c75bd5c))\n\n### Performance Improvements\n\n* 添加阿里云 ESA证书部署插件 ([1db1ffd](https://github.com/certd/certd/commit/1db1ffde99ac7e4684fa606ebc4c327f829b3a26))\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n### Bug Fixes\n\n* 根据SOA记录判断子域名托管有缺陷，改回手动配置子域名托管记录的方式 ([1b280a2](https://github.com/certd/certd/commit/1b280a2940f9e2d919b0bf23b89cc185be1fa498))\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n### Bug Fixes\n\n* 修复http上传方式无法清除记录文件的bug ([72a7b51](https://github.com/certd/certd/commit/72a7b51d479602b2c54c6c3ac8d8a0dcb9664e73))\n\n### Performance Improvements\n\n* 从域名的soa获取主域名，子域名托管无需额外配置 ([a586a92](https://github.com/certd/certd/commit/a586a92d5e32ea846ac37be52a7ad8c328d89966))\n* 数据库备份支持oss ([308d460](https://github.com/certd/certd/commit/308d4600efe2002f199c33b4594d3071784e58ea))\n* 支持阿里云中文域名申请 ([b3468cf](https://github.com/certd/certd/commit/b3468cf7f28228d7c9cf68de6b5a9bbeb67f2c6d))\n* 支持中文域名 ([162ebfd](https://github.com/certd/certd/commit/162ebfd4e0c25727efb33952d3bbf7420a02e2c3))\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n### Bug Fixes\n\n* 修复eab授权，没有email绑定的bug ([2f1683b](https://github.com/certd/certd/commit/2f1683b26acebbfb7d6e2d751435be04a4e7cab4))\n\n### Features\n\n* **lego:** support set key type ([f3bf4fa](https://github.com/certd/certd/commit/f3bf4faee0be5bdbfdbcf70a502849ed4c8ed4c4))\n\n### Performance Improvements\n\n* 增加手动上传证书功能说明 ([5d083a1](https://github.com/certd/certd/commit/5d083a153637caddbc6f44e915d9fb2d1ae87b33))\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n### Performance Improvements\n\n* 支持京东云dns申请证书 ([04d79f9](https://github.com/certd/certd/commit/04d79f9117670be504960b018fd49ae3bf7c1c11))\n\n## [1.31.10](https://github.com/certd/certd/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.31.9](https://github.com/certd/certd/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n### Bug Fixes\n\n* 修复lego模式无法创建流水线的bug ([687bb8a](https://github.com/certd/certd/commit/687bb8a2376d0de7b72739a174e4a9560581f866))\n\n## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n### Bug Fixes\n\n* 修复dns.la域名申请失败的bug ([1de8eee](https://github.com/certd/certd/commit/1de8eee6ea8307f3c11626af75303d3cc104bb95))\n\n### Performance Improvements\n\n* 流水线增加上传证书快捷方式 ([425bba6](https://github.com/certd/certd/commit/425bba67c539b734e2a85a83a4f9ecc9b2434fb4))\n* 手动上传证书部署流水线 ([fbb66f3](https://github.com/certd/certd/commit/fbb66f3c4389489aa8a43b194d82bc8cf391607b))\n* 支持手动上传证书并部署 ([a9fffa5](https://github.com/certd/certd/commit/a9fffa5180c83da27b35886aa2e858a92a2c5f94))\n\n## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n### Performance Improvements\n\n* 1panel支持 apikey方式授权 ([170b2af](https://github.com/certd/certd/commit/170b2afb0e3b125e4ed057f633fe895b5ac3ac22))\n\n## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n### Bug Fixes\n\n* 修复cname记录查找bug ([95fb4e3](https://github.com/certd/certd/commit/95fb4e3e8be6ca13cc43b451f6141d62190ba453))\n\n## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n### Performance Improvements\n\n* http方式校验，选择sftp时，支持修改文件访问权限比如777 ([15d6eaf](https://github.com/certd/certd/commit/15d6eaf5532ed25acd4f8d58c429353a2f44206c))\n\n# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n### Bug Fixes\n\n* 修复namesilo ttl太短的问题 ([865f26d](https://github.com/certd/certd/commit/865f26d75c0d3dd4dc8b41448f8830068e45957c))\n\n### Performance Improvements\n\n* 证书仓库 ([91e7f45](https://github.com/certd/certd/commit/91e7f45a1c5ea1e0ec0aa3236b80028f03a6d0aa))\n\n## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n### Bug Fixes\n\n* 修复复制到本机插件，pfx格式复制时报错的bug ([f57116d](https://github.com/certd/certd/commit/f57116d2bebf33e47ad93e0b39c4efe8e4aea25c))\n\n## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n### Performance Improvements\n\n* 优化acme sdk ([54db744](https://github.com/certd/certd/commit/54db74428259de64d12230c2ab7353ae11197bbc))\n* 支持http校验方式申请证书 ([405591c](https://github.com/certd/certd/commit/405591c5d08fa1a3b228ee3980199e7731cfec4a))\n* http校验方式，支持七牛云oss、阿里云oss、腾讯云cos ([3f74d4d](https://github.com/certd/certd/commit/3f74d4d9e5f5d0e629b44cff1895b3f7a8fbcafc))\n\n## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n### Bug Fixes\n\n* 修复左侧菜单收起时无法展开子菜单的bug ([0056223](https://github.com/certd/certd/commit/005622307e612717a5408aa1484717ef03003a22))\n\n### Performance Improvements\n\n* 调整创建证书表单字段的顺序 ([d393521](https://github.com/certd/certd/commit/d3935219f2aa50d6662c5b5ebf7ee25ad696ab2b))\n* 优化证书申请跳过的状态显示，成功通知现在在跳过时不会发送 ([67d762b](https://github.com/certd/certd/commit/67d762b6a520f1fa24719a124e5ae975a81f5f82))\n* 站点证书监控通知发送，每天定时检查 ([bb4910f](https://github.com/certd/certd/commit/bb4910f4e57234e42b44505f4620ae7af66025c5))\n* 支持一体证书 ([53c38cf](https://github.com/certd/certd/commit/53c38cf714a6f7486abbf1d71c9f48f56a790100))\n\n## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n### Bug Fixes\n\n* 修复没有配置eab时，报order无法读取的问题 ([657a2ae](https://github.com/certd/certd/commit/657a2ae032e6f61ac27fbdd26c7bf169c041219e))\n\n### Performance Improvements\n\n* 通知标题优化 ([ff083ce](https://github.com/certd/certd/commit/ff083ce6848a8bee3c8248e4b881086ae1517c28))\n\n## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n### Features\n\n* 手机号登录、邮箱验证码注册 ([7b55337](https://github.com/certd/certd/commit/7b55337c5edb470cca7aa62201eda8d274784004))\n\n### Performance Improvements\n\n* 部署到IIS插件 ([1534f45](https://github.com/certd/certd/commit/1534f4523633265d219d7b3a249a9ea1af99c512))\n* 选项显示图标 ([aedc462](https://github.com/certd/certd/commit/aedc46213571a3bd93809b7af7fa17a08d546237))\n* 优化证书申请成功通知发送方式 ([8002a56](https://github.com/certd/certd/commit/8002a56efc5998aa03db5711ae87f9eb4bc9e160))\n\n## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n### Performance Improvements\n\n* 谷歌EAB绑定邮箱改成必填 ([81a8123](https://github.com/certd/certd/commit/81a8123725d7bf4bd6a32a64a066bd760b7b6a7f))\n* 优化插件开发，dnsProvider无需写http logger 变量 ([fcbb5e4](https://github.com/certd/certd/commit/fcbb5e46a112174150a62648319b8224fce3b7ed))\n* 支持企业微信群聊机器人通知 ([b805a29](https://github.com/certd/certd/commit/b805a2925984144a31575b8aaa622f0c30d41b56))\n\n## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n### Bug Fixes\n\n* 修复1Panel面板本身证书更新导致判定执行失败的问题 ([2689e6d](https://github.com/certd/certd/commit/2689e6d6c03aba21da90d5d45232c6ba08696be1))\n\n### Performance Improvements\n\n* 新手导航在非编辑模式下不显示 ([18bfcc2](https://github.com/certd/certd/commit/18bfcc24ad0bde57bb04db8a4209861ec6b8ff1d))\n* 支持namesilo ([80159ec](https://github.com/certd/certd/commit/80159ecca895103d0495f3217311199e66056572))\n* 专业版试用，无需绑定账号 ([c7c4318](https://github.com/certd/certd/commit/c7c4318c11b65a76089787aa58939832d338a232))\n\n## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n### Bug Fixes\n\n* 修复未设置pfx密码，导致jks转换报错的bug ([c3cfbd8](https://github.com/certd/certd/commit/c3cfbd8474155aed4379f91075de37d5d8c73ef0))\n\n## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n### Performance Improvements\n\n* 支持jks ([889eaae](https://github.com/certd/certd/commit/889eaaea92818f628b922dae540c026630611707))\n\n## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n### Performance Improvements\n\n* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941))\n\n## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n### Bug Fixes\n\n* pfx兼容windows server 2016 ([e5e468a](https://github.com/certd/certd/commit/e5e468a463f66d02f235de54b7c1e09ace5f1cb1))\n\n### Features\n\n* 首页全新改版 ([63ec5b5](https://github.com/certd/certd/commit/63ec5b5519c760a3330569c0da6dac157302a330))\n\n### Performance Improvements\n\n* lego 升级到 4.19.2 ([129bf53](https://github.com/certd/certd/commit/129bf53edc9bbb001fe49fbd7e239bd1d09cc128))\n\n## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n### Bug Fixes\n\n* 修复lego No help topic for 错误 ([aaaf8d7](https://github.com/certd/certd/commit/aaaf8d7db34896cf8f2ff8f12eec1ab0cae58f0f))\n\n## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n### Performance Improvements\n\n* 默认证书更新时间设置为35天，增加腾讯云删除过期证书插件，可以避免腾讯云过期证书邮件 ([51b6fed](https://github.com/certd/certd/commit/51b6fed468eaa6f28ce4497ce303ace1a52abb96))\n\n## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n### Bug Fixes\n\n* deprecated的运行时不要报错，只报警告 ([bcbefaa](https://github.com/certd/certd/commit/bcbefaaa35cf6d0eec085b3a2c5bfc7c6a8de9e1))\n\n## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n### Performance Improvements\n\n* 支持配置公共ZeroSSL授权 ([a90d1e6](https://github.com/certd/certd/commit/a90d1e68ee9cbc3705223457b8a86f071b150968))\n\n## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n### Performance Improvements\n\n* 申请证书启用新的反代地址 ([a705182](https://github.com/certd/certd/commit/a705182b85e51157883e48f23463263793bf3c12))\n* 优化证书申请速度和成功率，反代地址优化，google基本可以稳定请求。增加请求重试。 ([41d9c3a](https://github.com/certd/certd/commit/41d9c3ac8398def541e65351cbe920d4a927182d))\n* 优化pfx密码密码输入框，让浏览器不自动填写密码 ([ffeede3](https://github.com/certd/certd/commit/ffeede38afa70c5ff6f2015516bead23d2c4df87))\n\n## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n### Bug Fixes\n\n* 修复cname服务普通用户access访问权限问题 ([c1e3e2e](https://github.com/certd/certd/commit/c1e3e2ee1f923ee5806479dd5f178c3286a01ae0))\n\n## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n### Performance Improvements\n\n* 触发证书重新申请input变化对比规则优化，减少升级版本后触发申请证书的情况 ([c46a2a9](https://github.com/certd/certd/commit/c46a2a9a399c2a9a8bb59a48b9fb6e93227cce9b))\n\n## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n### Performance Improvements\n\n* 密钥备份 ([1c6028a](https://github.com/certd/certd/commit/1c6028abcf8849163462bb2f8441b6838357e09b))\n* 证书直接查看 ([5dde5bd](https://github.com/certd/certd/commit/5dde5bd3f76db3959d411619d29bfb8064e3b307))\n* sqlite数据库备份插件 ([77f1631](https://github.com/certd/certd/commit/77f163144f7dcfb0431475c55508fecfd6d969f8))\n\n## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n### Performance Improvements\n\n* [comm] 支持插件管理 ([e8b617b](https://github.com/certd/certd/commit/e8b617b80ce882dd63006f0cfc719a80a1cc6acc))\n* 新增代理设置功能 ([273ab61](https://github.com/certd/certd/commit/273ab6139f5807f4d7fe865cc353b97f51b9a668))\n* EAB授权支持绑定邮箱，支持公共EAB设置 ([07043af](https://github.com/certd/certd/commit/07043aff0ca7fd29c56dd3c363002cb15d78b464))\n\n## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n### Features\n\n* 域名验证方法支持CNAME间接方式，此方式支持所有域名注册商，且无需提供Access授权，但是需要手动添加cname解析 ([f3d3508](https://github.com/certd/certd/commit/f3d35084ed44f9f33845f7045e520be5c27eed93))\n\n### Performance Improvements\n\n* 调整静态资源到static目录 ([0584b36](https://github.com/certd/certd/commit/0584b3672b40f9042a2ed87e5627022606d046cd))\n* 检查cname是否正确配置 ([b5d8935](https://github.com/certd/certd/commit/b5d8935159374fbe7fc7d4c48ae0ed9396861bdd))\n* 域名输入增加校验提示，避免输入错误的域名 ([0c8e83e](https://github.com/certd/certd/commit/0c8e83e1254a9ce4d5a4e7888eb1710394a4b77c))\n* cname校验配置增加未校验通过提示 ([77cc3c4](https://github.com/certd/certd/commit/77cc3c4a5cbd81f8233a8e0bb33fab0621c0905f))\n* google eab授权支持自动获取，不过要配置代理 ([592791d](https://github.com/certd/certd/commit/592791d1356fc252fbb70d7f168567aee9585507))\n\n## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)\n\n### Bug Fixes\n\n* 修复西部数码账户级别apikey不可用的bug ([f8f3e8b](https://github.com/certd/certd/commit/f8f3e8b43fd5d815887bcb53b95f46dc96424b79))\n\n## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)\n\n### Bug Fixes\n\n* 修复pfxPassword无效的bug ([251e450](https://github.com/certd/certd/commit/251e450fabfe62405bac13e39f2153736c081ef0))\n\n## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)\n\n### Performance Improvements\n\n* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))\n\n## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)\n\n### Features\n\n* 支持中间证书 ([e86756e](https://github.com/certd/certd/commit/e86756e4c65a53dd23106d7ecbfe2fa987cc13f3))\n\n### Performance Improvements\n\n* 证书支持旧版RSA，pkcs1 ([3d9c3ec](https://github.com/certd/certd/commit/3d9c3ecb3eb604b2458154f608bde0f01915d116))\n* plugins增加图标 ([a8da658](https://github.com/certd/certd/commit/a8da658a9723342b4f43a579f7805bfef0648efb))\n\n## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09)\n\n### Performance Improvements\n\n* 支持群晖 ([5c270b6](https://github.com/certd/certd/commit/5c270b6b9d45a2152f9fdb3c07bd98b7c803cb8e))\n\n## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.24.2](https://github.com/certd/certd/compare/v1.24.1...v1.24.2) (2024-09-06)\n\n### Performance Improvements\n\n* 任务配置不需要的字段可以自动隐藏 ([192d9dc](https://github.com/certd/certd/commit/192d9dc7e36737d684c769f255f407c28b1152ac))\n* 修复windows下无法执行第二条命令的bug ([d5bfcdb](https://github.com/certd/certd/commit/d5bfcdb6de1dcc1702155442e2e00237d0bbb6e5))\n* 优化跳过处理逻辑 ([b80210f](https://github.com/certd/certd/commit/b80210f24bf5db1c958d06ab27c9e5d3db452eda))\n* 支持pfx、der ([fbeaed2](https://github.com/certd/certd/commit/fbeaed203519f59b6d9396c4e8953353ccb5e723))\n\n## [1.24.1](https://github.com/certd/certd/compare/v1.24.0...v1.24.1) (2024-09-02)\n\n### Performance Improvements\n\n* 授权配置支持加密 ([42a56b5](https://github.com/certd/certd/commit/42a56b581d754c3e5f9838179d19ab0d004ef2eb))\n\n# [1.24.0](https://github.com/certd/certd/compare/v1.23.1...v1.24.0) (2024-08-25)\n\n### Bug Fixes\n\n* 修复成功后跳过之后丢失腾讯云证书id的bug ([37eb762](https://github.com/certd/certd/commit/37eb762afe25c5896b75dee25f32809f8426e7b7))\n* 修复创建流水线后立即运行时报no id错误的bug ([17ead54](https://github.com/certd/certd/commit/17ead547aab25333603980304aa3aad3db1f73d5))\n* 修复使用代理的情况下申请证书失败的bug ([95122e2](https://github.com/certd/certd/commit/95122e28609333f4df55c266e5434897954c0fb3))\n\n### Features\n\n* 支持ECC类型 ([a7424e0](https://github.com/certd/certd/commit/a7424e02f5c7e02ac1688791040785920ce67473))\n\n### Performance Improvements\n\n* 更新k8s底层api库 ([746bb9d](https://github.com/certd/certd/commit/746bb9d385e2f397daef4976eca1d4782a2f5ebd))\n* 优化成功后跳过的提示 ([7b451bb](https://github.com/certd/certd/commit/7b451bbf6e6337507f4627b5a845f5bd96ab4f7b))\n* 优化证书申请成功率 ([968c469](https://github.com/certd/certd/commit/968c4690a07f69c08dcb3d3a494da4e319627345))\n\n## [1.23.1](https://github.com/certd/certd/compare/v1.23.0...v1.23.1) (2024-08-06)\n\n### Performance Improvements\n\n* 优化插件字段的default value ([24c7be2](https://github.com/certd/certd/commit/24c7be2c9cb39c14f7a97b674127c88033280b02))\n\n## [1.22.8](https://github.com/certd/certd/compare/v1.22.7...v1.22.8) (2024-08-05)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.22.7](https://github.com/certd/certd/compare/v1.22.6...v1.22.7) (2024-08-04)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.22.6](https://github.com/certd/certd/compare/v1.22.5...v1.22.6) (2024-08-03)\n\n### Performance Improvements\n\n* 流水线支持名称模糊查询 ([59897c4](https://github.com/certd/certd/commit/59897c4ceae992ebe2972ca9e8f9196616ffdfd7))\n\n## [1.22.5](https://github.com/certd/certd/compare/v1.22.4...v1.22.5) (2024-07-26)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.22.4](https://github.com/certd/certd/compare/v1.22.3...v1.22.4) (2024-07-26)\n\n### Performance Improvements\n\n* 证书申请支持反向代理，letsencrypt无法访问时的备用方案 ([b7b5df0](https://github.com/certd/certd/commit/b7b5df0587e0f7ea288c1b2af6f87211f207395f))\n\n## [1.22.3](https://github.com/certd/certd/compare/v1.22.2...v1.22.3) (2024-07-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.22.2](https://github.com/certd/certd/compare/v1.22.1...v1.22.2) (2024-07-23)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20)\n\n### Performance Improvements\n\n* 创建证书任务可以选择lege插件 ([affef13](https://github.com/certd/certd/commit/affef130378030c517250c58a4e787b0fc85d7d1))\n\n# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)\n\n### Features\n\n* 升级midway，支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))\n* 支持lego，海量DNS提供商 ([0bc6d0a](https://github.com/certd/certd/commit/0bc6d0a211920fb0084d705e1db67ee1e7262c44))\n\n## [1.21.2](https://github.com/certd/certd/compare/v1.21.1...v1.21.2) (2024-07-08)\n\n### Performance Improvements\n\n* 申请证书时可以选择跳过本地dns校验 ([fe91d94](https://github.com/certd/certd/commit/fe91d94090d22ed0a3ea753ba74dfaa1bf057c17))\n\n## [1.21.1](https://github.com/certd/certd/compare/v1.21.0...v1.21.1) (2024-07-08)\n\n### Performance Improvements\n\n* 说明优化，默认值优化 ([970c7fd](https://github.com/certd/certd/commit/970c7fd8a0f557770e973d8462ee5684ef742810))\n\n# [1.21.0](https://github.com/certd/certd/compare/v1.20.17...v1.21.0) (2024-07-03)\n\n### Features\n\n* 支持zero ssl ([eade2c2](https://github.com/certd/certd/commit/eade2c2b681569f03e9cd466e7d5bcd6703ed492))\n\n## [1.20.17](https://github.com/certd/certd/compare/v1.20.16...v1.20.17) (2024-07-03)\n\n### Performance Improvements\n\n* 优化cname verify ([eba333d](https://github.com/certd/certd/commit/eba333de7a5b5ef4b0b7eaa904f578720102fa61))\n\n## [1.20.16](https://github.com/certd/certd/compare/v1.20.15...v1.20.16) (2024-07-01)\n\n### Bug Fixes\n\n* 修复配置了cdn cname后申请失败的bug ([4a5fa76](https://github.com/certd/certd/commit/4a5fa767edc347d03d29a467e86c9a4d70b0220c))\n\n## [1.20.15](https://github.com/certd/certd/compare/v1.20.14...v1.20.15) (2024-06-28)\n\n### Performance Improvements\n\n* 腾讯云dns provider 支持腾讯云的accessId ([e0eb3a4](https://github.com/certd/certd/commit/e0eb3a441384d474fe2923c69b25318264bdc9df))\n\n## [1.20.14](https://github.com/certd/certd/compare/v1.20.13...v1.20.14) (2024-06-23)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.20.13](https://github.com/certd/certd/compare/v1.20.12...v1.20.13) (2024-06-18)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.20.12](https://github.com/certd/certd/compare/v1.20.10...v1.20.12) (2024-06-17)\n\n### Bug Fixes\n\n* 修复aliyun域名超过100个找不到域名的bug ([5b1494b](https://github.com/certd/certd/commit/5b1494b3ce93d1026dc56ee741342fbb8bf7be24))\n\n### Performance Improvements\n\n* 支持cloudflare域名 ([fbb9a47](https://github.com/certd/certd/commit/fbb9a47e8f7bb805289b9ee64bd46ffee0f01c06))\n\n## [1.20.10](https://github.com/certd/certd/compare/v1.20.9...v1.20.10) (2024-05-30)\n\n### Performance Improvements\n\n* 上传到主机插件支持复制到本机路径 ([92446c3](https://github.com/certd/certd/commit/92446c339936f98f08f654b8971a7393d8435224))\n* 优化文件下载包名 ([d9eb927](https://github.com/certd/certd/commit/d9eb927b0a1445feab08b1958aa9ea80637a5ae6))\n\n## [1.20.9](https://github.com/certd/certd/compare/v1.20.8...v1.20.9) (2024-03-22)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.20.8](https://github.com/certd/certd/compare/v1.20.7...v1.20.8) (2024-03-22)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.20.7](https://github.com/certd/certd/compare/v1.20.6...v1.20.7) (2024-03-22)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.20.6](https://github.com/certd/certd/compare/v1.20.5...v1.20.6) (2024-03-21)\n\n### Performance Improvements\n\n* 插件贡献文档及示例 ([72fb20a](https://github.com/certd/certd/commit/72fb20abf3ba5bdd862575d2907703a52fd7eb17))\n\n## [1.20.5](https://github.com/certd/certd/compare/v1.20.2...v1.20.5) (2024-03-11)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.20.2](https://github.com/certd/certd/compare/v1.2.1...v1.20.2) (2024-02-28)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.2.1](https://github.com/certd/certd/compare/v1.2.0...v1.2.1) (2023-12-12)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.2.0](https://github.com/certd/certd/compare/v1.1.6...v1.2.0) (2023-10-27)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.1.6](https://github.com/certd/certd/compare/v1.1.5...v1.1.6) (2023-07-10)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.1.5](https://github.com/certd/certd/compare/v1.1.4...v1.1.5) (2023-07-03)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.1.4](https://github.com/certd/certd/compare/v1.1.3...v1.1.4) (2023-07-03)\n\n### Performance Improvements\n\n* timeout ([3eeb1f7](https://github.com/certd/certd/commit/3eeb1f77aa2922f3545f3d2067f561d95621d54f))\n\n## [1.1.3](https://github.com/certd/certd/compare/v1.1.2...v1.1.3) (2023-07-03)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.1.2](https://github.com/certd/certd/compare/v1.1.1...v1.1.2) (2023-07-03)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.1.1](https://github.com/certd/certd/compare/v1.1.0...v1.1.1) (2023-06-28)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.1.0](https://github.com/certd/certd/compare/v1.0.6...v1.1.0) (2023-06-28)\n\n### Bug Fixes\n\n* 修复access选择类型trigger ([2851a33](https://github.com/certd/certd/commit/2851a33eb2510f038fadb55da29512597a4ba512))\n\n### Features\n\n* save files ([99522fb](https://github.com/certd/certd/commit/99522fb49adb42c1dfdf7bec3dd52d641158285b))\n* save files ([671d273](https://github.com/certd/certd/commit/671d273e2f9136d16896536b0ca127cf372f1619))\n\n## [1.0.6](https://github.com/certd/certd/compare/v1.0.5...v1.0.6) (2023-05-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.0.5](https://github.com/certd/certd/compare/v1.0.4...v1.0.5) (2023-05-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.0.4](https://github.com/certd/certd/compare/v1.0.3...v1.0.4) (2023-05-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.0.3](https://github.com/certd/certd/compare/v1.0.2...v1.0.3) (2023-05-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.0.2](https://github.com/certd/certd/compare/v1.0.1...v1.0.2) (2023-05-24)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.0.1](https://github.com/certd/certd/compare/v1.0.0...v1.0.1) (2023-05-24)\n\n**Note:** Version bump only for package @certd/plugin-cert\n"
  },
  {
    "path": "packages/plugins/plugin-cert/LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "packages/plugins/plugin-cert/README.md",
    "content": "# Vue 3 + TypeScript + Vite\n\nThis template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.\n\n## Recommended IDE Setup\n\n- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar)\n\n## Type Support For `.vue` Imports in TS\n\nSince TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates. However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can enable Volar's Take Over mode by following these steps:\n\n1. Run `Extensions: Show Built-in Extensions` from VS Code's command palette, look for `TypeScript and JavaScript Language Features`, then right click and select `Disable (Workspace)`. By default, Take Over mode will enable itself if the default TypeScript extension is disabled.\n2. Reload the VS Code window by running `Developer: Reload Window` from the command palette.\n\nYou can learn more about Take Over mode [here](https://github.com/johnsoncodehk/volar/discussions/471).\n"
  },
  {
    "path": "packages/plugins/plugin-cert/package.json",
    "content": "{\n  \"name\": \"@certd/plugin-cert\",\n  \"private\": false,\n  \"version\": \"1.36.10\",\n  \"type\": \"module\",\n  \"main\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.ts\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"before-build\": \"rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache\",\n    \"build\": \"npm run before-build &&tsc --skipLibCheck\",\n    \"dev-build\": \"npm run build\",\n    \"build3\": \"rollup -c\",\n    \"build2\": \"vue-tsc --noEmit && vite build\",\n    \"preview\": \"vite preview\",\n    \"pub\": \"npm publish\"\n  },\n  \"dependencies\": {\n    \"@certd/acme-client\": \"^1.36.10\",\n    \"@certd/basic\": \"^1.36.10\",\n    \"@certd/pipeline\": \"^1.36.10\",\n    \"@certd/plugin-lib\": \"^1.36.10\",\n    \"@google-cloud/publicca\": \"^1.3.0\",\n    \"dayjs\": \"^1.11.7\",\n    \"jszip\": \"^3.10.1\",\n    \"lodash-es\": \"^4.17.21\",\n    \"psl\": \"^1.9.0\",\n    \"punycode.js\": \"^2.3.1\",\n    \"rimraf\": \"^5.0.5\"\n  },\n  \"devDependencies\": {\n    \"@types/chai\": \"^4.3.3\",\n    \"@types/mocha\": \"^10.0.0\",\n    \"@types/psl\": \"^1.1.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.26.1\",\n    \"@typescript-eslint/parser\": \"^8.26.1\",\n    \"chai\": \"^4.3.6\",\n    \"eslint\": \"^8.24.0\",\n    \"eslint-config-prettier\": \"^8.5.0\",\n    \"eslint-plugin-prettier\": \"^4.2.1\",\n    \"mocha\": \"^10.1.0\",\n    \"prettier\": \"^2.8.8\",\n    \"tslib\": \"^2.8.1\",\n    \"typescript\": \"^5.4.2\"\n  },\n  \"gitHead\": \"085bdf5cfa9140903611aa12cdd2542d05aba321\"\n}\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/access/eab-access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from \"@certd/pipeline\";\n\n@IsAccess({\n  name: \"eab\",\n  title: \"EAB授权\",\n  desc: \"ZeroSSL证书申请需要EAB授权\",\n  icon: \"ic:outline-lock\",\n})\nexport class EabAccess extends BaseAccess {\n  @AccessInput({\n    title: \"KID\",\n    component: {\n      placeholder: \"kid / keyId\",\n    },\n    helper: \"EAB KID， google的叫 keyId\",\n    required: true,\n    encrypt: true,\n  })\n  kid = \"\";\n  @AccessInput({\n    title: \"HMACKey\",\n    component: {\n      placeholder: \"HMAC Key / b64MacKey\",\n    },\n    helper: \"EAB HMAC Key ，google的叫b64MacKey\",\n    required: true,\n    encrypt: true,\n  })\n  hmacKey = \"\";\n\n  @AccessInput({\n    title: \"email\",\n    component: {\n      placeholder: \"绑定一个邮箱\",\n    },\n    rules: [{ type: \"email\", message: \"请输入正确的邮箱\" }],\n    helper: \"Google的EAB申请证书，更换邮箱会导致EAB失效，可以在此处绑定一个邮箱避免此问题\",\n    required: true,\n  })\n  email = \"\";\n}\n\nnew EabAccess();\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/access/google-access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from \"@certd/pipeline\";\n\n@IsAccess({\n  name: \"google\",\n  title: \"google cloud\",\n  desc: \"谷歌云授权\",\n  icon: \"flat-color-icons:google\",\n})\nexport class GoogleAccess extends BaseAccess {\n  @AccessInput({\n    title: \"密钥类型\",\n    value: \"serviceAccount\",\n    component: {\n      placeholder: \"密钥类型\",\n      name: \"a-select\",\n      vModel: \"value\",\n      options: [\n        { value: \"serviceAccount\", label: \"服务账号密钥\" },\n        { value: \"apiKey\", label: \"ApiKey，暂不可用\", disabled: true },\n      ],\n    },\n    helper: \"密钥类型\",\n    required: true,\n    encrypt: false,\n  })\n  type = \"\";\n\n  @AccessInput({\n    title: \"项目ID\",\n    component: {\n      placeholder: \"ProjectId\",\n    },\n    helper: \"ProjectId\",\n    required: true,\n    encrypt: false,\n    mergeScript: `\n    return {\n      show:ctx.compute(({form})=>{\n        return form.access.type === 'apiKey'\n      })\n    }\n    `,\n  })\n  projectId = \"\";\n\n  @AccessInput({\n    title: \"ApiKey\",\n    component: {\n      placeholder: \"ApiKey\",\n    },\n    helper: \"不要选，目前没有用\",\n    required: true,\n    encrypt: true,\n    mergeScript: `\n    return {\n      show:ctx.compute(({form})=>{\n        return form.access.type === 'apiKey'\n      })\n    }\n    `,\n  })\n  apiKey = \"\";\n\n  @AccessInput({\n    title: \"服务账号密钥\",\n    component: {\n      placeholder: \"serviceAccountSecret\",\n      name: \"a-textarea\",\n      vModel: \"value\",\n      rows: 4,\n    },\n    helper:\n      \"[如何创建服务账号](https://cloud.google.com/iam/docs/service-accounts-create?hl=zh-CN) \\n[获取密钥](https://console.cloud.google.com/iam-admin/serviceaccounts?hl=zh-cn)，点击详情，点击创建密钥，将下载json文件，把内容填在此处\",\n    required: true,\n    encrypt: true,\n    mergeScript: `\n    return {\n      show:ctx.compute(({form})=>{\n        return form.access.type === 'serviceAccount'\n      })\n    }\n    `,\n  })\n  serviceAccountSecret = \"\";\n\n  @AccessInput({\n    title: \"https代理\",\n    component: {\n      placeholder: \"http://127.0.0.1:10811\",\n    },\n    helper: \"Google的请求需要走代理，如果不配置，则会使用环境变量中的全局HTTPS_PROXY配置\\n或者服务器本身在海外，则不需要配置\",\n    required: false,\n    encrypt: false,\n  })\n  httpsProxy = \"\";\n}\n\nnew GoogleAccess();\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/access/index.ts",
    "content": "export * from \"./eab-access.js\";\nexport * from \"./google-access.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/dns-provider/api.ts",
    "content": "import { HttpClient, ILogger, utils } from \"@certd/basic\";\nimport { IAccess, Registrable } from \"@certd/pipeline\";\n\nexport type DnsProviderDefine = Registrable & {\n  accessType: string;\n  icon?: string;\n};\n\nexport type CreateRecordOptions = {\n  domain: string;\n  fullRecord: string;\n  hostRecord: string;\n  type: string;\n  value: any;\n};\nexport type RemoveRecordOptions<T> = {\n  recordReq: CreateRecordOptions;\n  // 本次创建的dns解析记录，实际上就是createRecord接口的返回值\n  recordRes: T;\n};\n\nexport type DnsProviderContext = {\n  access: IAccess;\n  logger: ILogger;\n  http: HttpClient;\n  utils: typeof utils;\n  domainParser: IDomainParser;\n};\n\nexport interface IDnsProvider<T = any> {\n  onInstance(): Promise<void>;\n\n  /**\n   * 中文转英文\n   * @param domain\n   */\n  punyCodeEncode(domain: string): string;\n\n  /**\n   * 转中文域名\n   * @param domain\n   */\n  punyCodeDecode(domain: string): string;\n\n  createRecord(options: CreateRecordOptions): Promise<T>;\n\n  removeRecord(options: RemoveRecordOptions<T>): Promise<void>;\n\n  setCtx(ctx: DnsProviderContext): void;\n\n  //中文域名是否需要punycode转码，如果返回True，则使用punycode来添加解析记录，否则使用中文域名添加解析记录\n  usePunyCode(): boolean;\n}\n\nexport interface ISubDomainsGetter {\n  getSubDomains(): Promise<string[]>;\n}\n\nexport interface IDomainParser {\n  parse(fullDomain: string): Promise<string>;\n}\n\nexport type DnsVerifier = {\n  // dns直接校验\n  dnsProviderType?: string;\n  dnsProviderAccessId?: number;\n};\n\nexport type CnameVerifier = {\n  hostRecord: string;\n  domain: string;\n  recordValue: string;\n};\n\nexport type HttpVerifier = {\n  // http校验\n  httpUploaderType: string;\n  httpUploaderAccess: number;\n  httpUploadRootDir: string;\n};\nexport type DomainVerifier = {\n  domain: string;\n  mainDomain: string;\n  type: string;\n  dns?: DnsVerifier;\n  cname?: CnameVerifier;\n  http?: HttpVerifier;\n};\n\nexport type DomainVerifiers = {\n  [key: string]: DomainVerifier;\n};\n\nexport interface IDomainVerifierGetter {\n  getVerifiers(domains: string[]): Promise<DomainVerifiers>;\n}\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/dns-provider/base.ts",
    "content": "import { CreateRecordOptions, DnsProviderContext, DnsProviderDefine, IDnsProvider, RemoveRecordOptions } from \"./api.js\";\nimport { dnsProviderRegistry } from \"./registry.js\";\nimport { HttpClient, ILogger } from \"@certd/basic\";\nimport punycode from \"punycode.js\";\nexport abstract class AbstractDnsProvider<T = any> implements IDnsProvider<T> {\n  ctx!: DnsProviderContext;\n  http!: HttpClient;\n  logger!: ILogger;\n\n  usePunyCode(): boolean {\n    //是否使用punycode来添加解析记录\n    //默认都使用原始中文域名来添加\n    return false;\n  }\n\n  /**\n   * 中文转英文\n   * @param domain\n   */\n  punyCodeEncode(domain: string) {\n    return punycode.toASCII(domain);\n  }\n\n  /**\n   * 转中文域名\n   * @param domain\n   */\n  punyCodeDecode(domain: string) {\n    return punycode.toUnicode(domain);\n  }\n\n  setCtx(ctx: DnsProviderContext) {\n    this.ctx = ctx;\n    this.logger = ctx.logger;\n    this.http = ctx.http;\n  }\n\n  async parseDomain(fullDomain: string) {\n    return await this.ctx.domainParser.parse(fullDomain);\n  }\n\n  abstract createRecord(options: CreateRecordOptions): Promise<T>;\n\n  abstract onInstance(): Promise<void>;\n\n  abstract removeRecord(options: RemoveRecordOptions<T>): Promise<void>;\n}\n\nexport async function createDnsProvider(opts: { dnsProviderType: string; context: DnsProviderContext }): Promise<IDnsProvider> {\n  const { dnsProviderType, context } = opts;\n  const dnsProviderPlugin = dnsProviderRegistry.get(dnsProviderType);\n  const DnsProviderClass = await dnsProviderPlugin.target();\n  const dnsProviderDefine = dnsProviderPlugin.define as DnsProviderDefine;\n  if (dnsProviderDefine.deprecated) {\n    context.logger.warn(dnsProviderDefine.deprecated);\n  }\n  // @ts-ignore\n  const dnsProvider: IDnsProvider = new DnsProviderClass();\n  dnsProvider.setCtx(context);\n  await dnsProvider.onInstance();\n  return dnsProvider;\n}\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/dns-provider/decorator.ts",
    "content": "import { dnsProviderRegistry } from \"./registry.js\";\nimport { DnsProviderDefine } from \"./api.js\";\nimport { Decorator } from \"@certd/pipeline\";\nimport * as _ from \"lodash-es\";\n\n// 提供一个唯一 key\nexport const DNS_PROVIDER_CLASS_KEY = \"pipeline:dns-provider\";\n\nexport function IsDnsProvider(define: DnsProviderDefine): ClassDecorator {\n  return (target: any) => {\n    target = Decorator.target(target);\n\n    Reflect.defineMetadata(DNS_PROVIDER_CLASS_KEY, define, target);\n\n    target.define = define;\n    dnsProviderRegistry.register(define.name, {\n      define,\n      target: async () => {\n        return target;\n      },\n    });\n  };\n}\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/dns-provider/domain-parser.ts",
    "content": "import { IDomainParser, ISubDomainsGetter } from \"./api\";\n//@ts-ignore\nimport psl from \"psl\";\nimport { ILogger, utils, logger as globalLogger } from \"@certd/basic\";\nimport { resolveDomainBySoaRecord } from \"@certd/acme-client\";\n\nexport class DomainParser implements IDomainParser {\n  subDomainsGetter: ISubDomainsGetter;\n  logger: ILogger;\n  constructor(subDomainsGetter: ISubDomainsGetter, logger?: ILogger) {\n    this.subDomainsGetter = subDomainsGetter;\n    this.logger = logger || globalLogger;\n  }\n\n  parseDomainByPsl(fullDomain: string) {\n    const parsed = psl.parse(fullDomain) as psl.ParsedDomain;\n    if (parsed.error) {\n      throw new Error(`解析${fullDomain}域名失败:` + JSON.stringify(parsed.error));\n    }\n    return parsed.domain as string;\n  }\n\n  async parse(fullDomain: string) {\n    this.logger.info(`查找主域名:${fullDomain}`);\n    const cacheKey = `domain_parse:${fullDomain}`;\n    const value = utils.cache.get(cacheKey);\n    if (value) {\n      this.logger.info(`从缓存获取到主域名:${fullDomain}->${value}`);\n      return value;\n    }\n\n    const subDomains = await this.subDomainsGetter.getSubDomains();\n    if (subDomains && subDomains.length > 0) {\n      const fullDomainDot = \".\" + fullDomain;\n      for (const subDomain of subDomains) {\n        if (fullDomainDot.endsWith(\".\" + subDomain)) {\n          //找到子域名托管\n          utils.cache.set(cacheKey, subDomain, {\n            ttl: 60 * 1000,\n          });\n          this.logger.info(`获取到子域名托管域名:${fullDomain}->${subDomain}`);\n          return subDomain;\n        }\n      }\n    }\n\n    const res = this.parseDomainByPsl(fullDomain);\n    this.logger.info(`从psl获取主域名:${fullDomain}->${res}`);\n\n    let soaManDomain = null;\n    try {\n      const mainDomain = await resolveDomainBySoaRecord(fullDomain);\n      if (mainDomain) {\n        this.logger.info(`从SOA获取到主域名:${fullDomain}->${mainDomain}`);\n        soaManDomain = mainDomain;\n      }\n    } catch (e) {\n      this.logger.error(\"从SOA获取主域名失败\", e.message);\n    }\n    if (soaManDomain && soaManDomain !== res) {\n      this.logger.warn(`SOA获取的主域名（${soaManDomain}）和psl获取的主域名(${res})不一致，请确认是否有设置子域名托管`);\n    }\n\n    return res;\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/dns-provider/index.ts",
    "content": "export * from \"./api.js\";\nexport * from \"./registry.js\";\nexport * from \"./decorator.js\";\nexport * from \"./base.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/dns-provider/registry.ts",
    "content": "import { createRegistry } from \"@certd/pipeline\";\n\nexport const dnsProviderRegistry = createRegistry(\"dnsProvider\");\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/index.ts",
    "content": "export * from \"./access/index.js\";\nexport * from \"./plugin/index.js\";\nexport * from \"./dns-provider/index.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/libs/google.ts",
    "content": "import { EabAccess, GoogleAccess } from \"../access/index.js\";\nimport { ILogger } from \"@certd/basic\";\n\nexport class GoogleClient {\n  access: GoogleAccess;\n  logger: ILogger;\n  constructor(opts: { logger: ILogger; access: GoogleAccess }) {\n    this.access = opts.access;\n    this.logger = opts.logger;\n  }\n  async getEab() {\n    // https://cloud.google.com/docs/authentication/api-keys-use#using-with-client-libs\n    const { v1 } = await import(\"@google-cloud/publicca\");\n    // process.env.HTTPS_PROXY = \"http://127.0.0.1:10811\";\n    const access = this.access;\n    if (!access.serviceAccountSecret) {\n      throw new Error(\"服务账号密钥 不能为空\");\n    }\n    const credentials = JSON.parse(access.serviceAccountSecret);\n\n    const client = new v1.PublicCertificateAuthorityServiceClient({ credentials });\n    const parent = `projects/${credentials.project_id}/locations/global`;\n    const externalAccountKey = {};\n    const request = {\n      parent,\n      externalAccountKey,\n    };\n\n    let envHttpsProxy = \"\";\n    try {\n      if (this.access.httpsProxy) {\n        //设置临时使用代理\n        envHttpsProxy = process.env.HTTPS_PROXY;\n        process.env.HTTPS_PROXY = this.access.httpsProxy;\n      }\n      this.logger.info(\"开始获取google eab授权\");\n      const response = await client.createExternalAccountKey(request);\n      const { keyId, b64MacKey } = response[0];\n      const eabAccess = new EabAccess();\n      eabAccess.kid = keyId;\n      eabAccess.hmacKey = b64MacKey.toString();\n      this.logger.info(`google eab授权获取成功，kid: ${eabAccess.kid}`);\n      return eabAccess;\n    } finally {\n      if (envHttpsProxy) {\n        process.env.HTTPS_PROXY = envHttpsProxy;\n      }\n    }\n  }\n}\n\n// const access = new GoogleAccess();\n// access.projectId = \"hip-light-432411-d4\";\n// access.serviceAccountSecret = `\n//\n//\n// `;\n// // process.env.HTTPS_PROXY = \"http://127.0.0.1:10811\";\n// const client = new GoogleClient(access);\n// client.getEab().catch((e) => {\n//   console.error(e);\n// });\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/plugin/cert-plugin/acme.ts",
    "content": "// @ts-ignore\nimport * as acme from \"@certd/acme-client\";\nimport { ClientExternalAccountBindingOptions, UrlMapping } from \"@certd/acme-client\";\nimport * as _ from \"lodash-es\";\nimport { Challenge } from \"@certd/acme-client/types/rfc8555\";\nimport { IContext } from \"@certd/pipeline\";\nimport { ILogger, utils } from \"@certd/basic\";\nimport { IDnsProvider, IDomainParser } from \"../../dns-provider/index.js\";\nimport punycode from \"punycode.js\";\nimport { IOssClient } from \"@certd/plugin-lib\";\nexport type CnameVerifyPlan = {\n  type?: string;\n  domain: string;\n  fullRecord: string;\n  dnsProvider: IDnsProvider;\n};\n\nexport type HttpVerifyPlan = {\n  type: string;\n  domain: string;\n  httpUploader: IOssClient;\n};\n\nexport type DomainVerifyPlan = {\n  domain: string;\n  mainDomain: string;\n  type: \"cname\" | \"dns\" | \"http\";\n  dnsProvider?: IDnsProvider;\n  cnameVerifyPlan?: CnameVerifyPlan;\n  httpVerifyPlan?: HttpVerifyPlan;\n};\nexport type DomainsVerifyPlan = {\n  [key: string]: DomainVerifyPlan;\n};\n\nexport type Providers = {\n  dnsProvider?: IDnsProvider;\n  domainsVerifyPlan?: DomainsVerifyPlan;\n};\n\nexport type CertInfo = {\n  crt: string; //fullchain证书\n  key: string; //私钥\n  csr: string; //csr\n  oc?: string; //仅证书，非fullchain证书\n  ic?: string; //中间证书\n  pfx?: string;\n  der?: string;\n  jks?: string;\n  one?: string;\n};\nexport type SSLProvider = \"letsencrypt\" | \"google\" | \"zerossl\";\nexport type PrivateKeyType = \"rsa_1024\" | \"rsa_2048\" | \"rsa_3072\" | \"rsa_4096\" | \"ec_256\" | \"ec_384\" | \"ec_521\";\ntype AcmeServiceOptions = {\n  userContext: IContext;\n  logger: ILogger;\n  sslProvider: SSLProvider;\n  eab?: ClientExternalAccountBindingOptions;\n  skipLocalVerify?: boolean;\n  useMappingProxy?: boolean;\n  reverseProxy?: string;\n  privateKeyType?: PrivateKeyType;\n  signal?: AbortSignal;\n  maxCheckRetryCount?: number;\n  userId: number;\n  domainParser: IDomainParser;\n  waitDnsDiffuseTime?: number;\n};\n\nexport class AcmeService {\n  options: AcmeServiceOptions;\n  userContext: IContext;\n  logger: ILogger;\n  sslProvider: SSLProvider;\n  skipLocalVerify = true;\n  eab?: ClientExternalAccountBindingOptions;\n  constructor(options: AcmeServiceOptions) {\n    this.options = options;\n    this.userContext = options.userContext;\n    this.logger = options.logger;\n    this.sslProvider = options.sslProvider || \"letsencrypt\";\n    this.eab = options.eab;\n    this.skipLocalVerify = options.skipLocalVerify ?? false;\n    acme.setLogger((message: any, ...args: any[]) => {\n      this.logger.info(message, ...args);\n    });\n  }\n\n  async getAccountConfig(email: string, urlMapping: UrlMapping): Promise<any> {\n    const conf = (await this.userContext.getObj(this.buildAccountKey(email))) || {};\n    if (urlMapping && urlMapping.mappings) {\n      for (const key in urlMapping.mappings) {\n        if (Object.prototype.hasOwnProperty.call(urlMapping.mappings, key)) {\n          const element = urlMapping.mappings[key];\n          if (conf.accountUrl?.indexOf(element) > -1) {\n            //如果用了代理url，要替换回去\n            conf.accountUrl = conf.accountUrl.replace(element, key);\n          }\n        }\n      }\n    }\n    return conf;\n  }\n\n  buildAccountKey(email: string) {\n    return `acme.config.${this.sslProvider}.${email}`;\n  }\n\n  async saveAccountConfig(email: string, conf: any) {\n    await this.userContext.setObj(this.buildAccountKey(email), conf);\n  }\n\n  async getAcmeClient(email: string, isTest = false): Promise<acme.Client> {\n    const mappings = {};\n    if (this.sslProvider === \"letsencrypt\") {\n      mappings[\"acme-v02.api.letsencrypt.org\"] = this.options.reverseProxy || \"le.px.certd.handfree.work\";\n    } else if (this.sslProvider === \"google\") {\n      mappings[\"dv.acme-v02.api.pki.goog\"] = this.options.reverseProxy || \"gg.px.certd.handfree.work\";\n    }\n    const urlMapping: UrlMapping = {\n      enabled: false,\n      mappings,\n    };\n    const conf = await this.getAccountConfig(email, urlMapping);\n    if (conf.key == null) {\n      conf.key = await this.createNewKey();\n      await this.saveAccountConfig(email, conf);\n      this.logger.info(`创建新的Accountkey:${email}`);\n    }\n    let directoryUrl = \"\";\n    if (isTest) {\n      directoryUrl = acme.directory[this.sslProvider].staging;\n    } else {\n      directoryUrl = acme.directory[this.sslProvider].production;\n    }\n    if (this.options.useMappingProxy) {\n      urlMapping.enabled = true;\n    } else {\n      //测试directory是否可以访问\n      const isOk = await this.testDirectory(directoryUrl);\n      if (!isOk) {\n        this.logger.info(\"测试访问失败，自动使用代理\");\n        urlMapping.enabled = true;\n      }\n    }\n    const client = new acme.Client({\n      sslProvider: this.sslProvider,\n      directoryUrl: directoryUrl,\n      accountKey: conf.key,\n      accountUrl: conf.accountUrl,\n      externalAccountBinding: this.eab,\n      backoffAttempts: this.options.maxCheckRetryCount || 20,\n      backoffMin: 5000,\n      backoffMax: 10000,\n      urlMapping,\n      signal: this.options.signal,\n    });\n\n    if (conf.accountUrl == null) {\n      const accountPayload = {\n        termsOfServiceAgreed: true,\n        contact: [`mailto:${email}`],\n        externalAccountBinding: this.eab,\n      };\n      await client.createAccount(accountPayload);\n      conf.accountUrl = client.getAccountUrl();\n      await this.saveAccountConfig(email, conf);\n    }\n    return client;\n  }\n\n  async createNewKey() {\n    const key = await acme.crypto.createPrivateKey(2048);\n    return key.toString();\n  }\n\n  async challengeCreateFn(authz: any, keyAuthorizationGetter: (challenge: Challenge) => Promise<string>, providers: Providers) {\n    this.logger.info(\"Triggered challengeCreateFn()\");\n\n    const fullDomain = authz.identifier.value;\n    let domain = await this.options.domainParser.parse(fullDomain);\n    this.logger.info(\"主域名为：\" + domain);\n\n    const getChallenge = (type: string) => {\n      return authz.challenges.find((c: any) => c.type === type);\n    };\n\n    const doHttpVerify = async (challenge: any, httpUploader: IOssClient) => {\n      const keyAuthorization = await keyAuthorizationGetter(challenge);\n      this.logger.info(\"http校验\");\n      const filePath = `.well-known/acme-challenge/${challenge.token}`;\n      const fileContents = keyAuthorization;\n      this.logger.info(`校验 ${fullDomain} ，准备上传文件：${filePath}`);\n      await httpUploader.upload(filePath, Buffer.from(fileContents));\n      this.logger.info(`上传文件【${filePath}】成功`);\n      return {\n        challenge,\n        keyAuthorization,\n        httpUploader,\n      };\n    };\n\n    const doDnsVerify = async (challenge: any, fullRecord: string, dnsProvider: IDnsProvider) => {\n      this.logger.info(\"dns校验\");\n      const keyAuthorization = await keyAuthorizationGetter(challenge);\n\n      const mainDomain = dnsProvider.usePunyCode() ? domain : punycode.toUnicode(domain);\n      fullRecord = dnsProvider.usePunyCode() ? fullRecord : punycode.toUnicode(fullRecord);\n      const recordValue = keyAuthorization;\n      let hostRecord = fullRecord.replace(`${mainDomain}`, \"\");\n      if (hostRecord.endsWith(\".\")) {\n        hostRecord = hostRecord.substring(0, hostRecord.length - 1);\n      }\n\n      const recordReq = {\n        domain: mainDomain,\n        fullRecord,\n        hostRecord,\n        type: \"TXT\",\n        value: recordValue,\n      };\n      this.logger.info(\"添加 TXT 解析记录\", JSON.stringify(recordReq));\n      const recordRes = await dnsProvider.createRecord(recordReq);\n      this.logger.info(\"添加 TXT 解析记录成功\", JSON.stringify(recordRes));\n      return {\n        recordReq,\n        recordRes,\n        dnsProvider,\n        challenge,\n        keyAuthorization,\n      };\n    };\n\n    let dnsProvider = providers.dnsProvider;\n    let fullRecord = `_acme-challenge.${fullDomain}`;\n\n    // const origDomain = punycode.toUnicode(domain);\n    const origFullDomain = punycode.toUnicode(fullDomain);\n    if (providers.domainsVerifyPlan) {\n      //按照计划执行\n      const domainVerifyPlan = providers.domainsVerifyPlan[origFullDomain];\n      if (domainVerifyPlan) {\n        if (domainVerifyPlan.type === \"dns\") {\n          dnsProvider = domainVerifyPlan.dnsProvider;\n        } else if (domainVerifyPlan.type === \"cname\") {\n          const cname: CnameVerifyPlan = domainVerifyPlan.cnameVerifyPlan;\n          if (cname) {\n            dnsProvider = cname.dnsProvider;\n            domain = await this.options.domainParser.parse(cname.domain);\n            fullRecord = cname.fullRecord;\n          } else {\n            this.logger.error(`未找到域名${fullDomain}的CNAME校验计划，请修改证书申请配置`);\n          }\n          if (dnsProvider == null) {\n            throw new Error(`未找到域名${fullDomain}CNAME校验计划的DnsProvider，请修改证书申请配置`);\n          }\n        } else if (domainVerifyPlan.type === \"http\") {\n          const plan: HttpVerifyPlan = domainVerifyPlan.httpVerifyPlan;\n          if (plan) {\n            const httpChallenge = getChallenge(\"http-01\");\n            if (httpChallenge == null) {\n              throw new Error(\"该域名不支持http-01方式校验\");\n            }\n            return await doHttpVerify(httpChallenge, plan.httpUploader);\n          } else {\n            throw new Error(\"未找到域名【\" + fullDomain + \"】的http校验配置\");\n          }\n        } else {\n          throw new Error(\"不支持的校验类型\", domainVerifyPlan.type);\n        }\n      } else {\n        this.logger.warn(`未找到域名${fullDomain}的校验计划，使用默认的dnsProvider`);\n      }\n    }\n    if (!dnsProvider) {\n      throw new Error(`域名${fullDomain}没有匹配到任何校验方式，证书申请失败`);\n    }\n\n    const dnsChallenge = getChallenge(\"dns-01\");\n    return await doDnsVerify(dnsChallenge, fullRecord, dnsProvider);\n  }\n\n  /**\n   * Function used to remove an ACME challenge response\n   *\n   * @param {object} authz Authorization object\n   * @param {object} challenge Selected challenge\n   * @param {string} keyAuthorization Authorization key\n   * @param recordReq\n   * @param recordRes\n   * @param dnsProvider dnsProvider\n   * @param httpUploader\n   * @returns {Promise}\n   */\n\n  async challengeRemoveFn(authz: any, challenge: any, keyAuthorization: string, recordReq: any, recordRes: any, dnsProvider?: IDnsProvider, httpUploader?: IOssClient) {\n    this.logger.info(\"执行清理\");\n\n    /* http-01 */\n    const fullDomain = authz.identifier.value;\n    if (challenge.type === \"http-01\") {\n      const filePath = `.well-known/acme-challenge/${challenge.token}`;\n      this.logger.info(`Removing challenge response for ${fullDomain} at file: ${filePath}`);\n      await httpUploader.remove(filePath);\n      this.logger.info(`删除文件【${filePath}】成功`);\n    } else if (challenge.type === \"dns-01\") {\n      this.logger.info(`删除 TXT 解析记录:${JSON.stringify(recordReq)} ,recordRes = ${JSON.stringify(recordRes)}`);\n      try {\n        await dnsProvider.removeRecord({\n          recordReq,\n          recordRes,\n        });\n        this.logger.info(\"删除解析记录成功\");\n      } catch (e) {\n        this.logger.error(\"删除解析记录出错：\", e);\n        throw e;\n      }\n    }\n  }\n\n  async order(options: {\n    email: string;\n    domains: string | string[];\n    dnsProvider?: any;\n    domainsVerifyPlan?: DomainsVerifyPlan;\n    httpUploader?: any;\n    csrInfo: any;\n    isTest?: boolean;\n    privateKeyType?: string;\n    profile?: string;\n  }): Promise<CertInfo> {\n    const { email, isTest, csrInfo, dnsProvider, domainsVerifyPlan, profile } = options;\n    const client: acme.Client = await this.getAcmeClient(email, isTest);\n\n    let domains = options.domains;\n    const encodingDomains = [];\n    for (const domain of domains) {\n      encodingDomains.push(punycode.toASCII(domain));\n    }\n    domains = encodingDomains;\n\n    /* Create CSR */\n    const { commonName, altNames } = this.buildCommonNameByDomains(domains);\n    let privateKey = null;\n    const privateKeyType = options.privateKeyType || \"rsa_2048\";\n    const privateKeyArr = privateKeyType.split(\"_\");\n    const type = privateKeyArr[0];\n    let size = 2048;\n    if (privateKeyArr.length > 1) {\n      size = parseInt(privateKeyArr[1]);\n    }\n\n    let encodingType = \"pkcs8\";\n    if (privateKeyArr.length > 2) {\n      encodingType = privateKeyArr[2];\n    }\n\n    if (type == \"ec\") {\n      const name: any = \"P-\" + size;\n      privateKey = await acme.crypto.createPrivateEcdsaKey(name, encodingType);\n    } else {\n      privateKey = await acme.crypto.createPrivateRsaKey(size, encodingType);\n    }\n\n    let createCsr: any = acme.crypto.createCsr;\n    if (encodingType === \"pkcs1\") {\n      //兼容老版本\n      createCsr = acme.forge.createCsr;\n    }\n    const [key, csr] = await createCsr(\n      {\n        commonName,\n        ...csrInfo,\n        altNames,\n      },\n      privateKey\n    );\n\n    if (dnsProvider == null && domainsVerifyPlan == null) {\n      throw new Error(\"dnsProvider 、 domainsVerifyPlan不能都为空\");\n    }\n\n    const providers: Providers = {\n      dnsProvider,\n      domainsVerifyPlan,\n    };\n    /* 自动申请证书 */\n    const crt = await client.auto({\n      csr,\n      email: email,\n      termsOfServiceAgreed: true,\n      skipChallengeVerification: this.skipLocalVerify,\n      challengePriority: [\"dns-01\", \"http-01\"],\n      challengeCreateFn: async (\n        authz: acme.Authorization,\n        keyAuthorizationGetter: (challenge: Challenge) => Promise<string>\n      ): Promise<{ recordReq?: any; recordRes?: any; dnsProvider?: any; challenge: Challenge; keyAuthorization: string }> => {\n        return await this.challengeCreateFn(authz, keyAuthorizationGetter, providers);\n      },\n      challengeRemoveFn: async (authz: acme.Authorization, challenge: Challenge, keyAuthorization: string, recordReq: any, recordRes: any, dnsProvider: IDnsProvider, httpUploader: IOssClient): Promise<any> => {\n        return await this.challengeRemoveFn(authz, challenge, keyAuthorization, recordReq, recordRes, dnsProvider, httpUploader);\n      },\n      signal: this.options.signal,\n      profile,\n    });\n\n    const crtString = crt.toString();\n    const cert: CertInfo = {\n      crt: crtString,\n      key: key.toString(),\n      csr: csr.toString(),\n    };\n    /* Done */\n    this.logger.debug(`CSR:\\n${cert.csr}`);\n    this.logger.debug(`Certificate:\\n${cert.crt}`);\n    this.logger.info(\"证书申请成功\");\n    return cert;\n  }\n\n  buildCommonNameByDomains(domains: string | string[]): {\n    commonName: string;\n    altNames: string[] | undefined;\n  } {\n    if (typeof domains === \"string\") {\n      domains = domains.split(\",\");\n    }\n    if (domains.length === 0) {\n      throw new Error(\"domain can not be empty\");\n    }\n    const commonName = domains[0];\n    let altNames: undefined | string[] = undefined;\n    if (domains.length > 1) {\n      altNames = _.slice(domains, 1);\n    }\n    return {\n      commonName,\n      altNames,\n    };\n  }\n\n  private async testDirectory(directoryUrl: string) {\n    try {\n      await utils.http.request({\n        url: directoryUrl,\n        method: \"GET\",\n        timeout: 10000,\n      });\n    } catch (e) {\n      this.logger.error(`${directoryUrl}，测试访问失败`, e.message);\n      return false;\n    }\n    this.logger.info(`${directoryUrl}，测试访问成功`);\n    return true;\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/plugin/cert-plugin/base-convert.ts",
    "content": "import { AbstractTaskPlugin, FileItem, IContext, Step, TaskInput, TaskOutput } from \"@certd/pipeline\";\nimport dayjs from \"dayjs\";\nimport type { CertInfo } from \"./acme.js\";\nimport { CertReader } from \"./cert-reader.js\";\nimport JSZip from \"jszip\";\nimport { CertConverter } from \"./convert.js\";\nexport const EVENT_CERT_APPLY_SUCCESS = \"CertApply.success\";\n\nexport abstract class CertApplyBaseConvertPlugin extends AbstractTaskPlugin {\n  @TaskInput({\n    title: \"证书域名\",\n    component: {\n      name: \"a-select\",\n      vModel: \"value\",\n      mode: \"tags\",\n      open: false,\n      placeholder: \"foo.com / *.foo.com / *.bar.com\",\n      tokenSeparators: [\",\", \" \", \"，\", \"、\", \"|\"],\n    },\n    rules: [{ type: \"domains\" }],\n    required: true,\n    col: {\n      span: 24,\n    },\n    order: -999,\n    helper:\n      \"1、支持多个域名打到一个证书上，例如： foo.com，*.foo.com，*.bar.com\\n\" +\n      \"2、子域名被通配符包含的不要填写，例如：www.foo.com已经被*.foo.com包含，不要填写www.foo.com\\n\" +\n      \"3、泛域名只能通配*号那一级（*.foo.com的证书不能用于xxx.yyy.foo.com、不能用于foo.com）\\n\" +\n      \"4、输入一个，空格之后，再输入下一个 \\n\" +\n      \"5、如果您配置了子域托管解析，请先[设置托管子域名](#/certd/pipeline/subDomain)\",\n  })\n  domains!: string[];\n\n  @TaskInput({\n    title: \"证书加密密码\",\n    component: {\n      name: \"input-password\",\n      vModel: \"value\",\n    },\n    required: false,\n    order: 100,\n    helper: \"转换成PFX、jks格式证书是否需要加密\\njks必须设置密码，不传则默认123456\\npfx不传则为空密码\",\n  })\n  pfxPassword!: string;\n\n  @TaskInput({\n    title: \"PFX证书转换参数\",\n    value: \"-macalg SHA1 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES\",\n    component: {\n      name: \"a-auto-complete\",\n      vModel: \"value\",\n      options: [\n        { value: \"\", label: \"兼容 Windows Server 最新\" },\n        { value: \"-macalg SHA1 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES\", label: \"兼容 Windows Server 2016\" },\n        { value: \"-nomac -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES\", label: \"兼容 Windows Server 2008\" },\n      ],\n    },\n    required: false,\n    order: 100,\n    helper: \"兼容Windows Server各个版本\",\n  })\n  pfxArgs = \"-macalg SHA1 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES\";\n\n  userContext!: IContext;\n  lastStatus!: Step;\n\n  @TaskOutput({\n    title: \"域名证书\",\n    type: \"cert\",\n  })\n  cert?: CertInfo;\n\n  @TaskOutput({\n    title: \"域名证书压缩文件\",\n    type: \"certZip\",\n  })\n  certZip?: FileItem;\n\n  async onInstance() {\n    this.userContext = this.ctx.userContext;\n    this.lastStatus = this.ctx.lastStatus as Step;\n    await this.onInit();\n  }\n\n  abstract onInit(): Promise<void>;\n\n  //必须output之后执行\n  async emitCertApplySuccess() {\n    const emitter = this.ctx.emitter;\n    const value = {\n      cert: this.cert,\n      file: this._result.files[0].path,\n    };\n    await emitter.emit(EVENT_CERT_APPLY_SUCCESS, value);\n  }\n\n  async output(certReader: CertReader, isNew: boolean) {\n    const cert: CertInfo = certReader.toCertInfo();\n    this.cert = cert;\n\n    this._result.pipelineVars.certExpiresTime = dayjs(certReader.detail.notAfter).valueOf();\n    if (!this._result.pipelinePrivateVars) {\n      this._result.pipelinePrivateVars = {};\n    }\n    this._result.pipelinePrivateVars.cert = cert;\n\n    if (isNew) {\n      try {\n        const converter = new CertConverter({ logger: this.logger });\n        const res = await converter.convert({\n          cert,\n          pfxPassword: this.pfxPassword,\n          pfxArgs: this.pfxArgs,\n        });\n        if (cert.pfx == null && res.pfx) {\n          cert.pfx = res.pfx;\n        }\n\n        if (cert.der == null && res.der) {\n          cert.der = res.der;\n        }\n\n        if (cert.jks == null && res.jks) {\n          cert.jks = res.jks;\n        }\n\n        this.logger.info(\"转换证书格式成功\");\n      } catch (e) {\n        this.logger.error(\"转换证书格式失败\", e);\n      }\n    }\n\n    if (isNew) {\n      const zipFileName = certReader.buildCertFileName(\"zip\", certReader.detail.notBefore);\n      await this.zipCert(cert, zipFileName);\n    } else {\n      this.extendsFiles();\n    }\n    this.certZip = this._result.files[0];\n  }\n\n  async zipCert(cert: CertInfo, filename: string) {\n    const zip = new JSZip();\n    zip.file(\"证书.pem\", cert.crt);\n    zip.file(\"私钥.pem\", cert.key);\n    zip.file(\"中间证书.pem\", cert.ic);\n    zip.file(\"cert.crt\", cert.crt);\n    zip.file(\"cert.key\", cert.key);\n    zip.file(\"intermediate.crt\", cert.ic);\n    zip.file(\"origin.crt\", cert.oc);\n    zip.file(\"one.pem\", cert.one);\n    if (cert.pfx) {\n      zip.file(\"cert.pfx\", Buffer.from(cert.pfx, \"base64\"));\n    }\n    if (cert.der) {\n      zip.file(\"cert.der\", Buffer.from(cert.der, \"base64\"));\n    }\n    if (cert.jks) {\n      zip.file(\"cert.jks\", Buffer.from(cert.jks, \"base64\"));\n    }\n\n    zip.file(\n      \"说明.txt\",\n      `证书文件说明\ncert.crt：证书文件，包含证书链，pem格式\ncert.key：私钥文件，pem格式\nintermediate.crt：中间证书文件，pem格式\norigin.crt：原始证书文件，不含证书链，pem格式\none.pem： 证书和私钥简单合并成一个文件，pem格式，crt正文+key正文\ncert.pfx：pfx格式证书文件，iis服务器使用\ncert.der：der格式证书文件\ncert.jks：jks格式证书文件，java服务器使用\n    `\n    );\n\n    const content = await zip.generateAsync({ type: \"nodebuffer\" });\n    this.saveFile(filename, content);\n    this.logger.info(`已保存文件:${filename}`);\n  }\n\n  formatCert(pem: string) {\n    pem = pem.replace(/\\r/g, \"\");\n    pem = pem.replace(/\\n\\n/g, \"\\n\");\n    pem = pem.replace(/\\n$/g, \"\");\n    return pem;\n  }\n\n  formatCerts(cert: { crt: string; key: string; csr: string }) {\n    const newCert: CertInfo = {\n      crt: this.formatCert(cert.crt),\n      key: this.formatCert(cert.key),\n      csr: this.formatCert(cert.csr),\n    };\n    return newCert;\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts",
    "content": "import { NotificationBody, Step, TaskInput } from \"@certd/pipeline\";\nimport dayjs from \"dayjs\";\nimport { CertReader } from \"./cert-reader.js\";\nimport { pick } from \"lodash-es\";\nimport { CertApplyBaseConvertPlugin } from \"./base-convert.js\";\n\nexport abstract class CertApplyBasePlugin extends CertApplyBaseConvertPlugin {\n  @TaskInput({\n    title: \"邮箱\",\n    component: {\n      name: \"email-selector\",\n      vModel: \"value\",\n    },\n    rules: [{ type: \"email\", message: \"请输入正确的邮箱\" }],\n    required: true,\n    order: -1,\n    helper: \"请输入邮箱\",\n  })\n  email!: string;\n\n  @TaskInput({\n    title: \"更新天数\",\n    value: 35,\n    component: {\n      name: \"a-input-number\",\n      vModel: \"value\",\n    },\n    required: true,\n    order: 100,\n    helper: \"到期前多少天后更新证书，注意：流水线默认不会自动运行，请设置定时器，每天定时运行本流水线\",\n  })\n  renewDays!: number;\n\n  @TaskInput({\n    title: \"证书申请成功通知\",\n    value: true,\n    component: {\n      name: \"a-switch\",\n      vModel: \"checked\",\n    },\n    order: 100,\n    helper: \"证书申请成功后是否发送通知，优先使用默认通知渠道\",\n  })\n  successNotify = true;\n\n  // @TaskInput({\n  //   title: \"CsrInfo\",\n  //   helper: \"暂时没有用\",\n  // })\n  csrInfo!: string;\n\n  async onInstance() {\n    this.userContext = this.ctx.userContext;\n    this.lastStatus = this.ctx.lastStatus as Step;\n    await this.onInit();\n  }\n\n  abstract onInit(): Promise<void>;\n\n  abstract doCertApply(): Promise<CertReader>;\n\n  async execute(): Promise<string | void> {\n    const oldCert = await this.condition();\n    if (oldCert != null) {\n      await this.output(oldCert, false);\n      return \"skip\";\n    }\n    const cert = await this.doCertApply();\n    if (cert != null) {\n      await this.output(cert, true);\n\n      await this.emitCertApplySuccess();\n      //清空后续任务的状态，让后续任务能够重新执行\n      this.clearLastStatus();\n\n      if (this.successNotify) {\n        await this.sendSuccessNotify();\n      }\n    } else {\n      throw new Error(\"申请证书失败\");\n    }\n  }\n\n  getCheckChangeInputKeys() {\n    //插件哪些字段参与校验是否需要更新\n    return [\"domains\", \"sslProvider\", \"privateKeyType\", \"dnsProviderType\", \"pfxPassword\"];\n  }\n  /**\n   * 是否更新证书\n   */\n  async condition() {\n    // if (this.forceUpdate) {\n    //   this.logger.info(\"强制更新证书选项已勾选，准备申请新证书\");\n    //   this.logger.warn(\"申请完之后，切记取消强制更新，避免申请过多证书。\");\n    //   return null;\n    // }\n\n    const checkInputChanges = this.getCheckChangeInputKeys();\n    const oldInput = JSON.stringify(pick(this.lastStatus?.input, checkInputChanges));\n    const thisInput = JSON.stringify(pick(this, checkInputChanges));\n    const inputChanged = oldInput !== thisInput;\n\n    this.logger.info(`旧参数：${oldInput}`);\n    this.logger.info(`新参数：${thisInput}`);\n    if (inputChanged) {\n      this.logger.info(\"输入参数变更，准备申请新证书\");\n      return null;\n    } else {\n      this.logger.info(\"输入参数未变更，检查证书是否过期\");\n    }\n\n    let oldCert: CertReader | undefined = undefined;\n    try {\n      this.logger.info(\"读取上次证书\");\n      oldCert = await this.readLastCert();\n    } catch (e) {\n      this.logger.warn(\"读取cert失败：\", e);\n    }\n    if (oldCert == null) {\n      this.logger.info(\"还未申请过，准备申请新证书\");\n      return null;\n    }\n\n    const ret = this.isWillExpire(oldCert.expires, this.renewDays);\n    if (!ret.isWillExpire) {\n      this.logger.info(`证书还未过期：过期时间${dayjs(oldCert.expires).format(\"YYYY-MM-DD HH:mm:ss\")},剩余${ret.leftDays}天`);\n      return oldCert;\n    }\n    this.logger.info(\"即将过期，开始更新证书\");\n    return null;\n  }\n\n  async readLastCert(): Promise<CertReader | undefined> {\n    const cert = this.lastStatus?.status?.output?.cert;\n    if (cert == null) {\n      this.logger.info(\"没有找到上次的证书\");\n      return undefined;\n    }\n    return new CertReader(cert);\n  }\n\n  /**\n   * 检查是否过期，默认提前35天\n   * @param expires\n   * @param maxDays\n   */\n  isWillExpire(expires: number, maxDays = 20) {\n    if (expires == null) {\n      throw new Error(\"过期时间不能为空\");\n    }\n    // 检查有效期\n    const leftDays = Math.floor((expires - dayjs().valueOf()) / (1000 * 60 * 60 * 24));\n    this.logger.info(`证书剩余天数：${leftDays}`);\n    return {\n      isWillExpire: leftDays <= maxDays,\n      leftDays,\n    };\n  }\n  async sendSuccessNotify() {\n    this.logger.info(\"发送证书申请成功通知\");\n    const url = await this.ctx.urlService.getPipelineDetailUrl(this.pipeline.id, this.ctx.runtime.id);\n    const body: NotificationBody = {\n      title: `证书申请成功【${this.pipeline.title}】`,\n      content: `域名：${this.domains.join(\",\")}`,\n      url: url,\n    };\n    try {\n      await this.ctx.notificationService.send({\n        useDefault: true,\n        useEmail: true,\n        emailAddress: this.email,\n        logger: this.logger,\n        body,\n      });\n    } catch (e) {\n      this.logger.error(\"证书申请成功通知发送失败\", e);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts",
    "content": "import { CertInfo } from \"./acme.js\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { CertificateInfo, crypto } from \"@certd/acme-client\";\nimport { ILogger } from \"@certd/basic\";\nimport dayjs from \"dayjs\";\nimport { uniq } from \"lodash-es\";\n\nexport type CertReaderHandleContext = {\n  reader: CertReader;\n  tmpCrtPath: string;\n  tmpKeyPath: string;\n  tmpOcPath?: string;\n  tmpPfxPath?: string;\n  tmpDerPath?: string;\n  tmpIcPath?: string;\n  tmpJksPath?: string;\n  tmpOnePath?: string;\n};\nexport type CertReaderHandle = (ctx: CertReaderHandleContext) => Promise<void>;\nexport type HandleOpts = { logger: ILogger; handle: CertReaderHandle };\nexport class CertReader {\n  cert: CertInfo;\n\n  detail: CertificateInfo;\n  //毫秒时间戳\n  expires: number;\n  constructor(certInfo: CertInfo) {\n    this.cert = certInfo;\n\n    if (!certInfo.ic) {\n      this.cert.ic = this.getIc();\n    }\n\n    if (!certInfo.oc) {\n      this.cert.oc = this.getOc();\n    }\n\n    if (!certInfo.one) {\n      this.cert.one = this.cert.crt + \"\\n\" + this.cert.key;\n    }\n\n    try {\n      const { detail, expires } = this.getCrtDetail(this.cert.crt);\n      this.detail = detail;\n      this.expires = expires.getTime();\n    } catch (e) {\n      throw new Error(\"证书解析失败:\" + e.message);\n    }\n  }\n\n  getIc() {\n    //中间证书ic， 就是crt的第一个 -----END CERTIFICATE----- 之后的内容\n    const endStr = \"-----END CERTIFICATE-----\";\n    const firstBlockEndIndex = this.cert.crt.indexOf(endStr);\n\n    const start = firstBlockEndIndex + endStr.length + 1;\n    if (this.cert.crt.length <= start) {\n      return \"\";\n    }\n    const ic = this.cert.crt.substring(start);\n    if (ic == null) {\n      return \"\";\n    }\n    return ic?.trim();\n  }\n\n  getOc() {\n    //原始证书 就是crt的第一个 -----END CERTIFICATE----- 之前的内容\n    const endStr = \"-----END CERTIFICATE-----\";\n    const arr = this.cert.crt.split(endStr);\n    return arr[0] + endStr;\n  }\n\n  toCertInfo(): CertInfo {\n    return this.cert;\n  }\n\n  getCrtDetail(crt: string = this.cert.crt) {\n    return CertReader.readCertDetail(crt);\n  }\n\n  static readCertDetail(crt: string) {\n    const detail = crypto.readCertificateInfo(crt.toString());\n    const expires = detail.notAfter;\n    return { detail, expires };\n  }\n\n  getAllDomains() {\n    const { detail } = this.getCrtDetail();\n    const domains = [];\n    if (detail.domains?.commonName) {\n      domains.push(detail.domains.commonName);\n    }\n    domains.push(...detail.domains.altNames);\n    //去重\n    return uniq(domains);\n  }\n\n  getAltNames() {\n    const { detail } = this.getCrtDetail();\n    return detail.domains.altNames;\n  }\n\n  static getMainDomain(crt: string) {\n    const { detail } = CertReader.readCertDetail(crt);\n    return CertReader.getMainDomainFromDetail(detail);\n  }\n\n  getMainDomain() {\n    const { detail } = this.getCrtDetail();\n    return CertReader.getMainDomainFromDetail(detail);\n  }\n\n  static getMainDomainFromDetail(detail: CertificateInfo) {\n    let domain = detail?.domains?.commonName;\n    if (domain == null) {\n      domain = detail?.domains?.altNames?.[0];\n    }\n    if (domain == null) {\n      domain = \"unknown\";\n    }\n    return domain;\n  }\n\n  saveToFile(type: \"crt\" | \"key\" | \"pfx\" | \"der\" | \"oc\" | \"one\" | \"ic\" | \"jks\", filepath?: string) {\n    if (!this.cert[type]) {\n      return;\n    }\n\n    if (filepath == null) {\n      //写入临时目录\n      filepath = path.join(os.tmpdir(), \"/certd/tmp/\", Math.floor(Math.random() * 1000000) + `_cert.${type}`);\n    }\n\n    const dir = path.dirname(filepath);\n    if (!fs.existsSync(dir)) {\n      fs.mkdirSync(dir, { recursive: true });\n    }\n    if (type === \"crt\" || type === \"key\" || type === \"ic\" || type === \"oc\" || type === \"one\") {\n      fs.writeFileSync(filepath, this.cert[type]);\n    } else {\n      fs.writeFileSync(filepath, Buffer.from(this.cert[type], \"base64\"));\n    }\n    return filepath;\n  }\n\n  async readCertFile(opts: HandleOpts) {\n    const logger = opts.logger;\n    logger.info(\"将证书写入本地缓存文件\");\n    const tmpCrtPath = this.saveToFile(\"crt\");\n    const tmpKeyPath = this.saveToFile(\"key\");\n    const tmpPfxPath = this.saveToFile(\"pfx\");\n    const tmpIcPath = this.saveToFile(\"ic\");\n    const tmpOcPath = this.saveToFile(\"oc\");\n    const tmpDerPath = this.saveToFile(\"der\");\n    const tmpJksPath = this.saveToFile(\"jks\");\n    const tmpOnePath = this.saveToFile(\"one\");\n    logger.info(\"本地文件写入成功\");\n    try {\n      return await opts.handle({\n        reader: this,\n        tmpCrtPath: tmpCrtPath,\n        tmpKeyPath: tmpKeyPath,\n        tmpPfxPath: tmpPfxPath,\n        tmpDerPath: tmpDerPath,\n        tmpIcPath: tmpIcPath,\n        tmpJksPath: tmpJksPath,\n        tmpOcPath: tmpOcPath,\n        tmpOnePath,\n      });\n    } catch (err) {\n      logger.error(\"处理失败\", err);\n      throw err;\n    } finally {\n      //删除临时文件\n      logger.info(\"清理临时文件\");\n      function removeFile(filepath?: string) {\n        if (filepath) {\n          fs.unlinkSync(filepath);\n        }\n      }\n      removeFile(tmpCrtPath);\n      removeFile(tmpKeyPath);\n      removeFile(tmpPfxPath);\n      removeFile(tmpOcPath);\n      removeFile(tmpDerPath);\n      removeFile(tmpIcPath);\n      removeFile(tmpJksPath);\n      removeFile(tmpOnePath);\n    }\n  }\n\n  buildCertFileName(suffix: string, applyTime: any, prefix = \"cert\") {\n    let domain = this.getMainDomain();\n    domain = domain.replaceAll(\".\", \"_\").replaceAll(\"*\", \"_\");\n    const timeStr = dayjs(applyTime).format(\"YYYYMMDDHHmmss\");\n    return `${prefix}_${domain}_${timeStr}.${suffix}`;\n  }\n\n  buildCertName() {\n    let domain = this.getMainDomain();\n    domain = domain.replaceAll(\".\", \"_\").replaceAll(\"*\", \"_\");\n    return `${domain}_${dayjs().format(\"YYYYMMDDHHmmssSSS\")}`;\n  }\n\n  static appendTimeSuffix(name?: string) {\n    if (name == null) {\n      name = \"certd\";\n    }\n    return name + \"_\" + dayjs().format(\"YYYYMMDDHHmmssSSS\");\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/plugin/cert-plugin/convert.ts",
    "content": "import { ILogger, sp } from \"@certd/basic\";\nimport type { CertInfo } from \"../cert-plugin/acme.js\";\nimport { CertReader, CertReaderHandleContext } from \"../cert-plugin/cert-reader.js\";\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\n\nexport { CertReader };\nexport type { CertInfo };\n\nexport class CertConverter {\n  logger: ILogger;\n\n  constructor(opts: { logger: ILogger }) {\n    this.logger = opts.logger;\n  }\n  async convert(opts: { cert: CertInfo; pfxPassword: string; pfxArgs: string }): Promise<{\n    pfx: string;\n    der: string;\n    jks: string;\n  }> {\n    const certReader = new CertReader(opts.cert);\n    let pfx: string;\n    let der: string;\n    let jks: string;\n    const handle = async (ctx: CertReaderHandleContext) => {\n      // 调用openssl 转pfx\n      pfx = await this.convertPfx(ctx, opts.pfxPassword, opts.pfxArgs);\n\n      // 转der\n      der = await this.convertDer(ctx);\n\n      jks = await this.convertJks(ctx, opts.pfxPassword);\n    };\n\n    await certReader.readCertFile({ logger: this.logger, handle });\n\n    return {\n      pfx,\n      der,\n      jks,\n    };\n  }\n\n  async exec(cmd: string) {\n    process.env.LANG = \"zh_CN.GBK\";\n    await sp.spawn({\n      cmd: cmd,\n      logger: this.logger,\n    });\n  }\n\n  private async convertPfx(opts: CertReaderHandleContext, pfxPassword: string, pfxArgs: string) {\n    const { tmpCrtPath, tmpKeyPath } = opts;\n\n    const pfxPath = path.join(os.tmpdir(), \"/certd/tmp/\", Math.floor(Math.random() * 1000000) + \"_cert.pfx\");\n\n    const dir = path.dirname(pfxPath);\n    if (!fs.existsSync(dir)) {\n      fs.mkdirSync(dir, { recursive: true });\n    }\n\n    let passwordArg = \"-passout pass:\";\n    if (pfxPassword) {\n      passwordArg = `-password pass:${pfxPassword}`;\n    }\n    // 兼容server 2016，旧版本不能用sha256\n    const oldPfxCmd = `openssl pkcs12 ${pfxArgs} -export -out ${pfxPath} -inkey ${tmpKeyPath} -in ${tmpCrtPath} ${passwordArg}`;\n    // const newPfx = `openssl pkcs12 -export -out ${pfxPath} -inkey ${tmpKeyPath} -in ${tmpCrtPath} ${passwordArg}`;\n    await this.exec(oldPfxCmd);\n    const fileBuffer = fs.readFileSync(pfxPath);\n    const pfxCert = fileBuffer.toString(\"base64\");\n    fs.unlinkSync(pfxPath);\n    return pfxCert;\n\n    //\n    // const applyTime = new Date().getTime();\n    // const filename = reader.buildCertFileName(\"pfx\", applyTime);\n    // this.saveFile(filename, fileBuffer);\n  }\n\n  private async convertDer(opts: CertReaderHandleContext) {\n    const { tmpCrtPath } = opts;\n    const derPath = path.join(os.tmpdir(), \"/certd/tmp/\", Math.floor(Math.random() * 1000000) + `_cert.der`);\n\n    const dir = path.dirname(derPath);\n    if (!fs.existsSync(dir)) {\n      fs.mkdirSync(dir, { recursive: true });\n    }\n\n    await this.exec(`openssl x509 -outform der -in ${tmpCrtPath} -out ${derPath}`);\n    const fileBuffer = fs.readFileSync(derPath);\n    const derCert = fileBuffer.toString(\"base64\");\n    fs.unlinkSync(derPath);\n    return derCert;\n  }\n\n  async convertJks(opts: CertReaderHandleContext, pfxPassword = \"\") {\n    const jksPassword = pfxPassword || \"123456\";\n    try {\n      const randomStr = Math.floor(Math.random() * 1000000) + \"\";\n\n      const p12Path = path.join(os.tmpdir(), \"/certd/tmp/\", randomStr + `_cert.p12`);\n      const { tmpCrtPath, tmpKeyPath } = opts;\n      let passwordArg = \"-passout pass:\";\n      if (jksPassword) {\n        passwordArg = `-password pass:${jksPassword}`;\n      }\n      await this.exec(`openssl pkcs12 -export -in ${tmpCrtPath} -inkey ${tmpKeyPath} -out ${p12Path} -name certd ${passwordArg}`);\n\n      const jksPath = path.join(os.tmpdir(), \"/certd/tmp/\", randomStr + `_cert.jks`);\n      const dir = path.dirname(jksPath);\n      if (!fs.existsSync(dir)) {\n        fs.mkdirSync(dir, { recursive: true });\n      }\n      await this.exec(\n        `keytool -importkeystore -srckeystore ${p12Path} -srcstoretype PKCS12 -srcstorepass \"${jksPassword}\" -destkeystore ${jksPath} -deststoretype PKCS12 -deststorepass \"${jksPassword}\" `\n      );\n      fs.unlinkSync(p12Path);\n\n      const fileBuffer = fs.readFileSync(jksPath);\n      const certBase64 = fileBuffer.toString(\"base64\");\n      fs.unlinkSync(jksPath);\n      return certBase64;\n    } catch (e) {\n      this.logger.error(\"转换jks失败\", e);\n      return;\n    }\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/plugin/cert-plugin/custom/index.ts",
    "content": "import { IsTaskPlugin, pluginGroups, RunStrategy, Step, TaskInput, TaskOutput } from \"@certd/pipeline\";\nimport type { CertInfo } from \"../acme.js\";\nimport { CertReader } from \"../cert-reader.js\";\nimport { CertApplyBaseConvertPlugin } from \"../base-convert.js\";\nimport dayjs from \"dayjs\";\n\nexport { CertReader };\nexport type { CertInfo };\n@IsTaskPlugin({\n  name: \"CertApplyUpload\",\n  icon: \"ph:certificate\",\n  title: \"商用证书托管\",\n  group: pluginGroups.cert.key,\n  desc: \"手动上传自定义证书后，自动部署（每次证书有更新，都需要手动上传一次）\",\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.AlwaysRun,\n    },\n  },\n  shortcut: {\n    certUpdate: {\n      title: \"更新证书\",\n      icon: \"ion:upload\",\n      action: \"onCertUpdate\",\n      form: {\n        columns: {\n          crt: {\n            title: \"证书\",\n            type: \"text\",\n            form: {\n              component: {\n                name: \"pem-input\",\n                vModel: \"modelValue\",\n                textarea: {\n                  rows: 4,\n                  placeholder: \"-----BEGIN CERTIFICATE-----\\n...\\n...\\n-----END CERTIFICATE-----\",\n                },\n              },\n              rules: [{ required: true, message: \"此项必填\" }],\n              col: { span: 24 },\n            },\n          },\n          key: {\n            title: \"私钥\",\n            type: \"text\",\n            form: {\n              component: {\n                name: \"pem-input\",\n                vModel: \"modelValue\",\n                textarea: {\n                  rows: 4,\n                  placeholder: \"-----BEGIN PRIVATE KEY-----\\n...\\n...\\n-----END PRIVATE KEY----- \",\n                },\n              },\n              rules: [{ required: true, message: \"此项必填\" }],\n              col: { span: 24 },\n            },\n          },\n        },\n      },\n    },\n  },\n})\nexport class CertApplyUploadPlugin extends CertApplyBaseConvertPlugin {\n  @TaskInput({\n    title: \"手动上传证书\",\n    component: {\n      name: \"cert-info-updater\",\n      vModel: \"modelValue\",\n    },\n    helper: \"手动上传证书\",\n    order: -9999,\n    required: true,\n    mergeScript: `\n    return {\n      component:{\n        on:{\n          updated(scope){\n            scope.form.input.domains = scope.$event?.domains\n          }\n        }\n      }\n    }\n    `,\n  })\n  uploadCert!: CertInfo;\n\n  @TaskOutput({\n    title: \"证书MD5\",\n    type: \"certMd5\",\n  })\n  certMd5?: string;\n\n  async onInstance() {\n    this.accessService = this.ctx.accessService;\n    this.logger = this.ctx.logger;\n    this.userContext = this.ctx.userContext;\n    this.lastStatus = this.ctx.lastStatus as Step;\n  }\n  async onInit(): Promise<void> {}\n\n  async getCertFromStore() {\n    const certReader = new CertReader(this.uploadCert);\n    if (!certReader.expires && certReader.expires < new Date().getTime()) {\n      throw new Error(\"证书已过期，停止部署，请重新上传证书\");\n    }\n\n    return certReader;\n  }\n\n  async execute(): Promise<string | void> {\n    const certReader = await this.getCertFromStore();\n    const crtMd5 = this.ctx.utils.hash.md5(certReader.cert.crt);\n\n    const leftDays = dayjs(certReader.expires).diff(dayjs(), \"day\");\n    this.logger.info(`证书过期时间${dayjs(certReader.expires).format(\"YYYY-MM-DD HH:mm:ss\")},剩余${leftDays}天`);\n\n    if (!this.ctx.inputChanged) {\n      this.logger.info(\"输入参数无变化\");\n      const lastCrtMd5 = this.lastStatus?.status?.output?.certMd5;\n      this.logger.info(\"证书MD5\", crtMd5);\n      this.logger.info(\"上次证书MD5\", lastCrtMd5);\n      if (lastCrtMd5 === crtMd5) {\n        this.logger.info(\"证书无变化，跳过\");\n        //输出证书MD5\n        this.certMd5 = crtMd5;\n        await this.output(certReader, false);\n        return \"skip\";\n      }\n      this.logger.info(\"证书有变化，重新部署\");\n    } else {\n      this.logger.info(\"输入参数有变化，重新部署\");\n    }\n\n    this.clearLastStatus();\n    //输出证书MD5\n    this.certMd5 = crtMd5;\n    await this.output(certReader, true);\n\n    //必须output之后执行\n    await this.emitCertApplySuccess();\n    return;\n  }\n\n  async onCertUpdate(data: any) {\n    const certReader = new CertReader(data);\n    return {\n      input: {\n        uploadCert: {\n          crt: data.crt,\n          key: data.key,\n        },\n        domains: certReader.getAllDomains(),\n      },\n    };\n  }\n}\n\nnew CertApplyUploadPlugin();\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts",
    "content": "import { CancelError, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { utils } from \"@certd/basic\";\n\nimport { AcmeService, CertInfo, DomainsVerifyPlan, DomainVerifyPlan, PrivateKeyType, SSLProvider } from \"./acme.js\";\nimport * as _ from \"lodash-es\";\nimport { createDnsProvider, DnsProviderContext, DnsVerifier, DomainVerifiers, HttpVerifier, IDnsProvider, IDomainVerifierGetter, ISubDomainsGetter } from \"../../dns-provider/index.js\";\nimport { CertReader } from \"./cert-reader.js\";\nimport { CertApplyBasePlugin } from \"./base.js\";\nimport { GoogleClient } from \"../../libs/google.js\";\nimport { EabAccess } from \"../../access\";\nimport { DomainParser } from \"../../dns-provider/domain-parser.js\";\nimport { ossClientFactory } from \"@certd/plugin-lib\";\n\nexport * from \"./base.js\";\nexport type { CertInfo };\nexport * from \"./cert-reader.js\";\nexport type CnameRecordInput = {\n  id: number;\n  status: string;\n};\n\nexport type HttpRecordInput = {\n  domain: string;\n  httpUploaderType: string;\n  httpUploaderAccess: number;\n  httpUploadRootDir: string;\n};\nexport type DomainVerifyPlanInput = {\n  domain: string;\n  type: \"cname\" | \"dns\" | \"http\";\n  dnsProviderType?: string;\n  dnsProviderAccessType?: string;\n  dnsProviderAccessId?: number;\n  cnameVerifyPlan?: Record<string, CnameRecordInput>;\n  httpVerifyPlan?: Record<string, HttpRecordInput>;\n};\nexport type DomainsVerifyPlanInput = {\n  [key: string]: DomainVerifyPlanInput;\n};\n\n@IsTaskPlugin({\n  name: \"CertApply\",\n  title: \"证书申请（JS版）\",\n  icon: \"ph:certificate\",\n  group: pluginGroups.cert.key,\n  desc: \"免费通配符域名证书申请，支持多个域名打到同一个证书上\",\n  default: {\n    input: {\n      renewDays: 35,\n      forceUpdate: false,\n    },\n    strategy: {\n      runStrategy: RunStrategy.AlwaysRun,\n    },\n  },\n})\nexport class CertApplyPlugin extends CertApplyBasePlugin {\n  @TaskInput({\n    title: \"域名验证方式\",\n    value: \"dns\",\n    component: {\n      name: \"a-select\",\n      vModel: \"value\",\n      options: [\n        { value: \"dns\", label: \"DNS直接验证\" },\n        { value: \"cname\", label: \"CNAME代理验证\" },\n        { value: \"http\", label: \"HTTP文件验证\" },\n        { value: \"dnses\", label: \"多DNS提供商\" },\n        { value: \"auto\", label: \"自动匹配\" },\n      ],\n    },\n    required: true,\n    helper: `1. <b>DNS直接验证</b>：域名dns解析是在阿里云/腾讯云/华为云/CF/NameSilo/西数/火山/dns.la/京东云/51dns的，选它\n2.  <b>CNAME代理验证</b>：支持任何注册商的域名，第一次需要手动添加[CNAME记录](#/certd/cname/record)（建议将DNS服务器修改为阿里云/腾讯云的，然后使用DNS直接验证）\n3.  <b>HTTP文件验证</b>：不支持泛域名，需要配置网站文件上传\n4.  <b>多DNS提供商</b>：每个域名可以选择独立的DNS提供商\n5.  <b>自动匹配</b>：需要在[域名管理](#/certd/cert/domain)中事先配置好校验方式\n`,\n  })\n  challengeType!: string;\n\n  @TaskInput({\n    title: \"证书颁发机构\",\n    value: \"letsencrypt\",\n    component: {\n      name: \"icon-select\",\n      vModel: \"value\",\n      options: [\n        { value: \"letsencrypt\", label: \"Let's Encrypt\", icon: \"simple-icons:letsencrypt\" },\n        { value: \"google\", label: \"Google\", icon: \"flat-color-icons:google\" },\n        { value: \"zerossl\", label: \"ZeroSSL\", icon: \"emojione:digit-zero\" },\n      ],\n    },\n    helper: \"Let's Encrypt：申请最简单\\nGoogle：大厂光环，兼容性好，仅首次需要翻墙获取EAB授权\\nZeroSSL：需要EAB授权，无需翻墙\",\n    required: true,\n  })\n  sslProvider!: SSLProvider;\n\n  @TaskInput({\n    title: \"DNS解析服务商\",\n    component: {\n      name: \"dns-provider-selector\",\n    },\n    mergeScript: `\n    return {\n      show: ctx.compute(({form})=>{\n          return form.challengeType === 'dns' \n      }),\n      component:{\n        onSelectedChange: ctx.compute(({form})=>{\n          return ($event)=>{\n           form.dnsProviderAccessType = $event.accessType\n          }\n        })\n      }\n    }\n    `,\n    required: true,\n    helper: \"您的域名注册商，或者域名的dns服务器属于哪个平台\\n如果这里没有，请选择CNAME代理验证校验方式\",\n  })\n  dnsProviderType!: string;\n\n  // dns解析授权类型,勿删\n  dnsProviderAccessType!: string;\n\n  @TaskInput({\n    title: \"DNS解析授权\",\n    component: {\n      name: \"access-selector\",\n    },\n    required: true,\n    helper: \"请选择dns解析服务商授权\",\n    mergeScript: `return {\n      component:{\n        type: ctx.compute(({form})=>{\n            return form.dnsProviderAccessType || form.dnsProviderType\n        })\n      },\n      show: ctx.compute(({form})=>{\n          return form.challengeType === 'dns' \n      })\n    }\n    `,\n  })\n  dnsProviderAccess!: number;\n\n  @TaskInput({\n    title: \"域名验证配置\",\n    component: {\n      name: \"domains-verify-plan-editor\",\n    },\n    rules: [{ type: \"checkDomainVerifyPlan\" }],\n    required: true,\n    col: {\n      span: 24,\n    },\n    mergeScript: `return {\n      component:{\n        domains: ctx.compute(({form})=>{\n            return form.domains\n        }),\n        defaultType: ctx.compute(({form})=>{\n            return form.challengeType || 'cname'\n        })\n      },\n      show: ctx.compute(({form})=>{\n          return form.challengeType === 'cname' ||  form.challengeType === 'http' ||  form.challengeType === 'dnses'\n      }),\n      helper: ctx.compute(({form})=>{\n          if(form.challengeType === 'cname' ){\n              return '请按照上面的提示，给要申请证书的域名添加CNAME记录，添加后，点击验证，验证成功后不要删除记录，申请和续期证书会一直用它'\n          }else if (form.challengeType === 'http'){\n              return '请按照上面的提示，给每个域名设置文件上传配置，证书申请过程中会上传校验文件到网站根目录下'\n          }else if (form.challengeType === 'http'){\n              return '给每个域名单独配置dns提供商'\n          }\n      })\n    }\n    `,\n  })\n  domainsVerifyPlan!: DomainsVerifyPlanInput;\n\n  @TaskInput({\n    title: \"Google公共EAB授权\",\n    isSys: true,\n    show: false,\n  })\n  googleCommonEabAccessId!: number;\n\n  @TaskInput({\n    title: \"ZeroSSL公共EAB授权\",\n    isSys: true,\n    show: false,\n  })\n  zerosslCommonEabAccessId!: number;\n\n  @TaskInput({\n    title: \"EAB授权\",\n    component: {\n      name: \"access-selector\",\n      type: \"eab\",\n    },\n    maybeNeed: true,\n    required: false,\n    helper:\n      \"需要提供EAB授权\\nZeroSSL：请前往[zerossl开发者中心](https://app.zerossl.com/developer),生成 'EAB Credentials'\\n Google:请查看[google获取eab帮助文档](https://certd.docmirror.cn/guide/use/google/)，用过一次后会绑定邮箱，后续复用EAB要用同一个邮箱\",\n    mergeScript: `\n    return {\n        show: ctx.compute(({form})=>{\n            return (form.sslProvider === 'zerossl' && !form.zerosslCommonEabAccessId) || (form.sslProvider === 'google' && !form.googleCommonEabAccessId)\n        })\n    }\n    `,\n  })\n  eabAccessId!: number;\n\n  @TaskInput({\n    title: \"服务账号授权\",\n    component: {\n      name: \"access-selector\",\n      type: \"google\",\n    },\n    maybeNeed: true,\n    required: false,\n    helper: \"google服务账号授权与EAB授权选填其中一个，[服务账号授权获取方法](https://certd.docmirror.cn/guide/use/google/)\\n服务账号授权需要配置代理或者服务器本身在海外\",\n    mergeScript: `\n    return {\n        show: ctx.compute(({form})=>{\n            return form.sslProvider === 'google' && !form.googleCommonEabAccessId\n        })\n    }\n    `,\n  })\n  googleAccessId!: number;\n\n  @TaskInput({\n    title: \"加密算法\",\n    value: \"rsa_2048\",\n    component: {\n      name: \"a-select\",\n      vModel: \"value\",\n      options: [\n        { value: \"rsa_1024\", label: \"RSA 1024\" },\n        { value: \"rsa_2048\", label: \"RSA 2048\" },\n        { value: \"rsa_3072\", label: \"RSA 3072\" },\n        { value: \"rsa_4096\", label: \"RSA 4096\" },\n        { value: \"rsa_2048_pkcs1\", label: \"RSA 2048 pkcs1 (旧版)\" },\n        { value: \"ec_256\", label: \"EC 256\" },\n        { value: \"ec_384\", label: \"EC 384\" },\n        // { value: \"ec_521\", label: \"EC 521\" },\n      ],\n    },\n    helper: \"如无特殊需求，默认即可\\n选择RSA 2048 pkcs1可以获得旧版RSA证书\",\n    required: true,\n  })\n  privateKeyType!: PrivateKeyType;\n\n  @TaskInput({\n    title: \"证书配置\",\n    value: \"classic\",\n    component: {\n      name: \"a-select\",\n      vModel: \"value\",\n      options: [\n        { value: \"classic\", label: \"经典（classic）\" },\n        { value: \"tlsserver\", label: \"TLS服务器（tlsserver）\" },\n        { value: \"shortlived\", label: \"短暂的（shortlived）\" },\n      ],\n    },\n    helper: \"如无特殊需求，默认即可\",\n    required: false,\n    mergeScript: `\n    return {\n        show: ctx.compute(({form})=>{\n            return form.sslProvider === 'letsencrypt'\n        })\n    }\n    `,\n  })\n  certProfile!: string;\n\n  @TaskInput({\n    title: \"使用代理\",\n    value: false,\n    component: {\n      name: \"a-switch\",\n      vModel: \"checked\",\n    },\n    helper: \"如果acme-v02.api.letsencrypt.org或dv.acme-v02.api.pki.goog被墙无法访问，请尝试开启此选项\\n默认情况会进行测试，如果无法访问，将会自动使用代理\",\n  })\n  useProxy = false;\n\n  @TaskInput({\n    title: \"自定义反代地址\",\n    component: {\n      placeholder: \"google.yourproxy.com\",\n    },\n    helper: \"填写你的自定义反代地址，不要带http://\\nletsencrypt反代目标：acme-v02.api.letsencrypt.org\\ngoogle反代目标：dv.acme-v02.api.pki.goog\",\n  })\n  reverseProxy = \"\";\n\n  @TaskInput({\n    title: \"跳过本地校验DNS\",\n    value: false,\n    component: {\n      name: \"a-switch\",\n      vModel: \"checked\",\n    },\n    helper: \"跳过本地校验可以加快申请速度，同时也会增加失败概率。\",\n  })\n  skipLocalVerify = false;\n\n  @TaskInput({\n    title: \"检查解析重试次数\",\n    value: 20,\n    component: {\n      name: \"a-input-number\",\n      vModel: \"value\",\n    },\n    helper: \"检查域名验证解析记录重试次数，如果你的域名服务商解析生效速度慢，可以适当增加此值\",\n  })\n  maxCheckRetryCount = 20;\n\n  @TaskInput({\n    title: \"等待解析生效时长\",\n    value: 30,\n    component: {\n      name: \"a-input-number\",\n      vModel: \"value\",\n    },\n    helper: \"等待解析生效时长（秒），如果使用CNAME方式校验，本地验证失败，可以尝试延长此时间（比如5-10分钟）\",\n  })\n  waitDnsDiffuseTime = 30;\n\n  acme!: AcmeService;\n\n  eab!: EabAccess;\n\n  async onInit() {\n    let eab: EabAccess = null;\n\n    if (this.sslProvider === \"google\") {\n      if (this.googleAccessId) {\n        this.logger.info(\"当前正在使用 google服务账号授权获取EAB\");\n        const googleAccess = await this.getAccess(this.googleAccessId);\n        const googleClient = new GoogleClient({\n          access: googleAccess,\n          logger: this.logger,\n        });\n        eab = await googleClient.getEab();\n      } else if (this.eabAccessId) {\n        this.logger.info(\"当前正在使用 google EAB授权\");\n        eab = await this.getAccess(this.eabAccessId);\n      } else if (this.googleCommonEabAccessId) {\n        this.logger.info(\"当前正在使用 google 公共EAB授权\");\n        eab = await this.getAccess(this.googleCommonEabAccessId, true);\n      } else {\n        throw new Error(\"google需要配置EAB授权或服务账号授权\");\n      }\n    } else if (this.sslProvider === \"zerossl\") {\n      if (this.eabAccessId) {\n        this.logger.info(\"当前正在使用 zerossl EAB授权\");\n        eab = await this.getAccess(this.eabAccessId);\n      } else if (this.zerosslCommonEabAccessId) {\n        this.logger.info(\"当前正在使用 zerossl 公共EAB授权\");\n        eab = await this.getAccess(this.zerosslCommonEabAccessId, true);\n      } else {\n        throw new Error(\"zerossl需要配置EAB授权\");\n      }\n    }\n    this.eab = eab;\n    const subDomainsGetter = await this.ctx.serviceGetter.get<ISubDomainsGetter>(\"subDomainsGetter\");\n    const domainParser = new DomainParser(subDomainsGetter, this.logger);\n    this.acme = new AcmeService({\n      userId: this.ctx.user.id,\n      userContext: this.userContext,\n      logger: this.logger,\n      sslProvider: this.sslProvider,\n      eab,\n      skipLocalVerify: this.skipLocalVerify,\n      useMappingProxy: this.useProxy,\n      reverseProxy: this.reverseProxy,\n      privateKeyType: this.privateKeyType,\n      signal: this.ctx.signal,\n      maxCheckRetryCount: this.maxCheckRetryCount,\n      domainParser,\n      waitDnsDiffuseTime: this.waitDnsDiffuseTime,\n    });\n  }\n\n  async doCertApply() {\n    let email = this.email;\n    if (this.eab && this.eab.email) {\n      email = this.eab.email;\n    }\n    const domains = this[\"domains\"];\n\n    const csrInfo = _.merge(\n      {\n        country: \"CN\",\n        state: \"GuangDong\",\n        locality: \"ShengZhen\",\n        organization: \"CertD Org.\",\n        organizationUnit: \"IT Department\",\n        emailAddress: email,\n      },\n      this.csrInfo ? JSON.parse(this.csrInfo) : {}\n    );\n    this.logger.info(\"开始申请证书,\", email, domains);\n\n    let dnsProvider: IDnsProvider = null;\n    let domainsVerifyPlan: DomainsVerifyPlan = null;\n    if (this.challengeType === \"cname\" || this.challengeType === \"http\" || this.challengeType === \"dnses\") {\n      domainsVerifyPlan = await this.createDomainsVerifyPlan(domains, this.domainsVerifyPlan);\n    } else if (this.challengeType === \"auto\") {\n      domainsVerifyPlan = await this.createDomainsVerifyPlanByAuto(domains);\n    } else {\n      const dnsProviderType = this.dnsProviderType;\n      const access = await this.getAccess(this.dnsProviderAccess);\n      dnsProvider = await this.createDnsProvider(dnsProviderType, access);\n    }\n\n    try {\n      const cert = await this.acme.order({\n        email,\n        domains,\n        dnsProvider,\n        domainsVerifyPlan,\n        csrInfo,\n        isTest: false,\n        privateKeyType: this.privateKeyType,\n        profile: this.certProfile,\n      });\n\n      const certInfo = this.formatCerts(cert);\n      return new CertReader(certInfo);\n    } catch (e: any) {\n      const message: string = e?.message;\n      if (message != null && message.indexOf(\"redundant with a wildcard domain in the same request\") >= 0) {\n        this.logger.error(e);\n        throw new Error(`通配符域名已经包含了普通域名，请删除其中一个（${message}）`);\n      }\n      if (e.name === \"CancelError\") {\n        throw new CancelError(e.message);\n      }\n      throw e;\n    }\n  }\n\n  async createDnsProvider(dnsProviderType: string, dnsProviderAccess: any): Promise<IDnsProvider> {\n    const domainParser = this.acme.options.domainParser;\n    const context: DnsProviderContext = {\n      access: dnsProviderAccess,\n      logger: this.logger,\n      http: this.ctx.http,\n      utils,\n      domainParser,\n    };\n    return await createDnsProvider({\n      dnsProviderType,\n      context,\n    });\n  }\n\n  async createDomainsVerifyPlan(domains: string[], verifyPlanSetting: DomainsVerifyPlanInput): Promise<DomainsVerifyPlan> {\n    const plan: DomainsVerifyPlan = {};\n\n    const domainParser = this.acme.options.domainParser;\n    for (const fullDomain of domains) {\n      const domain = fullDomain.replaceAll(\"*.\", \"\");\n      const mainDomain = await domainParser.parse(domain);\n      const planSetting: DomainVerifyPlanInput = verifyPlanSetting[mainDomain];\n      if (planSetting == null) {\n        throw new Error(`没有找到域名（${domain}）的校验计划`);\n      }\n      if (planSetting.type === \"dns\") {\n        plan[domain] = await this.createDnsDomainVerifyPlan(planSetting, domain, mainDomain);\n      } else if (planSetting.type === \"cname\") {\n        plan[domain] = await this.createCnameDomainVerifyPlan(domain, mainDomain);\n      } else if (planSetting.type === \"http\") {\n        plan[domain] = await this.createHttpDomainVerifyPlan(planSetting.httpVerifyPlan[domain], domain, mainDomain);\n      }\n    }\n    return plan;\n  }\n\n  private async createDomainsVerifyPlanByAuto(domains: string[]) {\n    //从数据库里面自动选择校验方式\n    // domain list\n    const domainList = new Set<string>();\n    //整理域名\n    for (let domain of domains) {\n      domain = domain.replaceAll(\"*.\", \"\");\n      domainList.add(domain);\n    }\n    const domainVerifierGetter: IDomainVerifierGetter = await this.ctx.serviceGetter.get(\"domainVerifierGetter\");\n\n    const verifiers: DomainVerifiers = await domainVerifierGetter.getVerifiers([...domainList]);\n\n    const plan: DomainsVerifyPlan = {};\n\n    for (const domain in verifiers) {\n      const verifier = verifiers[domain];\n      if (verifier == null) {\n        throw new Error(`没有找到与该域名（${domain}）匹配的校验方式，请先到‘域名管理’页面添加校验方式`);\n      }\n      if (verifier.type === \"dns\") {\n        plan[domain] = await this.createDnsDomainVerifyPlan(verifier.dns, domain, verifier.mainDomain);\n      } else if (verifier.type === \"cname\") {\n        plan[domain] = await this.createCnameDomainVerifyPlan(domain, verifier.mainDomain);\n      } else if (verifier.type === \"http\") {\n        plan[domain] = await this.createHttpDomainVerifyPlan(verifier.http, domain, verifier.mainDomain);\n      }\n    }\n    return plan;\n  }\n\n  private async createDnsDomainVerifyPlan(planSetting: DnsVerifier, domain: string, mainDomain: string): Promise<DomainVerifyPlan> {\n    const access = await this.getAccess(planSetting.dnsProviderAccessId);\n    return {\n      type: \"dns\",\n      mainDomain,\n      domain,\n      dnsProvider: await this.createDnsProvider(planSetting.dnsProviderType, access),\n    };\n  }\n\n  private async createHttpDomainVerifyPlan(httpSetting: HttpVerifier, domain: string, mainDomain: string): Promise<DomainVerifyPlan> {\n    const httpUploaderContext = {\n      accessService: this.ctx.accessService,\n      logger: this.logger,\n      utils,\n    };\n\n    const access = await this.getAccess(httpSetting.httpUploaderAccess);\n    let rootDir = httpSetting.httpUploadRootDir;\n    if (!rootDir.endsWith(\"/\") && !rootDir.endsWith(\"\\\\\")) {\n      rootDir = rootDir + \"/\";\n    }\n    this.logger.info(\"上传方式\", httpSetting.httpUploaderType);\n    const httpUploader = await ossClientFactory.createOssClientByType(httpSetting.httpUploaderType, {\n      access,\n      rootDir: rootDir,\n      ctx: httpUploaderContext,\n    });\n    return {\n      type: \"http\",\n      domain,\n      mainDomain,\n      httpVerifyPlan: {\n        type: \"http\",\n        domain,\n        httpUploader,\n      },\n    };\n  }\n\n  private async createCnameDomainVerifyPlan(domain: string, mainDomain: string): Promise<DomainVerifyPlan> {\n    const cnameRecord = await this.ctx.cnameProxyService.getByDomain(domain);\n    if (cnameRecord == null) {\n      throw new Error(`请先配置${domain}的CNAME记录，并通过校验`);\n    }\n    let dnsProvider = cnameRecord.commonDnsProvider;\n    if (cnameRecord.cnameProvider.id > 0) {\n      dnsProvider = await this.createDnsProvider(cnameRecord.cnameProvider.dnsProviderType, cnameRecord.cnameProvider.access);\n    }\n    return {\n      type: \"cname\",\n      domain,\n      mainDomain,\n      cnameVerifyPlan: {\n        domain: cnameRecord.cnameProvider.domain,\n        fullRecord: cnameRecord.recordValue,\n        dnsProvider,\n      },\n    };\n  }\n}\n\nnew CertApplyPlugin();\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/dns.ts",
    "content": "export const dnsList = [];\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/plugin/cert-plugin/lego/index.ts",
    "content": "import { IsTaskPlugin, pluginGroups, RunStrategy, Step, TaskInput } from \"@certd/pipeline\";\nimport type { CertInfo } from \"../acme.js\";\nimport { CertReader } from \"../cert-reader.js\";\nimport { CertApplyBasePlugin } from \"../base.js\";\nimport fs from \"fs\";\nimport { EabAccess } from \"../../../access/index.js\";\nimport path from \"path\";\nimport JSZip from \"jszip\";\n\nexport { CertReader };\nexport type { CertInfo };\nexport type PrivateKeyType = \"rsa2048\" | \"rsa3072\" | \"rsa4096\" | \"rsa8192\" | \"ec256\" | \"ec384\";\n\n@IsTaskPlugin({\n  name: \"CertApplyLego\",\n  icon: \"ph:certificate\",\n  title: \"证书申请（Lego）\",\n  group: pluginGroups.cert.key,\n  desc: \"支持海量DNS解析提供商，推荐使用，一样的免费通配符域名证书申请，支持多个域名打到同一个证书上\",\n  default: {\n    input: {\n      renewDays: 35,\n      forceUpdate: false,\n    },\n    strategy: {\n      runStrategy: RunStrategy.AlwaysRun,\n    },\n  },\n})\nexport class CertApplyLegoPlugin extends CertApplyBasePlugin {\n  // @TaskInput({\n  //   title: \"ACME服务端点\",\n  //   default: \"https://acme-v02.api.letsencrypt.org/directory\",\n  //   component: {\n  //     name: \"a-select\",\n  //     vModel: \"value\",\n  //     options: [\n  //       { value: \"https://acme-v02.api.letsencrypt.org/directory\", label: \"Let's Encrypt\" },\n  //       { value: \"https://letsencrypt.proxy.handsfree.work/directory\", label: \"Let's Encrypt代理，letsencrypt.org无法访问时使用\" },\n  //     ],\n  //   },\n  //   required: true,\n  // })\n  acmeServer!: string;\n\n  @TaskInput({\n    title: \"DNS类型\",\n    component: {\n      name: \"a-input\",\n      vModel: \"value\",\n      placeholder: \"alidns\",\n    },\n    helper: \"你的域名是通过哪家提供商进行解析的，具体应该配置什么请参考lego文档：https://go-acme.github.io/lego/dns/\",\n    required: true,\n  })\n  dnsType!: string;\n\n  @TaskInput({\n    title: \"环境变量\",\n    component: {\n      name: \"a-textarea\",\n      vModel: \"value\",\n      rows: 4,\n      placeholder: \"ALICLOUD_ACCESS_KEY=abcdefghijklmnopqrstuvwx\\nALICLOUD_SECRET_KEY=your-secret-key\",\n    },\n    required: true,\n    helper: \"一行一条，例如 appKeyId=xxxxx，具体配置请参考lego文档：https://go-acme.github.io/lego/dns/\",\n  })\n  environment!: string;\n\n  @TaskInput({\n    title: \"EAB授权\",\n    component: {\n      name: \"access-selector\",\n      type: \"eab\",\n    },\n    maybeNeed: true,\n    helper: \"如果需要提供EAB授权\",\n  })\n  legoEabAccessId!: number;\n\n  @TaskInput({\n    title: \"自定义LEGO全局参数\",\n    component: {\n      name: \"a-input\",\n      vModel: \"value\",\n      placeholder: \"--dns-timeout 30\",\n    },\n    helper: \"额外的lego全局命令行参数，参考文档：https://go-acme.github.io/lego/usage/cli/options/\",\n    maybeNeed: true,\n  })\n  customArgs = \"\";\n\n  @TaskInput({\n    title: \"自定义LEGO签名参数\",\n    component: {\n      name: \"a-input\",\n      vModel: \"value\",\n      placeholder: \"--no-bundle\",\n    },\n    helper: \"额外的lego签名命令行参数，参考文档：https://go-acme.github.io/lego/usage/cli/options/\",\n    maybeNeed: true,\n  })\n  customCommandOptions = \"\";\n\n  @TaskInput({\n    title: \"加密算法\",\n    value: \"ec256\",\n    component: {\n      name: \"a-select\",\n      vModel: \"value\",\n      options: [\n        { value: \"rsa2048\", label: \"RSA 2048\" },\n        { value: \"rsa3072\", label: \"RSA 3072\" },\n        { value: \"rsa4096\", label: \"RSA 4096\" },\n        { value: \"rsa8192\", label: \"RSA 8192\" },\n        { value: \"ec256\", label: \"EC 256\" },\n        { value: \"ec384\", label: \"EC 384\" },\n        // { value: \"ec_521\", label: \"EC 521\" },\n      ],\n    },\n    helper: \"如无特殊需求，默认即可\",\n    required: true,\n  })\n  privateKeyType!: PrivateKeyType;\n\n  eab?: EabAccess;\n\n  getCheckChangeInputKeys() {\n    return [\"domains\", \"privateKeyType\", \"dnsType\"];\n  }\n\n  async onInstance() {\n    this.accessService = this.ctx.accessService;\n    this.logger = this.ctx.logger;\n    this.userContext = this.ctx.userContext;\n    this.lastStatus = this.ctx.lastStatus as Step;\n    if (this.legoEabAccessId) {\n      this.eab = await this.accessService.getById(this.legoEabAccessId);\n    }\n  }\n  async onInit(): Promise<void> {}\n\n  async doCertApply() {\n    const env: any = {};\n    const env_lines = this.environment.split(\"\\n\");\n    for (const line of env_lines) {\n      const [key, value] = line.trim().split(\"=\");\n      env[key] = value.trim();\n    }\n\n    let domainArgs = \"\";\n    for (const domain of this.domains) {\n      domainArgs += ` -d \"${domain}\"`;\n    }\n    this.logger.info(`环境变量:${JSON.stringify(env)}`);\n    let eabArgs = \"\";\n    if (this.eab) {\n      eabArgs = ` --eab --kid \"${this.eab.kid}\" --hmac \"${this.eab.hmacKey}\"`;\n    }\n    const keyType = `-k ${this.privateKeyType}`;\n\n    const saveDir = `./data/.lego/pipeline_${this.pipeline.id}/`;\n    const savePathArgs = `--path \"${saveDir}\"`;\n    const os_type = process.platform === \"win32\" ? \"windows\" : \"linux\";\n    const legoDir = \"./tools/lego\";\n    const legoPath = path.resolve(legoDir, os_type === \"windows\" ? \"lego.exe\" : \"lego\");\n    if (!fs.existsSync(legoPath)) {\n      //解压缩\n      const arch = process.arch;\n      let platform = \"amd64\";\n      if (arch === \"arm64\" || arch === \"arm\") {\n        platform = \"arm64\";\n      }\n      const LEGO_VERSION = process.env.LEGO_VERSION;\n      let legoZipFileName = `lego_v${LEGO_VERSION}_windows_${platform}.zip`;\n      if (os_type === \"linux\") {\n        legoZipFileName = `lego_v${LEGO_VERSION}_linux_${platform}.tar.gz`;\n      }\n      const legoZipFilePath = `${legoDir}/${legoZipFileName}`;\n      if (!fs.existsSync(legoZipFilePath)) {\n        this.logger.info(`lego文件不存在:${legoZipFilePath},准备下载`);\n        const downloadUrl = `https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/${legoZipFileName}`;\n        await this.ctx.download(\n          {\n            url: downloadUrl,\n            method: \"GET\",\n            logRes: false,\n          },\n          legoZipFilePath\n        );\n        this.logger.info(\"下载lego成功\");\n      }\n\n      if (os_type === \"linux\") {\n        //tar是否存在\n        await this.ctx.utils.sp.spawn({\n          cmd: `tar -zxvf ${legoZipFilePath} -C ${legoDir}/`,\n        });\n        await this.ctx.utils.sp.spawn({\n          cmd: `chmod +x ${legoDir}/*`,\n        });\n        this.logger.info(\"解压lego成功\");\n      } else {\n        const zip = new JSZip();\n        const data = fs.readFileSync(legoZipFilePath);\n        const zipData = await zip.loadAsync(data);\n        const files = Object.keys(zipData.files);\n        for (const file of files) {\n          const content = await zipData.files[file].async(\"nodebuffer\");\n          fs.writeFileSync(`${legoDir}/${file}`, content);\n        }\n        this.logger.info(\"解压lego成功\");\n      }\n    }\n    let serverArgs = \"\";\n    if (this.acmeServer) {\n      serverArgs = ` --server ${this.acmeServer}`;\n    }\n    const cmds = [`${legoPath} -a --email \"${this.email}\" --dns ${this.dnsType} ${keyType} ${domainArgs} ${serverArgs} ${eabArgs} ${savePathArgs} ${this.customArgs || \"\"} run ${this.customCommandOptions || \"\"}`];\n\n    await this.ctx.utils.sp.spawn({\n      cmd: cmds,\n      logger: this.logger,\n      env,\n    });\n\n    //读取证书文件\n    // example.com.crt\n    // example.com.issuer.crt\n    // example.com.json\n    // example.com.key\n\n    let domain1 = this.domains[0];\n    domain1 = domain1.replaceAll(\"*\", \"_\");\n    const crtPath = path.resolve(saveDir, \"certificates\", `${domain1}.crt`);\n    if (fs.existsSync(crtPath) === false) {\n      throw new Error(`证书文件不存在,证书申请失败:${crtPath}`);\n    }\n    const crt = fs.readFileSync(crtPath, \"utf8\");\n    const keyPath = path.resolve(saveDir, \"certificates\", `${domain1}.key`);\n    const key = fs.readFileSync(keyPath, \"utf8\");\n    const csr = \"\";\n    const cert = { crt, key, csr };\n    const certInfo = this.formatCerts(cert);\n    return new CertReader(certInfo);\n  }\n}\n\nnew CertApplyLegoPlugin();\n"
  },
  {
    "path": "packages/plugins/plugin-cert/src/plugin/index.ts",
    "content": "export { EVENT_CERT_APPLY_SUCCESS } from \"./cert-plugin/base-convert.js\";\n\nexport * from \"./cert-plugin/index.js\";\nexport * from \"./cert-plugin/lego/index.js\";\nexport * from \"./cert-plugin/custom/index.js\";\nexport const CertApplyPluginNames = [\":cert:\"];\n"
  },
  {
    "path": "packages/plugins/plugin-cert/test/cert-plugin.test.mjs",
    "content": "import { expect } from \"chai\";\nimport { CertApplyPlugin } from \"../dist/index.js\";\nimport dayjs from \"dayjs\";\nimport { logger } from \"@certd/basic\";\n\ndescribe(\"test/cert-plugin.ts\", () => {\n  const certApplyPlugin = new CertApplyPlugin();\n  certApplyPlugin.logger = logger;\n  it(\"should throw error when expires is null or undefined\", () => {\n    expect(() => {\n      // @ts-ignore\n      certApplyPlugin.isWillExpire(undefined);\n    }).throw(\"过期时间不能为空\");\n\n    expect(() => {\n      // @ts-ignore\n      certApplyPlugin.isWillExpire(null);\n    }).throw(\"过期时间不能为空\");\n  });\n\n  it(\"isWillExpire\", () => {\n    const now = dayjs().add(36, \"day\") - 10000;\n    const res = certApplyPlugin.isWillExpire(now.valueOf(), 35);\n    console.log(res);\n    expect(res.isWillExpire).eq(true);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/plugin-cert/tsconfig.json",
    "content": "{\n  \"compileOnSave\": true,\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"esModuleInterop\": true,\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"inlineSourceMap\":true,\n    \"noImplicitThis\": true,\n    \"noUnusedLocals\": true,\n    \"stripInternal\": true,\n    \"skipLibCheck\": true,\n    \"pretty\": true,\n    \"declaration\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"typeRoots\": [ \"./typings\", \"./node_modules/@types\"],\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"composite\": false,\n    \"useDefineForClassFields\": true,\n    \"strict\": false,\n//    \"sourceMap\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": false,\n    \"lib\": [\"ESNext\", \"DOM\"],\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"src/**/*.d.ts\",\n    \"src/**/*.json\"\n  ],\n  \"exclude\": [\n    \"*.js\",\n    \"*.ts\",\n    \"dist\",\n    \"node_modules\",\n    \"test\"\n  ],\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/.eslintrc",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"plugins\": [\n    \"@typescript-eslint\"\n  ],\n  \"extends\": [\n    \"plugin:@typescript-eslint/recommended\",\n    \"plugin:prettier/recommended\",\n    \"prettier\"\n  ],\n  \"env\": {\n    \"mocha\": true\n  },\n  \"rules\": {\n    \"@typescript-eslint/no-var-requires\": \"off\",\n    \"@typescript-eslint/ban-ts-comment\": \"off\",\n    \"@typescript-eslint/ban-ts-ignore\": \"off\",\n    \"@typescript-eslint/no-explicit-any\": \"off\",\n    \"@typescript-eslint/no-empty-function\": \"off\",\n    \"@typescript-eslint/no-unused-vars\": \"off\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n\ntest/user.secret.*\n"
  },
  {
    "path": "packages/plugins/plugin-lib/.mocharc.json",
    "content": "{\n  \"extension\": [\"ts\"],\n  \"spec\": \"test/**/*.test.ts\",\n  \"require\": \"ts-node/register\"\n}"
  },
  {
    "path": "packages/plugins/plugin-lib/.npmignore",
    "content": "node_modules\nsrc"
  },
  {
    "path": "packages/plugins/plugin-lib/.npmrc",
    "content": "link-workspace-packages=deep\nprefer-workspace-packages=true\n"
  },
  {
    "path": "packages/plugins/plugin-lib/.prettierrc",
    "content": "{\n  \"printWidth\": 220,\n  \"bracketSpacing\": true,\n  \"singleQuote\": false,\n  \"trailingComma\": \"es5\",\n  \"arrowParens\": \"avoid\"\n}"
  },
  {
    "path": "packages/plugins/plugin-lib/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n### Bug Fixes\n\n* 修复ssh无法执行命令的bug ([9763cb0](https://github.com/certd/certd/commit/9763cb00e5d95b2fa5d1c2d3d4a8eecac71600e6))\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n### Bug Fixes\n\n* 修复流水线页面状态没有刷新的bug ([93e9498](https://github.com/certd/certd/commit/93e9498b410353f504e11e264db62468895d7290))\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n### Bug Fixes\n\n* 执行windows nginx命令时，改为return code判断是否执行成功 ([b37cffd](https://github.com/certd/certd/commit/b37cffd704cd08b8bdd68a6e284706eabe59e78d))\n\n### Performance Improvements\n\n* 支持部署到阿里云vod ([98da4e1](https://github.com/certd/certd/commit/98da4e1791ed8bb21daf2a9914fda875d14633c9))\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n### Bug Fixes\n\n* 腾讯云授权支持设置是否国际站，部署到EO插件支持国际站 ([5cd3968](https://github.com/certd/certd/commit/5cd3968929acef333cf30d3b20cf21cea6c82c5f))\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n### Performance Improvements\n\n* 支持s3 access做测试 ([f00aeac](https://github.com/certd/certd/commit/f00aeacb8b5c81f0bafa4c1b76723dec2b6b7784))\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n### Bug Fixes\n\n* 修复阿里云新加坡clb无法部署证书的bug ([3e84e11](https://github.com/certd/certd/commit/3e84e116e863b54c6b4d7db160af372dacc5857f))\n\n### Performance Improvements\n\n* 优化阿里云nlb支持部署扩展证书 ([9cbdfda](https://github.com/certd/certd/commit/9cbdfda829b231733d54c66c5024d46e6fc11af3))\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n### Performance Improvements\n\n* aliyun alb支持部署扩展证书 ([2a19b61](https://github.com/certd/certd/commit/2a19b61b7a78620c06396c2cc37cc77d738b6d12))\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n### Performance Improvements\n\n* 支持部署到飞牛OS ([ddfd0fb](https://github.com/certd/certd/commit/ddfd0fb81d6638352920261065f1ab8e27bdd564))\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n### Bug Fixes\n\n* 修复阿里云 esa 证书获取站点列表错误的问题 ([0c2ea5d](https://github.com/certd/certd/commit/0c2ea5da4c836f8a0df132a3f22d399bd9ee1de9))\n\n### Performance Improvements\n\n* 关闭腾讯云证书通知提醒 ([231a875](https://github.com/certd/certd/commit/231a875bb481420c39bf76ec9ff4e50954ab9fe4))\n* 优化站点选择组件，切换选择时不刷新列表 ([3a14714](https://github.com/certd/certd/commit/3a147141b1a5d67c92a5ce88a5313eaa62859e03))\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n### Performance Improvements\n\n* 添加阿里云 ESA证书部署插件 ([1db1ffd](https://github.com/certd/certd/commit/1db1ffde99ac7e4684fa606ebc4c327f829b3a26))\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n### Performance Improvements\n\n* aaWaf、cdnfly站点选择支持查询 ([8af3463](https://github.com/certd/certd/commit/8af3463668a40b9b99febb02e3b4e0d9d8d719b4))\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n### Performance Improvements\n\n* 支持部署到maoyun cdn ([68f333f](https://github.com/certd/certd/commit/68f333fb87ce85eed27436ecb0f76351c0ccb0d1))\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n### Performance Improvements\n\n* http方式支持校验443端口 ([d75fcb7](https://github.com/certd/certd/commit/d75fcb7fec421a9a638eaa27fe9378c84b5e0f19))\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n### Performance Improvements\n\n* 支持部署证书到火山dcdn ([5f85219](https://github.com/certd/certd/commit/5f852194953dc1b4e6336770f417507b8f5a33ad))\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n### Performance Improvements\n\n* 优化cdnfly插件，支持自动匹配域名部署 ([afd59e9](https://github.com/certd/certd/commit/afd59e9933b2650f41c5d47684c171b93b962065))\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n### Bug Fixes\n\n* 修复http上传方式无法清除记录文件的bug ([72a7b51](https://github.com/certd/certd/commit/72a7b51d479602b2c54c6c3ac8d8a0dcb9664e73))\n\n### Performance Improvements\n\n* 七牛oss支持删除过期备份 ([b7113bd](https://github.com/certd/certd/commit/b7113bda2378116d6c116dc583f563cce7cf9f00))\n* 数据库备份支持oss ([308d460](https://github.com/certd/certd/commit/308d4600efe2002f199c33b4594d3071784e58ea))\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n### Performance Improvements\n\n* ssh PTY模式登录设置 ([8385bcc](https://github.com/certd/certd/commit/8385bcc2d7f2411a07748bb5c53f9eaf4d38d7cc))\n* ssh伪终端模式优化，windows下不开启 ([42dfe93](https://github.com/certd/certd/commit/42dfe936b773b7bdd82ca3378363252ffffd7b71))\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n### Performance Improvements\n\n* 插件支持导入导出 ([cf8abb4](https://github.com/certd/certd/commit/cf8abb45282070c8ba91469f93fd379fabf1f74a))\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n### Bug Fixes\n\n* 修复ssh支持键盘事件登录 ([8145808](https://github.com/certd/certd/commit/8145808c4370364377b4ffe3ae88ff465b49f20b))\n\n## [1.31.10](https://github.com/certd/certd/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.31.9](https://github.com/certd/certd/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n### Performance Improvements\n\n* 优化scp上传 ([e51123a](https://github.com/certd/certd/commit/e51123a95131cc76d655937488caf08956a67020))\n\n## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n### Performance Improvements\n\n* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))\n\n## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n### Performance Improvements\n\n* 流水线增加上传证书快捷方式 ([425bba6](https://github.com/certd/certd/commit/425bba67c539b734e2a85a83a4f9ecc9b2434fb4))\n\n## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n### Performance Improvements\n\n* 支持部署到天翼云CDN ([82a72e0](https://github.com/certd/certd/commit/82a72e0b497efa043d342ad0e33c083a2de79a05))\n\n## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n### Performance Improvements\n\n* http方式校验，选择sftp时，支持修改文件访问权限比如777 ([15d6eaf](https://github.com/certd/certd/commit/15d6eaf5532ed25acd4f8d58c429353a2f44206c))\n\n# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n### Bug Fixes\n\n* 修复查看任务日志偶发性无法自动滚动底部的bug ([7e482f7](https://github.com/certd/certd/commit/7e482f798c0142bce1866f84676cb40210f9638a))\n\n### Performance Improvements\n\n* 支持部署到阿里云ALB ([653940a](https://github.com/certd/certd/commit/653940a0ca64fc380178c1b0b58ae0af64dfaf07))\n* 支持部署到阿里云NLB、SLB ([c085bac](https://github.com/certd/certd/commit/c085bac5d877c4250a8a79e17eb8673b8e4fc89c))\n\n## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n### Performance Improvements\n\n* 优化acme sdk ([54db744](https://github.com/certd/certd/commit/54db74428259de64d12230c2ab7353ae11197bbc))\n* 支持http校验方式申请证书 ([405591c](https://github.com/certd/certd/commit/405591c5d08fa1a3b228ee3980199e7731cfec4a))\n* http校验方式，支持七牛云oss、阿里云oss、腾讯云cos ([3f74d4d](https://github.com/certd/certd/commit/3f74d4d9e5f5d0e629b44cff1895b3f7a8fbcafc))\n\n## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n**Note:** Version bump only for package @certd/plugin-lib\n\n# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n### Features\n\n* 手机号登录、邮箱验证码注册 ([7b55337](https://github.com/certd/certd/commit/7b55337c5edb470cca7aa62201eda8d274784004))\n\n### Performance Improvements\n\n* 部署到IIS插件 ([1534f45](https://github.com/certd/certd/commit/1534f4523633265d219d7b3a249a9ea1af99c512))\n* 选项显示图标 ([aedc462](https://github.com/certd/certd/commit/aedc46213571a3bd93809b7af7fa17a08d546237))\n\n## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n### Performance Improvements\n\n* 谷歌EAB绑定邮箱改成必填 ([81a8123](https://github.com/certd/certd/commit/81a8123725d7bf4bd6a32a64a066bd760b7b6a7f))\n* 优化插件开发，dnsProvider无需写http logger 变量 ([fcbb5e4](https://github.com/certd/certd/commit/fcbb5e46a112174150a62648319b8224fce3b7ed))\n* 支持企业微信群聊机器人通知 ([b805a29](https://github.com/certd/certd/commit/b805a2925984144a31575b8aaa622f0c30d41b56))\n\n## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n### Bug Fixes\n\n* 修复1Panel面板本身证书更新导致判定执行失败的问题 ([2689e6d](https://github.com/certd/certd/commit/2689e6d6c03aba21da90d5d45232c6ba08696be1))\n\n### Performance Improvements\n\n* 新手导航在非编辑模式下不显示 ([18bfcc2](https://github.com/certd/certd/commit/18bfcc24ad0bde57bb04db8a4209861ec6b8ff1d))\n* 支持namesilo ([80159ec](https://github.com/certd/certd/commit/80159ecca895103d0495f3217311199e66056572))\n* 专业版试用，无需绑定账号 ([c7c4318](https://github.com/certd/certd/commit/c7c4318c11b65a76089787aa58939832d338a232))\n\n## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n### Bug Fixes\n\n* 修复未设置pfx密码，导致jks转换报错的bug ([c3cfbd8](https://github.com/certd/certd/commit/c3cfbd8474155aed4379f91075de37d5d8c73ef0))\n\n## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n### Performance Improvements\n\n* 支持jks ([889eaae](https://github.com/certd/certd/commit/889eaaea92818f628b922dae540c026630611707))\n\n## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n### Performance Improvements\n\n* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941))\n\n## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n### Bug Fixes\n\n* pfx兼容windows server 2016 ([e5e468a](https://github.com/certd/certd/commit/e5e468a463f66d02f235de54b7c1e09ace5f1cb1))\n\n### Features\n\n* 首页全新改版 ([63ec5b5](https://github.com/certd/certd/commit/63ec5b5519c760a3330569c0da6dac157302a330))\n\n### Performance Improvements\n\n* lego 升级到 4.19.2 ([129bf53](https://github.com/certd/certd/commit/129bf53edc9bbb001fe49fbd7e239bd1d09cc128))\n\n## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n### Bug Fixes\n\n* 修复lego No help topic for 错误 ([aaaf8d7](https://github.com/certd/certd/commit/aaaf8d7db34896cf8f2ff8f12eec1ab0cae58f0f))\n\n## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n### Performance Improvements\n\n* 默认证书更新时间设置为35天，增加腾讯云删除过期证书插件，可以避免腾讯云过期证书邮件 ([51b6fed](https://github.com/certd/certd/commit/51b6fed468eaa6f28ce4497ce303ace1a52abb96))\n\n## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n### Bug Fixes\n\n* deprecated的运行时不要报错，只报警告 ([bcbefaa](https://github.com/certd/certd/commit/bcbefaaa35cf6d0eec085b3a2c5bfc7c6a8de9e1))\n\n## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n### Performance Improvements\n\n* 支持配置公共ZeroSSL授权 ([a90d1e6](https://github.com/certd/certd/commit/a90d1e68ee9cbc3705223457b8a86f071b150968))\n\n## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n### Performance Improvements\n\n* 申请证书启用新的反代地址 ([a705182](https://github.com/certd/certd/commit/a705182b85e51157883e48f23463263793bf3c12))\n* 优化证书申请速度和成功率，反代地址优化，google基本可以稳定请求。增加请求重试。 ([41d9c3a](https://github.com/certd/certd/commit/41d9c3ac8398def541e65351cbe920d4a927182d))\n* 优化pfx密码密码输入框，让浏览器不自动填写密码 ([ffeede3](https://github.com/certd/certd/commit/ffeede38afa70c5ff6f2015516bead23d2c4df87))\n\n## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n### Bug Fixes\n\n* 修复cname服务普通用户access访问权限问题 ([c1e3e2e](https://github.com/certd/certd/commit/c1e3e2ee1f923ee5806479dd5f178c3286a01ae0))\n\n## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n### Performance Improvements\n\n* 触发证书重新申请input变化对比规则优化，减少升级版本后触发申请证书的情况 ([c46a2a9](https://github.com/certd/certd/commit/c46a2a9a399c2a9a8bb59a48b9fb6e93227cce9b))\n\n## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n### Performance Improvements\n\n* 密钥备份 ([1c6028a](https://github.com/certd/certd/commit/1c6028abcf8849163462bb2f8441b6838357e09b))\n* 证书直接查看 ([5dde5bd](https://github.com/certd/certd/commit/5dde5bd3f76db3959d411619d29bfb8064e3b307))\n* sqlite数据库备份插件 ([77f1631](https://github.com/certd/certd/commit/77f163144f7dcfb0431475c55508fecfd6d969f8))\n\n## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n### Performance Improvements\n\n* [comm] 支持插件管理 ([e8b617b](https://github.com/certd/certd/commit/e8b617b80ce882dd63006f0cfc719a80a1cc6acc))\n* 新增代理设置功能 ([273ab61](https://github.com/certd/certd/commit/273ab6139f5807f4d7fe865cc353b97f51b9a668))\n* EAB授权支持绑定邮箱，支持公共EAB设置 ([07043af](https://github.com/certd/certd/commit/07043aff0ca7fd29c56dd3c363002cb15d78b464))\n\n## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n### Features\n\n* 域名验证方法支持CNAME间接方式，此方式支持所有域名注册商，且无需提供Access授权，但是需要手动添加cname解析 ([f3d3508](https://github.com/certd/certd/commit/f3d35084ed44f9f33845f7045e520be5c27eed93))\n\n### Performance Improvements\n\n* 调整静态资源到static目录 ([0584b36](https://github.com/certd/certd/commit/0584b3672b40f9042a2ed87e5627022606d046cd))\n* 检查cname是否正确配置 ([b5d8935](https://github.com/certd/certd/commit/b5d8935159374fbe7fc7d4c48ae0ed9396861bdd))\n* 域名输入增加校验提示，避免输入错误的域名 ([0c8e83e](https://github.com/certd/certd/commit/0c8e83e1254a9ce4d5a4e7888eb1710394a4b77c))\n* cname校验配置增加未校验通过提示 ([77cc3c4](https://github.com/certd/certd/commit/77cc3c4a5cbd81f8233a8e0bb33fab0621c0905f))\n* google eab授权支持自动获取，不过要配置代理 ([592791d](https://github.com/certd/certd/commit/592791d1356fc252fbb70d7f168567aee9585507))\n\n## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)\n\n### Bug Fixes\n\n* 修复西部数码账户级别apikey不可用的bug ([f8f3e8b](https://github.com/certd/certd/commit/f8f3e8b43fd5d815887bcb53b95f46dc96424b79))\n\n## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)\n\n### Bug Fixes\n\n* 修复pfxPassword无效的bug ([251e450](https://github.com/certd/certd/commit/251e450fabfe62405bac13e39f2153736c081ef0))\n\n## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)\n\n### Performance Improvements\n\n* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))\n\n## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)\n\n### Features\n\n* 支持中间证书 ([e86756e](https://github.com/certd/certd/commit/e86756e4c65a53dd23106d7ecbfe2fa987cc13f3))\n\n### Performance Improvements\n\n* 证书支持旧版RSA，pkcs1 ([3d9c3ec](https://github.com/certd/certd/commit/3d9c3ecb3eb604b2458154f608bde0f01915d116))\n* plugins增加图标 ([a8da658](https://github.com/certd/certd/commit/a8da658a9723342b4f43a579f7805bfef0648efb))\n\n## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09)\n\n### Performance Improvements\n\n* 支持群晖 ([5c270b6](https://github.com/certd/certd/commit/5c270b6b9d45a2152f9fdb3c07bd98b7c803cb8e))\n\n## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.24.2](https://github.com/certd/certd/compare/v1.24.1...v1.24.2) (2024-09-06)\n\n### Performance Improvements\n\n* 任务配置不需要的字段可以自动隐藏 ([192d9dc](https://github.com/certd/certd/commit/192d9dc7e36737d684c769f255f407c28b1152ac))\n* 修复windows下无法执行第二条命令的bug ([d5bfcdb](https://github.com/certd/certd/commit/d5bfcdb6de1dcc1702155442e2e00237d0bbb6e5))\n* 优化跳过处理逻辑 ([b80210f](https://github.com/certd/certd/commit/b80210f24bf5db1c958d06ab27c9e5d3db452eda))\n* 支持pfx、der ([fbeaed2](https://github.com/certd/certd/commit/fbeaed203519f59b6d9396c4e8953353ccb5e723))\n\n## [1.24.1](https://github.com/certd/certd/compare/v1.24.0...v1.24.1) (2024-09-02)\n\n### Performance Improvements\n\n* 授权配置支持加密 ([42a56b5](https://github.com/certd/certd/commit/42a56b581d754c3e5f9838179d19ab0d004ef2eb))\n\n# [1.24.0](https://github.com/certd/certd/compare/v1.23.1...v1.24.0) (2024-08-25)\n\n### Bug Fixes\n\n* 修复成功后跳过之后丢失腾讯云证书id的bug ([37eb762](https://github.com/certd/certd/commit/37eb762afe25c5896b75dee25f32809f8426e7b7))\n* 修复创建流水线后立即运行时报no id错误的bug ([17ead54](https://github.com/certd/certd/commit/17ead547aab25333603980304aa3aad3db1f73d5))\n* 修复使用代理的情况下申请证书失败的bug ([95122e2](https://github.com/certd/certd/commit/95122e28609333f4df55c266e5434897954c0fb3))\n\n### Features\n\n* 支持ECC类型 ([a7424e0](https://github.com/certd/certd/commit/a7424e02f5c7e02ac1688791040785920ce67473))\n\n### Performance Improvements\n\n* 更新k8s底层api库 ([746bb9d](https://github.com/certd/certd/commit/746bb9d385e2f397daef4976eca1d4782a2f5ebd))\n* 优化成功后跳过的提示 ([7b451bb](https://github.com/certd/certd/commit/7b451bbf6e6337507f4627b5a845f5bd96ab4f7b))\n* 优化证书申请成功率 ([968c469](https://github.com/certd/certd/commit/968c4690a07f69c08dcb3d3a494da4e319627345))\n\n## [1.23.1](https://github.com/certd/certd/compare/v1.23.0...v1.23.1) (2024-08-06)\n\n### Performance Improvements\n\n* 优化插件字段的default value ([24c7be2](https://github.com/certd/certd/commit/24c7be2c9cb39c14f7a97b674127c88033280b02))\n\n## [1.22.8](https://github.com/certd/certd/compare/v1.22.7...v1.22.8) (2024-08-05)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.22.7](https://github.com/certd/certd/compare/v1.22.6...v1.22.7) (2024-08-04)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.22.6](https://github.com/certd/certd/compare/v1.22.5...v1.22.6) (2024-08-03)\n\n### Performance Improvements\n\n* 流水线支持名称模糊查询 ([59897c4](https://github.com/certd/certd/commit/59897c4ceae992ebe2972ca9e8f9196616ffdfd7))\n\n## [1.22.5](https://github.com/certd/certd/compare/v1.22.4...v1.22.5) (2024-07-26)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.22.4](https://github.com/certd/certd/compare/v1.22.3...v1.22.4) (2024-07-26)\n\n### Performance Improvements\n\n* 证书申请支持反向代理，letsencrypt无法访问时的备用方案 ([b7b5df0](https://github.com/certd/certd/commit/b7b5df0587e0f7ea288c1b2af6f87211f207395f))\n\n## [1.22.3](https://github.com/certd/certd/compare/v1.22.2...v1.22.3) (2024-07-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.22.2](https://github.com/certd/certd/compare/v1.22.1...v1.22.2) (2024-07-23)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20)\n\n### Performance Improvements\n\n* 创建证书任务可以选择lege插件 ([affef13](https://github.com/certd/certd/commit/affef130378030c517250c58a4e787b0fc85d7d1))\n\n# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)\n\n### Features\n\n* 升级midway，支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))\n* 支持lego，海量DNS提供商 ([0bc6d0a](https://github.com/certd/certd/commit/0bc6d0a211920fb0084d705e1db67ee1e7262c44))\n\n## [1.21.2](https://github.com/certd/certd/compare/v1.21.1...v1.21.2) (2024-07-08)\n\n### Performance Improvements\n\n* 申请证书时可以选择跳过本地dns校验 ([fe91d94](https://github.com/certd/certd/commit/fe91d94090d22ed0a3ea753ba74dfaa1bf057c17))\n\n## [1.21.1](https://github.com/certd/certd/compare/v1.21.0...v1.21.1) (2024-07-08)\n\n### Performance Improvements\n\n* 说明优化，默认值优化 ([970c7fd](https://github.com/certd/certd/commit/970c7fd8a0f557770e973d8462ee5684ef742810))\n\n# [1.21.0](https://github.com/certd/certd/compare/v1.20.17...v1.21.0) (2024-07-03)\n\n### Features\n\n* 支持zero ssl ([eade2c2](https://github.com/certd/certd/commit/eade2c2b681569f03e9cd466e7d5bcd6703ed492))\n\n## [1.20.17](https://github.com/certd/certd/compare/v1.20.16...v1.20.17) (2024-07-03)\n\n### Performance Improvements\n\n* 优化cname verify ([eba333d](https://github.com/certd/certd/commit/eba333de7a5b5ef4b0b7eaa904f578720102fa61))\n\n## [1.20.16](https://github.com/certd/certd/compare/v1.20.15...v1.20.16) (2024-07-01)\n\n### Bug Fixes\n\n* 修复配置了cdn cname后申请失败的bug ([4a5fa76](https://github.com/certd/certd/commit/4a5fa767edc347d03d29a467e86c9a4d70b0220c))\n\n## [1.20.15](https://github.com/certd/certd/compare/v1.20.14...v1.20.15) (2024-06-28)\n\n### Performance Improvements\n\n* 腾讯云dns provider 支持腾讯云的accessId ([e0eb3a4](https://github.com/certd/certd/commit/e0eb3a441384d474fe2923c69b25318264bdc9df))\n\n## [1.20.14](https://github.com/certd/certd/compare/v1.20.13...v1.20.14) (2024-06-23)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.20.13](https://github.com/certd/certd/compare/v1.20.12...v1.20.13) (2024-06-18)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.20.12](https://github.com/certd/certd/compare/v1.20.10...v1.20.12) (2024-06-17)\n\n### Bug Fixes\n\n* 修复aliyun域名超过100个找不到域名的bug ([5b1494b](https://github.com/certd/certd/commit/5b1494b3ce93d1026dc56ee741342fbb8bf7be24))\n\n### Performance Improvements\n\n* 支持cloudflare域名 ([fbb9a47](https://github.com/certd/certd/commit/fbb9a47e8f7bb805289b9ee64bd46ffee0f01c06))\n\n## [1.20.10](https://github.com/certd/certd/compare/v1.20.9...v1.20.10) (2024-05-30)\n\n### Performance Improvements\n\n* 上传到主机插件支持复制到本机路径 ([92446c3](https://github.com/certd/certd/commit/92446c339936f98f08f654b8971a7393d8435224))\n* 优化文件下载包名 ([d9eb927](https://github.com/certd/certd/commit/d9eb927b0a1445feab08b1958aa9ea80637a5ae6))\n\n## [1.20.9](https://github.com/certd/certd/compare/v1.20.8...v1.20.9) (2024-03-22)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.20.8](https://github.com/certd/certd/compare/v1.20.7...v1.20.8) (2024-03-22)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.20.7](https://github.com/certd/certd/compare/v1.20.6...v1.20.7) (2024-03-22)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.20.6](https://github.com/certd/certd/compare/v1.20.5...v1.20.6) (2024-03-21)\n\n### Performance Improvements\n\n* 插件贡献文档及示例 ([72fb20a](https://github.com/certd/certd/commit/72fb20abf3ba5bdd862575d2907703a52fd7eb17))\n\n## [1.20.5](https://github.com/certd/certd/compare/v1.20.2...v1.20.5) (2024-03-11)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.20.2](https://github.com/certd/certd/compare/v1.2.1...v1.20.2) (2024-02-28)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.2.1](https://github.com/certd/certd/compare/v1.2.0...v1.2.1) (2023-12-12)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.2.0](https://github.com/certd/certd/compare/v1.1.6...v1.2.0) (2023-10-27)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.1.6](https://github.com/certd/certd/compare/v1.1.5...v1.1.6) (2023-07-10)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.1.5](https://github.com/certd/certd/compare/v1.1.4...v1.1.5) (2023-07-03)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.1.4](https://github.com/certd/certd/compare/v1.1.3...v1.1.4) (2023-07-03)\n\n### Performance Improvements\n\n* timeout ([3eeb1f7](https://github.com/certd/certd/commit/3eeb1f77aa2922f3545f3d2067f561d95621d54f))\n\n## [1.1.3](https://github.com/certd/certd/compare/v1.1.2...v1.1.3) (2023-07-03)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.1.2](https://github.com/certd/certd/compare/v1.1.1...v1.1.2) (2023-07-03)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.1.1](https://github.com/certd/certd/compare/v1.1.0...v1.1.1) (2023-06-28)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n# [1.1.0](https://github.com/certd/certd/compare/v1.0.6...v1.1.0) (2023-06-28)\n\n### Bug Fixes\n\n* 修复access选择类型trigger ([2851a33](https://github.com/certd/certd/commit/2851a33eb2510f038fadb55da29512597a4ba512))\n\n### Features\n\n* save files ([99522fb](https://github.com/certd/certd/commit/99522fb49adb42c1dfdf7bec3dd52d641158285b))\n* save files ([671d273](https://github.com/certd/certd/commit/671d273e2f9136d16896536b0ca127cf372f1619))\n\n## [1.0.6](https://github.com/certd/certd/compare/v1.0.5...v1.0.6) (2023-05-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.0.5](https://github.com/certd/certd/compare/v1.0.4...v1.0.5) (2023-05-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.0.4](https://github.com/certd/certd/compare/v1.0.3...v1.0.4) (2023-05-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.0.3](https://github.com/certd/certd/compare/v1.0.2...v1.0.3) (2023-05-25)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.0.2](https://github.com/certd/certd/compare/v1.0.1...v1.0.2) (2023-05-24)\n\n**Note:** Version bump only for package @certd/plugin-cert\n\n## [1.0.1](https://github.com/certd/certd/compare/v1.0.0...v1.0.1) (2023-05-24)\n\n**Note:** Version bump only for package @certd/plugin-cert\n"
  },
  {
    "path": "packages/plugins/plugin-lib/LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "packages/plugins/plugin-lib/README.md",
    "content": "# Vue 3 + TypeScript + Vite\n\nThis template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.\n\n## Recommended IDE Setup\n\n- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar)\n\n## Type Support For `.vue` Imports in TS\n\nSince TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates. However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can enable Volar's Take Over mode by following these steps:\n\n1. Run `Extensions: Show Built-in Extensions` from VS Code's command palette, look for `TypeScript and JavaScript Language Features`, then right click and select `Disable (Workspace)`. By default, Take Over mode will enable itself if the default TypeScript extension is disabled.\n2. Reload the VS Code window by running `Developer: Reload Window` from the command palette.\n\nYou can learn more about Take Over mode [here](https://github.com/johnsoncodehk/volar/discussions/471).\n"
  },
  {
    "path": "packages/plugins/plugin-lib/package.json",
    "content": "{\n  \"name\": \"@certd/plugin-lib\",\n  \"private\": false,\n  \"version\": \"1.36.10\",\n  \"type\": \"module\",\n  \"main\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.ts\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"before-build\": \"rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache\",\n    \"build\": \"npm run before-build &&tsc --skipLibCheck\",\n    \"dev-build\": \"npm run build\",\n    \"build3\": \"rollup -c\",\n    \"build2\": \"vue-tsc --noEmit && vite build\",\n    \"preview\": \"vite preview\",\n    \"pub\": \"npm publish\"\n  },\n  \"dependencies\": {\n    \"@alicloud/openapi-client\": \"^0.4.14\",\n    \"@alicloud/openapi-util\": \"^0.3.2\",\n    \"@alicloud/pop-core\": \"^1.7.10\",\n    \"@alicloud/tea-util\": \"^1.4.10\",\n    \"@aws-sdk/client-s3\": \"^3.787.0\",\n    \"@certd/basic\": \"^1.36.10\",\n    \"@certd/pipeline\": \"^1.36.10\",\n    \"@kubernetes/client-node\": \"0.21.0\",\n    \"ali-oss\": \"^6.22.0\",\n    \"basic-ftp\": \"^5.0.5\",\n    \"cos-nodejs-sdk-v5\": \"^2.14.6\",\n    \"dayjs\": \"^1.11.7\",\n    \"iconv-lite\": \"^0.6.3\",\n    \"lodash-es\": \"^4.17.21\",\n    \"qiniu\": \"^7.12.0\",\n    \"rimraf\": \"^5.0.5\",\n    \"socks\": \"^2.8.3\",\n    \"socks-proxy-agent\": \"^8.0.4\",\n    \"ssh2\": \"^1.15.0\",\n    \"strip-ansi\": \"^7.1.0\",\n    \"tencentcloud-sdk-nodejs\": \"^4.0.1005\"\n  },\n  \"devDependencies\": {\n    \"@types/chai\": \"^4.3.3\",\n    \"@types/mocha\": \"^10.0.0\",\n    \"@types/psl\": \"^1.1.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.26.1\",\n    \"@typescript-eslint/parser\": \"^8.26.1\",\n    \"chai\": \"^4.3.6\",\n    \"eslint\": \"^8.24.0\",\n    \"eslint-config-prettier\": \"^8.5.0\",\n    \"eslint-plugin-prettier\": \"^4.2.1\",\n    \"mocha\": \"^10.1.0\",\n    \"prettier\": \"^2.8.8\",\n    \"tslib\": \"^2.8.1\",\n    \"typescript\": \"^5.4.2\"\n  },\n  \"gitHead\": \"085bdf5cfa9140903611aa12cdd2542d05aba321\"\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/aliyun/access/alioss-access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from \"@certd/pipeline\";\n\n@IsAccess({\n  name: \"alioss\",\n  title: \"阿里云OSS授权\",\n  desc: \"包含地域和Bucket\",\n  icon: \"ant-design:aliyun-outlined\",\n})\nexport class AliossAccess extends BaseAccess {\n  @AccessInput({\n    title: \"阿里云授权\",\n    component: {\n      name: \"access-selector\",\n      vModel: \"modelValue\",\n      type: \"aliyun\",\n    },\n    helper: \"请选择阿里云授权\",\n    required: true,\n  })\n  accessId = \"\";\n\n  @AccessInput({\n    title: \"大区\",\n    component: {\n      name: \"a-auto-complete\",\n      vModel: \"value\",\n      options: [\n        { value: \"oss-cn-hangzhou\", label: \"华东1（杭州）\" },\n        { value: \"oss-cn-shanghai\", label: \"华东2（上海）\" },\n        { value: \"oss-cn-nanjing\", label: \"华东5（南京-本地地域）\" },\n        { value: \"oss-cn-fuzhou\", label: \"华东6（福州-本地地域）\" },\n        { value: \"oss-cn-wuhan-lr\", label: \"华中1（武汉-本地地域）\" },\n        { value: \"oss-cn-qingdao\", label: \"华北1（青岛）\" },\n        { value: \"oss-cn-beijing\", label: \"华北2（北京）\" },\n        { value: \"oss-cn-zhangjiakou\", label: \"华北 3（张家口）\" },\n        { value: \"oss-cn-huhehaote\", label: \"华北5（呼和浩特）\" },\n        { value: \"oss-cn-wulanchabu\", label: \"华北6（乌兰察布）\" },\n        { value: \"oss-cn-shenzhen\", label: \"华南1（深圳）\" },\n        { value: \"oss-cn-heyuan\", label: \"华南2（河源）\" },\n        { value: \"oss-cn-guangzhou\", label: \"华南3（广州）\" },\n        { value: \"oss-cn-chengdu\", label: \"西南1（成都）\" },\n        { value: \"oss-cn-hongkong\", label: \"中国香港\" },\n        { value: \"oss-us-west-1\", label: \"美国（硅谷）①\" },\n        { value: \"oss-us-east-1\", label: \"美国（弗吉尼亚）①\" },\n        { value: \"oss-ap-northeast-1\", label: \"日本（东京）①\" },\n        { value: \"oss-ap-northeast-2\", label: \"韩国（首尔）\" },\n        { value: \"oss-ap-southeast-1\", label: \"新加坡①\" },\n        { value: \"oss-ap-southeast-2\", label: \"澳大利亚（悉尼）①\" },\n        { value: \"oss-ap-southeast-3\", label: \"马来西亚（吉隆坡）①\" },\n        { value: \"oss-ap-southeast-5\", label: \"印度尼西亚（雅加达）①\" },\n        { value: \"oss-ap-southeast-6\", label: \"菲律宾（马尼拉）\" },\n        { value: \"oss-ap-southeast-7\", label: \"泰国（曼谷）\" },\n        { value: \"oss-eu-central-1\", label: \"德国（法兰克福）①\" },\n        { value: \"oss-eu-west-1\", label: \"英国（伦敦）\" },\n        { value: \"oss-me-east-1\", label: \"阿联酋（迪拜）①\" },\n        { value: \"oss-rg-china-mainland\", label: \"无地域属性（中国内地）\" },\n      ],\n    },\n    required: true,\n  })\n  region!: string;\n\n  @AccessInput({\n    title: \"Bucket\",\n    helper: \"存储桶名称\",\n    required: true,\n  })\n  bucket!: string;\n}\n\nnew AliossAccess();\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/aliyun/access/aliyun-access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from \"@certd/pipeline\";\nimport { ILogger } from \"@certd/basic\";\nexport type AliyunClientV2Req = {\n  action: string;\n  version: string;\n  protocol?: \"HTTPS\";\n  // 接口 HTTP 方法\n  method?: \"GET\" | \"POST\";\n  authType?: \"AK\";\n  style?: \"RPC\";\n  // 接口 PATH\n  pathname?: `/`;\n\n  data?: any;\n};\nexport class AliyunClientV2 {\n  access: AliyunAccess;\n  logger: ILogger;\n  endpoint: string;\n\n  client: any;\n  constructor(opts: { access: AliyunAccess; logger: ILogger; endpoint: string }) {\n    this.access = opts.access;\n    this.logger = opts.logger;\n    this.endpoint = opts.endpoint;\n  }\n\n  async getClient() {\n    if (this.client) {\n      return this.client;\n    }\n    const $OpenApi = await import(\"@alicloud/openapi-client\");\n    // const Credential = await import(\"@alicloud/credentials\");\n    // //@ts-ignore\n    // const credential = new Credential.default.default({\n    //\n    //   type: \"access_key\",\n    // });\n    const config = new $OpenApi.Config({\n      accessKeyId: this.access.accessKeyId,\n      accessKeySecret: this.access.accessKeySecret,\n    });\n    // Endpoint 请参考 https://api.aliyun.com/product/FC\n    // config.endpoint = `esa.${this.regionId}.aliyuncs.com`;\n    config.endpoint = this.endpoint;\n    //@ts-ignore\n    this.client = new $OpenApi.default.default(config);\n    return this.client;\n  }\n\n  async doRequest(req: AliyunClientV2Req) {\n    const client = await this.getClient();\n\n    const $OpenApi = await import(\"@alicloud/openapi-client\");\n    const $Util = await import(\"@alicloud/tea-util\");\n    const OpenApiUtil = await import(\"@alicloud/openapi-util\");\n    const params = new $OpenApi.Params({\n      // 接口名称\n      action: req.action,\n      // 接口版本\n      version: req.version,\n      // 接口协议\n      protocol: \"HTTPS\",\n      // 接口 HTTP 方法\n      method: req.method ?? \"POST\",\n      authType: \"AK\",\n      style: \"RPC\",\n      // 接口 PATH\n      pathname: `/`,\n      // 接口请求体内容格式\n      reqBodyType: \"json\",\n      // 接口响应体内容格式\n      bodyType: \"json\",\n    });\n\n    if (req.data?.query) {\n      //@ts-ignore\n      req.data.query = OpenApiUtil.default.default.query(req.data.query);\n    }\n    const runtime = new $Util.RuntimeOptions({});\n    const request = new $OpenApi.OpenApiRequest(req.data);\n    // 复制代码运行请自行打印 API 的返回值\n    // 返回值实际为 Map 类型，可从 Map 中获得三类数据：响应体 body、响应头 headers、HTTP 返回的状态码 statusCode。\n    const res = await client.callApi(params, request, runtime);\n    /**\n     * res?.body?.\n     */\n    return res?.body;\n  }\n}\n\n@IsAccess({\n  name: \"aliyun\",\n  title: \"阿里云授权\",\n  desc: \"\",\n  icon: \"ant-design:aliyun-outlined\",\n  order: 0,\n})\nexport class AliyunAccess extends BaseAccess {\n  @AccessInput({\n    title: \"accessKeyId\",\n    component: {\n      placeholder: \"accessKeyId\",\n    },\n    helper: \"登录阿里云控制台->AccessKey管理页面获取。\",\n    required: true,\n  })\n  accessKeyId = \"\";\n  @AccessInput({\n    title: \"accessKeySecret\",\n    component: {\n      placeholder: \"accessKeySecret\",\n    },\n    required: true,\n    encrypt: true,\n    helper: \"注意：证书申请需要dns解析权限；其他阿里云插件，需要对应的权限，比如证书上传需要证书管理权限；嫌麻烦就用主账号的全量权限的accessKey\",\n  })\n  accessKeySecret = \"\";\n\n  getClient(endpoint: string) {\n    return new AliyunClientV2({\n      access: this,\n      logger: this.ctx.logger,\n      endpoint: endpoint,\n    });\n  }\n}\n\nnew AliyunAccess();\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/aliyun/access/index.ts",
    "content": "export * from \"./aliyun-access.js\";\nexport * from \"./alioss-access.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/aliyun/index.ts",
    "content": "export * from \"./lib/index.js\";\nexport * from \"./access/index.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/aliyun/lib/base-client.ts",
    "content": "import { getGlobalAgents, ILogger } from \"@certd/basic\";\n\nexport class AliyunClient {\n  client: any;\n  logger: ILogger;\n  agent: any;\n  useROAClient: boolean;\n\n  constructor(opts: { logger: ILogger; useROAClient?: boolean }) {\n    this.logger = opts.logger;\n    this.useROAClient = opts.useROAClient || false;\n    const agents = getGlobalAgents();\n    this.agent = agents.httpsAgent;\n  }\n\n  async getSdk() {\n    if (this.useROAClient) {\n      return await this.getROAClient();\n    }\n    const Core = await import(\"@alicloud/pop-core\");\n    return Core.default;\n  }\n\n  async getROAClient() {\n    const Core = await import(\"@alicloud/pop-core\");\n    console.log(\"aliyun sdk\", Core);\n    // @ts-ignore\n    return Core.ROAClient;\n  }\n\n  async init(opts: any) {\n    const Core = await this.getSdk();\n    this.client = new Core(opts);\n    return this.client;\n  }\n\n  checkRet(ret: any) {\n    if (ret.Code != null) {\n      throw new Error(\"执行失败：\" + ret.Message);\n    }\n  }\n\n  async request(\n    name: string,\n    params: any,\n    requestOption: any = {\n      method: \"POST\",\n      formatParams: false,\n    }\n  ) {\n    if (!this.useROAClient) {\n      requestOption.agent = this.agent;\n    }\n\n    const getNumberFromEnv = (key: string, defValue: number) => {\n      const value = process.env[key];\n      if (value) {\n        try {\n          return parseInt(value);\n        } catch (e: any) {\n          this.logger.error(`环境变量${key}设置错误，应该是一个数字，当前值为${value}，将使用默认值：${defValue}`);\n          return defValue;\n        }\n      } else {\n        return defValue;\n      }\n    };\n\n    // 连接超时设置，仅对当前请求有效。\n    requestOption.connectTimeout = getNumberFromEnv(\"ALIYUN_CLIENT_CONNECT_TIMEOUT\", 8000);\n    // 读超时设置，仅对当前请求有效。\n    requestOption.readTimeout = getNumberFromEnv(\"ALIYUN_CLIENT_READ_TIMEOUT\", 8000);\n\n    const res = await this.client.request(name, params, requestOption);\n    this.checkRet(res);\n    return res;\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/aliyun/lib/index.ts",
    "content": "export * from \"./base-client.js\";\nexport * from \"./ssl-client.js\";\nexport * from \"./oss-client.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/aliyun/lib/oss-client.ts",
    "content": "import { AliyunAccess } from \"../access/index.js\";\n\nexport class AliossClient {\n  access: AliyunAccess;\n\n  region: string;\n  bucket: string;\n  client: any;\n  constructor(opts: { access: AliyunAccess; bucket: string; region: string }) {\n    this.access = opts.access;\n    this.bucket = opts.bucket;\n    this.region = opts.region;\n  }\n\n  async init() {\n    if (this.client) {\n      return;\n    }\n    // @ts-ignore\n    const OSS = await import(\"ali-oss\");\n    const ossClient = new OSS.default({\n      accessKeyId: this.access.accessKeyId,\n      accessKeySecret: this.access.accessKeySecret,\n      // yourRegion填写Bucket所在地域。以华东1（杭州）为例，Region填写为oss-cn-hangzhou。\n      region: this.region,\n      //@ts-ignore\n      authorizationV4: true,\n      // yourBucketName填写Bucket名称。\n      bucket: this.bucket,\n    });\n    // oss\n\n    this.client = ossClient;\n  }\n\n  async doRequest(bucket: string, xml: string, params: any) {\n    await this.init();\n    params = this.client._bucketRequestParams(\"POST\", bucket, {\n      ...params,\n    });\n    params.content = xml;\n    params.mime = \"xml\";\n    params.successStatuses = [200];\n    const res = await this.client.request(params);\n    this.checkRet(res);\n    return res;\n  }\n\n  checkRet(ret: any) {\n    if (ret.Code != null) {\n      throw new Error(\"执行失败：\" + ret.Message);\n    }\n  }\n\n  async uploadFile(filePath: string, content: Buffer | string, timeout = 1000 * 60 * 60) {\n    await this.init();\n    return await this.client.put(filePath, content, {\n      timeout,\n    });\n  }\n\n  async removeFile(filePath: string) {\n    await this.init();\n    return await this.client.delete(filePath);\n  }\n\n  async downloadFile(key: string, savePath: string, timeout = 1000 * 60 * 60) {\n    await this.init();\n    return await this.client.get(key, savePath, {\n      timeout,\n    });\n  }\n\n  async listDir(dirKey: string) {\n    await this.init();\n    const res = await this.client.listV2({\n      prefix: dirKey,\n      // max-keys: 100,\n      // continuation-token: \"token\",\n      // delimiter: \"/\",\n      // marker: \"marker\",\n      // encoding-type: \"url\",\n    });\n\n    return res.objects;\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/aliyun/lib/ssl-client.ts",
    "content": "import { ILogger } from \"@certd/basic\";\nimport { AliyunAccess } from \"../access/index.js\";\nimport { AliyunClient } from \"./index.js\";\n\nexport type AliyunCertInfo = {\n  crt: string; //fullchain证书\n  key: string; //私钥\n};\nexport type AliyunSslClientOpts = {\n  access: AliyunAccess;\n  logger: ILogger;\n  endpoint: string;\n};\n\nexport type AliyunSslGetResourceListReq = {\n  cloudProduct: string;\n};\n\nexport type AliyunSslCreateDeploymentJobReq = {\n  name: string;\n  jobType: string;\n  contactIds: string[];\n  resourceIds: string[];\n  certIds: string[];\n};\n\nexport type AliyunSslUploadCertReq = {\n  name: string;\n  cert: AliyunCertInfo;\n};\n\nexport type CasCertInfo = { certId: number; certName: string; certIdentifier: string; notAfter: number; casRegion: string };\n\nexport class AliyunSslClient {\n  opts: AliyunSslClientOpts;\n  logger: ILogger;\n  constructor(opts: AliyunSslClientOpts) {\n    this.opts = opts;\n    this.logger = opts.logger;\n  }\n\n  checkRet(ret: any) {\n    if (ret.Code != null) {\n      throw new Error(\"执行失败：\" + ret.Message);\n    }\n  }\n\n  async getClient() {\n    const access = this.opts.access;\n    const client = new AliyunClient({ logger: this.opts.logger });\n    await client.init({\n      accessKeyId: access.accessKeyId,\n      accessKeySecret: access.accessKeySecret,\n      endpoint: `https://${this.opts.endpoint || \"cas.aliyuncs.com\"}`,\n      apiVersion: \"2020-04-07\",\n    });\n    return client;\n  }\n\n  async getCertInfo(certId: number): Promise<CasCertInfo> {\n    const client = await this.getClient();\n    const params = {\n      CertId: certId,\n    };\n\n    const res = await client.request(\"GetUserCertificateDetail\", params);\n    this.checkRet(res);\n\n    return {\n      certId: certId,\n      certName: res.Name,\n      certIdentifier: res.CertIdentifier,\n      notAfter: res.NotAfter,\n      casRegion: this.getCasRegionFromEndpoint(this.opts.endpoint),\n    };\n  }\n\n  async uploadCert(req: AliyunSslUploadCertReq) {\n    const client = await this.getClient();\n    const params = {\n      Name: req.name,\n      Cert: req.cert.crt,\n      Key: req.cert.key,\n    };\n\n    const requestOption = {\n      method: \"POST\",\n    };\n\n    this.opts.logger.info(`开始上传证书：${req.name}`);\n    const ret: any = await client.request(\"UploadUserCertificate\", params, requestOption);\n    this.checkRet(ret);\n    this.opts.logger.info(\"证书上传成功：aliyunCertId=\", ret.CertId);\n    //output\n    return ret.CertId;\n  }\n\n  async getResourceList(req: AliyunSslGetResourceListReq) {\n    const client = await this.getClient();\n    const params = {\n      CloudName: \"aliyun\",\n      CloudProduct: req.cloudProduct,\n    };\n\n    const requestOption = {\n      method: \"POST\",\n      formatParams: false,\n    };\n\n    const res = await client.request(\"ListCloudResources\", params, requestOption);\n    this.checkRet(res);\n    return res;\n  }\n\n  async createDeploymentJob(req: AliyunSslCreateDeploymentJobReq) {\n    const client = await this.getClient();\n\n    const params = {\n      Name: req.name,\n      JobType: req.jobType,\n      ContactIds: req.contactIds.join(\",\"),\n      ResourceIds: req.resourceIds.join(\",\"),\n      CertIds: req.certIds.join(\",\"),\n    };\n\n    const requestOption = {\n      method: \"POST\",\n      formatParams: false,\n    };\n\n    const res = await client.request(\"CreateDeploymentJob\", params, requestOption);\n    this.checkRet(res);\n    return res;\n  }\n\n  async getContactList() {\n    const params = {};\n\n    const requestOption = {\n      method: \"POST\",\n      formatParams: false,\n    };\n    const client = await this.getClient();\n    const res = await client.request(\"ListContact\", params, requestOption);\n    this.checkRet(res);\n    return res;\n  }\n\n  async doRequest(action: string, params: any, requestOption: any) {\n    const client = await this.getClient();\n    const res = await client.request(action, params, requestOption);\n    this.checkRet(res);\n    return res;\n  }\n\n  async deleteCert(certId: any) {\n    await this.doRequest(\"DeleteUserCertificate\", { CertId: certId }, { method: \"POST\" });\n  }\n\n  getCasRegionFromEndpoint(endpoint: string) {\n    if (!endpoint) {\n      return \"cn-hangzhou\";\n    }\n    /**\n     * {value: 'cas.aliyuncs.com', label: '中国大陆'},\n     *         {value: 'cas.ap-southeast-1.aliyuncs.com', label: '新加坡'},\n     *         {value: 'cas.eu-central-1.aliyuncs.com', label: '德国（法兰克福）'},\n     */\n    const region = endpoint.replace(\".aliyuncs.com\", \"\").replace(\"cas.\", \"\");\n    if (region === \"cas\") {\n      return \"cn-hangzhou\";\n    }\n    return region;\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/common/index.ts",
    "content": "export * from \"./util.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/common/util.ts",
    "content": "import { merge } from \"lodash-es\";\n\nexport function createCertDomainGetterInputDefine(opts?: { certInputKey?: string; props?: any }) {\n  const certInputKey = opts?.certInputKey || \"cert\";\n  return merge(\n    {\n      title: \"当前证书域名\",\n      component: {\n        name: \"cert-domains-getter\",\n      },\n      mergeScript: `\n        return {\n          component:{\n              inputKey: ctx.compute(({form})=>{\n                return form.${certInputKey}\n              }),\n          }\n        }\n        `,\n      template:false,\n      required: true,\n    },\n    opts?.props\n  );\n}\n\nexport function createRemoteSelectInputDefine(opts?: {\n  title: string;\n  certDomainsInputKey?: string;\n  accessIdInputKey?: string;\n  typeName?: string;\n  action: string;\n  type?: string;\n  watches?: string[];\n  helper?: string;\n  formItem?: any;\n  mode?: string;\n  multi?: boolean;\n  required?: boolean;\n  rules?: any;\n  mergeScript?: string;\n  search?: boolean;\n  pager?: boolean;\n  component?: any;\n}) {\n  const title = opts?.title || \"请选择\";\n  const certDomainsInputKey = opts?.certDomainsInputKey || \"certDomains\";\n  const accessIdInputKey = opts?.accessIdInputKey || \"accessId\";\n  const typeName = opts?.typeName;\n  const action = opts?.action;\n  const type = opts?.type || \"plugin\";\n  const watches = opts?.watches || [];\n  const helper = opts?.helper || \"请选择\";\n  const search = opts?.search ?? false;\n  const pager = opts?.pager ?? false;\n  let mode = \"tags\";\n  if (opts.multi === false) {\n    mode = undefined;\n  } else {\n    mode = opts?.mode ?? \"tags\";\n  }\n\n  const item = {\n    title,\n    component: {\n      name: \"remote-select\",\n      vModel: \"value\",\n      mode,\n      type,\n      typeName,\n      action,\n      search,\n      pager,\n      watches: [certDomainsInputKey, accessIdInputKey, ...watches],\n      ...opts.component,\n    },\n    rules: opts?.rules,\n    required: opts.required ?? true,\n    mergeScript:\n      opts.mergeScript ??\n      `\n          return {\n            component:{\n              form: ctx.compute(({form})=>{\n                return form\n              })\n            },\n         }\n        `,\n    helper,\n  };\n\n  return merge(item, opts?.formItem);\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/ctyun/access/ctyun-access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from \"@certd/pipeline\";\n\n@IsAccess({\n  name: \"ctyun\",\n  title: \"天翼云授权\",\n  desc: \"\",\n  icon: \"ant-design:aliyun-outlined\",\n})\nexport class CtyunAccess extends BaseAccess {\n  @AccessInput({\n    title: \"accessKeyId\",\n    component: {\n      placeholder: \"accessKeyId\",\n    },\n    helper: \"[前往创建天翼云AccessKey](https://iam.ctyun.cn/myAccessKey)\",\n    required: true,\n  })\n  accessKeyId = \"\";\n  @AccessInput({\n    title: \"securityKey\",\n    component: {\n      placeholder: \"securityKey\",\n    },\n    required: true,\n    encrypt: true,\n    helper: \"\",\n  })\n  securityKey = \"\";\n}\n\nnew CtyunAccess();\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/ctyun/index.ts",
    "content": "export * from \"./access/ctyun-access.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/ftp/access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from \"@certd/pipeline\";\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: \"ftp\",\n  title: \"FTP授权\",\n  desc: \"\",\n  icon: \"mdi:folder-upload-outline\",\n})\nexport class FtpAccess extends BaseAccess {\n  @AccessInput({\n    title: \"host\",\n    component: {\n      placeholder: \"ip / 域名\",\n      name: \"a-input\",\n      vModel: \"value\",\n    },\n    helper: \"FTP地址\",\n    required: true,\n  })\n  host!: string;\n\n  @AccessInput({\n    title: \"端口\",\n    value: 21,\n    component: {\n      placeholder: \"21\",\n      name: \"a-input-number\",\n      vModel: \"value\",\n    },\n    helper: \"FTP端口\",\n    required: true,\n  })\n  port!: string;\n\n  @AccessInput({\n    title: \"user\",\n    component: {\n      placeholder: \"用户名\",\n    },\n    helper: \"FTP用户名\",\n    required: true,\n  })\n  user!: string;\n\n  @AccessInput({\n    title: \"password\",\n    component: {\n      placeholder: \"密码\",\n      component: {\n        name: \"a-input-password\",\n        vModel: \"value\",\n      },\n    },\n    encrypt: true,\n    helper: \"FTP密码\",\n    required: true,\n  })\n  password!: string;\n\n  @AccessInput({\n    title: \"secure\",\n    value: false,\n    component: {\n      name: \"a-switch\",\n      vModel: \"checked\",\n    },\n    helper: \"是否使用SSL\",\n    required: true,\n  })\n  secure?: boolean = false;\n}\n\nnew FtpAccess();\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/ftp/client.ts",
    "content": "import { FtpAccess } from \"./access\";\nimport { ILogger } from \"@certd/basic\";\nimport path from \"node:path\";\n\nexport class FtpClient {\n  access: FtpAccess = null;\n  logger: ILogger = null;\n  client: any;\n  constructor(opts: { access: FtpAccess; logger: ILogger }) {\n    this.access = opts.access;\n    this.logger = opts.logger;\n  }\n\n  async connect(callback: (client: FtpClient) => Promise<any>) {\n    const ftp = await import(\"basic-ftp\");\n    const Client = ftp.Client;\n    const client = new Client();\n    client.ftp.verbose = true;\n    this.logger.info(\"开始连接FTP\");\n    await client.access(this.access as any);\n    this.logger.info(\"FTP连接成功\");\n    this.client = client;\n    try {\n      return await callback(this);\n    } finally {\n      if (client) {\n        client.close();\n      }\n    }\n  }\n\n  async upload(filePath: string, remotePath: string): Promise<void> {\n    if (!remotePath) {\n      return;\n    }\n    const dirname = path.dirname(remotePath);\n    this.logger.info(`确保目录存在：${dirname}`);\n    await this.client.ensureDir(dirname);\n    this.logger.info(`开始上传文件${filePath} -> ${remotePath}`);\n    await this.client.uploadFrom(filePath, remotePath);\n  }\n\n  async remove(filePath: string): Promise<void> {\n    this.logger.info(`开始删除文件${filePath}`);\n    await this.client.remove(filePath, true);\n  }\n\n  async listDir(dir: string): Promise<any[]> {\n    if (!dir) {\n      return [];\n    }\n    if (!dir.endsWith(\"/\")) {\n      dir = dir + \"/\";\n    }\n    this.logger.info(`开始列出目录${dir}`);\n    return await this.client.list(dir);\n  }\n\n  async download(filePath: string, savePath: string): Promise<void> {\n    this.logger.info(`开始下载文件${filePath} -> ${savePath}`);\n    await this.client.downloadTo(savePath, filePath);\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/ftp/index.ts",
    "content": "export * from \"./access.js\";\nexport * from \"./client.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/index.ts",
    "content": "export * from \"./ssh/index.js\";\nexport * from \"./aliyun/index.js\";\nexport * from \"./common/index.js\";\nexport * from \"./ftp/index.js\";\nexport * from \"./tencent/index.js\";\nexport * from \"./qiniu/index.js\";\nexport * from \"./ctyun/index.js\";\nexport * from \"./oss/index.js\";\nexport * from \"./s3/index.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/oss/api.ts",
    "content": "import { IAccessService } from \"@certd/pipeline\";\nimport { ILogger, utils } from \"@certd/basic\";\nimport dayjs from \"dayjs\";\n\nexport type OssClientRemoveByOpts = {\n  dir?: string;\n  //删除多少天前的文件\n  beforeDays?: number;\n};\n\nexport type OssFileItem = {\n  //文件全路径\n  path: string;\n  size: number;\n  //毫秒时间戳\n  lastModified: number;\n};\n\nexport type IOssClient = {\n  upload: (fileName: string, fileContent: Buffer) => Promise<void>;\n  remove: (fileName: string, opts?: { joinRootDir?: boolean }) => Promise<void>;\n\n  download: (fileName: string, savePath: string) => Promise<void>;\n\n  removeBy: (removeByOpts: OssClientRemoveByOpts) => Promise<void>;\n\n  listDir: (dir: string) => Promise<OssFileItem[]>;\n};\n\nexport type OssClientContext = {\n  accessService: IAccessService;\n  logger: ILogger;\n  utils: typeof utils;\n};\n\nexport abstract class BaseOssClient<A> implements IOssClient {\n  rootDir: string = \"\";\n  access: A = null;\n  logger: ILogger;\n  utils: typeof utils;\n  ctx: OssClientContext;\n\n  protected constructor(opts: { rootDir?: string; access: A }) {\n    this.rootDir = opts.rootDir || \"\";\n    this.access = opts.access;\n  }\n\n  join(...strs: string[]) {\n    let res = \"\";\n    for (const item of strs) {\n      if (item) {\n        if (!res) {\n          res = item;\n        } else {\n          res += \"/\" + item;\n        }\n      }\n    }\n    res = res.replace(/[\\\\/]+/g, \"/\");\n    return res;\n  }\n\n  async setCtx(ctx: any) {\n    // set context\n    this.ctx = ctx;\n    this.logger = ctx.logger;\n    this.utils = ctx.utils;\n    await this.init();\n  }\n\n  async init() {\n    // do nothing\n  }\n\n  abstract remove(fileName: string, opts?: { joinRootDir?: boolean }): Promise<void>;\n  abstract upload(fileName: string, fileContent: Buffer): Promise<void>;\n  abstract download(fileName: string, savePath: string): Promise<void>;\n  abstract listDir(dir: string): Promise<OssFileItem[]>;\n\n  async removeBy(removeByOpts: OssClientRemoveByOpts): Promise<void> {\n    const list = await this.listDir(removeByOpts.dir);\n    // removeByOpts.beforeDays = 0;\n    const beforeDate = dayjs().subtract(removeByOpts.beforeDays, \"day\");\n    for (const item of list) {\n      if (item.lastModified && item.lastModified < beforeDate.valueOf()) {\n        await this.remove(item.path, { joinRootDir: false });\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/oss/factory.ts",
    "content": "import { OssClientContext } from \"./api\";\n\nexport class OssClientFactory {\n  async getClassByType(type: string) {\n    if (type === \"alioss\") {\n      const module = await import(\"./impls/alioss.js\");\n      return module.default;\n    } else if (type === \"ssh\") {\n      const module = await import(\"./impls/ssh.js\");\n      return module.default;\n    } else if (type === \"sftp\") {\n      const module = await import(\"./impls/sftp.js\");\n      return module.default;\n    } else if (type === \"ftp\") {\n      const module = await import(\"./impls/ftp.js\");\n      return module.default;\n    } else if (type === \"tencentcos\") {\n      const module = await import(\"./impls/tencentcos.js\");\n      return module.default;\n    } else if (type === \"qiniuoss\") {\n      const module = await import(\"./impls/qiniuoss.js\");\n      return module.default;\n    } else if (type === \"s3\") {\n      const module = await import(\"./impls/s3.js\");\n      return module.default;\n    } else {\n      throw new Error(`暂不支持此文件上传方式: ${type}`);\n    }\n  }\n  async createOssClientByType(type: string, opts: { rootDir?: string; access: any; ctx: OssClientContext }) {\n    const cls = await this.getClassByType(type);\n    if (cls) {\n      // @ts-ignore\n      const instance = new cls(opts);\n      await instance.setCtx(opts.ctx);\n      return instance;\n    }\n  }\n}\n\nexport const ossClientFactory = new OssClientFactory();\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/oss/impls/alioss.ts",
    "content": "import { BaseOssClient, OssFileItem } from \"../api.js\";\nimport { AliossAccess, AliossClient, AliyunAccess } from \"../../aliyun/index.js\";\nimport dayjs from \"dayjs\";\n\nexport default class AliOssClientImpl extends BaseOssClient<AliossAccess> {\n  client: AliossClient;\n  join(...strs: string[]) {\n    const str = super.join(...strs);\n    if (str.startsWith(\"/\")) {\n      return str.substring(1);\n    }\n    return str;\n  }\n  async init() {\n    const aliyunAccess = await this.ctx.accessService.getById<AliyunAccess>(this.access.accessId);\n    const client = new AliossClient({\n      access: aliyunAccess,\n      bucket: this.access.bucket,\n      region: this.access.region,\n    });\n    await client.init();\n    this.client = client;\n  }\n  async download(filePath: string, savePath: string): Promise<void> {\n    const key = this.join(this.rootDir, filePath);\n    await this.client.downloadFile(key, savePath);\n  }\n  async listDir(dir: string): Promise<OssFileItem[]> {\n    const dirKey = this.join(this.rootDir, dir) + \"/\";\n    const list = await this.client.listDir(dirKey);\n    this.logger.info(`列出目录: ${dirKey},文件数：${list.length}`);\n    return list.map(item => {\n      return {\n        path: item.name,\n        lastModified: dayjs(item.lastModified).valueOf(),\n        size: item.size,\n      };\n    });\n  }\n  async upload(filePath: string, fileContent: Buffer | string) {\n    const key = this.join(this.rootDir, filePath);\n    this.logger.info(`开始上传文件: ${key}`);\n    await this.client.uploadFile(key, fileContent);\n\n    this.logger.info(`文件上传成功: ${filePath}`);\n  }\n\n  async remove(filePath: string, opts?: { joinRootDir?: boolean }) {\n    if (opts?.joinRootDir !== false) {\n      filePath = this.join(this.rootDir, filePath);\n    }\n    const key = filePath;\n    // remove file from alioss\n    await this.client.removeFile(key);\n    this.logger.info(`文件删除成功: ${key}`);\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/oss/impls/ftp.ts",
    "content": "import { BaseOssClient } from \"../api.js\";\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport { FtpAccess, FtpClient } from \"../../ftp/index.js\";\n\nexport default class FtpOssClientImpl extends BaseOssClient<FtpAccess> {\n  join(...strs: string[]) {\n    const str = super.join(...strs);\n    if (!str.startsWith(\"/\")) {\n      return \"/\" + str;\n    }\n    return str;\n  }\n\n  async download(fileName: string, savePath: string) {\n    const client = this.getFtpClient();\n    await client.connect(async client => {\n      const path = this.join(this.rootDir, fileName);\n      await client.download(path, savePath);\n    });\n  }\n  async listDir(dir: string) {\n    const client = this.getFtpClient();\n    return await client.connect(async (client: FtpClient) => {\n      const path = this.join(this.rootDir, dir);\n      const res = await client.listDir(path);\n      return res.map(item => {\n        return {\n          path: this.join(path, item.name),\n          size: item.size,\n          lastModified: item.modifiedAt.getTime(),\n        };\n      });\n    });\n  }\n  async upload(filePath: string, fileContent: Buffer | string) {\n    const client = this.getFtpClient();\n    await client.connect(async client => {\n      let tmpFilePath = fileContent as string;\n      if (typeof fileContent !== \"string\") {\n        tmpFilePath = path.join(os.tmpdir(), \"cert\", \"oss\", filePath);\n        const dir = path.dirname(tmpFilePath);\n        if (!fs.existsSync(dir)) {\n          fs.mkdirSync(dir, { recursive: true });\n        }\n        fs.writeFileSync(tmpFilePath, fileContent);\n      }\n\n      try {\n        // Write file to temp path\n        const path = this.join(this.rootDir, filePath);\n        await client.upload(tmpFilePath, path);\n      } finally {\n        // Remove temp file\n        fs.unlinkSync(tmpFilePath);\n      }\n    });\n  }\n\n  private getFtpClient() {\n    return new FtpClient({\n      access: this.access,\n      logger: this.logger,\n    });\n  }\n\n  async remove(filePath: string, opts?: { joinRootDir?: boolean }) {\n    if (opts?.joinRootDir !== false) {\n      filePath = this.join(this.rootDir, filePath);\n    }\n    const client = this.getFtpClient();\n    await client.connect(async client => {\n      await client.client.remove(filePath);\n      this.logger.info(`删除文件成功: ${filePath}`);\n    });\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/oss/impls/qiniuoss.ts",
    "content": "import { QiniuAccess, QiniuClient, QiniuOssAccess } from \"../../qiniu/index.js\";\nimport { BaseOssClient, OssFileItem } from \"../api.js\";\n\nexport default class QiniuOssClientImpl extends BaseOssClient<QiniuOssAccess> {\n  client: QiniuClient;\n\n  join(...strs: string[]) {\n    const str = super.join(...strs);\n    if (str.startsWith(\"/\")) {\n      return str.substring(1);\n    }\n    return str;\n  }\n  async init() {\n    const qiniuAccess = await this.ctx.accessService.getById<QiniuAccess>(this.access.accessId);\n    this.client = new QiniuClient({\n      access: qiniuAccess,\n      logger: this.logger,\n      http: this.ctx.utils.http,\n    });\n  }\n\n  async download(fileName: string, savePath: string): Promise<void> {\n    const path = this.join(this.rootDir, fileName);\n    await this.client.downloadFile(this.access.bucket, path, savePath);\n  }\n  async listDir(dir: string): Promise<OssFileItem[]> {\n    const path = this.join(this.rootDir, dir);\n    const res = await this.client.listDir(this.access.bucket, path);\n    return res.items.map(item => {\n      return {\n        path: item.key,\n        size: item.fsize,\n        //ns ，纳秒，去掉低4位 为毫秒\n        lastModified: Math.floor(item.putTime / 10000),\n      };\n    });\n  }\n  async upload(filePath: string, fileContent: Buffer | string) {\n    const path = this.join(this.rootDir, filePath);\n    await this.client.uploadFile(this.access.bucket, path, fileContent);\n  }\n\n  async remove(filePath: string, opts?: { joinRootDir?: boolean }) {\n    if (opts?.joinRootDir !== false) {\n      filePath = this.join(this.rootDir, filePath);\n    }\n    await this.client.removeFile(this.access.bucket, filePath);\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/oss/impls/s3.ts",
    "content": "import { BaseOssClient, OssFileItem } from \"../api.js\";\nimport path from \"node:path\";\nimport { S3Access } from \"../../s3/access.js\";\nimport fs from \"fs\";\nimport dayjs from \"dayjs\";\n\nexport default class S3OssClientImpl extends BaseOssClient<S3Access> {\n  client: any;\n  join(...strs: string[]) {\n    const str = super.join(...strs);\n    if (str.startsWith(\"/\")) {\n      return str.substring(1);\n    }\n    return str;\n  }\n  async init() {\n    // import { S3Client } from \"@aws-sdk/client-s3\";\n    //@ts-ignore\n    const { S3Client } = await import(\"@aws-sdk/client-s3\");\n    this.client = new S3Client({\n      forcePathStyle: true,\n      //@ts-ignore\n      s3ForcePathStyle: true,\n      credentials: {\n        accessKeyId: this.access.accessKeyId, // 默认 MinIO 访问密钥\n        secretAccessKey: this.access.secretAccessKey, // 默认 MinIO 秘密密钥\n      },\n      region: \"us-east-1\",\n      endpoint: this.access.endpoint,\n    });\n  }\n\n  async download(filePath: string, savePath: string): Promise<void> {\n    // @ts-ignore\n    const { GetObjectCommand } = await import(\"@aws-sdk/client-s3\");\n    const key = path.join(this.rootDir, filePath);\n    const params = {\n      Bucket: this.access.bucket, // The name of the bucket. For example, 'sample_bucket_101'.\n      Key: key, // The name of the object. For example, 'sample_upload.txt'.\n    };\n    const res = await this.client.send(new GetObjectCommand({ ...params }));\n    const fileContent = fs.createWriteStream(savePath);\n    res.Body.pipe(fileContent);\n\n    this.logger.info(`文件下载成功: ${savePath}`);\n  }\n\n  async listDir(dir: string): Promise<OssFileItem[]> {\n    // @ts-ignore\n    const { ListObjectsCommand } = await import(\"@aws-sdk/client-s3\");\n    const dirKey = this.join(this.rootDir, dir);\n    const params = {\n      Bucket: this.access.bucket, // The name of the bucket. For example, 'sample_bucket_101'.\n      Prefix: dirKey, // The name of the object. For example, 'sample_upload.txt'.\n    };\n    const res = await this.client.send(new ListObjectsCommand({ ...params }));\n    if (!res.Contents) {\n      return [];\n    }\n    return res.Contents.map(item => {\n      return {\n        path: item.Key,\n        size: item.Size,\n        lastModified: dayjs(item.LastModified).valueOf(),\n      };\n    });\n  }\n  async upload(filePath: string, fileContent: Buffer | string) {\n    // @ts-ignore\n    const { PutObjectCommand } = await import(\"@aws-sdk/client-s3\");\n    const key = path.join(this.rootDir, filePath);\n    this.logger.info(`开始上传文件: ${key}`);\n    const params = {\n      Bucket: this.access.bucket, // The name of the bucket. For example, 'sample_bucket_101'.\n      Key: key, // The name of the object. For example, 'sample_upload.txt'.\n    };\n    if (typeof fileContent === \"string\") {\n      fileContent = fs.createReadStream(fileContent) as any;\n    }\n    await this.client.send(new PutObjectCommand({ Body: fileContent, ...params }));\n\n    this.logger.info(`文件上传成功: ${filePath}`);\n  }\n\n  async remove(filePath: string, opts?: { joinRootDir?: boolean }) {\n    if (opts?.joinRootDir !== false) {\n      filePath = this.join(this.rootDir, filePath);\n    }\n    const key = filePath;\n    // @ts-ignore\n    const { DeleteObjectCommand } = await import(\"@aws-sdk/client-s3\");\n    await this.client.send(\n      new DeleteObjectCommand({\n        Bucket: this.access.bucket,\n        Key: key,\n      })\n    );\n\n    this.logger.info(`文件删除成功: ${key}`);\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/oss/impls/sftp.ts",
    "content": "import { BaseOssClient, OssFileItem } from \"../api.js\";\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport { SftpAccess, SshAccess, SshClient } from \"../../ssh/index.js\";\n\nexport default class SftpOssClientImpl extends BaseOssClient<SftpAccess> {\n  async download(fileName: string, savePath: string): Promise<void> {\n    const path = this.join(this.rootDir, fileName);\n    const client = new SshClient(this.logger);\n    const access = await this.ctx.accessService.getById<SshAccess>(this.access.sshAccess);\n    await client.download({\n      connectConf: access,\n      filePath: path,\n      savePath,\n    });\n  }\n\n  async listDir(dir: string): Promise<OssFileItem[]> {\n    const path = this.join(this.rootDir, dir);\n    const client = new SshClient(this.logger);\n    const access = await this.ctx.accessService.getById<SshAccess>(this.access.sshAccess);\n    const res = await client.listDir({\n      connectConf: access,\n      dir: path,\n    });\n\n    return res.map(item => {\n      return {\n        path: this.join(path, item.filename),\n        size: item.size,\n        lastModified: item.attrs.atime * 1000,\n      };\n    });\n  }\n  async upload(filePath: string, fileContent: Buffer | string) {\n    let tmpFilePath = fileContent as string;\n    if (typeof fileContent !== \"string\") {\n      tmpFilePath = path.join(os.tmpdir(), \"cert\", \"oss\", filePath);\n      const dir = path.dirname(tmpFilePath);\n      if (!fs.existsSync(dir)) {\n        fs.mkdirSync(dir, { recursive: true });\n      }\n      fs.writeFileSync(tmpFilePath, fileContent);\n    }\n\n    const access = await this.ctx.accessService.getById<SshAccess>(this.access.sshAccess);\n    const key = this.join(this.rootDir, filePath);\n    try {\n      const client = new SshClient(this.logger);\n      await client.uploadFiles({\n        connectConf: access,\n        mkdirs: true,\n        transports: [\n          {\n            localPath: tmpFilePath,\n            remotePath: key,\n          },\n        ],\n        uploadType: \"sftp\",\n        opts: {\n          mode: this.access?.fileMode ?? undefined,\n        },\n      });\n    } finally {\n      // Remove temp file\n      fs.unlinkSync(tmpFilePath);\n    }\n  }\n\n  async remove(filePath: string, opts?: { joinRootDir?: boolean }) {\n    const access = await this.ctx.accessService.getById<SshAccess>(this.access.sshAccess);\n    const client = new SshClient(this.logger);\n    if (opts?.joinRootDir !== false) {\n      filePath = this.join(this.rootDir, filePath);\n    }\n    await client.removeFiles({\n      connectConf: access,\n      files: [filePath],\n    });\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/oss/impls/ssh.ts",
    "content": "import { BaseOssClient, OssClientRemoveByOpts, OssFileItem } from \"../api.js\";\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport { SshAccess, SshClient } from \"../../ssh/index.js\";\n\n//废弃\nexport default class SshOssClientImpl extends BaseOssClient<SshAccess> {\n  download(fileName: string, savePath: string): Promise<void> {\n    throw new Error(\"Method not implemented.\");\n  }\n  removeBy(removeByOpts: OssClientRemoveByOpts): Promise<void> {\n    throw new Error(\"Method not implemented.\");\n  }\n  listDir(dir: string): Promise<OssFileItem[]> {\n    throw new Error(\"Method not implemented.\");\n  }\n  async upload(filePath: string, fileContent: Buffer) {\n    if (!filePath) {\n      filePath = \"\";\n    }\n    filePath = filePath.trim();\n    const tmpFilePath = path.join(os.tmpdir(), \"cert\", \"http\", filePath);\n\n    // Write file to temp path\n    const dir = path.dirname(tmpFilePath);\n    if (!fs.existsSync(dir)) {\n      fs.mkdirSync(dir, { recursive: true });\n    }\n    fs.writeFileSync(tmpFilePath, fileContent);\n\n    const key = this.rootDir + filePath;\n    try {\n      const client = new SshClient(this.logger);\n      await client.uploadFiles({\n        connectConf: this.access,\n        mkdirs: true,\n        transports: [\n          {\n            localPath: tmpFilePath,\n            remotePath: key,\n          },\n        ],\n      });\n    } finally {\n      // Remove temp file\n      fs.unlinkSync(tmpFilePath);\n    }\n  }\n\n  async remove(filePath: string, opts?: { joinRootDir?: boolean }) {\n    if (opts?.joinRootDir !== false) {\n      filePath = this.join(this.rootDir, filePath);\n    }\n    const client = new SshClient(this.logger);\n    await client.removeFiles({\n      connectConf: this.access,\n      files: [filePath],\n    });\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/oss/impls/tencentcos.ts",
    "content": "import dayjs from \"dayjs\";\nimport { TencentAccess, TencentCosAccess, TencentCosClient } from \"../../tencent/index.js\";\nimport { BaseOssClient, OssFileItem } from \"../api.js\";\n\nexport default class TencentOssClientImpl extends BaseOssClient<TencentCosAccess> {\n  client: TencentCosClient;\n\n  join(...strs: string[]) {\n    const str = super.join(...strs);\n    if (str.startsWith(\"/\")) {\n      return str.substring(1);\n    }\n    return str;\n  }\n  async init() {\n    const access = await this.ctx.accessService.getById<TencentAccess>(this.access.accessId);\n    this.client = new TencentCosClient({\n      access: access,\n      logger: this.logger,\n      region: this.access.region,\n      bucket: this.access.bucket,\n    });\n  }\n  async download(filePath: string, savePath: string): Promise<void> {\n    const key = this.join(this.rootDir, filePath);\n    await this.client.downloadFile(key, savePath);\n  }\n\n  async listDir(dir: string): Promise<OssFileItem[]> {\n    const dirKey = this.join(this.rootDir, dir) + \"/\";\n    // @ts-ignore\n    const res: any[] = await this.client.listDir(dirKey);\n    return res.map(item => {\n      return {\n        path: item.Key,\n        size: item.Size,\n        lastModified: dayjs(item.LastModified).valueOf(),\n      };\n    });\n  }\n  async upload(filePath: string, fileContent: Buffer | string) {\n    const key = this.join(this.rootDir, filePath);\n    await this.client.uploadFile(key, fileContent);\n    this.logger.info(`文件上传成功: ${filePath}`);\n  }\n\n  async remove(filePath: string, opts?: { joinRootDir?: boolean }) {\n    if (opts?.joinRootDir !== false) {\n      filePath = this.join(this.rootDir, filePath);\n    }\n    await this.client.removeFile(filePath);\n    this.logger.info(`文件删除成功: ${filePath}`);\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/oss/index.ts",
    "content": "export * from \"./factory.js\";\nexport * from \"./api.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/qiniu/access-oss.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from \"@certd/pipeline\";\n\n@IsAccess({\n  name: \"qiniuoss\",\n  title: \"七牛OSS授权\",\n  desc: \"\",\n  icon: \"svg:icon-qiniuyun\",\n  input: {},\n})\nexport class QiniuOssAccess extends BaseAccess {\n  @AccessInput({\n    title: \"七牛云授权\",\n    component: {\n      name: \"access-selector\",\n      vModel: \"modelValue\",\n      type: \"qiniu\",\n    },\n    helper: \"请选择七牛云授权\",\n    required: true,\n  })\n  accessId = \"\";\n\n  @AccessInput({\n    title: \"Bucket\",\n    helper: \"存储桶名称\",\n    required: true,\n  })\n  bucket = \"\";\n}\n\nnew QiniuOssAccess();\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/qiniu/access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from \"@certd/pipeline\";\n\n@IsAccess({\n  name: \"qiniu\",\n  title: \"七牛云授权\",\n  desc: \"\",\n  icon: \"svg:icon-qiniuyun\",\n  input: {},\n})\nexport class QiniuAccess extends BaseAccess {\n  @AccessInput({\n    title: \"AccessKey\",\n    rules: [{ required: true, message: \"此项必填\" }],\n    helper: \"AK，前往[密钥管理](https://portal.qiniu.com/developer/user/key)获取\",\n  })\n  accessKey!: string;\n  @AccessInput({\n    title: \"SecretKey\",\n    encrypt: true,\n    helper: \"SK\",\n  })\n  secretKey!: string;\n}\n\nnew QiniuAccess();\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/qiniu/index.ts",
    "content": "export * from \"./access.js\";\nexport * from \"./access-oss.js\";\nexport * from \"./lib/sdk.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/qiniu/lib/sdk.ts",
    "content": "import { HttpClient, ILogger, safePromise, utils } from \"@certd/basic\";\nimport { QiniuAccess } from \"../access.js\";\nimport fs from \"fs\";\n\nexport type QiniuCertInfo = {\n  key: string;\n  crt: string;\n};\nexport class QiniuClient {\n  http: HttpClient;\n  access: QiniuAccess;\n  logger: ILogger;\n  constructor(opts: { http: HttpClient; access: QiniuAccess; logger: ILogger }) {\n    this.http = opts.http;\n    this.access = opts.access;\n    this.logger = opts.logger;\n  }\n\n  async uploadCert(cert: QiniuCertInfo, certName?: string) {\n    const url = \"https://api.qiniu.com/sslcert\";\n\n    const body = {\n      name: certName,\n      common_name: \"certd\",\n      pri: cert.key,\n      ca: cert.crt,\n    };\n\n    const res = await this.doRequest(url, \"post\", body);\n\n    return res.certID;\n  }\n\n  async bindCert(body: { certid: string; domain: string }) {\n    const url = \"https://api.qiniu.com/cert/bind\";\n    return await this.doRequest(url, \"post\", body);\n  }\n\n  async getCertBindings() {\n    const url = \"https://api.qiniu.com/cert/bindings\";\n    const res = await this.doRequest(url, \"get\");\n    return res;\n  }\n\n  async doRequest(url: string, method: string, body?: any) {\n    const { generateAccessToken } = await import(\"qiniu/qiniu/util.js\");\n    const token = generateAccessToken(this.access, url);\n    const res = await this.http.request({\n      url,\n      method: method,\n      headers: {\n        Authorization: token,\n      },\n      data: body,\n      logRes: false,\n    });\n    if (res && res.error) {\n      if (res.error.includes(\"domaintype\")) {\n        throw new Error(\"请求失败：\" + res.error + \",该域名属于CDN域名，请使用部署到七牛云CDN插件\");\n      }\n      throw new Error(\"请求失败：\" + res.error);\n    }\n    console.log(\"res\", res);\n    return res;\n  }\n\n  async doRequestV2(opts: { url: string; method: string; body?: any; contentType: string }) {\n    const { HttpClient } = await import(\"qiniu/qiniu/httpc/client.js\");\n    const { QiniuAuthMiddleware } = await import(\"qiniu/qiniu/httpc/middleware/qiniuAuth.js\");\n    // X-Qiniu-Date: 20060102T150405Z\n    const auth = new QiniuAuthMiddleware({\n      mac: {\n        ...this.access,\n        options: {},\n      },\n    });\n    const http = new HttpClient({ timeout: 10000, middlewares: [auth] });\n    console.log(\"http\", http);\n\n    return safePromise((resolve, reject) => {\n      try {\n        http.get({\n          url: opts.url,\n          headers: {\n            \"Content-Type\": opts.contentType,\n          },\n          callback: (nullable, res) => {\n            console.log(\"nullable\", nullable, \"res\", res);\n            if (res?.error) {\n              reject(res);\n            } else {\n              resolve(res);\n            }\n          },\n        });\n      } catch (e) {\n        reject(e);\n      }\n    });\n  }\n\n  async uploadFile(bucket: string, key: string, content: Buffer | string) {\n    const sdk = await import(\"qiniu\");\n    const qiniu = sdk.default;\n    const mac = new qiniu.auth.digest.Mac(this.access.accessKey, this.access.secretKey);\n    const options = {\n      scope: bucket,\n    };\n    const putPolicy = new qiniu.rs.PutPolicy(options);\n    const uploadToken = putPolicy.uploadToken(mac);\n\n    const config = new qiniu.conf.Config();\n    const formUploader = new qiniu.form_up.FormUploader(config);\n    const putExtra = new qiniu.form_up.PutExtra();\n    let res: any = {};\n    if (typeof content === \"string\") {\n      const readableStream = fs.createReadStream(content);\n      res = await formUploader.putStream(uploadToken, key, readableStream, putExtra);\n    } else {\n      // 文件上传\n      res = await formUploader.put(uploadToken, key, content, putExtra);\n    }\n    const { data, resp } = res;\n    if (resp.statusCode === 200) {\n      this.logger.info(\"文件上传成功：\" + key);\n      return data;\n    } else {\n      console.log(resp.statusCode);\n      throw new Error(\"上传失败:\" + JSON.stringify(resp));\n    }\n  }\n\n  async removeFile(bucket: string, key: string) {\n    const bucketManager = await this.getBucketManager();\n\n    const { resp } = await bucketManager.delete(bucket, key);\n\n    if (resp.statusCode === 200) {\n      this.logger.info(\"文件删除成功：\" + key);\n      return;\n    } else {\n      throw new Error(\"删除失败:\" + JSON.stringify(resp));\n    }\n  }\n\n  async downloadFile(bucket: string, path: string, savePath: string) {\n    const bucketManager = await this.getBucketManager();\n    const privateBucketDomain = `http://${bucket}.qiniudn.com`;\n    const deadline = Math.floor(Date.now() / 1000) + 3600; // 1小时过期\n    const privateDownloadUrl = bucketManager.privateDownloadUrl(privateBucketDomain, path, deadline);\n\n    await utils.request.download({\n      http: this.http,\n      logger: this.logger,\n      config: {\n        url: privateDownloadUrl,\n        method: \"get\",\n      },\n      savePath,\n    });\n  }\n\n  private async getBucketManager() {\n    const sdk = await import(\"qiniu\");\n    const qiniu = sdk.default;\n    const mac = new qiniu.auth.digest.Mac(this.access.accessKey, this.access.secretKey);\n    const config = new qiniu.conf.Config();\n    config.useHttpsDomain = true;\n    return new qiniu.rs.BucketManager(mac, config);\n  }\n\n  async listDir(bucket: string, path: string) {\n    const bucketManager = await this.getBucketManager();\n    const res = await bucketManager.listPrefix(bucket, {\n      prefix: path,\n      limit: 1000,\n    });\n    return res.data;\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/s3/access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from \"@certd/pipeline\";\nimport { ossClientFactory } from \"../oss/index.js\";\nimport S3OssClientImpl from \"../oss/impls/s3.js\";\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: \"s3\",\n  title: \"s3/minio授权\",\n  desc: \"S3/minio oss授权\",\n  icon: \"mdi:folder-upload-outline\",\n})\nexport class S3Access extends BaseAccess {\n  @AccessInput({\n    title: \"endpoint\",\n    component: {\n      placeholder: \"http://xxxxxx:9000\",\n      name: \"a-input\",\n      vModel: \"value\",\n    },\n    helper: \"Minio的地址，如果是aws s3 则无需填写\",\n    required: false,\n  })\n  endpoint!: string;\n\n  /**\n   * const minioClient = new S3Client({\n   *   endpoint: \"http://localhost:9000\",\n   *   forcePathStyle: true,\n   *   credentials: {\n   *     accessKeyId: \"minioadmin\", // 默认 MinIO 访问密钥\n   *     secretAccessKey: \"minioadmin\", // 默认 MinIO 秘密密钥\n   *   },\n   *   region: \"us-east-1\",\n   * });\n   */\n\n  @AccessInput({\n    title: \"accessKeyId\",\n    component: {\n      placeholder: \"accessKeyId\",\n    },\n    helper: \"accessKeyId\",\n    required: true,\n  })\n  accessKeyId!: string;\n\n  @AccessInput({\n    title: \"secretAccessKey\",\n    component: {\n      placeholder: \"secretAccessKey\",\n      component: {\n        name: \"a-input\",\n        vModel: \"value\",\n      },\n    },\n    helper: \"secretAccessKey\",\n    encrypt: true,\n    required: true,\n  })\n  secretAccessKey!: string;\n\n  @AccessInput({\n    title: \"地区\",\n    value: \"us-east-1\",\n    component: {\n      name: \"a-input\",\n      vModel: \"value\",\n    },\n    helper: \"region\",\n    required: true,\n  })\n  region!: string;\n\n  @AccessInput({\n    title: \"存储桶\",\n    component: {\n      name: \"a-input\",\n      vModel: \"value\",\n    },\n    helper: \"bucket 名称\",\n    required: true,\n  })\n  bucket!: string;\n\n  @AccessInput({\n    title: \"测试\",\n    component: {\n      name: \"api-test\",\n      action: \"TestRequest\",\n    },\n    helper: \"点击测试接口是否正常\",\n  })\n  testRequest = true;\n\n  async onTestRequest() {\n    const client: S3OssClientImpl = await ossClientFactory.createOssClientByType(\"s3\", {\n      access: this,\n      rootDir: \"\",\n      ctx: {\n        accessService: this.ctx.accessService,\n        logger: this.ctx.logger,\n        utils: this.ctx.utils,\n      },\n    });\n\n    await client.listDir(\"/\");\n\n    return \"ok\";\n  }\n}\n\nnew S3Access();\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/s3/index.ts",
    "content": "export * from \"./access.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/ssh/index.ts",
    "content": "export * from \"./ssh.js\";\nexport * from \"./ssh-access.js\";\nexport * from \"./sftp-access.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/ssh/sftp-access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from \"@certd/pipeline\";\n\n@IsAccess({\n  name: \"sftp\",\n  title: \"SFTP授权\",\n  desc: \"\",\n  icon: \"clarity:host-line\",\n  input: {},\n})\nexport class SftpAccess extends BaseAccess {\n  @AccessInput({\n    title: \"SSH授权\",\n    component: {\n      name: \"access-selector\",\n      type: \"ssh\",\n      vModel: \"modelValue\",\n    },\n    helper: \"请选择一个SSH授权\",\n    required: true,\n  })\n  sshAccess!: string;\n  @AccessInput({\n    title: \"文件权限\",\n    component: {\n      name: \"a-input\",\n      vModel: \"value\",\n      placeholder: \"777\",\n    },\n    helper: \"文件上传后是否修改文件权限\",\n  })\n  fileMode!: string;\n}\n\nnew SftpAccess();\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/ssh/ssh-access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from \"@certd/pipeline\";\n@IsAccess({\n  name: \"ssh\",\n  title: \"主机登录授权\",\n  desc: \"\",\n  icon: \"clarity:host-line\",\n  input: {},\n})\nexport class SshAccess extends BaseAccess {\n  @AccessInput({\n    title: \"主机地址\",\n    component: {\n      placeholder: \"主机域名或IP地址\",\n    },\n    required: true,\n  })\n  host!: string;\n  @AccessInput({\n    title: \"端口\",\n    value: 22,\n    component: {\n      name: \"a-input-number\",\n      placeholder: \"22\",\n    },\n    rules: [{ required: true, message: \"此项必填\" }],\n  })\n  port!: number;\n  @AccessInput({\n    title: \"用户名\",\n    value: \"root\",\n    rules: [{ required: true, message: \"此项必填\" }],\n  })\n  username!: string;\n  @AccessInput({\n    title: \"密码\",\n    component: {\n      name: \"a-input-password\",\n      vModel: \"value\",\n    },\n    encrypt: true,\n    helper: \"登录密码或密钥必填一项\",\n  })\n  password!: string;\n  @AccessInput({\n    title: \"私钥登录\",\n    helper: \"私钥或密码必填一项\",\n    component: {\n      name: \"a-textarea\",\n      vModel: \"value\",\n    },\n    encrypt: true,\n  })\n  privateKey!: string;\n\n  @AccessInput({\n    title: \"私钥密码\",\n    helper: \"如果你的私钥有密码的话\",\n    component: {\n      name: \"a-input-password\",\n      vModel: \"value\",\n    },\n    encrypt: true,\n  })\n  passphrase!: string;\n\n  @AccessInput({\n    title: \"伪终端\",\n    helper: \"如果登录报错：all authentication methods failed，可以尝试开启伪终端模式进行keyboard-interactive方式登录\\n开启后对日志输出有一定的影响\",\n    component: {\n      name: \"a-switch\",\n      vModel: \"checked\",\n    },\n  })\n  pty!: boolean;\n\n  @AccessInput({\n    title: \"socks代理\",\n    helper: \"socks代理配置，格式：socks5://user:password@host:port\",\n    component: {\n      name: \"a-input\",\n      vModel: \"value\",\n      placeholder: \"socks5://user:password@host:port\",\n    },\n    encrypt: false,\n  })\n  socksProxy!: string;\n\n  @AccessInput({\n    title: \"是否Windows\",\n    helper: \"如果是Windows主机，请勾选此项\\n并且需要windows[安装OpenSSH](https://certd.docmirror.cn/guide/use/host/windows.html)\",\n    component: {\n      name: \"a-switch\",\n      vModel: \"checked\",\n    },\n  })\n  windows = false;\n\n  @AccessInput({\n    title: \"命令编码\",\n    helper: \"如果是Windows主机，且出现乱码了，请尝试设置为GBK\",\n    component: {\n      name: \"a-select\",\n      vModel: \"value\",\n      options: [\n        { value: \"\", label: \"默认\" },\n        { value: \"GBK\", label: \"GBK\" },\n        { value: \"UTF8\", label: \"UTF-8\" },\n      ],\n    },\n  })\n  encoding: string;\n\n  @AccessInput({\n    title: \"测试\",\n    component: {\n      name: \"api-test\",\n      type: \"access\",\n      typeName: \"ssh\",\n      action: \"TestRequest\",\n    },\n    mergeScript: `\n         return {\n            component:{\n              form: ctx.compute(({form})=>{\n                return form\n              })\n            },\n         }\n        `,\n    helper: \"点击测试\",\n  })\n  testRequest = true;\n\n  async onTestRequest() {\n    const { SshClient } = await import(\"./ssh.js\");\n    const client = new SshClient(this.ctx.logger);\n\n    await client.exec({\n      connectConf: this,\n      script: \"echo hello\",\n    });\n    return \"ok\";\n  }\n}\n\nnew SshAccess();\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/ssh/ssh.ts",
    "content": "// @ts-ignore\nimport path from \"path\";\nimport { isArray } from \"lodash-es\";\nimport { ILogger, safePromise } from \"@certd/basic\";\nimport { SshAccess } from \"./ssh-access.js\";\n\nimport fs from \"fs\";\nimport { SocksProxyType } from \"socks/typings/common/constants\";\n\nexport type TransportItem = { localPath: string; remotePath: string };\nexport interface SocksProxy {\n  ipaddress?: string;\n  host?: string;\n  port: number;\n  type: any;\n  userId?: string;\n  password?: string;\n  custom_auth_method?: number;\n  custom_auth_request_handler?: () => Promise<Buffer>;\n  custom_auth_response_size?: number;\n  custom_auth_response_handler?: (data: Buffer) => Promise<boolean>;\n}\nexport type SshConnectConfig = {\n  sock?: any;\n};\n\nexport class AsyncSsh2Client {\n  conn: any;\n  logger: ILogger;\n  connConf: SshAccess & SshConnectConfig;\n  windows = false;\n  encoding: string;\n  constructor(connConf: SshAccess, logger: ILogger) {\n    this.connConf = connConf;\n    this.logger = logger;\n    this.windows = connConf.windows || false;\n    this.encoding = connConf.encoding;\n  }\n\n  convert(iconv: any, buffer: Buffer) {\n    if (this.encoding) {\n      return iconv.decode(buffer, this.encoding);\n    }\n    return buffer.toString().replaceAll(\"\\r\\n\", \"\\n\");\n  }\n\n  async connect() {\n    this.logger.info(`开始连接，${this.connConf.host}:${this.connConf.port}`);\n    if (this.connConf.socksProxy) {\n      this.logger.info(`使用代理${this.connConf.socksProxy}`);\n      if (typeof this.connConf.port === \"string\") {\n        this.connConf.port = parseInt(this.connConf.port);\n      }\n\n      const { SocksClient } = await import(\"socks\");\n\n      const proxyOption = this.parseSocksProxyFromUri(this.connConf.socksProxy);\n      const info = await SocksClient.createConnection({\n        proxy: proxyOption,\n        command: \"connect\",\n        destination: {\n          host: this.connConf.host,\n          port: this.connConf.port,\n        },\n      });\n      this.logger.info(\"代理连接成功\");\n      this.connConf.sock = info.socket;\n    }\n\n    const ssh2 = await import(\"ssh2\");\n    const ssh2Constants = await import(\"ssh2/lib/protocol/constants.js\");\n    const { SUPPORTED_KEX, SUPPORTED_SERVER_HOST_KEY, SUPPORTED_CIPHER, SUPPORTED_MAC } = ssh2Constants.default;\n    return safePromise((resolve, reject) => {\n      try {\n        const conn = new ssh2.default.Client();\n        conn\n          .on(\"error\", (err: any) => {\n            this.logger.error(\"连接失败\", err);\n            reject(err);\n          })\n          .on(\"ready\", () => {\n            this.logger.info(\"连接成功\");\n            this.conn = conn;\n            resolve(this.conn);\n          })\n          .on(\"keyboard-interactive\", (name, descr, lang, prompts, finish) => {\n            // For illustration purposes only! It's not safe to do this!\n            // You can read it from process.stdin or whatever else...\n            const password = this.connConf.password;\n            return finish([password]);\n\n            // And remember, server may trigger this event multiple times\n            // and for different purposes (not only auth)\n          })\n          .connect({\n            ...this.connConf,\n            tryKeyboard: true,\n            algorithms: {\n              serverHostKey: SUPPORTED_SERVER_HOST_KEY,\n              cipher: SUPPORTED_CIPHER,\n              hmac: SUPPORTED_MAC,\n              kex: SUPPORTED_KEX,\n            },\n          });\n      } catch (e) {\n        reject(e);\n      }\n    });\n  }\n  async getSftp() {\n    return safePromise((resolve, reject) => {\n      this.logger.info(\"获取sftp\");\n      this.conn.sftp((err: any, sftp: any) => {\n        if (err) {\n          reject(err);\n          return;\n        }\n        resolve(sftp);\n      });\n    });\n  }\n\n  async fastPut(options: { sftp: any; localPath: string; remotePath: string; opts?: { mode?: string } }) {\n    const { sftp, localPath, remotePath, opts } = options;\n    return safePromise((resolve, reject) => {\n      this.logger.info(`开始上传：${localPath} => ${remotePath}`);\n      sftp.fastPut(localPath, remotePath, { ...(opts ?? {}) }, (err: Error) => {\n        if (err) {\n          reject(err);\n          this.logger.error(\"请确认路径是否包含文件名，路径本身不能是目录，路径不能有*?之类的特殊符号，要有写入权限\");\n          return;\n        }\n        this.logger.info(`上传文件成功：${localPath} => ${remotePath}`);\n        resolve({});\n      });\n    });\n  }\n\n  async listDir(options: { sftp: any; remotePath: string }) {\n    const { sftp, remotePath } = options;\n    return safePromise((resolve, reject) => {\n      this.logger.info(`listDir：${remotePath}`);\n      sftp.readdir(remotePath, (err: Error, list: any) => {\n        if (err) {\n          reject(err);\n          return;\n        }\n        resolve(list);\n      });\n    });\n  }\n\n  async unlink(options: { sftp: any; remotePath: string }) {\n    const { sftp, remotePath } = options;\n    return safePromise((resolve, reject) => {\n      this.logger.info(`开始删除远程文件：${remotePath}`);\n      sftp.unlink(remotePath, (err: Error) => {\n        if (err) {\n          reject(err);\n          return;\n        }\n        this.logger.info(`删除文件成功：${remotePath}`);\n        resolve({});\n      });\n    });\n  }\n\n  /**\n   *\n   * @param script\n   * @param opts {withStdErr 返回{stdOut,stdErr}}\n   */\n  async exec(\n    script: string,\n    opts: {\n      throwOnStdErr?: boolean;\n      withStdErr?: boolean;\n      env?: any;\n    } = {}\n  ): Promise<string> {\n    if (!script) {\n      this.logger.info(\"script 为空，取消执行\");\n      return;\n    }\n    let iconv: any = await import(\"iconv-lite\");\n    iconv = iconv.default;\n    // if (this.connConf.windows) {\n    //   script += \"\\r\\nexit\\r\\n\";\n    //   //保证windows下正常退出\n    // }\n    return safePromise((resolve, reject) => {\n      this.logger.info(`执行命令：[${this.connConf.host}][exec]: \\n` + script);\n      // pty 伪终端，window下的输出会带上conhost.exe之类的多余的字符串，影响返回结果判断\n      // linux下 当使用keyboard-interactive 登录时，需要pty\n      const pty = this.connConf.pty; //linux下开启伪终端，windows下不开启\n      this.conn.exec(script, { pty, env: opts.env }, (err: Error, stream: any) => {\n        if (err) {\n          reject(err);\n          return;\n        }\n        let data = \"\";\n        let stdErr = \"\";\n        let hasErrorLog = false;\n        stream\n          .on(\"close\", (code: any, signal: any) => {\n            this.logger.info(`[${this.connConf.host}][close]:code:${code}`);\n            /**\n             * ]pipeline 执行命令:[10.123.0.2][exec]:cd /d D:\\nginx-1.27.5 && D:\\nginx-1.27.5\\nginx.exe -t && D:\\nginx-1.27.5\\nginx.exe -s reload\n             * [2025-07-09T10:24:11.219] [ERROR]pipeline - [10. 123.0. 2][error]: nginx: the configuration file D: \\nginx-1.27. 5/conf/nginx. conf syntax is ok\n             * [2025-07-09T10:24:11.231] [ERROR][10. 123. 0. 2] [error]: nginx: configuration file D: \\nginx-1.27.5/conf/nginx.conf test is successful\n             * pipeline-\n             * [2025-07-09T10:24:11.473] [INFO]pipeline -[10.123.0.2][close]:code:0\n             * [2025-07-09T10:24:11.473][ERRoR] pipeline- [step][主机一执行远程主机脚本命令]<id:53hyarN3yvmbijNuMiNAt>: [Eror: nginx: the configuration fileD:\\nginx-1.27.5/conf/nginx.conf syntax is ok\n              //需要忽略windows的错误\n             */\n            // if (opts.throwOnStdErr == null && this.windows) {\n            //   opts.throwOnStdErr = true;\n            // }\n            if (opts.throwOnStdErr && hasErrorLog) {\n              reject(new Error(data));\n            }\n\n            if (code === 0) {\n              if (opts.withStdErr === true) {\n                //@ts-ignore\n                resolve({\n                  stdErr,\n                  stdOut: data,\n                });\n              } else {\n                resolve(data);\n              }\n            } else {\n              reject(new Error(data));\n            }\n          })\n          .on(\"data\", (ret: Buffer) => {\n            const out = this.convert(iconv, ret);\n            data += out;\n            this.logger.info(`[${this.connConf.host}][info]: ` + out.trimEnd());\n          })\n          .on(\"error\", (err: any) => {\n            reject(err);\n            this.logger.error(err);\n          })\n          .stderr.on(\"data\", (ret: Buffer) => {\n            const err = this.convert(iconv, ret);\n            stdErr += err;\n            hasErrorLog = true;\n            this.logger.error(`[${this.connConf.host}][error]: ` + err.trimEnd());\n          });\n      });\n    });\n  }\n\n  async shell(script: string | string[]): Promise<string> {\n    const stripAnsiModule = await import(\"strip-ansi\");\n    const stripAnsi = stripAnsiModule.default;\n    return safePromise<any>((resolve, reject) => {\n      this.logger.info(`执行shell脚本：[${this.connConf.host}][shell]: ` + script);\n      this.conn.shell((err: Error, stream: any) => {\n        if (err) {\n          reject(err);\n          return;\n        }\n        let output = \"\";\n        function ansiHandle(data: string) {\n          data = data.replace(/\\[[0-9]+;1H/g, \"\");\n          data = stripAnsi(data);\n          return data.replaceAll(\"\\r\\n\", \"\\n\");\n        }\n        stream\n          .on(\"close\", (code: any) => {\n            this.logger.info(\"Stream :: close,code: \" + code);\n            resolve(output);\n          })\n          .on(\"data\", (ret: Buffer) => {\n            const data = ansiHandle(ret.toString());\n            this.logger.info(data);\n            output += data;\n          })\n          .on(\"error\", (err: any) => {\n            reject(err);\n            this.logger.error(err);\n          })\n          .stderr.on(\"data\", (ret: Buffer) => {\n            const data = ansiHandle(ret.toString());\n            output += data;\n            this.logger.error(`[${this.connConf.host}][error]: ` + data);\n          });\n        //保证windows下正常退出\n        const exit = \"\\r\\nexit\\r\\n\";\n        stream.end(script + exit);\n      });\n    });\n  }\n  end() {\n    if (this.conn) {\n      this.conn.end();\n      this.conn.destroy();\n      this.conn = null;\n    }\n  }\n\n  private parseSocksProxyFromUri(socksProxyUri: string): SocksProxy {\n    const url = new URL(socksProxyUri);\n    let type: SocksProxyType = 5;\n    if (url.protocol.startsWith(\"socks4\")) {\n      type = 4;\n    }\n    const proxy: SocksProxy = {\n      host: url.hostname,\n      port: parseInt(url.port),\n      type,\n    };\n    if (url.username) {\n      proxy.userId = url.username;\n    }\n    if (url.password) {\n      proxy.password = url.password;\n    }\n    return proxy;\n  }\n\n  async download(param: { remotePath: string; savePath: string; sftp: any }) {\n    return safePromise((resolve, reject) => {\n      const { remotePath, savePath, sftp } = param;\n      sftp.fastGet(\n        remotePath,\n        savePath,\n        {\n          step: (transferred: any, chunk: any, total: any) => {\n            this.logger.info(`${transferred} / ${total}`);\n          },\n        },\n        (err: any) => {\n          if (err) {\n            reject(err);\n          } else {\n            resolve({});\n          }\n        }\n      );\n    });\n  }\n}\n\nexport class SshClient {\n  logger: ILogger;\n  /**\n   *\n   * @param connectConf\n    {\n          host: '192.168.100.100',\n          port: 22,\n          username: 'frylock',\n          password: 'nodejsrules'\n         }\n   * @param options\n   */\n  async uploadFiles(options: { connectConf: SshAccess; transports: TransportItem[]; mkdirs: boolean; opts?: { mode?: string }; uploadType?: string }) {\n    const { connectConf, transports, mkdirs, opts } = options;\n    await this._call({\n      connectConf,\n      callable: async (conn: AsyncSsh2Client) => {\n        this.logger.info(\"开始上传\");\n        if (mkdirs !== false) {\n          this.logger.info(\"初始化父目录\");\n          for (const transport of transports) {\n            const filePath = path.dirname(transport.remotePath);\n            let mkdirCmd = `mkdir -p ${filePath} `;\n            if (conn.windows) {\n              if (filePath.indexOf(\"/\") > -1) {\n                this.logger.info(\"--------------------------\");\n                this.logger.info(\"请注意：windows下，文件目录分隔应该写成\\\\而不是/\");\n                this.logger.info(\"--------------------------\");\n              }\n              const isCmd = await this.isCmd(conn);\n              if (!isCmd) {\n                mkdirCmd = `New-Item -ItemType Directory -Path \"${filePath}\" -Force`;\n              } else {\n                mkdirCmd = `if not exist \"${filePath}\" mkdir \"${filePath}\"`;\n              }\n            }\n            await conn.exec(mkdirCmd);\n          }\n        }\n\n        if (options.uploadType === \"scp\") {\n          //scp\n          for (const transport of transports) {\n            await this.scpUpload({ conn, ...transport, opts });\n            await new Promise(resolve => setTimeout(resolve, 1000));\n          }\n        } else {\n          const sftp = await conn.getSftp();\n          for (const transport of transports) {\n            await conn.fastPut({ sftp, ...transport, opts });\n          }\n        }\n\n        this.logger.info(\"文件全部上传成功\");\n      },\n    });\n  }\n  constructor(logger: ILogger) {\n    this.logger = logger;\n  }\n\n  async scpUpload(options: { conn: any; localPath: string; remotePath: string; opts?: { mode?: string } }) {\n    const { conn, localPath, remotePath } = options;\n    return safePromise((resolve, reject) => {\n      // 关键步骤：构造 SCP 命令\n      this.logger.info(`开始上传：${localPath} => ${remotePath}`);\n      conn.conn.exec(\n        `scp -t ${remotePath}`, // -t 表示目标模式\n        (err, stream) => {\n          if (err) {\n            return reject(err);\n          }\n          try {\n            // 准备 SCP 协议头\n            const fileStats = fs.statSync(localPath);\n            const fileName = path.basename(localPath);\n\n            // SCP 协议格式：C[权限] [文件大小] [文件名]\\n\n            stream.write(`C0644 ${fileStats.size} ${fileName}\\n`);\n\n            // 通过管道传输文件\n            fs.createReadStream(localPath)\n              .on(\"error\", e => {\n                this.logger.info(\"read stream error\", e);\n                reject(e);\n              })\n              .pipe(stream)\n              .on(\"finish\", async () => {\n                this.logger.info(`上传完成：${localPath} => ${remotePath}`);\n                resolve(true);\n              })\n              .on(\"error\", reject);\n          } catch (e) {\n            reject(e);\n          }\n        }\n      );\n    });\n  }\n\n  async removeFiles(opts: { connectConf: SshAccess; files: string[] }) {\n    const { connectConf, files } = opts;\n    await this._call({\n      connectConf,\n      callable: async (conn: AsyncSsh2Client) => {\n        const sftp = await conn.getSftp();\n        this.logger.info(\"开始删除\");\n        for (const file of files) {\n          await conn.unlink({\n            sftp,\n            remotePath: file,\n          });\n        }\n        this.logger.info(\"文件全部删除成功\");\n      },\n    });\n  }\n\n  async isCmd(conn: AsyncSsh2Client) {\n    const spec = await conn.exec(\"echo %COMSPEC% \");\n    if (spec.toString().trim() === \"%COMSPEC%\") {\n      return false;\n    } else {\n      return true;\n    }\n  }\n\n  async getIsCmd(options: { connectConf: SshAccess }) {\n    const { connectConf } = options;\n    return await this._call<boolean>({\n      connectConf,\n      callable: async (conn: AsyncSsh2Client) => {\n        return await this.isCmd(conn);\n      },\n    });\n  }\n\n  /**\n   *\n   * Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\OpenSSH\" -Name DefaultShell -Value \"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\"\n   * Start-Service sshd\n   *\n   * Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\OpenSSH\" -Name DefaultShell -Value \"C:\\Windows\\System32\\cmd.exe\"\n   * @param options\n   */\n  async exec(options: { connectConf: SshAccess; script: string | Array<string>; env?: any; throwOnStdErr?: boolean; stopOnError?: boolean }): Promise<string> {\n    let { script } = options;\n    const { connectConf, throwOnStdErr } = options;\n\n    // this.logger.info('命令：', script);\n    return await this._call({\n      connectConf,\n      callable: async (conn: AsyncSsh2Client) => {\n        let isWinCmd = false;\n        const isLinux = !connectConf.windows;\n        const envScripts = [];\n        if (connectConf.windows) {\n          isWinCmd = await this.isCmd(conn);\n        }\n\n        if (options.env) {\n          for (const key in options.env) {\n            if (isLinux) {\n              envScripts.push(`export ${key}=${options.env[key]}`);\n            } else if (isWinCmd) {\n              //win cmd\n              envScripts.push(`set ${key}=${options.env[key]}`);\n            } else {\n              //powershell\n              envScripts.push(`$env:${key}=\"${options.env[key]}\"`);\n            }\n          }\n        }\n\n        if (isWinCmd) {\n          if (typeof script === \"string\") {\n            script = script.split(\"\\n\");\n          }\n          //组合成&&的形式\n          script = envScripts.concat(script);\n          script = script as Array<string>;\n          script = script.join(\" && \");\n        } else {\n          const newLine = isLinux ? \"\\n\" : \"\\r\\n\";\n          if (isArray(script)) {\n            script = script as Array<string>;\n            script = script.join(newLine);\n          }\n          if (envScripts.length > 0) {\n            script = envScripts.join(newLine) + newLine + script;\n          }\n        }\n\n        if (isLinux && options.stopOnError !== false) {\n          script = \"set -e\\n\" + script;\n        }\n\n        return await conn.exec(script as string, { throwOnStdErr });\n      },\n    });\n  }\n\n  async shell(options: { connectConf: SshAccess; script: string | Array<string> }): Promise<string> {\n    let { script } = options;\n    const { connectConf } = options;\n    if (isArray(script)) {\n      script = script as Array<string>;\n      if (connectConf.windows) {\n        script = script.join(\"\\r\\n\");\n      } else {\n        script = script.join(\"\\n\");\n      }\n    } else {\n      if (connectConf.windows) {\n        //@ts-ignore\n        script = script.replaceAll(\"\\n\", \"\\r\\n\");\n      }\n    }\n    return await this._call({\n      connectConf,\n      callable: async (conn: AsyncSsh2Client) => {\n        return await conn.shell(script as string);\n      },\n    });\n  }\n\n  async _call<T = any>(options: { connectConf: SshAccess; callable: (conn: AsyncSsh2Client) => Promise<T> }): Promise<T> {\n    const { connectConf, callable } = options;\n    const conn = new AsyncSsh2Client(connectConf, this.logger);\n    try {\n      await conn.connect();\n    } catch (e: any) {\n      if (e.message?.indexOf(\"All configured authentication methods failed\") > -1) {\n        this.logger.error(e);\n        throw new Error(\"登录失败，请检查用户名/密码/密钥是否正确\");\n      }\n      throw e;\n    }\n\n    try {\n      return await callable(conn);\n    } finally {\n      conn.end();\n    }\n  }\n\n  async listDir(param: { connectConf: any; dir: string }) {\n    return await this._call<any>({\n      connectConf: param.connectConf,\n      callable: async (conn: AsyncSsh2Client) => {\n        const sftp = await conn.getSftp();\n        return await conn.listDir({\n          sftp,\n          remotePath: param.dir,\n        });\n      },\n    });\n  }\n\n  async download(param: { connectConf: any; filePath: string; savePath: string }) {\n    return await this._call<any>({\n      connectConf: param.connectConf,\n      callable: async (conn: AsyncSsh2Client) => {\n        const sftp = await conn.getSftp();\n        return await conn.download({\n          sftp,\n          remotePath: param.filePath,\n          savePath: param.savePath,\n        });\n      },\n    });\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/tencent/access-cos.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from \"@certd/pipeline\";\n\n@IsAccess({\n  name: \"tencentcos\",\n  title: \"腾讯云COS授权\",\n  icon: \"svg:icon-tencentcloud\",\n  desc: \"腾讯云对象存储授权，包含地域和存储桶\",\n})\nexport class TencentCosAccess extends BaseAccess {\n  @AccessInput({\n    title: \"腾讯云授权\",\n    component: {\n      name: \"access-selector\",\n      vModel: \"modelValue\",\n      type: \"tencent\",\n    },\n    helper: \"请选择腾讯云授权\",\n    required: true,\n  })\n  accessId = \"\";\n\n  @AccessInput({\n    title: \"所在地域\",\n    helper: \"存储桶所在地域\",\n    component: {\n      name: \"a-auto-complete\",\n      vModel: \"value\",\n      options: [\n        { value: \"\", label: \"--------中国大陆地区-------\", disabled: true },\n        { value: \"ap-beijing-1\", label: \"北京1区\" },\n        { value: \"ap-beijing\", label: \"北京\" },\n        { value: \"ap-nanjing\", label: \"南京\" },\n        { value: \"ap-shanghai\", label: \"上海\" },\n        { value: \"ap-guangzhou\", label: \"广州\" },\n        { value: \"ap-chengdu\", label: \"成都\" },\n        { value: \"ap-chongqing\", label: \"重庆\" },\n        { value: \"ap-shenzhen-fsi\", label: \"深圳金融\" },\n        { value: \"ap-shanghai-fsi\", label: \"上海金融\" },\n        { value: \"ap-beijing-fsi\", label: \"北京金融\" },\n        { value: \"\", label: \"--------中国香港及境外-------\", disabled: true },\n        { value: \"ap-hongkong\", label: \"中国香港\" },\n        { value: \"ap-singapore\", label: \"新加坡\" },\n        { value: \"ap-mumbai\", label: \"孟买\" },\n        { value: \"ap-jakarta\", label: \"雅加达\" },\n        { value: \"ap-seoul\", label: \"首尔\" },\n        { value: \"ap-bangkok\", label: \"曼谷\" },\n        { value: \"ap-tokyo\", label: \"东京\" },\n        { value: \"na-siliconvalley\", label: \"硅谷\" },\n        { value: \"na-ashburn\", label: \"弗吉尼亚\" },\n        { value: \"sa-saopaulo\", label: \"圣保罗\" },\n        { value: \"eu-frankfurt\", label: \"法兰克福\" },\n      ],\n    },\n  })\n  region!: string;\n\n  @AccessInput({\n    title: \"Bucket\",\n    helper: \"存储桶名称\",\n    required: true,\n  })\n  bucket = \"\";\n}\n\nnew TencentCosAccess();\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/tencent/access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from \"@certd/pipeline\";\n\n@IsAccess({\n  name: \"tencent\",\n  title: \"腾讯云\",\n  icon: \"svg:icon-tencentcloud\",\n})\nexport class TencentAccess extends BaseAccess {\n  @AccessInput({\n    title: \"secretId\",\n    helper: \"使用对应的插件需要有对应的权限，比如上传证书，需要证书管理权限;部署到clb需要clb相关权限\\n前往[密钥管理](https://console.cloud.tencent.com/cam/capi)进行创建\",\n    component: {\n      placeholder: \"secretId\",\n    },\n    rules: [{ required: true, message: \"该项必填\" }],\n  })\n  secretId = \"\";\n  @AccessInput({\n    title: \"secretKey\",\n    component: {\n      placeholder: \"secretKey\",\n    },\n    encrypt: true,\n    rules: [{ required: true, message: \"该项必填\" }],\n  })\n  secretKey = \"\";\n\n  @AccessInput({\n    title: \"站点类型\",\n    value: \"cn\",\n    component: {\n      name: \"a-select\",\n      options: [\n        {\n          label: \"国内站\",\n          value: \"cn\",\n        },\n        {\n          label: \"国际站\",\n          value: \"intl\",\n        },\n      ],\n    },\n    encrypt: false,\n    rules: [{ required: true, message: \"该项必填\" }],\n  })\n  accountType: string;\n\n  isIntl() {\n    return this.accountType === \"intl\";\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/tencent/index.ts",
    "content": "export * from \"./access.js\";\nexport * from \"./access-cos.js\";\nexport * from \"./lib/index.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/tencent/lib/cos-client.ts",
    "content": "import { TencentAccess } from \"../access.js\";\nimport { ILogger, safePromise } from \"@certd/basic\";\nimport fs from \"fs\";\n\nexport class TencentCosClient {\n  access: TencentAccess;\n  logger: ILogger;\n  region: string;\n  bucket: string;\n\n  constructor(opts: { access: TencentAccess; logger: ILogger; region: string; bucket: string }) {\n    this.access = opts.access;\n    this.logger = opts.logger;\n    this.bucket = opts.bucket;\n    this.region = opts.region;\n  }\n\n  async getCosClient() {\n    const sdk = await import(\"cos-nodejs-sdk-v5\");\n    const clientConfig = {\n      SecretId: this.access.secretId,\n      SecretKey: this.access.secretKey,\n    };\n    return new sdk.default(clientConfig);\n  }\n\n  async uploadFile(key: string, file: Buffer | string) {\n    const cos = await this.getCosClient();\n    return safePromise((resolve, reject) => {\n      let readableStream = file as any;\n      if (typeof file === \"string\") {\n        readableStream = fs.createReadStream(file);\n      }\n      cos.putObject(\n        {\n          Bucket: this.bucket /* 必须 */,\n          Region: this.region /* 必须 */,\n          Key: key /* 必须 */,\n          Body: readableStream, // 上传文件对象\n          onProgress: function (progressData) {\n            console.log(JSON.stringify(progressData));\n          },\n        },\n        function (err, data) {\n          if (err) {\n            reject(err);\n            return;\n          }\n          resolve(data);\n        }\n      );\n    });\n  }\n\n  async removeFile(key: string) {\n    const cos = await this.getCosClient();\n    return safePromise((resolve, reject) => {\n      cos.deleteObject(\n        {\n          Bucket: this.bucket,\n          Region: this.region,\n          Key: key,\n        },\n        function (err, data) {\n          if (err) {\n            reject(err);\n            return;\n          }\n          resolve(data);\n        }\n      );\n    });\n  }\n\n  async downloadFile(key: string, savePath: string) {\n    const cos = await this.getCosClient();\n    const writeStream = fs.createWriteStream(savePath);\n    return safePromise((resolve, reject) => {\n      cos.getObject(\n        {\n          Bucket: this.bucket,\n          Region: this.region,\n          Key: key,\n          Output: writeStream,\n        },\n        function (err, data) {\n          if (err) {\n            reject(err);\n            return;\n          }\n          resolve(data);\n        }\n      );\n    });\n  }\n\n  async listDir(dirKey: string) {\n    const cos = await this.getCosClient();\n    return safePromise((resolve, reject) => {\n      cos.getBucket(\n        {\n          Bucket: this.bucket,\n          Region: this.region,\n          Prefix: dirKey,\n          MaxKeys: 1000,\n        },\n        function (err, data) {\n          if (err) {\n            reject(err);\n            return;\n          }\n          resolve(data.Contents);\n        }\n      );\n    });\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/tencent/lib/index.ts",
    "content": "export * from \"./ssl-client.js\";\nexport * from \"./cos-client.js\";\n"
  },
  {
    "path": "packages/plugins/plugin-lib/src/tencent/lib/ssl-client.ts",
    "content": "import { ILogger } from \"@certd/basic\";\nimport { TencentAccess } from \"../access.js\";\n\nexport type TencentCertInfo = {\n  key: string;\n  crt: string;\n};\nexport class TencentSslClient {\n  access: TencentAccess;\n  logger: ILogger;\n  region?: string;\n  constructor(opts: { access: TencentAccess; logger: ILogger; region?: string }) {\n    this.access = opts.access;\n    this.logger = opts.logger;\n    this.region = opts.region;\n  }\n  async getSslClient(): Promise<any> {\n    const sdk = await import(\"tencentcloud-sdk-nodejs/tencentcloud/services/ssl/v20191205/index.js\");\n    const SslClient = sdk.v20191205.Client;\n\n    const clientConfig = {\n      credential: {\n        secretId: this.access.secretId,\n        secretKey: this.access.secretKey,\n      },\n      region: this.region,\n      profile: {\n        httpProfile: {\n          endpoint: \"ssl.tencentcloudapi.com\",\n        },\n      },\n    };\n\n    return new SslClient(clientConfig);\n  }\n\n  checkRet(ret: any) {\n    if (!ret || ret.Error) {\n      throw new Error(\"请求失败：\" + ret.Error.Code + \",\" + ret.Error.Message);\n    }\n  }\n\n  async uploadToTencent(opts: { certName: string; cert: TencentCertInfo }): Promise<string> {\n    const client = await this.getSslClient();\n    const params = {\n      CertificatePublicKey: opts.cert.crt,\n      CertificatePrivateKey: opts.cert.key,\n      Alias: opts.certName,\n    };\n    const ret = await client.UploadCertificate(params);\n    this.checkRet(ret);\n    this.logger.info(`证书[${opts.certName}]上传成功：tencentCertId=`, ret.CertificateId);\n    await this.switchCertNotify([ret.CertificateId], true);\n    return ret.CertificateId;\n  }\n\n  async switchCertNotify(certIds: string[], disabled: boolean) {\n    const client = await this.getSslClient();\n    const params = {\n      CertificateIds: certIds,\n      SwitchStatus: disabled ? 1 : 0, //1是忽略通知，0是不忽略\n    };\n    const ret = await client.ModifyCertificatesExpiringNotificationSwitch(params);\n    this.checkRet(ret);\n    this.logger.info(`关闭证书${certIds}过期通知成功`);\n    return ret.RequestId;\n  }\n\n  async deployCertificateInstance(params: any) {\n    const client = await this.getSslClient();\n    const res = await client.DeployCertificateInstance(params);\n    this.checkRet(res);\n    return res;\n  }\n\n  async DescribeCertificates(params: any) {\n    const client = await this.getSslClient();\n    const res = await client.DescribeCertificates(params);\n    this.checkRet(res);\n    return res;\n  }\n\n  async doRequest(action: string, params: any) {\n    const client = await this.getSslClient();\n    if (!client[action]) {\n      throw new Error(`action ${action} not found`);\n    }\n    const res = await client[action](params);\n    this.checkRet(res);\n    return res;\n  }\n}\n"
  },
  {
    "path": "packages/plugins/plugin-lib/tsconfig.json",
    "content": "{\n  \"compileOnSave\": true,\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"esModuleInterop\": true,\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"inlineSourceMap\":true,\n    \"noImplicitThis\": true,\n    \"noUnusedLocals\": true,\n    \"stripInternal\": true,\n    \"skipLibCheck\": true,\n    \"pretty\": true,\n    \"declaration\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"typeRoots\": [ \"./typings\", \"./node_modules/@types\"],\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"composite\": false,\n    \"useDefineForClassFields\": true,\n    \"strict\": false,\n//    \"sourceMap\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": false,\n    \"lib\": [\"ESNext\", \"DOM\"],\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"src/**/*.d.ts\",\n    \"src/**/*.json\"\n  ],\n  \"exclude\": [\n    \"*.js\",\n    \"*.ts\",\n    \"dist\",\n    \"node_modules\",\n    \"test\"\n  ],\n}\n"
  },
  {
    "path": "packages/ui/.dockerignore",
    "content": "logs/\nnpm-debug.log\nyarn-error.log\nnode_modules/\npackage-lock.json\nyarn.lock\ncoverage/\n!dist/\n.idea/\nrun/\n.DS_Store\n*.sw*\n*.un~\n.tsbuildinfo\n.tsbuildinfo.*\n/data/db.sqlite\n*/node_modules\ncertd-server/tools/windows/\n\n"
  },
  {
    "path": "packages/ui/Dockerfile",
    "content": "FROM node:22-alpine AS builder\nWORKDIR /workspace/\nCOPY . /workspace/\n# armv7 目前只能用node18， pnpm9不支持node18,所以pnpm只能用8.15.7版本\n# https://github.com/nodejs/docker-node/issues/1946\nRUN npm install -g pnpm\n\n#RUN cd /workspace/certd-client && pnpm install && npm run build\nRUN cp /workspace/certd-client/dist/* /workspace/certd-server/public/ -rf\nRUN cd /workspace/certd-server && pnpm install && npm run build-on-docker\n\n\nFROM node:22-alpine\nEXPOSE 7001\nEXPOSE 7002\nRUN apk add --no-cache openssl\nRUN apk add --no-cache openjdk8\nWORKDIR /app/\nCOPY --from=builder /workspace/certd-server/ /app/\n\nENV LEGO_VERSION=4.22.2\nENV LEGO_DOWNLOAD_DIR=/app/tools/lego\nRUN mkdir -p $LEGO_DOWNLOAD_DIR\n\n# 根据架构下载不同的文件\nRUN ARCH=$(uname -m) && \\\n    if [ \"$ARCH\" = \"x86_64\" ]; then \\\n        wget -O $LEGO_DOWNLOAD_DIR/lego_v${LEGO_VERSION}_linux_amd64.tar.gz https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_linux_amd64.tar.gz; \\\n    elif [ \"$ARCH\" = \"aarch64\" ]; then \\\n        wget -O $LEGO_DOWNLOAD_DIR/lego_v${LEGO_VERSION}_linux_arm64.tar.gz https://github.com/go-acme/lego/releases/download/v${LEGO_VERSION}/lego_v${LEGO_VERSION}_linux_arm64.tar.gz; \\\n    else \\\n        echo \"Unsupported architecture: $ARCH\"; \\\n    fi\n\nENV TZ=Asia/Shanghai\nENV NODE_ENV=production\nENV MIDWAY_SERVER_ENV=production\nCMD [\"npm\", \"run\",\"start\"]\n\n\n\n\n"
  },
  {
    "path": "packages/ui/agent/Dockerfile",
    "content": "FROM greper/certd:latest\nENV certd_agent_enabled=true\nCMD [\"npm\", \"run\",\"start\"]\n\n\n\n\n"
  },
  {
    "path": "packages/ui/certd-client/.browserslistrc",
    "content": "> 1%\nlast 2 versions\nnot dead\n"
  },
  {
    "path": "packages/ui/certd-client/.eslintignore",
    "content": "node_modules\n.idea\n"
  },
  {
    "path": "packages/ui/certd-client/.eslintrc.js",
    "content": "module.exports = {\n  root: true,\n  env: {\n    browser: true,\n    node: true,\n    es6: true,\n  },\n  parser: 'vue-eslint-parser',\n  parserOptions: {\n    parser: '@typescript-eslint/parser',\n    ecmaVersion: 2020,\n    sourceType: 'module',\n    jsxPragma: 'React',\n    ecmaFeatures: {\n      jsx: true,\n      tsx: true,\n    },\n  },\n  extends: ['plugin:vue/vue3-recommended', 'plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended', 'prettier'],\n  rules: {\n    //\"max-len\": [0, 200, 2, { ignoreUrls: true }],\n    '@typescript-eslint/no-unused-vars': 'off',\n    'no-unused-vars': 'off',\n    '@typescript-eslint/ban-ts-ignore': 'off',\n    '@typescript-eslint/ban-ts-comment': 'off',\n    '@typescript-eslint/ban-types': 'off',\n    '@typescript-eslint/explicit-function-return-type': 'off',\n    '@typescript-eslint/no-explicit-any': 'off',\n    '@typescript-eslint/no-var-requires': 'off',\n    '@typescript-eslint/no-empty-function': 'off',\n    '@typescript-eslint/no-use-before-define': 'off',\n    '@typescript-eslint/no-non-null-assertion': 'off',\n    '@typescript-eslint/explicit-module-boundary-types': 'off',\n    // \"@typescript-eslint/no-unused-vars\": [\n    //   \"error\",\n    //   {\n    //     argsIgnorePattern: \"^h$\",\n    //     varsIgnorePattern: \"^h$\",\n    //   },\n    // ],\n    // \"no-unused-vars\": [\n    //   \"error\",\n    //   {\n    //     argsIgnorePattern: \"^h$\",\n    //     varsIgnorePattern: \"^h$\",\n    //   },\n    // ],\n    // \"vue/custom-event-name-casing\": \"off\",\n    // \"no-use-before-define\": \"off\",\n    // \"space-before-function-paren\": \"off\",\n\n    // \"vue/attributes-order\": \"off\",\n    // \"vue/one-component-per-file\": \"off\",\n    // \"vue/html-closing-bracket-newline\": \"off\",\n    // \"vue/max-attributes-per-line\": \"off\",\n    // \"vue/multiline-html-element-content-newline\": \"off\",\n    // \"vue/singleline-html-element-content-newline\": \"off\",\n    // \"vue/attribute-hyphenation\": \"off\",\n    // \"vue/require-default-prop\": \"off\",\n    // \"vue/html-self-closing\": [\n    //   \"error\",\n    //   {\n    //     html: {\n    //       void: \"always\",\n    //       normal: \"never\",\n    //       component: \"always\",\n    //     },\n    //     svg: \"always\",\n    //     math: \"always\",\n    //   },\n    // ],\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/.github/ISSUE_TEMPLATE.md",
    "content": "> 感谢您支持fast-crud，请按如下规范提交issue    \n> 如果有条件，请尽量在[github上提交](https://github.com/fast-crud/fast-crud/issues)\n\n\n## 一、问题描述\n`请在此处简要描述你所遇到的问题，必要时请贴出相关截图辅助理解和定位`\n\n### 复现步骤\n`请描述复现问题的详细步骤`\n`如果非示例页面的问题，最好能提供最小复现示例的代码、或者仓库链接`\n\n### 代码截图\n`请贴出出错的相关代码截图`\n\n### 报错截图\n`请贴出报错日志截图`\n\n### 效果截图\n`请贴出效果截图`\n#### 1. 期望效果\n\n#### 2. 实际效果\n\n\n## 二、当前使用的库版本\n### 1. fast-crud版本：\n`请您填写fast-crud的版本`\n### 2. 使用的ui库以及版本\n`中括号中输入x即选中，或者删除其他，仅保留你正使用的ui库`\n- [x] Antdv (版本？)\n- [ ] ElementPlus（版本？）\n- [ ] NaiveUI（版本？）\n\n### 3. 使用的admin框架\n`请您填写您当前使用的admin框架是哪一套`\n- [x] fs-admin-antdv\n- [ ] fs-admin-element\n- [ ] fs-admin-naive\n- [ ] fs-in-vben\n- [ ] vben-admin\n- [ ] cool-admin\n- [ ] 其他：`请注明`"
  },
  {
    "path": "packages/ui/certd-client/.github/workflows/sync-to-gitee.yml",
    "content": "name: sync-to-gitee\non:\n  push:\n    branches: [ \"main\" ]\n  pull_request:\n    branches: [ \"main\" ]\n#  schedule:\n#    - # 国际时间 19:17 执行，北京时间3:17  ↙↙↙ 改成你想要每天自动执行的时间\n#    - cron: '17 19 * * *'\npermissions:\n  contents: read\n\njobs:\n  sync:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout work repo            # 1. 检出当前仓库(certd-sync-work)\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n      - name: Set git user                  # 2. 给git命令设置用户名和邮箱,↙↙↙ 改成你的name和email\n        run: |\n          git config --global user.name \"xiaojunnuo\"\n          git config --global user.email \"xiaojunnuo@qq.com\"\n\n      - name: Set git token                 # 3. 给git命令设置token，用于push到目标仓库\n        uses: de-vri-es/setup-git-credentials@v2\n        with:\n          credentials: https://${{secrets.PUSH_TOKEN_GITEE}}@gitee.com\n\n      - name: push to gitee               # 4. 执行同步\n        run: |\n          git remote add upstream https://gitee.com/fast-crud/fs-admin-antdv4\n          git push --set-upstream upstream main\n\n\n\n"
  },
  {
    "path": "packages/ui/certd-client/.gitignore",
    "content": "node_modules\n.DS_Store\ndist\ndist-ssr\n*.local\n/stats.html\nyarn.lock\n.idea\n/.idea/\nyarn-error.log\nvite-profile.cpuprofile\n"
  },
  {
    "path": "packages/ui/certd-client/.npmignore",
    "content": "node_modules\n/stats.html\n"
  },
  {
    "path": "packages/ui/certd-client/.npmrc",
    "content": "link-workspace-packages=deep\nprefer-workspace-packages=true\n"
  },
  {
    "path": "packages/ui/certd-client/.prettierrc",
    "content": "{\n  \"printWidth\": 220,\n  \"bracketSpacing\": true,\n  \"singleQuote\": false,\n  \"trailingComma\": \"es5\",\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "packages/ui/certd-client/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n### Performance Improvements\n\n* 优化子域名托管的说明 ([b15f514](https://github.com/certd/certd/commit/b15f514018b728acb0922ee3f93c1f302eb5d471))\n* 账号即将过期通知 ([e403450](https://github.com/certd/certd/commit/e40345095f31e2fb8e2333a6647466659133fa0c))\n* 子域名托管重复域名不允许添加 ([ffc0c7b](https://github.com/certd/certd/commit/ffc0c7bb7b16d9904fd2d905d1c4e1d4854e92a9))\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n### Bug Fixes\n\n* 修复流水线页面状态没有刷新的bug ([93e9498](https://github.com/certd/certd/commit/93e9498b410353f504e11e264db62468895d7290))\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n### Bug Fixes\n\n* 修复某些页面翻译不全显示错误的bug ([0b3158f](https://github.com/certd/certd/commit/0b3158fdd5fe5bb0a98c4e65715dbc3de2c38047))\n* 修复运行流水线后会闪烁一下的bug ([dfc9362](https://github.com/certd/certd/commit/dfc9362084082ee535b898f23b2609c1d946a6fd))\n\n### Performance Improvements\n\n* 通知和定时器的删除按钮显示为红色更显眼 ([61ba83c](https://github.com/certd/certd/commit/61ba83c77546c3d505d081e19a3d68c127662bf1))\n* 优化流水线列表页面、详情页面性能，精简返回数据 ([609ac9c](https://github.com/certd/certd/commit/609ac9c9a2dde605eb09834ae59693c1cb238765))\n* OpenAPI支持autoApply参数 ([42f4d14](https://github.com/certd/certd/commit/42f4d1477dc791520a874aed56035abcbc8c433b))\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n### Bug Fixes\n\n* 修复查看证书对话框翻译错误的bug ([8626b6d](https://github.com/certd/certd/commit/8626b6d9f235c511766f2ae98e0a37f6cebb621c))\n* 修复translation后分组编辑打不开的bug ([46a1b74](https://github.com/certd/certd/commit/46a1b7479923d2feb2dece202a5932b99981b2cd))\n\n### Performance Improvements\n\n* 优化证书进度条颜色 ([2af91db](https://github.com/certd/certd/commit/2af91dbf2ae36a4ed17c6788bc2a2a79a3bb29f8))\n* output-selector from参数支持更丰富的过滤规则 ([87853a2](https://github.com/certd/certd/commit/87853a201535f3bfe8505c40f8f5229d82ffcc73))\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n### Bug Fixes\n\n* 修复开放接口添加按钮文本显示问题 ([f93ba99](https://github.com/certd/certd/commit/f93ba9970c12680f38eba2a7abd4b72cf3f5b6a6))\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n### Bug Fixes\n\n* 修复notification编辑按钮无法打开对话框的bug ([0cea26c](https://github.com/certd/certd/commit/0cea26c6287f52adf273b4a525c37bea8555c68c))\n\n### Performance Improvements\n\n* 证书检查支持自定义dns服务器 ([c53bb7c](https://github.com/certd/certd/commit/c53bb7cf677faa32729709ae0c10359db5194d7a))\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n### Bug Fixes\n\n* 修复通知和触发器无法编辑的bug ([a2e0951](https://github.com/certd/certd/commit/a2e09510426680eb425c0d7ad337f39d3f052054))\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n### Features\n\n* 支持模版创建流水线 ([2559f0e](https://github.com/certd/certd/commit/2559f0e822db095d1d26a7f1d517622dce22a5c2))\n\n### Performance Improvements\n\n* 阿里云waf cname站点选择支持翻页及域名查询 ([4cf9858](https://github.com/certd/certd/commit/4cf98584dacc5999752732f136246647a2f1f07d))\n* 模版导入流水线 ([dcc8c56](https://github.com/certd/certd/commit/dcc8c569693432579709ce63656665a76bcf9a44))\n* 添加用户资料编辑功能 ([7c0f43c](https://github.com/certd/certd/commit/7c0f43c8a3052f73afee3e93c9fcbc43c44ab690))\n* 优化阿里云waf的日志信息 ([821c6d8](https://github.com/certd/certd/commit/821c6d807d4b3cc5092d09a6282b8cbafb9e7c9f))\n* 优化中英文翻译与切换 ([acaa8b1](https://github.com/certd/certd/commit/acaa8b173183b4423584ee070e6e332e0ac0eb2d))\n* 站点IP监控前先同步一下IP ([a080b60](https://github.com/certd/certd/commit/a080b606ab6e289d96b17ef7d2879b4603f889ba))\n* 支持选择运行策略设置 ([60f055f](https://github.com/certd/certd/commit/60f055f293ce237c21cd9050333dad9609eceac1))\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n### Bug Fixes\n\n* 修复邮箱包含.号校验失败的bug ([65dcae7](https://github.com/certd/certd/commit/65dcae79f8faa7a6cb425e10a0fdb6758b0719f3))\n\n### Performance Improvements\n\n* 首次打开任务日志查看页面，自动滚动到底部 ([43fee42](https://github.com/certd/certd/commit/43fee42198e8697185b427b1fa3eb79409603393))\n* 支持批量修改通知和定时 ([e11b3be](https://github.com/certd/certd/commit/e11b3becfd4abe6547e84d09adc38ebd6e1c4b87))\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n### Bug Fixes\n\n* 修复重试次数设置无效的bug ([e2099ac](https://github.com/certd/certd/commit/e2099ac9ca344bc70bfa4219002e9138708973ae))\n\n### Performance Improvements\n\n* 授权列表类型颜色优化 ([1e86338](https://github.com/certd/certd/commit/1e863382d3d1a8cc95a1abf51e75bf6eaea3244f))\n* 支持雨云dns解析以及雨云证书更新 ([43c7a19](https://github.com/certd/certd/commit/43c7a1984926f5d4647760cc134bb0aede3a7b7a))\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n### Performance Improvements\n\n* 子域名托管帮助链接优化为打开新窗口 ([7c0cdd1](https://github.com/certd/certd/commit/7c0cdd169e2f943e703e433677f2f437d4aa02ee))\n* history增加触发类型显示 ([7f6070c](https://github.com/certd/certd/commit/7f6070c960ed7bf02add5ab36436de6573f2f1fa))\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n### Performance Improvements\n\n* 优化流水线页面，增加下次执行时间、查看证书显示 ([c820315](https://github.com/certd/certd/commit/c8203154094fae3d17198747f49f5f41ddf29a4e))\n* 站点证书监控支持定时设置，重试次数设置 ([d3c2f8e](https://github.com/certd/certd/commit/d3c2f8eb436e670772d14a54acd6b541c5aa3978))\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n### Bug Fixes\n\n* 修复中文域名使用cname方式校验无法通过的问题 ([f7d5baa](https://github.com/certd/certd/commit/f7d5baa6d04cb83c572b06e62f885890cfa0143a))\n* 修复flexcdn部署证书的顶级CA名称显示 ([6467edb](https://github.com/certd/certd/commit/6467edb84324d7c80a85212675dbacedc459df83))\n\n### Performance Improvements\n\n* 分组选择支持清空选项 ([03e2e99](https://github.com/certd/certd/commit/03e2e9949837b34eb3ea56d14a9e8a5dabc96063))\n* 优化cname检查，当有冲突的cname记录时，给出提示 ([e639a8f](https://github.com/certd/certd/commit/e639a8f9f12640ffcca69f1a6a0324459924afbd))\n* 增加下载日志按钮 ([6ff509d](https://github.com/certd/certd/commit/6ff509d263c0182645b4692c10b5fedb192db964))\n* 站点监控支持批量导入域名和ip ([2d7729d](https://github.com/certd/certd/commit/2d7729dbe98f29088f5f317db2b52cc1ede223a6))\n* 支持设置用户有效期 ([6ac3bc5](https://github.com/certd/certd/commit/6ac3bc564f407dad2cd0b0b0744e887387aa5da3))\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n### Performance Improvements\n\n* 优化流水线名称过长时的显示 ([6a0cc1b](https://github.com/certd/certd/commit/6a0cc1b1f3ad508f9e4093b3b682b163f12389eb))\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n### Performance Improvements\n\n* 邮箱支持保存和选择 ([f7b0b44](https://github.com/certd/certd/commit/f7b0b44ef6044bec36510a6f0b06d8dca5bfce49))\n* 支持github 新版本检查并发布通知 ([356703c](https://github.com/certd/certd/commit/356703c83ea18c6efb8931402e181280d7b7e696))\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n### Bug Fixes\n\n* 修复证书申请任务无法修改dns提供商类型的bug ([8802274](https://github.com/certd/certd/commit/88022747bebe2054223e0241d68d410771405e68))\n\n### Performance Improvements\n\n* 优化站点选择组件，切换选择时不刷新列表 ([3a14714](https://github.com/certd/certd/commit/3a147141b1a5d67c92a5ce88a5313eaa62859e03))\n* 优化站点ip检查 ([a463711](https://github.com/certd/certd/commit/a463711b03a20120f2a298be15d71ca152d27f21))\n* 站点监控支持监控IP ([9cc4c01](https://github.com/certd/certd/commit/9cc4c017ae646a18284e732769b82636feda01d3))\n* 支持批量重新运行 ([8189982](https://github.com/certd/certd/commit/818998259ddc75e722196ac5c365038818539b9b))\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n### Bug Fixes\n\n* 修复又拍云 CDN 设置证书参数和强制 HTTPS 配置报错的bug ([7984b62](https://github.com/certd/certd/commit/7984b625ba6727132f205db8e25f790bce27b2f7))\n* **cert:** 修正证书过期时间计算逻辑 ([a3086e6](https://github.com/certd/certd/commit/a3086e6a5bec8b07f5e1d21a2ca8bd969c75bd5c))\n\n### Performance Improvements\n\n* 二次认证页面中，添加动态验证码输入框的焦点控制，提升用户体验 ([bb22f06](https://github.com/certd/certd/commit/bb22f062ed4ab4b5b71938270fe4cc666af6b8e7))\n* 站点证书监控增加通知设置 ([3422a1a](https://github.com/certd/certd/commit/3422a1a59fd0d2c0f17fa9c7e8988ac527ecfdd9))\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n### Performance Improvements\n\n* aaWaf、cdnfly站点选择支持查询 ([8af3463](https://github.com/certd/certd/commit/8af3463668a40b9b99febb02e3b4e0d9d8d719b4))\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n### Bug Fixes\n\n* 修复插件导入的bug ([677fec0](https://github.com/certd/certd/commit/677fec0a0b6fceb4966705e471bbfeeda91610c7))\n* 修复自建插件保存丢失部署策略的bug ([863e74d](https://github.com/certd/certd/commit/863e74dd2e3912f950ff5025b5ed0070aeb37035))\n\n### Performance Improvements\n\n* 调整小助手，仅在登录之后显示 ([aebb07c](https://github.com/certd/certd/commit/aebb07c5cc8b1f233b9d203ff017ac60e6971a85))\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n### Performance Improvements\n\n* 小助手可以关闭 ([3e2101a](https://github.com/certd/certd/commit/3e2101aa5b56548614102e900d59819ce8c7e97c))\n* 支持AI分析报错 ([aa96859](https://github.com/certd/certd/commit/aa96859798166426e485947a6590464de189de05))\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n### Bug Fixes\n\n* 修复刷新流水线页面后，日志不自动更新的bug ([0b2e28b](https://github.com/certd/certd/commit/0b2e28b62dd5eb6804c602083e65c87a9d1d72d2))\n\n### Performance Improvements\n\n* 集成智能问答机器人 ([9dd4905](https://github.com/certd/certd/commit/9dd49054d18ec436a5029444ca55a38adc682933))\n* 支持设置网安备案号 ([d18e431](https://github.com/certd/certd/commit/d18e431e2f08e6b37704032c4ea6fbdd8e971442))\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n### Bug Fixes\n\n* 根据SOA记录判断子域名托管有缺陷，改回手动配置子域名托管记录的方式 ([1b280a2](https://github.com/certd/certd/commit/1b280a2940f9e2d919b0bf23b89cc185be1fa498))\n* 修复宝塔授权测试按钮显示错误的bug ([048696e](https://github.com/certd/certd/commit/048696ee9386491bb68592fb3a47d1c900bb68bf))\n\n### Performance Improvements\n\n* 支持部署证书到火山dcdn ([5f85219](https://github.com/certd/certd/commit/5f852194953dc1b4e6336770f417507b8f5a33ad))\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n### Bug Fixes\n\n* 修复二次认证登录进入错误账号的bug ([e3930e0](https://github.com/certd/certd/commit/e3930e07172dd7903cb0f6ff26e0e3e828ba3e77))\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n### Bug Fixes\n\n* 服务器时间获取不准确的bug ([5d10cbf](https://github.com/certd/certd/commit/5d10cbf18daf94a90a7551641a3b13e3c5fec611))\n* 修复复制流水线无效的bug ([3df20a9](https://github.com/certd/certd/commit/3df20a924f32970b052e2588ea20de095f0ea693))\n* 修复token过期后，疯狂打印token过期信息的bug ([50a5fa1](https://github.com/certd/certd/commit/50a5fa15bb240a125bbc91d2ce1ff3c835888a77))\n\n### Performance Improvements\n\n* 数据库备份支持oss ([308d460](https://github.com/certd/certd/commit/308d4600efe2002f199c33b4594d3071784e58ea))\n* 支持反向代理增加contextPath路径 ([0088929](https://github.com/certd/certd/commit/0088929622160cc922995de9a563e8061686ff34))\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n### Performance Improvements\n\n* 优化首页插件列表展示 ([9b8f60b](https://github.com/certd/certd/commit/9b8f60b64b5f9a3db7dfa9b3dcbd9201984358d0))\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n### Bug Fixes\n\n* 上传商用证书，直接粘贴文本报错的问题；修复无法上传ec加密证书的bug ([5750bb7](https://github.com/certd/certd/commit/5750bb706779da274d8e7a87e71416cb64d2df79))\n* 修复下载证书时提示token已过期的问题 ([0e07ae6](https://github.com/certd/certd/commit/0e07ae6ce84dcb9279d3c44060d621566afa593c))\n\n### Performance Improvements\n\n* 更新license时同时绑定url ([78367af](https://github.com/certd/certd/commit/78367af8307f801e778c76d49f0918c21ffe032f))\n* 切换到不同的分组后再打开创建对话框，会自动选择分组 ([893dcd4](https://github.com/certd/certd/commit/893dcd4f2487891199ed3e5a3d47a79a75efc942))\n* 优化/api缓存为0 ([dc05cd4](https://github.com/certd/certd/commit/dc05cd481f186b13375192be965000e6b4b429a5))\n* 优化证书流水线创建，支持选择分组 ([d613aa8](https://github.com/certd/certd/commit/d613aa8f3e85d8dc475ef1b62d49394ce7fd7d24))\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n### Performance Improvements\n\n* 登录支持双重认证 ([48aef25](https://github.com/certd/certd/commit/48aef25b3f6499d674ca4e4ef16f4c62399fb735))\n* 多重认证登录 ([0f82cf4](https://github.com/certd/certd/commit/0f82cf409bc60706ab07e4ca4f272b9a1ca7eecb))\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n### Performance Improvements\n\n* 插件支持导入导出 ([cf8abb4](https://github.com/certd/certd/commit/cf8abb45282070c8ba91469f93fd379fabf1f74a))\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n### Performance Improvements\n\n* 修复内置插件分页查询逻辑 ([a2710dd](https://github.com/certd/certd/commit/a2710ddc2525e4e637fd157f0180e6d3b801c8be))\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n### Performance Improvements\n\n* 镜像支持armv7 ([f78cbed](https://github.com/certd/certd/commit/f78cbed4d817859721fdafe7d348864848d0dfbf))\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n### Performance Improvements\n\n* 修复tab页缓存问题 ([64e5449](https://github.com/certd/certd/commit/64e5449ab3c6b219b0e89eddad14bfb6b71a0650))\n* 隐藏运行策略选项 ([2951df0](https://github.com/certd/certd/commit/2951df0cd94c23e2efee84ff1b843055aac56cae))\n* 增加手动上传证书功能说明 ([5d083a1](https://github.com/certd/certd/commit/5d083a153637caddbc6f44e915d9fb2d1ae87b33))\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n### Performance Improvements\n\n* 优化华为dns解析记录创建和删除问题 ([0948c5b](https://github.com/certd/certd/commit/0948c5bc691d2ee6eb47c72a85da1b7453361878))\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.31.10](https://github.com/certd/certd/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n### Performance Improvements\n\n*  tab增加图标显示 ([a03ae5a](https://github.com/certd/certd/commit/a03ae5a216a1df2c1d3da12ae18dcd0f089a92d3))\n\n## [1.31.9](https://github.com/certd/certd/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n### Bug Fixes\n\n* 修复网站证书监控https port设置无效的bug ([cc8da0c](https://github.com/certd/certd/commit/cc8da0cf130f0c469371b59ac5bd04567f4a4414))\n\n### Performance Improvements\n\n* dns支持火山引擎 ([99ff879](https://github.com/certd/certd/commit/99ff879d93658c29ea493a4bde7e9e3f85996d64))\n\n## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n### Bug Fixes\n\n* 修复网站监控无法设置端口的bug ([27a8a57](https://github.com/certd/certd/commit/27a8a57cf52b4bf83d628aa3049be1efaa74f29c))\n* 修复lego模式无法创建流水线的bug ([687bb8a](https://github.com/certd/certd/commit/687bb8a2376d0de7b72739a174e4a9560581f866))\n\n### Performance Improvements\n\n* 优化通知格式 ([c3c5006](https://github.com/certd/certd/commit/c3c5006daa39c20624cb58864f2b92b230a38a7a))\n* 支持又拍云cdn ([fd0536b](https://github.com/certd/certd/commit/fd0536bd4b41f15b6b5d42e0b447f0dcbf73b8a8))\n\n## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n### Performance Improvements\n\n* 增加服务器时间警告 ([d66ade4](https://github.com/certd/certd/commit/d66ade4e4783850b6c7625c6f164a5a0fc0aa509))\n* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))\n\n## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n### Performance Improvements\n\n* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))\n\n## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n### Bug Fixes\n\n* 修复通知选择器无法选择的bug ([f7b88f9](https://github.com/certd/certd/commit/f7b88f9e3b7d9d9122e4fd2003a20c555bd50c7d))\n* 修复证书流水线创建失败的bug ([736fe03](https://github.com/certd/certd/commit/736fe038ebda56648bcc4c12884a700341d2c049))\n\n## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n### Bug Fixes\n\n* 修复站点监控通知通过webhook发送失败的bug ([9be1ecc](https://github.com/certd/certd/commit/9be1ecc8aab3ea23dd0dc2dab3688f4edb90ef2c))\n\n### Performance Improvements\n\n* 宝塔支持doker站点证书部署 ([589a373](https://github.com/certd/certd/commit/589a373142ef7f50d64d3aa767a90b1f4b64da93))\n* 保存调整后的列宽 ([873f2b6](https://github.com/certd/certd/commit/873f2b618b9d7320045baf69d6da83afe48a780f))\n* 创建证书流水线时，支持更多参数展开 ([36aa7f8](https://github.com/certd/certd/commit/36aa7f82b078a053a102331b3c6f132fb9d492f9))\n* 流水线页面可以鼠标按住左右拖动 ([d85a02f](https://github.com/certd/certd/commit/d85a02feeb3183c5abd6c1ea790d5923a32d7271))\n* 流水线增加上传证书快捷方式 ([425bba6](https://github.com/certd/certd/commit/425bba67c539b734e2a85a83a4f9ecc9b2434fb4))\n* 手动上传证书部署流水线 ([fbb66f3](https://github.com/certd/certd/commit/fbb66f3c4389489aa8a43b194d82bc8cf391607b))\n* 优化选择任务时手机版展示效果 ([d01004d](https://github.com/certd/certd/commit/d01004d53071a75ac91ee21cc96bde9369f77ff3))\n* 站点证书监控支持模糊查询 ([0069c0e](https://github.com/certd/certd/commit/0069c0e3992946a8dd6410f299d4fc974ef0e76b))\n* 支持飞书通知 ([b82e1dc](https://github.com/certd/certd/commit/b82e1dcd6217b09a7d7e21cd648bb31de320cadf))\n* 支持手动上传证书并部署 ([a9fffa5](https://github.com/certd/certd/commit/a9fffa5180c83da27b35886aa2e858a92a2c5f94))\n\n## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n### Performance Improvements\n\n* 套餐支持3天7天等选项 ([0d71a8e](https://github.com/certd/certd/commit/0d71a8ee501a0e5bb69decf07e8729026e9d85bf))\n* 证书仓库增加有效期显示 ([be87124](https://github.com/certd/certd/commit/be87124ada7a093f281ca29a45c86b4ea4644ead))\n* 支持部署到天翼云CDN ([82a72e0](https://github.com/certd/certd/commit/82a72e0b497efa043d342ad0e33c083a2de79a05))\n\n## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n### Performance Improvements\n\n* 一些手机端适配优化 ([5b8d5dd](https://github.com/certd/certd/commit/5b8d5dd97536456a9d5d1384216eac1093b2dc3d))\n\n# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n### Performance Improvements\n\n* 历史记录查看详情，可以切换到对应的历史记录日志上去 ([082802e](https://github.com/certd/certd/commit/082802e1197156837800f814728ee0f6b300b18c))\n* 是否允许爬虫爬取增加ui设置选项 ([779db9d](https://github.com/certd/certd/commit/779db9da705d2dfef36fec21f52bd38af9fc5f2e))\n* 易支付支持固定支付方式，适合没有收银台版本使用 ([81df96b](https://github.com/certd/certd/commit/81df96bf4542ce8d8ef4a428a4460dd554e4719a))\n* 支持易盾RCDN部署 ([065713c](https://github.com/certd/certd/commit/065713cdb6953d16df08585c316c1a7a8eaec437))\n\n## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n### Bug Fixes\n\n* 当前置任务被删除时进行校验 ([c89686a](https://github.com/certd/certd/commit/c89686a2fda251484930f0ae715417b618c21690))\n\n### Performance Improvements\n\n* 上传自定义证书 ([75a38d9](https://github.com/certd/certd/commit/75a38d95f305b4271d9106babe7cffc1c89ae8f3))\n\n## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n### Performance Improvements\n\n* 创建流水线时，默认成功时也发送通知 ([52ae690](https://github.com/certd/certd/commit/52ae6902d203ca56e0312692b50c55cb6ddd3e39))\n* http方式校验，选择sftp时，支持修改文件访问权限比如777 ([15d6eaf](https://github.com/certd/certd/commit/15d6eaf5532ed25acd4f8d58c429353a2f44206c))\n\n# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n### Bug Fixes\n\n* 修复查看任务日志偶发性无法自动滚动底部的bug ([7e482f7](https://github.com/certd/certd/commit/7e482f798c0142bce1866f84676cb40210f9638a))\n\n### Performance Improvements\n\n* 证书仓库 ([91e7f45](https://github.com/certd/certd/commit/91e7f45a1c5ea1e0ec0aa3236b80028f03a6d0aa))\n\n## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n### Bug Fixes\n\n* 修复授权管理，点击了查看原文按钮后，无法修改值的bug ([85c99f7](https://github.com/certd/certd/commit/85c99f7f80761ac6efaf3255c03b933442db1686))\n\n## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n### Bug Fixes\n\n* 修复站点监控域名校验无法通过的bug ([1cb4a53](https://github.com/certd/certd/commit/1cb4a539cc523721ffd4b22d40d0e3d2d68cd915))\n\n## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n### Performance Improvements\n\n* 优化站点证书检查页面，检查增加3次重试 ([e6dd7cd](https://github.com/certd/certd/commit/e6dd7cd54a3e23897031b5df6e0c3cdc0545d35a))\n* 支持http校验方式申请证书 ([405591c](https://github.com/certd/certd/commit/405591c5d08fa1a3b228ee3980199e7731cfec4a))\n* http校验方式，支持七牛云oss、阿里云oss、腾讯云cos ([3f74d4d](https://github.com/certd/certd/commit/3f74d4d9e5f5d0e629b44cff1895b3f7a8fbcafc))\n\n## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n### Bug Fixes\n\n* 免费套餐支持购买 ([f5ec987](https://github.com/certd/certd/commit/f5ec9870fd6af1f0c9099852bbdb4d07813ccce8))\n* 修复某处金额转换丢失精度的bug ([d2d6f12](https://github.com/certd/certd/commit/d2d6f12218cbe7bd55f4ae082b93084be85f0a7b))\n* 修复新版本小红点显示错误问题 ([fe4786e](https://github.com/certd/certd/commit/fe4786e168afe03a5243dd67971476c348339809))\n\n### Performance Improvements\n\n* 用户创建证书流水线没有购买套餐或者超限时提前报错 ([472f06c](https://github.com/certd/certd/commit/472f06c2d190d0ae48e8b53c18bc278437656a1c))\n* 优化插件名称显示 ([26adf7d](https://github.com/certd/certd/commit/26adf7d437e674385f26a8f92fded6521a620671))\n\n# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n### Bug Fixes\n\n* 修复手机模式下，查询框被文字遮盖的bug ([040788c](https://github.com/certd/certd/commit/040788c793642c3bb2a3ede87fe30fcf3be471bd))\n* 修复左侧菜单收起时无法展开子菜单的bug ([0056223](https://github.com/certd/certd/commit/005622307e612717a5408aa1484717ef03003a22))\n\n### Features\n\n* 基础版不再限制流水线数量 ([cb27d4b](https://github.com/certd/certd/commit/cb27d4b4906b2782eaceb0a95bbdc5d0534370d2))\n* 套餐购买支持易支付、支付宝支付 ([faa28f8](https://github.com/certd/certd/commit/faa28f88f954cba4c1dd29125562e5acd2fd99af))\n* 用户套餐，用户支付功能 ([a019956](https://github.com/certd/certd/commit/a019956698acaf2c4beb620b5ad8c18918ead6a1))\n* 支持微信支付 ([45d6347](https://github.com/certd/certd/commit/45d6347f5b6199493b11aabdd74177f6dca2cea4))\n\n### Performance Improvements\n\n* 调整创建证书表单字段的顺序 ([d393521](https://github.com/certd/certd/commit/d3935219f2aa50d6662c5b5ebf7ee25ad696ab2b))\n* 同一时间只允许一个套餐生效 ([8ebf95a](https://github.com/certd/certd/commit/8ebf95a222a900d1707716c7b1f3b39f8a6d8f94))\n* 用户名支持修改 ([89c7f07](https://github.com/certd/certd/commit/89c7f070343e86453c84677ebe1669f9b266d871))\n* 优化证书申请跳过的状态显示，成功通知现在在跳过时不会发送 ([67d762b](https://github.com/certd/certd/commit/67d762b6a520f1fa24719a124e5ae975a81f5f82))\n* 站点证书监控通知发送，每天定时检查 ([bb4910f](https://github.com/certd/certd/commit/bb4910f4e57234e42b44505f4620ae7af66025c5))\n\n## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n### Bug Fixes\n\n* 修复授权被删除后，无法清空的bug ([b45977c](https://github.com/certd/certd/commit/b45977c29a29084c11e496bec3415eaaebafdd74))\n\n### Performance Improvements\n\n* 点击版本红点按钮，跳转到升级帮助页面 ([454fbda](https://github.com/certd/certd/commit/454fbda581bbe22abca5b91e5086ea9d9d58a020))\n* 通知标题优化 ([ff083ce](https://github.com/certd/certd/commit/ff083ce6848a8bee3c8248e4b881086ae1517c28))\n\n## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n### Bug Fixes\n\n* 修复创建流水线通知设置无效的bug ([498cf34](https://github.com/certd/certd/commit/498cf34999fddfa24ce088e2e678469fa669abb8))\n\n## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n### Bug Fixes\n\n* 修复cname排查方法 nslookup命令显示黑色的问题 ([3dfeeec](https://github.com/certd/certd/commit/3dfeeec899d7d0d7292695ce410f78548e076c03))\n\n### Performance Improvements\n\n* 通知选择器优化 ([2c0cbdd](https://github.com/certd/certd/commit/2c0cbdd29ecb74cc939b2ae7ee86b8d40f70ba31))\n* 新增七牛云插件分组 ([49e7dc5](https://github.com/certd/certd/commit/49e7dc56e1a95fbdea3e30cdeb945b48415b69e3))\n* 新增server酱3通知 ([6aa4872](https://github.com/certd/certd/commit/6aa487269c9f6862e188b37a0d6c73f79c937d94))\n* 支持邀请奖励 ([618ec93](https://github.com/certd/certd/commit/618ec937866b24ebcf8164db43acb1ed66a5b329))\n* 支持易发云短信 ([94fa77f](https://github.com/certd/certd/commit/94fa77fcd2b9bea294fb05736c0d8cdc81f56103))\n* favicon支持自定义 ([8b9c47d](https://github.com/certd/certd/commit/8b9c47daf194515006689a212ae9cf586bdf5993))\n\n# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n### Features\n\n* 手机号登录、邮箱验证码注册 ([7b55337](https://github.com/certd/certd/commit/7b55337c5edb470cca7aa62201eda8d274784004))\n\n### Performance Improvements\n\n* 部署到IIS插件 ([1534f45](https://github.com/certd/certd/commit/1534f4523633265d219d7b3a249a9ea1af99c512))\n* 流水线支持批量修改分组，批量删除 ([a847e66](https://github.com/certd/certd/commit/a847e66c4fc843b98f1520b2b8072d3586ce8b81))\n* 首页新增修改密码提示 ([0772d3b](https://github.com/certd/certd/commit/0772d3b3fd24afdde4086d9f09ef19d037b431b4))\n* 选项显示图标 ([aedc462](https://github.com/certd/certd/commit/aedc46213571a3bd93809b7af7fa17a08d546237))\n* 优化证书申请成功通知发送方式 ([8002a56](https://github.com/certd/certd/commit/8002a56efc5998aa03db5711ae87f9eb4bc9e160))\n* 支持短信验证码登录 ([387bcc5](https://github.com/certd/certd/commit/387bcc5fa418cdeea81a06da5e3f8cd6b43cd082))\n* 自定义webhook显示详细的错误信息 ([3254afc](https://github.com/certd/certd/commit/3254afc75640eed3729d0fc02a818fefbe5c7fc3))\n\n## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n### Performance Improvements\n\n* 通知支持自定义webhook、anpush、iyuu、server酱 ([cbccd9e](https://github.com/certd/certd/commit/cbccd9e3d0a4c24aba772af62734666d40b22c57))\n* 通知支持vocechat、bark、telegram、discord、slack ([642f57f](https://github.com/certd/certd/commit/642f57ff6d7152a9e14f59c7fc0e32a6b1751fb7))\n\n## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n### Performance Improvements\n\n* 通知管理 ([d9a00ee](https://github.com/certd/certd/commit/d9a00eeaf72735ced67c59d7983d84e3c730064a))\n* 通知渠道支持测试按钮 ([b54ae27](https://github.com/certd/certd/commit/b54ae272ebc2d31b32b049d44e2299a6be7f153c))\n* 支持企业微信群聊机器人通知 ([b805a29](https://github.com/certd/certd/commit/b805a2925984144a31575b8aaa622f0c30d41b56))\n\n## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n### Performance Improvements\n\n* 当步骤全部都禁用时，任务本身显示删除线 ([9ab9a6e](https://github.com/certd/certd/commit/9ab9a6e8b083e19793894f23e59f29c604ec98e5))\n\n## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n### Bug Fixes\n\n* 修复1Panel面板本身证书更新导致判定执行失败的问题 ([2689e6d](https://github.com/certd/certd/commit/2689e6d6c03aba21da90d5d45232c6ba08696be1))\n* 修复Cname情况下，无法使用DNS类型的bug ([26dad39](https://github.com/certd/certd/commit/26dad399d5768b3205da099ddc11809aef7d6224))\n\n### Performance Improvements\n\n* 日志查看自动滚动到底部 ([4a2f7eb](https://github.com/certd/certd/commit/4a2f7ebf87b7c027cebff7cb763f8f35f6d2aa36))\n* 系统设置中的代理设置优化为可全局生效，环境变量中的https_proxy设置将无效 ([381a37f](https://github.com/certd/certd/commit/381a37fbaa6b61c887eda743897ae00afb825bdf))\n* 新手导航在非编辑模式下不显示 ([18bfcc2](https://github.com/certd/certd/commit/18bfcc24ad0bde57bb04db8a4209861ec6b8ff1d))\n* 专业版试用，无需绑定账号 ([c7c4318](https://github.com/certd/certd/commit/c7c4318c11b65a76089787aa58939832d338a232))\n\n## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n### Performance Improvements\n\n* 公共cname服务支持关闭 ([f4ae512](https://github.com/certd/certd/commit/f4ae5125dc4cd97816976779cb3586b5ee78947e))\n\n## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n### Bug Fixes\n\n* 修复邮件配置，忽略证书校验设置不生效的bug ([66a9690](https://github.com/certd/certd/commit/66a9690dc958732e1b3c672d965db502296446f9))\n\n### Performance Improvements\n\n* 修复站点个性化，浏览器标题没有生效的bug ([bcfac02](https://github.com/certd/certd/commit/bcfac02c96ceaf23d1a0b05b48d8047da933beaf))\n* 优化上传到主机插 路径选择，根据证书格式显示 ([8c3f86c](https://github.com/certd/certd/commit/8c3f86c6909ed91f48bb2880e78834e22f6f6a29))\n* ipv6支持 ([da6ac16](https://github.com/certd/certd/commit/da6ac1626b3574be2fabeeb18a1f10d60bdcbe49))\n\n## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n### Performance Improvements\n\n* 优化流水线页面切换回来不丢失查询条件 ([4dcf6e8](https://github.com/certd/certd/commit/4dcf6e87bc5f7657ce8a56c5331e8723a0fee8ee))\n* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941))\n* 执行历史支持点击查看流水线详情 ([8968639](https://github.com/certd/certd/commit/89686399f90058835435b92872fc236fac990148))\n* 专业版7天试用 ([c58250e](https://github.com/certd/certd/commit/c58250e1f065a9bd8b4e82acc1df754504c0010c))\n\n## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n### Bug Fixes\n\n* 修复头像没有更新的bug ([9b4a31f](https://github.com/certd/certd/commit/9b4a31fa6a32b9cab2e22bd141cf96ca29120445))\n\n### Performance Improvements\n\n* 禁止页面缓存，点击tab页签可以刷新数据 ([7ad4b55](https://github.com/certd/certd/commit/7ad4b55ee000c1dd0747832b11107f32b0ffb889))\n* 优化时间选择器，自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211))\n* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9))\n\n# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n### Bug Fixes\n\n* 修复历史记录不能按名称查询的bug ([6113c38](https://github.com/certd/certd/commit/6113c388b7fc58b11ca19ff05cc1286d096c8d28))\n\n### Features\n\n* 首页全新改版 ([63ec5b5](https://github.com/certd/certd/commit/63ec5b5519c760a3330569c0da6dac157302a330))\n\n### Performance Improvements\n\n* 管理控制台数据统计 ([babd589](https://github.com/certd/certd/commit/babd5897ae013ff7c04ebfcbfac8a00d84dd627c))\n* 增加向导 ([6d9ef26](https://github.com/certd/certd/commit/6d9ef26ecab71d752c2c55d75aed4fb5f6c05a39))\n\n## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n### Bug Fixes\n\n* 顶部菜单变...的bug ([6dabad7](https://github.com/certd/certd/commit/6dabad76baba96be0f8af36a3fbfb9f5182aecf1))\n\n### Performance Improvements\n\n* 默认证书更新时间设置为35天，增加腾讯云删除过期证书插件，可以避免腾讯云过期证书邮件 ([51b6fed](https://github.com/certd/certd/commit/51b6fed468eaa6f28ce4497ce303ace1a52abb96))\n* 授权加密支持解密查看 ([5575c83](https://github.com/certd/certd/commit/5575c839705f6987ad2bdcd33256b0962c6a9c6a))\n* 重置管理员密码同时启用管理员账户，避免之前禁用了，重置密码还是登录不进去 ([f92d918](https://github.com/certd/certd/commit/f92d918a1e28e29b794ad4754661ea760c18af46))\n\n## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n### Bug Fixes\n\n* 修复启动时自签证书无法保存的bug ([526c484](https://github.com/certd/certd/commit/526c48450bcd37b3ccded9b448f17de8140bdc6e))\n\n### Performance Improvements\n\n* 顶部菜单自定义 ([54d136c](https://github.com/certd/certd/commit/54d136cc6ae122f7c891b7a5c7232fe5de8e5cb5))\n* 禁用readonly用户 ([d10d42e](https://github.com/certd/certd/commit/d10d42e20619bb55a50d636b8867ff33db4e3b4b))\n* 限制其他用户流水线数量 ([315e437](https://github.com/certd/certd/commit/315e43746baf01682737f82e41579237a48409af))\n* 用户管理优化头像上传 ([661293c](https://github.com/certd/certd/commit/661293c189a3abf3cdc953b5225192372f57930d))\n\n## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n### Bug Fixes\n\n* 修复对话框全屏按钮与关闭按钮重叠的bug ([95df56c](https://github.com/certd/certd/commit/95df56cc5ca5e3eb843cd17cb7078cde47729f1e))\n\n### Performance Improvements\n\n* 支持同时监听https端口，7002 ([d5a17f9](https://github.com/certd/certd/commit/d5a17f9e6afd63fda2df0981118480f25a1fac2e))\n\n## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n### Performance Improvements\n\n* 部署到阿里云任意云资源，阿里云部署大杀器 ([4075be7](https://github.com/certd/certd/commit/4075be7849b140acb92bd8da8a9acbf4eef85180))\n* 文件名特殊字符限制输入 ([c4164c6](https://github.com/certd/certd/commit/c4164c66e29f3ec799f98108a344806ca61e94ff))\n* 新增部署到百度云CDN插件 ([f126f9f](https://github.com/certd/certd/commit/f126f9f932d37fa01fff1accc7bdd17d349f8db5))\n* 优化cron选择器，增加下次触发时间显示 ([5b148b7](https://github.com/certd/certd/commit/5b148b7ed960ca6f7f5b733b2eadd56eeecbd4c2))\n* 支持配置公共ZeroSSL授权 ([a90d1e6](https://github.com/certd/certd/commit/a90d1e68ee9cbc3705223457b8a86f071b150968))\n\n## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n### Bug Fixes\n\n* 修复移动任务后出现空阶段的bug ([4ea3edd](https://github.com/certd/certd/commit/4ea3edd59e93ca4f5b2e43b20dd4ef33909caddb))\n* 允许七牛云cdn插件输入.号开头的通配符域名 ([18ee87d](https://github.com/certd/certd/commit/18ee87daff6eafc2201b58e28d85aafd3cb7a5b9))\n\n### Performance Improvements\n\n* 优化日志颜色 ([1291e98](https://github.com/certd/certd/commit/1291e98e821c5b1810aab7f0aebe3f5f5cd44a20))\n* 优化证书申请速度和成功率，反代地址优化，google基本可以稳定请求。增加请求重试。 ([41d9c3a](https://github.com/certd/certd/commit/41d9c3ac8398def541e65351cbe920d4a927182d))\n* 优化pfx密码密码输入框，让浏览器不自动填写密码 ([ffeede3](https://github.com/certd/certd/commit/ffeede38afa70c5ff6f2015516bead23d2c4df87))\n\n## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n### Bug Fixes\n\n* 修复cname服务普通用户access访问权限问题 ([c1e3e2e](https://github.com/certd/certd/commit/c1e3e2ee1f923ee5806479dd5f178c3286a01ae0))\n\n## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n### Bug Fixes\n\n* 修复切换普通用户登录时，左侧菜单没有同步更新的bug ([12116a8](https://github.com/certd/certd/commit/12116a89f43cf8b98f16d2ea6073f6b72a643215))\n* 修正邮箱设置跳转路由 ([17d8890](https://github.com/certd/certd/commit/17d88900a1f0e3af609b74597f5b1978230db32d))\n\n### Performance Improvements\n\n* 触发证书重新申请input变化对比规则优化，减少升级版本后触发申请证书的情况 ([c46a2a9](https://github.com/certd/certd/commit/c46a2a9a399c2a9a8bb59a48b9fb6e93227cce9b))\n* 优化菜单 ([1f4f157](https://github.com/certd/certd/commit/1f4f15757de1015cf7563f7022599eef58cc93d7))\n* 增加文档站 https://certd.docmirror.cn ([6e2ac1c](https://github.com/certd/certd/commit/6e2ac1c089f6ddccb396f1f2738509c05333e1bb))\n\n## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n### Performance Improvements\n\n* 密钥备份 ([1c6028a](https://github.com/certd/certd/commit/1c6028abcf8849163462bb2f8441b6838357e09b))\n* 证书直接查看 ([5dde5bd](https://github.com/certd/certd/commit/5dde5bd3f76db3959d411619d29bfb8064e3b307))\n* sqlite数据库备份插件 ([77f1631](https://github.com/certd/certd/commit/77f163144f7dcfb0431475c55508fecfd6d969f8))\n\n## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n### Performance Improvements\n\n* [comm] 支持插件管理 ([e8b617b](https://github.com/certd/certd/commit/e8b617b80ce882dd63006f0cfc719a80a1cc6acc))\n* 新增代理设置功能 ([273ab61](https://github.com/certd/certd/commit/273ab6139f5807f4d7fe865cc353b97f51b9a668))\n* EAB授权支持绑定邮箱，支持公共EAB设置 ([07043af](https://github.com/certd/certd/commit/07043aff0ca7fd29c56dd3c363002cb15d78b464))\n\n## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n### Performance Improvements\n\n* 优化系统设置加载时机 ([7396253](https://github.com/certd/certd/commit/73962536d5a4769902d760d005f3f879465addcc))\n\n## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n### Performance Improvements\n\n* 邮箱设置改为系统设置，普通用户无需配置发件邮箱 ([4244569](https://github.com/certd/certd/commit/42445692117184a3293e63bef84a74cbb5984b0e))\n\n## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package @certd/ui-client\n\n# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n### Bug Fixes\n\n* 修复历史记录根据流水线名称查询报错的bug ([ce9a986](https://github.com/certd/certd/commit/ce9a9862f122fce2186e7727eaa4b251b59e6032))\n\n### Features\n\n* 域名验证方法支持CNAME间接方式，此方式支持所有域名注册商，且无需提供Access授权，但是需要手动添加cname解析 ([f3d3508](https://github.com/certd/certd/commit/f3d35084ed44f9f33845f7045e520be5c27eed93))\n* 站点个性化设置 ([11a9fe9](https://github.com/certd/certd/commit/11a9fe9014d96cba929e5a066e78f2af7ae59d14))\n\n### Performance Improvements\n\n* 并行任务名称改成添加任务，取消并行，可以在同一个阶段获取上一个task的输出 ([c5e5877](https://github.com/certd/certd/commit/c5e58770d1c5edc19c6f9ea1618f44b68e091f35))\n* 调整静态资源到static目录 ([0584b36](https://github.com/certd/certd/commit/0584b3672b40f9042a2ed87e5627022606d046cd))\n* 调整全部静态资源到static目录 ([a218890](https://github.com/certd/certd/commit/a21889080d6c7ffdf0af526a3a21f0b2d1c77288))\n* 检查cname是否正确配置 ([b5d8935](https://github.com/certd/certd/commit/b5d8935159374fbe7fc7d4c48ae0ed9396861bdd))\n* 优化宝塔网站部署插件远程获取数据的提示 ([2a3ca9f](https://github.com/certd/certd/commit/2a3ca9f552d96594ec6690a1c4c91f598451b9a1))\n* 优化缩短首页缓存时间 ([49395e8](https://github.com/certd/certd/commit/49395e8cb65f4b30c0145329ed5de48be4ef3842))\n* 域名输入增加校验提示，避免输入错误的域名 ([0c8e83e](https://github.com/certd/certd/commit/0c8e83e1254a9ce4d5a4e7888eb1710394a4b77c))\n* cname校验配置增加未校验通过提示 ([77cc3c4](https://github.com/certd/certd/commit/77cc3c4a5cbd81f8233a8e0bb33fab0621c0905f))\n* google eab授权支持自动获取，不过要配置代理 ([592791d](https://github.com/certd/certd/commit/592791d1356fc252fbb70d7f168567aee9585507))\n\n## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)\n\n### Bug Fixes\n\n* 修复西部数码账户级别apikey不可用的bug ([f8f3e8b](https://github.com/certd/certd/commit/f8f3e8b43fd5d815887bcb53b95f46dc96424b79))\n\n## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)\n\n### Performance Improvements\n\n* 群晖获取deviceid优化 ([8d42273](https://github.com/certd/certd/commit/8d4227366548eb70f6bc04303829e6933168f906))\n\n## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)\n\n### Performance Improvements\n\n* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))\n* 增加使用教程 ([9d9c021](https://github.com/certd/certd/commit/9d9c0218195af5b9896cce7109b26a433480571d))\n\n## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)\n\n**Note:** Version bump only for package @certd/ui-client\n\n# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)\n\n### Bug Fixes\n\n* 修复首次创建任务运行时不自动设置当前运行情况的bug ([ecd83ee](https://github.com/certd/certd/commit/ecd83ee136abdd3df9ed2f21ec2ff0f24c0ed9d9))\n\n### Features\n\n* 账号绑定 ([e046640](https://github.com/certd/certd/commit/e0466409d0c021bb415abd94df448c8a0d4799e9))\n* 支持中间证书 ([e86756e](https://github.com/certd/certd/commit/e86756e4c65a53dd23106d7ecbfe2fa987cc13f3))\n* 支持vip转移 ([361e8fe](https://github.com/certd/certd/commit/361e8fe7ae5877e23fd5de31bc919bedd09c57f5))\n\n### Performance Improvements\n\n* 群晖支持OTP双重验证登录 ([8b8039f](https://github.com/certd/certd/commit/8b8039f42bbce10a4d0e737cdeeeef9bb17bee5a))\n* 任务支持禁用 ([8ed16b3](https://github.com/certd/certd/commit/8ed16b3ea2dfe847357863a0bfa614e4fa5fc041))\n* 优化收件邮箱输入 ([22ef28f](https://github.com/certd/certd/commit/22ef28f6338a78465bd52ccbad13e66e80263b2f))\n* 支持阿里云ACK证书部署 ([d331fea](https://github.com/certd/certd/commit/d331fea47789122650e057ec7c9e85ee8e66f09b))\n* 支持七牛云 ([8ecc2f9](https://github.com/certd/certd/commit/8ecc2f9446a9ebd11b9bfbffbb6cf7812a043495))\n* plugins增加图标 ([a8da658](https://github.com/certd/certd/commit/a8da658a9723342b4f43a579f7805bfef0648efb))\n\n## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09)\n\n### Performance Improvements\n\n* 插件选择支持搜索 ([d1498a7](https://github.com/certd/certd/commit/d1498a71601b74d38343b1d070eadd03705dd9d5))\n\n## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.24.2](https://github.com/certd/certd/compare/v1.24.1...v1.24.2) (2024-09-06)\n\n### Bug Fixes\n\n* 修复复制流水线出现的各种问题 ([6314e8d](https://github.com/certd/certd/commit/6314e8d7eb58cd52e2a7bd3b5ffb9112b0b69577))\n\n### Performance Improvements\n\n* 阶段、任务、步骤全面支持拖动排序 ([bd73a16](https://github.com/certd/certd/commit/bd73a163cd0497f062bd424ddc6bc9bbc95f81ea))\n* 任务配置不需要的字段可以自动隐藏 ([192d9dc](https://github.com/certd/certd/commit/192d9dc7e36737d684c769f255f407c28b1152ac))\n* 任务支持拖动排序 ([1e9b563](https://github.com/certd/certd/commit/1e9b5638aa36a8ce70019a9c750230ba41938327))\n* client 请求超时时间延长为10s ([ff46771](https://github.com/certd/certd/commit/ff46771d8dd43e71c1ca70e3ba783945750342cc))\n\n## [1.24.1](https://github.com/certd/certd/compare/v1.24.0...v1.24.1) (2024-09-02)\n\n### Bug Fixes\n\n* 激活仅限管理员 ([1c17970](https://github.com/certd/certd/commit/1c17970b981f0987c506744ee6b2283fd5e40493))\n\n### Performance Improvements\n\n* 授权配置支持加密 ([42a56b5](https://github.com/certd/certd/commit/42a56b581d754c3e5f9838179d19ab0d004ef2eb))\n* 支持阿里云 DCDN ([98b77f8](https://github.com/certd/certd/commit/98b77f80843834616fb26f83b4c42245326abd06))\n* 支持已跳过的步骤重新运行 ([ea775ad](https://github.com/certd/certd/commit/ea775adae18d57a04470cfba6b9460d761d74035))\n* 支持cdnfly ([724a850](https://github.com/certd/certd/commit/724a85028b4a7146c9e3b4df4497dcf2a7bf7c67))\n* 支持ftp上传 ([b9bddbf](https://github.com/certd/certd/commit/b9bddbfabb5664365f1232e9432532187c98006c))\n\n# [1.24.0](https://github.com/certd/certd/compare/v1.23.1...v1.24.0) (2024-08-25)\n\n### Bug Fixes\n\n* 部署到腾讯云cdn选择证书任务步骤限制只能选证书 ([3345c14](https://github.com/certd/certd/commit/3345c145b802170f75a098a35d0c4b8312efcd17))\n* 修复执行日志没有清理的bug ([22a3363](https://github.com/certd/certd/commit/22a336370a88a7df2a23c967043bae153da71ed5))\n\n### Features\n\n* 支持ECC类型 ([a7424e0](https://github.com/certd/certd/commit/a7424e02f5c7e02ac1688791040785920ce67473))\n\n### Performance Improvements\n\n* 优化成功后跳过的提示 ([7b451bb](https://github.com/certd/certd/commit/7b451bbf6e6337507f4627b5a845f5bd96ab4f7b))\n* 优化证书申请成功率 ([968c469](https://github.com/certd/certd/commit/968c4690a07f69c08dcb3d3a494da4e319627345))\n* email proxy ([453f1ba](https://github.com/certd/certd/commit/453f1baa0b9eb0f648aa1b71ccf5a95b202ce13f))\n\n## [1.23.1](https://github.com/certd/certd/compare/v1.23.0...v1.23.1) (2024-08-06)\n\n### Performance Improvements\n\n* 优化默认值设置 ([1af19f0](https://github.com/certd/certd/commit/1af19f0ac053fe109782882964533636b5969d6b))\n\n# [1.23.0](https://github.com/certd/certd/compare/v1.22.9...v1.23.0) (2024-08-05)\n\n### Features\n\n* use node 20 ([e8ed972](https://github.com/certd/certd/commit/e8ed97206bf28e83f942db2ef4ea07fa76fd3567))\n\n## [1.22.9](https://github.com/certd/certd/compare/v1.22.8...v1.22.9) (2024-08-05)\n\n### Performance Improvements\n\n* 优化定时任务 ([87e440e](https://github.com/certd/certd/commit/87e440ee2a8b10dc571ce619f28bc83c1e5eb147))\n\n## [1.22.8](https://github.com/certd/certd/compare/v1.22.7...v1.22.8) (2024-08-05)\n\n### Performance Improvements\n\n* 修复删除历史记录没有删除log的bug，新增history管理页面，演示站点启动时不自动启动非管理员用户的定时任务 ([f78ae93](https://github.com/certd/certd/commit/f78ae93eedfe214008c3d071ca3d77c962137a64))\n\n## [1.22.7](https://github.com/certd/certd/compare/v1.22.6...v1.22.7) (2024-08-04)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.22.6](https://github.com/certd/certd/compare/v1.22.5...v1.22.6) (2024-08-03)\n\n### Bug Fixes\n\n* 修复在相同的cron时偶尔无法触发定时任务的bug ([680941a](https://github.com/certd/certd/commit/680941af119619006b592e3ab6fb112cb5556a8b))\n\n### Performance Improvements\n\n* 流水线支持名称模糊查询 ([59897c4](https://github.com/certd/certd/commit/59897c4ceae992ebe2972ca9e8f9196616ffdfd7))\n\n## [1.22.5](https://github.com/certd/certd/compare/v1.22.4...v1.22.5) (2024-07-26)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.22.3](https://github.com/certd/certd/compare/v1.22.2...v1.22.3) (2024-07-25)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.22.2](https://github.com/certd/certd/compare/v1.22.1...v1.22.2) (2024-07-23)\n\n### Bug Fixes\n\n* 修复创建流水线时，无法根据dns类型默认正确的dns授权的bug ([a2c43b5](https://github.com/certd/certd/commit/a2c43b50a6069ed48958fd142844a8568c2af452))\n\n## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20)\n\n### Performance Improvements\n\n* 创建证书任务可以选择lege插件 ([affef13](https://github.com/certd/certd/commit/affef130378030c517250c58a4e787b0fc85d7d1))\n* 创建证书任务增加定时任务和邮件通知输入 ([427620d](https://github.com/certd/certd/commit/427620d34f3b8ad6933005faf1878908441a2453))\n\n# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)\n\n### Features\n\n* 升级midway，支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))\n\n### Performance Improvements\n\n* 优化一些小细节 ([b168852](https://github.com/certd/certd/commit/b1688525dbbbfd67e0ab1cf5b4ddfbe9d394f370))\n* 增加备案号设置 ([bd3d959](https://github.com/certd/certd/commit/bd3d959944db63a5690b55ee150e1007133868b9))\n* 自动生成jwtkey，无需手动配置 ([390e485](https://github.com/certd/certd/commit/390e4853a570390a97df6a3b3882579f9547eeb4))\n\n## [1.21.2](https://github.com/certd/certd/compare/v1.21.1...v1.21.2) (2024-07-08)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.21.1](https://github.com/certd/certd/compare/v1.21.0...v1.21.1) (2024-07-08)\n\n### Performance Improvements\n\n* 说明优化，默认值优化 ([970c7fd](https://github.com/certd/certd/commit/970c7fd8a0f557770e973d8462ee5684ef742810))\n\n# [1.21.0](https://github.com/certd/certd/compare/v1.20.17...v1.21.0) (2024-07-03)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.20.17](https://github.com/certd/certd/compare/v1.20.16...v1.20.17) (2024-07-03)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.20.16](https://github.com/certd/certd/compare/v1.20.15...v1.20.16) (2024-07-01)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.20.15](https://github.com/certd/certd/compare/v1.20.14...v1.20.15) (2024-06-28)\n\n### Bug Fixes\n\n* 修复无法强制取消任务的bug ([9cc01db](https://github.com/certd/certd/commit/9cc01db1d569a5c45bb3e731f35d85df324a8e62))\n\n### Performance Improvements\n\n* 支持windows文件上传 ([7f61cab](https://github.com/certd/certd/commit/7f61cab101fa13b4e88234e9ad47434e6130fed2))\n\n## [1.20.14](https://github.com/certd/certd/compare/v1.20.13...v1.20.14) (2024-06-23)\n\n### Bug Fixes\n\n* 修复修改密码功能异常问题 ([f740ff5](https://github.com/certd/certd/commit/f740ff517f521dce361284c2c54bccc68aee0ea2))\n\n## [1.20.13](https://github.com/certd/certd/compare/v1.20.12...v1.20.13) (2024-06-18)\n\n### Bug Fixes\n\n* 日志高度越界 ([c4c9adb](https://github.com/certd/certd/commit/c4c9adb8bfd513f57252e523794e3799a9b220f8))\n* 修复邮箱设置页面SMTP拼写错误的问题 ([b98f1c0](https://github.com/certd/certd/commit/b98f1c0dd0bc6c6b4f814c578692afdf6d90b88d))\n* 修复logo问题 ([7e483e6](https://github.com/certd/certd/commit/7e483e60913d509b113148c735fe13ba1d72dddf))\n\n### Performance Improvements\n\n* 增加警告，修复一些样式错乱问题 ([fd54c2f](https://github.com/certd/certd/commit/fd54c2ffac492222e85ff2f5f49a9ee5cfc73588))\n\n## [1.20.12](https://github.com/certd/certd/compare/v1.20.10...v1.20.12) (2024-06-17)\n\n### Bug Fixes\n\n* 修复aliyun域名超过100个找不到域名的bug ([5b1494b](https://github.com/certd/certd/commit/5b1494b3ce93d1026dc56ee741342fbb8bf7be24))\n\n### Performance Improvements\n\n* 增加系统设置，可以关闭自助注册功能 ([20feace](https://github.com/certd/certd/commit/20feacea12d43386540db6a600f391d786be4014))\n* 支持cloudflare域名 ([fbb9a47](https://github.com/certd/certd/commit/fbb9a47e8f7bb805289b9ee64bd46ffee0f01c06))\n\n## [1.20.10](https://github.com/certd/certd/compare/v1.20.9...v1.20.10) (2024-05-30)\n\n### Performance Improvements\n\n* 上传到主机插件支持复制到本机路径 ([92446c3](https://github.com/certd/certd/commit/92446c339936f98f08f654b8971a7393d8435224))\n* 优化文件下载包名 ([d9eb927](https://github.com/certd/certd/commit/d9eb927b0a1445feab08b1958aa9ea80637a5ae6))\n* 增加任务复制功能 ([39ad759](https://github.com/certd/certd/commit/39ad7597fa0e19cc1f7631bbd6fea0a9e05a62c9))\n\n## [1.20.9](https://github.com/certd/certd/compare/v1.20.8...v1.20.9) (2024-03-22)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.20.8](https://github.com/certd/certd/compare/v1.20.7...v1.20.8) (2024-03-22)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.20.7](https://github.com/certd/certd/compare/v1.20.6...v1.20.7) (2024-03-22)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.20.6](https://github.com/certd/certd/compare/v1.20.5...v1.20.6) (2024-03-21)\n\n### Bug Fixes\n\n* 调整按钮图标到居中位置 ([836d18f](https://github.com/certd/certd/commit/836d18f07e22d00faf2f213bc3301a6672b5bafc))\n\n### Performance Improvements\n\n* 插件贡献文档及示例 ([72fb20a](https://github.com/certd/certd/commit/72fb20abf3ba5bdd862575d2907703a52fd7eb17))\n\n## [1.20.5](https://github.com/certd/certd/compare/v1.20.2...v1.20.5) (2024-03-11)\n\n### Bug Fixes\n\n* 修复腾讯云cdn部署无法选择端点的bug ([154409b](https://github.com/certd/certd/commit/154409b1dfee3ea1caae740ad9c1f99a6e7a9814))\n\n## [1.20.2](https://github.com/certd/certd/compare/v1.2.1...v1.20.2) (2024-02-28)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.2.1](https://github.com/certd/certd/compare/v1.2.0...v1.2.1) (2023-12-12)\n\n**Note:** Version bump only for package @certd/ui-client\n\n**Note:** Version bump only for package @certd/ui-client\n\n# [1.2.0](https://github.com/certd/certd/compare/v1.1.6...v1.2.0) (2023-10-27)\n\n* 🔱: [client] sync upgrade with 2 commits [trident-sync] ([aa3207f](https://github.com/certd/certd/commit/aa3207fca5f15f7c3da789989d99c8ae7d1c4551))\n\n### BREAKING CHANGES\n\n* search支持自定义布局，search.layout、search.collapse转移到 search.container之下。如果想使用原来的search组件，请配置search.is=fs-search-v1\n\n## [1.1.6](https://github.com/certd/certd/compare/v1.1.5...v1.1.6) (2023-07-10)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.1.5](https://github.com/certd/certd/compare/v1.1.4...v1.1.5) (2023-07-03)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.1.4](https://github.com/certd/certd/compare/v1.1.3...v1.1.4) (2023-07-03)\n\n### Bug Fixes\n\n* 成功图标转动的问题 ([f87eee3](https://github.com/certd/certd/commit/f87eee3b9ff1ef9874e79a81fe0ed7104cb9ee8c))\n\n### Performance Improvements\n\n* cancel task ([bc65c0a](https://github.com/certd/certd/commit/bc65c0a786360c087fe95cad93ec6a87804cc5ee))\n* flush log ([891a43a](https://github.com/certd/certd/commit/891a43ae6716ff98ed06643f7da2e35199ee195c))\n\n## [1.1.3](https://github.com/certd/certd/compare/v1.1.2...v1.1.3) (2023-07-03)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.1.2](https://github.com/certd/certd/compare/v1.1.1...v1.1.2) (2023-07-03)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.1.1](https://github.com/certd/certd/compare/v1.1.0...v1.1.1) (2023-06-28)\n\n**Note:** Version bump only for package @certd/ui-client\n\n# [1.1.0](https://github.com/certd/certd/compare/v1.0.6...v1.1.0) (2023-06-28)\n\n### Bug Fixes\n\n* 修复access选择类型trigger ([2851a33](https://github.com/certd/certd/commit/2851a33eb2510f038fadb55da29512597a4ba512))\n\n### Features\n\n* 权限控制 ([27a4c81](https://github.com/certd/certd/commit/27a4c81c6d70e70abb3892c3ea58d4719988808a))\n* 邮件通知 ([937e3fa](https://github.com/certd/certd/commit/937e3fac19cd03b8aa91db8ba03fda7fcfbacea2))\n* cert download ([5a51c14](https://github.com/certd/certd/commit/5a51c14de521cb8075a80d2ae41a16e6d5281259))\n* save files ([671d273](https://github.com/certd/certd/commit/671d273e2f9136d16896536b0ca127cf372f1619))\n\n## [1.0.6](https://github.com/certd/certd/compare/v1.0.5...v1.0.6) (2023-05-25)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.0.5](https://github.com/certd/certd/compare/v1.0.4...v1.0.5) (2023-05-25)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.0.4](https://github.com/certd/certd/compare/v1.0.3...v1.0.4) (2023-05-25)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.0.3](https://github.com/certd/certd/compare/v1.0.2...v1.0.3) (2023-05-25)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.0.2](https://github.com/certd/certd/compare/v1.0.1...v1.0.2) (2023-05-24)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.0.1](https://github.com/certd/certd/compare/v1.0.0...v1.0.1) (2023-05-24)\n\n**Note:** Version bump only for package @certd/ui-client\n\n## [1.9.2](https://github.com/fast-crud/fast-crud/compare/v1.9.1...v1.9.2) (2023-03-01)\n\n**Note:** Version bump only for package @fast-crud/fs-admin-antdv\n\n## [1.9.1](https://github.com/fast-crud/fast-crud/compare/v1.9.0...v1.9.1) (2023-03-01)\n\n**Note:** Version bump only for package @fast-crud/fs-admin-antdv\n\n## [0.10.5](https://github.com/fast-crud/fast-crud/compare/v0.10.4...v0.10.5) (2021-07-01)\n\n### Performance Improvements\n\n* fs-admin 与crud demo ([4e6b20f](https://github.com/fast-crud/fast-crud/commit/4e6b20fe19434460853841f371b9fd5f16e5e2d3))\n* fs-admin纳入子模块 ([2940d30](https://github.com/fast-crud/fast-crud/commit/2940d30f419bf4bde1e8e791f1fbdb9184818285))\n"
  },
  {
    "path": "packages/ui/certd-client/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 fast-crud\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": "packages/ui/certd-client/README.md",
    "content": "# fs-admin-antdv\n\n基于vue3、antdv 的 admin管理后台脚手架    \n更多信息请参考： [fast-crud](https://github.com/fast-crud/fast-crud)\n# server端\n\n## fs-server-js\nhttps://github.com/fast-crud/fs-server-js\n\n# 其他相关项目\n * [fast-crud](https://github.com/fast-crud/fast-crud) crud主项目    \n * [fs-admin-element](https://github.com/fast-crud/fs-admin-element) element版示例    \n * [fs-admin-naive](https://github.com/fast-crud/fs-admin-naive-ui) naive版示例 \n * [fs-in-vben-starter](https://github.com/fast-crud/fs-in-vben-starter) vben示例\n\n# build\n\n```sh\nset NODE_OPTIONS=--max-old-space-size=32768 && npm run build\n```\n# 感谢\n\n### 依赖\n* [vue](https://github.com/vuejs/vue-next) \n* [vue-router](https://github.com/vuejs/vue-router-next)\n* [antdv 2x](https://github.com/vueComponent/ant-design-vue)\n* [vitejs](https://github.com/vitejs/vite)\n* [pinia](https://github.com/posva/pinia)\n* [purge-icons](https://github.com/antfu/purge-icons)\n\n### 参考如下项目\n* [d2-admin](https://github.com/d2-projects/d2-admin)\n* [antdv-pro](https://github.com/vueComponent/ant-design-vue-pro)\n* [vben-admin](https://github.com/anncwb/vue-vben-admin)\n\n感谢这些优秀的项目\n\n\n\n\n\n\n"
  },
  {
    "path": "packages/ui/certd-client/build/modify-vars.ts",
    "content": "// import { getThemeVariables } from \"ant-design-vue/dist/theme\";\n// import path from \"path\";\n// const resolve = path.resolve;\nexport function generateModifyVars(dark = false) {\n  //const modifyVars = getThemeVariables({ dark });\n  // const vars = `${resolve(\"src/style/theme/index.less\")}`;\n  return {\n    //...modifyVars\n    // hack: `true; @import (reference) \"${vars}\";`\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/build/tailwind-config/index.mjs",
    "content": "import path from \"node:path\";\n\nimport { addDynamicIconSelectors } from \"@iconify/tailwind\";\nimport { getPackagesSync } from \"@manypkg/get-packages\";\nimport typographyPlugin from \"@tailwindcss/typography\";\nimport animate from \"tailwindcss-animate\";\n\nimport { enterAnimationPlugin } from \"./plugins/entry.mjs\";\n\n// import defaultTheme from 'tailwindcss/defaultTheme';\n\nconst { packages } = getPackagesSync(process.cwd());\n\nconst tailwindPackages = [];\n\npackages.forEach((pkg) => {\n  // apps目录下和 @vben-core/tailwind-ui 包需要使用到 tailwindcss ui\n  // if (fs.existsSync(path.join(pkg.dir, 'tailwind.config.mjs'))) {\n  tailwindPackages.push(pkg.dir);\n  // }\n});\n\nconst shadcnUiColors = {\n  accent: {\n    DEFAULT: \"hsl(var(--accent))\",\n    foreground: \"hsl(var(--accent-foreground))\",\n    hover: \"hsl(var(--accent-hover))\",\n    lighter: \"has(val(--accent-lighter))\"\n  },\n  background: {\n    deep: \"hsl(var(--background-deep))\",\n    DEFAULT: \"hsl(var(--background))\"\n  },\n  border: {\n    DEFAULT: \"hsl(var(--border))\"\n  },\n  card: {\n    DEFAULT: \"hsl(var(--card))\",\n    foreground: \"hsl(var(--card-foreground))\"\n  },\n  destructive: {\n    ...createColorsPalette(\"destructive\"),\n    DEFAULT: \"hsl(var(--destructive))\"\n  },\n\n  foreground: {\n    DEFAULT: \"hsl(var(--foreground))\"\n  },\n\n  input: {\n    background: \"hsl(var(--input-background))\",\n    DEFAULT: \"hsl(var(--input))\"\n  },\n  muted: {\n    DEFAULT: \"hsl(var(--muted))\",\n    foreground: \"hsl(var(--muted-foreground))\"\n  },\n  popover: {\n    DEFAULT: \"hsl(var(--popover))\",\n    foreground: \"hsl(var(--popover-foreground))\"\n  },\n  primary: {\n    ...createColorsPalette(\"primary\"),\n    DEFAULT: \"hsl(var(--primary))\"\n  },\n\n  ring: \"hsl(var(--ring))\",\n  secondary: {\n    DEFAULT: \"hsl(var(--secondary))\",\n    desc: \"hsl(var(--secondary-desc))\",\n    foreground: \"hsl(var(--secondary-foreground))\"\n  }\n};\n\nconst customColors = {\n  green: {\n    ...createColorsPalette(\"green\"),\n    foreground: \"hsl(var(--success-foreground))\"\n  },\n  header: {\n    DEFAULT: \"hsl(var(--header))\"\n  },\n  heavy: {\n    DEFAULT: \"hsl(var(--heavy))\",\n    foreground: \"hsl(var(--heavy-foreground))\"\n  },\n  main: {\n    DEFAULT: \"hsl(var(--main))\"\n  },\n  overlay: {\n    content: \"hsl(var(--overlay-content))\",\n    DEFAULT: \"hsl(var(--overlay))\"\n  },\n  red: {\n    ...createColorsPalette(\"red\"),\n    foreground: \"hsl(var(--destructive-foreground))\"\n  },\n  sidebar: {\n    deep: \"hsl(var(--sidebar-deep))\",\n    DEFAULT: \"hsl(var(--sidebar))\"\n  },\n  success: {\n    ...createColorsPalette(\"success\"),\n    DEFAULT: \"hsl(var(--success))\"\n  },\n  warning: {\n    ...createColorsPalette(\"warning\"),\n    DEFAULT: \"hsl(var(--warning))\"\n  },\n  yellow: {\n    ...createColorsPalette(\"yellow\"),\n    foreground: \"hsl(var(--warning-foreground))\"\n  }\n};\n\nexport default {\n  content: [\"./index.html\", ...tailwindPackages.map((item) => path.join(item, \"src/**/*.{vue,js,ts,jsx,tsx,svelte,astro,html}\"))],\n  darkMode: \"selector\",\n  plugins: [animate, typographyPlugin, addDynamicIconSelectors(), enterAnimationPlugin],\n  prefix: \"\",\n  theme: {\n    container: {\n      center: true,\n      padding: \"2rem\",\n      screens: {\n        \"2xl\": \"1400px\"\n      }\n    },\n    extend: {\n      animation: {\n        \"accordion-down\": \"accordion-down 0.2s ease-out\",\n        \"accordion-up\": \"accordion-up 0.2s ease-out\",\n        \"collapsible-down\": \"collapsible-down 0.2s ease-in-out\",\n        \"collapsible-up\": \"collapsible-up 0.2s ease-in-out\",\n        float: \"float 5s linear 0ms infinite\"\n      },\n\n      animationDuration: {\n        2000: \"2000ms\",\n        3000: \"3000ms\"\n      },\n      borderRadius: {\n        lg: \"var(--radius)\",\n        md: \"calc(var(--radius) - 2px)\",\n        sm: \"calc(var(--radius) - 4px)\",\n        xl: \"calc(var(--radius) + 4px)\"\n      },\n      boxShadow: {\n        float: `0 6px 16px 0 rgb(0 0 0 / 8%),\n          0 3px 6px -4px rgb(0 0 0 / 12%),\n          0 9px 28px 8px rgb(0 0 0 / 5%)`\n      },\n      colors: {\n        ...customColors,\n        ...shadcnUiColors\n      },\n      fontFamily: {\n        sans: [\n          \"var(--font-family)\"\n          //  ...defaultTheme.fontFamily.sans\n        ]\n      },\n      keyframes: {\n        \"accordion-down\": {\n          from: { height: \"0\" },\n          to: { height: \"var(--radix-accordion-content-height)\" }\n        },\n        \"accordion-up\": {\n          from: { height: \"var(--radix-accordion-content-height)\" },\n          to: { height: \"0\" }\n        },\n        \"collapsible-down\": {\n          from: { height: \"0\" },\n          to: { height: \"var(--radix-collapsible-content-height)\" }\n        },\n        \"collapsible-up\": {\n          from: { height: \"var(--radix-collapsible-content-height)\" },\n          to: { height: \"0\" }\n        },\n        float: {\n          \"0%\": { transform: \"translateY(0)\" },\n          \"50%\": { transform: \"translateY(-20px)\" },\n          \"100%\": { transform: \"translateY(0)\" }\n        }\n      },\n      zIndex: {\n        100: \"100\",\n        1000: \"1000\"\n      }\n    }\n  },\n  safelist: [\"dark\"]\n};\n\nfunction createColorsPalette(name) {\n  // backgroundLightest: '#EFF6FF', // Tailwind CSS 默认的 `blue-50`\n  //         backgroundLighter: '#DBEAFE',  // Tailwind CSS 默认的 `blue-100`\n  //         backgroundLight: '#BFDBFE',    // Tailwind CSS 默认的 `blue-200`\n  //         borderLight: '#93C5FD',        // Tailwind CSS 默认的 `blue-300`\n  //         border: '#60A5FA',             // Tailwind CSS 默认的 `blue-400`\n  //         main: '#3B82F6',               // Tailwind CSS 默认的 `blue-500`\n  //         hover: '#2563EB',              // Tailwind CSS 默认的 `blue-600`\n  //         active: '#1D4ED8',             // Tailwind CSS 默认的 `blue-700`\n  //         backgroundDark: '#1E40AF',     // Tailwind CSS 默认的 `blue-800`\n  //         backgroundDarker: '#1E3A8A',   // Tailwind CSS 默认的 `blue-900`\n  //         backgroundDarkest: '#172554',  // Tailwind CSS 默认的 `blue-950`\n\n  // •\tbackgroundLightest (#EFF6FF): 适用于最浅的背景色，可能用于非常轻微的阴影或卡片的背景。\n  // •\tbackgroundLighter (#DBEAFE): 适用于略浅的背景色，通常用于次要背景或略浅的区域。\n  // •\tbackgroundLight (#BFDBFE): 适用于浅色背景，可能用于输入框或表单区域的背景。\n  // •\tborderLight (#93C5FD): 适用于浅色边框，可能用于输入框或卡片的边框。\n  // •\tborder (#60A5FA): 适用于普通边框，可能用于按钮或卡片的边框。\n  // •\tmain (#3B82F6): 适用于主要的主题色，通常用于按钮、链接或主要的强调色。\n  // •\thover (#2563EB): 适用于鼠标悬停状态下的颜色，例如按钮悬停时的背景色或边框色。\n  // •\tactive (#1D4ED8): 适用于激活状态下的颜色，例如按钮按下时的背景色或边框色。\n  // •\tbackgroundDark (#1E40AF): 适用于深色背景，可能用于主要按钮或深色卡片背景。\n  // •\tbackgroundDarker (#1E3A8A): 适用于更深的背景，通常用于头部导航栏或页脚。\n  // •\tbackgroundDarkest (#172554): 适用于最深的背景，可能用于非常深色的区域或极端对比色。\n\n  return {\n    50: `hsl(var(--${name}-50))`,\n    100: `hsl(var(--${name}-100))`,\n    200: `hsl(var(--${name}-200))`,\n    300: `hsl(var(--${name}-300))`,\n    400: `hsl(var(--${name}-400))`,\n    500: `hsl(var(--${name}-500))`,\n    600: `hsl(var(--${name}-600))`,\n    700: `hsl(var(--${name}-700))`,\n    // 800: `hsl(var(--${name}-800))`,\n    // 900: `hsl(var(--${name}-900))`,\n    // 950: `hsl(var(--${name}-950))`,\n    // 激活状态下的颜色，适用于按钮按下时的背景色或边框色。\n    active: `hsl(var(--${name}-700))`,\n    // 浅色背景，适用于输入框或表单区域的背景。\n    \"background-light\": `hsl(var(--${name}-200))`,\n    // 适用于略浅的背景色，通常用于次要背景或略浅的区域。\n    \"background-lighter\": `hsl(var(--${name}-100))`,\n    // 最浅的背景色，适用于非常轻微的阴影或卡片的背景。\n    \"background-lightest\": `hsl(var(--${name}-50))`,\n    // 适用于普通边框，可能用于按钮或卡片的边框。\n    border: `hsl(var(--${name}-400))`,\n    // 浅色边框，适用于输入框或卡片的边框。\n    \"border-light\": `hsl(var(--${name}-300))`,\n    foreground: `hsl(var(--${name}-foreground))`,\n    // 鼠标悬停状态下的颜色，适用于按钮悬停时的背景色或边框色。\n    hover: `hsl(var(--${name}-600))`,\n    // 主色文本\n    text: `hsl(var(--${name}-500))`,\n    // 主色文本激活态\n    \"text-active\": `hsl(var(--${name}-700))`,\n    // 主色文本悬浮态\n    \"text-hover\": `hsl(var(--${name}-600))`\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/build/tailwind-config/plugins/entry.mjs",
    "content": "import plugin from \"tailwindcss/plugin.js\";\n\nconst enterAnimationPlugin = plugin(({ addUtilities }) => {\n  const maxChild = 5;\n  const utilities = {};\n  for (let i = 1; i <= maxChild; i++) {\n    const baseDelay = 0.1;\n    const delay = `${baseDelay * i}s`;\n\n    utilities[`.enter-x:nth-child(${i})`] = {\n      animation: `enter-x-animation 0.3s ease-in-out ${delay} forwards`,\n      opacity: \"0\",\n      transform: `translateX(50px)`\n    };\n\n    utilities[`.enter-y:nth-child(${i})`] = {\n      animation: `enter-y-animation 0.3s ease-in-out ${delay} forwards`,\n      opacity: \"0\",\n      transform: `translateY(50px)`\n    };\n\n    utilities[`.-enter-x:nth-child(${i})`] = {\n      animation: `enter-x-animation 0.3s ease-in-out ${delay} forwards`,\n      opacity: \"0\",\n      transform: `translateX(-50px)`\n    };\n\n    utilities[`.-enter-y:nth-child(${i})`] = {\n      animation: `enter-y-animation 0.3s ease-in-out ${delay} forwards`,\n      opacity: \"0\",\n      transform: `translateY(-50px)`\n    };\n  }\n\n  // 添加动画关键帧\n  addUtilities(utilities);\n  addUtilities({\n    \"@keyframes enter-x-animation\": {\n      to: {\n        opacity: \"1\",\n        transform: \"translateX(0)\"\n      }\n    },\n    \"@keyframes enter-y-animation\": {\n      to: {\n        opacity: \"1\",\n        transform: \"translateY(0)\"\n      }\n    }\n  });\n});\n\nexport { enterAnimationPlugin };\n"
  },
  {
    "path": "packages/ui/certd-client/build/tailwind-config/postcss.config.mjs",
    "content": "import config from \".\";\n\nexport default {\n  plugins: {\n    ...(process.env.NODE_ENV === \"production\" ? { cssnano: {} } : {}),\n    // Specifying the config is not necessary in most cases, but it is included\n    autoprefixer: {},\n    // 修复 element-plus 和 ant-design-vue 的样式和tailwindcss冲突问题\n    \"postcss-antd-fixes\": { prefixes: [\"ant\", \"el\"] },\n    \"postcss-import\": {},\n    \"postcss-preset-env\": {},\n    tailwindcss: { config },\n    \"tailwindcss/nesting\": {}\n  }\n};\n"
  },
  {
    "path": "packages/ui/certd-client/build/theme-colors.ts",
    "content": "import { generate } from \"@ant-design/colors\";\n\nexport const primaryColor = \"#1890ff\";\n\nexport const darkMode = \"light\";\n\ntype Fn = (...arg: any) => any;\n\nexport interface GenerateColorsParams {\n  mixLighten: Fn;\n  mixDarken: Fn;\n  tinycolor: any;\n  color?: string;\n}\n\nexport function generateAntColors(color: string) {\n  return generate(color, {\n    theme: \"default\"\n  });\n}\n\nexport function getThemeColors(color?: string) {\n  const tc = color || primaryColor;\n  const colors = generateAntColors(tc);\n  const primary = colors[5];\n  const modeColors = generateAntColors(primary);\n\n  return [...colors, ...modeColors];\n}\n\nexport function generateColors({ color = primaryColor, mixLighten, mixDarken, tinycolor }: GenerateColorsParams) {\n  const arr = new Array(19).fill(0);\n  const lightens = arr.map((_t, i) => {\n    return mixLighten(color, i / 5);\n  });\n\n  const darkens = arr.map((_t, i) => {\n    return mixDarken(color, i / 5);\n  });\n\n  const alphaColors = arr.map((_t, i) => {\n    return tinycolor(color)\n      .setAlpha(i / 20)\n      .toRgbString();\n  });\n\n  const shortAlphaColors = alphaColors.map((item) => item.replace(/\\s/g, \"\").replace(/0\\./g, \".\"));\n\n  const tinycolorLightens = arr\n    .map((_t, i) => {\n      return tinycolor(color)\n        .lighten(i * 5)\n        .toHexString();\n    })\n    .filter((item) => item !== \"#ffffff\");\n\n  const tinycolorDarkens = arr\n    .map((_t, i) => {\n      return tinycolor(color)\n        .darken(i * 5)\n        .toHexString();\n    })\n    .filter((item) => item !== \"#000000\");\n  return [\n    ...lightens,\n    ...darkens,\n    ...alphaColors,\n    ...shortAlphaColors,\n    ...tinycolorDarkens,\n    ...tinycolorLightens\n  ].filter((item) => !item.includes(\"-\"));\n}\n"
  },
  {
    "path": "packages/ui/certd-client/build/theme-plugin.ts",
    "content": "/**\n * Vite plugin for website theme color switching\n * https://github.com/anncwb/vite-plugin-theme\n */\nimport type { Plugin } from \"vite\";\nimport path from \"path\";\nimport { viteThemePlugin, mixLighten, mixDarken, tinycolor, antdDarkThemePlugin } from \"vite-plugin-theme\";\nimport { getThemeColors, generateColors } from \"./theme-colors\";\nimport { generateModifyVars } from \"./modify-vars\";\n\nexport function configThemePlugin(isBuild: boolean): Plugin[] {\n  const colors = generateColors({\n    mixDarken,\n    mixLighten,\n    tinycolor\n  });\n  const colorVariables = [...getThemeColors(), ...colors];\n  const plugin = [\n    viteThemePlugin({\n      // resolveSelector: (s) => {\n      //   s = s.trim();\n      //   switch (s) {\n      //     case \".ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon\":\n      //       return \".ant-steps-item-icon > .ant-steps-icon\";\n      //     case \".ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)\":\n      //     case \".ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover\":\n      //     case \".ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active\":\n      //       return s;\n      //     case \".ant-steps-item-icon > .ant-steps-icon\":\n      //       return s;\n      //   }\n      //   return `[data-theme] ${s}`;\n      // },\n      resolveSelector: (s) => {\n        s = s.trim();\n        if (s === \".ant-btn:hover,.ant-btn:focus\") {\n          // console.log(\"ssss\", s);\n          return \".theme-discard-xxxxxxx\";\n        }\n        return s;\n      },\n      colorVariables\n    }),\n    antdDarkThemePlugin({\n      preloadFiles: [\n        path.resolve(process.cwd(), \"node_modules/ant-design-vue/dist/antd.less\"),\n        path.resolve(process.cwd(), \"src/style/theme/index.less\")\n      ],\n      filter: (id) => (isBuild ? !id.endsWith(\"antd.less\") : true),\n      // extractCss: false,\n      darkModifyVars: {\n        ...generateModifyVars(true),\n        \"text-color\": \"#c9d1d9\",\n        \"text-color-base\": \"#c9d1d9\",\n        \"component-background\": \"#151515\",\n        // black: '#0e1117',\n        // #8b949e\n        \"text-color-secondary\": \"#8b949e\",\n        \"border-color-base\": \"#303030\",\n        // 'border-color-split': '#30363d',\n        \"item-active-bg\": \"#111b26\",\n        \"app-content-background\": \"rgb(255 255 255 / 4%)\"\n      }\n    })\n  ];\n\n  return (plugin as unknown) as Plugin[];\n}\n"
  },
  {
    "path": "packages/ui/certd-client/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <link rel=\"icon\" href=\"api/app/favicon\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>\n    <title>Loading</title>\n    <script src=\"static/icons/iconfont.js?v=<%=version%>\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"static/index.css?v=<%=version%>\"/>\n</head>\n<body>\n<div id=\"app\">\n    <div class=\"fs-bootstrap\">\n        <div class=\"fs-bootstrap__main\">\n            <div class=\"fs-bootstrap__loading\"></div>\n        </div>\n        <div class=\"fs-bootstrap__footer\">\n<!--            <a href=\"https://github.com/certd/certd\" target=\"_blank\">-->\n<!--                https://github.com/certd/certd-->\n<!--            </a>-->\n        </div>\n    </div>\n\n</div>\n<script type=\"module\" src=\"/src/main.ts\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "packages/ui/certd-client/package.json",
    "content": "{\n  \"name\": \"@certd/ui-client\",\n  \"version\": \"1.36.10\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"vite --open\",\n    \"dev:pm\": \"vite --mode pm\",\n    \"dev:force\": \"vite --force\",\n    \"debug\": \"vite --mode debug --open\",\n    \"debug:pm\": \"vite --mode debugpm\",\n    \"debug:force\": \"vite --force --mode debug\",\n    \"build\": \"cross-env NODE_OPTIONS=--max-old-space-size=40960 vite build \",\n    \"dev-build\": \"echo 1\",\n    \"test:unit\": \"vitest\",\n    \"serve\": \"vite preview\",\n    \"preview\": \"vite preview\",\n    \"pretty-quick\": \"pretty-quick\",\n    \"lint-fix\": \"eslint --fix --ext .js --ext .jsx --ext .vue --ext .ts --ext .tsx src/\",\n    \"format\": \"prettier --write src\",\n    \"upgrade\": \"yarn upgrade-interactive --latest\",\n    \"tsc\": \"vue-tsc --noEmit --skipLibCheck\",\n    \"circle:check\": \"pnpm dependency-cruise --validate --output-type err-html -f dependency-report.html src\",\n    \"afterPubPush\": \"git add . && git commit -m \\\"build: publish success\\\" && git push\",\n    \"pub\": \"echo 1\"\n  },\n  \"author\": \"greper\",\n  \"license\": \"AGPL-3.0\",\n  \"dependencies\": {\n    \"@ant-design/colors\": \"^7.0.2\",\n    \"@ant-design/icons-vue\": \"^7.0.1\",\n    \"@aws-sdk/client-s3\": \"^3.535.0\",\n    \"@aws-sdk/s3-request-presigner\": \"^3.535.0\",\n    \"@ctrl/tinycolor\": \"^4.1.0\",\n    \"@fast-crud/fast-crud\": \"^1.25.13\",\n    \"@fast-crud/fast-extends\": \"^1.25.13\",\n    \"@fast-crud/ui-antdv4\": \"^1.25.13\",\n    \"@fast-crud/ui-interface\": \"^1.25.13\",\n    \"@iconify/tailwind\": \"^1.2.0\",\n    \"@iconify/vue\": \"^4.1.1\",\n    \"@manypkg/get-packages\": \"^2.2.2\",\n    \"@soerenmartius/vue3-clipboard\": \"^0.1.2\",\n    \"@tailwindcss/nesting\": \"0.0.0-insiders.565cd3e\",\n    \"@tailwindcss/typography\": \"^0.5.16\",\n    \"@tanstack/vue-store\": \"^0.7.0\",\n    \"@vee-validate/zod\": \"^4.15.0\",\n    \"@vue-js-cron/light\": \"^4.0.5\",\n    \"@vue/shared\": \"^3.5.13\",\n    \"@vueuse/core\": \"^10.11.0\",\n    \"ant-design-vue\": \"^4.2.6\",\n    \"async-validator\": \"^4.2.5\",\n    \"axios\": \"^1.7.2\",\n    \"axios-mock-adapter\": \"^1.22.0\",\n    \"base64-js\": \"^1.5.1\",\n    \"better-scroll\": \"^2.5.1\",\n    \"china-division\": \"^2.7.0\",\n    \"class-variance-authority\": \"^0.7.1\",\n    \"clsx\": \"^2.1.1\",\n    \"core-js\": \"^3.36.0\",\n    \"cos-js-sdk-v5\": \"^1.7.0\",\n    \"cron-parser\": \"^4.9.0\",\n    \"cropperjs\": \"^1.6.1\",\n    \"cross-env\": \"^7.0.3\",\n    \"cssnano\": \"^7.0.6\",\n    \"dayjs\": \"^1.11.7\",\n    \"defu\": \"^6.1.4\",\n    \"echarts\": \"^5.5.1\",\n    \"highlight.js\": \"^11.9.0\",\n    \"humanize-duration\": \"^3.27.3\",\n    \"js-yaml\": \"^4.1.0\",\n    \"lodash-es\": \"^4.17.21\",\n    \"lucide-vue-next\": \"^0.477.0\",\n    \"mitt\": \"^3.0.1\",\n    \"monaco-editor\": \"^0.52.2\",\n    \"monaco-yaml\": \"^5.3.1\",\n    \"nanoid\": \"^4.0.0\",\n    \"node-forge\": \"^1.3.1\",\n    \"nprogress\": \"^0.2.0\",\n    \"object-assign\": \"^4.1.1\",\n    \"pinia\": \"2.1.7\",\n    \"pinia-plugin-persistedstate\": \"^4.2.0\",\n    \"postcss-antd-fixes\": \"^0.2.0\",\n    \"postcss-import\": \"^16.1.0\",\n    \"postcss-preset-env\": \"^10.1.5\",\n    \"psl\": \"^1.9.0\",\n    \"qiniu-js\": \"^3.4.2\",\n    \"qrcode\": \"^1.5.4\",\n    \"radix-vue\": \"^1.9.16\",\n    \"sortablejs\": \"^1.15.3\",\n    \"spark-md5\": \"^3.0.2\",\n    \"tailwind-merge\": \"^3.0.2\",\n    \"tailwindcss-animate\": \"^1.0.7\",\n    \"theme-colors\": \"^0.1.0\",\n    \"vee-validate\": \"^4.15.0\",\n    \"vitest\": \"^0.34.6\",\n    \"vue\": \"^3.4.21\",\n    \"vue-cropperjs\": \"^5.0.0\",\n    \"vue-echarts\": \"^7.0.3\",\n    \"vue-i18n\": \"^9.10.2\",\n    \"vue-router\": \"^4.3.0\",\n    \"vuedraggable\": \"^4.1.0\",\n    \"watermark-js-plus\": \"^1.5.8\",\n    \"zod\": \"^3.24.2\",\n    \"zod-defaults\": \"^0.1.3\"\n  },\n  \"devDependencies\": {\n    \"@certd/lib-iframe\": \"^1.36.10\",\n    \"@certd/pipeline\": \"^1.36.10\",\n    \"@rollup/plugin-commonjs\": \"^25.0.7\",\n    \"@rollup/plugin-node-resolve\": \"^15.2.3\",\n    \"@types/chai\": \"^4.3.12\",\n    \"@types/lodash-es\": \"^4.17.12\",\n    \"@types/mocha\": \"^10.0.6\",\n    \"@types/node\": \"^18\",\n    \"@types/nprogress\": \"^0.2.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^7.2.0\",\n    \"@typescript-eslint/parser\": \"^7.2.0\",\n    \"@vitejs/plugin-legacy\": \"^5.3.2\",\n    \"@vitejs/plugin-vue\": \"^5.0.4\",\n    \"@vitejs/plugin-vue-jsx\": \"^3.1.0\",\n    \"@vue/compiler-sfc\": \"^3.4.21\",\n    \"@vue/eslint-config-typescript\": \"^13.0.0\",\n    \"@vue/test-utils\": \"^2.4.6\",\n    \"autoprefixer\": \"^10.4.20\",\n    \"caller-path\": \"^4.0.0\",\n    \"chai\": \"^5.1.0\",\n    \"dependency-cruiser\": \"^16.2.3\",\n    \"dot\": \"^1.1.3\",\n    \"eslint\": \"8.57.0\",\n    \"eslint-config-prettier\": \"^9.1.0\",\n    \"eslint-plugin-import\": \"^2.29.1\",\n    \"eslint-plugin-node\": \"^11.1.0\",\n    \"eslint-plugin-prettier\": \"^5.1.3\",\n    \"eslint-plugin-promise\": \"^6.1.1\",\n    \"eslint-plugin-vue\": \"^9.23.0\",\n    \"less\": \"^4.2.0\",\n    \"less-loader\": \"^12.2.0\",\n    \"postcss\": \"^8.4.35\",\n    \"prettier\": \"3.3.3\",\n    \"pretty-quick\": \"^4.0.0\",\n    \"rimraf\": \"^5.0.5\",\n    \"rollup\": \"^4.13.0\",\n    \"rollup-plugin-visualizer\": \"^5.12.0\",\n    \"stylelint\": \"^15.11.0\",\n    \"stylelint-order\": \"^6.0.4\",\n    \"tailwindcss\": \"^3.4.14\",\n    \"terser\": \"^5.29.2\",\n    \"ts-node\": \"^10.9.2\",\n    \"tslint\": \"^6.1.3\",\n    \"typescript\": \"^5.4.2\",\n    \"unplugin-vue-define-options\": \"^1.4.2\",\n    \"vite\": \"^5.3.1\",\n    \"vite-plugin-compression\": \"^0.5.1\",\n    \"vite-plugin-html\": \"^3.2.2\",\n    \"vite-plugin-theme\": \"^0.8.6\",\n    \"vite-plugin-windicss\": \"^1.9.3\",\n    \"vitest\": \"^2.1.2\",\n    \"vue-eslint-parser\": \"^9.4.2\",\n    \"vue-tsc\": \"^1.8.8\"\n  },\n  \"husky\": {\n    \"hooks\": {\n      \"pre-commit\": \"pretty-quick --staged\"\n    }\n  },\n  \"pnpm\": {\n    \"neverBuiltDependencies\": []\n  },\n  \"gitHead\": \"9c2162697f3affea22c9a8cbc0ca74f4034ab27e\",\n  \"vite\": {\n    \"optimizeDeps\": {\n      \"include\": [\n        \"@iconify/iconify\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/postcss.config.mjs",
    "content": "import config from \"./build/tailwind-config/index.mjs\";\n\nexport default {\n  plugins: {\n    ...(process.env.NODE_ENV === \"production\" ? { cssnano: {} } : {}),\n    // Specifying the config is not necessary in most cases, but it is included\n    autoprefixer: {},\n    // 修复 element-plus 和 ant-design-vue 的样式和tailwindcss冲突问题\n    \"postcss-antd-fixes\": { prefixes: [\"ant\", \"el\"] },\n    \"postcss-import\": {},\n    \"postcss-preset-env\": {},\n    tailwindcss: { config },\n    \"tailwindcss/nesting\": {}\n  }\n};\n"
  },
  {
    "path": "packages/ui/certd-client/public/site-import-template.csv",
    "content": "﻿name,mobile\n张三,18603040102\n李四,18603040103\n王五,18603040104\n赵六,18603040105\n田七,18603040106\n"
  },
  {
    "path": "packages/ui/certd-client/public/static/icons/demo.css",
    "content": "/* Logo 字体 */\n@font-face {\n  font-family: \"iconfont logo\";\n  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');\n  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),\n    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),\n    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),\n    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');\n}\n\n.logo {\n  font-family: \"iconfont logo\";\n  font-size: 160px;\n  font-style: normal;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n/* tabs */\n.nav-tabs {\n  position: relative;\n}\n\n.nav-tabs .nav-more {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  height: 42px;\n  line-height: 42px;\n  color: #666;\n}\n\n#tabs {\n  border-bottom: 1px solid #eee;\n}\n\n#tabs li {\n  cursor: pointer;\n  width: 100px;\n  height: 40px;\n  line-height: 40px;\n  text-align: center;\n  font-size: 16px;\n  border-bottom: 2px solid transparent;\n  position: relative;\n  z-index: 1;\n  margin-bottom: -1px;\n  color: #666;\n}\n\n\n#tabs .active {\n  border-bottom-color: #f00;\n  color: #222;\n}\n\n.tab-container .content {\n  display: none;\n}\n\n/* 页面布局 */\n.main {\n  padding: 30px 100px;\n  width: 960px;\n  margin: 0 auto;\n}\n\n.main .logo {\n  color: #333;\n  text-align: left;\n  margin-bottom: 30px;\n  line-height: 1;\n  height: 110px;\n  margin-top: -50px;\n  overflow: hidden;\n  *zoom: 1;\n}\n\n.main .logo a {\n  font-size: 160px;\n  color: #333;\n}\n\n.helps {\n  margin-top: 40px;\n}\n\n.helps pre {\n  padding: 20px;\n  margin: 10px 0;\n  border: solid 1px #e7e1cd;\n  background-color: #fffdef;\n  overflow: auto;\n}\n\n.icon_lists {\n  width: 100% !important;\n  overflow: hidden;\n  *zoom: 1;\n}\n\n.icon_lists li {\n  width: 100px;\n  margin-bottom: 10px;\n  margin-right: 20px;\n  text-align: center;\n  list-style: none !important;\n  cursor: default;\n}\n\n.icon_lists li .code-name {\n  line-height: 1.2;\n}\n\n.icon_lists .icon {\n  display: block;\n  height: 100px;\n  line-height: 100px;\n  font-size: 42px;\n  margin: 10px auto;\n  color: #333;\n  -webkit-transition: font-size 0.25s linear, width 0.25s linear;\n  -moz-transition: font-size 0.25s linear, width 0.25s linear;\n  transition: font-size 0.25s linear, width 0.25s linear;\n}\n\n.icon_lists .icon:hover {\n  font-size: 100px;\n}\n\n.icon_lists .svg-icon {\n  /* 通过设置 font-size 来改变图标大小 */\n  width: 1em;\n  /* 图标和文字相邻时，垂直对齐 */\n  vertical-align: -0.15em;\n  /* 通过设置 color 来改变 SVG 的颜色/fill */\n  fill: currentColor;\n  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示\n      normalize.css 中也包含这行 */\n  overflow: hidden;\n}\n\n.icon_lists li .name,\n.icon_lists li .code-name {\n  color: #666;\n}\n\n/* markdown 样式 */\n.markdown {\n  color: #666;\n  font-size: 14px;\n  line-height: 1.8;\n}\n\n.highlight {\n  line-height: 1.5;\n}\n\n.markdown img {\n  vertical-align: middle;\n  max-width: 100%;\n}\n\n.markdown h1 {\n  color: #404040;\n  font-weight: 500;\n  line-height: 40px;\n  margin-bottom: 24px;\n}\n\n.markdown h2,\n.markdown h3,\n.markdown h4,\n.markdown h5,\n.markdown h6 {\n  color: #404040;\n  margin: 1.6em 0 0.6em 0;\n  font-weight: 500;\n  clear: both;\n}\n\n.markdown h1 {\n  font-size: 28px;\n}\n\n.markdown h2 {\n  font-size: 22px;\n}\n\n.markdown h3 {\n  font-size: 16px;\n}\n\n.markdown h4 {\n  font-size: 14px;\n}\n\n.markdown h5 {\n  font-size: 12px;\n}\n\n.markdown h6 {\n  font-size: 12px;\n}\n\n.markdown hr {\n  height: 1px;\n  border: 0;\n  background: #e9e9e9;\n  margin: 16px 0;\n  clear: both;\n}\n\n.markdown p {\n  margin: 1em 0;\n}\n\n.markdown>p,\n.markdown>blockquote,\n.markdown>.highlight,\n.markdown>ol,\n.markdown>ul {\n  width: 80%;\n}\n\n.markdown ul>li {\n  list-style: circle;\n}\n\n.markdown>ul li,\n.markdown blockquote ul>li {\n  margin-left: 20px;\n  padding-left: 4px;\n}\n\n.markdown>ul li p,\n.markdown>ol li p {\n  margin: 0.6em 0;\n}\n\n.markdown ol>li {\n  list-style: decimal;\n}\n\n.markdown>ol li,\n.markdown blockquote ol>li {\n  margin-left: 20px;\n  padding-left: 4px;\n}\n\n.markdown code {\n  margin: 0 3px;\n  padding: 0 5px;\n  background: #eee;\n  border-radius: 3px;\n}\n\n.markdown strong,\n.markdown b {\n  font-weight: 600;\n}\n\n.markdown>table {\n  border-collapse: collapse;\n  border-spacing: 0px;\n  empty-cells: show;\n  border: 1px solid #e9e9e9;\n  width: 95%;\n  margin-bottom: 24px;\n}\n\n.markdown>table th {\n  white-space: nowrap;\n  color: #333;\n  font-weight: 600;\n}\n\n.markdown>table th,\n.markdown>table td {\n  border: 1px solid #e9e9e9;\n  padding: 8px 16px;\n  text-align: left;\n}\n\n.markdown>table th {\n  background: #F7F7F7;\n}\n\n.markdown blockquote {\n  font-size: 90%;\n  color: #999;\n  border-left: 4px solid #e9e9e9;\n  padding-left: 0.8em;\n  margin: 1em 0;\n}\n\n.markdown blockquote p {\n  margin: 0;\n}\n\n.markdown .anchor {\n  opacity: 0;\n  transition: opacity 0.3s ease;\n  margin-left: 8px;\n}\n\n.markdown .waiting {\n  color: #ccc;\n}\n\n.markdown h1:hover .anchor,\n.markdown h2:hover .anchor,\n.markdown h3:hover .anchor,\n.markdown h4:hover .anchor,\n.markdown h5:hover .anchor,\n.markdown h6:hover .anchor {\n  opacity: 1;\n  display: inline-block;\n}\n\n.markdown>br,\n.markdown>p>br {\n  clear: both;\n}\n\n\n.hljs {\n  display: block;\n  background: white;\n  padding: 0.5em;\n  color: #333333;\n  overflow-x: auto;\n}\n\n.hljs-comment,\n.hljs-meta {\n  color: #969896;\n}\n\n.hljs-string,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-strong,\n.hljs-emphasis,\n.hljs-quote {\n  color: #df5000;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-type {\n  color: #a71d5d;\n}\n\n.hljs-literal,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-attribute {\n  color: #0086b3;\n}\n\n.hljs-section,\n.hljs-name {\n  color: #63a35c;\n}\n\n.hljs-tag {\n  color: #333333;\n}\n\n.hljs-title,\n.hljs-attr,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n  color: #795da3;\n}\n\n.hljs-addition {\n  color: #55a532;\n  background-color: #eaffea;\n}\n\n.hljs-deletion {\n  color: #bd2c00;\n  background-color: #ffecec;\n}\n\n.hljs-link {\n  text-decoration: underline;\n}\n\n/* 代码高亮 */\n/* PrismJS 1.15.0\nhttps://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */\n/**\n * prism.js default theme for JavaScript, CSS and HTML\n * Based on dabblet (http://dabblet.com)\n * @author Lea Verou\n */\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n  color: black;\n  background: none;\n  text-shadow: 0 1px white;\n  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n  text-align: left;\n  white-space: pre;\n  word-spacing: normal;\n  word-break: normal;\n  word-wrap: normal;\n  line-height: 1.5;\n\n  -moz-tab-size: 4;\n  -o-tab-size: 4;\n  tab-size: 4;\n\n  -webkit-hyphens: none;\n  -moz-hyphens: none;\n  -ms-hyphens: none;\n  hyphens: none;\n}\n\npre[class*=\"language-\"]::-moz-selection,\npre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection,\ncode[class*=\"language-\"] ::-moz-selection {\n  text-shadow: none;\n  background: #b3d4fc;\n}\n\npre[class*=\"language-\"]::selection,\npre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection,\ncode[class*=\"language-\"] ::selection {\n  text-shadow: none;\n  background: #b3d4fc;\n}\n\n@media print {\n\n  code[class*=\"language-\"],\n  pre[class*=\"language-\"] {\n    text-shadow: none;\n  }\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n  padding: 1em;\n  margin: .5em 0;\n  overflow: auto;\n}\n\n:not(pre)>code[class*=\"language-\"],\npre[class*=\"language-\"] {\n  background: #f5f2f0;\n}\n\n/* Inline code */\n:not(pre)>code[class*=\"language-\"] {\n  padding: .1em;\n  border-radius: .3em;\n  white-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n  color: slategray;\n}\n\n.token.punctuation {\n  color: #999;\n}\n\n.namespace {\n  opacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n  color: #905;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n  color: #690;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string {\n  color: #9a6e3a;\n  background: hsla(0, 0%, 100%, .5);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n  color: #07a;\n}\n\n.token.function,\n.token.class-name {\n  color: #DD4A68;\n}\n\n.token.regex,\n.token.important,\n.token.variable {\n  color: #e90;\n}\n\n.token.important,\n.token.bold {\n  font-weight: bold;\n}\n\n.token.italic {\n  font-style: italic;\n}\n\n.token.entity {\n  cursor: help;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/public/static/icons/demo_index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\"/>\n  <title>iconfont Demo</title>\n  <link rel=\"shortcut icon\" href=\"//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg\" type=\"image/x-icon\"/>\n  <link rel=\"icon\" type=\"image/svg+xml\" href=\"//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg\"/>\n  <link rel=\"stylesheet\" href=\"https://g.alicdn.com/thx/cube/1.3.2/cube.min.css\">\n  <link rel=\"stylesheet\" href=\"demo.css\">\n  <link rel=\"stylesheet\" href=\"iconfont.css\">\n  <script src=\"iconfont.js\"></script>\n  <!-- jQuery -->\n  <script src=\"https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js\"></script>\n  <!-- 代码高亮 -->\n  <script src=\"https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js\"></script>\n  <style>\n    .main .logo {\n      margin-top: 0;\n      height: auto;\n    }\n\n    .main .logo a {\n      display: flex;\n      align-items: center;\n    }\n\n    .main .logo .sub-title {\n      margin-left: 0.5em;\n      font-size: 22px;\n      color: #fff;\n      background: linear-gradient(-45deg, #3967FF, #B500FE);\n      -webkit-background-clip: text;\n      -webkit-text-fill-color: transparent;\n    }\n  </style>\n</head>\n<body>\n  <div class=\"main\">\n    <h1 class=\"logo\"><a href=\"https://www.iconfont.cn/\" title=\"iconfont 首页\" target=\"_blank\">\n      <img width=\"200\" src=\"https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg\">\n      \n    </a></h1>\n    <div class=\"nav-tabs\">\n      <ul id=\"tabs\" class=\"dib-box\">\n        <li class=\"dib active\"><span>Unicode</span></li>\n        <li class=\"dib\"><span>Font class</span></li>\n        <li class=\"dib\"><span>Symbol</span></li>\n      </ul>\n      \n      <a href=\"https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=4688792\" target=\"_blank\" class=\"nav-more\">查看项目</a>\n      \n    </div>\n    <div class=\"tab-container\">\n      <div class=\"content unicode\" style=\"display: block;\">\n          <ul class=\"icon_lists dib-box\">\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6e4;</span>\n                <div class=\"name\">cdn</div>\n                <div class=\"code-name\">&amp;#xe6e4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe653;</span>\n                <div class=\"name\">京东云</div>\n                <div class=\"code-name\">&amp;#xe653;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe651;</span>\n                <div class=\"name\">volcengine</div>\n                <div class=\"code-name\">&amp;#xe651;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe62f;</span>\n                <div class=\"name\">upyun</div>\n                <div class=\"code-name\">&amp;#xe62f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xecc0;</span>\n                <div class=\"name\">plesk_</div>\n                <div class=\"code-name\">&amp;#xecc0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe741;</span>\n                <div class=\"name\">易支付-01</div>\n                <div class=\"code-name\">&amp;#xe741;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe606;</span>\n                <div class=\"name\">1Panel</div>\n                <div class=\"code-name\">&amp;#xe606;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe73c;</span>\n                <div class=\"name\">西部数码</div>\n                <div class=\"code-name\">&amp;#xe73c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe607;</span>\n                <div class=\"name\">qnap</div>\n                <div class=\"code-name\">&amp;#xe607;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9cc;</span>\n                <div class=\"name\">proxmox</div>\n                <div class=\"code-name\">&amp;#xe9cc;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe604;</span>\n                <div class=\"name\">aws</div>\n                <div class=\"code-name\">&amp;#xe604;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe602;</span>\n                <div class=\"name\">uni-app</div>\n                <div class=\"code-name\">&amp;#xe602;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe752;</span>\n                <div class=\"name\">lucky</div>\n                <div class=\"code-name\">&amp;#xe752;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe719;</span>\n                <div class=\"name\">ctyun</div>\n                <div class=\"code-name\">&amp;#xe719;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe748;</span>\n                <div class=\"name\">雷池</div>\n                <div class=\"code-name\">&amp;#xe748;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe610;</span>\n                <div class=\"name\">华为</div>\n                <div class=\"code-name\">&amp;#xe610;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe603;</span>\n                <div class=\"name\">qiniuyun</div>\n                <div class=\"code-name\">&amp;#xe603;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe601;</span>\n                <div class=\"name\">aliyun</div>\n                <div class=\"code-name\">&amp;#xe601;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe747;</span>\n                <div class=\"name\">腾讯云</div>\n                <div class=\"code-name\">&amp;#xe747;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe605;</span>\n                <div class=\"name\">doge</div>\n                <div class=\"code-name\">&amp;#xe605;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe600;</span>\n                <div class=\"name\">bt</div>\n                <div class=\"code-name\">&amp;#xe600;</div>\n              </li>\n          \n          </ul>\n          <div class=\"article markdown\">\n          <h2 id=\"unicode-\">Unicode 引用</h2>\n          <hr>\n\n          <p>Unicode 是字体在网页端最原始的应用方式，特点是：</p>\n          <ul>\n            <li>支持按字体的方式去动态调整图标大小，颜色等等。</li>\n            <li>默认情况下不支持多色，直接添加多色图标会自动去色。</li>\n          </ul>\n          <blockquote>\n            <p>注意：新版 iconfont 支持两种方式引用多色图标：SVG symbol 引用方式和彩色字体图标模式。（使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。）</p>\n          </blockquote>\n          <p>Unicode 使用步骤如下：</p>\n          <h3 id=\"-font-face\">第一步：拷贝项目下面生成的 <code>@font-face</code></h3>\n<pre><code class=\"language-css\"\n>@font-face {\n  font-family: 'iconfont';\n  src: url('iconfont.svg?t=1743267254898#iconfont') format('svg');\n}\n</code></pre>\n          <h3 id=\"-iconfont-\">第二步：定义使用 iconfont 的样式</h3>\n<pre><code class=\"language-css\"\n>.iconfont {\n  font-family: \"iconfont\" !important;\n  font-size: 16px;\n  font-style: normal;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n</code></pre>\n          <h3 id=\"-\">第三步：挑选相应图标并获取字体编码，应用于页面</h3>\n<pre>\n<code class=\"language-html\"\n>&lt;span class=\"iconfont\"&gt;&amp;#x33;&lt;/span&gt;\n</code></pre>\n          <blockquote>\n            <p>\"iconfont\" 是你项目下的 font-family。可以通过编辑项目查看，默认是 \"iconfont\"。</p>\n          </blockquote>\n          </div>\n      </div>\n      <div class=\"content font-class\">\n        <ul class=\"icon_lists dib-box\">\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-cdn\"></span>\n            <div class=\"name\">\n              cdn\n            </div>\n            <div class=\"code-name\">.icon-cdn\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-jdcloud\"></span>\n            <div class=\"name\">\n              京东云\n            </div>\n            <div class=\"code-name\">.icon-jdcloud\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-volcengine\"></span>\n            <div class=\"name\">\n              volcengine\n            </div>\n            <div class=\"code-name\">.icon-volcengine\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-upyun\"></span>\n            <div class=\"name\">\n              upyun\n            </div>\n            <div class=\"code-name\">.icon-upyun\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-plesk\"></span>\n            <div class=\"name\">\n              plesk_\n            </div>\n            <div class=\"code-name\">.icon-plesk\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-yizhifu\"></span>\n            <div class=\"name\">\n              易支付-01\n            </div>\n            <div class=\"code-name\">.icon-yizhifu\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-onepanel\"></span>\n            <div class=\"name\">\n              1Panel\n            </div>\n            <div class=\"code-name\">.icon-onepanel\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-xibushuma\"></span>\n            <div class=\"name\">\n              西部数码\n            </div>\n            <div class=\"code-name\">.icon-xibushuma\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-qnap\"></span>\n            <div class=\"name\">\n              qnap\n            </div>\n            <div class=\"code-name\">.icon-qnap\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-proxmox\"></span>\n            <div class=\"name\">\n              proxmox\n            </div>\n            <div class=\"code-name\">.icon-proxmox\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-aws\"></span>\n            <div class=\"name\">\n              aws\n            </div>\n            <div class=\"code-name\">.icon-aws\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-uniapp\"></span>\n            <div class=\"name\">\n              uni-app\n            </div>\n            <div class=\"code-name\">.icon-uniapp\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-lucky\"></span>\n            <div class=\"name\">\n              lucky\n            </div>\n            <div class=\"code-name\">.icon-lucky\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-ctyun\"></span>\n            <div class=\"name\">\n              ctyun\n            </div>\n            <div class=\"code-name\">.icon-ctyun\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-safeline\"></span>\n            <div class=\"name\">\n              雷池\n            </div>\n            <div class=\"code-name\">.icon-safeline\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-huawei\"></span>\n            <div class=\"name\">\n              华为\n            </div>\n            <div class=\"code-name\">.icon-huawei\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-qiniuyun\"></span>\n            <div class=\"name\">\n              qiniuyun\n            </div>\n            <div class=\"code-name\">.icon-qiniuyun\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-aliyun\"></span>\n            <div class=\"name\">\n              aliyun\n            </div>\n            <div class=\"code-name\">.icon-aliyun\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-tencentcloud\"></span>\n            <div class=\"name\">\n              腾讯云\n            </div>\n            <div class=\"code-name\">.icon-tencentcloud\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-dogecloud\"></span>\n            <div class=\"name\">\n              doge\n            </div>\n            <div class=\"code-name\">.icon-dogecloud\n            </div>\n          </li>\n          \n          <li class=\"dib\">\n            <span class=\"icon iconfont icon-bt\"></span>\n            <div class=\"name\">\n              bt\n            </div>\n            <div class=\"code-name\">.icon-bt\n            </div>\n          </li>\n          \n        </ul>\n        <div class=\"article markdown\">\n        <h2 id=\"font-class-\">font-class 引用</h2>\n        <hr>\n\n        <p>font-class 是 Unicode 使用方式的一种变种，主要是解决 Unicode 书写不直观，语意不明确的问题。</p>\n        <p>与 Unicode 使用方式相比，具有如下特点：</p>\n        <ul>\n          <li>相比于 Unicode 语意明确，书写更直观。可以很容易分辨这个 icon 是什么。</li>\n          <li>因为使用 class 来定义图标，所以当要替换图标时，只需要修改 class 里面的 Unicode 引用。</li>\n        </ul>\n        <p>使用步骤如下：</p>\n        <h3 id=\"-fontclass-\">第一步：引入项目下面生成的 fontclass 代码：</h3>\n<pre><code class=\"language-html\">&lt;link rel=\"stylesheet\" href=\"./iconfont.css\"&gt;\n</code></pre>\n        <h3 id=\"-\">第二步：挑选相应图标并获取类名，应用于页面：</h3>\n<pre><code class=\"language-html\">&lt;span class=\"iconfont icon-xxx\"&gt;&lt;/span&gt;\n</code></pre>\n        <blockquote>\n          <p>\"\n            iconfont\" 是你项目下的 font-family。可以通过编辑项目查看，默认是 \"iconfont\"。</p>\n        </blockquote>\n      </div>\n      </div>\n      <div class=\"content symbol\">\n          <ul class=\"icon_lists dib-box\">\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-cdn\"></use>\n                </svg>\n                <div class=\"name\">cdn</div>\n                <div class=\"code-name\">#icon-cdn</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-jdcloud\"></use>\n                </svg>\n                <div class=\"name\">京东云</div>\n                <div class=\"code-name\">#icon-jdcloud</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-volcengine\"></use>\n                </svg>\n                <div class=\"name\">volcengine</div>\n                <div class=\"code-name\">#icon-volcengine</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-upyun\"></use>\n                </svg>\n                <div class=\"name\">upyun</div>\n                <div class=\"code-name\">#icon-upyun</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-plesk\"></use>\n                </svg>\n                <div class=\"name\">plesk_</div>\n                <div class=\"code-name\">#icon-plesk</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-yizhifu\"></use>\n                </svg>\n                <div class=\"name\">易支付-01</div>\n                <div class=\"code-name\">#icon-yizhifu</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-onepanel\"></use>\n                </svg>\n                <div class=\"name\">1Panel</div>\n                <div class=\"code-name\">#icon-onepanel</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-xibushuma\"></use>\n                </svg>\n                <div class=\"name\">西部数码</div>\n                <div class=\"code-name\">#icon-xibushuma</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-qnap\"></use>\n                </svg>\n                <div class=\"name\">qnap</div>\n                <div class=\"code-name\">#icon-qnap</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-proxmox\"></use>\n                </svg>\n                <div class=\"name\">proxmox</div>\n                <div class=\"code-name\">#icon-proxmox</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-aws\"></use>\n                </svg>\n                <div class=\"name\">aws</div>\n                <div class=\"code-name\">#icon-aws</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-uniapp\"></use>\n                </svg>\n                <div class=\"name\">uni-app</div>\n                <div class=\"code-name\">#icon-uniapp</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-lucky\"></use>\n                </svg>\n                <div class=\"name\">lucky</div>\n                <div class=\"code-name\">#icon-lucky</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-ctyun\"></use>\n                </svg>\n                <div class=\"name\">ctyun</div>\n                <div class=\"code-name\">#icon-ctyun</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-safeline\"></use>\n                </svg>\n                <div class=\"name\">雷池</div>\n                <div class=\"code-name\">#icon-safeline</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-huawei\"></use>\n                </svg>\n                <div class=\"name\">华为</div>\n                <div class=\"code-name\">#icon-huawei</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-qiniuyun\"></use>\n                </svg>\n                <div class=\"name\">qiniuyun</div>\n                <div class=\"code-name\">#icon-qiniuyun</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-aliyun\"></use>\n                </svg>\n                <div class=\"name\">aliyun</div>\n                <div class=\"code-name\">#icon-aliyun</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-tencentcloud\"></use>\n                </svg>\n                <div class=\"name\">腾讯云</div>\n                <div class=\"code-name\">#icon-tencentcloud</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-dogecloud\"></use>\n                </svg>\n                <div class=\"name\">doge</div>\n                <div class=\"code-name\">#icon-dogecloud</div>\n            </li>\n          \n            <li class=\"dib\">\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\n                  <use xlink:href=\"#icon-bt\"></use>\n                </svg>\n                <div class=\"name\">bt</div>\n                <div class=\"code-name\">#icon-bt</div>\n            </li>\n          \n          </ul>\n          <div class=\"article markdown\">\n          <h2 id=\"symbol-\">Symbol 引用</h2>\n          <hr>\n\n          <p>这是一种全新的使用方式，应该说这才是未来的主流，也是平台目前推荐的用法。相关介绍可以参考这篇<a href=\"\">文章</a>\n            这种用法其实是做了一个 SVG 的集合，与另外两种相比具有如下特点：</p>\n          <ul>\n            <li>支持多色图标了，不再受单色限制。</li>\n            <li>通过一些技巧，支持像字体那样，通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>\n            <li>兼容性较差，支持 IE9+，及现代浏览器。</li>\n            <li>浏览器渲染 SVG 的性能一般，还不如 png。</li>\n          </ul>\n          <p>使用步骤如下：</p>\n          <h3 id=\"-symbol-\">第一步：引入项目下面生成的 symbol 代码：</h3>\n<pre><code class=\"language-html\">&lt;script src=\"./iconfont.js\"&gt;&lt;/script&gt;\n</code></pre>\n          <h3 id=\"-css-\">第二步：加入通用 CSS 代码（引入一次就行）：</h3>\n<pre><code class=\"language-html\">&lt;style&gt;\n.icon {\n  width: 1em;\n  height: 1em;\n  vertical-align: -0.15em;\n  fill: currentColor;\n  overflow: hidden;\n}\n&lt;/style&gt;\n</code></pre>\n          <h3 id=\"-\">第三步：挑选相应图标并获取类名，应用于页面：</h3>\n<pre><code class=\"language-html\">&lt;svg class=\"icon\" aria-hidden=\"true\"&gt;\n  &lt;use xlink:href=\"#icon-xxx\"&gt;&lt;/use&gt;\n&lt;/svg&gt;\n</code></pre>\n          </div>\n      </div>\n\n    </div>\n  </div>\n  <script>\n  $(document).ready(function () {\n      $('.tab-container .content:first').show()\n\n      $('#tabs li').click(function (e) {\n        var tabContent = $('.tab-container .content')\n        var index = $(this).index()\n\n        if ($(this).hasClass('active')) {\n          return\n        } else {\n          $('#tabs li').removeClass('active')\n          $(this).addClass('active')\n\n          tabContent.hide().eq(index).fadeIn()\n        }\n      })\n    })\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "packages/ui/certd-client/public/static/icons/iconfont.css",
    "content": "@font-face {\n  font-family: \"iconfont\"; /* Project id 4688792 */\n  src: url('iconfont.svg?t=1743267254898#iconfont') format('svg');\n}\n\n.iconfont {\n  font-family: \"iconfont\" !important;\n  font-size: 16px;\n  font-style: normal;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-cdn:before {\n  content: \"\\e6e4\";\n}\n\n.icon-jdcloud:before {\n  content: \"\\e653\";\n}\n\n.icon-volcengine:before {\n  content: \"\\e651\";\n}\n\n.icon-upyun:before {\n  content: \"\\e62f\";\n}\n\n.icon-plesk:before {\n  content: \"\\ecc0\";\n}\n\n.icon-yizhifu:before {\n  content: \"\\e741\";\n}\n\n.icon-onepanel:before {\n  content: \"\\e606\";\n}\n\n.icon-xibushuma:before {\n  content: \"\\e73c\";\n}\n\n.icon-qnap:before {\n  content: \"\\e607\";\n}\n\n.icon-proxmox:before {\n  content: \"\\e9cc\";\n}\n\n.icon-aws:before {\n  content: \"\\e604\";\n}\n\n.icon-uniapp:before {\n  content: \"\\e602\";\n}\n\n.icon-lucky:before {\n  content: \"\\e752\";\n}\n\n.icon-ctyun:before {\n  content: \"\\e719\";\n}\n\n.icon-safeline:before {\n  content: \"\\e748\";\n}\n\n.icon-huawei:before {\n  content: \"\\e610\";\n}\n\n.icon-qiniuyun:before {\n  content: \"\\e603\";\n}\n\n.icon-aliyun:before {\n  content: \"\\e601\";\n}\n\n.icon-tencentcloud:before {\n  content: \"\\e747\";\n}\n\n.icon-dogecloud:before {\n  content: \"\\e605\";\n}\n\n.icon-bt:before {\n  content: \"\\e600\";\n}\n\n"
  },
  {
    "path": "packages/ui/certd-client/public/static/icons/iconfont.js",
    "content": "window._iconfont_svg_string_4688792='<svg><symbol id=\"icon-cdn\" viewBox=\"0 0 1024 1024\"><path d=\"M811.8272 125.88373333c15.83786667 0 31.67573333 2.18453333 46.42133333 7.09973334 7.64586667 2.18453333 14.7456 5.46133333 21.84533334 9.28426666s13.65333333 7.64586667 20.20693333 12.56106667c12.56106667 9.8304 22.39146667 21.2992 29.4912 33.31413333 6.5536 11.4688 10.92266667 24.576 12.01493333 38.22933334 1.09226667 13.1072-1.09226667 26.76053333-6.00746666 38.77546666-5.46133333 13.1072-14.19946667 25.12213333-25.12213334 34.4064-6.00746667 4.9152-12.01493333 9.8304-19.11466666 13.65333334-6.5536 3.82293333-14.19946667 7.09973333-21.2992 9.8304-7.64586667 2.73066667-15.29173333 4.36906667-22.9376 6.00746666-12.01493333 2.18453333-23.48373333 2.18453333-35.49866667 1.6384-11.4688-1.09226667-22.9376-3.2768-33.86026667-6.5536L675.84 412.60373333c7.09973333 11.4688 12.56106667 22.9376 16.384 35.49866667 7.64586667 24.576 7.64586667 50.7904 0.54613333 75.3664-3.82293333 13.1072-9.28426667 25.12213333-16.384 36.59093333l109.22666667 93.3888c12.56106667-4.9152 26.2144-8.192 39.86773333-9.28426666 13.1072-1.09226667 26.2144-0.54613333 39.3216 1.6384 17.47626667 2.73066667 33.86026667 8.73813333 49.152 17.47626666 7.64586667 4.36906667 15.29173333 9.28426667 21.84533334 15.29173334 13.1072 10.92266667 24.576 24.576 32.22186666 39.86773333 7.64586667 14.7456 12.01493333 30.03733333 13.1072 45.8752s-1.09226667 31.67573333-6.5536 46.42133333c-6.00746667 15.83786667-15.29173333 30.03733333-27.30666666 41.50613334-6.5536 6.00746667-13.1072 11.4688-20.75306667 16.384-7.64586667 4.9152-15.29173333 8.73813333-23.48373333 11.4688-8.192 3.2768-16.93013333 5.46133333-25.12213334 7.09973333-35.49866667 6.00746667-72.63573333-0.54613333-103.76533333-18.56853333-8.192-4.9152-15.29173333-10.37653333-22.39146667-16.384-10.92266667-9.8304-20.20693333-20.75306667-27.30666666-33.86026667-6.5536-11.4688-11.4688-24.576-13.65333334-37.6832-2.18453333-12.56106667-2.18453333-25.66826667-0.54613333-38.77546667 2.18453333-12.56106667 6.5536-25.12213333 13.1072-36.59093333l-104.8576-91.20426667c-7.64586667 4.36906667-15.29173333 8.192-23.48373333 11.4688s-16.384 6.00746667-24.576 8.192c-16.93013333 4.36906667-34.4064 6.5536-51.33653334 6.5536-14.7456 0-28.94506667-1.6384-43.69066666-4.36906666-14.19946667-3.2768-27.8528-7.64586667-40.96-13.65333334l-112.50346667 98.304c4.36906667 10.92266667 6.5536 22.39146667 7.09973333 33.86026667 0.54613333 11.4688-0.54613333 23.48373333-3.2768 34.95253333-3.2768 12.01493333-7.64586667 22.9376-14.19946666 33.31413334-7.09973333 10.92266667-15.29173333 21.2992-25.12213334 30.03733333-7.09973333 6.00746667-14.19946667 11.4688-22.39146666 16.384-31.1296 18.56853333-68.26666667 25.12213333-103.76533334 18.56853333-8.73813333-1.6384-16.93013333-3.82293333-25.12213333-7.09973333-8.192-3.2768-15.83786667-7.09973333-23.48373333-11.4688-7.64586667-4.9152-14.19946667-10.37653333-20.75306667-16.384-12.01493333-11.4688-21.2992-25.66826667-27.30666667-41.50613333-5.46133333-14.7456-7.64586667-30.58346667-6.5536-46.42133334 1.09226667-15.83786667 5.46133333-31.1296 13.1072-45.8752 8.192-15.29173333 19.11466667-28.94506667 32.22186667-39.86773333 13.65333333-11.4688 29.4912-20.20693333 45.8752-26.2144 21.84533333-7.64586667 45.32906667-10.37653333 68.8128-7.64586667 12.01493333 1.6384 23.48373333 4.36906667 34.4064 8.73813334 5.46133333 2.18453333 10.92266667 4.36906667 16.384 7.64586666l103.76533333-89.56586666c-9.8304-12.56106667-17.47626667-26.76053333-22.9376-42.05226667-9.8304-28.94506667-9.28426667-60.07466667 1.09226667-89.01973333 5.46133333-14.7456 13.1072-28.39893333 22.9376-40.96l-95.0272-81.92c-9.8304 4.36906667-19.6608 7.64586667-30.03733333 9.8304-18.0224 3.82293333-37.13706667 4.36906667-55.15946667 1.09226666-7.64586667-1.09226667-15.83786667-3.2768-22.9376-6.00746666-7.64586667-2.73066667-14.7456-6.00746667-21.2992-9.8304s-13.1072-8.192-19.11466667-13.65333334c-10.92266667-9.28426667-19.6608-21.2992-25.12213333-34.4064-4.9152-12.01493333-7.09973333-25.66826667-6.00746667-38.77546666 1.09226667-13.1072 4.9152-26.2144 12.01493334-38.22933334 7.64586667-13.1072 17.47626667-24.02986667 29.4912-33.31413333 6.5536-4.9152 13.1072-9.28426667 20.20693333-12.56106667 7.09973333-3.82293333 14.19946667-6.5536 21.84533333-9.28426666 14.7456-4.9152 30.58346667-7.09973333 46.42133334-7.09973334 7.64586667 0 15.83786667 0.54613333 23.48373333 1.6384 7.64586667 1.09226667 15.29173333 3.2768 22.39146667 5.46133334s14.19946667 5.46133333 20.75306666 9.28426666 13.1072 7.64586667 18.56853334 12.56106667c8.73813333 7.64586667 15.83786667 15.83786667 21.2992 25.12213333 10.92266667 17.47626667 14.7456 38.22933333 10.92266666 58.43626667-1.6384 10.37653333-5.46133333 20.20693333-10.92266666 29.4912l98.85013333 84.10453333c20.20693333-9.28426667 42.05226667-15.83786667 63.8976-18.0224 24.576-2.73066667 49.69813333-1.09226667 74.27413333 5.46133334 8.192 2.18453333 16.93013333 4.9152 24.576 8.192 8.192 3.2768 15.83786667 7.09973333 23.48373334 11.4688l92.84266666-79.73546667c-7.64586667-9.28426667-13.1072-20.20693333-16.384-31.67573333-3.2768-10.92266667-4.36906667-22.39146667-3.2768-33.31413334s4.36906667-21.84533333 10.37653334-32.22186666c6.00746667-10.92266667 13.65333333-20.20693333 22.9376-27.8528 6.00746667-4.9152 12.01493333-9.28426667 18.56853333-12.56106667 6.5536-3.82293333 13.65333333-6.5536 20.75306667-9.28426667 7.09973333-2.18453333 14.7456-4.36906667 22.39146666-5.46133333 8.73813333-0.54613333 16.384-1.09226667 24.02986667-1.09226667z\" fill=\"#2B85FB\" ></path></symbol><symbol id=\"icon-jdcloud\" viewBox=\"0 0 2030 1024\"><path d=\"M1764.51566871 421.533168c17.64905493 24.68399253 30.85499092 58.192512 29.37395094 128.4184704-19.8706144 220.4897632-207.03698667 359.70748053-393.4011296 359.70748053-201.66821867 0-343.66288533-145.1418752-429.06949974-307.31570666C951.23982659 564.0215136 936.61456151 521.25649706 922.85323566 484.23050881c-26.96726187 36.65572906-83.80215467 96.4527008-112.74413547 124.28390186A715.83578133 715.83578133 0 0 0 878.36033859 749.5834272c22.77098347 35.48323947 80.222976 115.76792427 162.35896106 179.32920533 74.66907733 57.57541227 146.31436586 92.935232 227.33957013 113.11439574a555.01957013 555.01957013 0 0 0 403.52156693-56.89660266c146.56120532-83.98728427 249.86371413-238.69420693 268.56183787-399.32528854-36.1003392-59.85868159-114.3485952-130.57832-175.62660587-164.27196907zM531.48853486 363.09381547a271.89417707 271.89417707 0 0 1 144.4630656 41.40739733c34.74271893-37.02598827 65.47429013-75.28617707 97.37835093-113.8549152A421.60259093 421.60259093 0 0 0 109.70081326 636.03706239a424.50296 424.50296 0 0 0 4.99850879 64.8571904c11.78660693 14.5635552 130.51661014 4.6899584 149.02960427-11.97173652a275.90532587 275.90532587 0 0 1-5.18363841-52.88545388 272.94324694 272.94324694 0 0 1 272.94324695-272.94324692zM531.48853486 1058.13333333a421.72601173 421.72601173 0 0 1-365.19966827-210.92471573c5.67731839-7.5286176 138.35377813-22.27730347 170.01099732-20.48771413a272.0175968 272.0175968 0 0 0 195.18867095 82.25940586s167.8511488 12.8973856 324.71792106-111.07796692c0 0 58.9947424 84.04899413 104.28986773 115.64450452 0 0-147.91882454 144.5864864-429.00778879 144.5864864z\" fill=\"#E1251B\" ></path><path d=\"M1623.38494125 14.00045227C1424.12341271-69.73999253 1229.73697218-45.30283947 1037.63379991 95.8895968 868.23990232 220.35862933 800.85260311 345.75331093 692.48987565 453.37551787c-129.59096 128.72702081-226.78418027 172.0474272-303.85994773 201.17453867-79.6058752 30.1144704-190.68384212 50.6638944-273.93060587 46.09735573a422.58995093 422.58995093 0 0 0 51.58954454 146.31436586c212.52917548-3.64088853 362.36100906-84.97464427 458.99883947-143.9076768 84.48096427-51.52783467 211.60352533-181.30392427 278.31201492-265.3529184 107.1902368-134.8980192 246.83992427-263.93358933 374.51787627-304.4153376 178.34184533-56.46463253 351.7468928 22.52414293 435.79588693 134.09578881 7.5286176 9.81188693 165.13590933 66.39994027 214.689024 108.9798272C1910.39806446 299.10056533 1824.49777005 98.5431264 1623.38494125 14.00045227z\" fill=\"#E1251B\" ></path><path d=\"M1923.97425966 359.32950613A565.88052694 565.88052694 0 0 0 1602.15670766 255.90357867c-139.52626773 0-279.23766507 54.36649387-377.54166401 151.18945387-71.52186773 70.34937812-106.3262976 127.43111147-185.62362346 222.52619199a648.94216213 648.94216213 0 0 0 105.40064746 123.4199616c10.24385707-14.93381547 67.88097921-96.51441067 111.07796587-153.8429824 55.53898347-72.94119787 111.94190613-131.2571296 197.47194027-165.0124896a398.27621867 398.27621867 0 0 1 486.39807147 158.5329408A552.98314133 552.98314133 0 0 0 1923.97425966 359.32950613z\" fill=\"#E1251B\" ></path></symbol><symbol id=\"icon-volcengine\" viewBox=\"0 0 1024 1024\"><path d=\"M836.395 475.861L709.973 970.155a8.661 8.661 0 0 0 0 4.138 9.216 9.216 0 0 0 9.174 7.04H971.86a9.216 9.216 0 0 0 9.216-11.178L854.06 475.86a9.301 9.301 0 0 0-14.379-4.736 8.96 8.96 0 0 0-3.328 4.694M140.8 587.86L42.88 970.155a9.173 9.173 0 0 0 9.259 11.136h195.029a9.344 9.344 0 0 0 7.381-3.328 8.917 8.917 0 0 0 1.792-3.67 8.661 8.661 0 0 0 0.043-4.138L158.379 587.86a8.96 8.96 0 0 0-3.328-4.65 9.387 9.387 0 0 0-5.419-1.792 9.387 9.387 0 0 0-5.547 1.792 8.96 8.96 0 0 0-3.285 4.65\" fill=\"#00E5E5\" ></path><path d=\"M313.43 271.36L135.082 970.155a8.96 8.96 0 0 0 1.706 7.594 9.088 9.088 0 0 0 7.04 3.542H500.65a9.216 9.216 0 0 0 9.258-11.094L331.051 271.275a8.96 8.96 0 0 0-3.328-4.651 9.387 9.387 0 0 0-5.462-1.792 9.387 9.387 0 0 0-5.504 1.792 8.96 8.96 0 0 0-3.328 4.693\" fill=\"#006EFF\" ></path><path d=\"M621.141 49.11a8.96 8.96 0 0 0-3.328-4.651 9.387 9.387 0 0 0-5.504-1.792 9.387 9.387 0 0 0-5.461 1.792 8.96 8.96 0 0 0-3.328 4.65L359.723 970.155a9.173 9.173 0 0 0 9.216 11.093h487.253a9.344 9.344 0 0 0 7.339-3.328 9.472 9.472 0 0 0 1.877-3.67 9.173 9.173 0 0 0 0-4.095L621.141 49.109z\" fill=\"#006EFF\" ></path><path d=\"M442.027 372.95L287.36 970.111a8.832 8.832 0 0 0 1.835 7.85 9.216 9.216 0 0 0 7.381 3.371h308.608a9.387 9.387 0 0 0 7.424-3.413 9.301 9.301 0 0 0 1.835-7.808L459.648 372.907a8.96 8.96 0 0 0-3.328-4.608 9.387 9.387 0 0 0-5.504-1.835 9.387 9.387 0 0 0-5.461 1.835 8.96 8.96 0 0 0-3.328 4.608\" fill=\"#00E5E5\" ></path></symbol><symbol id=\"icon-upyun\" viewBox=\"0 0 1024 1024\"><path d=\"M800.49976344 128.31803094a449.3327025 449.3327025 0 0 0-55.88263125-35.89209657 31.80312375 31.80312375 0 0 0-40.43539969 8.17794657L584.23852344 259.16516844l-6.81495469 12.26691843a65.87789906 65.87789906 0 0 1-55.42830094 25.89682969h-23.62517812a213.98958844 213.98958844 0 0 0-200.35967813 224.89351594 23.62517719 23.62517719 0 0 0 13.62991031 20.444865 56.33696156 56.33696156 0 1 1-77.23615687 67.24089v-3.6346425a56.79129188 56.79129188 0 0 1 10.9039275-45.43303406 34.52910562 34.52910562 0 0 0 7.26928594-24.98816813 261.69427312 261.69427312 0 0 1 259.42262156-284.41079062 48.61334625 48.61334625 0 0 0 38.61807844-19.53620438l110.40227156-146.74869844a19.99053469 19.99053469 0 0 0-10.9039275-31.80312375A479.77283438 479.77283438 0 0 0 278.9285375 931.57406563a31.80312375 31.80312375 0 0 0 40.88973-8.63227688L441.1244675 763.92617094l8.17794656-11.35825782a66.33222937 66.33222937 0 0 1 55.42830094-25.89682968 204.90298125 204.90298125 0 0 0 23.62517719 0 215.80690969 215.80690969 0 0 0 157.65262687-84.95977219 211.71793688 211.71793688 0 0 0 42.70705125-139.93374375 23.62517719 23.62517719 0 0 0-13.62991031-20.444865 56.33696156 56.33696156 0 0 1-33.620445-40.43539969 56.33696156 56.33696156 0 0 1 109.94794125-25.44249937 13.17558 13.17558 0 0 0 0 4.08897281 57.24562219 57.24562219 0 0 1-10.9039275 45.43303406 34.52910562 34.52910562 0 0 0-7.26928594 24.98816813 261.69427312 261.69427312 0 0 1-259.42262156 284.41079062 48.61334625 48.61334625 0 0 0-38.61807844 19.53620438L365.70563187 940.66067187a20.444865 20.444865 0 0 0 10.44959813 31.80312376 480.22716562 480.22716562 0 0 0 424.34453344-844.14576469z\" fill=\"#009FFF\" ></path></symbol><symbol id=\"icon-plesk\" viewBox=\"0 0 2467 1024\"><path d=\"M716.94258931 0.069765V684.04729h68.439611V0zM1987.15666431 1.046477v683.070578h68.369846V1.177287z m68.369846 430.930607L2286.10905031 684.04729h94.810838L2141.47717431 430.032381 2381.81811431 195.551714h-91.810937zM1682.70155231 186.761305c-49.882082 0-90.415634 11.65078-121.870996 35.161635q-46.986828 35.161635-46.951945 99.554868c0 24.199786 4.534735 44.091574 13.735014 59.718968a123.499576 123.499576 0 0 0 35.37093 38.588849 201.316059 201.316059 0 0 0 48.556544 24.836393c18.069174 6.488159 36.277878 12.487962 54.905173 17.659303a999.135047 999.135047 0 0 1 46.533355 14.171046 172.450729 172.450729 0 0 1 38.859188 18.069174 87.335066 87.335066 0 0 1 26.580522 25.88287q9.732238 15.17392 9.697355 37.673181c0 19.534242-8.860174 36.068582-26.580521 49.742552-17.659303 13.673969-44.998521 20.580719-81.834521 20.580719q-84.973952 0-138.134995-68.369847l-53.230809 46.87346c26.580522 29.301363 54.905173 50.230908 84.904186 63.067695 29.929249 12.627492 64.462998 18.9674 103.252421 18.9674a263.165044 263.165044 0 0 0 71.230218-9.278765 175.136687 175.136687 0 0 0 58.2539-27.688044l-0.488356 0.348826a134.548631 134.548631 0 0 0 38.998718-44.4404 123.211794 123.211794 0 0 0 14.232091-59.518393c0-24.199786-4.74403-44.091574-14.232091-60.067794a136.449731 136.449731 0 0 0-36.975529-40.254491l-0.418591-0.27906a207.96119 207.96119 0 0 0-49.254195-26.379948l-1.465068-0.488356c-9.836886-4.116144-28.18512-10.604303-46.672885-16.67387l-8.581114-2.441781q-22.499261-6.802102-43.463688-14.171046a184.546261 184.546261 0 0 1-37.742946-17.580817l0.837182 0.488356a86.116356 86.116356 0 0 1-25.394514-23.16203l-0.139531-0.27906a55.225656 55.225656 0 0 1-9.697355-31.394318v-1.813893a59.891201 59.891201 0 0 1 20.929544-46.87346c13.95303-12.348431 38.440597-18.627295 73.183642-18.627295q40.91726 0 70.602331 15.139037c19.813302 10.115947 38.152816 25.88287 55.253999 47.440302l1.046477 0.906947 50.230908-45.975234q-37.987124-43.952044-79.322975-61.463096a235.913033 235.913033 0 0 0-90.345869-17.659304c-1.526113 0-3.069667 0-4.534735 0.069765h0.218017zM316.42086631 190.598388q-82.043816 0-167.087533 26.440992v709.372039h67.462899V673.373222a487.405496 487.405496 0 0 0 50.79775 10.682789 320.047623 320.047623 0 0 0 51.556445 4.046378 329.08657 329.08657 0 0 0 98.299096-14.929742l-2.30225 0.627887a238.439839 238.439839 0 0 0 83.500163-44.440401q36.626703-30.243192 59.160847-77.23002 22.289965-46.87346 22.394613-112.391656a262.628725 262.628725 0 0 0-18.627295-99.633354 226.263641 226.263641 0 0 0-53.169765-79.113679l-0.069765-0.069765a246.486813 246.486813 0 0 0-81.83452-51.277385l-1.674364-0.558121q-48.870487-18.531368-108.484807-18.627295z m826.57749 0a239.863484 239.863484 0 0 0-85.043717 15.139038 191.080204 191.080204 0 0 0-70.323271 46.533354 222.204181 222.204181 0 0 0-47.440301 77.020725l-0.488356 1.526113q-17.580818 47.405419-17.580818 111.842255a291.786197 291.786197 0 0 0 14.580916 92.857414 231.293272 231.293272 0 0 0 44.021809 78.136967 207.054243 207.054243 0 0 0 73.323172 54.216242q43.952044 20.092363 102.624535 20.092363 63.521169 0 108.484808-19.045886a226.717114 226.717114 0 0 0 79.043914-56.160945l-40.952143-42.992773q-28.464181 31.28967-63.556051 45.417112a203.949694 203.949694 0 0 1-75.485892 14.23209h-2.651075q-77.334668 0-122.228542-48.905369-44.893874-48.870487-47.789127-131.786368h366.406564q1.779011-126.100508-52.812218-191.993691-54.722039-66.032714-162.134207-66.058876z m2.860371 57.695779c24.199786 0 45.277582 3.706274 63.556051 11.232189a122.333189 122.333189 0 0 1 44.4404 29.789719 130.168688 130.168688 0 0 1 26.440992 44.998521 170.763284 170.763284 0 0 1 9.278765 56.649301h-296.153059a197.470255 197.470255 0 0 1 46.184529-102.83383l-0.218017 0.279061c10.325242-11.720545 24.557333-21.417901 42.417211-28.813007 17.929643-7.464871 39.277779-11.162424 64.114173-11.232189z m-823.507823 0.985432q85.915781 0 133.390965 52.393628 47.405419 52.219214 47.440302 137.228049c0 61.323566-17.223271 108.353998-51.34715 141.204662q-51.382033 49.393726-138.204761 49.31524a225.391576 225.391576 0 0 1-48.347249-5.302151 434.560575 434.560575 0 0 1-51.556445-14.171046l3.139432 0.976712V264.976758a260.609896 260.609896 0 0 1 51.835506-12.278666 424.403205 424.403205 0 0 1 53.6494-3.348727z m221.085758 612.808352v64.393233h411.396365v-64.393233z\" fill=\"#52BBE6\" ></path></symbol><symbol id=\"icon-yizhifu\" viewBox=\"0 0 1024 1024\"><path d=\"M398.10844445 277.504h215.95022222c66.78755555 0 117.76-152.34844445 117.76-152.34844445 0-45.62488889-4.32355555-80.21333333-78.50666667-82.60266666-74.18311111-2.38933333-91.93244445 54.49955555-145.29422222 54.49955556-54.61333333 0-81.92-44.82844445-149.16266667-54.61333334-67.24266667-9.67111111-78.50666667 36.97777778-78.50666666 82.60266667 0 0.11377778 50.85866667 152.46222222 117.76 152.46222222zM625.89155555 324.608H398.10844445c-252.24533333 0-314.14044445 520.98844445-314.14044445 520.98844445 0 68.49422222 52.67911111 137.216 117.76 137.216h620.43022222c65.08088889 0 117.76-68.72177778 117.76-137.216 0.11377778 0-61.89511111-520.98844445-314.02666667-520.98844445zM645.12 593.00977778c19.91111111 0 36.06755555 16.15644445 36.06755555 36.06755555s-16.15644445 36.06755555-36.06755555 36.06755556h-77.71022222v35.38488889H645.12c19.91111111 0 36.06755555 16.15644445 36.06755555 36.06755555s-16.15644445 36.06755555-36.06755555 36.06755556h-77.71022222v99.78311111c0 19.91111111-16.15644445 36.06755555-36.06755556 36.06755555s-36.06755555-16.15644445-36.06755555-36.06755555v-99.78311111H417.56444445c-19.91111111 0-36.06755555-16.15644445-36.06755556-36.06755556s16.15644445-36.06755555 36.06755556-36.06755555h77.71022222v-35.38488889H417.56444445c-19.91111111 0-36.06755555-16.15644445-36.06755556-36.06755556s16.15644445-36.06755555 36.06755556-36.06755555h29.58222222l-55.06844445-55.52355556c-13.99466667-14.10844445-13.88088889-36.97777778 0.22755556-50.97244444 14.10844445-13.99466667 36.97777778-13.88088889 50.97244444 0.22755555l88.63288889 89.31555556 88.63288889-89.31555556c13.99466667-14.10844445 36.864-14.22222222 50.97244445-0.22755555 14.10844445 13.99466667 14.22222222 36.864 0.22755555 50.97244444L616.67555555 593.00977778h28.44444445z m192.73955555 324.15288889a48.82204445 48.82204445 0 0 1-48.92444444 0c-15.13244445-8.76088889-24.46222222-24.91733333-24.46222222-42.32533334 0-17.52177778 9.32977778-33.56444445 24.46222222-42.32533333 15.13244445-8.76088889 33.792-8.76088889 48.92444444 0s24.46222222 24.91733333 24.46222223 42.32533333c-0.11377778 17.52177778-9.32977778 33.56444445-24.46222223 42.32533334z\" fill=\"#4067F3\" ></path></symbol><symbol id=\"icon-onepanel\" viewBox=\"0 0 1024 1024\"><path d=\"M69.530864 0h884.938272v1024H69.530864z\" fill=\"#E0E0E0\" fill-opacity=\"0\" ></path><path d=\"M79.560165 259.855802v503.572017l435.09465 250.73251 434.041152-250.73251-1.053498-502.518519-432.987654-250.73251-435.09465 249.679012z\" fill=\"#005EFD\" ></path><path d=\"M93.255638 268.283786v486.716049l422.452675 241.251029 419.292181-242.304527v-485.662551l-421.399177-242.304527-420.345679 242.304527z\" fill=\"#FFFFFF\" ></path><path d=\"M139.609547 294.621235l95.868313 56.888888 371.884774-218.074074-93.761317-53.728395-373.99177 214.913581z\" fill=\"#005EFD\" ></path><path d=\"M139.609547 293.567737v435.09465l243.358025 139.061728 92.707819-55.835391-241.251029-140.115226 1.053498-320.263375-95.868313-57.942386zM791.269663 350.096329v321.780412l95.269925 55.732148V294.364181L645.749992 154.506008 551.527243 210.238156l239.74242 139.858173z\" fill=\"#0854C1\" ></path><path d=\"M420.893498 886.470058l93.339918 56.052411 372.306172-214.692346-94.387094-57.110123L420.893498 886.470058zM385.074568 416.826996h49.88102v280.230453l93.3947 55.835391v-474.074075l-143.27572 81.119342v56.888889z\" fill=\"#005EFD\" ></path><path d=\"M528.350288 752.89284l31.604938-16.855968v-440.362139l-31.604938-16.855968v474.074075z\" fill=\"#0854C1\" ></path></symbol><symbol id=\"icon-xibushuma\" viewBox=\"0 0 1024 1024\"><path d=\"M735.899826 924.582957a467.656348 467.656348 0 0 1-223.944348 56.765217c-81.029565 0-157.295304-20.569043-223.855304-56.765217H735.944348z m111.081739-83.878957c-15.582609 15.894261-32.322783 30.675478-49.997913 44.210087H227.06087a467.166609 467.166609 0 0 1-49.997913-44.210087h669.96313zM912.517565 756.869565c-9.349565 15.36-19.589565 30.052174-30.675478 44.165565H142.157913a475.225043 475.225043 0 0 1-30.675478-44.165565h801.03513z m66.159305-294.956522a467.033043 467.033043 0 0 1-44.432696 255.198609H89.755826a467.033043 467.033043 0 0 1-44.477217-254.664348l138.106434 2.715826 180.313044 201.19374 147.945739-173.100522 183.563131 179.734261 156.850086-211.033044h126.619827zM512 42.651826c204.176696 0 377.856 130.359652 442.412522 312.409044H824.987826l-131.650783 157.161739-177.730782-164.062609-156.493913 165.888L235.52 356.173913H69.186783C133.431652 173.545739 307.46713 42.651826 512 42.651826z\" fill=\"#0070B6\" ></path></symbol><symbol id=\"icon-qnap\" viewBox=\"0 0 1381 1024\"><path d=\"M993.17421228 33.34812781V32.60787125h-29.18968031c-1.09356188 0-2.07776719-0.09253219-3.15450375-0.09253219v0.09253219H375.34560885C174.81166447 32.60787125 74.66666666 113.48095062 74.66666666 275.18504938v445.34030624c0 160.67783344 100.17023437 241.07142844 300.67894219 241.07142844h586.2499125v-0.28600875c199.79368781-0.24394875 299.78726906-80.50295063 299.78726906-240.80224406V275.16822594C1261.36596604 122.27150281 1171.92945885 41.73490343 993.17421228 33.34812781z m-64.16682375 702.22631625H442.76788166V253.54094375h486.23950688v482.03350031z\" fill=\"#27387D\" ></path><path d=\"M635.41977135 611.31220906s369.27048469 212.11728469 446.18991937 380.34910407h287.35431563c-23.82281719-56.48665781-160.77877781-307.76185594-733.544235-380.34910407z\" fill=\"#EC2727\" ></path></symbol><symbol id=\"icon-proxmox\" viewBox=\"0 0 1175 1024\"><path d=\"M258.29505875 44.77893875c-50.04384938 25.38137906-50.04384938 29.3805825-3.20280656 81.722145 259.66731094 289.04251219 321.62159625 357.33353344 326.33970937 357.3335325 6.37117406 0.79209188 366.01318125-392.220015 370.00807969-404.13583219 1.54974469-3.20280656-9.53954156-14.32653188-23.83163438-24.62372625C908.56376281 40.74960219 887.93493406 35.20495906 848.98575219 33.62077531c-73.01020969-4.78699031-98.46046687 11.11942031-188.96449875 112.71381563-41.29209469 46.04464594-76.21194 84.16729781-76.21194 84.16729781-0.79209188 0-34.8864825-37.33163531-75.38648532-82.54544625s-87.33566531-90.60734906-103.20871312-99.32036062c-36.54277219-20.66326688-111.17160469-22.21301156-146.88676969-3.89588625zM91.54464781 161.52532063C52.66326687 176.57614344 32 190.90159813 32 201.99088531c0 5.54464312 61.12883156 77.0406225 134.99893406 158.83272094 74.6288325 81.72214406 134.964495 150.04867969 134.964495 151.63286344 0 1.61431781-61.12883156 69.875205-134.99893406 151.6673025C92.33673969 746.67029469 32.79209187 818.92285156 33.61431781 825.29402563c3.96045938 21.45535875 69.04975031 48.45536063 116.67750375 48.45536062 77.03847-0.82653094 94.49893125-14.32653188 257.28995907-192.95939719 81.72752531-89.71301719 148.46987719-165.96047156 148.46987718-168.33567187 0-3.1683675-65.88138281-77.79612375-146.88031218-166.68261C303.54761281 230.60951 251.99383813 178.98578094 227.332445 167.89649469c-37.29719625-18.28699125-97.63285969-21.45535875-135.72214875-6.336735z m847.97957625 5.51020499c-23.0395425 11.94595125-80.99893031 69.1186275-181.04358094 178.66730438-80.96879625 88.95428813-146.88031219 163.54868156-146.88031218 166.71704906 0 3.20280656 66.70791281 78.62265469 148.498935 168.33567094 162.72215062 178.63286625 180.21705 192.12963844 257.22108187 192.95832094 47.66326875 0 112.71704438-27.00000187 116.71194281-48.45536063 0.79209188-7.16326594-58.78699406-78.62373-133.38031218-160.38031312-73.83566438-81.72214406-134.99893406-150.83969531-134.99893313-152.45831813 0-1.54974469 61.16326969-70.66837313 134.99893313-152.45939531 74.62775625-81.68447719 134.17240313-153.21704813 133.38031218-159.55378219-3.99489844-20.66326688-62.71301531-44.46046219-113.54034656-47.66326968-36.50510438-1.54974469-55.54974937 1.61431781-80.96449125 14.29209375z m-542.30313469 573.33247313C298.7606225 849.16009906 217.76169312 941.21387656 216.17750937 945.17433594c-1.54974469 3.20280656 9.53954156 14.32653188 23.86607344 24.65816531 19.01020594 14.29209281 39.67347281 19.83673594 78.55485282 21.45535875 72.286995 4.71811219 99.21704344-11.94595125 190.54868249-115.16219813 39.67347281-44.46046219 73.83674063-81.72214406 74.6288325-81.72214406s34.95535969 37.29719625 75.45536344 82.54544625C752.10947 980.16413469 776.73857656 995.25047188 848.95239031 991.28786c38.95025813-1.61431781 59.54464781-7.16326594 78.62265375-21.45535875 14.29209281-10.33163344 25.38137906-21.45535875 23.83163438-24.62372625-3.99489844-11.94595125-363.67134469-404.96236313-370.00807969-404.13583312-3.1683675 0-85.7170425 89.71194094-184.17750937 199.29613312z\" fill=\"#E57000\" ></path></symbol><symbol id=\"icon-aws\" viewBox=\"0 0 1710 1024\"><path d=\"M487.73626344 382.24175844c0 19.51648313 2.10988969 35.34065906 5.80219781 46.94505468 4.21978031 11.60439563 9.49450594 24.26373656 16.87912125 37.97802188 2.63736281 4.21978031 3.69230812 8.43956063 3.69230719 12.13186875 0 5.27472563-3.164835 10.54945031-10.02197719 15.824175L470.85714313 517.27472563c-4.7472525 3.164835-9.49450594 4.7472525-13.71428625 4.74725249-5.27472563 0-10.54945031-2.63736281-15.82417594-7.38461531-7.38461531-7.9120875-13.71428531-16.35164813-18.98901094-24.79120875-5.27472563-8.96703281-10.54945031-18.98901094-16.35164812-31.12087969-41.14285687 48.52747219-92.835165 72.79120875-155.07692344 72.79120876-44.30769188 0-79.64835188-12.65934094-105.494505-37.97802188-25.84615406-25.31868094-39.03296719-59.07692344-39.03296719-101.27472469 0-44.835165 15.82417594-81.23076937 48-108.65934093 32.17582406-27.42857156 74.90109844-41.14285687 129.23076938-41.14285688 17.93406563 0 36.39560438 1.5824175 55.9120875 4.21978031 19.51648313 2.63736281 39.56043938 6.85714313 60.65934093 11.60439563v-38.505495c0-40.0879125-8.43956063-68.04395625-24.79120875-84.39560438-16.87912125-16.35164813-45.36263719-24.26373656-85.97802187-24.26373656-18.46153875 0-37.45054969 2.10988969-56.96703281 6.85714313-19.51648313 4.7472525-38.50549406 10.54945031-56.96703282 17.93406562-8.43956063 3.69230812-14.76923062 5.80219781-18.46153875 6.85714313-3.69230812 1.05494531-6.32967 1.5824175-8.43956062 1.5824175-7.38461531 0-11.07692344-5.27472563-11.0769225-16.35164813v-25.84615406c0-8.43956063 1.05494531-14.76923062 3.69230719-18.46153781 2.63736281-3.69230812 7.38461531-7.38461531 14.76923062-11.07692344 18.46153875-9.49450594 40.61538469-17.40659344 66.46153875-23.73626344C248.26373656 42.02197813 275.69230812 38.85714312 304.70329625 38.85714312c62.76923062 0 108.65934094 14.24175844 138.19780219 42.72527438 29.01098906 28.48351687 43.78021969 71.73626344 43.78022062 129.75824156v170.90109938zM273.5824175 462.4175825c17.40659344 0 35.34065906-3.164835 54.32967-9.49450594 18.98901094-6.32967 35.86813219-17.93406563 50.10989063-33.75824156 8.43956063-10.02197813 14.76923062-21.09890156 17.93406562-33.75824156 3.164835-12.65934094 5.27472563-27.95604375 5.27472563-45.89011032v-22.15384593c-15.29670375-3.69230812-31.64835188-6.85714313-48.52747313-8.96703282-16.87912125-2.10988969-33.23076938-3.164835-49.5824175-3.164835-35.34065906 0-61.18681313 6.85714313-78.59340656 21.09890063-17.40659344 14.24175844-25.84615406 34.28571469-25.84615313 60.65934094 0 24.79120875 6.32967 43.2527475 19.51648313 55.9120875 12.65934094 13.18681313 31.12087875 19.51648313 55.38461531 19.51648406z m423.56043937 56.96703281c-9.49450594 0-15.82417594-1.5824175-20.04395531-5.27472562-4.21978031-3.164835-7.9120875-10.54945031-11.07692343-20.57142844L542.06593437 85.80219781c-3.164835-10.54945031-4.7472525-17.40659344-4.74725343-21.09890156 0-8.43956063 4.21978031-13.18681313 12.65934093-13.18681313h51.69230813c10.02197813 0 16.87912125 1.5824175 20.57142844 5.27472563 4.21978031 3.164835 7.38461531 10.54945031 10.54945031 20.57142844l88.61538469 349.18681312 82.28571469-349.18681312c2.63736281-10.54945031 5.80219781-17.40659344 10.02197718-20.57142844 4.21978031-3.164835 11.60439563-5.27472563 21.09890156-5.27472563h42.19780219c10.02197813 0 16.87912125 1.5824175 21.09890063 5.27472563 4.21978031 3.164835 7.9120875 10.54945031 10.02197812 20.57142844l83.34066 353.40659343 91.25274656-353.40659343c3.164835-10.54945031 6.85714313-17.40659344 10.54945125-20.57142844 4.21978031-3.164835 11.07692344-5.27472563 20.57142844-5.27472563h49.05494438c8.43956063 0 13.18681313 4.21978031 13.18681406 13.18681313 0 2.63736281-0.52747219 5.27472563-1.05494531 8.43956062-0.52747219 3.164835-1.5824175 7.38461531-3.69230813 13.18681313l-127.12087875 407.73626437c-3.164835 10.54945031-6.85714313 17.40659344-11.07692344 20.57142844-4.21978031 3.164835-11.07692344 5.27472563-20.04395531 5.27472469h-45.36263812c-10.02197813 0-16.87912125-1.5824175-21.09890063-5.27472469-4.21978031-3.69230812-7.9120875-10.54945031-10.02197812-21.09890156L854.85714312 153.31868094l-81.23076937 339.69230812c-2.63736281 10.54945031-5.80219781 17.40659344-10.02197812 21.09890063-4.21978031 3.69230812-11.60439563 5.27472563-21.09890157 5.27472562h-45.36263718z m677.80219782 14.24175844c-27.42857156 0-54.85714313-3.164835-81.23076938-9.49450594-26.37362625-6.32967-46.94505469-13.18681313-60.65934-21.09890062-8.43956063-4.7472525-14.24175844-10.02197813-16.35164906-14.76923063-2.10988969-4.7472525-3.164835-10.02197813-3.164835-14.76923062v-26.90109938c0-11.07692344 4.21978031-16.35164813 12.13186875-16.35164812 3.164835 0 6.32967 0.52747219 9.494505 1.5824175 3.164835 1.05494531 7.9120875 3.164835 13.18681313 5.27472562 17.93406563 7.9120875 37.45054969 14.24175844 58.02197812 18.46153782 21.09890156 4.21978031 41.67033 6.32967 62.76923063 6.32967093 33.23076938 0 59.07692344-5.80219781 77.01098906-17.40659343 17.93406563-11.60439563 27.42857156-28.48351687 27.42857156-50.10989063 0-14.76923062-4.7472525-26.90109844-14.24175844-36.92307656-9.49450594-10.02197813-27.42857156-18.98901094-53.27472468-27.42857156L1329.5824175 306.28571469c-38.50549406-12.13186781-66.98901094-30.06593437-84.39560438-53.80219782-17.40659344-23.20879125-26.37362625-49.05494531-26.37362625-76.48351687 0-22.15384594 4.7472525-41.67033 14.24175844-58.54945031 9.49450594-16.87912125 22.15384594-31.64835188 37.97802188-43.2527475 15.82417594-12.13186781 33.75824156-21.09890156 54.85714312-27.42857157 21.09890156-6.32967 43.2527475-8.96703281 66.46153781-8.96703281 11.60439563 0 23.73626344 0.52747219 35.34066 2.10988969 12.13186781 1.5824175 23.20879125 3.69230812 34.28571375 5.80219781 10.54945031 2.63736281 20.57142844 5.27472563 30.06593438 8.43956063 9.49450594 3.164835 16.87912125 6.32967 22.15384594 9.49450593 7.38461531 4.21978031 12.65934094 8.43956063 15.82417593 13.18681313 3.164835 4.21978031 4.7472525 10.02197813 4.7472525 17.40659344v24.79120875c0 11.07692344-4.21978031 16.87912125-12.13186781 16.87912031-4.21978031 0-11.07692344-2.10988969-20.04395625-6.32967-30.06593437-13.71428531-63.82417594-20.57142844-101.27472562-20.57142844-30.06593437 0-53.80219781 4.7472525-70.15384594 14.76923063-16.35164813 10.02197813-24.79120875 25.31868094-24.79120875 46.94505468 0 14.76923062 5.27472563 27.42857156 15.82417594 37.45054969 10.54945031 10.02197813 30.06593437 20.04395625 58.02197812 29.01098906l74.90109844 23.73626344c37.97802187 12.13186781 65.40659344 29.01098906 81.7582425 50.63736281 16.35164813 21.62637375 24.26373656 46.4175825 24.26373562 73.84615407 0 22.68131906-4.7472525 43.2527475-13.71428531 61.18681312-9.49450594 17.93406563-22.15384594 33.75824156-38.505495 46.4175825-16.35164813 13.18681313-35.86813219 22.68131906-58.54945031 29.53846125-23.73626344 7.38461531-48.52747219 11.07692344-75.42857156 11.07692344z\" fill=\"#252F3E\" ></path><path d=\"M1474.63736281 789.97802187c-173.53846125 128.17582406-425.67033 196.21978031-642.46153875 196.21978032-303.82417594 0-577.5824175-112.35164812-784.35164812-299.07692344-16.35164813-14.76923062-1.5824175-34.81318687 17.93406562-23.20879125 223.64835188 129.75824156 499.51648313 208.35164812 784.87912125 208.35164906 192.52747219 0 404.04395625-40.0879125 598.68131813-122.37362625 29.01098906-13.18681313 53.80219781 18.98901094 25.31868187 40.08791156z\" fill=\"#FF9900\" ></path><path d=\"M1546.90109844 707.69230813c-22.15384594-28.48351687-146.63736281-13.71428531-203.0769225-6.85714313-16.87912125 2.10988969-19.51648313-12.65934094-4.21978031-23.73626344 99.164835-69.62637375 262.15384594-49.5824175 281.14285687-26.37362718 18.98901094 23.73626344-5.27472563 186.72527438-98.10988969 264.79120875-14.24175844 12.13186781-27.95604375 5.80219781-21.62637375-10.02197719 21.09890156-52.21978031 68.04395625-169.84615406 45.89010938-197.80219781z\" fill=\"#FF9900\" ></path></symbol><symbol id=\"icon-uniapp\" viewBox=\"0 0 1024 1024\"><path d=\"M32 32m48 0l864 0q48 0 48 48l0 864q0 48-48 48l-864 0q-48 0-48-48l0-864q0-48 48-48Z\" fill=\"#2B9939\" ></path><path d=\"M192.00000031 192.00000031v639.99999938h639.99999938V192.00000031H672.00000031v480H351.99999969V192.00000031z\" fill=\"#FFFFFF\" ></path></symbol><symbol id=\"icon-lucky\" viewBox=\"0 0 1024 1024\"><path d=\"M414.03125 792.03125L452 558.03125H288.03125l322.03125-325.96875L572 465.96875h163.96875L414.03125 792.03125zM512 32c-265.96875 0-480 214.03125-480 480s214.03125 480 480 480 480-214.03125 480-480-214.03125-480-480-480z\" fill=\"#1969FF\" ></path></symbol><symbol id=\"icon-ctyun\" viewBox=\"0 0 1097 1024\"><path d=\"M274.33433333 348.599c10.313-15.506 19.968-33.207 31.452-48.713 25.234-33.207 57.856-57.783 95.67-74.46a244.443 244.443 0 0 1 131.658-19.529c40.082 4.608 76.8 18.359 108.763 41.911 16.603 11.995 31.525 26.331 46.373 40.082 2.852 2.853 5.12 4.023 9.728 2.195 18.944-5.12 37.814-7.315 57.27-5.706 31.452 2.853 57.856 16.604 78.995 40.083 19.017 20.626 32.183 44.69 44.105 70.436 1.17 2.268 2.267 5.12 3.438 7.46 41.837 6.291 79.579 21.724 111.177 49.811 36.571 32.11 58.368 72.777 66.925 120.247 10.387 57.856 0.586 112.274-30.866 161.5-31.524 48.64-77.312 78.994-133.486 93.915-21.211 5.778-42.35 6.875-63.634 5.12a211.383 211.383 0 0 1-97.865-32.622 244.37 244.37 0 0 1-98.011-116.882c-7.315-18.871-11.338-39.497-17.116-58.953-1.17-4.023-2.194-5.779-6.875-5.779h-41.838a60.343 60.343 0 0 1-14.263-1.755c-12.654-3.438-14.921-17.189-5.193-28.672 7.387-8.558 15.506-16.603 22.894-24.576 19.529-20.553 38.912-41.253 58.44-61.294 6.876-6.802 13.167-14.92 20.627-20.553 11.996-9.143 21.724-8.046 32.037 2.853 33.792 34.377 68.169 68.68 101.376 103.131a39.717 39.717 0 0 1 8.557 17.7c1.756 7.388-4.534 13.752-14.336 14.337-8.557 0.585-17.115 0.585-25.746 0.585-3.438 0-5.705 0.585-6.29 4.608-2.268 30.281 4.535 57.198 27.502 77.824 17.7 16.018 39.497 24.576 64.073 26.916 25.16 2.853 48.713-2.194 71.607-10.971 10.971-3.95 18.285-11.922 25.746-20.48a133.12 133.12 0 0 0 32.695-59.611c8.557-39.498-0.585-74.46-26.917-105.326a121.125 121.125 0 0 0-73.289-40.74c-21.723-4.024-42.935-1.171-64.073 4.607-1.17 0.585-2.268 0.585-4.608 0.585 8.558-26.331 9.143-51.565-4.023-75.63a79.726 79.726 0 0 0-38.327-35.474c-28.087-12.58-70.436-13.165-103.131 32.037-6.29-11.995-12.58-24.576-19.968-36.06-28.672-43.52-68.17-72.191-119.15-80.75a137.509 137.509 0 0 0-113.371 28.088c-29.696 24.137-47.543 56.1-57.783 92.16a640 640 0 0 0-9.216 38.912 151.771 151.771 0 0 0-16.53-7.973 127.634 127.634 0 0 0-71.68-5.778c-24.577 5.193-47.47 14.921-66.926 30.94-25.82 21.21-41.838 47.542-45.86 80.749-4.609 37.303 2.852 71.68 25.745 101.376 17.774 24.137 42.35 38.327 70.949 44.617 16.091 3.511 32.695 5.193 49.298 5.852 27.502 1.097 54.419 0.512 81.92 0.512 77.824 0.585 156.307 0.585 234.204 0.585 6.29 0 10.24 1.755 13.75 7.46 21.724 34.377 50.396 61.22 84.7 82.432 1.17 0.585 2.267 1.756 5.193 4.023H290.86433333c-42.934 0-85.357-6.363-124.854-24.649a227.474 227.474 0 0 1-61.88-41.838c-28.671-28.672-46.372-63.56-56.1-102.4-5.778-22.381-9.728-44.69-8.046-68.169 4.17-54.71 20.188-105.18 56.32-147.529a196.17 196.17 0 0 1 112.275-66.414c22.82-4.023 44.617-4.023 65.755-6.363z\" fill=\"#D01329\" ></path></symbol><symbol id=\"icon-safeline\" viewBox=\"0 0 1024 1024\"><path d=\"M458.05659022 40.33498112l-349.29231644 303.15497245 259.50314155 241.75502222h134.91677866l-255.15349333-238.2986058 264.04697201-220.00677888 311.07754667 264.66835001v74.48773177l92.50770489 60.85624377v-180.51041621l-349.13697223-304.28122112-103.53717134-1.82529821z\" fill=\"#090C15\" ></path><path d=\"M544.8942171 441.43471843h-24.5056091l256.90112 238.88114802-261.67796622 224.82246088-317.718528-265.05671112v-83.65306311l-89.55615801-57.36099043v175.26753621l361.33152313 309.32992h97.09036999l344.5931429-303.31031666-260.08568491-238.91998379z\" fill=\"#090C15\" ></path></symbol><symbol id=\"icon-huawei\" viewBox=\"0 0 1024 1024\"><path d=\"M418.325 738.753125Q310.4375 833.61875 238.38125 833.684375t-109.940625-89.128125l289.884375-5.85z m189.525 0l289.884375 5.803125Q859.8125 833.684375 787.79375 833.684375T607.85 738.70625zM46.915625 490.53125q166.875 89.0625 214.209375 117.50625t161.146875 102.075q-181.03125 11.25-236.953125 0.3c-42.646875-8.334375-75.84375-26.521875-104.26875-54.99375Q24.29375 598.6625 46.915625 490.53125z m932.34375 0Q1001.9 598.634375 945.125 655.4375c-28.415625 28.471875-61.6125 46.659375-104.26875 54.99375q-55.9125 10.96875-236.90625-0.3 113.690625-73.640625 161.109375-102.075t214.2-117.525zM183.3875 246.003125q87.2625 115.65 119.446875 164.94375t145.3125 265.66875Q225.0125 576.265625 137.9375 477.3125c-41.709375-47.38125-41.709375-125.11875 5.625-191.465625q10.3125-14.4375 39.815625-39.815625z m659.353125 0q29.540625 25.40625 39.815625 39.815625c47.38125 66.346875 47.38125 144.046875 5.68125 191.49375q-87.075 99-310.3125 199.33125 113.11875-216.375 145.3125-265.715625t119.503125-164.925zM445.0625 111.425q43.603125 128.925 49.275 181.96875T484.878125 649.8125Q295.259375 376.840625 295.259375 253.615625T445.0625 111.425z m136.134375 0Q730.953125 130.4375 730.953125 253.615625T541.38125 649.8125q-15.159375-303.328125-9.459375-356.4t49.275-181.96875z\" fill=\"#FE0000\" ></path></symbol><symbol id=\"icon-qiniuyun\" viewBox=\"0 0 1525 1024\"><path d=\"M102.3291499 117.85747167a661.62332812 661.62332812 0 0 0 49.12089257 88.13691476 760.04054385 760.04054385 0 0 0 69.96218468 90.59295937c5.71907549 10.31538692 17.15722558 14.87661328 22.91138701 26.34984932 10.28030097 9.15753779 20.59568789 19.43783877 30.91107568 29.75322656a959.7169705 959.7169705 0 0 0 112.27632451 81.29507608c16.0344624 9.19262373 30.94616162 17.1923124 46.98062491 25.19200019 3.50863506 4.59631231 1.12276318 9.19262373 2.2806123 13.7538501 5.71907549 33.2267748 7.99968779 67.57631279 12.5960001 100.76800078 2.28061318 19.47292471 3.50863506 40.10369941 6.84183867 59.64679775 5.75416143 33.2267748 9.19262373 67.57631279 13.7538501 100.8030876 5.71907549 37.78800029 9.15753779 75.54091465 16.0344624 113.32891494 3.50863506 18.35016152 13.7538501 33.2267748 21.75353789 50.41908721 2.28061318 3.50863506 5.71907549 5.71907549 8.03477461 10.28030098 29.75322568 37.78800029 69.82183916 53.82246269 117.92522724 53.82246269h269.11231524c68.69907598 0 116.80246406-33.19168887 143.15231338-97.32953847 12.5960001-30.91107568 14.87661328-64.13785049 18.31507558-96.20677617l24.03415108-195.81692696c2.31569912-10.28030097-1.12276318-11.43815098-10.28030098-11.43815098-22.91138789 0-43.54216172 5.71907549-64.13785049 13.7538501-16.0344624 4.56122549-26.3498502 16.0344624-37.78800029 26.34985019a19.89396123 19.89396123 0 0 0-7.99968867 5.71907549c-8.03477461 12.5960001-18.35016152 22.91138789-22.91138701 36.63015029a385.14287901 385.14287901 0 0 0-13.7538501 38.9458503c-9.15753779 32.03383886-18.31507559 65.26061367-27.47261338 98.45230166-3.50863506 16.0344624-12.5960001 27.50769932-22.91138701 40.10370029a38.34938232 38.34938232 0 0 1-27.47261338 12.5960001c-56.13816182 3.50863506-111.08338857 2.28061318-167.18646446 1.12276318a54.52419023 54.52419023 0 0 1-46.9806249-28.59537656c-7.99968779-13.7538501-11.43815098-27.50769932-14.8766124-42.38431259-4.56122549-20.63077471-13.71876328-40.06861348-16.0344624-61.85723731a10.52590518 10.52590518 0 0 1-1.12276406-5.68398868c-16.0344624-59.64679776-33.2267748-117.96031318-49.1208917-177.50185224-1.12276318-3.50863506-3.50863506-7.01727011-1.12276319-9.15753779 2.28061318-3.50863506 6.84183867-1.15785 10.28030099 0a623.55463682 623.55463682 0 0 0 66.41846367 13.71876328 761.16330791 761.16330791 0 0 0 191.25570146 5.71907549 408.33495791 408.33495791 0 0 0 73.2953874-12.5960001c19.47292471-7.99968779 40.06861348-11.43815098 60.66430224-17.15722559 26.3498502-8.03477461 51.54185039-18.31507559 77.89169971-27.50770019 11.43815098-5.71907549 24.03415107-11.43815098 35.47230117-17.15722559a787.33772578 787.33772578 0 0 0 84.7686252-50.38400039c4.56122549-3.50863506 9.15753779-9.15753779 13.71876329-11.47323691 12.5960001-7.01727011 22.91138789-15.99937646 34.34953798-24.03415108a49.1208917 49.1208917 0 0 0 19.47292559-14.8766124c5.71907549-8.03477461 13.7538501-13.7538501 20.63077471-20.59568877s14.87661328-12.63108691 20.59568789-20.6307747c5.71907549-7.01727011 13.7538501-13.7538501 20.6307747-20.59568789s7.01727011-16.06954922 16.03446241-20.63077471c7.01727011-4.56122549 10.28030097-12.5960001 16.0344624-18.31507559 2.28061318-2.28061318 4.56122549-3.50863506 5.71907549-5.75416142 1.12276318-3.50863506 3.50863506-5.71907549 4.56122548-9.1575378 13.7538501-16.0344624 24.06923701-35.47230117 36.66523711-53.78737676 10.28030097-14.91169922 16.0344624-30.94616162 26.31476426-44.70001171 1.15785-3.50863506 0-7.01727011 2.31569912-10.28030099 12.5960001-17.1923124 18.31507559-37.78800029 26.31476338-57.260925 3.50863506-7.01727011 1.15785-9.15753779-5.71907549-9.15753779-7.99968779-1.15785-16.0344624-2.28061318-21.75353789 4.59631143-1.15785 2.28061318-3.50863506 2.28061318-5.71907549 2.28061318a14.45557676 14.45557676 0 0 0-14.8766124 7.99968779c-8.03477461 13.7538501-25.22708701 21.75353789-28.63046338 38.9458503h-1.15784912c-8.03477461-3.50863506-11.43815098 3.50863506-14.87661328 7.99968779a670.14931201 670.14931201 0 0 1-67.57631279 60.69938819 702.11297813 702.11297813 0 0 1-59.64679688 42.3843126c-26.3498502 16.0344624-50.38400039 33.19168887-79.01446377 44.62983896-1.15785 1.15785-2.28061318 2.31569912-2.28061318 3.50863505 0 3.50863506-2.31569912 2.31569912-4.59631143 2.31569913a16.10463516 16.10463516 0 0 0-7.01727011 2.28061318c-30.91107568 18.31507559-65.26061367 30.91107568-98.45230255 42.3843126-46.9806249 17.15722558-97.36462529 27.47261338-146.59077568 34.34953798a478.47257402 478.47257402 0 0 1-69.85692598 5.7190755c-56.13816182 0-111.08338857 2.28061318-167.18646445-8.03477461a1064.66024708 1064.66024708 0 0 1-116.80246406-26.31476426 8.38563838 8.38563838 0 0 1-7.01727012-8.03477373 125.67931084 125.67931084 0 0 0-8.03477461-29.75322657c-11.43815098-37.78800029-15.99937646-77.85661377-36.63015117-113.36400087-1.15785-1.15785-2.28061318-1.15785-4.59631143-1.15785a1.12276318 1.12276318 0 0 0-1.12276318 1.15785v-2.31569913c-8.03477461-10.31538692-20.63077471-14.87661328-33.19168887-17.15722646-14.91169922-3.50863506-19.47292471 1.12276318-17.1923124 14.87661328 4.59631231 35.50738799 7.99968779 72.13753828 13.71876416 108.76768945 1.15785 2.28061318 2.31569912 5.71907549-1.12276318 6.84183868a7.22778838 7.22778838 0 0 1-7.017271 0c-16.0344624-9.15753779-30.91107568-17.15722558-46.94553808-25.19200019-21.75353789-10.28030097-41.2264626-24.03415107-60.69938818-36.63015118-9.15753779-4.59631231-16.0344624-11.43815098-24.0341502-17.15722559a581.66153349 581.66153349 0 0 1-76.73385058-62.98000136 417.17671787 417.17671787 0 0 1-63.15543282-64.13785049A46.77010664 46.77010664 0 0 0 96.08378007 63.12276318C82.36501591 63.12276318 78.92655361 67.71907549 84.6456291 80.31507559z\" fill=\"#00A6E0\" ></path></symbol><symbol id=\"icon-aliyun\" viewBox=\"0 0 1024 1024\"><path d=\"M991.14285688 374.75c-0.32142844-87.96428531-71.67857156-159.21428531-159.75000001-159.21428531H580.46428531l23.14285781 91.28571375 215.35714219 46.82142843a45.62142844 45.62142844 0 0 1 35.25 42.53571469c0.10714313 0.53571469 0.10714313 231.53571469 0 232.07142844a45.62142844 45.62142844 0 0 1-35.25 42.53571469l-215.35714218 46.82142843-23.14285782 91.39285688h250.92857157c87.96428531 0 159.42857156-71.25 159.75-159.21428531V374.75zM205.03571469 671a45.62142844 45.62142844 0 0 1-35.25-42.53571469c-0.10714313-0.64285687-0.10714313-231.53571469 0-232.07142844 0.85714313-20.78571469 15.64285688-38.03571469 35.25-42.53571374l215.35714219-46.82142844 23.14285781-91.28571469H192.5c-87.96428531 0-159.42857156 71.14285687-159.75 159.21428531V650.21428531c0.32142844 87.96428531 71.78571469 159.21428531 159.75 159.21428625H443.42857156l-23.14285687-91.39285687-215.25-47.03571469z m215.25-170.14285688h183.21428531v22.82142844h-183.21428531z\" fill=\"#FE6A00\" ></path></symbol><symbol id=\"icon-tencentcloud\" viewBox=\"0 0 1436 1024\"><path d=\"M1179.59661647 793.4583092c-20.7273904 20.7273904-62.18060014 51.8161194-134.72253886 51.8161194H599.25168024c134.72096779-129.54108402 248.7192584-238.35477764 259.08216803-248.7192584 10.36290965-10.36290965 36.27175489-36.27018381 62.17902904-56.99757422 51.81769049-46.63623565 93.27090021-51.8161194 129.54108405-51.81611941 51.81769049 0 93.26932912 20.72581934 129.54265511 51.81611941 72.54193872 67.36205498 72.54193872 186.53865825 0 253.90071322m88.0878743-336.80556159c-51.81769049-56.99914532-129.54265513-93.27090021-212.44907457-93.27090022-72.54193872 0-134.72096779 25.90727414-191.7201131 67.36205496-20.7273904 20.72581934-51.8161194 41.45320974-77.72496464 72.54193873-20.72581934 20.72581934-466.34664563 455.98530704-466.34664561 455.98530705 25.90727414 5.18145483 56.99914532 5.18145483 82.90641947 5.18145484h564.79742956c41.45320974 0 72.54193872 0 103.63380989-5.18145484 67.36048387-5.18145483 134.72096779-31.09187116 191.72011308-82.90641945 119.17817436-113.99671954 119.17817436-305.7184037 5.18302592-419.71355215z\" fill=\"#00A3FF\" ></path><path d=\"M542.25410599 425.56244754c-56.99914532-41.45320974-113.99829061-62.18060014-181.35877447-62.18060015-82.90641947 0-160.62981301 36.27175489-212.44593241 93.26932914-113.99829061 119.17974546-113.99829061 305.7184037 5.17988372 424.89500696 51.81769049 46.63466457 103.63380987 72.54193872 165.81283894 77.72496464l119.17974544-113.99671953h-67.36205497c-67.36205498-5.18145483-108.81526471-25.90727414-134.72253886-51.8161194-72.5435098-72.54193872-72.5435098-186.53865825-5.18302591-259.08216805 36.27175489-36.27175489 77.72496463-51.8161194 129.54108405-51.81611938 31.09187116 0 77.72496463 5.18145483 124.36120025 51.81454829 20.72424825 20.7273904 77.72339355 62.18060014 98.44921287 82.90641946h5.18302593l77.72339354-77.72182245v-5.18459701c-36.27018381-36.27018381-93.27090021-82.90484837-124.35805812-108.8136936\" fill=\"#00C8DC\" ></path><path d=\"M1086.32571626 296.02136351C1029.32814204 140.56829205 879.0596676 31.75774062 708.06694492 31.75774062c-202.08616493 0-362.71597793 150.26690334-393.80627799 336.8055616 15.54593557 0 31.09187116-5.18145483 51.81769048-5.18145483s46.63466457 5.18145483 67.36048388 5.18145483c25.90727414-129.54108402 139.90242258-222.81198426 274.62653256-222.81198423 113.99671954 0.00157109 212.44750349 67.36205498 259.08216803 165.81283892 0 0 5.18302593 5.18145483 5.18302592 0 36.27018381-5.18145483 77.72339355-15.54436448 113.99514846-15.5443645 0 5.18145483 0 5.18145483 0 0\" fill=\"#006EFF\" ></path></symbol><symbol id=\"icon-dogecloud\" viewBox=\"0 0 1024 1024\"><path d=\"M508.193813 273.195126 362.692974 273.195126l0 454.69076 142.902664 0c138.558729 0 207.859072-76.200496 207.859072-228.644467C709.964212 353.74058 641.556193 278.392498 508.193813 273.195126z\" fill=\"#f9b814\" ></path><path d=\"M509.81530987 35.06836267c-262.86143893 0-475.95253867 213.09219093-475.95253867 475.95253866s213.09109973 475.95253867 475.95253867 475.95253867 475.95472107-213.09219093 475.95472106-475.95253867S772.67674773 35.06836267 509.81530987 35.06836267zM505.16868053 772.76570773L308.395904 772.76570773 308.395904 221.24678187l202.31664 0c166.2875296 5.54277227 252.2026816 97.95359787 257.74545387 277.14515626C772.13753387 685.03207253 684.36133013 776.4474272 505.16868053 772.76570773z\" fill=\"#f9b814\" ></path></symbol><symbol id=\"icon-bt\" viewBox=\"0 0 1024 1024\"><path d=\"M511.97044156 989.12574875c-1.9161675-3.832335-1.9161675-8.62275469-2.87425125-13.41317344V351.04191594c0-6.70658719 0-13.41317344-0.95808375-20.11976063 0-0.95808375 0-1.9161675 1.9161675-1.9161675s3.832335 0 5.74850344 0.95808375c20.11976063 5.74850344 39.2814375 11.49700594 59.40119719 16.28742563 4.79041875 0.95808375 6.70658719 3.832335 5.74850344 8.62275468v45.98802375c0 5.74850344 1.9161675 8.62275469 7.66467 9.58083844 12.45508969 2.87425125 24.91017938 6.70658719 37.36527 8.62275375h0.95808375c4.79041875-1.9161675 7.66467094 0.95808375 11.49700593 2.87425219h0.95808375c8.62275469 0 0.95808375-3.832335 2.87425125-5.74850344-0.95808375-13.41317344 0-25.86826313 0-39.28143656 0-2.87425125 0-6.70658719 2.87425219-8.62275469h1.9161675c20.11976063 5.74850344 39.2814375 11.49700594 59.40119719 17.24550844 3.832335 0.95808375 3.832335 3.832335 3.83233594 6.70658719v45.02994c0 4.79041875 0.95808375 7.66467094 5.7485025 8.62275468 11.49700594 2.87425125 23.95209562 5.74850344 35.44910156 9.58083844h0.95808375c5.74850344-1.9161675 10.53892219 2.87425125 16.28742562 1.9161675 0.95808375 0 1.9161675-0.95808375 1.9161675-1.9161675 1.9161675-6.70658719 0-13.41317344 0.95808375-20.11976062 0.95808375-8.62275469 0-17.24550937 0-24.91017938v-1.9161675c0-2.87425125 0.95808375-1.9161675 2.87425125-1.91616844 19.16167688 5.74850344 39.2814375 11.49700594 58.44311438 17.24550938 4.79041875 1.9161675 3.832335 4.79041875 3.832335 8.62275469 0 48.862275 0.95808375 97.72455094 0.95808375 146.58682593 0 60.35928188 0 120.71856281 0.95808375 181.07784469 0 6.70658719-1.9161675 14.37125719-4.79041875 20.11976063-16.28742469 31.61676656-38.32335375 57.48502969-65.14970063 81.43712531-47.90419125 43.1137725-103.47305344 72.81437156-162.87425156 97.72455094-27.78443156 11.49700594-55.56886219 19.16167688-83.35329375 29.70059906-1.9161675 0.95808375-2.87425125 0.95808375-2.87425125 0.95808375h-0.95808375c-1.9161675 0.95808375-3.832335 1.9161675-5.74850344 1.9161675\" fill=\"#20A43A\" ></path><path d=\"M508.13810656 329.96407156c1.9161675 0 3.832335 1.9161675 3.832335 3.83233594v657.24550875l-1.9161675-0.95808375s-38.32335375-12.45508969-57.48502969-19.16167688c-66.10778438-23.95209562-128.38323375-53.65269469-182.03592843-98.68263468-30.65868281-24.91017938-56.52694594-52.69461094-75.68862282-87.18562875-5.74850344-9.58083844-8.62275469-21.07784438-8.62275468-31.61676656 0.95808375-107.30538937 0.95808375-214.61077875 0.95808469-321.91616719 0-6.70658719 1.9161675-8.62275469 7.66467-10.53892219 19.16167688-4.79041875 37.36526906-10.53892219 56.52694593-16.28742562 2.87425125 2.87425125 1.9161675 6.70658719 1.91616844 9.58083843v31.61676657c0 7.66467094 0.95808375 8.62275469 8.62275375 6.70658718 2.87425125-0.95808375 5.74850344-0.95808375 8.62275469 0 12.45508969-2.87425125 24.91017938-6.70658719 38.32335375-9.58083843 4.79041875-0.95808375 4.79041875-3.832335 4.79041875-7.66467094v-45.98802375c0-2.87425125 0-5.74850344 3.832335-6.70658719l60.35928187-17.24550844c2.87425125 2.87425125 1.9161675 6.70658719 1.9161675 10.53892219 0 13.41317344-0.95808375 26.82634687 0.95808375 41.19760406 4.79041875 3.832335 8.62275469-0.95808375 13.41317438-0.95808375 1.9161675-0.95808375 3.832335 0 6.70658625 0 11.49700594-2.87425125 22.99401187-6.70658719 34.49101781-9.58083843 5.74850344-0.95808375 7.66467094-3.832335 7.66467094-9.58083844-0.95808375-15.32934094 0-30.65868281 0-46.9461075 0-2.87425125 0-5.74850344 3.832335-6.70658625 20.11976063-2.87425125 41.197605-8.62275469 61.31736562-13.41317438z\" fill=\"#18842D\" ></path><path d=\"M511.97044156 181.46107812c9.58083844 0.95808375 16.28742469 4.79041875 17.24550938 15.32934094 0.95808375 8.62275469 1.9161675 20.11976063 7.66467093 25.86826313 5.74850344 5.74850344 17.24550937 5.74850344 25.86826313 8.62275468 108.26347313 30.65868281 216.52694625 61.31736563 324.79041937 91.01796469 5.74850344 1.9161675 9.58083844 1.9161675 14.37125719-2.87425219l0.95808375-0.95808375c15.32934094-15.32934094 32.57485031-20.11976063 53.65269469-11.49700593 0.95808375 1.9161675-1.9161675 2.87425125-2.87425125 4.79041968-17.24550937 22.99401187-34.49101781 45.02994-51.73652719 68.02395188-2.87425125 4.79041875-5.74850344 5.74850344-11.49700594 3.832335-123.59281406-36.40718531-248.14371281-71.85628781-371.73652687-107.30538938-3.832335-0.95808375-7.66467094-1.9161675-12.45508969-0.95808375 2.87425125-9.58083844 1.9161675-20.11976063 1.9161675-29.70059812v-51.73652719c0.95808375-5.74850344 0.95808375-9.58083844 3.832335-12.45508969z\" fill=\"#20A43A\" ></path><path d=\"M511.97044156 181.46107812v83.35329282c0 4.79041875 0 7.66467094-4.79041875 9.58083843-34.49101781 9.58083844-68.02395187 20.11976063-101.55688593 29.70059907-91.01796375 25.86826313-182.03592844 52.69461094-272.09580844 78.56287406-2.87425125 0.95808375-6.70658719 2.87425125-9.58083844-0.95808375-19.16167688-24.91017938-38.32335375-49.82035969-58.44311438-75.68862281l29.70059907-3.832335c1.9161675 0 2.87425125 0 4.79041968 0.95808375s2.87425125 1.9161675 3.832335 2.87425125c15.32934094 16.28742469 32.57485031 16.28742469 53.65269469 10.53892218 107.30538937-31.61676656 215.5688625-61.31736563 322.87425094-91.01796375 4.79041875-1.9161675 8.62275469-3.832335 9.58083844-9.58083843 0.95808375-6.70658719 3.832335-13.41317344 4.79041968-20.11976063 0.95808375-10.53892219 7.66467094-14.37125719 17.24550844-14.37125719z\" fill=\"#18842D\" ></path><path d=\"M511.97044156 33.9161675c15.32934094-0.95808375 15.32934094-0.95808375 18.20359313 13.41317344 3.832335 18.20359313 6.70658719 37.36526906 10.53892218 55.56886219 0 3.832335 2.87425125 6.70658719 6.70658719 7.66467093 100.59880219 30.65868281 201.19760437 60.35928188 301.79640656 91.01796469 2.87425125 0.95808375 6.70658719 0.95808375 8.62275469-1.91616844l0.95808375-0.95808375c16.28742469-14.37125719 34.49101781-22.03592812 56.52694594-11.49700593 0 1.9161675-2.87425125 2.87425125-3.832335 3.83233593-19.16167688 19.16167688-39.2814375 37.36526906-57.48502969 56.52694594-4.79041875 4.79041875-8.62275469 5.74850344-15.32934187 3.832335-106.34730563-29.70059906-213.652695-59.40119719-319.99999969-89.10179625-2.87425125-0.95808375-5.74850344-0.95808375-7.66467094-1.9161675-0.95808375-2.87425125-1.9161675-5.74850344-0.95808375-7.66467094V46.37125719c-0.95808375-3.832335-1.9161675-8.62275469 1.9161675-12.45508969z\" fill=\"#20A43A\" ></path><path d=\"M511.97044156 33.9161675v117.84431156c0 2.87425125 0 6.70658719-1.9161675 9.58083844-52.69461094 14.37125719-104.43113813 29.70059906-157.12574812 44.07185625-55.56886219 15.32934094-111.13772438 30.65868281-166.7065875 46.9461075-7.66467094 1.9161675-11.49700594 0.95808375-17.24550844-4.79041875-19.16167688-21.07784438-39.2814375-42.15568875-57.48502969-62.27544937 5.74850344-0.95808375 15.32934094-1.9161675 24.91017938-3.832335 3.832335-0.95808375 6.70658719 1.9161675 8.62275469 3.832335 16.28742469 16.28742469 32.57485031 15.32934094 53.65269468 8.62275468 91.01796375-28.74251531 183.95209594-55.56886219 274.97005969-83.35329375 5.74850344-1.9161675 8.62275469-4.79041875 9.58083844-10.53892218 2.87425125-19.16167688 7.66467094-37.36526906 10.53892219-56.52694594 0.95808375-8.62275469 3.832335-12.45508969 13.41317343-10.53892219 1.9161675 0.95808375 2.87425125 0.95808375 4.79041875 0.95808375z\" fill=\"#18842D\" ></path><path d=\"M255.457493 450.682635c-5.10978 2.043912-11.241517 4.087824-17.373253 5.10978-5.10978 1.021956-4.087824-4.087824-4.087825-6.131736v-50.075849h1.021957c20.439122 3.065868 20.439122 3.065868 20.439121 23.50499-1.021956 8.175649 0 17.373253 0 27.592815z\" fill=\"#20A43A\" ></path><path d=\"M788.918571 398.562874v3.065869c1.021956 18.39521 1.021956 35.768463 0 54.163672-7.153693-1.021956-14.307385-4.087824-21.461078-5.10978v-38.834332c0-6.131737 2.043912-9.197605 8.175649-10.21956 5.10978-1.021956 9.197605-4.087824 13.285429-3.065869z m-143.073852 17.373254l-12.263473-3.065869v-42.922155c0-6.131737 2.043912-9.197605 8.175648-9.197605 4.087824 0 8.175649-3.065868 13.28543-2.043912-3.065868 7.153693-1.021956 15.329341-2.043913 22.483034v31.680638c1.021956 4.087824 1.021956 5.10978-7.153692 3.065869z\" fill=\"#18852D\" ></path><path d=\"M386.267873 413.892216c2.043912 0 5.10978-1.021956 7.153692-1.021957-5.10978 0-3.065868-4.087824-3.065868-6.131736v-37.812375c0-3.065868 1.021956-6.131737-3.065868-6.131737-6.131737-1.021956-11.241517-4.087824-17.373254-3.065868v51.097804c0 1.021956 0 8.175649 2.043912 9.197605h3.065869c1.021956 0 2.043912 0 3.065868-1.021956\" fill=\"#20A53A\" ></path><path d=\"M788.918571 455.792415v-54.163672c3.065868 2.043912 2.043912 6.131737 2.043912 9.197604 1.021956 14.307385-1.021956 29.636727 1.021956 43.944112 0 1.021956-1.021956 1.021956-1.021956 2.043912 0 0-1.021956-1.021956-2.043912-1.021956z\" fill=\"#24A53E\" ></path></symbol></svg>',(a=>{var c=(l=(l=document.getElementsByTagName(\"script\"))[l.length-1]).getAttribute(\"data-injectcss\"),l=l.getAttribute(\"data-disable-injectsvg\");if(!l){var t,i,h,o,e,d=function(c,l){l.parentNode.insertBefore(c,l)};if(c&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write(\"<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>\")}catch(c){console&&console.log(c)}}t=function(){var c,l=document.createElement(\"div\");l.innerHTML=a._iconfont_svg_string_4688792,(l=l.getElementsByTagName(\"svg\")[0])&&(l.setAttribute(\"aria-hidden\",\"true\"),l.style.position=\"absolute\",l.style.width=0,l.style.height=0,l.style.overflow=\"hidden\",l=l,(c=document.body).firstChild?d(l,c.firstChild):c.appendChild(l))},document.addEventListener?~[\"complete\",\"loaded\",\"interactive\"].indexOf(document.readyState)?setTimeout(t,0):(i=function(){document.removeEventListener(\"DOMContentLoaded\",i,!1),t()},document.addEventListener(\"DOMContentLoaded\",i,!1)):document.attachEvent&&(h=t,o=a.document,e=!1,p(),o.onreadystatechange=function(){\"complete\"==o.readyState&&(o.onreadystatechange=null,n())})}function n(){e||(e=!0,h())}function p(){try{o.documentElement.doScroll(\"left\")}catch(c){return void setTimeout(p,50)}n()}})(window);"
  },
  {
    "path": "packages/ui/certd-client/public/static/icons/iconfont.json",
    "content": "{\n  \"id\": \"4688792\",\n  \"name\": \"certd\",\n  \"font_family\": \"iconfont\",\n  \"css_prefix_text\": \"icon-\",\n  \"description\": \"\",\n  \"glyphs\": [\n    {\n      \"icon_id\": \"13592652\",\n      \"name\": \"cdn\",\n      \"font_class\": \"cdn\",\n      \"unicode\": \"e6e4\",\n      \"unicode_decimal\": 59108\n    },\n    {\n      \"icon_id\": \"30950102\",\n      \"name\": \"京东云\",\n      \"font_class\": \"jdcloud\",\n      \"unicode\": \"e653\",\n      \"unicode_decimal\": 58963\n    },\n    {\n      \"icon_id\": \"43404901\",\n      \"name\": \"volcengine\",\n      \"font_class\": \"volcengine\",\n      \"unicode\": \"e651\",\n      \"unicode_decimal\": 58961\n    },\n    {\n      \"icon_id\": \"5771134\",\n      \"name\": \"upyun\",\n      \"font_class\": \"upyun\",\n      \"unicode\": \"e62f\",\n      \"unicode_decimal\": 58927\n    },\n    {\n      \"icon_id\": \"27272666\",\n      \"name\": \"plesk_\",\n      \"font_class\": \"plesk\",\n      \"unicode\": \"ecc0\",\n      \"unicode_decimal\": 60608\n    },\n    {\n      \"icon_id\": \"23930871\",\n      \"name\": \"易支付-01\",\n      \"font_class\": \"yizhifu\",\n      \"unicode\": \"e741\",\n      \"unicode_decimal\": 59201\n    },\n    {\n      \"icon_id\": \"40476533\",\n      \"name\": \"1Panel\",\n      \"font_class\": \"onepanel\",\n      \"unicode\": \"e606\",\n      \"unicode_decimal\": 58886\n    },\n    {\n      \"icon_id\": \"26435508\",\n      \"name\": \"西部数码\",\n      \"font_class\": \"xibushuma\",\n      \"unicode\": \"e73c\",\n      \"unicode_decimal\": 59196\n    },\n    {\n      \"icon_id\": \"27487624\",\n      \"name\": \"qnap\",\n      \"font_class\": \"qnap\",\n      \"unicode\": \"e607\",\n      \"unicode_decimal\": 58887\n    },\n    {\n      \"icon_id\": \"27268231\",\n      \"name\": \"proxmox\",\n      \"font_class\": \"proxmox\",\n      \"unicode\": \"e9cc\",\n      \"unicode_decimal\": 59852\n    },\n    {\n      \"icon_id\": \"31636255\",\n      \"name\": \"aws\",\n      \"font_class\": \"aws\",\n      \"unicode\": \"e604\",\n      \"unicode_decimal\": 58884\n    },\n    {\n      \"icon_id\": \"34071209\",\n      \"name\": \"uni-app\",\n      \"font_class\": \"uniapp\",\n      \"unicode\": \"e602\",\n      \"unicode_decimal\": 58882\n    },\n    {\n      \"icon_id\": \"3467975\",\n      \"name\": \"lucky\",\n      \"font_class\": \"lucky\",\n      \"unicode\": \"e752\",\n      \"unicode_decimal\": 59218\n    },\n    {\n      \"icon_id\": \"41854563\",\n      \"name\": \"ctyun\",\n      \"font_class\": \"ctyun\",\n      \"unicode\": \"e719\",\n      \"unicode_decimal\": 59161\n    },\n    {\n      \"icon_id\": \"43757703\",\n      \"name\": \"雷池\",\n      \"font_class\": \"safeline\",\n      \"unicode\": \"e748\",\n      \"unicode_decimal\": 59208\n    },\n    {\n      \"icon_id\": \"24164616\",\n      \"name\": \"华为\",\n      \"font_class\": \"huawei\",\n      \"unicode\": \"e610\",\n      \"unicode_decimal\": 58896\n    },\n    {\n      \"icon_id\": \"9612999\",\n      \"name\": \"qiniuyun\",\n      \"font_class\": \"qiniuyun\",\n      \"unicode\": \"e603\",\n      \"unicode_decimal\": 58883\n    },\n    {\n      \"icon_id\": \"26492886\",\n      \"name\": \"aliyun\",\n      \"font_class\": \"aliyun\",\n      \"unicode\": \"e601\",\n      \"unicode_decimal\": 58881\n    },\n    {\n      \"icon_id\": \"9126093\",\n      \"name\": \"腾讯云\",\n      \"font_class\": \"tencentcloud\",\n      \"unicode\": \"e747\",\n      \"unicode_decimal\": 59207\n    },\n    {\n      \"icon_id\": \"29654736\",\n      \"name\": \"doge\",\n      \"font_class\": \"dogecloud\",\n      \"unicode\": \"e605\",\n      \"unicode_decimal\": 58885\n    },\n    {\n      \"icon_id\": \"39910795\",\n      \"name\": \"bt\",\n      \"font_class\": \"bt\",\n      \"unicode\": \"e600\",\n      \"unicode_decimal\": 58880\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/ui/certd-client/public/static/index.css",
    "content": "html, body, #app { height: 100%; margin: 0; padding: 0; width: 100%;}\n.fs-bootstrap { background-color: #474949; height: 100%; display: flex; flex-direction: column;position: fixed;width: 100% }\n.fs-bootstrap__main {flex:1; user-select: none; width: 100%; flex-grow: 1; display: flex; justify-content: center; align-items: center; flex-direction: column; }\n.fs-bootstrap__footer { width: 100%; flex-grow: 0; text-align: center; padding: 10px 0; }\n.fs-bootstrap__footer > a { font-size: 12px; color: #ABABAB; text-decoration: none; }\n.fs-bootstrap__loading {box-sizing: border-box; height: 50px; width: 50px; margin-bottom: 5px;border:5px solid #333333;border-bottom:#aaa 5px solid;\n    border-radius:1000px; animation:load 1.1s infinite linear;-webkit-animation:load 1.1s infinite linear;-moz-animation:load 1.1s infinite linear; -o-animation:load 1.1s infinite linear;\n}\n@keyframes load {from {transform:rotate(0deg);-ms-transform:rotate(0deg);}to { transform:rotate(360deg);-ms-transform:rotate(360deg); }\n}@-webkit-keyframes load {from {-webkit-transform:rotate(0deg); }to { -webkit-transform:rotate(360deg);}\n }@-moz-keyframes load { from {   -moz-transform:rotate(0deg); } to {  -moz-transform:rotate(360deg);}\n  }@-o-keyframes load { from { -o-transform:rotate(0deg);} to {   -o-transform:rotate(360deg);}}\n"
  },
  {
    "path": "packages/ui/certd-client/src/App.vue",
    "content": "<template>\n  <AConfigProvider :locale=\"antdvLocale\" :theme=\"tokenTheme\">\n    <FsFormProvider>\n      <contextHolder />\n      <router-view />\n    </FsFormProvider>\n  </AConfigProvider>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, provide, ref } from \"vue\";\nimport { preferences, usePreferences } from \"/@/vben/preferences\";\nimport { useAntdDesignTokens } from \"/@/vben/hooks\";\nimport { Modal, theme } from \"ant-design-vue\";\nimport AConfigProvider from \"ant-design-vue/es/config-provider\";\nimport { antdvLocale } from \"./locales/antdv\";\nimport { setI18nLanguage } from \"/@/locales\";\ndefineOptions({\n  name: \"App\",\n});\n\nconst [modal, contextHolder] = Modal.useModal();\nprovide(\"modal\", modal);\n\nconst locale = preferences.app.locale;\nsetI18nLanguage(locale);\n\nconst { isDark } = usePreferences();\nconst { tokens } = useAntdDesignTokens();\n\nconst tokenTheme = computed(() => {\n  const algorithm = isDark.value ? [theme.darkAlgorithm] : [theme.defaultAlgorithm];\n\n  // antd 紧凑模式算法\n  if (preferences.app.compact) {\n    algorithm.push(theme.compactAlgorithm);\n  }\n\n  return {\n    algorithm,\n    token: tokens,\n  };\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/api/service.ts",
    "content": "import axios from \"axios\";\nimport { get } from \"lodash-es\";\nimport { errorLog, errorCreate } from \"./tools\";\nimport { env } from \"/src/utils/util.env\";\nimport { useUserStore } from \"/@/store/user\";\n\nexport class CodeError extends Error {\n  code: number;\n  data?: any;\n  constructor(message: string, code: number, data?: any) {\n    super(message);\n    this.code = code;\n    this.data = data;\n  }\n}\n\n/**\n * @description 创建请求实例\n */\nfunction createService() {\n  // 创建一个 axios 实例\n  const service = axios.create();\n  // 请求拦截\n  service.interceptors.request.use(\n    config => config,\n    error => {\n      // 发送失败\n      console.log(error);\n      return Promise.reject(error);\n    }\n  );\n  // 响应拦截\n  service.interceptors.response.use(\n    response => {\n      if (response.config.responseType === \"blob\") {\n        return response;\n      }\n      //@ts-ignore\n      if (response.config.returnOriginRes) {\n        return response;\n      }\n      // dataAxios 是 axios 返回数据中的 data\n      const dataAxios = response.data;\n\n      // @ts-ignore\n      if (response.config.unpack === false) {\n        //如果不需要解包\n        return dataAxios;\n      }\n\n      // 这个状态码是和后端约定的\n      if (dataAxios?.code === undefined) {\n        // 如果没有 code 代表这不是项目后端开发的接口\n        errorCreate(`非标准返回：${dataAxios}， ${response.config.url}`);\n        return dataAxios;\n      }\n      const { code } = dataAxios;\n      // 有 code 代表这是一个后端接口 可以进行进一步的判断\n      switch (code) {\n        case 0:\n          // [ 示例 ] code === 0 代表没有错误\n          // @ts-ignore\n          return dataAxios?.data;\n        default:\n          // 不是正确的 code\n          const errorMessage = dataAxios.msg || dataAxios.message || \"未知错误\";\n          // @ts-ignore\n          if (response?.config?.onError) {\n            const err = new CodeError(errorMessage, dataAxios.code, dataAxios.data);\n            // @ts-ignore\n            response.config.onError(err);\n          }\n          //@ts-ignore\n          const showErrorNotify = response?.config?.showErrorNotify;\n          errorCreate(`${errorMessage}: ${response.config.url}`, showErrorNotify, dataAxios);\n      }\n    },\n    error => {\n      const status = get(error, \"response.status\");\n      switch (status) {\n        case 400:\n          error.message = \"请求错误\";\n          break;\n        case 401:\n          error.message = \"未授权，请登录\";\n          break;\n        case 403:\n          error.message = \"拒绝访问\";\n          break;\n        case 404:\n          error.message = `请求地址出错`;\n          break;\n        case 408:\n          error.message = \"请求超时\";\n          break;\n        case 500:\n          error.message = \"服务器内部错误\";\n          break;\n        case 501:\n          error.message = \"服务未实现\";\n          break;\n        case 502:\n          error.message = \"网关错误\";\n          break;\n        case 503:\n          error.message = \"服务不可用\";\n          break;\n        case 504:\n          error.message = \"网关超时\";\n          break;\n        case 505:\n          error.message = \"HTTP版本不受支持\";\n          break;\n        default:\n          break;\n      }\n      error.message += `: ${error.response?.config?.url}`;\n      errorLog(error, error?.response?.config?.showErrorNotify);\n      if (status === 401) {\n        const userStore = useUserStore();\n        userStore.logout(true, true);\n      }\n\n      if (error?.config?.onError) {\n        error.config.onError(error);\n      }\n      return Promise.reject(error);\n    }\n  );\n  return service;\n}\n\n/**\n * @description 创建请求方法\n * @param {Object} service axios 实例\n */\nfunction createRequestFunction(service: any) {\n  return function (config: any) {\n    const configDefault = {\n      headers: {\n        \"Content-Type\": get(config, \"headers.Content-Type\", \"application/json\"),\n      },\n      timeout: 30000,\n      baseURL: env.API,\n      data: {},\n    };\n    const userStore = useUserStore();\n    const token = userStore.getToken;\n    if (token != null) {\n      // @ts-ignore\n      configDefault.headers.Authorization = token;\n    }\n    return service(Object.assign(configDefault, config));\n  };\n}\n\n// 用于真实网络请求的实例和请求方法\nexport const service = createService();\nexport const request = createRequestFunction(service);\n"
  },
  {
    "path": "packages/ui/certd-client/src/api/tools.ts",
    "content": "/**\n * @description 安全地解析 json 字符串\n * @param {String} jsonString 需要解析的 json 字符串\n * @param {String} defaultValue 默认值\n */\nimport { uiContext } from \"@fast-crud/fast-crud\";\nimport { CodeError } from \"/@/api/service\";\n\nexport function parse(jsonString = \"{}\", defaultValue = {}) {\n  let result = defaultValue;\n  try {\n    result = JSON.parse(jsonString);\n  } catch (error) {\n    console.log(error);\n  }\n  return result;\n}\n\n/**\n * @description 接口请求返回\n * @param {Any} data 返回值\n * @param {String} msg 状态信息\n * @param {Number} code 状态码\n */\nexport function response(data = {}, msg = \"\", code = 0) {\n  return [200, { code, msg, data }];\n}\n\n/**\n * @description 接口请求返回 正确返回\n * @param {Any} data 返回值\n * @param {String} msg 状态信息\n */\nexport function responseSuccess(data = {}, msg = \"成功\") {\n  return response(data, msg);\n}\n\n/**\n * @description 接口请求返回 错误返回\n * @param {Any} data 返回值\n * @param {String} msg 状态信息\n * @param {Number} code 状态码\n */\nexport function responseError(data = {}, msg = \"请求失败\", code = 500) {\n  return response(data, msg, code);\n}\n\n/**\n * @description 记录和显示错误\n * @param {Error} error 错误对象\n */\nexport function errorLog(error: any, notify = true) {\n  // 打印到控制台\n  console.error(\"errorLog\", error);\n  let message = error.message;\n  if (error.response?.data?.message) {\n    message = error.response.data.message;\n  }\n  if (message.indexOf(\"ssl3_get_record:wrong version number\") >= 0) {\n    message = \"http协议错误，服务端要求http协议，请检查是否使用了https请求\";\n  }\n  if (notify) {\n    // 显示提示\n    uiContext.get().notification.error({ message });\n  }\n}\n\n/**\n * @description 创建一个错误\n */\nexport function errorCreate(msg: string, notify = true, data?: any) {\n  const err = new CodeError(msg, data.code, data.data);\n  console.error(\"errorCreate\", err);\n  if (notify) {\n    uiContext.get().notification.error({ message: err.message });\n  }\n\n  throw err;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/ai/index.vue",
    "content": "<template>\n  <div id=\"maxkb\">\n    <!-- 引导层 -->\n    <div v-if=\"showGuide\" class=\"maxkb-mask\">\n      <div class=\"maxkb-content\" :style=\"contentStyle\"></div>\n    </div>\n\n    <div v-if=\"showGuide\" class=\"maxkb-tips\" :style=\"tipsStyle\">\n      <div class=\"\" @click=\"closeGuide\">\n        <!-- 关闭图标 -->\n        <svg style=\"vertical-align: middle; overflow: hidden\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n          <path\n            d=\"M9.95317 8.73169L15.5511 3.13376C15.7138 2.97104 15.9776 2.97104 16.1403 3.13376L16.7296 3.72301C16.8923 3.88573 16.8923 4.14955 16.7296 4.31227L11.1317 9.9102L16.7296 15.5081C16.8923 15.6708 16.8923 15.9347 16.7296 16.0974L16.1403 16.6866C15.9776 16.8494 15.7138 16.8494 15.5511 16.6866L9.95317 11.0887L4.35524 16.6866C4.19252 16.8494 3.9287 16.8494 3.76598 16.6866L3.17673 16.0974C3.01401 15.9347 3.01401 15.6708 3.17673 15.5081L8.77465 9.9102L3.17673 4.31227C3.01401 4.14955 3.01401 3.88573 3.17673 3.72301L3.76598 3.13376C3.9287 2.97104 4.19252 2.97104 4.35524 3.13376L9.95317 8.73169Z\"\n            fill=\"#ffffff\"\n          ></path>\n        </svg>\n      </div>\n      <div class=\"maxkb-title\">🌟 遇见问题，不再有障碍！</div>\n      <p>你好，我是你的智能小助手。<br />点我，开启高效解答模式，让问题变成过去式。</p>\n      <div class=\"maxkb-button\">\n        <button @click=\"closeGuide\">我知道了</button>\n      </div>\n      <span class=\"maxkb-arrow\"></span>\n    </div>\n\n    <!-- 聊天按钮 -->\n    <div v-show=\"!chatVisible\" class=\"maxkb-chat-button\" @click=\"toggleChat\">\n      <img src=\"https://maxkb.handfree.work/ui/MaxKB.gif\" />\n    </div>\n\n    <!-- 聊天窗口 -->\n    <div id=\"maxkb-chat-container\" :class=\"{ 'maxkb-enlarge': isFullscreen }\" :style=\"containerStyle\">\n      <iframe id=\"maxkb-chat\" allow=\"microphone\" :src=\"chatUrl\"></iframe>\n      <div class=\"maxkb-operate\">\n        <div class=\"viewport\" :class=\"{ 'maxkb-viewportnone': !isFullscreen }\" @click=\"toggleFullscreen\">\n          <!-- 缩小图标 -->\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n            <path\n              d=\"M7.507 11.6645C7.73712 11.6645 7.94545 11.7578 8.09625 11.9086C8.24706 12.0594 8.34033 12.2677 8.34033 12.4978V16.7976C8.34033 17.0277 8.15378 17.2143 7.92366 17.2143H7.09033C6.86021 17.2143 6.67366 17.0277 6.67366 16.7976V14.5812L3.41075 17.843C3.24803 18.0057 2.98421 18.0057 2.82149 17.843L2.23224 17.2537C2.06952 17.091 2.06952 16.8272 2.23224 16.6645L5.56668 13.3311H3.19634C2.96622 13.3311 2.77967 13.1446 2.77967 12.9145V12.0811C2.77967 11.851 2.96622 11.6645 3.19634 11.6645H7.507ZM16.5991 2.1572C16.7619 1.99448 17.0257 1.99448 17.1884 2.1572L17.7777 2.74645C17.9404 2.90917 17.9404 3.17299 17.7777 3.33571L14.4432 6.66904H16.8136C17.0437 6.66904 17.2302 6.85559 17.2302 7.08571V7.91904C17.2302 8.14916 17.0437 8.33571 16.8136 8.33571H12.5029C12.2728 8.33571 12.0644 8.24243 11.9136 8.09163C11.7628 7.94082 11.6696 7.73249 11.6696 7.50237V3.20257C11.6696 2.97245 11.8561 2.7859 12.0862 2.7859H12.9196C13.1497 2.7859 13.3362 2.97245 13.3362 3.20257V5.419L16.5991 2.1572Z\"\n              fill=\"rgb(100, 106, 115)\"\n            />\n          </svg>\n        </div>\n        <div class=\"maxkb-openviewport\" :class=\"{ 'maxkb-viewportnone': isFullscreen }\" @click=\"toggleFullscreen\">\n          <!-- 放大图标 -->\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n            <path\n              d=\"M7.15209 11.5968C7.31481 11.4341 7.57862 11.4341 7.74134 11.5968L8.3306 12.186C8.49332 12.3487 8.49332 12.6126 8.3306 12.7753L4.99615 16.1086H7.3665C7.59662 16.1086 7.78316 16.2952 7.78316 16.5253V17.3586C7.78316 17.5887 7.59662 17.7753 7.3665 17.7753H3.05584C2.82572 17.7753 2.61738 17.682 2.46658 17.5312C2.31578 17.3804 2.2225 17.1721 2.2225 16.9419V12.6421C2.2225 12.412 2.40905 12.2255 2.63917 12.2255H3.4725C3.70262 12.2255 3.88917 12.412 3.88917 12.6421V14.8586L7.15209 11.5968ZM16.937 2.22217C17.1671 2.22217 17.3754 2.31544 17.5262 2.46625C17.677 2.61705 17.7703 2.82538 17.7703 3.0555V7.35531C17.7703 7.58543 17.5837 7.77198 17.3536 7.77198H16.5203C16.2902 7.77198 16.1036 7.58543 16.1036 7.35531V5.13888L12.8407 8.40068C12.678 8.5634 12.4142 8.5634 12.2515 8.40068L11.6622 7.81142C11.4995 7.64871 11.4995 7.38489 11.6622 7.22217L14.9966 3.88883H12.6263C12.3962 3.88883 12.2096 3.70229 12.2096 3.47217V2.63883C12.2096 2.40872 12.3962 2.22217 12.6263 2.22217H16.937Z\"\n              fill=\"rgb(100, 106, 115)\"\n            />\n          </svg>\n        </div>\n        <div class=\"maxkb-chat-close\" @click=\"toggleChat\">\n          <!-- 关闭图标 -->\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n            <path\n              d=\"M9.95317 8.73169L15.5511 3.13376C15.7138 2.97104 15.9776 2.97104 16.1403 3.13376L16.7296 3.72301C16.8923 3.88573 16.8923 4.14955 16.7296 4.31227L11.1317 9.9102L16.7296 15.5081C16.8923 15.6708 16.8923 15.9347 16.7296 16.0974L16.1403 16.6866C15.9776 16.8494 15.7138 16.8494 15.5511 16.6866L9.95317 11.0887L4.35524 16.6866C4.19252 16.8494 3.9287 16.8494 3.76598 16.6866L3.17673 16.0974C3.01401 15.9347 3.01401 15.6708 3.17673 15.5081L8.77465 9.9102L3.17673 4.31227C3.01401 4.14955 3.01401 3.88573 3.17673 3.72301L3.76598 3.13376C3.9287 2.97104 4.19252 2.97104 4.35524 3.13376L9.95317 8.73169Z\"\n              fill=\"rgb(100, 106, 115)\"\n            />\n          </svg>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from \"vue\";\ndefineOptions({\n  name: \"MaxKBChat\",\n});\nconst props = defineProps<{\n  url?: string;\n  showGuideOnInit?: boolean;\n}>();\n\n// 响应式状态\nconst showGuide = ref(false);\nconst chatVisible = ref(false);\nconst isFullscreen = ref(false);\nconst buttonPos = ref({ x: 16, y: 30 });\nconst buttonSize = ref({ width: 64, height: 64 });\n\n// 计算属性\nconst chatUrl = computed(() => {\n  return props.url || \"https://maxkb.handfree.work/ui/chat/326a8651825e8a02?mode=embed\";\n});\n\nconst contentStyle = computed(() => ({\n  width: `${buttonSize.value.width}px`,\n  height: `${buttonSize.value.height}px`,\n}));\n\nconst tipsStyle = computed(() => ({\n  marginRight: `${Math.min(buttonSize.value.width, 500) - 64}px`,\n}));\n\nconst containerStyle = computed(() => ({\n  display: chatVisible.value ? \"block\" : \"none\",\n  right: `${buttonPos.value.x}px`,\n  bottom: `${buttonPos.value.y}px`,\n}));\n\n// 方法\nconst closeGuide = () => {\n  showGuide.value = false;\n  localStorage.setItem(\"maxkbMaskTip\", \"true\");\n};\n\nconst toggleChat = () => {\n  chatVisible.value = !chatVisible.value;\n};\n\nconst toggleFullscreen = () => {\n  isFullscreen.value = !isFullscreen.value;\n};\n\n// 初始化\nonMounted(() => {\n  if (props.showGuideOnInit && !localStorage.getItem(\"maxkbMaskTip\")) {\n    showGuide.value = true;\n  }\n});\n\nasync function openChat(req: { q: string }) {\n  if (!req.q) {\n    return;\n  }\n  chatVisible.value = true;\n\n  const iframeId = \"maxkb-chat\";\n\n  const iframe = document.getElementById(iframeId) as HTMLIFrameElement | null;\n  if (!iframe) {\n    throw new Error(\"iframe not found\");\n    return;\n  }\n  iframe.contentWindow?.postMessage(\n    {\n      ...req,\n      from: \"certd\",\n    },\n    \"*\"\n  );\n}\n\ndefineExpose({\n  openChat,\n});\n</script>\n\n<style scoped>\n/* 这里放置所有样式（保持原有样式不变） */\n/* 注意将原样式中的 #maxkb 选择器改为 #maxkb-container */\n/* 示例： */\n/* 其他样式保持原样... */\n/* 放大 */\n#maxkb .maxkb-enlarge {\n  width: 50% !important;\n  height: 100% !important;\n  bottom: 0 !important;\n  right: 0 !important;\n}\n@media only screen and (max-width: 768px) {\n  #maxkb .maxkb-enlarge {\n    width: 100% !important;\n    height: 100% !important;\n    right: 0 !important;\n    bottom: 0 !important;\n  }\n}\n\n/* 引导 */\n\n#maxkb .maxkb-mask {\n  position: fixed;\n  z-index: 10001;\n  background-color: transparent;\n  height: 100%;\n  width: 100%;\n  top: 0;\n  left: 0;\n}\n#maxkb .maxkb-mask .maxkb-content {\n  width: 64px;\n  height: 64px;\n  box-shadow: 1px 1px 1px 9999px rgba(0, 0, 0, 0.6);\n  position: absolute;\n  right: 0px;\n  bottom: 30px;\n  z-index: 10001;\n}\n#maxkb .maxkb-tips {\n  position: fixed;\n  right: calc(0px + 75px);\n  bottom: calc(30px + 0px);\n  padding: 22px 24px 24px;\n  border-radius: 6px;\n  color: #ffffff;\n  font-size: 14px;\n  background: #3370ff;\n  z-index: 10001;\n}\n#maxkb .maxkb-tips .maxkb-arrow {\n  position: absolute;\n  background: #3370ff;\n  width: 10px;\n  height: 10px;\n  pointer-events: none;\n  transform: rotate(45deg);\n  box-sizing: border-box;\n  /* left  */\n  right: -5px;\n  bottom: 33px;\n  border-left-color: transparent;\n  border-bottom-color: transparent;\n}\n#maxkb .maxkb-tips .maxkb-title {\n  font-size: 20px;\n  font-weight: 500;\n  margin-bottom: 8px;\n}\n#maxkb .maxkb-tips .maxkb-button {\n  text-align: right;\n  margin-top: 24px;\n}\n#maxkb .maxkb-tips .maxkb-button button {\n  border-radius: 4px;\n  background: #fff;\n  padding: 3px 12px;\n  color: #3370ff;\n  cursor: pointer;\n  outline: none;\n  border: none;\n}\n#maxkb .maxkb-tips .maxkb-button button::after {\n  border: none;\n}\n#maxkb .maxkb-tips {\n  position: absolute;\n  right: 20px;\n  //top: 20px;\n  cursor: pointer;\n}\n#maxkb-chat-container {\n  width: 450px;\n  height: 600px;\n  display: none;\n}\n@media only screen and (max-width: 768px) {\n  #maxkb-chat-container {\n    width: 100%;\n    height: 70%;\n    right: 0 !important;\n  }\n}\n\n#maxkb .maxkb-chat-button {\n  position: fixed;\n  right: 10px;\n  bottom: 30px;\n  cursor: pointer;\n  z-index: 10000;\n}\n#maxkb #maxkb-chat-container {\n  z-index: 10000;\n  position: relative;\n  border-radius: 8px;\n  border: 1px solid #ffffff;\n  background: linear-gradient(188deg, rgba(235, 241, 255, 0.2) 39.6%, rgba(231, 249, 255, 0.2) 94.3%), #eff0f1;\n  box-shadow: 0px 4px 8px 0px rgba(31, 35, 41, 0.1);\n  position: fixed;\n  bottom: 16px;\n  right: 16px;\n  overflow: hidden;\n}\n\n#maxkb #maxkb-chat-container .maxkb-operate {\n  top: 18px;\n  right: 15px;\n  position: absolute;\n  display: flex;\n  align-items: center;\n  line-height: 18px;\n}\n#maxkb #maxkb-chat-container .maxkb-operate .maxkb-chat-close {\n  margin-left: 15px;\n  cursor: pointer;\n}\n#maxkb #maxkb-chat-container .maxkb-operate .maxkb-openviewport {\n  cursor: pointer;\n}\n#maxkb #maxkb-chat-container .maxkb-operate .maxkb-closeviewport {\n  cursor: pointer;\n}\n#maxkb #maxkb-chat-container .maxkb-viewportnone {\n  display: none;\n}\n#maxkb #maxkb-chat-container #maxkb-chat {\n  height: 100%;\n  width: 100%;\n  border: none;\n}\n#maxkb #maxkb-chat-container {\n  animation: appear 0.4s ease-in-out;\n}\n@keyframes appear {\n  from {\n    height: 0;\n  }\n\n  to {\n    height: 600px;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/code-editor/async-import.ts",
    "content": "export async function importJsYaml() {\n  return await import(\"js-yaml\");\n}\n\nexport async function importYamlContribution() {\n  await import(\"monaco-editor/esm/vs/basic-languages/yaml/yaml.contribution\");\n}\n\nexport async function importJsonContribution() {\n  await import(\"monaco-editor/esm/vs/language/json/monaco.contribution\");\n}\n\nexport async function importJavascriptContribution() {\n  await import(\"monaco-editor/esm/vs/basic-languages/javascript/javascript.contribution\");\n}\n\nexport async function importMonacoYaml() {\n  return await import(\"monaco-yaml\");\n}\n\nexport async function importWorks() {\n  const editorWorker = await import(\"monaco-editor/esm/vs/editor/editor.worker?worker\");\n  const jsonWorker = await import(\"monaco-editor/esm/vs/language/json/json.worker?worker\");\n  const cssWorker = await import(\"monaco-editor/esm/vs/language/css/css.worker?worker\");\n  const htmlWorker = await import(\"monaco-editor/esm/vs/language/html/html.worker?worker\");\n  const tsWorker = await import(\"monaco-editor/esm/vs/language/typescript/ts.worker?worker\");\n  const yamlWorker = await import(\"./yaml.worker?worker\");\n\n  return {\n    editorWorker,\n    jsonWorker,\n    cssWorker,\n    htmlWorker,\n    tsWorker,\n    yamlWorker,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/code-editor/import-works.ts",
    "content": "import editorWorker from \"monaco-editor/esm/vs/editor/editor.worker?worker\";\nimport jsonWorker from \"monaco-editor/esm/vs/language/json/json.worker?worker\";\nimport cssWorker from \"monaco-editor/esm/vs/language/css/css.worker?worker\";\nimport htmlWorker from \"monaco-editor/esm/vs/language/html/html.worker?worker\";\nimport tsWorker from \"monaco-editor/esm/vs/language/typescript/ts.worker?worker\";\nimport yamlWorker from \"./yaml.worker?worker\";\n\nconst WorkerBucket: any = {};\n\n/**\n * 注册自定义worker\n * @param name\n * @param worker\n */\nexport function registerWorker(name: string, worker: any) {\n  WorkerBucket[name] = worker;\n}\n//@ts-ignore\nwindow.MonacoEnvironment = {\n  //@ts-ignore\n  getWorker(_, label) {\n    const custom = WorkerBucket[label];\n    if (custom) {\n      return new custom();\n    }\n    if (label === \"json\") {\n      return new jsonWorker();\n    } else if (label === \"css\" || label === \"scss\" || label === \"less\") {\n      return new cssWorker();\n    } else if (label === \"html\" || label === \"handlebars\" || label === \"razor\") {\n      return new htmlWorker();\n    } else if (label === \"typescript\" || label === \"javascript\") {\n      return new tsWorker();\n    } else if (label === \"yaml\" || label === \"yml\") {\n      //@ts-ignore\n      return new yamlWorker();\n    }\n    return new editorWorker();\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/code-editor/index.vue",
    "content": "<template>\n  <div ref=\"monacoRef\" class=\"fs-editor-code\"></div>\n</template>\n\n<script lang=\"ts\" setup>\nimport * as monaco from \"monaco-editor\";\n// import * as monaco from \"monaco-editor/esm/vs/editor/editor.api\";\nimport { onMounted, onUnmounted, ref, watch } from \"vue\";\nimport { cloneDeep, debounce as lodashDebounce } from \"lodash-es\";\nimport { initWorkers } from \"./workers\";\nimport { importJavascriptContribution, importJsonContribution, importMonacoYaml, importYamlContribution } from \"./async-import\";\n\ndefineOptions({\n  name: \"CodeEditor\",\n});\n\n/**\n * config:\n *   value: '', // 编辑器初始文本\n *   language: 'javascript', // 语言\n *   theme: 'vs', // 主题\n *   readOnly: false, // 是否只读\n *   minimap: { enabled: false }, // 是否启用小地图\n *   fontSize: 14, // 字体大小\n *   tabSize: 2, // tab缩进长度\n *   automaticLayout: true, // 自动布局\n *   lineNumbers: 'off', // 是否启用行号\n *   contextmenu: true, // 是否启用上下文菜单\n *   folding: true, // 是否启用代码折叠\n *   foldingStrategy: 'auto', // 代码折叠策略\n *   wordWrap: 'on', // 自动换行设置\n *   wrappingIndent: 'indent', // 换行缩进\n *   formatOnPaste: true, // 粘贴时是否自动格式化\n *   formatOnType: true, // 输入时是否自动格式化\n *   dragAndDrop: true, // 是否允许拖放\n *   cursorStyle: 'line', // 光标样式\n *   cursorBlinking: 'blink', // 光标闪烁方式\n *   scrollbar: {\n *     vertical: 'auto', // 垂直滚动条的显示方式\n *     horizontal: 'auto', // 水平滚动条的显示方式\n *     verticalScrollbarSize: 2, // 垂直滚动条的宽\n *     horizontalScrollbarSize: 2, // 水平滚动条的高度\n *   }\n */\nconst props = defineProps<{\n  language?: string;\n  modelValue?: string;\n  config?: any;\n  schema?: any;\n  debounce?: number;\n  init?: any;\n  readonly?: boolean;\n  disabled?: boolean;\n  id?: string;\n}>();\n\nexport type EditorCodeCtx = {\n  // monaco对象\n  monaco: any;\n  //语言\n  language: string;\n  //配置\n  config: any;\n  //editor实例对象\n  instance?: any;\n\n  schema?: any;\n};\n\nconst monacoRef = ref();\n\nlet instanceRef: any = null;\n\nfunction disposeEditor() {\n  if (instanceRef) {\n    instanceRef.dispose(); //使用完成销毁实例\n  }\n}\n\nonUnmounted(() => {\n  disposeEditor();\n});\n\nconst emits = defineEmits([\"update:modelValue\", \"change\", \"ready\", \"save\"]);\n\nconst emitValue = lodashDebounce((value: any) => {\n  emits(\"update:modelValue\", value);\n}, props.debounce || 500);\n\nasync function createEditor(ctx: EditorCodeCtx) {\n  disposeEditor();\n  const instance = monaco.editor.create(monacoRef.value, {\n    automaticLayout: true,\n    value: props.modelValue,\n    language: ctx.language,\n    theme: \"vs-dark\",\n    minimap: { enabled: false },\n    insertSpaces: true,\n    tabSize: 2,\n    autoIndent: true, // 自动布局\n    renderWhitespace: true,\n    readOnly: props.readonly || props.disabled,\n    hover: {\n      enabled: true,\n    },\n    ...ctx.config,\n  });\n\n  // @event `change`\n  instance.onDidChangeModelContent(event => {\n    const value = instance.getValue();\n    if (props.modelValue !== value) {\n      emits(\"change\", value);\n      emitValue(value);\n    }\n  });\n\n  instanceRef = instance;\n  ctx.instance = instance;\n  emits(\"ready\", ctx);\n  if (props.modelValue) {\n    instanceRef.setValue(props.modelValue);\n  }\n\n  instance.addAction({\n    id: \"custom_save\",\n    label: \"save\",\n    contextMenuOrder: 1, // 菜单项的排序权重 越小，越靠前\n    contextMenuGroupId: \"customCommand\", // 菜单项的分组\n    keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS],\n    run: async () => {\n      await instanceRef.getAction(\"editor.action.formatDocument\").run();\n      emits(\"save\", {\n        value: props.modelValue,\n      });\n    }, //方法\n  });\n  return instance;\n}\n\nasync function initJavascript(ctx: EditorCodeCtx) {\n  await importJavascriptContribution();\n  monaco.languages.register({ id: \"javascript\" });\n}\n\nasync function initJson(ctx: EditorCodeCtx) {\n  await importJsonContribution();\n  monaco.languages.register({ id: \"json\" });\n\n  const schemas = [];\n  if (ctx.schema) {\n    schemas.push({\n      uri: \"http://myserver/foo-schema.json\", // id of the first schema\n      fileMatch: [\"*\"], // associate with our model\n      schema: {\n        ...ctx.schema,\n      },\n    });\n  }\n\n  monaco.languages.json.jsonDefaults.setDiagnosticsOptions({\n    validate: true,\n    enableSchemaRequest: false,\n    schemas,\n  });\n}\n\nasync function initYaml(ctx: EditorCodeCtx) {\n  await importYamlContribution();\n  const { configureMonacoYaml } = await importMonacoYaml();\n  monaco.languages.register({ id: \"yaml\" });\n  const id = `fs-editor-code-${props.id || \"\"}.yaml`;\n  const uri = monaco.Uri.parse(id);\n  const schemas = [];\n  if (ctx.schema) {\n    schemas.push({\n      fileMatch: [\"*\"], // associate with our model\n      schema: {\n        ...ctx.schema,\n      },\n      uri: id,\n    });\n  }\n  configureMonacoYaml(monaco, {\n    schemas,\n    format: true,\n    hover: true,\n    completion: true,\n    validate: true,\n    isKubernetes: false,\n    enableSchemaRequest: false,\n  });\n\n  const oldModel = monaco.editor.getModel(uri);\n  if (oldModel) {\n    oldModel.dispose();\n  }\n  ctx.config.model = monaco.editor.createModel(props.modelValue, \"yaml\", uri);\n}\n\nasync function doInit() {\n  await initWorkers();\n  const ctx: EditorCodeCtx = {\n    monaco,\n    language: props.language || \"javascript\",\n    config: cloneDeep(props.config || {}),\n    schema: props.schema,\n  };\n  if (ctx.language === \"javascript\") {\n    await initJavascript(ctx);\n  } else if (ctx.language === \"yaml\") {\n    await initYaml(ctx);\n  } else if (ctx.language === \"json\") {\n    await initJson(ctx);\n  }\n\n  await createEditor(ctx);\n}\n// watch(\n//   () => {\n//     return {\n//       language: props.language,\n//       config: props.config,\n//     };\n//   },\n//   (value: any) => {\n//     doInit();\n//   }\n// );\n\nwatch(\n  () => {\n    return props.modelValue;\n  },\n  newValue => {\n    if (instanceRef) {\n      const editor = instanceRef;\n      if (newValue !== editor.getValue()) {\n        editor.setValue(newValue);\n      }\n    }\n  },\n  {\n    immediate: true,\n  }\n);\n\nonMounted(async () => {\n  await doInit();\n});\n</script>\n\n<style lang=\"less\">\n.fs-editor-code {\n  min-height: 100px;\n  width: 100%;\n  border: 1px solid #eee;\n  border-radius: 5px;\n  position: relative;\n}\n\n.monaco-editor .hover-content {\n  z-index: 1000 !important;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/code-editor/validators.ts",
    "content": "import { importJsYaml } from \"./async-import\";\n\nconst jsonRule = {\n  validator: async (rule: any, value: any) => {\n    //校验value json的有效性\n    if (value) {\n      try {\n        JSON.parse(value);\n      } catch (e: any) {\n        console.error(e);\n        throw new Error(\"json格式错误:\" + e.message);\n      }\n    }\n  },\n  message: \"json格式错误\",\n};\n\nconst yamlRule = {\n  validator: async (rule: any, value: any) => {\n    //校验value yaml的有效性\n    if (value) {\n      try {\n        const yaml = await importJsYaml();\n        yaml.load(value, { schema: yaml.JSON_SCHEMA });\n      } catch (e: any) {\n        console.error(e);\n        throw new Error(\"yaml格式错误:\" + e.message);\n      }\n    }\n  },\n  message: \"yaml格式错误\",\n};\n\nexport const FsEditorCodeValidators = {\n  jsonRule,\n  yamlRule,\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/code-editor/workers.ts",
    "content": "const WorkerBucket: any = {};\n\n/**\n * 注册自定义worker\n * @param name\n * @param worker\n */\nexport function registerWorker(name: string, worker: any) {\n  WorkerBucket[name] = worker;\n}\n\nexport async function initWorkers() {\n  if (window.MonacoEnvironment) {\n    return;\n  }\n\n  // const { editorWorker, jsonWorker, cssWorker, htmlWorker, tsWorker } = await importWorks();\n  //\n  // // const editorWorker = new Worker(new URL(\"monaco-editor/esm/vs/editor/editor.worker.js\", import.meta.url));\n  // // const jsonWorker = new Worker(new URL(\"monaco-editor/esm/vs/language/json/json.worker.js\", import.meta.url));\n  // // const cssWorker = new Worker(new URL(\"monaco-editor/esm/vs/language/css/css.worker.js\", import.meta.url));\n  // // const htmlWorker = new Worker(new URL(\"monaco-editor/esm/vs/language/html/html.worker.js\", import.meta.url));\n  // // const tsWorker = new Worker(new URL(\"monaco-editor/esm/vs/language/typescript/ts.worker.js\", import.meta.url));\n  // // const yamlWorker = new Worker(new URL(\"./yaml.worker.js\", import.meta.url));\n\n  const editorWorker = await import(\"monaco-editor/esm/vs/editor/editor.worker?worker\");\n  const jsonWorker = await import(\"monaco-editor/esm/vs/language/json/json.worker?worker\");\n  const cssWorker = await import(\"monaco-editor/esm/vs/language/css/css.worker?worker\");\n  const htmlWorker = await import(\"monaco-editor/esm/vs/language/html/html.worker?worker\");\n  const tsWorker = await import(\"monaco-editor/esm/vs/language/typescript/ts.worker?worker\");\n  const yamlWorker = await import(\"./yaml.worker?worker\");\n\n  //@ts-ignore\n  window.MonacoEnvironment = {\n    //@ts-ignore\n    getWorker(_, label) {\n      const custom = WorkerBucket[label];\n      if (custom) {\n        return new custom();\n      }\n      if (label === \"json\") {\n        return new jsonWorker.default();\n      } else if (label === \"css\" || label === \"scss\" || label === \"less\") {\n        return new cssWorker.default();\n      } else if (label === \"html\" || label === \"handlebars\" || label === \"razor\") {\n        return new htmlWorker.default();\n      } else if (label === \"typescript\" || label === \"javascript\") {\n        return new tsWorker.default();\n      } else if (label === \"yaml\" || label === \"yml\") {\n        //@ts-ignore\n        return new yamlWorker.default();\n      }\n      return new editorWorker.default();\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/code-editor/yaml.worker.ts",
    "content": "export * from \"monaco-yaml/yaml.worker.js\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/container.vue",
    "content": "<template>\n  <div class=\"pi-container\">\n    <div class=\"box\">\n      <div class=\"inner\">\n        <div class=\"header\">\n          <slot name=\"header\"></slot>\n        </div>\n        <div class=\"body\">\n          <slot></slot>\n        </div>\n        <div class=\"footer\">\n          <slot name=\"footer\"></slot>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: \"PiContainer\",\n};\n</script>\n\n<style lang=\"less\">\n.pi-container {\n  height: 100%;\n  width: 100%;\n  position: relative;\n  .box {\n    height: 100%;\n    position: absolute;\n    width: 100%;\n    top: 0;\n    left: 0;\n    .inner {\n      height: 100%;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      .header {\n        flex-shrink: 0;\n      }\n      .body {\n        overflow-y: auto;\n        flex: 1;\n      }\n      .footer {\n        flex-shrink: 0;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/cron-editor/index.vue",
    "content": "<template>\n  <div class=\"cron-editor\">\n    <div class=\"flex-o\">\n      <cron-light :disabled=\"disabled\" :readonly=\"readonly\" :period=\"period\" class=\"flex-o cron-ant\" locale=\"zh-CN\" format=\"quartz\" :model-value=\"modelValue\" @update:model-value=\"onUpdate\" @error=\"onError\" />\n    </div>\n    <div class=\"mt-5 flex\">\n      <a-input :disabled=\"true\" :readonly=\"readonly\" :value=\"modelValue\" @change=\"onChange\"></a-input>\n      <fs-icon icon=\"ion:close-circle\" class=\"pointer fs-16 ml-5 color-gray\" :title=\"t('certd.cron.clearTip')\" @click=\"onClear\"></fs-icon>\n    </div>\n    <div class=\"helper\">{{ t(\"certd.cron.nextTrigger\") }}：{{ nextTime }}</div>\n    <div class=\"fs-helper\">{{ errorMessage }}</div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport parser from \"cron-parser\";\nimport { computed, ref } from \"vue\";\nimport dayjs from \"dayjs\";\nimport { useI18n } from \"vue-i18n\";\n\nconst { t } = useI18n();\nimport { getCronNextTimes } from \"/@/components/cron-editor/utils\";\ndefineOptions({\n  name: \"CronEditor\",\n});\nconst props = defineProps<{\n  modelValue?: string;\n  disabled?: boolean;\n  readonly?: boolean;\n  allowEveryMin?: boolean;\n}>();\n\nconst period = ref<string>(\"\");\nif (props.modelValue == null || props.modelValue.endsWith(\"* * *\")) {\n  period.value = \"day\";\n} else if (props.modelValue.endsWith(\"* *\")) {\n  period.value = \"month\";\n} else if (props.modelValue.endsWith(\"*\")) {\n  period.value = \"year\";\n}\nconst emit = defineEmits<{\n  \"update:modelValue\": any;\n  change: any;\n}>();\n\nconst errorMessage = ref<string | null>(null);\n\nconst onUpdate = (value: string) => {\n  if (value === props.modelValue) {\n    return;\n  }\n  const arr: string[] = value.split(\" \");\n  if (arr[0] === \"*\") {\n    arr[0] = \"0\";\n  }\n  if (!props.allowEveryMin) {\n    if (arr[1] === \"*\") {\n      arr[1] = \"0\";\n    }\n  }\n\n  value = arr.join(\" \");\n\n  emit(\"update:modelValue\", value);\n  errorMessage.value = undefined;\n};\n\nconst onPeriod = (value: string) => {\n  period.value = value;\n};\n\nconst onChange = (e: any) => {\n  const value = e.target.value;\n  onUpdate(value);\n};\nconst onError = (error: any) => {\n  errorMessage.value = error;\n};\n\nconst onClear = () => {\n  if (props.disabled) {\n    return;\n  }\n  onUpdate(\"\");\n};\n\nconst nextTime = computed(() => {\n  if (props.modelValue == null) {\n    return t(\"certd.cron.tip\");\n  }\n\n  try {\n    const nextTimes = getCronNextTimes(props.modelValue, 2);\n    return nextTimes.join(\"，\");\n  } catch (e) {\n    console.log(e);\n    return t(\"certd.cron.tip\");\n  }\n});\n</script>\n<style lang=\"less\">\n.cron-editor {\n  .cron-ant {\n    flex-wrap: wrap;\n\n    &* > {\n      margin-bottom: 2px;\n      display: flex;\n      align-items: center;\n    }\n\n    .vcron-select-list {\n      min-width: 56px;\n    }\n\n    .vcron-select-input {\n      min-height: 22px;\n      background-color: #fff;\n    }\n\n    .vcron-select-container {\n      display: flex;\n      align-items: center;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/cron-editor/utils.ts",
    "content": "import parser from \"cron-parser\";\nimport dayjs from \"dayjs\";\n\nexport function getCronNextTimes(cron: string, count: number = 1) {\n  if (cron == null) {\n    return [];\n  }\n  const nextTimes = [];\n  const interval = parser.parseExpression(cron);\n  for (let i = 0; i < count; i++) {\n    const next = interval.next().getTime();\n    nextTimes.push(dayjs(next).format(\"YYYY-MM-DD HH:mm:ss\"));\n  }\n  return nextTimes;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/editable.vue",
    "content": "<template>\n  <div class=\"text-editable\" :class=\"{ disabled, 'hover-show': hoverShow }\">\n    <div v-if=\"isEdit\" class=\"input\">\n      <a-input ref=\"inputRef\" v-model:value=\"valueRef\" :validate-status=\"modelValue ? '' : 'error'\" v-bind=\"input\" @keyup.enter=\"save()\" @blur=\"save()\">\n        <template #suffix>\n          <fs-icon icon=\"ant-design:check-outlined\" @click=\"save()\"></fs-icon>\n        </template>\n      </a-input>\n    </div>\n    <div v-else class=\"view\" @click=\"edit\">\n      <span class=\"ellipsis\"> {{ modelValue }}</span>\n      <fs-icon class=\"edit-icon\" icon=\"ant-design:edit-outlined\"></fs-icon>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { watch, ref, nextTick } from \"vue\";\n\nexport default {\n  name: \"TextEditable\",\n  props: {\n    modelValue: {\n      type: String,\n      default: \"\",\n    },\n    input: {\n      type: Object,\n    },\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n    hoverShow: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\"update:modelValue\"],\n  setup(props, ctx) {\n    const inputRef = ref();\n    const valueRef = ref(props.modelValue);\n    watch(\n      () => {\n        return props.modelValue;\n      },\n      value => {\n        valueRef.value = value;\n      }\n    );\n    const isEdit = ref(false);\n    async function edit() {\n      if (props.disabled) {\n        return;\n      }\n      isEdit.value = true;\n      await nextTick();\n      inputRef.value.focus();\n    }\n    function save() {\n      isEdit.value = false;\n      ctx.emit(\"update:modelValue\", valueRef.value);\n    }\n    return {\n      valueRef,\n      isEdit,\n      save,\n      edit,\n      inputRef,\n    };\n  },\n};\n</script>\n\n<style lang=\"less\">\n.text-editable {\n  flex: 1;\n  line-height: 34px;\n  overflow: hidden;\n  span.fs-iconify {\n    display: inline-flex;\n    justify-content: center;\n    align-items: center;\n    margin-left: 2px;\n    margin-right: 2px;\n  }\n\n  &.disabled {\n    .edit-icon {\n      visibility: hidden !important;\n    }\n  }\n  &.hover-show {\n    .edit-icon {\n      visibility: hidden;\n    }\n    &:hover {\n      .edit-icon {\n        visibility: visible;\n      }\n    }\n  }\n  .edit-icon {\n    line-height: 34px;\n  }\n  .view {\n    cursor: pointer;\n    display: flex;\n    align-items: center;\n    justify-content: left;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/email-selector/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nexport async function EmailList() {\n  return await request({\n    url: \"/mine/email/list\",\n    method: \"post\",\n    data: {},\n  });\n}\n\nexport async function EmailDelete(email: string) {\n  return await request({\n    url: \"/mine/email/delete\",\n    method: \"post\",\n    data: {\n      email: email,\n    },\n  });\n}\n\nexport async function EmailAdd(email: string) {\n  return await request({\n    url: \"/mine/email/add\",\n    method: \"post\",\n    data: {\n      email: email,\n    },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/email-selector/index.vue",
    "content": "<template>\n  <a-select :options=\"emails\">\n    <template #option=\"{ value: val }\">\n      <div class=\"flex flex-row w-full\">\n        <span class=\"flex-1\">{{ val }}</span>\n        <fs-icon class=\"ml-5\" icon=\"ion:close\" @click=\"deleteItem(val)\"></fs-icon>\n      </div>\n    </template>\n    <template #dropdownRender=\"{ menuNode: menu }\">\n      <v-nodes :vnodes=\"menu\" />\n      <a-divider style=\"margin: 4px 0\" />\n      <div class=\"w-full flex flex-row p-5\">\n        <a-input ref=\"inputRef\" v-model:value=\"newEmail\" class=\"flex-1\" placeholder=\"添加新邮箱\" @keydown.enter=\"addItem\" />\n        <a-button class=\"ml-5\" type=\"primary\" @click=\"addItem\">\n          <template #icon>\n            <plus-outlined />\n          </template>\n          添加邮箱\n        </a-button>\n      </div>\n    </template>\n  </a-select>\n</template>\n\n<script lang=\"ts\" setup>\nimport { defineComponent, onMounted, ref } from \"vue\";\nimport * as api from \"./api\";\nimport { Modal, notification } from \"ant-design-vue\";\ndefineOptions({\n  name: \"EmailEditor\",\n});\nconst props = defineProps<{}>();\nconst VNodes = defineComponent({\n  props: {\n    vnodes: {\n      type: Object,\n      required: true,\n    },\n  },\n  render() {\n    return this.vnodes;\n  },\n});\n\nconst newEmail = ref(\"\");\nconst emails = ref([]);\n\nonMounted(async () => {\n  const list = await api.EmailList();\n  emails.value = list.map((item: string) => {\n    return {\n      value: item,\n    };\n  });\n});\nasync function addItem() {\n  const email = newEmail.value;\n  //验证邮箱格式\n  const regExp =\n    /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+\\.)+[a-zA-Z\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]{2,}))$/;\n  if (!regExp.test(email)) {\n    notification.error({\n      message: \"请填写正确的邮箱地址\",\n    });\n    return;\n  }\n\n  if (emails.value.find(item => item.value === email)) {\n    notification.warning({\n      message: \"此邮箱已存在\",\n    });\n    return;\n  }\n  await api.EmailAdd(email);\n  emails.value.unshift({\n    value: email,\n    label: email,\n  });\n  newEmail.value = \"\";\n}\n\nasync function deleteItem(value: string) {\n  Modal.confirm({\n    title: \"删除邮箱\",\n    content: \"确定要删除此邮箱吗？\",\n    onOk: async () => {\n      await api.EmailDelete(value);\n      emails.value = emails.value.filter(item => item.value !== value);\n    },\n  });\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/expires-time-text.vue",
    "content": "<template>\n  <span class=\"cd-expires-time-text\">\n    <component :is=\"wrapperComp\" :color=\"color\">\n      <template v-if=\"label != null\">\n        {{ label }}\n      </template>\n      <template v-else>\n        <FsTimeHumanize :model-value=\"value\" :use-format-greater=\"1000000000000000\" :options=\"{ units: ['y', 'd'] }\"></FsTimeHumanize>\n      </template>\n    </component>\n  </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport dayjs from \"dayjs\";\nimport { computed } from \"vue\";\n\ndefineOptions({\n  name: \"ExpiresTimeText\",\n});\n\nconst props = defineProps<{\n  value?: number;\n  mode?: \"tag\" | \"text\";\n}>();\n\nconst wrapperComp = computed(() => {\n  if (props.mode === \"tag\") {\n    return \"a-tag\";\n  }\n  return \"span\";\n});\n\nconst color = computed(() => {\n  if (props.value == null) {\n    return \"\";\n  }\n  //距离今天多少天\n  const days = dayjs(props.value).diff(dayjs(), \"day\");\n  if (props.value === -1 || days > 365) {\n    return \"green\";\n  }\n\n  //小于3天 红色\n  if (days <= 6) {\n    return \"red\";\n  }\n\n  return \"blue\";\n});\n\nconst label = computed(() => {\n  if (props.value == null) {\n    return \"\";\n  }\n  if (props.value === -1) {\n    return \"永久\";\n  }\n  return null;\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/file-input.vue",
    "content": "<template>\n  <div class=\"file-input\">\n    <a-button :type=\"type\" @click=\"onClick\">{{ text }}</a-button> {{ fileName }}\n    <div class=\"hidden\">\n      <input ref=\"fileInputRef\" type=\"file\" @change=\"onFileChange\" />\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, defineEmits, defineProps } from \"vue\";\nconst fileInputRef = ref<HTMLInputElement | null>(null);\n\nconst props = defineProps<{\n  text: string;\n  type: string;\n}>();\nconst fileName = ref(\"\");\nconst emit = defineEmits([\"change\"]);\nfunction onClick() {\n  fileInputRef.value.click();\n}\nfunction onFileChange(e: any) {\n  fileName.value = e.target.files[0].name;\n  emit(\"change\", e);\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/fold-box.vue",
    "content": "<template>\n  <div class=\"cd-fold-box\">\n    <div class=\"handle pointer\">\n      <div class=\"line\"></div>\n      <div class=\"icon\">\n        <fs-icon icon=\"ion:chevron-collapse-sharp\"></fs-icon>\n      </div>\n    </div>\n    <div class=\"content\" :class=\"{ hidden: !props.open }\">\n      <slot></slot>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nconst props = defineProps<{\n  open: boolean;\n}>();\n</script>\n\n<style lang=\"less\">\n.cd-fold-box {\n  .handle {\n    height: 20px;\n    display: flex;\n    align-items: center;\n    .line {\n      //虚线\n      border-top: 1px dashed #ccc;\n      width: 100%;\n      height: 1px;\n    }\n    .icon {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n    }\n  }\n\n  .content {\n    display: flex;\n    flex-direction: column;\n    &.hidden {\n      display: none;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight/index.vue",
    "content": "<template>\n  <pre class=\"fs-highlight hljs\" v-html=\"highlightHTMLRef\"></pre>\n</template>\n\n<script lang=\"ts\">\n// 相关文档\n// https://highlightjs.org/usage/\n// http://highlightjs.readthedocs.io/en/latest/api.html#configure-options\nimport highlight from \"highlight.js\";\nimport { ref, watch } from \"vue\";\nimport { defineComponent, Ref } from \"vue\";\nimport \"../highlight-styles/github-gist.css\";\n//@ts-ignore\nimport htmlFormat from \"./libs/htmlFormat.js\";\nexport default defineComponent({\n  name: \"FsHighlight\",\n  props: {\n    code: {\n      type: String,\n      required: false,\n      default: \"\",\n    },\n    formatHtml: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n    lang: {\n      type: String,\n      required: false,\n      default: \"\",\n    },\n  },\n  setup(props: any, ctx: any) {\n    const highlightHTMLRef: Ref = ref(\"\");\n\n    watch(\n      () => {\n        return props.code;\n      },\n      () => {\n        doHighlight();\n      },\n      {\n        immediate: true,\n      }\n    );\n\n    function doHighlight() {\n      const code = props.formatHtml ? htmlFormat(props.code) : props.code;\n      highlightHTMLRef.value = (highlight as any).highlightAuto(code, [props.lang, \"html\", \"javascript\", \"json\", \"css\", \"scss\", \"less\"]).value;\n    }\n    return {\n      highlightHTMLRef,\n      doHighlight,\n    };\n  },\n});\n</script>\n\n<style lang=\"less\">\n.fs-highlight {\n  margin: 0px;\n  border-radius: 4px;\n  font-size: 12px;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight/libs/htmlFormat.js",
    "content": "/* eslint-disable */\n\n// 功能\n// 将HTML字符串格式化\n\nconst format = (function () {\n  function style_html(html_source, indent_size, indent_character, max_char) {\n    var Parser, multi_parser;\n    function Parser() {\n      this.pos = 0;\n      this.token = \"\";\n      this.current_mode = \"CONTENT\";\n      this.tags = {\n        parent: \"parent1\",\n        parentcount: 1,\n        parent1: \"\",\n      };\n      this.tag_type = \"\";\n      this.token_text = this.last_token = this.last_text = this.token_type = \"\";\n      this.Utils = {\n        whitespace: \"\\n\\r\\t \".split(\"\"),\n        single_token: \"br,input,link,meta,!doctype,basefont,base,area,hr,wbr,param,img,isindex,?xml,embed\".split(\",\"),\n        extra_liners: \"head,body,/html\".split(\",\"),\n        in_array: function (what, arr) {\n          for (var i = 0; i < arr.length; i++) {\n            if (what === arr[i]) {\n              return true;\n            }\n          }\n          return false;\n        },\n      };\n      this.get_content = function () {\n        var char = \"\";\n        var content = [];\n        var space = false;\n        while (this.input.charAt(this.pos) !== \"<\") {\n          if (this.pos >= this.input.length) {\n            return content.length ? content.join(\"\") : [\"\", \"TK_EOF\"];\n          }\n          char = this.input.charAt(this.pos);\n          this.pos++;\n          this.line_char_count++;\n          if (this.Utils.in_array(char, this.Utils.whitespace)) {\n            if (content.length) {\n              space = true;\n            }\n            this.line_char_count--;\n            continue;\n          } else if (space) {\n            if (this.line_char_count >= this.max_char) {\n              content.push(\"\\n\");\n              for (var i = 0; i < this.indent_level; i++) {\n                content.push(this.indent_string);\n              }\n              this.line_char_count = 0;\n            } else {\n              content.push(\" \");\n              this.line_char_count++;\n            }\n            space = false;\n          }\n          content.push(char);\n        }\n        return content.length ? content.join(\"\") : \"\";\n      };\n      this.get_script = function () {\n        var char = \"\";\n        var content = [];\n        var reg_match = new RegExp(\"</script\" + \">\", \"igm\");\n        reg_match.lastIndex = this.pos;\n        var reg_array = reg_match.exec(this.input);\n        var end_script = reg_array ? reg_array.index : this.input.length;\n        while (this.pos < end_script) {\n          if (this.pos >= this.input.length) {\n            return content.length ? content.join(\"\") : [\"\", \"TK_EOF\"];\n          }\n          char = this.input.charAt(this.pos);\n          this.pos++;\n          content.push(char);\n        }\n        return content.length ? content.join(\"\") : \"\";\n      };\n      this.record_tag = function (tag) {\n        if (this.tags[tag + \"count\"]) {\n          this.tags[tag + \"count\"]++;\n          this.tags[tag + this.tags[tag + \"count\"]] = this.indent_level;\n        } else {\n          this.tags[tag + \"count\"] = 1;\n          this.tags[tag + this.tags[tag + \"count\"]] = this.indent_level;\n        }\n        this.tags[tag + this.tags[tag + \"count\"] + \"parent\"] = this.tags.parent;\n        this.tags.parent = tag + this.tags[tag + \"count\"];\n      };\n      this.retrieve_tag = function (tag) {\n        if (this.tags[tag + \"count\"]) {\n          var temp_parent = this.tags.parent;\n          while (temp_parent) {\n            if (tag + this.tags[tag + \"count\"] === temp_parent) {\n              break;\n            }\n            temp_parent = this.tags[temp_parent + \"parent\"];\n          }\n          if (temp_parent) {\n            this.indent_level = this.tags[tag + this.tags[tag + \"count\"]];\n            this.tags.parent = this.tags[temp_parent + \"parent\"];\n          }\n          delete this.tags[tag + this.tags[tag + \"count\"] + \"parent\"];\n          delete this.tags[tag + this.tags[tag + \"count\"]];\n          if (this.tags[tag + \"count\"] == 1) {\n            delete this.tags[tag + \"count\"];\n          } else {\n            this.tags[tag + \"count\"]--;\n          }\n        }\n      };\n      this.get_tag = function () {\n        var char = \"\";\n        var content = [];\n        var space = false;\n        do {\n          if (this.pos >= this.input.length) {\n            return content.length ? content.join(\"\") : [\"\", \"TK_EOF\"];\n          }\n          char = this.input.charAt(this.pos);\n          this.pos++;\n          this.line_char_count++;\n          if (this.Utils.in_array(char, this.Utils.whitespace)) {\n            space = true;\n            this.line_char_count--;\n            continue;\n          }\n          if (char === \"'\" || char === '\"') {\n            if (!content[1] || content[1] !== \"!\") {\n              char += this.get_unformatted(char);\n              space = true;\n            }\n          }\n          if (char === \"=\") {\n            space = false;\n          }\n          if (content.length && content[content.length - 1] !== \"=\" && char !== \">\" && space) {\n            if (this.line_char_count >= this.max_char) {\n              this.print_newline(false, content);\n              this.line_char_count = 0;\n            } else {\n              content.push(\" \");\n              this.line_char_count++;\n            }\n            space = false;\n          }\n          content.push(char);\n        } while (char !== \">\");\n        var tag_complete = content.join(\"\");\n        var tag_index;\n        if (tag_complete.indexOf(\" \") != -1) {\n          tag_index = tag_complete.indexOf(\" \");\n        } else {\n          tag_index = tag_complete.indexOf(\">\");\n        }\n        var tag_check = tag_complete.substring(1, tag_index).toLowerCase();\n        if (tag_complete.charAt(tag_complete.length - 2) === \"/\" || this.Utils.in_array(tag_check, this.Utils.single_token)) {\n          this.tag_type = \"SINGLE\";\n        } else if (tag_check === \"script\") {\n          this.record_tag(tag_check);\n          this.tag_type = \"SCRIPT\";\n        } else if (tag_check === \"style\") {\n          this.record_tag(tag_check);\n          this.tag_type = \"STYLE\";\n        } else if (tag_check.charAt(0) === \"!\") {\n          if (tag_check.indexOf(\"[if\") != -1) {\n            if (tag_complete.indexOf(\"!IE\") != -1) {\n              var comment = this.get_unformatted(\"-->\", tag_complete);\n              content.push(comment);\n            }\n            this.tag_type = \"START\";\n          } else if (tag_check.indexOf(\"[endif\") != -1) {\n            this.tag_type = \"END\";\n            this.unindent();\n          } else if (tag_check.indexOf(\"[cdata[\") != -1) {\n            var comment = this.get_unformatted(\"]]>\", tag_complete);\n            content.push(comment);\n            this.tag_type = \"SINGLE\";\n          } else {\n            var comment = this.get_unformatted(\"-->\", tag_complete);\n            content.push(comment);\n            this.tag_type = \"SINGLE\";\n          }\n        } else {\n          if (tag_check.charAt(0) === \"/\") {\n            this.retrieve_tag(tag_check.substring(1));\n            this.tag_type = \"END\";\n          } else {\n            this.record_tag(tag_check);\n            this.tag_type = \"START\";\n          }\n          if (this.Utils.in_array(tag_check, this.Utils.extra_liners)) {\n            this.print_newline(true, this.output);\n          }\n        }\n        return content.join(\"\");\n      };\n      this.get_unformatted = function (delimiter, orig_tag) {\n        if (orig_tag && orig_tag.indexOf(delimiter) != -1) {\n          return \"\";\n        }\n        var char = \"\";\n        var content = \"\";\n        var space = true;\n        do {\n          char = this.input.charAt(this.pos);\n          this.pos++;\n          if (this.Utils.in_array(char, this.Utils.whitespace)) {\n            if (!space) {\n              this.line_char_count--;\n              continue;\n            }\n            if (char === \"\\n\" || char === \"\\r\") {\n              content += \"\\n\";\n              for (var i = 0; i < this.indent_level; i++) {\n                content += this.indent_string;\n              }\n              space = false;\n              this.line_char_count = 0;\n              continue;\n            }\n          }\n          content += char;\n          this.line_char_count++;\n          space = true;\n        } while (content.indexOf(delimiter) == -1);\n        return content;\n      };\n      this.get_token = function () {\n        var token;\n        if (this.last_token === \"TK_TAG_SCRIPT\") {\n          var temp_token = this.get_script();\n          if (typeof temp_token !== \"string\") {\n            return temp_token;\n          }\n          //token = js_beautify(temp_token, this.indent_size, this.indent_character, this.indent_level);\n          //return [token, 'TK_CONTENT'];\n          return [temp_token, \"TK_CONTENT\"];\n        }\n        if (this.current_mode === \"CONTENT\") {\n          token = this.get_content();\n          if (typeof token !== \"string\") {\n            return token;\n          } else {\n            return [token, \"TK_CONTENT\"];\n          }\n        }\n        if (this.current_mode === \"TAG\") {\n          token = this.get_tag();\n          if (typeof token !== \"string\") {\n            return token;\n          } else {\n            var tag_name_type = \"TK_TAG_\" + this.tag_type;\n            return [token, tag_name_type];\n          }\n        }\n      };\n      this.printer = function (js_source, indent_character, indent_size, max_char) {\n        this.input = js_source || \"\";\n        this.output = [];\n        this.indent_character = indent_character || \" \";\n        this.indent_string = \"\";\n        this.indent_size = indent_size || 2;\n        this.indent_level = 0;\n        this.max_char = max_char || 70;\n        this.line_char_count = 0;\n        for (var i = 0; i < this.indent_size; i++) {\n          this.indent_string += this.indent_character;\n        }\n        this.print_newline = function (ignore, arr) {\n          this.line_char_count = 0;\n          if (!arr || !arr.length) {\n            return;\n          }\n          if (!ignore) {\n            while (this.Utils.in_array(arr[arr.length - 1], this.Utils.whitespace)) {\n              arr.pop();\n            }\n          }\n          arr.push(\"\\n\");\n          for (var i = 0; i < this.indent_level; i++) {\n            arr.push(this.indent_string);\n          }\n        };\n        this.print_token = function (text) {\n          this.output.push(text);\n        };\n        this.indent = function () {\n          this.indent_level++;\n        };\n        this.unindent = function () {\n          if (this.indent_level > 0) {\n            this.indent_level--;\n          }\n        };\n      };\n      return this;\n    }\n    multi_parser = new Parser();\n    multi_parser.printer(html_source, indent_character, indent_size);\n    while (true) {\n      var t = multi_parser.get_token();\n      multi_parser.token_text = t[0];\n      multi_parser.token_type = t[1];\n      if (multi_parser.token_type === \"TK_EOF\") {\n        break;\n      }\n      switch (multi_parser.token_type) {\n        case \"TK_TAG_START\":\n        case \"TK_TAG_SCRIPT\":\n        case \"TK_TAG_STYLE\":\n          multi_parser.print_newline(false, multi_parser.output);\n          multi_parser.print_token(multi_parser.token_text);\n          multi_parser.indent();\n          multi_parser.current_mode = \"CONTENT\";\n          break;\n        case \"TK_TAG_END\":\n          multi_parser.print_newline(true, multi_parser.output);\n          multi_parser.print_token(multi_parser.token_text);\n          multi_parser.current_mode = \"CONTENT\";\n          break;\n        case \"TK_TAG_SINGLE\":\n          multi_parser.print_newline(false, multi_parser.output);\n          multi_parser.print_token(multi_parser.token_text);\n          multi_parser.current_mode = \"CONTENT\";\n          break;\n        case \"TK_CONTENT\":\n          if (multi_parser.token_text !== \"\") {\n            multi_parser.print_newline(false, multi_parser.output);\n            multi_parser.print_token(multi_parser.token_text);\n          }\n          multi_parser.current_mode = \"TAG\";\n          break;\n      }\n      multi_parser.last_token = multi_parser.token_type;\n      multi_parser.last_text = multi_parser.token_text;\n    }\n    return multi_parser.output.join(\"\");\n  }\n  return function (data) {\n    var dataHolder = [\"__dataHolder_\", [Math.random(), Math.random(), Math.random(), Math.random()].join(\"_\").replace(/[^0-9]/g, \"_\"), \"_\"].join(\"_\");\n    var dataHolders = {};\n    var index = 0;\n    data = data.replace(/(\\\")(data:[^\\\"]*)(\\\")/g, function ($0, $1, $2, $3) {\n      var name = dataHolder + index++;\n      dataHolders[name] = $2;\n      return $1 + name + $3;\n    });\n    data = style_html(data, 2, \" \", 0x10000000);\n    data = data.replace(new RegExp(dataHolder + \"[0-9]+\", \"g\"), function ($0) {\n      return dataHolders[$0];\n    });\n    return data;\n  };\n})();\n\nexport default format;\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/agate.css",
    "content": "/*!\n * Agate by Taufik Nurrohman <https://github.com/tovic>\n * ----------------------------------------------------\n *\n * #ade5fc\n * #a2fca2\n * #c6b4f0\n * #d36363\n * #fcc28c\n * #fc9b9b\n * #ffa\n * #fff\n * #333\n * #62c8f3\n * #888\n *\n */\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #333;\n  color: white;\n}\n\n.hljs-name,\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-code,\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-tag {\n  color: #62c8f3;\n}\n\n.hljs-variable,\n.hljs-template-variable,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #ade5fc;\n}\n\n.hljs-string,\n.hljs-bullet {\n  color: #a2fca2;\n}\n\n.hljs-type,\n.hljs-title,\n.hljs-section,\n.hljs-attribute,\n.hljs-quote,\n.hljs-built_in,\n.hljs-builtin-name {\n  color: #ffa;\n}\n\n.hljs-number,\n.hljs-symbol,\n.hljs-bullet {\n  color: #d36363;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal {\n  color: #fcc28c;\n}\n\n.hljs-comment,\n.hljs-deletion,\n.hljs-code {\n  color: #888;\n}\n\n.hljs-regexp,\n.hljs-link {\n  color: #c6b4f0;\n}\n\n.hljs-meta {\n  color: #fc9b9b;\n}\n\n.hljs-deletion {\n  background-color: #fc9b9b;\n  color: #333;\n}\n\n.hljs-addition {\n  background-color: #a2fca2;\n  color: #333;\n}\n\n.hljs a {\n  color: inherit;\n}\n\n.hljs a:focus,\n.hljs a:hover {\n  color: inherit;\n  text-decoration: underline;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/androidstudio.css",
    "content": "/*\nDate: 24 Fev 2015\nAuthor: Pedro Oliveira <kanytu@gmail . com>\n*/\n\n.hljs {\n  color: #a9b7c6;\n  background: #282b2e;\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n}\n\n.hljs-number,\n.hljs-literal,\n.hljs-symbol,\n.hljs-bullet {\n  color: #6897bb;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-deletion {\n  color: #cc7832;\n}\n\n.hljs-variable,\n.hljs-template-variable,\n.hljs-link {\n  color: #629755;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #808080;\n}\n\n.hljs-meta {\n  color: #bbb529;\n}\n\n.hljs-string,\n.hljs-attribute,\n.hljs-addition {\n  color: #6a8759;\n}\n\n.hljs-section,\n.hljs-title,\n.hljs-type {\n  color: #ffc66d;\n}\n\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #e8bf6a;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/arduino-light.css",
    "content": "/*\n\nArduino® Light Theme - Stefania Mellai <s.mellai@arduino.cc>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #ffffff;\n}\n\n.hljs,\n.hljs-subst {\n  color: #434f54;\n}\n\n.hljs-keyword,\n.hljs-attribute,\n.hljs-selector-tag,\n.hljs-doctag,\n.hljs-name {\n  color: #00979d;\n}\n\n.hljs-built_in,\n.hljs-literal,\n.hljs-bullet,\n.hljs-code,\n.hljs-addition {\n  color: #d35400;\n}\n\n.hljs-regexp,\n.hljs-symbol,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-link,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n  color: #00979d;\n}\n\n.hljs-type,\n.hljs-string,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-quote,\n.hljs-template-tag,\n.hljs-deletion {\n  color: #005c5f;\n}\n\n.hljs-title,\n.hljs-section {\n  color: #880000;\n  font-weight: bold;\n}\n\n.hljs-comment {\n  color: rgba(149, 165, 166, 0.8);\n}\n\n.hljs-meta-keyword {\n  color: #728e00;\n}\n\n.hljs-meta {\n  color: #728e00;\n  color: #434f54;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-function {\n  color: #728e00;\n}\n\n.hljs-number {\n  color: #8a7b52;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/arta.css",
    "content": "/*\nDate: 17.V.2011\nAuthor: pumbur <pumbur@pumbur.net>\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #222;\n}\n\n.hljs,\n.hljs-subst {\n  color: #aaa;\n}\n\n.hljs-section {\n  color: #fff;\n}\n\n.hljs-comment,\n.hljs-quote,\n.hljs-meta {\n  color: #444;\n}\n\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-regexp {\n  color: #ffcc33;\n}\n\n.hljs-number,\n.hljs-addition {\n  color: #00cc66;\n}\n\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-link {\n  color: #32aaee;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #6644aa;\n}\n\n.hljs-title,\n.hljs-variable,\n.hljs-deletion,\n.hljs-template-tag {\n  color: #bb1166;\n}\n\n.hljs-section,\n.hljs-doctag,\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/ascetic.css",
    "content": "/*\n\nOriginal style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: white;\n  color: black;\n}\n\n.hljs-string,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-section,\n.hljs-addition,\n.hljs-attribute,\n.hljs-link {\n  color: #888;\n}\n\n.hljs-comment,\n.hljs-quote,\n.hljs-meta,\n.hljs-deletion {\n  color: #ccc;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-section,\n.hljs-name,\n.hljs-type,\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-cave-dark.css",
    "content": "/* Base16 Atelier Cave Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Cave Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #7e7887;\n}\n\n/* Atelier-Cave Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-regexp,\n.hljs-link,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #be4678;\n}\n\n/* Atelier-Cave Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #aa573c;\n}\n\n/* Atelier-Cave Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #2a9292;\n}\n\n/* Atelier-Cave Blue */\n.hljs-title,\n.hljs-section {\n  color: #576ddb;\n}\n\n/* Atelier-Cave Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #955ae7;\n}\n\n.hljs-deletion,\n.hljs-addition {\n  color: #19171c;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-deletion {\n  background-color: #be4678;\n}\n\n.hljs-addition {\n  background-color: #2a9292;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #19171c;\n  color: #8b8792;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-cave-light.css",
    "content": "/* Base16 Atelier Cave Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Cave Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #655f6d;\n}\n\n/* Atelier-Cave Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #be4678;\n}\n\n/* Atelier-Cave Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #aa573c;\n}\n\n/* Atelier-Cave Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #2a9292;\n}\n\n/* Atelier-Cave Blue */\n.hljs-title,\n.hljs-section {\n  color: #576ddb;\n}\n\n/* Atelier-Cave Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #955ae7;\n}\n\n.hljs-deletion,\n.hljs-addition {\n  color: #19171c;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-deletion {\n  background-color: #be4678;\n}\n\n.hljs-addition {\n  background-color: #2a9292;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #efecf4;\n  color: #585260;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-dune-dark.css",
    "content": "/* Base16 Atelier Dune Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Dune Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #999580;\n}\n\n/* Atelier-Dune Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #d73737;\n}\n\n/* Atelier-Dune Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #b65611;\n}\n\n/* Atelier-Dune Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #60ac39;\n}\n\n/* Atelier-Dune Blue */\n.hljs-title,\n.hljs-section {\n  color: #6684e1;\n}\n\n/* Atelier-Dune Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #b854d4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #20201d;\n  color: #a6a28c;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-dune-light.css",
    "content": "/* Base16 Atelier Dune Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Dune Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #7d7a68;\n}\n\n/* Atelier-Dune Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #d73737;\n}\n\n/* Atelier-Dune Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #b65611;\n}\n\n/* Atelier-Dune Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #60ac39;\n}\n\n/* Atelier-Dune Blue */\n.hljs-title,\n.hljs-section {\n  color: #6684e1;\n}\n\n/* Atelier-Dune Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #b854d4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #fefbec;\n  color: #6e6b5e;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-estuary-dark.css",
    "content": "/* Base16 Atelier Estuary Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Estuary Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #878573;\n}\n\n/* Atelier-Estuary Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #ba6236;\n}\n\n/* Atelier-Estuary Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #ae7313;\n}\n\n/* Atelier-Estuary Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #7d9726;\n}\n\n/* Atelier-Estuary Blue */\n.hljs-title,\n.hljs-section {\n  color: #36a166;\n}\n\n/* Atelier-Estuary Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #5f9182;\n}\n\n.hljs-deletion,\n.hljs-addition {\n  color: #22221b;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-deletion {\n  background-color: #ba6236;\n}\n\n.hljs-addition {\n  background-color: #7d9726;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #22221b;\n  color: #929181;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-estuary-light.css",
    "content": "/* Base16 Atelier Estuary Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Estuary Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #6c6b5a;\n}\n\n/* Atelier-Estuary Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #ba6236;\n}\n\n/* Atelier-Estuary Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #ae7313;\n}\n\n/* Atelier-Estuary Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #7d9726;\n}\n\n/* Atelier-Estuary Blue */\n.hljs-title,\n.hljs-section {\n  color: #36a166;\n}\n\n/* Atelier-Estuary Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #5f9182;\n}\n\n.hljs-deletion,\n.hljs-addition {\n  color: #22221b;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-deletion {\n  background-color: #ba6236;\n}\n\n.hljs-addition {\n  background-color: #7d9726;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f4f3ec;\n  color: #5f5e4e;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-forest-dark.css",
    "content": "/* Base16 Atelier Forest Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Forest Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #9c9491;\n}\n\n/* Atelier-Forest Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #f22c40;\n}\n\n/* Atelier-Forest Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #df5320;\n}\n\n/* Atelier-Forest Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #7b9726;\n}\n\n/* Atelier-Forest Blue */\n.hljs-title,\n.hljs-section {\n  color: #407ee7;\n}\n\n/* Atelier-Forest Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #6666ea;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #1b1918;\n  color: #a8a19f;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-forest-light.css",
    "content": "/* Base16 Atelier Forest Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Forest Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #766e6b;\n}\n\n/* Atelier-Forest Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #f22c40;\n}\n\n/* Atelier-Forest Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #df5320;\n}\n\n/* Atelier-Forest Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #7b9726;\n}\n\n/* Atelier-Forest Blue */\n.hljs-title,\n.hljs-section {\n  color: #407ee7;\n}\n\n/* Atelier-Forest Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #6666ea;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f1efee;\n  color: #68615e;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-heath-dark.css",
    "content": "/* Base16 Atelier Heath Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Heath Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #9e8f9e;\n}\n\n/* Atelier-Heath Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #ca402b;\n}\n\n/* Atelier-Heath Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #a65926;\n}\n\n/* Atelier-Heath Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #918b3b;\n}\n\n/* Atelier-Heath Blue */\n.hljs-title,\n.hljs-section {\n  color: #516aec;\n}\n\n/* Atelier-Heath Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #7b59c0;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #1b181b;\n  color: #ab9bab;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-heath-light.css",
    "content": "/* Base16 Atelier Heath Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Heath Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #776977;\n}\n\n/* Atelier-Heath Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #ca402b;\n}\n\n/* Atelier-Heath Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #a65926;\n}\n\n/* Atelier-Heath Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #918b3b;\n}\n\n/* Atelier-Heath Blue */\n.hljs-title,\n.hljs-section {\n  color: #516aec;\n}\n\n/* Atelier-Heath Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #7b59c0;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f7f3f7;\n  color: #695d69;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-lakeside-dark.css",
    "content": "/* Base16 Atelier Lakeside Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Lakeside Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #7195a8;\n}\n\n/* Atelier-Lakeside Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #d22d72;\n}\n\n/* Atelier-Lakeside Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #935c25;\n}\n\n/* Atelier-Lakeside Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #568c3b;\n}\n\n/* Atelier-Lakeside Blue */\n.hljs-title,\n.hljs-section {\n  color: #257fad;\n}\n\n/* Atelier-Lakeside Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #6b6bb8;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #161b1d;\n  color: #7ea2b4;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-lakeside-light.css",
    "content": "/* Base16 Atelier Lakeside Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Lakeside Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #5a7b8c;\n}\n\n/* Atelier-Lakeside Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #d22d72;\n}\n\n/* Atelier-Lakeside Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #935c25;\n}\n\n/* Atelier-Lakeside Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #568c3b;\n}\n\n/* Atelier-Lakeside Blue */\n.hljs-title,\n.hljs-section {\n  color: #257fad;\n}\n\n/* Atelier-Lakeside Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #6b6bb8;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #ebf8ff;\n  color: #516d7b;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-plateau-dark.css",
    "content": "/* Base16 Atelier Plateau Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Plateau Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #7e7777;\n}\n\n/* Atelier-Plateau Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #ca4949;\n}\n\n/* Atelier-Plateau Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #b45a3c;\n}\n\n/* Atelier-Plateau Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #4b8b8b;\n}\n\n/* Atelier-Plateau Blue */\n.hljs-title,\n.hljs-section {\n  color: #7272ca;\n}\n\n/* Atelier-Plateau Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #8464c4;\n}\n\n.hljs-deletion,\n.hljs-addition {\n  color: #1b1818;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-deletion {\n  background-color: #ca4949;\n}\n\n.hljs-addition {\n  background-color: #4b8b8b;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #1b1818;\n  color: #8a8585;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-plateau-light.css",
    "content": "/* Base16 Atelier Plateau Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Plateau Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #655d5d;\n}\n\n/* Atelier-Plateau Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #ca4949;\n}\n\n/* Atelier-Plateau Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #b45a3c;\n}\n\n/* Atelier-Plateau Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #4b8b8b;\n}\n\n/* Atelier-Plateau Blue */\n.hljs-title,\n.hljs-section {\n  color: #7272ca;\n}\n\n/* Atelier-Plateau Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #8464c4;\n}\n\n.hljs-deletion,\n.hljs-addition {\n  color: #1b1818;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-deletion {\n  background-color: #ca4949;\n}\n\n.hljs-addition {\n  background-color: #4b8b8b;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f4ecec;\n  color: #585050;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-savanna-dark.css",
    "content": "/* Base16 Atelier Savanna Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Savanna Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #78877d;\n}\n\n/* Atelier-Savanna Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #b16139;\n}\n\n/* Atelier-Savanna Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #9f713c;\n}\n\n/* Atelier-Savanna Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #489963;\n}\n\n/* Atelier-Savanna Blue */\n.hljs-title,\n.hljs-section {\n  color: #478c90;\n}\n\n/* Atelier-Savanna Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #55859b;\n}\n\n.hljs-deletion,\n.hljs-addition {\n  color: #171c19;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-deletion {\n  background-color: #b16139;\n}\n\n.hljs-addition {\n  background-color: #489963;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #171c19;\n  color: #87928a;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-savanna-light.css",
    "content": "/* Base16 Atelier Savanna Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Savanna Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #5f6d64;\n}\n\n/* Atelier-Savanna Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #b16139;\n}\n\n/* Atelier-Savanna Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #9f713c;\n}\n\n/* Atelier-Savanna Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #489963;\n}\n\n/* Atelier-Savanna Blue */\n.hljs-title,\n.hljs-section {\n  color: #478c90;\n}\n\n/* Atelier-Savanna Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #55859b;\n}\n\n.hljs-deletion,\n.hljs-addition {\n  color: #171c19;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-deletion {\n  background-color: #b16139;\n}\n\n.hljs-addition {\n  background-color: #489963;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #ecf4ee;\n  color: #526057;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-seaside-dark.css",
    "content": "/* Base16 Atelier Seaside Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Seaside Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #809980;\n}\n\n/* Atelier-Seaside Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #e6193c;\n}\n\n/* Atelier-Seaside Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #87711d;\n}\n\n/* Atelier-Seaside Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #29a329;\n}\n\n/* Atelier-Seaside Blue */\n.hljs-title,\n.hljs-section {\n  color: #3d62f5;\n}\n\n/* Atelier-Seaside Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #ad2bee;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #131513;\n  color: #8ca68c;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-seaside-light.css",
    "content": "/* Base16 Atelier Seaside Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Seaside Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #687d68;\n}\n\n/* Atelier-Seaside Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #e6193c;\n}\n\n/* Atelier-Seaside Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #87711d;\n}\n\n/* Atelier-Seaside Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #29a329;\n}\n\n/* Atelier-Seaside Blue */\n.hljs-title,\n.hljs-section {\n  color: #3d62f5;\n}\n\n/* Atelier-Seaside Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #ad2bee;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f4fbf4;\n  color: #5e6e5e;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-sulphurpool-dark.css",
    "content": "/* Base16 Atelier Sulphurpool Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Sulphurpool Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #898ea4;\n}\n\n/* Atelier-Sulphurpool Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #c94922;\n}\n\n/* Atelier-Sulphurpool Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #c76b29;\n}\n\n/* Atelier-Sulphurpool Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #ac9739;\n}\n\n/* Atelier-Sulphurpool Blue */\n.hljs-title,\n.hljs-section {\n  color: #3d8fd1;\n}\n\n/* Atelier-Sulphurpool Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #6679cc;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #202746;\n  color: #979db4;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atelier-sulphurpool-light.css",
    "content": "/* Base16 Atelier Sulphurpool Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n\n/* Atelier-Sulphurpool Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #6b7394;\n}\n\n/* Atelier-Sulphurpool Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-regexp,\n.hljs-link,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #c94922;\n}\n\n/* Atelier-Sulphurpool Orange */\n.hljs-number,\n.hljs-meta,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #c76b29;\n}\n\n/* Atelier-Sulphurpool Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet {\n  color: #ac9739;\n}\n\n/* Atelier-Sulphurpool Blue */\n.hljs-title,\n.hljs-section {\n  color: #3d8fd1;\n}\n\n/* Atelier-Sulphurpool Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #6679cc;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f5f7ff;\n  color: #5e6687;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atom-one-dark.css",
    "content": "/*\n\nAtom One Dark by Daniel Gamage\nOriginal One Dark Syntax theme from https://github.com/atom/one-dark-syntax\n\nbase:    #282c34\nmono-1:  #abb2bf\nmono-2:  #818896\nmono-3:  #5c6370\nhue-1:   #56b6c2\nhue-2:   #61aeee\nhue-3:   #c678dd\nhue-4:   #98c379\nhue-5:   #e06c75\nhue-5-2: #be5046\nhue-6:   #d19a66\nhue-6-2: #e6c07b\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #abb2bf;\n  background: #282c34;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #5c6370;\n  font-style: italic;\n}\n\n.hljs-doctag,\n.hljs-keyword,\n.hljs-formula {\n  color: #c678dd;\n}\n\n.hljs-section,\n.hljs-name,\n.hljs-selector-tag,\n.hljs-deletion,\n.hljs-subst {\n  color: #e06c75;\n}\n\n.hljs-literal {\n  color: #56b6c2;\n}\n\n.hljs-string,\n.hljs-regexp,\n.hljs-addition,\n.hljs-attribute,\n.hljs-meta-string {\n  color: #98c379;\n}\n\n.hljs-built_in,\n.hljs-class .hljs-title {\n  color: #e6c07b;\n}\n\n.hljs-attr,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-type,\n.hljs-selector-class,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-number {\n  color: #d19a66;\n}\n\n.hljs-symbol,\n.hljs-bullet,\n.hljs-link,\n.hljs-meta,\n.hljs-selector-id,\n.hljs-title {\n  color: #61aeee;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-link {\n  text-decoration: underline;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/atom-one-light.css",
    "content": "/*\n\nAtom One Light by Daniel Gamage\nOriginal One Light Syntax theme from https://github.com/atom/one-light-syntax\n\nbase:    #fafafa\nmono-1:  #383a42\nmono-2:  #686b77\nmono-3:  #a0a1a7\nhue-1:   #0184bb\nhue-2:   #4078f2\nhue-3:   #a626a4\nhue-4:   #50a14f\nhue-5:   #e45649\nhue-5-2: #c91243\nhue-6:   #986801\nhue-6-2: #c18401\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #383a42;\n  background: #fafafa;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #a0a1a7;\n  font-style: italic;\n}\n\n.hljs-doctag,\n.hljs-keyword,\n.hljs-formula {\n  color: #a626a4;\n}\n\n.hljs-section,\n.hljs-name,\n.hljs-selector-tag,\n.hljs-deletion,\n.hljs-subst {\n  color: #e45649;\n}\n\n.hljs-literal {\n  color: #0184bb;\n}\n\n.hljs-string,\n.hljs-regexp,\n.hljs-addition,\n.hljs-attribute,\n.hljs-meta-string {\n  color: #50a14f;\n}\n\n.hljs-built_in,\n.hljs-class .hljs-title {\n  color: #c18401;\n}\n\n.hljs-attr,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-type,\n.hljs-selector-class,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-number {\n  color: #986801;\n}\n\n.hljs-symbol,\n.hljs-bullet,\n.hljs-link,\n.hljs-meta,\n.hljs-selector-id,\n.hljs-title {\n  color: #4078f2;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-link {\n  text-decoration: underline;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/brown-paper.css",
    "content": "/*\n\nBrown Paper style from goldblog.com.ua (c) Zaripov Yura <yur4ik7@ukr.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #b7a68e url(./brown-papersq.png);\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal {\n  color: #005599;\n  font-weight: bold;\n}\n\n.hljs,\n.hljs-subst {\n  color: #363c69;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-section,\n.hljs-type,\n.hljs-attribute,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-built_in,\n.hljs-addition,\n.hljs-variable,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-link,\n.hljs-name {\n  color: #2c009f;\n}\n\n.hljs-comment,\n.hljs-quote,\n.hljs-meta,\n.hljs-deletion {\n  color: #802022;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-doctag,\n.hljs-title,\n.hljs-section,\n.hljs-type,\n.hljs-name,\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/codepen-embed.css",
    "content": "/*\n  codepen.io Embed Theme\n  Author: Justin Perry <http://github.com/ourmaninamsterdam>\n  Original theme - https://github.com/chriskempson/tomorrow-theme\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #222;\n  color: #fff;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #777;\n}\n\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag,\n.hljs-regexp,\n.hljs-meta,\n.hljs-number,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-params,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-link,\n.hljs-deletion {\n  color: #ab875d;\n}\n\n.hljs-section,\n.hljs-title,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-type,\n.hljs-attribute {\n  color: #9b869b;\n}\n\n.hljs-string,\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-addition {\n  color: #8f9c6c;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/color-brewer.css",
    "content": "/*\n\nColorbrewer theme\nOriginal: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock <mike@ocks.org>\nPorted by Fabrício Tavares de Oliveira\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #fff;\n}\n\n.hljs,\n.hljs-subst {\n  color: #000;\n}\n\n.hljs-string,\n.hljs-meta,\n.hljs-symbol,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-addition {\n  color: #756bb1;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #636363;\n}\n\n.hljs-number,\n.hljs-regexp,\n.hljs-literal,\n.hljs-bullet,\n.hljs-link {\n  color: #31a354;\n}\n\n.hljs-deletion,\n.hljs-variable {\n  color: #88f;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-title,\n.hljs-section,\n.hljs-built_in,\n.hljs-doctag,\n.hljs-type,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-strong {\n  color: #3182bd;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-attribute {\n  color: #e6550d;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/darcula.css",
    "content": "/*\n\nDarcula color scheme from the JetBrains family of IDEs\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #2b2b2b;\n}\n\n.hljs {\n  color: #bababa;\n}\n\n.hljs-strong,\n.hljs-emphasis {\n  color: #a8a8a2;\n}\n\n.hljs-bullet,\n.hljs-quote,\n.hljs-link,\n.hljs-number,\n.hljs-regexp,\n.hljs-literal {\n  color: #6896ba;\n}\n\n.hljs-code,\n.hljs-selector-class {\n  color: #a6e22e;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-section,\n.hljs-attribute,\n.hljs-name,\n.hljs-variable {\n  color: #cb7832;\n}\n\n.hljs-params {\n  color: #b9b9b9;\n}\n\n.hljs-string {\n  color: #6a8759;\n}\n\n.hljs-subst,\n.hljs-type,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-symbol,\n.hljs-selector-id,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-addition {\n  color: #e0c46c;\n}\n\n.hljs-comment,\n.hljs-deletion,\n.hljs-meta {\n  color: #7f7f7f;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/dark.css",
    "content": "/*\n\nDark style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #444;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-section,\n.hljs-link {\n  color: white;\n}\n\n.hljs,\n.hljs-subst {\n  color: #ddd;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-name,\n.hljs-type,\n.hljs-attribute,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-built_in,\n.hljs-addition,\n.hljs-variable,\n.hljs-template-tag,\n.hljs-template-variable {\n  color: #d88;\n}\n\n.hljs-comment,\n.hljs-quote,\n.hljs-deletion,\n.hljs-meta {\n  color: #777;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-title,\n.hljs-section,\n.hljs-doctag,\n.hljs-type,\n.hljs-name,\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/darkula.css",
    "content": "/*\n  Deprecated due to a typo in the name and left here for compatibility purpose only.\n  Please use darcula.css instead.\n*/\n\n@import url(\"darcula.css\");\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/default.css",
    "content": "/*\n\nOriginal highlight.js style (c) Ivan Sagalaev <maniac@softwaremaniacs.org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #f0f0f0;\n}\n\n/* Base color: saturation 0; */\n\n.hljs,\n.hljs-subst {\n  color: #444;\n}\n\n.hljs-comment {\n  color: #888888;\n}\n\n.hljs-keyword,\n.hljs-attribute,\n.hljs-selector-tag,\n.hljs-meta-keyword,\n.hljs-doctag,\n.hljs-name {\n  font-weight: bold;\n}\n\n/* User color: hue: 0 */\n\n.hljs-type,\n.hljs-string,\n.hljs-number,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-quote,\n.hljs-template-tag,\n.hljs-deletion {\n  color: #880000;\n}\n\n.hljs-title,\n.hljs-section {\n  color: #880000;\n  font-weight: bold;\n}\n\n.hljs-regexp,\n.hljs-symbol,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-link,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n  color: #bc6060;\n}\n\n/* Language color: hue: 90; */\n\n.hljs-literal {\n  color: #78a960;\n}\n\n.hljs-built_in,\n.hljs-bullet,\n.hljs-code,\n.hljs-addition {\n  color: #397300;\n}\n\n/* Meta color: hue: 200 */\n\n.hljs-meta {\n  color: #1f7199;\n}\n\n.hljs-meta-string {\n  color: #4d99bf;\n}\n\n/* Misc effects */\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/docco.css",
    "content": "/*\nDocco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars)\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #000;\n  background: #f8f8ff;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #408080;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-subst {\n  color: #954121;\n}\n\n.hljs-number {\n  color: #40a070;\n}\n\n.hljs-string,\n.hljs-doctag {\n  color: #219161;\n}\n\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-section,\n.hljs-type {\n  color: #19469d;\n}\n\n.hljs-params {\n  color: #00f;\n}\n\n.hljs-title {\n  color: #458;\n  font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-name,\n.hljs-attribute {\n  color: #000080;\n  font-weight: normal;\n}\n\n.hljs-variable,\n.hljs-template-variable {\n  color: #008080;\n}\n\n.hljs-regexp,\n.hljs-link {\n  color: #b68;\n}\n\n.hljs-symbol,\n.hljs-bullet {\n  color: #990073;\n}\n\n.hljs-built_in,\n.hljs-builtin-name {\n  color: #0086b3;\n}\n\n.hljs-meta {\n  color: #999;\n  font-weight: bold;\n}\n\n.hljs-deletion {\n  background: #fdd;\n}\n\n.hljs-addition {\n  background: #dfd;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/dracula.css",
    "content": "/*\n\nDracula Theme v1.2.0\n\nhttps://github.com/zenorocha/dracula-theme\n\nCopyright 2015, All rights reserved\n\nCode licensed under the MIT license\nhttp://zenorocha.mit-license.org\n\n@author Éverton Ribeiro <nuxlli@gmail.com>\n@author Zeno Rocha <hi@zenorocha.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #282a36;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-section,\n.hljs-link {\n  color: #8be9fd;\n}\n\n.hljs-function .hljs-keyword {\n  color: #ff79c6;\n}\n\n.hljs,\n.hljs-subst {\n  color: #f8f8f2;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-name,\n.hljs-type,\n.hljs-attribute,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition,\n.hljs-variable,\n.hljs-template-tag,\n.hljs-template-variable {\n  color: #f1fa8c;\n}\n\n.hljs-comment,\n.hljs-quote,\n.hljs-deletion,\n.hljs-meta {\n  color: #6272a4;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-title,\n.hljs-section,\n.hljs-doctag,\n.hljs-type,\n.hljs-name,\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/far.css",
    "content": "/*\n\nFAR Style (c) MajestiC <majestic2k@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #000080;\n}\n\n.hljs,\n.hljs-subst {\n  color: #0ff;\n}\n\n.hljs-string,\n.hljs-attribute,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-addition {\n  color: #ff0;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-section,\n.hljs-type,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-variable {\n  color: #fff;\n}\n\n.hljs-comment,\n.hljs-quote,\n.hljs-doctag,\n.hljs-deletion {\n  color: #888;\n}\n\n.hljs-number,\n.hljs-regexp,\n.hljs-literal,\n.hljs-link {\n  color: #0f0;\n}\n\n.hljs-meta {\n  color: #008080;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-title,\n.hljs-section,\n.hljs-name,\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/foundation.css",
    "content": "/*\nDescription: Foundation 4 docs style for highlight.js\nAuthor: Dan Allen <dan.j.allen@gmail.com>\nWebsite: http://foundation.zurb.com/docs/\nVersion: 1.0\nDate: 2013-04-02\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #eee;\n  color: black;\n}\n\n.hljs-link,\n.hljs-emphasis,\n.hljs-attribute,\n.hljs-addition {\n  color: #070;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong,\n.hljs-string,\n.hljs-deletion {\n  color: #d14;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-quote,\n.hljs-comment {\n  color: #998;\n  font-style: italic;\n}\n\n.hljs-section,\n.hljs-title {\n  color: #900;\n}\n\n.hljs-class .hljs-title,\n.hljs-type {\n  color: #458;\n}\n\n.hljs-variable,\n.hljs-template-variable {\n  color: #336699;\n}\n\n.hljs-bullet {\n  color: #997700;\n}\n\n.hljs-meta {\n  color: #3344bb;\n}\n\n.hljs-code,\n.hljs-number,\n.hljs-literal,\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #099;\n}\n\n.hljs-regexp {\n  background-color: #fff0ff;\n  color: #880088;\n}\n\n.hljs-symbol {\n  color: #990073;\n}\n\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #007700;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/github-gist.css",
    "content": "/**\n * GitHub Gist Theme\n * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro\n */\n\n.hljs {\n  display: block;\n  background: white;\n  padding: 0.5em;\n  color: #333333;\n  overflow-x: auto;\n}\n\n.hljs-comment,\n.hljs-meta {\n  color: #969896;\n}\n\n.hljs-string,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-strong,\n.hljs-emphasis,\n.hljs-quote {\n  color: #df5000;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-type {\n  color: #a71d5d;\n}\n\n.hljs-literal,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-attribute {\n  color: #0086b3;\n}\n\n.hljs-section,\n.hljs-name {\n  color: #63a35c;\n}\n\n.hljs-tag {\n  color: #333333;\n}\n\n.hljs-title,\n.hljs-attr,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n  color: #795da3;\n}\n\n.hljs-addition {\n  color: #55a532;\n  background-color: #eaffea;\n}\n\n.hljs-deletion {\n  color: #bd2c00;\n  background-color: #ffecec;\n}\n\n.hljs-link {\n  text-decoration: underline;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/github.css",
    "content": "/*\n\ngithub.com style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #333;\n  background: #f8f8f8;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #998;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-subst {\n  color: #333;\n  font-weight: bold;\n}\n\n.hljs-number,\n.hljs-literal,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag .hljs-attr {\n  color: #008080;\n}\n\n.hljs-string,\n.hljs-doctag {\n  color: #d14;\n}\n\n.hljs-title,\n.hljs-section,\n.hljs-selector-id {\n  color: #900;\n  font-weight: bold;\n}\n\n.hljs-subst {\n  font-weight: normal;\n}\n\n.hljs-type,\n.hljs-class .hljs-title {\n  color: #458;\n  font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-name,\n.hljs-attribute {\n  color: #000080;\n  font-weight: normal;\n}\n\n.hljs-regexp,\n.hljs-link {\n  color: #009926;\n}\n\n.hljs-symbol,\n.hljs-bullet {\n  color: #990073;\n}\n\n.hljs-built_in,\n.hljs-builtin-name {\n  color: #0086b3;\n}\n\n.hljs-meta {\n  color: #999;\n  font-weight: bold;\n}\n\n.hljs-deletion {\n  background: #fdd;\n}\n\n.hljs-addition {\n  background: #dfd;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/googlecode.css",
    "content": "/*\n\nGoogle Code style (c) Aahan Krish <geekpanth3r@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: white;\n  color: black;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #800;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-section,\n.hljs-title,\n.hljs-name {\n  color: #008;\n}\n\n.hljs-variable,\n.hljs-template-variable {\n  color: #660;\n}\n\n.hljs-string,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-regexp {\n  color: #080;\n}\n\n.hljs-literal,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-meta,\n.hljs-number,\n.hljs-link {\n  color: #066;\n}\n\n.hljs-title,\n.hljs-doctag,\n.hljs-type,\n.hljs-attr,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-params {\n  color: #606;\n}\n\n.hljs-attribute,\n.hljs-subst {\n  color: #000;\n}\n\n.hljs-formula {\n  background-color: #eee;\n  font-style: italic;\n}\n\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #9b703f;\n}\n\n.hljs-addition {\n  background-color: #baeeba;\n}\n\n.hljs-deletion {\n  background-color: #ffc8bd;\n}\n\n.hljs-doctag,\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/grayscale.css",
    "content": "/*\n\ngrayscale style (c) MY Sun <simonmysun@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #333;\n  background: #fff;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #777;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-subst {\n  color: #333;\n  font-weight: bold;\n}\n\n.hljs-number,\n.hljs-literal {\n  color: #777;\n}\n\n.hljs-string,\n.hljs-doctag,\n.hljs-formula {\n  color: #333;\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAJ0lEQVQIW2O8e/fufwYGBgZBQUEQxcCIIfDu3Tuwivfv30NUoAsAALHpFMMLqZlPAAAAAElFTkSuQmCC) repeat;\n}\n\n.hljs-title,\n.hljs-section,\n.hljs-selector-id {\n  color: #000;\n  font-weight: bold;\n}\n\n.hljs-subst {\n  font-weight: normal;\n}\n\n.hljs-class .hljs-title,\n.hljs-type,\n.hljs-name {\n  color: #333;\n  font-weight: bold;\n}\n\n.hljs-tag {\n  color: #333;\n}\n\n.hljs-regexp {\n  color: #333;\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAPUlEQVQYV2NkQAN37979r6yszIgujiIAU4RNMVwhuiQ6H6wQl3XI4oy4FMHcCJPHcDS6J2A2EqUQpJhohQDexSef15DBCwAAAABJRU5ErkJggg==) repeat;\n}\n\n.hljs-symbol,\n.hljs-bullet,\n.hljs-link {\n  color: #000;\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAKElEQVQIW2NkQAO7d+/+z4gsBhJwdXVlhAvCBECKwIIwAbhKZBUwBQA6hBpm5efZsgAAAABJRU5ErkJggg==) repeat;\n}\n\n.hljs-built_in,\n.hljs-builtin-name {\n  color: #000;\n  text-decoration: underline;\n}\n\n.hljs-meta {\n  color: #999;\n  font-weight: bold;\n}\n\n.hljs-deletion {\n  color: #fff;\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAADCAYAAABS3WWCAAAAE0lEQVQIW2MMDQ39zzhz5kwIAQAyxweWgUHd1AAAAABJRU5ErkJggg==) repeat;\n}\n\n.hljs-addition {\n  color: #000;\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAALUlEQVQYV2N89+7dfwYk8P79ewZBQUFkIQZGOiu6e/cuiptQHAPl0NtNxAQBAM97Oejj3Dg7AAAAAElFTkSuQmCC) repeat;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/gruvbox-dark.css",
    "content": "/*\n\nGruvbox style (dark) (c) Pavel Pertsev (original style at https://github.com/morhetz/gruvbox)\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #282828;\n}\n\n.hljs,\n.hljs-subst {\n  color: #ebdbb2;\n}\n\n/* Gruvbox Red */\n.hljs-deletion,\n.hljs-formula,\n.hljs-keyword,\n.hljs-link,\n.hljs-selector-tag {\n  color: #fb4934;\n}\n\n/* Gruvbox Blue */\n.hljs-built_in,\n.hljs-emphasis,\n.hljs-name,\n.hljs-quote,\n.hljs-strong,\n.hljs-title,\n.hljs-variable {\n  color: #83a598;\n}\n\n/* Gruvbox Yellow */\n.hljs-attr,\n.hljs-params,\n.hljs-template-tag,\n.hljs-type {\n  color: #fabd2f;\n}\n\n/* Gruvbox Purple */\n.hljs-builtin-name,\n.hljs-doctag,\n.hljs-literal,\n.hljs-number {\n  color: #8f3f71;\n}\n\n/* Gruvbox Orange */\n.hljs-code,\n.hljs-meta,\n.hljs-regexp,\n.hljs-selector-id,\n.hljs-template-variable {\n  color: #fe8019;\n}\n\n/* Gruvbox Green */\n.hljs-addition,\n.hljs-meta-string,\n.hljs-section,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-string,\n.hljs-symbol {\n  color: #b8bb26;\n}\n\n/* Gruvbox Aqua */\n.hljs-attribute,\n.hljs-bullet,\n.hljs-class,\n.hljs-function,\n.hljs-function .hljs-keyword,\n.hljs-meta-keyword,\n.hljs-selector-pseudo,\n.hljs-tag {\n  color: #8ec07c;\n}\n\n/* Gruvbox Gray */\n.hljs-comment {\n  color: #928374;\n}\n\n/* Gruvbox Purple */\n.hljs-link_label,\n.hljs-literal,\n.hljs-number {\n  color: #d3869b;\n}\n\n.hljs-comment,\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-section,\n.hljs-strong,\n.hljs-tag {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/gruvbox-light.css",
    "content": "/*\n\nGruvbox style (light) (c) Pavel Pertsev (original style at https://github.com/morhetz/gruvbox)\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #fbf1c7;\n}\n\n.hljs,\n.hljs-subst {\n  color: #3c3836;\n}\n\n/* Gruvbox Red */\n.hljs-deletion,\n.hljs-formula,\n.hljs-keyword,\n.hljs-link,\n.hljs-selector-tag {\n  color: #9d0006;\n}\n\n/* Gruvbox Blue */\n.hljs-built_in,\n.hljs-emphasis,\n.hljs-name,\n.hljs-quote,\n.hljs-strong,\n.hljs-title,\n.hljs-variable {\n  color: #076678;\n}\n\n/* Gruvbox Yellow */\n.hljs-attr,\n.hljs-params,\n.hljs-template-tag,\n.hljs-type {\n  color: #b57614;\n}\n\n/* Gruvbox Purple */\n.hljs-builtin-name,\n.hljs-doctag,\n.hljs-literal,\n.hljs-number {\n  color: #8f3f71;\n}\n\n/* Gruvbox Orange */\n.hljs-code,\n.hljs-meta,\n.hljs-regexp,\n.hljs-selector-id,\n.hljs-template-variable {\n  color: #af3a03;\n}\n\n/* Gruvbox Green */\n.hljs-addition,\n.hljs-meta-string,\n.hljs-section,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-string,\n.hljs-symbol {\n  color: #79740e;\n}\n\n/* Gruvbox Aqua */\n.hljs-attribute,\n.hljs-bullet,\n.hljs-class,\n.hljs-function,\n.hljs-function .hljs-keyword,\n.hljs-meta-keyword,\n.hljs-selector-pseudo,\n.hljs-tag {\n  color: #427b58;\n}\n\n/* Gruvbox Gray */\n.hljs-comment {\n  color: #928374;\n}\n\n/* Gruvbox Purple */\n.hljs-link_label,\n.hljs-literal,\n.hljs-number {\n  color: #8f3f71;\n}\n\n.hljs-comment,\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-section,\n.hljs-strong,\n.hljs-tag {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/hopscotch.css",
    "content": "/*\n * Hopscotch\n * by Jan T. Sott\n * https://github.com/idleberg/Hopscotch\n *\n * This work is licensed under the Creative Commons CC0 1.0 Universal License\n */\n\n/* Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #989498;\n}\n\n/* Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-regexp,\n.hljs-link,\n.hljs-deletion {\n  color: #dd464c;\n}\n\n/* Orange */\n.hljs-number,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params {\n  color: #fd8b19;\n}\n\n/* Yellow */\n.hljs-class .hljs-title {\n  color: #fdcc59;\n}\n\n/* Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition {\n  color: #8fc13e;\n}\n\n/* Aqua */\n.hljs-meta {\n  color: #149b93;\n}\n\n/* Blue */\n.hljs-function,\n.hljs-section,\n.hljs-title {\n  color: #1290bf;\n}\n\n/* Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #c85e7c;\n}\n\n.hljs {\n  display: block;\n  background: #322931;\n  color: #b9b5b8;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/hybrid.css",
    "content": "/*\n\nvim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid)\n\n*/\n\n/*background color*/\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #1d1f21;\n}\n\n/*selection color*/\n.hljs::selection,\n.hljs span::selection {\n  background: #373b41;\n}\n\n.hljs::-moz-selection,\n.hljs span::-moz-selection {\n  background: #373b41;\n}\n\n/*foreground color*/\n.hljs {\n  color: #c5c8c6;\n}\n\n/*color: fg_yellow*/\n.hljs-title,\n.hljs-name {\n  color: #f0c674;\n}\n\n/*color: fg_comment*/\n.hljs-comment,\n.hljs-meta,\n.hljs-meta .hljs-keyword {\n  color: #707880;\n}\n\n/*color: fg_red*/\n.hljs-number,\n.hljs-symbol,\n.hljs-literal,\n.hljs-deletion,\n.hljs-link {\n  color: #cc6666;\n}\n\n/*color: fg_green*/\n.hljs-string,\n.hljs-doctag,\n.hljs-addition,\n.hljs-regexp,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n  color: #b5bd68;\n}\n\n/*color: fg_purple*/\n.hljs-attribute,\n.hljs-code,\n.hljs-selector-id {\n  color: #b294bb;\n}\n\n/*color: fg_blue*/\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-bullet,\n.hljs-tag {\n  color: #81a2be;\n}\n\n/*color: fg_aqua*/\n.hljs-subst,\n.hljs-variable,\n.hljs-template-tag,\n.hljs-template-variable {\n  color: #8abeb7;\n}\n\n/*color: fg_orange*/\n.hljs-type,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-quote,\n.hljs-section,\n.hljs-selector-class {\n  color: #de935f;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/idea.css",
    "content": "/*\n\nIntellij Idea-like styling (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #000;\n  background: #fff;\n}\n\n.hljs-subst,\n.hljs-title {\n  font-weight: normal;\n  color: #000;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #808080;\n  font-style: italic;\n}\n\n.hljs-meta {\n  color: #808000;\n}\n\n.hljs-tag {\n  background: #efefef;\n}\n\n.hljs-section,\n.hljs-name,\n.hljs-literal,\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-type,\n.hljs-selector-id,\n.hljs-selector-class {\n  font-weight: bold;\n  color: #000080;\n}\n\n.hljs-attribute,\n.hljs-number,\n.hljs-regexp,\n.hljs-link {\n  font-weight: bold;\n  color: #0000ff;\n}\n\n.hljs-number,\n.hljs-regexp,\n.hljs-link {\n  font-weight: normal;\n}\n\n.hljs-string {\n  color: #008000;\n  font-weight: bold;\n}\n\n.hljs-symbol,\n.hljs-bullet,\n.hljs-formula {\n  color: #000;\n  background: #d0eded;\n  font-style: italic;\n}\n\n.hljs-doctag {\n  text-decoration: underline;\n}\n\n.hljs-variable,\n.hljs-template-variable {\n  color: #660e7a;\n}\n\n.hljs-addition {\n  background: #baeeba;\n}\n\n.hljs-deletion {\n  background: #ffc8bd;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/ir-black.css",
    "content": "/*\n  IR_Black style (c) Vasily Mikhailitchenko <vaskas@programica.ru>\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #000;\n  color: #f8f8f8;\n}\n\n.hljs-comment,\n.hljs-quote,\n.hljs-meta {\n  color: #7c7c7c;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-tag,\n.hljs-name {\n  color: #96cbfe;\n}\n\n.hljs-attribute,\n.hljs-selector-id {\n  color: #ffffb6;\n}\n\n.hljs-string,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-addition {\n  color: #a8ff60;\n}\n\n.hljs-subst {\n  color: #daefa3;\n}\n\n.hljs-regexp,\n.hljs-link {\n  color: #e9c062;\n}\n\n.hljs-title,\n.hljs-section,\n.hljs-type,\n.hljs-doctag {\n  color: #ffffb6;\n}\n\n.hljs-symbol,\n.hljs-bullet,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-literal {\n  color: #c6c5fe;\n}\n\n.hljs-number,\n.hljs-deletion {\n  color: #ff73fd;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/kimbie.dark.css",
    "content": "/*\n    Name:     Kimbie (dark)\n    Author:   Jan T. Sott\n    License:  Creative Commons Attribution-ShareAlike 4.0 Unported License\n    URL:      https://github.com/idleberg/Kimbie-highlight.js\n*/\n\n/* Kimbie Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #d6baad;\n}\n\n/* Kimbie Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-regexp,\n.hljs-meta {\n  color: #dc3958;\n}\n\n/* Kimbie Orange */\n.hljs-number,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params,\n.hljs-deletion,\n.hljs-link {\n  color: #f79a32;\n}\n\n/* Kimbie Yellow */\n.hljs-title,\n.hljs-section,\n.hljs-attribute {\n  color: #f06431;\n}\n\n/* Kimbie Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition {\n  color: #889b4a;\n}\n\n/* Kimbie Purple */\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-function {\n  color: #98676a;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #221a0f;\n  color: #d3af86;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/kimbie.light.css",
    "content": "/*\n    Name:     Kimbie (light)\n    Author:   Jan T. Sott\n    License:  Creative Commons Attribution-ShareAlike 4.0 Unported License\n    URL:      https://github.com/idleberg/Kimbie-highlight.js\n*/\n\n/* Kimbie Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #a57a4c;\n}\n\n/* Kimbie Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-regexp,\n.hljs-meta {\n  color: #dc3958;\n}\n\n/* Kimbie Orange */\n.hljs-number,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params,\n.hljs-deletion,\n.hljs-link {\n  color: #f79a32;\n}\n\n/* Kimbie Yellow */\n.hljs-title,\n.hljs-section,\n.hljs-attribute {\n  color: #f06431;\n}\n\n/* Kimbie Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition {\n  color: #889b4a;\n}\n\n/* Kimbie Purple */\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-function {\n  color: #98676a;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #fbebd4;\n  color: #84613d;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/magula.css",
    "content": "/*\nDescription: Magula style for highligh.js\nAuthor: Ruslan Keba <rukeba@gmail.com>\nWebsite: http://rukeba.com/\nVersion: 1.0\nDate: 2009-01-03\nMusic: Aphex Twin / Xtal\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background-color: #f4f4f4;\n}\n\n.hljs,\n.hljs-subst {\n  color: black;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-attribute,\n.hljs-addition,\n.hljs-variable,\n.hljs-template-tag,\n.hljs-template-variable {\n  color: #050;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #777;\n}\n\n.hljs-number,\n.hljs-regexp,\n.hljs-literal,\n.hljs-type,\n.hljs-link {\n  color: #800;\n}\n\n.hljs-deletion,\n.hljs-meta {\n  color: #00e;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-doctag,\n.hljs-title,\n.hljs-section,\n.hljs-built_in,\n.hljs-tag,\n.hljs-name {\n  font-weight: bold;\n  color: navy;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/mono-blue.css",
    "content": "/*\n  Five-color theme from a single blue hue.\n*/\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #eaeef3;\n}\n\n.hljs {\n  color: #00193a;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-title,\n.hljs-section,\n.hljs-doctag,\n.hljs-name,\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-comment {\n  color: #738191;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-section,\n.hljs-built_in,\n.hljs-literal,\n.hljs-type,\n.hljs-addition,\n.hljs-tag,\n.hljs-quote,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #0048ab;\n}\n\n.hljs-meta,\n.hljs-subst,\n.hljs-symbol,\n.hljs-regexp,\n.hljs-attribute,\n.hljs-deletion,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-link,\n.hljs-bullet {\n  color: #4c81c9;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/monokai-sublime.css",
    "content": "/*\n\nMonokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #23241f;\n}\n\n.hljs,\n.hljs-tag,\n.hljs-subst {\n  color: #f8f8f2;\n}\n\n.hljs-strong,\n.hljs-emphasis {\n  color: #a8a8a2;\n}\n\n.hljs-bullet,\n.hljs-quote,\n.hljs-number,\n.hljs-regexp,\n.hljs-literal,\n.hljs-link {\n  color: #ae81ff;\n}\n\n.hljs-code,\n.hljs-title,\n.hljs-section,\n.hljs-selector-class {\n  color: #a6e22e;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-name,\n.hljs-attr {\n  color: #f92672;\n}\n\n.hljs-symbol,\n.hljs-attribute {\n  color: #66d9ef;\n}\n\n.hljs-params,\n.hljs-class .hljs-title {\n  color: #f8f8f2;\n}\n\n.hljs-string,\n.hljs-type,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-selector-id,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-addition,\n.hljs-variable,\n.hljs-template-variable {\n  color: #e6db74;\n}\n\n.hljs-comment,\n.hljs-deletion,\n.hljs-meta {\n  color: #75715e;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/monokai.css",
    "content": "/*\nMonokai style - ported by Luigi Maselli - http://grigio.org\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #272822;\n  color: #ddd;\n}\n\n.hljs-tag,\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-strong,\n.hljs-name {\n  color: #f92672;\n}\n\n.hljs-code {\n  color: #66d9ef;\n}\n\n.hljs-class .hljs-title {\n  color: white;\n}\n\n.hljs-attribute,\n.hljs-symbol,\n.hljs-regexp,\n.hljs-link {\n  color: #bf79db;\n}\n\n.hljs-string,\n.hljs-bullet,\n.hljs-subst,\n.hljs-title,\n.hljs-section,\n.hljs-emphasis,\n.hljs-type,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-addition,\n.hljs-variable,\n.hljs-template-tag,\n.hljs-template-variable {\n  color: #a6e22e;\n}\n\n.hljs-comment,\n.hljs-quote,\n.hljs-deletion,\n.hljs-meta {\n  color: #75715e;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-doctag,\n.hljs-title,\n.hljs-section,\n.hljs-type,\n.hljs-selector-id {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/obsidian.css",
    "content": "/**\n * Obsidian style\n * ported by Alexander Marenin (http://github.com/ioncreature)\n */\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #282b2e;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-selector-id {\n  color: #93c763;\n}\n\n.hljs-number {\n  color: #ffcd22;\n}\n\n.hljs {\n  color: #e0e2e4;\n}\n\n.hljs-attribute {\n  color: #668bb0;\n}\n\n.hljs-code,\n.hljs-class .hljs-title,\n.hljs-section {\n  color: white;\n}\n\n.hljs-regexp,\n.hljs-link {\n  color: #d39745;\n}\n\n.hljs-meta {\n  color: #557182;\n}\n\n.hljs-tag,\n.hljs-name,\n.hljs-bullet,\n.hljs-subst,\n.hljs-emphasis,\n.hljs-type,\n.hljs-built_in,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-addition,\n.hljs-variable,\n.hljs-template-tag,\n.hljs-template-variable {\n  color: #8cbbad;\n}\n\n.hljs-string,\n.hljs-symbol {\n  color: #ec7600;\n}\n\n.hljs-comment,\n.hljs-quote,\n.hljs-deletion {\n  color: #818e96;\n}\n\n.hljs-selector-class {\n  color: #a082bd;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-doctag,\n.hljs-title,\n.hljs-section,\n.hljs-type,\n.hljs-name,\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/ocean.css",
    "content": "/* Ocean Dark Theme */\n/* https://github.com/gavsiu */\n/* Original theme - https://github.com/chriskempson/base16 */\n\n/* Ocean Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #65737e;\n}\n\n/* Ocean Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-regexp,\n.hljs-deletion {\n  color: #bf616a;\n}\n\n/* Ocean Orange */\n.hljs-number,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params,\n.hljs-meta,\n.hljs-link {\n  color: #d08770;\n}\n\n/* Ocean Yellow */\n.hljs-attribute {\n  color: #ebcb8b;\n}\n\n/* Ocean Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition {\n  color: #a3be8c;\n}\n\n/* Ocean Blue */\n.hljs-title,\n.hljs-section {\n  color: #8fa1b3;\n}\n\n/* Ocean Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #b48ead;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #2b303b;\n  color: #c0c5ce;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/paraiso-dark.css",
    "content": "/*\n    Paraíso (dark)\n    Created by Jan T. Sott (http://github.com/idleberg)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n*/\n\n/* Paraíso Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #8d8687;\n}\n\n/* Paraíso Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-regexp,\n.hljs-link,\n.hljs-meta {\n  color: #ef6155;\n}\n\n/* Paraíso Orange */\n.hljs-number,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params,\n.hljs-deletion {\n  color: #f99b15;\n}\n\n/* Paraíso Yellow */\n.hljs-title,\n.hljs-section,\n.hljs-attribute {\n  color: #fec418;\n}\n\n/* Paraíso Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition {\n  color: #48b685;\n}\n\n/* Paraíso Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #815ba4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #2f1e2e;\n  color: #a39e9b;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/paraiso-light.css",
    "content": "/*\n    Paraíso (light)\n    Created by Jan T. Sott (http://github.com/idleberg)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n*/\n\n/* Paraíso Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #776e71;\n}\n\n/* Paraíso Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-regexp,\n.hljs-link,\n.hljs-meta {\n  color: #ef6155;\n}\n\n/* Paraíso Orange */\n.hljs-number,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params,\n.hljs-deletion {\n  color: #f99b15;\n}\n\n/* Paraíso Yellow */\n.hljs-title,\n.hljs-section,\n.hljs-attribute {\n  color: #fec418;\n}\n\n/* Paraíso Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition {\n  color: #48b685;\n}\n\n/* Paraíso Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #815ba4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #e7e9db;\n  color: #4f424c;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/pojoaque.css",
    "content": "/*\n\nPojoaque Style by Jason Tate\nhttp://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html\nBased on Solarized Style from http://ethanschoonover.com/solarized\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #dccf8f;\n  background: url(./pojoaque.jpg) repeat scroll left top #181914;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #586e75;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-addition {\n  color: #b64926;\n}\n\n.hljs-number,\n.hljs-string,\n.hljs-doctag,\n.hljs-regexp {\n  color: #468966;\n}\n\n.hljs-title,\n.hljs-section,\n.hljs-built_in,\n.hljs-name {\n  color: #ffb03b;\n}\n\n.hljs-variable,\n.hljs-template-variable,\n.hljs-class .hljs-title,\n.hljs-type,\n.hljs-tag {\n  color: #b58900;\n}\n\n.hljs-attribute {\n  color: #b89859;\n}\n\n.hljs-symbol,\n.hljs-bullet,\n.hljs-link,\n.hljs-subst,\n.hljs-meta {\n  color: #cb4b16;\n}\n\n.hljs-deletion {\n  color: #dc322f;\n}\n\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #d3a60c;\n}\n\n.hljs-formula {\n  background: #073642;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/purebasic.css",
    "content": "/*\n\nPureBASIC native IDE style ( version 1.0 - April 2016 )\n\nby Tristano Ajmone <tajmone@gmail.com>\n\nPublic Domain\n\nNOTE_1:\tPureBASIC code syntax highlighting only applies the following classes:\n\t\t\t.hljs-comment\n\t\t\t.hljs-function\n\t\t\t.hljs-keywords\n\t\t\t.hljs-string\n\t\t\t.hljs-symbol\n\n\t\tOther classes are added here for the benefit of styling other languages with the look and feel of PureBASIC native IDE style.\n\t\tIf you need to customize a stylesheet for PureBASIC only, remove all non-relevant classes -- PureBASIC-related classes are followed by\n\t\ta \"--- used for PureBASIC ... ---\" comment on same line.\n\nNOTE_2:\tColor names provided in comments were derived using \"Name that Color\" online tool:\n\t\t\thttp://chir.ag/projects/name-that-color\n*/\n\n.hljs {\n  /* Common set of rules required by highlight.js (don'r remove!) */\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #ffffdf; /* Half and Half (approx.) */\n  /* --- Uncomment to add PureBASIC native IDE styled font!\n\tfont-family: Consolas;\n*/\n}\n\n.hljs, /* --- used for PureBASIC base color --- */\n.hljs-type,  /* --- used for PureBASIC Procedures return type --- */\n.hljs-function, /* --- used for wrapping PureBASIC Procedures definitions --- */\n.hljs-name,\n.hljs-number,\n.hljs-attr,\n.hljs-params,\n.hljs-subst {\n  color: #000000; /* Black */\n}\n\n.hljs-comment, /* --- used for PureBASIC Comments --- */\n.hljs-regexp,\n.hljs-section,\n.hljs-selector-pseudo,\n.hljs-addition {\n  color: #00aaaa; /* Persian Green (approx.) */\n}\n\n.hljs-title, /* --- used for PureBASIC Procedures Names --- */\n.hljs-tag,\n.hljs-variable,\n.hljs-code {\n  color: #006666; /* Blue Stone (approx.) */\n}\n\n.hljs-keyword, /* --- used for PureBASIC Keywords --- */\n.hljs-class,\n.hljs-meta-keyword,\n.hljs-selector-class,\n.hljs-built_in,\n.hljs-builtin-name {\n  color: #006666; /* Blue Stone (approx.) */\n  font-weight: bold;\n}\n\n.hljs-string, /* --- used for PureBASIC Strings --- */\n.hljs-selector-attr {\n  color: #0080ff; /* Azure Radiance (approx.) */\n}\n\n.hljs-symbol, /* --- used for PureBASIC Constants --- */\n.hljs-link,\n.hljs-deletion,\n.hljs-attribute {\n  color: #924b72; /* Cannon Pink (approx.) */\n}\n\n.hljs-meta,\n.hljs-literal,\n.hljs-selector-id {\n  color: #924b72; /* Cannon Pink (approx.) */\n  font-weight: bold;\n}\n\n.hljs-strong,\n.hljs-name {\n  font-weight: bold;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/qtcreator_dark.css",
    "content": "/*\n\nQt Creator dark color scheme\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #000000;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag,\n.hljs-title {\n  color: #aaaaaa;\n}\n\n.hljs-strong,\n.hljs-emphasis {\n  color: #a8a8a2;\n}\n\n.hljs-bullet,\n.hljs-quote,\n.hljs-number,\n.hljs-regexp,\n.hljs-literal {\n  color: #ff55ff;\n}\n\n.hljs-code .hljs-selector-class {\n  color: #aaaaff;\n}\n\n.hljs-emphasis,\n.hljs-stronge,\n.hljs-type {\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-function,\n.hljs-section,\n.hljs-symbol,\n.hljs-name {\n  color: #ffff55;\n}\n\n.hljs-attribute {\n  color: #ff5555;\n}\n\n.hljs-variable,\n.hljs-params,\n.hljs-class .hljs-title {\n  color: #8888ff;\n}\n\n.hljs-string,\n.hljs-selector-id,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-type,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-addition,\n.hljs-link {\n  color: #ff55ff;\n}\n\n.hljs-comment,\n.hljs-meta,\n.hljs-deletion {\n  color: #55ffff;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/qtcreator_light.css",
    "content": "/*\n\nQt Creator light color scheme\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #ffffff;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag,\n.hljs-title {\n  color: #000000;\n}\n\n.hljs-strong,\n.hljs-emphasis {\n  color: #000000;\n}\n\n.hljs-bullet,\n.hljs-quote,\n.hljs-number,\n.hljs-regexp,\n.hljs-literal {\n  color: #000080;\n}\n\n.hljs-code .hljs-selector-class {\n  color: #800080;\n}\n\n.hljs-emphasis,\n.hljs-stronge,\n.hljs-type {\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-function,\n.hljs-section,\n.hljs-symbol,\n.hljs-name {\n  color: #808000;\n}\n\n.hljs-attribute {\n  color: #800000;\n}\n\n.hljs-variable,\n.hljs-params,\n.hljs-class .hljs-title {\n  color: #0055af;\n}\n\n.hljs-string,\n.hljs-selector-id,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-type,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-addition,\n.hljs-link {\n  color: #008000;\n}\n\n.hljs-comment,\n.hljs-meta,\n.hljs-deletion {\n  color: #008000;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/railscasts.css",
    "content": "/*\n\nRailscasts-like style (c) Visoft, Inc. (Damien White)\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #232323;\n  color: #e6e1dc;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #bc9458;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #c26230;\n}\n\n.hljs-string,\n.hljs-number,\n.hljs-regexp,\n.hljs-variable,\n.hljs-template-variable {\n  color: #a5c261;\n}\n\n.hljs-subst {\n  color: #519f50;\n}\n\n.hljs-tag,\n.hljs-name {\n  color: #e8bf6a;\n}\n\n.hljs-type {\n  color: #da4939;\n}\n\n.hljs-symbol,\n.hljs-bullet,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-attr,\n.hljs-link {\n  color: #6d9cbe;\n}\n\n.hljs-params {\n  color: #d0d0ff;\n}\n\n.hljs-attribute {\n  color: #cda869;\n}\n\n.hljs-meta {\n  color: #9b859d;\n}\n\n.hljs-title,\n.hljs-section {\n  color: #ffc66d;\n}\n\n.hljs-addition {\n  background-color: #144212;\n  color: #e6e1dc;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-deletion {\n  background-color: #600;\n  color: #e6e1dc;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-selector-class {\n  color: #9b703f;\n}\n\n.hljs-selector-id {\n  color: #8b98ab;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-link {\n  text-decoration: underline;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/rainbow.css",
    "content": "/*\n\nStyle with support for rainbow parens\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #474949;\n  color: #d1d9e1;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #969896;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-type,\n.hljs-addition {\n  color: #cc99cc;\n}\n\n.hljs-number,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n  color: #f99157;\n}\n\n.hljs-string,\n.hljs-doctag,\n.hljs-regexp {\n  color: #8abeb7;\n}\n\n.hljs-title,\n.hljs-name,\n.hljs-section,\n.hljs-built_in {\n  color: #b5bd68;\n}\n\n.hljs-variable,\n.hljs-template-variable,\n.hljs-selector-id,\n.hljs-class .hljs-title {\n  color: #ffcc66;\n}\n\n.hljs-section,\n.hljs-name,\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-symbol,\n.hljs-bullet,\n.hljs-subst,\n.hljs-meta,\n.hljs-link {\n  color: #f99157;\n}\n\n.hljs-deletion {\n  color: #dc322f;\n}\n\n.hljs-formula {\n  background: #eee8d5;\n}\n\n.hljs-attr,\n.hljs-attribute {\n  color: #81a2be;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/routeros.css",
    "content": "/*\n\n highlight.js style for Microtik RouterOS script\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #f0f0f0;\n}\n\n/* Base color: saturation 0; */\n\n.hljs,\n.hljs-subst {\n  color: #444;\n}\n\n.hljs-comment {\n  color: #888888;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-meta-keyword,\n.hljs-doctag,\n.hljs-name {\n  font-weight: bold;\n}\n\n.hljs-attribute {\n  color: #0e9a00;\n}\n\n.hljs-function {\n  color: #99069a;\n}\n\n.hljs-builtin-name {\n  color: #99069a;\n}\n\n/* User color: hue: 0 */\n\n.hljs-type,\n.hljs-string,\n.hljs-number,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-quote,\n.hljs-template-tag,\n.hljs-deletion {\n  color: #880000;\n}\n\n.hljs-title,\n.hljs-section {\n  color: #880000;\n  font-weight: bold;\n}\n\n.hljs-regexp,\n.hljs-symbol,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-link,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n  color: #bc6060;\n}\n\n/* Language color: hue: 90; */\n\n.hljs-literal {\n  color: #78a960;\n}\n\n.hljs-built_in,\n.hljs-bullet,\n.hljs-code,\n.hljs-addition {\n  color: #0c9a9a;\n}\n\n/* Meta color: hue: 200 */\n\n.hljs-meta {\n  color: #1f7199;\n}\n\n.hljs-meta-string {\n  color: #4d99bf;\n}\n\n/* Misc effects */\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/school-book.css",
    "content": "/*\n\nSchool Book style from goldblog.com.ua (c) Zaripov Yura <yur4ik7@ukr.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 15px 0.5em 0.5em 30px;\n  font-size: 11px;\n  line-height: 16px;\n}\n\npre {\n  background: #f6f6ae url(./school-book.png);\n  border-top: solid 2px #d2e8b9;\n  border-bottom: solid 1px #d2e8b9;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal {\n  color: #005599;\n  font-weight: bold;\n}\n\n.hljs,\n.hljs-subst {\n  color: #3e5915;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-section,\n.hljs-type,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-attribute,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-addition,\n.hljs-variable,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-link {\n  color: #2c009f;\n}\n\n.hljs-comment,\n.hljs-quote,\n.hljs-deletion,\n.hljs-meta {\n  color: #e60415;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal,\n.hljs-doctag,\n.hljs-title,\n.hljs-section,\n.hljs-type,\n.hljs-name,\n.hljs-selector-id,\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/solarized-dark.css",
    "content": "/*\n\nOrginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #002b36;\n  color: #839496;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #586e75;\n}\n\n/* Solarized Green */\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-addition {\n  color: #859900;\n}\n\n/* Solarized Cyan */\n.hljs-number,\n.hljs-string,\n.hljs-meta .hljs-meta-string,\n.hljs-literal,\n.hljs-doctag,\n.hljs-regexp {\n  color: #2aa198;\n}\n\n/* Solarized Blue */\n.hljs-title,\n.hljs-section,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #268bd2;\n}\n\n/* Solarized Yellow */\n.hljs-attribute,\n.hljs-attr,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-class .hljs-title,\n.hljs-type {\n  color: #b58900;\n}\n\n/* Solarized Orange */\n.hljs-symbol,\n.hljs-bullet,\n.hljs-subst,\n.hljs-meta,\n.hljs-meta .hljs-keyword,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-link {\n  color: #cb4b16;\n}\n\n/* Solarized Red */\n.hljs-built_in,\n.hljs-deletion {\n  color: #dc322f;\n}\n\n.hljs-formula {\n  background: #073642;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/solarized-light.css",
    "content": "/*\n\nOrginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #fdf6e3;\n  color: #657b83;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #93a1a1;\n}\n\n/* Solarized Green */\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-addition {\n  color: #859900;\n}\n\n/* Solarized Cyan */\n.hljs-number,\n.hljs-string,\n.hljs-meta .hljs-meta-string,\n.hljs-literal,\n.hljs-doctag,\n.hljs-regexp {\n  color: #2aa198;\n}\n\n/* Solarized Blue */\n.hljs-title,\n.hljs-section,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #268bd2;\n}\n\n/* Solarized Yellow */\n.hljs-attribute,\n.hljs-attr,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-class .hljs-title,\n.hljs-type {\n  color: #b58900;\n}\n\n/* Solarized Orange */\n.hljs-symbol,\n.hljs-bullet,\n.hljs-subst,\n.hljs-meta,\n.hljs-meta .hljs-keyword,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-link {\n  color: #cb4b16;\n}\n\n/* Solarized Red */\n.hljs-built_in,\n.hljs-deletion {\n  color: #dc322f;\n}\n\n.hljs-formula {\n  background: #eee8d5;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/sunburst.css",
    "content": "/*\n\nSunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #000;\n  color: #f8f8f8;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #aeaeae;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-type {\n  color: #e28964;\n}\n\n.hljs-string {\n  color: #65b042;\n}\n\n.hljs-subst {\n  color: #daefa3;\n}\n\n.hljs-regexp,\n.hljs-link {\n  color: #e9c062;\n}\n\n.hljs-title,\n.hljs-section,\n.hljs-tag,\n.hljs-name {\n  color: #89bdff;\n}\n\n.hljs-class .hljs-title,\n.hljs-doctag {\n  text-decoration: underline;\n}\n\n.hljs-symbol,\n.hljs-bullet,\n.hljs-number {\n  color: #3387cc;\n}\n\n.hljs-params,\n.hljs-variable,\n.hljs-template-variable {\n  color: #3e87e3;\n}\n\n.hljs-attribute {\n  color: #cda869;\n}\n\n.hljs-meta {\n  color: #8996a8;\n}\n\n.hljs-formula {\n  background-color: #0e2231;\n  color: #f8f8f8;\n  font-style: italic;\n}\n\n.hljs-addition {\n  background-color: #253b22;\n  color: #f8f8f8;\n}\n\n.hljs-deletion {\n  background-color: #420e09;\n  color: #f8f8f8;\n}\n\n.hljs-selector-class {\n  color: #9b703f;\n}\n\n.hljs-selector-id {\n  color: #8b98ab;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/tomorrow-night-blue.css",
    "content": "/* Tomorrow Night Blue Theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #7285b7;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-regexp,\n.hljs-deletion {\n  color: #ff9da4;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params,\n.hljs-meta,\n.hljs-link {\n  color: #ffc58f;\n}\n\n/* Tomorrow Yellow */\n.hljs-attribute {\n  color: #ffeead;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition {\n  color: #d1f1a9;\n}\n\n/* Tomorrow Blue */\n.hljs-title,\n.hljs-section {\n  color: #bbdaff;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #ebbbff;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #002451;\n  color: white;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/tomorrow-night-bright.css",
    "content": "/* Tomorrow Night Bright Theme */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #969896;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-regexp,\n.hljs-deletion {\n  color: #d54e53;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params,\n.hljs-meta,\n.hljs-link {\n  color: #e78c45;\n}\n\n/* Tomorrow Yellow */\n.hljs-attribute {\n  color: #e7c547;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition {\n  color: #b9ca4a;\n}\n\n/* Tomorrow Blue */\n.hljs-title,\n.hljs-section {\n  color: #7aa6da;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #c397d8;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: black;\n  color: #eaeaea;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/tomorrow-night-eighties.css",
    "content": "/* Tomorrow Night Eighties Theme */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #999999;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-regexp,\n.hljs-deletion {\n  color: #f2777a;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params,\n.hljs-meta,\n.hljs-link {\n  color: #f99157;\n}\n\n/* Tomorrow Yellow */\n.hljs-attribute {\n  color: #ffcc66;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition {\n  color: #99cc99;\n}\n\n/* Tomorrow Blue */\n.hljs-title,\n.hljs-section {\n  color: #6699cc;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #cc99cc;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #2d2d2d;\n  color: #cccccc;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/tomorrow-night.css",
    "content": "/* Tomorrow Night Theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #969896;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-regexp,\n.hljs-deletion {\n  color: #cc6666;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params,\n.hljs-meta,\n.hljs-link {\n  color: #de935f;\n}\n\n/* Tomorrow Yellow */\n.hljs-attribute {\n  color: #f0c674;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition {\n  color: #b5bd68;\n}\n\n/* Tomorrow Blue */\n.hljs-title,\n.hljs-section {\n  color: #81a2be;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #b294bb;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #1d1f21;\n  color: #c5c8c6;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/tomorrow.css",
    "content": "/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-quote {\n  color: #8e908c;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-regexp,\n.hljs-deletion {\n  color: #c82829;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-literal,\n.hljs-type,\n.hljs-params,\n.hljs-meta,\n.hljs-link {\n  color: #f5871f;\n}\n\n/* Tomorrow Yellow */\n.hljs-attribute {\n  color: #eab700;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition {\n  color: #718c00;\n}\n\n/* Tomorrow Blue */\n.hljs-title,\n.hljs-section {\n  color: #4271ae;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.hljs-selector-tag {\n  color: #8959a8;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: white;\n  color: #4d4d4c;\n  padding: 0.5em;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/vs.css",
    "content": "/*\n\nVisual Studio-like style based on original C# coloring by Jason Diamond <jason@diamond.name>\n\n*/\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: white;\n  color: black;\n}\n\n.hljs-comment,\n.hljs-quote,\n.hljs-variable {\n  color: #008000;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-built_in,\n.hljs-name,\n.hljs-tag {\n  color: #00f;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-section,\n.hljs-attribute,\n.hljs-literal,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-type,\n.hljs-addition {\n  color: #a31515;\n}\n\n.hljs-deletion,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-meta {\n  color: #2b91af;\n}\n\n.hljs-doctag {\n  color: #808080;\n}\n\n.hljs-attr {\n  color: #f00;\n}\n\n.hljs-symbol,\n.hljs-bullet,\n.hljs-link {\n  color: #00b0e8;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/vs2015.css",
    "content": "/*\n * Visual Studio 2015 dark style\n * Author: Nicolas LLOBERA <nllobera@gmail.com>\n */\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #1e1e1e;\n  color: #dcdcdc;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-symbol,\n.hljs-name {\n  color: #569cd6;\n}\n.hljs-link {\n  color: #569cd6;\n  text-decoration: underline;\n}\n\n.hljs-built_in,\n.hljs-type {\n  color: #4ec9b0;\n}\n\n.hljs-number,\n.hljs-class {\n  color: #b8d7a3;\n}\n\n.hljs-string,\n.hljs-meta-string {\n  color: #d69d85;\n}\n\n.hljs-regexp,\n.hljs-template-tag {\n  color: #9a5334;\n}\n\n.hljs-subst,\n.hljs-function,\n.hljs-title,\n.hljs-params,\n.hljs-formula {\n  color: #dcdcdc;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #57a64a;\n  font-style: italic;\n}\n\n.hljs-doctag {\n  color: #608b4e;\n}\n\n.hljs-meta,\n.hljs-meta-keyword,\n.hljs-tag {\n  color: #9b9b9b;\n}\n\n.hljs-variable,\n.hljs-template-variable {\n  color: #bd63c5;\n}\n\n.hljs-attr,\n.hljs-attribute,\n.hljs-builtin-name {\n  color: #9cdcfe;\n}\n\n.hljs-section {\n  color: gold;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n\n/*.hljs-code {\n  font-family:'Monospace';\n}*/\n\n.hljs-bullet,\n.hljs-selector-tag,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n  color: #d7ba7d;\n}\n\n.hljs-addition {\n  background-color: #144212;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-deletion {\n  background-color: #600;\n  display: inline-block;\n  width: 100%;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/xcode.css",
    "content": "/*\n\nXCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #fff;\n  color: black;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #006a00;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-literal {\n  color: #aa0d91;\n}\n\n.hljs-name {\n  color: #008;\n}\n\n.hljs-variable,\n.hljs-template-variable {\n  color: #660;\n}\n\n.hljs-string {\n  color: #c41a16;\n}\n\n.hljs-regexp,\n.hljs-link {\n  color: #080;\n}\n\n.hljs-title,\n.hljs-tag,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-number,\n.hljs-meta {\n  color: #1c00cf;\n}\n\n.hljs-section,\n.hljs-class .hljs-title,\n.hljs-type,\n.hljs-attr,\n.hljs-built_in,\n.hljs-builtin-name,\n.hljs-params {\n  color: #5c2699;\n}\n\n.hljs-attribute,\n.hljs-subst {\n  color: #000;\n}\n\n.hljs-formula {\n  background-color: #eee;\n  font-style: italic;\n}\n\n.hljs-addition {\n  background-color: #baeeba;\n}\n\n.hljs-deletion {\n  background-color: #ffc8bd;\n}\n\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #9b703f;\n}\n\n.hljs-doctag,\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/xt256.css",
    "content": "/*\n  xt256.css\n\n  Contact: initbar [at] protonmail [dot] ch\n         : github.com/initbar\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  color: #eaeaea;\n  background: #000;\n  padding: 0.5;\n}\n\n.hljs-subst {\n  color: #eaeaea;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-builtin-name,\n.hljs-type {\n  color: #eaeaea;\n}\n\n.hljs-params {\n  color: #da0000;\n}\n\n.hljs-literal,\n.hljs-number,\n.hljs-name {\n  color: #ff0000;\n  font-weight: bolder;\n}\n\n.hljs-comment {\n  color: #969896;\n}\n\n.hljs-selector-id,\n.hljs-quote {\n  color: #00ffff;\n}\n\n.hljs-template-variable,\n.hljs-variable,\n.hljs-title {\n  color: #00ffff;\n  font-weight: bold;\n}\n\n.hljs-selector-class,\n.hljs-keyword,\n.hljs-symbol {\n  color: #fff000;\n}\n\n.hljs-string,\n.hljs-bullet {\n  color: #00ff00;\n}\n\n.hljs-tag,\n.hljs-section {\n  color: #000fff;\n}\n\n.hljs-selector-tag {\n  color: #000fff;\n  font-weight: bold;\n}\n\n.hljs-attribute,\n.hljs-built_in,\n.hljs-regexp,\n.hljs-link {\n  color: #ff00ff;\n}\n\n.hljs-meta {\n  color: #fff;\n  font-weight: bolder;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/highlight-styles/zenburn.css",
    "content": "/*\n\nZenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>\nbased on dark.css by Ivan Sagalaev\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #3f3f3f;\n  color: #dcdcdc;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-tag {\n  color: #e3ceab;\n}\n\n.hljs-template-tag {\n  color: #dcdcdc;\n}\n\n.hljs-number {\n  color: #8cd0d3;\n}\n\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attribute {\n  color: #efdcbc;\n}\n\n.hljs-literal {\n  color: #efefaf;\n}\n\n.hljs-subst {\n  color: #8f8f8f;\n}\n\n.hljs-title,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-section,\n.hljs-type {\n  color: #efef8f;\n}\n\n.hljs-symbol,\n.hljs-bullet,\n.hljs-link {\n  color: #dca3a3;\n}\n\n.hljs-deletion,\n.hljs-string,\n.hljs-built_in,\n.hljs-builtin-name {\n  color: #cc9393;\n}\n\n.hljs-addition,\n.hljs-comment,\n.hljs-quote,\n.hljs-meta {\n  color: #7f9f7f;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/icon-select.vue",
    "content": "<template>\n  <a-select>\n    <a-select-option v-for=\"item of options\" :key=\"item.value\" :value=\"item.value\" :label=\"item.label\">\n      <span class=\"flex-o\">\n        <fs-icon :icon=\"item.icon\" class=\"fs-16 color-blue mr-5\" />\n        {{ item.label }}\n      </span>\n    </a-select-option>\n  </a-select>\n</template>\n\n<script lang=\"ts\" setup>\nconst props = defineProps<{\n  options: { value: any; label: string; icon: string }[];\n}>();\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/index.ts",
    "content": "import PiContainer from \"./container.vue\";\nimport TextEditable from \"./editable.vue\";\nimport vip from \"./vip-button/install.js\";\nimport { CheckCircleOutlined, InfoCircleOutlined, UndoOutlined } from \"@ant-design/icons-vue\";\nimport CronEditor from \"./cron-editor/index.vue\";\nimport FoldBox from \"./fold-box.vue\";\nimport { CronLight } from \"@vue-js-cron/light\";\nimport \"@vue-js-cron/light/dist/light.css\";\nimport Plugins from \"./plugins/index\";\nimport LoadingButton from \"./loading-button.vue\";\nimport IconSelect from \"./icon-select.vue\";\nimport ExpiresTimeText from \"./expires-time-text.vue\";\nimport FileInput from \"./file-input.vue\";\nimport PemInput from \"./pem-input.vue\";\nimport { defineAsyncComponent } from \"vue\";\nimport NotificationSelector from \"../views/certd/notification/notification-selector/index.vue\";\nimport EmailSelector from \"./email-selector/index.vue\";\nimport ValidTimeFormat from \"./valid-time-format.vue\";\nexport default {\n  install(app: any) {\n    app.component(\n      \"CodeEditor\",\n      defineAsyncComponent(() => import(\"./code-editor/index.vue\"))\n    );\n    app.component(\"EmailSelector\", EmailSelector);\n    app.component(\"NotificationSelector\", NotificationSelector);\n    app.component(\"PiContainer\", PiContainer);\n    app.component(\"TextEditable\", TextEditable);\n    app.component(\"FileInput\", FileInput);\n    app.component(\"PemInput\", PemInput);\n    app.component(\"ValidTimeFormat\", ValidTimeFormat);\n    // app.component(\"CodeEditor\", CodeEditor);\n\n    app.component(\"CronLight\", CronLight);\n    app.component(\"CronEditor\", CronEditor);\n\n    app.component(\"FoldBox\", FoldBox);\n\n    app.component(\"CheckCircleOutlined\", CheckCircleOutlined);\n    app.component(\"InfoCircleOutlined\", InfoCircleOutlined);\n    app.component(\"UndoOutlined\", UndoOutlined);\n\n    app.component(\"LoadingButton\", LoadingButton);\n    app.component(\"IconSelect\", IconSelect);\n    app.component(\"ExpiresTimeText\", ExpiresTimeText);\n    app.use(vip);\n    app.use(Plugins);\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/loading-button.vue",
    "content": "<template>\n  <a-button :loading=\"loading\" @click=\"onClick\">\n    <slot></slot>\n  </a-button>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from \"vue\";\nconst props = defineProps<{\n  click?: () => Promise<void>;\n}>();\n\nconst loading = ref(false);\nasync function onClick() {\n  loading.value = true;\n  try {\n    if (props.click) {\n      await props.click();\n    }\n  } finally {\n    loading.value = false;\n  }\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/pem-input.vue",
    "content": "<template>\n  <div class=\"pem-input\">\n    <FileInput v-bind=\"fileInput\" class=\"mb-5\" type=\"primary\" text=\"选择文件\" @change=\"onChange\" />\n    <a-textarea v-bind=\"textarea\" :value=\"modelValue\" @update:value=\"emitValue\"></a-textarea>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { notification } from \"ant-design-vue\";\nimport { ref, watch, defineEmits } from \"vue\";\nimport FileInput from \"/@/components/file-input.vue\";\n\nconst props = defineProps<{\n  modelValue?: string;\n  textarea?: any;\n  fileInput?: any;\n}>();\n\nconst emit = defineEmits([\"update:modelValue\"]);\n\nfunction emitValue(value: string) {\n  emit(\"update:modelValue\", value);\n}\n\nfunction onChange(e: any) {\n  const file = e.target.files[0];\n  const size = file.size;\n  if (size > 100 * 1024) {\n    notification.error({\n      message: \"文件超过100k，请选择正确的证书文件\",\n    });\n    return;\n  }\n  const fileReader = new FileReader();\n  fileReader.onload = function (e: any) {\n    const value = e.target.result;\n    emitValue(value);\n  };\n  fileReader.readAsText(file); // 以文本形式读取文件\n}\n</script>\n\n<style lang=\"less\">\n.pem-input {\n  display: flex;\n  flex-direction: column;\n  gap: 5px;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/cert/dns-provider-selector/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/pi/dnsProvider\";\n\nexport async function GetList() {\n  return await request({\n    url: apiPrefix + \"/list\",\n    method: \"post\",\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/cert/dns-provider-selector/index.vue",
    "content": "<template>\n  <icon-select class=\"dns-provider-selector\" :value=\"modelValue\" :options=\"options\" @update:value=\"onChanged\"> </icon-select>\n</template>\n\n<script lang=\"ts\">\nimport { ref } from \"vue\";\nimport * as api from \"./api\";\n\nexport default {\n  name: \"DnsProviderSelector\",\n  props: {\n    modelValue: {\n      type: String,\n      default: undefined,\n    },\n  },\n  emits: [\"update:modelValue\", \"selected-change\"],\n  setup(props: any, ctx: any) {\n    const options = ref<any[]>([]);\n\n    async function onCreate() {\n      const list = await api.GetList();\n      const array: any[] = [];\n      for (let item of list) {\n        array.push({\n          value: item.name,\n          label: item.title,\n          icon: item.icon,\n          accessType: item.accessType,\n        });\n      }\n      options.value = array;\n      // if (props.modelValue == null && options.value.length > 0) {\n      //   ctx.emit(\"update:modelValue\", options.value[0].value);\n      // }\n      onSelectedChange(props.modelValue);\n    }\n    onCreate();\n\n    function onChanged(value: any) {\n      ctx.emit(\"update:modelValue\", value);\n      onSelectedChange(value);\n    }\n    function onSelectedChange(value: any) {\n      if (value) {\n        const option = options.value.find(item => item.value == value);\n        if (option) {\n          ctx.emit(\"selected-change\", option);\n          return;\n        }\n      }\n    }\n    return {\n      options,\n      onChanged,\n    };\n  },\n};\n</script>\n\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/cname/record\";\nconst subDomainApiPrefix = \"/pi/subDomain\";\n\nexport type CnameRecord = {\n  id?: number;\n  status?: string;\n  hostRecord?: string;\n  recordValue?: string;\n  error?: string;\n};\n\nexport type DomainGroupItem = {\n  domain: string;\n  domains?: string[];\n  keySubDomains?: string[];\n};\n\nexport async function GetList() {\n  return await request({\n    url: apiPrefix + \"/list\",\n    method: \"post\",\n  });\n}\n\nexport async function GetByDomain(domain: string) {\n  return await request({\n    url: apiPrefix + \"/getByDomain\",\n    method: \"post\",\n    data: {\n      domain,\n      createOnNotFound: true,\n    },\n  });\n}\n\nexport async function DoVerify(id: number) {\n  return await request({\n    url: apiPrefix + \"/verify\",\n    method: \"post\",\n    data: {\n      id,\n    },\n  });\n}\n\nexport async function ParseDomain(fullDomain: string) {\n  return await request({\n    url: subDomainApiPrefix + \"/parseDomain\",\n    method: \"post\",\n    data: {\n      fullDomain,\n    },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-record-info.vue",
    "content": "<template>\n  <tbody v-if=\"cnameRecord\" class=\"cname-record-info\">\n    <tr>\n      <!--    <td class=\"domain\">-->\n      <!--      {{ props.domain }}-->\n      <!--    </td>-->\n      <td class=\"host-record\" :title=\"'域名：' + props.domain\">\n        <fs-copyable v-model=\"cnameRecord.hostRecord\"></fs-copyable>\n      </td>\n      <td style=\"text-align: center\">CNAME</td>\n      <td class=\"record-value\" :title=\"cnameRecord.recordValue\">\n        <fs-copyable v-model=\"cnameRecord.recordValue\"></fs-copyable>\n      </td>\n      <td class=\"status center flex-center\">\n        <fs-values-format v-model=\"cnameRecord.status\" :dict=\"statusDict\" />\n        <a-tooltip v-if=\"cnameRecord.error\" :title=\"cnameRecord.error\">\n          <fs-icon class=\"ml-5 color-red\" icon=\"ion:warning-outline\"></fs-icon>\n        </a-tooltip>\n      </td>\n      <td class=\"center\">\n        <template v-if=\"cnameRecord.status !== 'valid'\">\n          <a-button type=\"primary\" size=\"small\" :loading=\"loading\" @click=\"doVerify\">点击验证</a-button>\n          <cname-tip :record=\"cnameRecord\"></cname-tip>\n        </template>\n\n        <div v-else class=\"helper\" title=\"后续自动申请证书需要\">不要删除CNAME</div>\n      </td>\n    </tr>\n  </tbody>\n</template>\n\n<script lang=\"ts\" setup>\nimport { CnameRecord, GetByDomain } from \"/@/components/plugins/cert/domains-verify-plan-editor/api\";\nimport { ref, watch } from \"vue\";\nimport { dict } from \"@fast-crud/fast-crud\";\nimport * as api from \"./api.js\";\nimport CnameTip from \"./cname-tip.vue\";\nconst statusDict = dict({\n  data: [\n    { label: \"待设置CNAME\", value: \"cname\", color: \"warning\" },\n    { label: \"验证中\", value: \"validating\", color: \"blue\" },\n    { label: \"验证成功\", value: \"valid\", color: \"green\" },\n    { label: \"验证失败\", value: \"failed\", color: \"red\" },\n    { label: \"验证超时\", value: \"timeout\", color: \"red\" },\n  ],\n});\n\ndefineOptions({\n  name: \"CnameRecordInfo\",\n});\n\nconst props = defineProps<{\n  domain: string;\n}>();\n\nconst emit = defineEmits<{\n  change: [\n    {\n      id: number | null;\n      status: string | null;\n    },\n  ];\n}>();\n\nconst cnameRecord = ref<CnameRecord | null>(null);\n\nfunction onRecordChange() {\n  emit(\"change\", {\n    id: cnameRecord.value?.id,\n    status: cnameRecord.value?.status,\n  });\n}\n\nlet refreshIntervalId: any = null;\nasync function doRefresh() {\n  if (!props.domain) {\n    return;\n  }\n  cnameRecord.value = await GetByDomain(props.domain);\n  onRecordChange();\n\n  if (cnameRecord.value.status === \"validating\") {\n    if (!refreshIntervalId) {\n      refreshIntervalId = setInterval(async () => {\n        await doRefresh();\n      }, 9000);\n    }\n  } else {\n    clearInterval(refreshIntervalId);\n    refreshIntervalId = null;\n  }\n}\n\nwatch(\n  () => props.domain,\n  async value => {\n    await doRefresh();\n  },\n  {\n    immediate: true,\n  }\n);\n\nconst loading = ref(false);\nasync function doVerify() {\n  if (!cnameRecord.value || !cnameRecord.value.id) {\n    return;\n  }\n  loading.value = true;\n  try {\n    await api.DoVerify(cnameRecord.value.id);\n  } finally {\n    loading.value = false;\n  }\n  await doRefresh();\n}\n</script>\n\n<style lang=\"less\">\n.cname-record-info {\n  .fs-copyable {\n    width: 100%;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-tip.vue",
    "content": "<template>\n  <a-tooltip :overlay-style=\"{ maxWidth: '400px' }\">\n    <template #title>\n      <div>\n        <div>多试几次，如果仍然无法验证通过，请按如下步骤排查问题：</div>\n        <div>1. 解析记录应该添加在{{ record.domain }}域名下</div>\n        <div>2. 要添加的是CNAME类型的记录，不是TXT</div>\n        <div>3. 核对记录值是否是:{{ record.recordValue }}</div>\n        <div>4. 运行下面的命令,查看解析是否正确 <fs-copyable :style=\"{ color: '#52c41a' }\" :model-value=\"nslookupCmd\"></fs-copyable></div>\n        <div>5. 如果以上检查都没有问题，则可能是DNS解析生效时间比较慢，某些提供商延迟可能高达几个小时</div>\n      </div>\n    </template>\n    <fs-icon class=\"ml-5 pointer\" icon=\"mingcute:question-line\"></fs-icon>\n  </a-tooltip>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed } from \"vue\";\nconst props = defineProps<{\n  record: any;\n}>();\n\nconst nslookupCmd = computed(() => {\n  return `nslookup -q=txt _acme-challenge.${props.record.domain}`;\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-verify-plan.vue",
    "content": "<template>\n  <table class=\"cname-verify-plan\">\n    <thead>\n      <tr>\n        <td style=\"width: 160px\">主机记录</td>\n        <td style=\"width: 100px; text-align: center\">记录类型</td>\n        <td style=\"width: 250px\">请设置CNAME记录（验证成功以后不要删除）</td>\n        <td style=\"width: 120px\" class=\"center\">状态</td>\n        <td style=\"width: 90px\" class=\"center\">操作</td>\n      </tr>\n    </thead>\n    <template v-for=\"key in domains\" :key=\"key\">\n      <cname-record-info :domain=\"key\" @change=\"onRecordChange(key, $event)\" />\n    </template>\n  </table>\n</template>\n\n<script lang=\"ts\" setup>\nimport { CnameRecord } from \"/@/components/plugins/cert/domains-verify-plan-editor/api\";\nimport CnameRecordInfo from \"/@/components/plugins/cert/domains-verify-plan-editor/cname-record-info.vue\";\nimport { computed } from \"vue\";\n\ndefineOptions({\n  name: \"CnameVerifyPlan\",\n});\n\nconst emit = defineEmits([\"update:modelValue\", \"change\"]);\n\nconst props = defineProps<{\n  modelValue: Record<string, any>;\n}>();\n\nconst domains = computed(() => {\n  return Object.keys(props.modelValue);\n});\n\nfunction onRecordChange(domain: string, record: CnameRecord) {\n  const value = { ...props.modelValue };\n  value[domain] = record;\n  emit(\"update:modelValue\", value);\n  emit(\"change\", value);\n}\n</script>\n\n<style lang=\"less\">\n.cname-verify-plan {\n  width: 100%;\n  table-layout: fixed;\n  tbody tr td {\n    border-top: 1px solid #e8e8e8 !important;\n  }\n  tr {\n    td {\n      border: 0 !important;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n\n      &.center {\n        text-align: center;\n      }\n    }\n    //&:last-child {\n    //  td {\n    //    border-bottom: 0 !important;\n    //  }\n    //}\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/http-verify-plan.vue",
    "content": "<template>\n  <table class=\"http-verify-plan\">\n    <thead>\n      <tr>\n        <td style=\"width: 160px\">网站域名</td>\n        <td style=\"width: 100px; text-align: center\">上传方式</td>\n        <td style=\"width: 150px\">上传授权</td>\n        <td style=\"width: 200px\">网站根目录路径</td>\n      </tr>\n    </thead>\n    <tbody v-if=\"records\" class=\"http-record-body\">\n      <template v-for=\"(item, key) of records\" :key=\"key\">\n        <tr>\n          <td class=\"domain\">\n            {{ item.domain }}\n          </td>\n          <td>\n            <fs-dict-select v-model:value=\"item.httpUploaderType\" :dict=\"uploaderTypeDict\" @change=\"onRecordChange\"></fs-dict-select>\n          </td>\n          <td>\n            <access-selector v-model=\"item.httpUploaderAccess\" :type=\"item.httpUploaderType\" @change=\"onRecordChange\"></access-selector>\n          </td>\n          <td>\n            <a-input v-model:value=\"item.httpUploadRootDir\" placeholder=\"网站根目录，如：/www/wwwroot\" @change=\"onRecordChange\"></a-input>\n          </td>\n        </tr>\n      </template>\n    </tbody>\n  </table>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Ref, ref, watch, nextTick } from \"vue\";\nimport { HttpRecord } from \"/@/components/plugins/cert/domains-verify-plan-editor/type\";\nimport { dict } from \"@fast-crud/fast-crud\";\nimport { Dicts } from \"/@/components/plugins/lib/dicts\";\n\ndefineOptions({\n  name: \"HttpVerifyPlan\",\n});\n\nconst emit = defineEmits([\"update:modelValue\", \"change\"]);\n\nconst props = defineProps<{\n  modelValue: Record<string, any>;\n}>();\n\nconst records: Ref<Record<string, HttpRecord>> = ref({});\n\nwatch(\n  () => {\n    return props.modelValue;\n  },\n  (value: any) => {\n    if (value) {\n      records.value = {\n        ...value,\n      };\n    }\n  },\n  {\n    immediate: true,\n  }\n);\n\nasync function onRecordChange() {\n  await nextTick();\n  emit(\"update:modelValue\", records.value);\n  emit(\"change\", records.value);\n}\n\nconst uploaderTypeDict = Dicts.uploaderTypeDict;\n</script>\n\n<style lang=\"less\">\n.http-verify-plan {\n  width: 100%;\n  table-layout: fixed;\n  tbody tr td {\n    border-top: 1px solid #e8e8e8 !important;\n  }\n  tr {\n    td {\n      border: 0 !important;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n\n      &.center {\n        text-align: center;\n      }\n    }\n    //&:last-child {\n    //  td {\n    //    border-bottom: 0 !important;\n    //  }\n    //}\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/index.vue",
    "content": "<template>\n  <div class=\"domains-verify-plan-editor\" :class=\"{ fullscreen }\">\n    <div class=\"fullscreen-modal\" @click=\"fullscreenExit\"></div>\n    <div class=\"plan-wrapper\">\n      <div class=\"plan-box\">\n        <div class=\"fullscreen-button pointer flex-center\" @click=\"fullscreen = !fullscreen\">\n          <span v-if=\"!fullscreen\" style=\"font-size: 10px\" class=\"flex-center\">\n            这里可以放大\n            <fs-icon icon=\"ion:arrow-forward-outline\"></fs-icon>\n          </span>\n          <fs-icon :icon=\"fullscreen ? 'material-symbols:fullscreen-exit' : 'material-symbols:fullscreen'\"></fs-icon>\n        </div>\n        <table class=\"plan-table\">\n          <thead>\n            <tr>\n              <th style=\"min-width: 100px\">主域名</th>\n              <th>验证方式</th>\n              <th>验证计划</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr v-for=\"(item, key) of planRef\" :key=\"key\" class=\"row\">\n              <td>{{ item.domain }}</td>\n              <td>\n                <div class=\"type\">\n                  <a-select v-model:value=\"item.type\" size=\"small\" :options=\"challengeTypeOptions\" @change=\"onPlanChanged\"></a-select>\n                </div>\n              </td>\n              <td style=\"padding: 0\">\n                <div class=\"plan\">\n                  <div v-if=\"item.type === 'dns'\" class=\"plan-dns\">\n                    <div class=\"form-item\">\n                      <span class=\"label\">DNS类型：</span>\n                      <span class=\"input\">\n                        <fs-dict-select\n                          v-model:value=\"item.dnsProviderType\"\n                          size=\"small\"\n                          :dict=\"dnsProviderTypeDict\"\n                          placeholder=\"DNS提供商\"\n                          @change=\"onPlanChanged\"\n                          @selected-change=\"onDnsProviderChange(item, $event)\"\n                        ></fs-dict-select>\n                      </span>\n                    </div>\n                    <a-divider type=\"vertical\" />\n                    <div class=\"form-item\">\n                      <span class=\"label\">DNS授权：</span>\n                      <span class=\"input\">\n                        <access-selector v-model=\"item.dnsProviderAccessId\" size=\"small\" :type=\"item.dnsProviderAccessType || item.dnsProviderType\" placeholder=\"请选择\" @change=\"onPlanChanged\"></access-selector>\n                      </span>\n                    </div>\n                  </div>\n                  <div v-if=\"item.type === 'cname'\" class=\"plan-cname\">\n                    <cname-verify-plan v-model=\"item.cnameVerifyPlan\" @change=\"onPlanChanged\" />\n                  </div>\n                  <div v-if=\"item.type === 'http'\" class=\"plan-http\">\n                    <http-verify-plan v-model=\"item.httpVerifyPlan\" @change=\"onPlanChanged\" />\n                    <div class=\"helper\">证书颁发机构将请求 https://yourdomain/.well-known/acme-challenge/xxxxxx 来验证域名所有权。</div>\n                  </div>\n                </div>\n              </td>\n            </tr>\n          </tbody>\n        </table>\n        <div class=\"error\">\n          {{ errorMessageRef }}\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, watch } from \"vue\";\nimport { dict, FsDictSelect } from \"@fast-crud/fast-crud\";\nimport AccessSelector from \"/@/views/certd/access/access-selector/index.vue\";\nimport CnameVerifyPlan from \"./cname-verify-plan.vue\";\nimport HttpVerifyPlan from \"./http-verify-plan.vue\";\nimport { Form } from \"ant-design-vue\";\nimport { DomainsVerifyPlanInput } from \"./type\";\nimport { DomainGroupItem, ParseDomain } from \"./api\";\n\ndefineOptions({\n  name: \"DomainsVerifyPlanEditor\",\n});\n\nconst challengeTypeOptions = ref<any[]>([\n  {\n    label: \"DNS验证\",\n    value: \"dns\",\n  },\n  {\n    label: \"CNAME验证\",\n    value: \"cname\",\n  },\n  {\n    label: \"HTTP验证\",\n    value: \"http\",\n  },\n]);\n\nconst props = defineProps<{\n  modelValue?: DomainsVerifyPlanInput;\n  domains?: string[];\n  defaultType?: string;\n}>();\n\nconst emit = defineEmits<{\n  \"update:modelValue\": any;\n}>();\n\nfunction onDnsProviderChange(item: any, option: any) {\n  item.dnsProviderAccessType = option.accessType;\n}\n\nconst fullscreen = ref(false);\nfunction fullscreenExit() {\n  if (fullscreen.value) {\n    fullscreen.value = false;\n  }\n}\nconst planRef = ref<DomainsVerifyPlanInput>(props.modelValue || {});\nconst dnsProviderTypeDict = dict({\n  url: \"pi/dnsProvider/dnsProviderTypeDict\",\n});\n\nconst formItemContext = Form.useInjectFormItemContext();\nfunction onPlanChanged() {\n  console.log(\"plan changed\", planRef.value);\n  emit(\"update:modelValue\", planRef.value);\n  formItemContext.onFieldChange();\n}\n\nconst errorMessageRef = ref<string>(\"\");\nfunction showError(error: string) {\n  errorMessageRef.value = error;\n}\n\ntype DomainGroup = Record<string, DomainGroupItem>;\n\nasync function onDomainsChanged(domains: string[]) {\n  if (domains == null) {\n    return;\n  }\n\n  const domainGroups: DomainGroup = {};\n  for (let domain of domains) {\n    const keyDomain = domain.replace(\"*.\", \"\");\n    const mainDomain = await ParseDomain(keyDomain);\n    if (mainDomain == null) {\n      continue;\n    }\n    let group = domainGroups[mainDomain];\n    if (!group) {\n      group = {\n        domain: mainDomain,\n        domains: [],\n        keySubDomains: [],\n      } as DomainGroupItem;\n      domainGroups[mainDomain] = group;\n    }\n    group.domains.push(domain);\n    group.keySubDomains.push(keyDomain);\n  }\n\n  for (const domain in domainGroups) {\n    let planItem = planRef.value[domain];\n    const domainGroupItem = domainGroups[domain];\n    if (!planItem) {\n      let type = props.defaultType || \"cname\";\n      if (type === \"dnses\") {\n        type = \"dns\";\n      }\n      planItem = {\n        domain,\n        //@ts-ignore\n        type: type,\n        //@ts-ignore\n        cnameVerifyPlan: {},\n        //@ts-ignore\n        httpVerifyPlan: {},\n      };\n      planRef.value[domain] = planItem;\n    }\n    planItem.domains = domainGroupItem.domains;\n\n    const cnameOrigin = planItem.cnameVerifyPlan;\n    const httpOrigin = planItem.httpVerifyPlan;\n    planItem.cnameVerifyPlan = {};\n    planItem.httpVerifyPlan = {};\n    const cnamePlan = planItem.cnameVerifyPlan;\n    const httpPlan = planItem.httpVerifyPlan;\n    for (const subDomain of domainGroupItem.keySubDomains) {\n      if (!cnameOrigin[subDomain]) {\n        //@ts-ignore\n        planItem.cnameVerifyPlan[subDomain] = {\n          id: 0,\n        };\n      } else {\n        planItem.cnameVerifyPlan[subDomain] = cnameOrigin[subDomain];\n      }\n\n      if (!cnamePlan[subDomain]) {\n        //@ts-ignore\n        cnamePlan[subDomain] = {\n          id: 0,\n        };\n      }\n\n      if (!httpOrigin[subDomain]) {\n        //@ts-ignore\n        planItem.httpVerifyPlan[subDomain] = {\n          domain: subDomain,\n        };\n      } else {\n        planItem.httpVerifyPlan[subDomain] = httpOrigin[subDomain];\n      }\n\n      if (!httpPlan[subDomain]) {\n        //@ts-ignore\n        httpPlan[subDomain] = {\n          domain: subDomain,\n        };\n      }\n    }\n\n    for (const subDomain of Object.keys(cnamePlan)) {\n      if (!domainGroupItem.keySubDomains.includes(subDomain)) {\n        delete cnamePlan[subDomain];\n      }\n    }\n\n    for (const subDomain of Object.keys(httpPlan)) {\n      if (!domainGroupItem.keySubDomains.includes(subDomain)) {\n        delete httpPlan[subDomain];\n      }\n    }\n  }\n  for (const domain of Object.keys(planRef.value)) {\n    const mainDomains = Object.keys(domainGroups);\n    if (!mainDomains.includes(domain)) {\n      delete planRef.value[domain];\n    }\n  }\n}\n\nwatch(\n  () => {\n    return props.domains && props.defaultType;\n  },\n  () => {\n    onDomainsChanged(props.domains);\n  },\n  {\n    immediate: true,\n    deep: true,\n  }\n);\n</script>\n\n<style lang=\"less\">\n.domains-verify-plan-editor {\n  width: 100%;\n  min-height: 100px;\n  overflow-x: auto;\n  .fullscreen-modal {\n    display: none;\n  }\n\n  &.fullscreen {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    background-color: rgba(74, 74, 74, 0.78);\n    z-index: 1000;\n    margin: auto;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    .plan-wrapper {\n      width: 1400px;\n      margin: auto;\n      //background-color: #a3a3a3;\n      //padding: 50px;\n      .plan-box {\n        position: relative;\n        margin: auto;\n        background-color: #fff;\n      }\n    }\n\n    .fullscreen-modal {\n      display: block;\n      position: fixed;\n      top: 0;\n      left: 0;\n      right: 0;\n      bottom: 0;\n      width: 100%;\n      height: 100%;\n    }\n  }\n\n  .fullscreen-button {\n    position: absolute;\n    right: 10px;\n    top: 10px;\n    z-index: 1001;\n  }\n\n  .plan-table {\n    width: 100%;\n    height: 100%;\n    //table-layout: fixed;\n    th {\n      background-color: #f5f5f5;\n      border-top: 1px solid #e8e8e8;\n      border-left: 1px solid #e8e8e8;\n      border-bottom: 1px solid #e8e8e8;\n      text-align: left;\n      padding: 10px 6px;\n    }\n    td {\n      border-bottom: 2px solid #d8d8d8;\n      border-left: 1px solid #e8e8e8;\n      padding: 6px 6px;\n    }\n\n    .plan {\n      td {\n        border-right: 1px solid #e8e8e8 !important;\n      }\n      font-size: 14px;\n      .ant-select {\n        width: 100%;\n      }\n      .plan-dns {\n        display: flex;\n        flex-direction: row;\n        justify-content: start;\n        align-items: center;\n        .form-item {\n          min-width: 250px;\n          display: flex;\n          justify-content: center;\n          align-items: center;\n          .label {\n            width: 80px;\n          }\n          .input {\n            width: 150px;\n          }\n        }\n      }\n      .plan-cname {\n        .cname-row {\n          display: flex;\n          flex-direction: row;\n          .domain {\n            width: 100px;\n          }\n          .cname-record {\n            flex: 1;\n          }\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/type.ts",
    "content": "import { CnameRecord } from \"@certd/pipeline\";\n\nexport type HttpRecord = {\n  domain: string;\n  httpUploaderType: string;\n  httpUploaderAccess: number;\n  httpUploadRootDir: string;\n};\n\nexport type DomainVerifyPlanInput = {\n  domain: string;\n  domains: string[];\n  type: \"cname\" | \"dns\" | \"http\";\n  dnsProviderType?: string;\n  dnsProviderAccessType?: string;\n  dnsProviderAccessId?: number;\n  cnameVerifyPlan?: Record<string, CnameRecord>;\n  httpVerifyPlan?: Record<string, HttpRecord>;\n};\nexport type DomainsVerifyPlanInput = {\n  [key: string]: DomainVerifyPlanInput;\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/validator.ts",
    "content": "import Validator from \"async-validator\";\nimport { DomainsVerifyPlanInput } from \"./type\";\n\nfunction checkDomainVerifyPlan(rule: any, value: DomainsVerifyPlanInput) {\n  if (value == null) {\n    return true;\n  }\n  for (const domain in value) {\n    const type = value[domain].type;\n    if (type === \"cname\") {\n      const subDomains = Object.keys(value[domain].cnameVerifyPlan);\n      if (subDomains.length > 0) {\n        for (const subDomain of subDomains) {\n          const plan = value[domain].cnameVerifyPlan[subDomain];\n          if (plan.status !== \"valid\") {\n            throw new Error(`域名${subDomain}的CNAME未验证通过，请先设置CNAME记录，点击验证按钮`);\n          }\n        }\n      }\n    } else if (type === \"http\") {\n      const domains = value[domain].domains || [];\n      for (const item of domains) {\n        //如果有通配符域名则不允许使用http校验\n        if (item.startsWith(\"*.\")) {\n          throw new Error(`域名${item}为通配符域名，不支持HTTP校验`);\n        }\n      }\n\n      const subDomains = Object.keys(value[domain].httpVerifyPlan);\n      if (subDomains.length > 0) {\n        for (const subDomain of subDomains) {\n          const plan = value[domain].httpVerifyPlan[subDomain];\n          if (!plan.httpUploaderType) {\n            throw new Error(`域名${subDomain}的上传方式必须填写`);\n          }\n          if (!plan.httpUploaderAccess) {\n            throw new Error(`域名${subDomain}的上传授权信息必须填写`);\n          }\n          if (!plan.httpUploadRootDir) {\n            throw new Error(`域名${subDomain}的网站根路径必须填写`);\n          }\n        }\n      }\n    } else if (type === \"dns\") {\n      if (!value[domain].dnsProviderType || !value[domain].dnsProviderAccessId) {\n        throw new Error(`DNS模式下，域名${domain}的DNS类型和授权信息必须填写`);\n      }\n    }\n  }\n  return true;\n}\n// 注册自定义验证器\nValidator.register(\"checkDomainVerifyPlan\", checkDomainVerifyPlan);\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/cert/index.ts",
    "content": "export * from \"./domains-verify-plan-editor/validator.js\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/common/api-test.vue",
    "content": "<template>\n  <div class=\"api-test\">\n    <div>\n      <fs-button :loading=\"loading\" type=\"primary\" text=\"测试\" icon=\"ion:refresh-outline\" @click=\"doTest\"></fs-button>\n    </div>\n\n    <div class=\"helper\" :class=\"{ error: hasError }\">\n      {{ message }}\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { ComponentPropsType, doRequest } from \"/@/components/plugins/lib\";\nimport { ref, inject } from \"vue\";\nimport { Form } from \"ant-design-vue\";\n\ndefineOptions({\n  name: \"ApiTest\",\n});\n\nconst getScope: any = inject(\"get:scope\");\nconst getPluginType: any = inject(\"get:plugin:type\", () => {\n  return \"access\";\n});\nconst formItemContext = Form.useInjectFormItemContext();\nconst props = defineProps<{} & ComponentPropsType>();\n\nconst emit = defineEmits<{\n  \"update:value\": any;\n}>();\n\nconst message = ref(\"\");\nconst hasError = ref(false);\nconst loading = ref(false);\nconst doTest = async () => {\n  if (loading.value) {\n    return;\n  }\n\n  formItemContext.onFieldChange();\n\n  const { form } = getScope();\n  const pluginType = getPluginType();\n\n  message.value = \"\";\n  hasError.value = false;\n  loading.value = true;\n  try {\n    const res = await doRequest(\n      {\n        type: pluginType,\n        typeName: form.type,\n        action: props.action,\n        input: pluginType === \"plugin\" ? form.input : form,\n      },\n      {\n        onError(err: any) {\n          hasError.value = true;\n          message.value = `错误：${err.message}`;\n        },\n        showErrorNotify: false,\n      }\n    );\n    message.value = \"测试请求成功\";\n    if (res) {\n      message.value += `，返回：${JSON.stringify(res)}`;\n    }\n  } finally {\n    loading.value = false;\n  }\n};\n</script>\n\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/common/cert-domains-getter.vue",
    "content": "<template>\n  <div class=\"cert-domains-getter\">\n    <div>\n      <a-tag v-for=\"item of modelValue\" :key=\"item\" type=\"success\" class=\"m-3\">{{ item }}</a-tag>\n    </div>\n    <div class=\"helper\">{{ errorRef }}</div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { inject, ref, watch } from \"vue\";\n\ndefineOptions({\n  name: \"CertDomainsGetter\",\n});\n\nconst props = defineProps<{\n  inputKey?: string;\n  modelValue?: string[];\n}>();\n\nconst emit = defineEmits<{\n  \"update:modelValue\": any;\n}>();\n\nconst pipeline: any = inject(\"pipeline\");\n\nfunction findStepFromPipeline(targetStepId: string) {\n  for (const stage of pipeline.value.stages) {\n    for (const task of stage.tasks) {\n      for (const step of task.steps) {\n        if (step.id === targetStepId) {\n          return step;\n        }\n      }\n    }\n  }\n}\n\nconst errorRef = ref(\"\");\nfunction getStepIdFromInputKey(inputKey: string) {\n  if (!inputKey) {\n    errorRef.value = \"请先选择域名证书\";\n    return;\n  }\n  return inputKey.split(\".\")[1];\n}\nfunction getDomainFromPipeline(inputKey: string) {\n  let targetStepId = getStepIdFromInputKey(inputKey);\n  let certStep = findStepFromPipeline(targetStepId);\n  if (!certStep) {\n    errorRef.value = \"找不到目标步骤，请先选择域名证书\";\n    return;\n  }\n\n  const firstLevelValue = certStep.input.cert;\n  if (firstLevelValue && typeof firstLevelValue === \"string\" && firstLevelValue.indexOf(\".\") > 0) {\n    targetStepId = getStepIdFromInputKey(firstLevelValue);\n    certStep = findStepFromPipeline(targetStepId);\n    if (!certStep) {\n      errorRef.value = \"找不到目标步骤，请先选择域名证书\";\n      return;\n    }\n  }\n\n  const domain = certStep.input[\"domains\"];\n  emit(\"update:modelValue\", domain);\n}\n\nwatch(\n  () => {\n    return props.inputKey;\n  },\n  (inputKey: string) => {\n    getDomainFromPipeline(inputKey);\n  },\n  {\n    immediate: true,\n  }\n);\n</script>\n\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/common/input-password.vue",
    "content": "<template>\n  <a-input class=\"cd-input-password\" :class=\"{ show: showRef }\">\n    <template #suffix>\n      <fs-icon class=\"pointer\" :icon=\"computedIcon\" @click=\"showRef = !showRef\" />\n    </template>\n  </a-input>\n</template>\n<script lang=\"ts\" setup>\nimport { computed, ref } from \"vue\";\n\nconst showRef = ref(false);\nconst computedIcon = computed(() => {\n  return showRef.value ? \"ion:eye-outline\" : \"ion:eye-off-outline\";\n});\n</script>\n<style lang=\"less\">\n.cd-input-password {\n  text-security: disc;\n  -webkit-text-security: disc;\n  .fs-iconify {\n    font-size: 16px;\n  }\n  &.show {\n    text-security: none;\n    -webkit-text-security: none;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/common/output-selector/index.vue",
    "content": "<template>\n  <a-select class=\"output-selector\" :value=\"modelValue\" :options=\"options\" @update:value=\"onChanged\"> </a-select>\n</template>\n\n<script lang=\"ts\">\nimport { inject, onMounted, Ref, ref, watch } from \"vue\";\nimport { usePluginStore } from \"/@/store/plugin\";\n\nexport default {\n  name: \"OutputSelector\",\n  props: {\n    modelValue: {\n      type: String,\n      default: undefined,\n    },\n    // eslint-disable-next-line vue/require-default-prop\n    from: {\n      type: [String, Array],\n    },\n  },\n  emits: [\"update:modelValue\"],\n  setup(props: any, ctx: any) {\n    const options = ref<any[]>([]);\n\n    const pipeline = inject(\"pipeline\") as Ref<any>;\n    const currentStageIndex = inject(\"currentStageIndex\") as Ref<number>;\n    const currentTaskIndex = inject(\"currentTaskIndex\") as Ref<number>;\n    const currentStepIndex = inject(\"currentStepIndex\") as Ref<number>;\n    const currentTask = inject(\"currentTask\") as Ref<any>;\n\n    const pluginStore = usePluginStore();\n\n    async function onCreate() {\n      await pluginStore.init();\n      options.value = pluginStore.group.getPreStepOutputOptions({\n        pipeline: pipeline.value,\n        currentStageIndex: currentStageIndex.value,\n        currentTaskIndex: currentTaskIndex.value,\n        currentStepIndex: currentStepIndex.value,\n        currentTask: currentTask.value,\n      });\n      if (props.from) {\n        let froms = [];\n        if (typeof props.from === \"string\") {\n          froms = [props.from];\n        } else {\n          froms = props.from;\n        }\n        function match(from: string, item: any) {\n          // pluginType:valueType:keyName\n          if (from.includes(\":\")) {\n            const [pluginType, valueType, keyName] = from.split(\":\");\n            if (pluginType && item.type !== pluginType) {\n              return false;\n            }\n            if (valueType && item.valueType !== valueType) {\n              return false;\n            }\n            if (keyName && item.key !== keyName) {\n              return false;\n            }\n            return true;\n          } else {\n            return item.type === from;\n          }\n        }\n        options.value = options.value.filter((item: any) => {\n          for (const from of froms) {\n            if (match(from, item)) {\n              return true;\n            }\n          }\n          return false;\n        });\n      }\n\n      if (props.modelValue != null) {\n        const found = options.value.find((item: any) => item.value === props.modelValue);\n        if (!found) {\n          ctx.emit(\"update:modelValue\", undefined);\n        }\n      } else {\n        const value = options.value.length > 0 ? options.value[0].value : undefined;\n        ctx.emit(\"update:modelValue\", value);\n      }\n    }\n    onMounted(async () => {\n      await onCreate();\n    });\n\n    function onChanged(value: any) {\n      ctx.emit(\"update:modelValue\", value);\n    }\n    return {\n      options,\n      onChanged,\n    };\n  },\n};\n</script>\n\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/common/remote-input.vue",
    "content": "<template>\n  <div class=\"remote-input\">\n    <a-input v-bind=\"attrs\" :value=\"modelValue\" @update:value=\"onInputChange\"></a-input>\n    <fs-button class=\"ml-1\" v-bind=\"button\" :text=\"button?.text || title\" @click=\"openDialog\"></fs-button>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { doRequest } from \"/@/components/plugins/lib\";\nimport { inject, ref, useAttrs } from \"vue\";\nimport { useFormWrapper } from \"@fast-crud/fast-crud\";\nimport { notification } from \"ant-design-vue\";\n\ndefineOptions({\n  name: \"RemoteInput\",\n});\nconst { openCrudFormDialog } = useFormWrapper();\nconst props = defineProps<{\n  modelValue: string;\n  title: string;\n  action: string;\n  form?: any;\n  button?: any;\n}>();\n\nconst emit = defineEmits<{\n  \"update:modelValue\": any;\n}>();\n\nconst getScope: any = inject(\"get:scope\");\nconst getPluginType: any = inject(\"get:plugin:type\", () => {\n  return \"plugin\";\n});\n\nconst attrs = useAttrs();\n\nconst loading = ref(false);\n\nfunction onInputChange(value: string) {\n  emit(\"update:modelValue\", value);\n}\n\nasync function openDialog() {\n  function createCrudOptions() {\n    return {\n      crudOptions: {\n        columns: {\n          ...props.form.columns,\n        },\n        form: {\n          wrapper: {\n            title: props.title,\n            saveRemind: false,\n          },\n          afterSubmit() {\n            notification.success({ message: \"操作成功\" });\n          },\n          async doSubmit({ form }: any) {\n            return await doPluginFormSubmit(form);\n          },\n        },\n      },\n    };\n  }\n  const { crudOptions } = createCrudOptions();\n  await openCrudFormDialog({ crudOptions });\n}\n\nconst doPluginFormSubmit = async (data: any) => {\n  if (loading.value) {\n    return;\n  }\n\n  loading.value = true;\n  try {\n    const pluginType = getPluginType();\n    const { form } = getScope();\n    const res = await doRequest({\n      type: pluginType,\n      typeName: form.type,\n      action: props.action,\n      input: pluginType === \"plugin\" ? form.input : form,\n      data: data,\n    });\n    //获取返回值 填入到input中\n    emit(\"update:modelValue\", res);\n    return res;\n  } finally {\n    loading.value = false;\n  }\n};\n</script>\n<style lang=\"less\">\n.remote-input {\n  width: 100%;\n  display: flex;\n  align-items: center;\n  .a-input {\n    flex: 1;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/common/remote-select.vue",
    "content": "<template>\n  <div class=\"remote-select\">\n    <div class=\"flex flex-row\">\n      <a-select class=\"remote-select-input\" show-search :filter-option=\"filterOption\" :options=\"optionsRef\" :value=\"value\" v-bind=\"attrs\" @click=\"onClick\" @update:value=\"emit('update:value', $event)\">\n        <template #dropdownRender=\"{ menuNode: menu }\">\n          <template v-if=\"search\">\n            <div class=\"flex w-full\" style=\"padding: 4px 8px\">\n              <a-input ref=\"inputRef\" v-model:value=\"searchKeyRef\" class=\"flex-1\" allow-clear placeholder=\"查询关键字\" @keydown.enter=\"doSearch\" />\n              <a-button class=\"ml-2\" :loading=\"loading\" type=\"text\" @click=\"doSearch\">\n                <template #icon>\n                  <search-outlined />\n                </template>\n                查询\n              </a-button>\n            </div>\n            <div v-if=\"hasError\" class=\"helper p-2\" :class=\"{ error: hasError }\">\n              {{ message }}\n            </div>\n            <a-divider style=\"margin: 4px 0\" />\n          </template>\n          <v-nodes :vnodes=\"menu\" />\n\n          <div v-if=\"pager === true\" class=\"pager text-center p-5\">\n            <a-pagination v-model:current=\"pagerRef.pageNo\" simple :total=\"pagerRef.total\" :page-size=\"pagerRef.pageSize\" @change=\"onPageChange\" />\n          </div>\n        </template>\n      </a-select>\n      <div class=\"ml-5\">\n        <fs-button :loading=\"loading\" title=\"刷新选项\" icon=\"ion:refresh-outline\" @click=\"refreshOptions\"></fs-button>\n      </div>\n    </div>\n    <div class=\"helper\" :class=\"{ error: hasError }\">\n      {{ message }}\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { ComponentPropsType, doRequest } from \"/@/components/plugins/lib\";\nimport { defineComponent, inject, ref, useAttrs, watch, Ref } from \"vue\";\nimport { PluginDefine } from \"@certd/pipeline\";\n\ndefineOptions({\n  name: \"RemoteSelect\",\n});\n\nconst VNodes = defineComponent({\n  props: {\n    vnodes: {\n      type: Object,\n      required: true,\n    },\n  },\n  render() {\n    return this.vnodes;\n  },\n});\n\nconst props = defineProps<\n  {\n    watches: string[];\n    search?: boolean;\n    pager?: boolean;\n  } & ComponentPropsType\n>();\n\nconst emit = defineEmits<{\n  \"update:value\": any;\n}>();\n\nconst attrs = useAttrs();\n\nconst getCurrentPluginDefine: any = inject(\"getCurrentPluginDefine\", () => {\n  return {};\n});\nconst getScope: any = inject(\"get:scope\", () => {\n  return {};\n});\nconst getPluginType: any = inject(\"get:plugin:type\", () => {\n  return \"plugin\";\n});\n\nconst searchKeyRef = ref(\"\");\nconst optionsRef = ref([]);\nconst message = ref(\"\");\nconst hasError = ref(false);\nconst loading = ref(false);\nconst pagerRef: Ref = ref({\n  current: 1,\n});\nconst getOptions = async () => {\n  if (loading.value) {\n    return;\n  }\n\n  if (!getCurrentPluginDefine) {\n    return;\n  }\n\n  const define: PluginDefine = getCurrentPluginDefine()?.value;\n  if (!define) {\n    return;\n  }\n  const pluginType = getPluginType();\n  const { form } = getScope();\n  const input = (pluginType === \"plugin\" ? form?.input : form) || {};\n\n  for (let key in define.input) {\n    const inWatches = props.watches.includes(key);\n    const inputDefine = define.input[key];\n    if (inWatches && inputDefine.required) {\n      const value = input[key];\n      if (value == null || value === \"\") {\n        console.log(\"remote-select required\", key);\n        return;\n      }\n    }\n  }\n\n  message.value = \"\";\n  hasError.value = false;\n  loading.value = true;\n  const pageNo = pagerRef.value.pageNo;\n  const pageSize = pagerRef.value.pageSize;\n  try {\n    const res = await doRequest(\n      {\n        type: pluginType,\n        typeName: form.type,\n        action: props.action,\n        input,\n        data: {\n          searchKey: props.search ? searchKeyRef.value : \"\",\n          pageNo,\n          pageSize,\n        },\n      },\n      {\n        onError(err: any) {\n          hasError.value = true;\n          message.value = `获取选项出错：${err.message}`;\n        },\n        showErrorNotify: false,\n      }\n    );\n    const list = res?.list || res || [];\n    if (list.length > 0) {\n      message.value = \"获取数据成功，请从下拉框中选择\";\n    }\n    optionsRef.value = list;\n    pagerRef.value.total = list.length;\n    if (props.pager) {\n      if (res.pageNo != null) {\n        pagerRef.value.pageNo = res.pageNo ?? 1;\n      }\n      if (res.pageSize != null) {\n        pagerRef.value.pageSize = res.pageSize ?? 100;\n      }\n      if (res.total != null) {\n        pagerRef.value.total = res.total ?? list.length;\n      }\n    }\n\n    return res;\n  } finally {\n    loading.value = false;\n  }\n};\n\nconst filterOption = (input: string, option: any) => {\n  return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0 || String(option.value).toLowerCase().indexOf(input.toLowerCase());\n};\n\nasync function onClick() {\n  if (optionsRef.value?.length === 0) {\n    await refreshOptions();\n  }\n}\n\nasync function refreshOptions() {\n  await getOptions();\n}\n\nasync function doSearch() {\n  pagerRef.value.pageNo = 1;\n  await refreshOptions();\n}\n\nwatch(\n  () => {\n    const pluginType = getPluginType();\n    const { form, key } = getScope();\n    const input = (pluginType === \"plugin\" ? form?.input : form) || {};\n    const watches = {};\n    for (const key of props.watches) {\n      //@ts-ignore\n      watches[key] = input[key];\n    }\n    return {\n      form: watches,\n      key,\n    };\n  },\n  async (value, oldValue) => {\n    const { form } = value;\n    const oldForm: any = oldValue?.form;\n    let changed = oldForm == null || optionsRef.value.length == 0;\n    for (const key of props.watches) {\n      //@ts-ignore\n      if (oldForm && form[key] != oldForm[key]) {\n        changed = true;\n        break;\n      }\n    }\n    if (changed) {\n      await getOptions();\n    }\n  },\n  {\n    immediate: true,\n  }\n);\n\nasync function onPageChange(current: any) {\n  await refreshOptions();\n}\n</script>\n\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/index.ts",
    "content": "import SynologyIdDeviceGetter from \"./synology/device-id-getter.vue\";\nimport RemoteSelect from \"./common/remote-select.vue\";\nimport RemoteInput from \"./common/remote-input.vue\";\nimport CertDomainsGetter from \"./common/cert-domains-getter.vue\";\nimport OutputSelector from \"/@/components/plugins/common/output-selector/index.vue\";\nimport DnsProviderSelector from \"/@/components/plugins/cert/dns-provider-selector/index.vue\";\nimport DomainsVerifyPlanEditor from \"/@/components/plugins/cert/domains-verify-plan-editor/index.vue\";\nimport AccessSelector from \"/@/views/certd/access/access-selector/index.vue\";\nimport InputPassword from \"./common/input-password.vue\";\nimport CertInfoUpdater from \"/@/views/certd/pipeline/cert-upload/index.vue\";\nimport ApiTest from \"./common/api-test.vue\";\nexport * from \"./cert/index.js\";\nexport default {\n  install(app: any) {\n    app.component(\"OutputSelector\", OutputSelector);\n    app.component(\"DnsProviderSelector\", DnsProviderSelector);\n    app.component(\"DomainsVerifyPlanEditor\", DomainsVerifyPlanEditor);\n    app.component(\"AccessSelector\", AccessSelector);\n    app.component(\"CertInfoUpdater\", CertInfoUpdater);\n\n    app.component(\"ApiTest\", ApiTest);\n\n    app.component(\"SynologyDeviceIdGetter\", SynologyIdDeviceGetter);\n    app.component(\"RemoteSelect\", RemoteSelect);\n    app.component(\"RemoteInput\", RemoteInput);\n    app.component(\"CertDomainsGetter\", CertDomainsGetter);\n    app.component(\"InputPassword\", InputPassword);\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/lib/dicts.ts",
    "content": "import { dict } from \"@fast-crud/fast-crud\";\n\nexport const Dicts = {\n  sslProviderDict: dict({\n    data: [\n      { value: \"letsencrypt\", label: \"Let‘s Encrypt\" },\n      { value: \"zerossl\", label: \"ZeroSSL\" },\n    ],\n  }),\n  challengeTypeDict: dict({\n    data: [\n      { value: \"dns\", label: \"DNS校验\", color: \"green\" },\n      { value: \"cname\", label: \"CNAME代理校验\", color: \"blue\" },\n      { value: \"http\", label: \"HTTP校验\", color: \"yellow\" },\n    ],\n  }),\n  dnsProviderTypeDict: dict({\n    url: \"pi/dnsProvider/dnsProviderTypeDict\",\n  }),\n  uploaderTypeDict: dict({\n    data: [\n      { label: \"SFTP\", value: \"sftp\" },\n      { label: \"FTP\", value: \"ftp\" },\n      { label: \"阿里云OSS\", value: \"alioss\" },\n      { label: \"腾讯云COS\", value: \"tencentcos\" },\n      { label: \"七牛OSS\", value: \"qiniuoss\" },\n      { label: \"S3/Minio\", value: \"s3\" },\n      { label: \"SSH(已废弃，请选择SFTP方式)\", value: \"ssh\", disabled: true },\n    ],\n  }),\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/lib/index.ts",
    "content": "import { request } from \"/@/api/service\";\nexport type ComponentPropsType = {\n  type?: string;\n  typeName?: string;\n  action: string;\n  form?: any;\n  value?: any;\n};\nexport type RequestHandleReq<T = any> = {\n  type: string;\n  typeName: string;\n  action: string;\n  data?: any;\n  input: T;\n};\n\nexport async function doRequest(req: RequestHandleReq, opts: any = {}) {\n  const url = `/pi/handle/${req.type}`;\n  const { typeName, action, data, input } = req;\n  const res = await request({\n    url,\n    method: \"post\",\n    data: {\n      typeName,\n      action,\n      data,\n      input,\n    },\n    ...opts,\n  });\n  return res;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/plugins/synology/device-id-getter.vue",
    "content": "<template>\n  <div>\n    <contextHolder />\n    <a-input v-bind=\"attrs\" :value=\"value\" :allow-clear=\"true\" @update:value=\"emit('update:value', $event)\">\n      <template #suffix>\n        <a-tag class=\"cursor-pointer\" @click=\"getDeviceId\">获取设备ID</a-tag>\n      </template>\n    </a-input>\n  </div>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { defineProps, inject, ref, useAttrs } from \"vue\";\nimport { Modal } from \"ant-design-vue\";\nimport { ComponentPropsType, doRequest } from \"/@/components/plugins/lib\";\n\ndefineOptions({\n  name: \"DeviceIdGetter\",\n});\n\nconst props = defineProps<ComponentPropsType>();\nconst emit = defineEmits<{\n  \"update:value\": any;\n}>();\n\nconst attrs = useAttrs();\n\nconst otpCodeRef = ref(\"\");\nconst getScope: any = inject(\"get:scope\");\nconst getPluginType: any = inject(\"get:plugin:type\", () => {\n  return \"access\";\n});\n\nasync function loginWithOTPCode(otpCode: string) {\n  const { form } = getScope();\n  const pluginType = getPluginType();\n\n  return await doRequest({\n    type: pluginType,\n    typeName: form.type,\n    action: \"LoginWithOPTCode\",\n    data: {\n      otpCode,\n    },\n    input: form,\n  });\n}\n\nconst [modal, contextHolder] = Modal.useModal();\nasync function getDeviceId() {\n  //打开对话框\n  modal.confirm({\n    title: \"请输入OTP验证码\",\n    maskClosable: true,\n    content: () => {\n      return (\n        <a-form-item-rest>\n          <a-input v-model:value={otpCodeRef.value} placeholder=\"请输入OTP验证码\" />\n        </a-form-item-rest>\n      );\n    },\n    onOk: async () => {\n      const res = await loginWithOTPCode(otpCodeRef.value);\n      console.log(\"did返回\", res);\n      emit(\"update:value\", res.did);\n    },\n  });\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/tutorial/index.vue",
    "content": "<script setup lang=\"ts\">\nimport { ref } from \"vue\";\nimport TutorialSteps from \"/@/components/tutorial/tutorial-steps.vue\";\n\ndefineOptions({\n  name: \"TutorialModal\",\n});\n\nconst props = defineProps<{\n  showIcon?: boolean;\n}>();\n\nconst openedRef = ref(false);\nfunction open() {\n  openedRef.value = true;\n}\nconst slots = defineSlots();\n</script>\n\n<template>\n  <div class=\"tutorial-button pointer\" @click=\"open\">\n    <template v-if=\"!slots.default\">\n      <fs-icon v-if=\"showIcon === false\" icon=\"ant-design:question-circle-outlined\" class=\"mr-0.5\"></fs-icon>\n      <div class=\"hidden md:block\">{{ $t(\"tutorial.title\") }}</div>\n    </template>\n    <slot></slot>\n    <a-modal v-model:open=\"openedRef\" class=\"tutorial-modal\" width=\"90%\">\n      <template #title>{{ $t(\"tutorial.title\") }}</template>\n      <tutorial-steps v-if=\"openedRef\" />\n      <template #footer></template>\n    </a-modal>\n  </div>\n</template>\n\n<style lang=\"less\">\n.tutorial-modal {\n  top: 50px;\n  .ant-modal-body {\n    height: 80vh;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/tutorial/simple-steps.vue",
    "content": "<template>\n  <a-steps :current=\"3\" class=\"mt-10\" size=\"small\" :items=\"steps\" @click=\"goPipeline\"></a-steps>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useRouter } from \"vue-router\";\nimport { useI18n } from \"vue-i18n\";\n\nconst { t } = useI18n();\n\ntype Step = {\n  title: string;\n  description?: string;\n};\n\nimport { ref } from \"vue\";\n\nconst steps = ref<Step[]>([{ title: t(\"certd.steps.createPipeline\") }, { title: t(\"certd.steps.addTask\") }, { title: t(\"certd.steps.scheduledRun\") }]);\n\nconst router = useRouter();\nfunction goPipeline() {\n  router.push({ path: \"/certd/pipeline\" });\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/tutorial/tutorial-steps.vue",
    "content": "<template>\n  <div class=\"flex-col h-100 tutorial-steps\">\n    <a-steps v-model:current=\"current\" class=\"mt-10\" :percent=\"percent\" size=\"small\" :items=\"steps\" @change=\"stepChanged\"></a-steps>\n\n    <div class=\"step-item overflow-hidden\">\n      <div class=\"text\">\n        <h3 class=\"title\">{{ number }} {{ currentStepItem.title }}</h3>\n        <div class=\"description mt-5\">\n          <div v-for=\"desc of currentStepItem.descriptions\">{{ desc }}</div>\n        </div>\n        <div v-if=\"currentStepItem.body\">\n          <fs-render :render-func=\"currentStepItem.body\" />\n        </div>\n      </div>\n      <template v-if=\"currentStepItem.image\">\n        <div class=\"image-box\">\n          <a-image :src=\"currentStepItem.image\" :preview-mask=\"previewMask\" />\n        </div>\n      </template>\n    </div>\n\n    <div class=\"flex-center actions\">\n      <fs-button class=\"m-10\" icon=\"ion:arrow-back-outline\" @click=\"prev()\">{{ t(\"guide.buttons.prev\") }}</fs-button>\n      <fs-button class=\"m-10\" type=\"primary\" icon-right=\"ion:arrow-forward-outline\" @click=\"next()\">{{ t(\"guide.buttons.next\") }}</fs-button>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"tsx\">\nimport { FsRender } from \"@fast-crud/fast-crud\";\nimport { useI18n } from \"vue-i18n\";\n\nconst { t } = useI18n();\nimport SimpleSteps from \"./simple-steps.vue\";\ntype Step = {\n  title: string;\n  subTitle?: string;\n  description?: string;\n  items: StepItems[];\n};\ntype StepItems = {\n  image?: string;\n  title: string;\n  descriptions?: string[];\n  body?: () => JSX.Element;\n};\n\nimport { computed, nextTick, ref } from \"vue\";\n\nconst steps = ref<Step[]>([\n  {\n    title: t(\"guide.createCertPipeline.title\"),\n    description: t(\"guide.createCertPipeline.description\"),\n    items: [\n      {\n        title: t(\"guide.createCertPipeline.items.tutorialTitle\"),\n        descriptions: [t(\"guide.createCertPipeline.items.tutorialDesc1\"), t(\"guide.createCertPipeline.items.tutorialDesc2\")],\n        body: () => {\n          return <SimpleSteps></SimpleSteps>;\n        },\n      },\n      {\n        image: \"/static/doc/images/1-add.png\",\n        title: t(\"guide.createCertPipeline.items.createTitle\"),\n        descriptions: [t(\"guide.createCertPipeline.items.createDesc\")],\n      },\n      {\n        image: \"/static/doc/images/3-add-success.png\",\n        title: t(\"guide.createCertPipeline.items.successTitle\"),\n        descriptions: [t(\"guide.createCertPipeline.items.successDesc\")],\n      },\n      {\n        title: t(\"guide.createCertPipeline.items.nextTitle\"),\n        descriptions: [t(\"guide.createCertPipeline.items.nextDesc\")],\n      },\n    ],\n  },\n  {\n    title: t(\"guide.addDeployTask.title\"),\n    description: t(\"guide.addDeployTask.description\"),\n    items: [\n      {\n        image: \"/static/doc/images/5-1-add-host.png\",\n        title: t(\"guide.addDeployTask.items.addTaskTitle\"),\n        descriptions: [t(\"guide.addDeployTask.items.addTaskDesc1\"), t(\"guide.addDeployTask.items.addTaskDesc2\")],\n      },\n      {\n        image: \"/static/doc/images/5-2-add-host.png\",\n        title: t(\"guide.addDeployTask.items.fillParamsTitle\"),\n        descriptions: [t(\"guide.addDeployTask.items.fillParamsDesc1\"), t(\"guide.addDeployTask.items.fillParamsDesc2\")],\n      },\n      {\n        image: \"/static/doc/images/5-3-add-host.png\",\n        title: t(\"guide.addDeployTask.items.activateCertTitle\"),\n        descriptions: [t(\"guide.addDeployTask.items.activateCertDesc1\"), t(\"guide.addDeployTask.items.activateCertDesc2\")],\n      },\n      {\n        image: \"/static/doc/images/5-4-add-host.png\",\n        title: t(\"guide.addDeployTask.items.taskSuccessTitle\"),\n        descriptions: [t(\"guide.addDeployTask.items.taskSuccessDesc\")],\n      },\n      {\n        image: \"/static/doc/images/5-5-plugin-list.png\",\n        title: t(\"guide.addDeployTask.items.pluginsTitle\"),\n        descriptions: [t(\"guide.addDeployTask.items.pluginsDesc\")],\n      },\n    ],\n  },\n  {\n    title: t(\"guide.runAndTestTask.runAndTestTitle\"),\n    description: t(\"guide.runAndTestTask.runAndTestDescription\"),\n    items: [\n      {\n        image: \"/static/doc/images/9-start.png\",\n        title: t(\"guide.runAndTestTask.runTestOnce\"),\n        descriptions: [t(\"guide.runAndTestTask.clickManualTriggerToTest\")],\n      },\n      {\n        image: \"/static/doc/images/10-1-log.png\",\n        title: t(\"guide.runAndTestTask.viewLogs\"),\n        descriptions: [t(\"guide.runAndTestTask.clickTaskToViewStatusAndLogs\")],\n      },\n      {\n        image: \"/static/doc/images/11-1-error.png\",\n        title: t(\"guide.runAndTestTask.howToTroubleshootFailure\"),\n        descriptions: [t(\"guide.runAndTestTask.viewErrorLogs\")],\n      },\n      {\n        image: \"/static/doc/images/11-2-error.png\",\n        title: t(\"guide.runAndTestTask.howToTroubleshootFailure\"),\n        descriptions: [t(\"guide.runAndTestTask.viewErrorLogs\"), t(\"guide.runAndTestTask.nginxContainerNotExistFix\")],\n      },\n      {\n        image: \"/static/doc/images/12-1-log-success.png\",\n        title: t(\"guide.runAndTestTask.executionSuccess\"),\n        descriptions: [t(\"guide.runAndTestTask.retryAfterFix\")],\n      },\n      {\n        image: \"/static/doc/images/12-2-skip-log.png\",\n        title: t(\"guide.runAndTestTask.autoSkipAfterSuccess\"),\n        descriptions: [t(\"guide.runAndTestTask.successSkipExplanation\")],\n      },\n      {\n        image: \"/static/doc/images/13-1-result.png\",\n        title: t(\"guide.runAndTestTask.viewCertDeploymentSuccess\"),\n        descriptions: [t(\"guide.runAndTestTask.visitNginxToSeeCert\")],\n      },\n      {\n        image: \"/static/doc/images/13-3-download.png\",\n        title: t(\"guide.runAndTestTask.downloadCertManualDeploy\"),\n        descriptions: [t(\"guide.runAndTestTask.downloadIfNoAutoDeployPlugin\")],\n      },\n    ],\n  },\n  {\n    title: t(\"guide.scheduleAndEmailTask.title\"),\n    description: t(\"guide.scheduleAndEmailTask.description\"),\n    items: [\n      {\n        image: \"/static/doc/images/14-timer.png\",\n        title: t(\"guide.scheduleAndEmailTask.setSchedule\"),\n        descriptions: [t(\"guide.scheduleAndEmailTask.pipelineSuccessThenSchedule\"), t(\"guide.scheduleAndEmailTask.recommendDailyRun\")],\n      },\n      {\n        image: \"/static/doc/images/15-1-email.png\",\n        title: t(\"guide.scheduleAndEmailTask.setEmailNotification\"),\n        descriptions: [t(\"guide.scheduleAndEmailTask.suggestErrorAndRecoveryEmails\"), t(\"guide.scheduleAndEmailTask.basicVersionNeedsMailServer\")],\n      },\n      {\n        title: t(\"guide.scheduleAndEmailTask.tutorialEndTitle\"),\n        descriptions: [t(\"guide.scheduleAndEmailTask.thanksForWatching\")],\n      },\n    ],\n  },\n]);\n\nconst current = ref(0);\nconst currentItem = ref(0);\n\nconst number = computed(() => {\n  return `${current.value + 1}-${currentItem.value + 1}. `;\n});\nconst currentStep = computed(() => {\n  return steps.value[current.value];\n});\nconst currentStepItem = computed(() => {\n  return currentStep.value.items[currentItem.value];\n});\n\nconst percent = computed(() => {\n  return ((currentItem.value + 1) / currentStep.value.items.length) * 100;\n});\n\nfunction stepNext() {\n  if (current.value < steps.value.length - 1) {\n    current.value++;\n    return true;\n  }\n  return false;\n}\n\nfunction stepPrev() {\n  if (current.value > 0) {\n    current.value--;\n    return true;\n  } else {\n    return false;\n  }\n}\n\nfunction next() {\n  if (currentItem.value < currentStep.value.items.length - 1) {\n    currentItem.value++;\n  } else {\n    if (stepNext()) {\n      currentItem.value = 0;\n    }\n  }\n}\nfunction prev() {\n  if (currentItem.value > 0) {\n    currentItem.value--;\n  } else {\n    if (stepPrev()) {\n      nextTick(() => {\n        currentItem.value = currentStep.value.items.length - 1;\n      });\n    }\n  }\n}\n\nfunction stepChanged(index: number) {\n  current.value = index;\n  currentItem.value = 0;\n}\nfunction previewMask() {\n  return (\n    <div title=\"点击放大\" class=\"h-100 w-100\">\n      {\" \"}\n    </div>\n  );\n}\n</script>\n\n<style lang=\"less\">\n.tutorial-steps {\n  .step-item {\n    display: flex !important;\n    flex-direction: row;\n    align-items: center;\n    justify-content: center;\n    flex: 1;\n    padding: 20px;\n    .text {\n      width: 350px;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 20px;\n    }\n    .image-box {\n      overflow: hidden;\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      justify-content: center;\n      align-items: center;\n      background: #eee;\n      width: 100%;\n      height: 100%;\n      .ant-image-mask {\n        background: rgba(255, 255, 255, 0);\n      }\n      .ant-image {\n        width: 100%;\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        img {\n          width: 100%;\n          height: 100%;\n          object-fit: contain;\n        }\n      }\n    }\n    .desc {\n      margin-top: 10px;\n      font-size: 16px;\n      font-weight: bold;\n    }\n  }\n\n  .actions {\n    .fs-icon {\n      margin-left: 5px;\n      margin-right: 5px;\n    }\n  }\n\n  .ant-steps .ant-steps-item-description {\n    font-size: 12px !important;\n    color: #999 !important;\n  }\n\n  .description {\n    text-align: center;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/valid-time-format.vue",
    "content": "<template>\n  <div class=\"valid-time-format\">\n    <a-tag v-if=\"isExpired\" color=\"red\">{{ prefix || \"\" }}已过期</a-tag>\n    <a-tag v-if=\"isValid\" color=\"green\" :title=\"date\">\n      <fs-time-humanize v-if=\"humanize\" :model-value=\"modelValue\" :options=\"{ largest: 1, units: ['y', 'd', 'h'] }\" :use-format-greater=\"30000000000\" />\n      <template v-else> {{ prefix || \"\" }}{{ date }} </template>\n    </a-tag>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport dayjs from \"dayjs\";\n\nconst props = defineProps<{\n  modelValue: number;\n  humanize?: boolean;\n  prefix?: string;\n}>();\n\nconst date = computed(() => {\n  return dayjs(props.modelValue || 0).format(\"YYYY-MM-DD\");\n});\n\nconst isValid = computed(() => {\n  return props.modelValue > 0 && props.modelValue > new Date().getTime();\n});\n\nconst isExpired = computed(() => {\n  return props.modelValue > 0 && props.modelValue < new Date().getTime();\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/vip-button/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nexport async function doActive(form: any) {\n  return await request({\n    url: \"/sys/plus/active\",\n    method: \"post\",\n    data: form,\n  });\n}\n\nexport async function getVipTrial() {\n  return await request({\n    url: \"/sys/plus/getVipTrial\",\n    method: \"post\",\n    data: {},\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/vip-button/directive.ts",
    "content": "import { notification } from \"ant-design-vue\";\nimport { useSettingStore } from \"/@/store/settings\";\n\nexport default {\n  mounted(el: any, binding: any, vnode: any) {\n    const { value } = binding;\n    const settingStore = useSettingStore();\n    el.className = el.className + \" need-plus\";\n    if (!settingStore.isPlus) {\n      function checkPlus() {\n        // 事件处理代码\n        notification.warn({\n          message: \"此为专业版功能，请升级到专业版\",\n        });\n      }\n      el.addEventListener(\"click\", function (event: any) {\n        checkPlus();\n      });\n      el.addEventListener(\"move\", function (event: any) {\n        checkPlus();\n      });\n    }\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/vip-button/index.vue",
    "content": "<template>\n  <div v-if=\"!settingStore.isComm || userStore.isAdmin\" class=\"layout-vip isPlus\" @click=\"openUpgrade\">\n    <contextHolder />\n    <fs-icon icon=\"mingcute:vip-1-line\" :title=\"text.title\" />\n\n    <div v-if=\"mode !== 'icon'\" class=\"text hidden md:block ml-0.5\">\n      <a-tooltip>\n        <template #title> {{ text.title }}</template>\n        <span class=\"\">{{ text.name }}</span>\n      </a-tooltip>\n    </div>\n  </div>\n</template>\n<script lang=\"tsx\" setup>\nimport { computed, onMounted, reactive } from \"vue\";\nimport dayjs from \"dayjs\";\nimport { message, Modal } from \"ant-design-vue\";\nimport * as api from \"./api\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { useRouter } from \"vue-router\";\nimport { useUserStore } from \"/@/store/user\";\nimport { mitter } from \"/@/utils/util.mitt\";\nimport { useI18n } from \"vue-i18n\";\n\nconst { t } = useI18n();\n\nconst settingStore = useSettingStore();\nconst props = withDefaults(\n  defineProps<{\n    mode?: \"comm\" | \"button\" | \"nav\" | \"icon\";\n  }>(),\n  {\n    mode: \"button\",\n  }\n);\ntype Text = {\n  name: string;\n  title?: string;\n};\nconst text = computed<Text>(() => {\n  const vipLabel = settingStore.vipLabel;\n  const map = {\n    isComm: {\n      comm: {\n        name: t(\"vip.comm.name\", { vipLabel }),\n        title: t(\"vip.comm.title\", { expire: expireTime.value }),\n      },\n      button: {\n        name: t(\"vip.comm.name\", { vipLabel }),\n        title: t(\"vip.comm.title\", { expire: expireTime.value }),\n      },\n      icon: {\n        name: \"\",\n        title: t(\"vip.comm.name\", { vipLabel }),\n      },\n      nav: {\n        name: t(\"vip.comm.nav\", { vipLabel }),\n        title: t(\"vip.comm.title\", { expire: expireTime.value }),\n      },\n    },\n    isPlus: {\n      comm: {\n        name: t(\"vip.plus.name\"),\n        title: t(\"vip.plus.title\"),\n      },\n      button: {\n        name: t(\"vip.comm.name\", { vipLabel }),\n        title: t(\"vip.comm.title\", { expire: expireTime.value }),\n      },\n      icon: {\n        name: \"\",\n        title: t(\"vip.comm.name\", { vipLabel }),\n      },\n      nav: {\n        name: t(\"vip.comm.nav\", { vipLabel }),\n        title: t(\"vip.comm.title\", { expire: expireTime.value }),\n      },\n    },\n    free: {\n      comm: {\n        name: t(\"vip.free.comm.name\"),\n        title: t(\"vip.free.comm.title\"),\n      },\n      button: {\n        name: t(\"vip.free.button.name\"),\n        title: t(\"vip.free.button.title\"),\n      },\n      icon: {\n        name: \"\",\n        title: t(\"vip.free.button.name\"),\n      },\n      nav: {\n        name: t(\"vip.free.nav.name\"),\n        title: t(\"vip.free.nav.title\"),\n      },\n    },\n  };\n  if (settingStore.isComm) {\n    return map.isComm[props.mode];\n  } else if (settingStore.isPlus) {\n    return map.isPlus[props.mode];\n  } else {\n    return map.free[props.mode];\n  }\n});\n\nconst expireTime = computed(() => {\n  if (settingStore.isPlus) {\n    return dayjs(settingStore.plusInfo.expireTime).format(\"YYYY-MM-DD\");\n  }\n  return \"\";\n});\n\nconst expiredDays = computed(() => {\n  if (settingStore.plusInfo?.isPlus && !settingStore.isPlus) {\n    //已过期多少天\n    const days = dayjs().diff(dayjs(settingStore.plusInfo.expireTime), \"day\");\n    return `${settingStore.vipLabel}已过期${days}天`;\n  }\n  return \"\";\n});\n\nconst formState = reactive({\n  code: \"\",\n  inviteCode: \"\",\n});\n\nconst router = useRouter();\nasync function doActive() {\n  if (!formState.code) {\n    message.error(t(\"vip.enterCode\"));\n    throw new Error(t(\"vip.enterCode\"));\n  }\n  const res = await api.doActive(formState);\n  if (res) {\n    await settingStore.init();\n    const vipLabel = settingStore.vipLabel;\n    Modal.success({\n      title: t(\"vip.successTitle\"),\n      content: t(\"vip.successContent\", {\n        vipLabel,\n        expireDate: dayjs(settingStore.plusInfo.expireTime).format(\"YYYY-MM-DD\"),\n      }),\n      onOk() {\n        if (!(settingStore.installInfo.bindUserId > 0)) {\n          Modal.confirm({\n            title: t(\"vip.bindAccountTitle\"),\n            content: t(\"vip.bindAccountContent\"),\n            onOk() {\n              router.push(\"/sys/account\");\n            },\n          });\n        }\n      },\n    });\n  }\n}\n\nconst computedSiteId = computed(() => settingStore.installInfo?.siteId);\nconst [modal, contextHolder] = Modal.useModal();\nconst userStore = useUserStore();\n\nfunction goAccount() {\n  Modal.destroyAll();\n  router.push(\"/sys/account\");\n}\n\nasync function getVipTrial() {\n  const res = await api.getVipTrial();\n  message.success(t(\"vip.congratulations_vip_trial\", { duration: res.duration }));\n  await settingStore.init();\n}\n\nfunction openTrialModal() {\n  Modal.destroyAll();\n\n  modal.confirm({\n    title: t(\"vip.trial_modal_title\"),\n    okText: t(\"vip.trial_modal_ok_text\"),\n    onOk() {\n      getVipTrial();\n    },\n    width: 600,\n    content: () => {\n      return (\n        <div class=\"flex-col mt-10 mb-10\">\n          <div>{t(\"vip.trial_modal_thanks\")}</div>\n          <div>{t(\"vip.trial_modal_click_confirm\")}</div>\n        </div>\n      );\n    },\n  });\n}\n\nfunction openStarModal() {\n  Modal.destroyAll();\n  const goGithub = () => {\n    window.open(\"https://github.com/certd/certd/\");\n  };\n\n  modal.confirm({\n    title: t(\"vip.get_7_day_pro_trial\"),\n    okText: t(\"vip.star_now\"),\n    onOk() {\n      goGithub();\n      openTrialModal();\n    },\n    width: 600,\n    content: () => {\n      return (\n        <div class=\"flex mt-10 mb-10\">\n          <div>{t(\"vip.please_help_star\")}</div>\n          <img class=\"ml-5\" src=\"https://img.shields.io/github/stars/certd/certd?logo=github\" />\n        </div>\n      );\n    },\n  });\n}\n\nfunction openUpgrade() {\n  if (!userStore.isAdmin) {\n    message.info(t(\"vip.admin_only_operation\"));\n    return;\n  }\n  const placeholder = t(\"vip.enter_activation_code\");\n  const isPlus = settingStore.isPlus;\n  let title = t(\"vip.activate_pro_business\");\n  if (settingStore.isComm) {\n    title = t(\"vip.renew_business\");\n  } else if (settingStore.isPlus) {\n    title = t(\"vip.renew_pro_upgrade_business\");\n  }\n\n  const productInfo = settingStore.productInfo;\n  const vipTypeDefine = {\n    free: {\n      title: t(\"vip.basic_edition\"),\n      desc: t(\"vip.community_free_version\"),\n      type: \"free\",\n      icon: \"lucide:package-open\",\n      privilege: [t(\"vip.unlimited_certificate_application\"), t(\"vip.unlimited_domain_count\"), t(\"vip.unlimited_certificate_pipelines\"), t(\"vip.common_deployment_plugins\"), t(\"vip.email_webhook_notifications\")],\n    },\n    plus: {\n      title: t(\"vip.professional_edition\"),\n      desc: t(\"vip.open_source_support\"),\n      type: \"plus\",\n      privilege: [t(\"vip.vip_group_priority\"), t(\"vip.unlimited_site_certificate_monitoring\"), t(\"vip.more_notification_methods\"), t(\"vip.plugins_fully_open\")],\n      trial: {\n        title: t(\"vip.click_to_get_7_day_trial\"),\n        click: () => {\n          openStarModal();\n        },\n      },\n      icon: \"stash:thumb-up\",\n      price: productInfo.plus.price,\n      price3: `¥${productInfo.plus.price3}/3${t(\"vip.years\")}`,\n      tooltip: productInfo.plus.tooltip,\n      get() {\n        return (\n          <a-tooltip title={t(\"vip.afdian_support_vip\")}>\n            <a-button size=\"small\" type=\"primary\" href=\"https://afdian.com/a/greper\" target=\"_blank\">\n              {t(\"vip.get_after_support\")}\n            </a-button>\n          </a-tooltip>\n        );\n      },\n    },\n    comm: {\n      title: t(\"vip.business_edition\"),\n      desc: t(\"vip.commercial_license\"),\n      type: \"comm\",\n      icon: \"vaadin:handshake\",\n      privilege: [t(\"vip.all_pro_privileges\"), t(\"vip.allow_commercial_use_modify_logo_title\"), t(\"vip.data_statistics\"), t(\"vip.plugin_management\"), t(\"vip.unlimited_multi_users\"), t(\"vip.support_user_payment\")],\n      price: productInfo.comm.price,\n      price3: `¥${productInfo.comm.price3}/3${t(\"vip.years\")}`,\n      tooltip: productInfo.comm.tooltip,\n      get() {\n        return <a-button size=\"small\">{t(\"vip.contact_author_for_trial\")}</a-button>;\n      },\n    },\n  };\n\n  const modalRef = modal.confirm({\n    title,\n    async onOk() {\n      return await doActive();\n    },\n    maskClosable: true,\n    okText: t(\"vip.activate\"),\n    width: 1100,\n    content: () => {\n      let activationCodeGetWay = (\n        <span>\n          <a href=\"https://afdian.com/a/greper\" target=\"_blank\">\n            {t(\"vip.get_pro_code_after_support\")}\n          </a>\n          <span> {t(\"vip.business_contact_author\")}</span>\n        </span>\n      );\n      const vipLabel = settingStore.vipLabel;\n      const slots = [];\n      for (const key in vipTypeDefine) {\n        // @ts-ignore\n        const item = vipTypeDefine[key];\n        const vipBlockClass = `vip-block ${key === settingStore.plusInfo.vipType ? \"current\" : \"\"}`;\n        slots.push(\n          <a-col span={8}>\n            <div class={vipBlockClass}>\n              <h3 class=\"block-header \">\n                <span class=\"flex-o\">{item.title}</span>\n                {item.trial && (\n                  <span class=\"trial\">\n                    <a-tooltip title={item.trial.message}>\n                      <a onClick={item.trial.click}>{item.trial.title}</a>\n                    </a-tooltip>\n                  </span>\n                )}\n              </h3>\n              <div style=\"color:green\" class=\"flex-o\">\n                <fs-icon icon={item.icon} class=\"fs-16 flex-o\" />\n                {item.desc}\n              </div>\n              <ul class=\"flex-1 privilege\">\n                {item.privilege.map((p: string) => (\n                  <li class=\"flex-baseline\">\n                    <fs-icon class=\"color-green\" icon=\"ion:checkmark-sharp\" />\n                    {p}\n                  </li>\n                ))}\n              </ul>\n              <div class=\"footer flex-between flex-vc\">\n                <div class=\"price-show\">\n                  {item.price && (\n                    <span class=\"flex\">\n                      <span class=\"-text\">¥{item.price}</span>\n                      <span>/</span>\n                      {t(\"vip.year\")}\n                      <a-tooltip class=\"ml-5\" title={item.price3}>\n                        <fs-icon class=\"pointer color-red\" icon=\"ic:outline-discount\"></fs-icon>\n                      </a-tooltip>\n                    </span>\n                  )}\n                  {!item.price && (\n                    <span>\n                      <span class=\"price-text\">{t(\"vip.freee\")}</span>\n                    </span>\n                  )}\n                </div>\n                <div class=\"get-show\">{item.get && <div>{item.get()}</div>}</div>\n              </div>\n            </div>\n          </a-col>\n        );\n      }\n      return (\n        <div class=\"mt-10 mb-10 vip-active-modal\">\n          {productInfo.notice && (\n            <div class=\"mb-10\">\n              <a-alert type=\"error\" message={productInfo.notice}></a-alert>\n            </div>\n          )}\n          <div class=\"vip-type-vs\">\n            <a-row gutter={20}>{slots}</a-row>\n          </div>\n          <div class=\"mt-10\">\n            <h3 class=\"block-header\">{isPlus ? t(\"vip.renew\") : t(\"vip.activate_immediately\")}</h3>\n            <div>{isPlus ? `${t(\"vip.current\")} ${vipLabel} ${t(\"vip.activated_expire_time\")}` + dayjs(settingStore.plusInfo.expireTime).format(\"YYYY-MM-DD\") : \"\"}</div>\n            <div class=\"mt-10\">\n              <div class=\"flex-o w-100\">\n                <span>{t(\"vip.site_id\")}：</span>\n                <fs-copyable class=\"flex-1\" v-model={computedSiteId.value}></fs-copyable>\n              </div>\n              <a-input class=\"mt-10\" v-model:value={formState.code} placeholder={placeholder} />\n              <a-input class=\"mt-10\" v-model:value={formState.inviteCode} placeholder={t(\"vip.invite_code_optional\")} />\n            </div>\n\n            <div class=\"mt-10\">\n              {t(\"vip.no_activation_code\")}\n              {activationCodeGetWay}\n            </div>\n            <div class=\"mt-10\">\n              {t(\"vip.activation_code_one_use\")}\n              <a onClick={goAccount}>{t(\"vip.bind_account\")}</a>，{t(\"vip.transfer_vip\")}\n            </div>\n          </div>\n        </div>\n      );\n    },\n  });\n}\nonMounted(() => {\n  mitter.on(\"openVipModal\", () => {\n    if (props.mode === \"nav\" && !settingStore.isPlus) {\n      openUpgrade();\n    }\n  });\n});\n</script>\n\n<style lang=\"less\">\n.layout-vip {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  cursor: pointer;\n\n  &.isPlus {\n    color: #c5913f;\n  }\n\n  .text {\n  }\n}\n\n.vip-active-modal {\n  .vip-block {\n    display: flex;\n    flex-direction: column;\n    padding: 10px;\n    border: 1px solid #eee;\n    border-radius: 5px;\n    height: 275px;\n\n    //background-color: rgba(250, 237, 167, 0.79);\n    &.current {\n      border-color: green;\n    }\n\n    .block-header {\n      padding: 0px;\n      display: flex;\n      justify-content: space-between;\n\n      .trial {\n        font-size: 12px;\n        font-wight: 400;\n      }\n    }\n\n    .footer {\n      padding-top: 5px;\n      margin-top: 0px;\n      border-top: 1px solid #eee;\n\n      .price-text {\n        font-size: 18px;\n        color: red;\n      }\n    }\n  }\n\n  ul {\n    list-style-type: unset;\n    margin-left: 0px;\n    padding: 0;\n  }\n\n  .color-green {\n    color: green;\n  }\n\n  .vip-type-vs {\n    .privilege {\n      .fs-icon {\n        color: green;\n      }\n    }\n\n    .fs-icon {\n      margin-right: 5px;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/components/vip-button/install.ts",
    "content": "import VipButton from \"./index.vue\";\nimport plus from \"./directive.js\";\nexport default function (app: any) {\n  app.component(\"VipButton\", VipButton);\n  app.directive(\"plus\", plus);\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/constants/index.ts",
    "content": "export const CertApplyPluginNames = [\":cert:\"];\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/components/footer/index.vue",
    "content": "<template>\n  <div class=\"flex flex-between w-full text-sm p-5 bg-neutral-100 dark:bg-neutral-900\">\n    <div class=\"flex items-center\">\n      <span v-if=\"!settingStore.isComm\">\n        <span>Powered by</span>\n        <a> handsfree.work </a>\n        <a-divider type=\"vertical\" />\n      </span>\n\n      <template v-if=\"siteInfo.licenseTo\">\n        <a :href=\"siteInfo.licenseToUrl || ''\">{{ siteInfo.licenseTo }}</a>\n        <a-divider type=\"vertical\" />\n      </template>\n\n      <template v-if=\"sysPublic.icpNo\">\n        <span>\n          <a href=\"https://beian.miit.gov.cn/\" target=\"_blank\">{{ sysPublic.icpNo }}</a>\n          <a-divider type=\"vertical\" />\n        </span>\n      </template>\n\n      <span v-if=\"sysPublic.mpsNo\">\n        <a href=\"http://www.beian.gov.cn/portal/registerSystemInfo\" target=\"_blank\">{{ sysPublic.mpsNo }}</a>\n      </span>\n    </div>\n    <div class=\"ml-5\">v{{ version }}</div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from \"vue\";\nimport { useSettingStore } from \"/@/store/settings\";\n\ndefineOptions({\n  name: \"PageFooter\",\n});\nconst version = ref(import.meta.env.VITE_APP_VERSION);\n\nconst settingStore = useSettingStore();\n\nconst sysPublic = computed(() => {\n  return settingStore.sysPublic;\n});\nconst siteInfo = computed(() => {\n  return settingStore.siteInfo;\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/components/locale/index.vue",
    "content": "<template>\n  <a-dropdown class=\"fs-locale-picker\">\n    <div style=\"display: block\">\n      <fs-iconify icon=\"ion-globe-outline\" @click.prevent></fs-iconify>\n    </div>\n\n    <template #overlay>\n      <a-menu @click=\"changeLocale\">\n        <a-menu-item v-for=\"item in languages\" :key=\"item.key\" :command=\"item.key\">\n          <div class=\"language-item\">\n            <span v-if=\"item.key === current\" class=\"icon-radio\">\n              <span class=\"iconify\" data-icon=\"ion:radio-button-on\" data-inline=\"false\"></span>\n            </span>\n            <span v-else class=\"icon-radio\">\n              <span class=\"iconify\" data-icon=\"ion:radio-button-off\" data-inline=\"false\"></span>\n            </span>\n            {{ item.label }}\n          </div>\n        </a-menu-item>\n      </a-menu>\n    </template>\n  </a-dropdown>\n</template>\n\n<script lang=\"ts\">\nimport i18n from \"../../../i18n\";\nimport { computed, inject } from \"vue\";\nimport { forEach } from \"lodash-es\";\nexport default {\n  name: \"FsLocale\",\n  setup() {\n    const languages = computed(() => {\n      const map: any = i18n.global.messages?.value || {};\n      const list: any = [];\n      forEach(map, (item, key) => {\n        list.push({\n          key,\n          label: item.label,\n        });\n      });\n      return list;\n    });\n    const current = computed(() => {\n      return i18n.global.locale.value;\n    });\n\n    const routerReload: any = inject(\"fn:router.reload\");\n    const localeChanged: any = inject(\"fn:locale.changed\");\n    const changeLocale = (change: any) => {\n      i18n.global.locale.value = change.key;\n      routerReload();\n      localeChanged(change.key);\n    };\n    return {\n      languages,\n      current,\n      changeLocale,\n    };\n  },\n};\n</script>\n\n<style lang=\"less\">\n.fs-locale-picker {\n  display: flex;\n  align-items: center;\n}\n.language-item {\n  display: flex;\n  align-items: center;\n  .icon-radio {\n    display: flex;\n    align-items: center;\n  }\n  .iconify {\n    margin-right: 5px;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/components/menu/index.less",
    "content": ".fs-menu-wrapper {\n  height: 100%;\n  overflow-y: auto;\n  &.fs-menu-better-scroll {\n    overflow-y: hidden;\n  }\n  .menu-item-title {\n    display: flex;\n    align-items: center;\n    .fs-icon {\n      font-size: 16px !important;\n      min-width: 16px !important;\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/components/menu/index.vue",
    "content": "<template>\n  <a-menu v-model:open-keys=\"openKeys\" v-model:selected-keys=\"selectedKeys\" class=\"fs-menu\" mode=\"inline\" theme=\"light\" :items=\"items\" @click=\"onClick\" />\n</template>\n\n<script lang=\"tsx\" setup>\nimport { ref, watch, defineOptions } from \"vue\";\nimport { routerUtils } from \"/@/utils/util.router\";\nimport { useRoute } from \"vue-router\";\nimport { utils } from \"@fast-crud/fast-crud\";\nimport * as _ from \"lodash-es\";\n\ndefineOptions({\n  name: \"FsMenu\",\n});\n\nconst props = defineProps<{\n  menus: any[];\n  expandSelected: boolean;\n}>();\n\nconst items = ref([]);\n\nfunction buildItemMenus(menus: any) {\n  if (menus == null) {\n    return;\n  }\n  const list: any = [];\n  for (const sub of menus) {\n    if (sub.meta?.show != null) {\n      if (sub.meta.show === false || (typeof sub.meta.show === \"function\" && !sub.meta.show())) {\n        continue;\n      }\n    }\n    const item: any = {\n      key: sub.path,\n      label: sub.title,\n      title: sub.title,\n      icon: () => {\n        return <fsIcon icon={sub.icon ?? sub.meta?.icon} />;\n      },\n    };\n\n    list.push(item);\n    if (sub.children && sub.children.length > 0) {\n      item.children = buildItemMenus(sub.children);\n    }\n  }\n  return list;\n}\n\nwatch(\n  () => props.menus,\n  menus => {\n    items.value = buildItemMenus(menus);\n  },\n  { immediate: true }\n);\n\nasync function onClick(item: any) {\n  await routerUtils.open(item.key);\n}\nconst route = useRoute();\nconst selectedKeys = ref([]);\nconst openKeys = ref([]);\n\nfunction openSelectedParents(fullPath: any) {\n  if (!props.expandSelected) {\n    return;\n  }\n  if (props.menus == null) {\n    return;\n  }\n  const keys: any = [];\n  let changed = false;\n  utils.deepdash.forEachDeep(props.menus, (value: any, key: any, parent: any, context: any) => {\n    if (value == null) {\n      return;\n    }\n    if (value.path === fullPath) {\n      _.forEach(context.parents, item => {\n        if (item.value instanceof Array) {\n          return;\n        }\n        keys.push(item.value.path);\n      });\n    }\n  });\n  if (keys.length > 0) {\n    for (const key of keys) {\n      if (openKeys.value.indexOf(key) === -1) {\n        openKeys.value.push(key);\n        changed = true;\n      }\n    }\n  }\n  return changed;\n}\nwatch(\n  () => {\n    return route.fullPath;\n  },\n  path => {\n    // path = route.fullPath;\n    selectedKeys.value = [path];\n    const changed = openSelectedParents(path);\n    if (changed) {\n      // onOpenChange();\n    }\n  },\n  {\n    immediate: true,\n  }\n);\n</script>\n<style lang=\"less\">\n.fs-menu {\n  height: 100%;\n  overflow-y: auto;\n  .fs-icon {\n    font-size: 16px !important;\n    min-width: 16px !important;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/components/menu/index1.tsx",
    "content": "import { useRoute, useRouter } from \"vue-router\";\nimport { ref, watch, onMounted, onUnmounted, resolveComponent, nextTick, defineComponent } from \"vue\";\nimport * as _ from \"lodash-es\";\nimport BScroll from \"better-scroll\";\nimport \"./index.less\";\nimport { utils } from \"@fast-crud/fast-crud\";\nimport { routerUtils } from \"/@/utils/util.router\";\n\ndefineOptions();\n\nexport default defineComponent({\n  name: \"FsMenu\",\n  inheritAttrs: true,\n  props: {\n    menus: {},\n    expandSelected: {\n      default: false,\n    },\n    scroll: {},\n  },\n  setup(props, ctx) {\n    async function onSelect(item: any) {\n      await routerUtils.open(item.key);\n    }\n\n    const items = ref([]);\n\n    function buildItemMenus(menus: any) {\n      if (menus == null) {\n        return;\n      }\n      const list: any = [];\n      for (const sub of menus) {\n        const item: any = {\n          key: sub.path,\n          label: sub.title,\n          title: sub.title,\n          icon: () => {\n            return <fsIcon icon={sub.icon ?? sub.meta?.icon} />;\n          },\n        };\n        list.push(item);\n        if (sub.children && sub.children.length > 0) {\n          item.children = buildItemMenus(sub.children);\n        }\n      }\n      return list;\n    }\n    items.value = buildItemMenus(props.menus);\n    console.log(\"items\", items.value);\n    const fsIcon = resolveComponent(\"FsIcon\");\n\n    const buildMenus = (children: any) => {\n      const slots: any = [];\n      if (children == null) {\n        return slots;\n      }\n      for (const sub of children) {\n        if (sub.meta?.show != null) {\n          if (sub.meta.show === false || (typeof sub.meta.show === \"function\" && !sub.meta.show())) {\n            continue;\n          }\n        }\n        const title: any = () => {\n          const icon = sub.icon || sub?.meta?.icon;\n          if (icon) {\n            // @ts-ignore , anticon必须要有，不然不能折叠\n            return (\n              <div class={\"menu-item-title\"}>\n                <fsIcon class={\"anticon\"} icon={icon} />\n                <span>{sub.title}</span>\n              </div>\n            );\n          }\n          return sub.title;\n        };\n        if (sub.children && sub.children.length > 0) {\n          // eslint-disable-next-line @typescript-eslint/no-unused-vars\n          const subSlots = {\n            default: () => {\n              return buildMenus(sub.children);\n            },\n            title,\n          };\n          function onTitleClick() {\n            if (sub.path && ctx.attrs.mode === \"horizontal\") {\n              open(sub.path);\n            }\n          }\n          slots.push(<a-sub-menu key={sub.path} v-slots={subSlots} />);\n        } else {\n          slots.push(\n            <a-menu-item key={sub.path} title={sub.title}>\n              {title}\n            </a-menu-item>\n          );\n        }\n      }\n      return slots;\n    };\n    const slots = {\n      default() {\n        return buildMenus(props.menus);\n      },\n    };\n    const selectedKeys = ref([]);\n    const openKeys = ref([]);\n\n    const route = useRoute();\n    const router = useRouter();\n\n    function openSelectedParents(fullPath: any) {\n      if (!props.expandSelected) {\n        return;\n      }\n      if (props.menus == null) {\n        return;\n      }\n      const keys: any = [];\n      let changed = false;\n      utils.deepdash.forEachDeep(props.menus, (value: any, key: any, parent: any, context: any) => {\n        if (value == null) {\n          return;\n        }\n        if (value.path === fullPath) {\n          _.forEach(context.parents, item => {\n            if (item.value instanceof Array) {\n              return;\n            }\n            keys.push(item.value.path);\n          });\n        }\n      });\n      if (keys.length > 0) {\n        for (const key of keys) {\n          if (openKeys.value.indexOf(key) === -1) {\n            openKeys.value.push(key);\n            changed = true;\n          }\n        }\n      }\n      return changed;\n    }\n\n    // const { asideMenuRef, onOpenChange } = useBetterScroll(props.scroll as any);\n\n    watch(\n      () => {\n        return route.fullPath;\n      },\n      path => {\n        // path = route.fullPath;\n        selectedKeys.value = [path];\n        const changed = openSelectedParents(path);\n        if (changed) {\n          // onOpenChange();\n        }\n      },\n      {\n        immediate: true,\n      }\n    );\n    return () => {\n      const menu = (\n        <a-menu\n          mode={\"inline\"}\n          theme={\"light\"}\n          // v-slots={slots}\n          // onClick={onSelect}\n          // onOpenChange={onOpenChange}\n          v-models={[\n            [openKeys.value, \"openKeys\"],\n            [selectedKeys.value, \"selectedKeys\"],\n          ]}\n          items={items.value}\n          inlineCollapsed={!props.expandSelected}\n        />\n      );\n      const classNames = { \"fs-menu-wrapper\": true, \"fs-menu-better-scroll\": props.scroll };\n      return <div>{menu}</div>;\n    };\n  },\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/components/source-link/index.vue",
    "content": "<template>\n  <div v-if=\"showSourceLink\" class=\"fs-source-link-group\">\n    <div class=\"fs-source-link\" @click=\"goSource('https://gitee.com')\">本页源码（Gitee）</div>\n    <div class=\"fs-source-link\" @click=\"goSource('https://github.com')\">本页源码（Github）</div>\n  </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, watch } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nexport default defineComponent({\n  name: \"FsSourceLink\",\n  setup() {\n    const router = useRouter();\n    const showSourceLink = ref(false);\n    watch(\n      () => {\n        return router.currentRoute.value.fullPath;\n      },\n      value => {\n        showSourceLink.value = value !== \"/index\";\n      },\n      { immediate: true }\n    );\n    const middle = \"/fast-crud/fs-admin-antdv4/blob/main/src/views\";\n    function goSource(prefix: any) {\n      const path = router.currentRoute.value.fullPath;\n      window.open(prefix + middle + path + \"/index.vue\");\n    }\n    return {\n      goSource,\n      showSourceLink,\n    };\n  },\n});\n</script>\n\n<style lang=\"less\">\n.fs-source-link-group {\n  position: fixed;\n  right: 3px;\n  bottom: 20px;\n  .fs-source-link {\n    text-align: left;\n    cursor: pointer;\n    font-size: 12px;\n    border-radius: 5px 0 0 5px;\n    padding: 5px;\n    background: #666;\n    color: #fff;\n    margin-bottom: 5px;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/components/tabs/index.vue",
    "content": "<template>\n  <div class=\"fs-multiple-page-control-group\">\n    <div class=\"fs-multiple-page-control-content\">\n      <div class=\"fs-multiple-page-control-content-inner\">\n        <a-tabs class=\"fs-multiple-page-control fs-multiple-page-sort\" :active-key=\"page.getCurrent\" type=\"editable-card\" hide-add @tab-click=\"handleClick\" @edit=\"handleTabEdit\">\n          <a-tab-pane v-for=\"item in page.getOpened\" :key=\"item.fullPath\" :name=\"item.fullPath\" :closable=\"isTabClosable(item)\">\n            <template #tab>\n              <span class=\"flex-o\">\n                <fs-icon :icon=\"item.meta.icon\" class=\"mr-5\"></fs-icon>\n                {{ item.meta?.title || \"未命名\" }}\n              </span>\n            </template>\n          </a-tab-pane>\n        </a-tabs>\n        <!--        <fs-contextmenu v-model:open=\"contextmenuFlag\" :x=\"contentmenuX\" :y=\"contentmenuY\">-->\n        <!--          <fs-contextmenu-list-->\n        <!--            :menulist=\"tagName === '/index' ? contextmenuListIndex : contextmenuList\"-->\n        <!--            @rowClick=\"contextmenuClick\"-->\n        <!--          />-->\n        <!--        </fs-contextmenu>-->\n      </div>\n    </div>\n\n    <div class=\"fs-multiple-page-control-btn\">\n      <a-dropdown-button class=\"control-btn-dropdown\" split-button @click=\"closeAll\">\n        <fs-icon icon=\"ion:close-circle\"></fs-icon>\n        <template #icon><DownOutlined /></template>\n        <template #overlay>\n          <a-menu @click=\"(command: any) => handleControlItemClick(command)\">\n            <a-menu-item key=\"left\">\n              <fs-icon name=\"arrow-left\" class=\"fs-mr-10\" />\n              关闭左侧\n            </a-menu-item>\n            <a-menu-item key=\"right\">\n              <fs-icon name=\"arrow-right\" class=\"fs-mr-10\" />\n              关闭右侧\n            </a-menu-item>\n            <a-menu-item key=\"other\">\n              <fs-icon name=\"times\" class=\"fs-mr-10\" />\n              关闭其它\n            </a-menu-item>\n            <a-menu-item key=\"all\">\n              <fs-icon name=\"times-circle\" class=\"fs-mr-10\" />\n              全部关闭\n            </a-menu-item>\n          </a-menu>\n        </template>\n      </a-dropdown-button>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\">\nimport { usePageStore } from \"../../../store/modules/page\";\nimport { computed } from \"vue\";\nexport default {\n  name: \"FsTabs\",\n  components: {\n    // FsContextmenu: () => import(\"../contextmenu/index.vue\"),\n    // FsContextmenuList: () => import(\"../contextmenu/components/contentmenuList/index.vue\")\n  },\n  setup() {\n    const pageStore = usePageStore();\n\n    const actions = {\n      close: pageStore.close,\n      closeLeft: pageStore.closeLeft,\n      closeRight: pageStore.closeRight,\n      closeOther: pageStore.closeOther,\n      closeAll: pageStore.closeAll,\n      openedSort: pageStore.openedSort,\n    };\n    const computeOpened = computed(() => {\n      return pageStore.getOpened;\n    });\n\n    return {\n      page: pageStore,\n      ...actions,\n      computeOpened,\n    };\n  },\n  data() {\n    return {\n      contextmenuFlag: false,\n      contentmenuX: 0,\n      contentmenuY: 0,\n      contextmenuListIndex: [{ icon: \"times-circle\", title: \"关闭全部\", value: \"all\" }],\n      contextmenuList: [\n        { icon: \"arrow-left\", title: \"关闭左侧\", value: \"left\" },\n        { icon: \"arrow-right\", title: \"关闭右侧\", value: \"right\" },\n        { icon: \"times\", title: \"关闭其它\", value: \"other\" },\n        { icon: \"times-circle\", title: \"关闭全部\", value: \"all\" },\n      ],\n      tagName: \"/index\",\n    };\n  },\n  mounted() {\n    const el = document.querySelectorAll(\".fs-multiple-page-sort .el-tabs__nav\")[0];\n    // Sortable.create(el, {\n    //   onEnd: (evt) => {\n    //     const { oldIndex, newIndex } = evt;\n    //     this.openedSort({ oldIndex, newIndex });\n    //   }\n    // });\n  },\n  methods: {\n    /**\n     * @description 计算某个标签页是否可关闭\n     * @param {Object} page 其中一个标签页\n     */\n    isTabClosable(page: any) {\n      return page.name !== \"index\";\n    },\n    /**\n     * @description 右键菜单功能点击\n     * @param {Object} event 事件\n     */\n    handleContextmenu(event: any) {\n      let target = event.target;\n      // fix https://github.com/fs-projects/fs-admin/issues/54\n      let flag = false;\n      if (target.className.indexOf(\"el-tabs__item\") > -1) flag = true;\n      else if (target.parentNode.className.indexOf(\"el-tabs__item\") > -1) {\n        target = target.parentNode;\n        flag = true;\n      }\n      if (flag) {\n        event.preventDefault();\n        event.stopPropagation();\n        this.contentmenuX = event.clientX;\n        this.contentmenuY = event.clientY;\n        this.tagName = target.getAttribute(\"aria-controls\").slice(5);\n        this.contextmenuFlag = true;\n      }\n    },\n    /**\n     * @description 右键菜单的 row-click 事件\n     * @param {String} command 事件类型\n     */\n    contextmenuClick(command: any) {\n      this.handleControlItemClick(command, this.tagName);\n    },\n    /**\n     * @description 接收点击关闭控制上选项的事件\n     * @param {String} command 事件类型\n     * @param {String} tagName tab 名称\n     */\n    handleControlItemClick(command: any, tagName: any = null) {\n      //if (tagName) this.contextmenuFlag = false;\n      const params = { pageSelect: tagName };\n      switch (command.key) {\n        case \"left\":\n          this.closeLeft(params);\n          break;\n        case \"right\":\n          this.closeRight(params);\n          break;\n        case \"other\":\n          this.closeOther(params);\n          break;\n        case \"all\":\n          this.closeAll();\n          break;\n        default:\n          this.$message.error(\"无效的操作\");\n          break;\n      }\n    },\n    /**\n     * @description 接收点击 tab 标签的事件\n     * @param {object} tab 标签\n     * @param {object} event 事件\n     */\n    handleClick(tab: any) {\n      // 找到点击的页面在 tag 列表里是哪个\n      const page = this.page.getOpened.find((page: any) => page.fullPath === tab);\n      if (page) {\n        const { name, params, query } = page;\n        this.$router.push({ name, params, query });\n      }\n    },\n    /**\n     * @description 点击 tab 上的删除按钮触发这里\n     * @param {String} tagName tab 名称\n     */\n    handleTabEdit(tagName: any, action: any) {\n      if (action === \"remove\") {\n        this.close({ tagName });\n      }\n    },\n  } as any,\n};\n</script>\n<style lang=\"less\">\n//common\n.fs-multiple-page-control-group {\n  width: 100%;\n  display: flex;\n  .fs-multiple-page-control-content {\n    flex: 1;\n    overflow-x: auto;\n  }\n  .fs-multiple-page-control-btn {\n    flex: 0;\n  }\n}\n//antdv\n.fs-multiple-page-control-group {\n  .ant-tabs-tab-remove {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n  }\n  .ant-tabs-bar {\n    margin: 0;\n    border-bottom: 1px solid #f0f0f0;\n  }\n  .ant-tabs-top > .ant-tabs-nav,\n  .ant-tabs-bottom > .ant-tabs-nav,\n  .ant-tabs-top > div > .ant-tabs-nav,\n  .ant-tabs-bottom > div > .ant-tabs-nav {\n    margin: 0;\n  }\n  .ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-nav {\n    .ant-tabs-tab {\n      margin-right: 0;\n      border-right: 0;\n\n      &:first-of-type {\n        border-top-left-radius: 2px;\n      }\n      &:last-of-type {\n        border-top-right-radius: 2px;\n        border-right: 1px;\n      }\n\n      &:not(.ant-tabs-tab-active) {\n        color: #666;\n      }\n    }\n    .ant-tabs-tab-active {\n      border-bottom-color: #fff;\n    }\n  }\n  .ant-tabs-close-x {\n    display: none;\n  }\n  .ant-tabs-tab {\n    &:hover {\n      .ant-tabs-close-x {\n        display: initial;\n      }\n    }\n  }\n  .ant-tabs-tab-active {\n    .ant-tabs-close-x {\n      display: initial;\n    }\n  }\n\n  .fs-multiple-page-control-btn {\n    display: flex;\n    .ant-btn {\n      display: flex;\n      align-items: center;\n      justify-items: center;\n      height: 100%;\n      color: #666;\n      border-bottom: 1px solid #f0f0f0;\n    }\n    .control-btn-dropdown {\n      text-align: center;\n    }\n  }\n\n  .ant-tabs-tab-arrow-show {\n    border: 1px solid #e5e7eb;\n  }\n  .ant-tabs-tab-prev {\n    border-right: 0;\n    border-bottom: 0;\n  }\n  .ant-tabs-tab-next {\n    border-left: 0;\n    border-bottom: 0;\n  }\n}\n//element\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/components/theme/color-picker.vue",
    "content": "<template>\n  <div class=\"fs-theme-color-picker\">\n    <h4>主题色</h4>\n    <div class=\"fs-theme-colors\">\n      <a-tooltip v-for=\"(item, index) in colorList\" :key=\"index\" class=\"fs-theme-color-item\">\n        <template #title>\n          {{ item.key }}\n        </template>\n        <a-tag :color=\"item.color\" @click=\"changeColor(item.color)\">\n          <CheckOutlined v-if=\"item.color === primaryColor\" />\n        </a-tag>\n      </a-tooltip>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from \"vue\";\nconst colorListDefine = [\n  {\n    key: \"薄暮\",\n    color: \"#f5222d\",\n  },\n  {\n    key: \"火山\",\n    color: \"#fa541c\",\n  },\n  {\n    key: \"日暮\",\n    color: \"#faad14\",\n  },\n  {\n    key: \"明青\",\n    color: \"#13c2c2\",\n  },\n  {\n    key: \"极光绿\",\n    color: \"#52c41a\",\n  },\n  {\n    key: \"拂晓蓝（默认）\",\n    color: \"#1890ff\",\n  },\n  {\n    key: \"极客蓝\",\n    color: \"#2f54eb\",\n  },\n  {\n    key: \"酱紫\",\n    color: \"#722ed1\",\n  },\n];\nexport default defineComponent({\n  name: \"FsThemeColorPicker\",\n  props: {\n    primaryColor: {\n      type: String,\n      default: \"#1890ff\",\n    },\n  },\n  emits: [\"change\"],\n  setup(props, ctx) {\n    const colorList = ref(colorListDefine);\n    function changeColor(color: any) {\n      ctx.emit(\"change\", color);\n    }\n    return {\n      colorList,\n      changeColor,\n    };\n  },\n});\n</script>\n<style lang=\"less\">\n.fs-theme-color-picker {\n  .fs-theme-colors {\n    margin-top: 10px;\n    display: flex;\n    justify-content: left;\n    justify-items: center;\n    align-items: center;\n    .fs-theme-color-item {\n      width: 20px;\n      height: 20px;\n      border-radius: 2px;\n      cursor: pointer;\n      margin-right: 8px;\n      padding-left: 0px;\n      padding-right: 0px;\n      text-align: center;\n      color: #fff;\n      font-weight: 700;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      i {\n        font-size: 14px;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/components/theme/index.vue",
    "content": "<template>\n  <div class=\"fs-theme\" @click=\"show()\">\n    <fs-iconify icon=\"ion:sparkles-outline\" />\n    <a-drawer v-model:open=\"visible\" title=\"主题设置\" placement=\"right\" width=\"350px\" :closable=\"false\" @after-open-change=\"afterVisibleChange\">\n      <fs-theme-color-picker :primary-color=\"setting.themeConfig?.colorPrimary\" @change=\"setting.setPrimaryColor\"></fs-theme-color-picker>\n    </a-drawer>\n  </div>\n</template>\n\n<script lang=\"ts\">\nimport { ref, defineComponent } from \"vue\";\nimport FsThemeColorPicker from \"./color-picker.vue\";\nimport { useSettingStore } from \"/@/store/settings\";\n\nexport default defineComponent({\n  name: \"FsTheme\",\n  components: { FsThemeColorPicker },\n  setup() {\n    const visible = ref(false);\n    function afterVisibleChange() {}\n    function show() {\n      visible.value = true;\n    }\n\n    const setting = useSettingStore();\n    return {\n      visible,\n      show,\n      afterVisibleChange,\n      setting,\n    };\n  },\n});\n</script>\n\n<style lang=\"less\">\n.fs-theme {\n}\n.fs-theme-drawer {\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/components/theme/mode-set.vue",
    "content": "<template>\n  <div class=\"fs-theme-mode\">\n    <a-switch :checked=\"setting.themeConfig.mode === 'dark'\" @update:checked=\"onChange\">\n      <template #checkedChildren>\n        <fs-iconify icon=\"ion:moon\" />\n      </template>\n      <template #unCheckedChildren>\n        <fs-iconify icon=\"ion:sunny\" />\n      </template>\n    </a-switch>\n  </div>\n</template>\n\n<script lang=\"ts\">\nimport { ref, defineComponent } from \"vue\";\nimport { useSettingStore } from \"/@/store/settings\";\n\nexport default defineComponent({\n  name: \"FsThemeModeSet\",\n  components: {},\n  setup() {\n    const setting = useSettingStore();\n    const onChange = (checked: boolean) => {\n      if (checked) {\n        setting.setDarkMode(\"dark\");\n      } else {\n        setting.setDarkMode(\"light\");\n      }\n    };\n    return {\n      setting,\n      onChange,\n    };\n  },\n});\n</script>\n\n<style lang=\"less\">\n.fs-theme-mode {\n  display: inline-flex;\n  justify-content: center;\n  align-items: center;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/components/user-info/index.vue",
    "content": "<template>\n  <a-dropdown>\n    <div class=\"fs-user-info\">{{ t(\"user.greeting\") }}，{{ userStore.getUserInfo?.nickName || userStore.getUserInfo?.username }}</div>\n    <template #overlay>\n      <a-menu>\n        <a-menu-item>\n          <div @click=\"goUserProfile\">{{ t(\"user.profile\") }}</div>\n        </a-menu-item>\n        <a-menu-item>\n          <div @click=\"doLogout\">{{ t(\"user.logout\") }}</div>\n        </a-menu-item>\n      </a-menu>\n    </template>\n  </a-dropdown>\n</template>\n<script lang=\"ts\" setup>\nimport { useUserStore } from \"/src/store/user\";\nimport { Modal } from \"ant-design-vue\";\nimport { useI18n } from \"vue-i18n\";\nimport { useRouter } from \"vue-router\";\n\ndefineOptions({\n  name: \"FsUserInfo\",\n});\nconst userStore = useUserStore();\nconst { t } = useI18n();\n\nconst router = useRouter();\n\nfunction goUserProfile() {\n  console.log(\"goUserProfile\");\n  router.push(\"/certd/mine/user-profile\");\n}\nfunction doLogout() {\n  Modal.confirm({\n    iconType: \"warning\",\n    title: t(\"app.login.logoutTip\"),\n    content: t(\"app.login.logoutMessage\"),\n    onOk: async () => {\n      await userStore.logout(true);\n    },\n  });\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/layout-basic.vue",
    "content": "<script lang=\"ts\" setup>\nimport { BasicLayout, LockScreen, UserDropdown } from \"/@/vben/layouts\";\n\nimport { computed, onErrorCaptured, onMounted, provide, ref } from \"vue\";\nimport { useUserStore } from \"/@/store/user\";\nimport VipButton from \"/@/components/vip-button/index.vue\";\nimport TutorialButton from \"/@/components/tutorial/index.vue\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport PageFooter from \"./components/footer/index.vue\";\nimport { useRouter } from \"vue-router\";\nimport MaxKBChat from \"/@/components/ai/index.vue\";\nimport { useI18n } from \"vue-i18n\";\n\nconst { t } = useI18n();\n\nconst userStore = useUserStore();\n\nconst router = useRouter();\nconst menus = computed(() => [\n  {\n    handler: () => {\n      router.push(\"/certd/mine/user-profile\");\n    },\n    icon: \"fa-solid:book\",\n    text: t(\"certd.accountInfo\"),\n  },\n  {\n    handler: () => {\n      router.push(\"/certd/mine/security\");\n    },\n    icon: \"fluent:shield-keyhole-16-regular\",\n    text: t(\"certd.securitySettings\"),\n  },\n]);\n\nconst avatar = computed(() => {\n  const avt = userStore.getUserInfo?.avatar;\n  return avt ? `/api/basic/file/download?key=${avt}` : \"\";\n});\n\nasync function handleLogout() {\n  await userStore.logout(true);\n}\n\nconst settingStore = useSettingStore();\n\nconst sysPublic = computed(() => {\n  return settingStore.sysPublic;\n});\nconst siteInfo = computed(() => {\n  return settingStore.siteInfo;\n});\n\nonErrorCaptured(e => {\n  console.error(\"ErrorCaptured:\", e);\n  // notification.error({ message: e.message });\n  //阻止错误向上传递\n  return false;\n});\n\nonMounted(async () => {\n  await settingStore.checkUrlBound();\n});\n\nfunction goGithub() {\n  window.open(\"https://github.com/certd/certd\");\n}\nconst settingsStore = useSettingStore();\nconst chatBox = ref();\nconst openChat = (q: string) => {\n  chatBox.value.openChat({ q });\n};\nprovide(\"fn:ai.open\", openChat);\n</script>\n\n<template>\n  <BasicLayout @clear-preferences-and-logout=\"handleLogout\">\n    <template #user-dropdown>\n      <UserDropdown :avatar=\"avatar\" :menus=\"menus\" :text=\"userStore.userInfo?.nickName || userStore.userInfo?.username\" description=\"\" tag-text=\"\" @logout=\"handleLogout\" />\n    </template>\n    <template #lock-screen>\n      <LockScreen :avatar @to-login=\"handleLogout\" />\n    </template>\n    <template #header-right-0>\n      <div v-if=\"!settingStore.isComm\" class=\"hover:bg-accent ml-1 mr-2 cursor-pointer rounded-full hidden md:block\">\n        <tutorial-button class=\"flex-center header-btn\" />\n      </div>\n      <div class=\"hover:bg-accent ml-1 mr-2 cursor-pointer rounded-full\">\n        <vip-button class=\"flex-center header-btn\" mode=\"nav\" />\n      </div>\n      <div v-if=\"!settingStore.isComm\" class=\"hover:bg-accent ml-1 mr-2 cursor-pointer rounded-full\">\n        <fs-button shape=\"circle\" type=\"text\" icon=\"ion:logo-github\" :text=\"null\" @click=\"goGithub\" />\n      </div>\n    </template>\n    <template #footer>\n      <PageFooter></PageFooter>\n      <MaxKBChat v-if=\"settingsStore.sysPublic.aiChatEnabled !== false\" ref=\"chatBox\" />\n    </template>\n  </BasicLayout>\n</template>\n\n<style lang=\"less\">\n.header-btn {\n  font-size: 14px;\n  padding: 5px;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/layout-framework.vue",
    "content": "<template>\n  <a-layout class=\"fs-framework\">\n    <a-layout-sider v-model:collapsed=\"asideCollapsed\" :trigger=\"null\" collapsible :width=\"210\">\n      <div class=\"header-logo\">\n        <img :src=\"siteInfo.logo\" />\n        <span v-if=\"!asideCollapsed\" class=\"title\">{{ siteInfo.title }}</span>\n      </div>\n      <div class=\"aside-menu\">\n        <fs-menu :scroll=\"true\" :menus=\"asideMenus\" :expand-selected=\"!asideCollapsed\" />\n      </div>\n    </a-layout-sider>\n\n    <a-layout class=\"layout-body\">\n      <a-layout-header class=\"header\">\n        <div class=\"header-left header-buttons\">\n          <div class=\"menu-fold\" @click=\"asideCollapsedToggle\">\n            <MenuUnfoldOutlined v-if=\"asideCollapsed\" />\n            <MenuFoldOutlined v-else />\n          </div>\n          <!--          <fs-menu class=\"header-menu\" mode=\"horizontal\" :expand-selected=\"false\" :selectable=\"false\" :menus=\"frameworkMenus\" />-->\n          <div\n            v-for=\"menu of resourceStore.authedTopMenus\"\n            :key=\"menu.name\"\n            class=\"top-menu flex-center header-btn\"\n            :class=\"{ current: resourceStore.currentTopMenu === menu }\"\n            :style=\"{ color: resourceStore.currentTopMenu === menu ? token.colorPrimary : '' }\"\n            @click=\"menuClick(menu)\"\n          >\n            <fs-icon :icon=\"menu.meta.icon\"></fs-icon>\n            <span class=\"ml-5\">{{ menu.title }} </span>\n          </div>\n          <tutorial-button v-if=\"!settingStore.isComm\" class=\"flex-center header-btn\" />\n          <vip-button class=\"flex-center header-btn\" mode=\"nav\" />\n        </div>\n        <div class=\"header-right header-buttons\">\n          <!--          <button-->\n          <!--            w:bg=\"blue-400 hover:blue-500 dark:blue-500 dark:hover:blue-600\"-->\n          <!--            w:text=\"sm white\"-->\n          <!--            w:font=\"mono light\"-->\n          <!--            w:p=\"y-2 x-4\"-->\n          <!--            w:border=\"2 rounded blue-200\"-->\n          <!--          >-->\n          <!--            Button-->\n          <!--          </button>-->\n          <fs-menu class=\"header-menu\" mode=\"horizontal\" :expand-selected=\"false\" :selectable=\"false\" :menus=\"settingStore.getHeaderMenus\" />\n\n          <fs-menu v-if=\"!settingStore?.isAgent && !settingStore.isComm\" class=\"header-menu\" mode=\"horizontal\" :expand-selected=\"false\" :selectable=\"false\" :menus=\"headerMenus\" />\n          <div class=\"header-btn\">\n            <fs-locale />\n          </div>\n          <!--          <div class=\"header-btn\">-->\n          <!--            <fs-theme-mode-set />-->\n          <!--          </div>-->\n          <div class=\"header-btn\">\n            <fs-theme-set />\n          </div>\n          <div class=\"header-btn\">\n            <fs-user-info />\n          </div>\n        </div>\n      </a-layout-header>\n      <fs-tabs></fs-tabs>\n      <a-layout-content class=\"fs-framework-content\">\n        <router-view>\n          <template #default=\"{ Component, route }\">\n            <transition name=\"fade-transverse\">\n              <keep-alive :include=\"keepAlive\">\n                <component :is=\"Component\" :key=\"route.fullPath\" />\n              </keep-alive>\n            </transition>\n          </template>\n        </router-view>\n      </a-layout-content>\n      <a-layout-footer class=\"fs-framework-footer\">\n        <div>\n          <span v-if=\"!settingStore.isComm\">\n            <span>Powered by</span>\n            <a> handsfree.work </a>\n          </span>\n\n          <template v-if=\"siteInfo.licenseTo\">\n            <a-divider type=\"vertical\" />\n            <a :href=\"siteInfo.licenseToUrl || ''\">{{ siteInfo.licenseTo }}</a>\n          </template>\n\n          <template v-if=\"sysPublic.icpNo\">\n            <a-divider type=\"vertical\" />\n            <span>\n              <a href=\"https://beian.miit.gov.cn/\" target=\"_blank\">{{ sysPublic.icpNo }}</a>\n            </span>\n          </template>\n        </div>\n        <div>v{{ version }}</div>\n\n        <!--        <fs-source-link />-->\n      </a-layout-footer>\n    </a-layout>\n  </a-layout>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, onErrorCaptured, onMounted, ref } from \"vue\";\nimport FsMenu from \"./components/menu/index.vue\";\nimport FsLocale from \"./components/locale/index.vue\";\nimport FsUserInfo from \"./components/user-info/index.vue\";\nimport FsTabs from \"./components/tabs/index.vue\";\nimport { useResourceStore } from \"../store/modules/resource\";\nimport { usePageStore } from \"/@/store/modules/page\";\nimport { MenuFoldOutlined, MenuUnfoldOutlined } from \"@ant-design/icons-vue\";\nimport FsThemeSet from \"/@/layout/components/theme/index.vue\";\nimport { env } from \"../utils/util.env\";\nimport VipButton from \"/@/components/vip-button/index.vue\";\nimport TutorialButton from \"/@/components/tutorial/index.vue\";\nimport { useUserStore } from \"/@/store/user\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { routerUtils } from \"/@/utils/util.router\";\nimport { theme } from \"ant-design-vue\";\n\nconst resourceStore = useResourceStore();\nconst frameworkMenus = computed(() => {\n  return resourceStore.getFrameworkMenus;\n});\nconst headerMenus = computed(() => {\n  return resourceStore.getHeaderMenus;\n});\nconst asideMenus = computed(() => {\n  return resourceStore.getAsideMenus;\n});\n\nconst pageStore = usePageStore();\nconst keepAlive = pageStore.keepAlive;\n\nconst asideCollapsed = ref(false);\nfunction asideCollapsedToggle() {\n  asideCollapsed.value = !asideCollapsed.value;\n}\nonErrorCaptured(e => {\n  console.error(\"ErrorCaptured:\", e);\n  // notification.error({ message: e.message });\n  //阻止错误向上传递\n  return false;\n});\nconst version = ref(import.meta.env.VITE_APP_VERSION);\n\nconst envRef = ref(env);\n\nconst userStore = useUserStore();\n\nconst settingStore = useSettingStore();\n\nconst sysPublic = computed(() => {\n  return settingStore.sysPublic;\n});\nconst siteInfo = computed(() => {\n  return settingStore.siteInfo;\n});\n\nonMounted(async () => {\n  await settingStore.checkUrlBound();\n});\n\nfunction menuClick(menu: any) {\n  routerUtils.open(menu.path);\n}\n\nconst { useToken } = theme;\nconst { token } = useToken();\n</script>\n<style lang=\"less\">\n@import \"../style/theme/index.less\";\n.fs-framework {\n  height: 100%;\n  overflow-x: hidden;\n  min-width: 1200px;\n  .menu-fold {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n  }\n  .header-logo {\n    width: 100%;\n    height: 50px;\n    display: flex;\n    justify-items: center;\n    align-items: center;\n    justify-content: center;\n\n    // margin: 16px 24px 16px 0;\n    //background: rgba(255, 255, 255, 0.3);\n    img {\n      height: 80%;\n    }\n    .title {\n      margin-left: 5px;\n      font-weight: bold;\n    }\n  }\n  .fs-framework-content {\n    flex: 1;\n    border-left: 1px solid #f0f0f0;\n  }\n  .fs-framework-footer {\n    border-left: 1px solid #f0f0f0;\n    padding: 10px 20px;\n    color: rgba(0, 0, 0, 0.85);\n    font-size: 14px;\n    background: #f6f6f6;\n    display: flex;\n    justify-content: space-between;\n\n    > div {\n      height: auto;\n      padding: 5px;\n    }\n  }\n\n  .ant-layout-header.header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    .header-buttons {\n      display: flex;\n      align-items: center;\n      & > * {\n        cursor: pointer;\n        padding: 0 15px;\n      }\n      height: 100%;\n\n      & > .header-btn {\n        display: inline-flex;\n        justify-content: center;\n        align-items: center;\n        height: 100%;\n        //border-bottom: 1px solid rgba(255, 255, 255, 0);\n        &:hover {\n          background-color: rgba(0, 0, 0, 0.06);\n        }\n        &.current {\n          //color: #1890ff;\n          //background-color: hsla(0, 0%, 100%, 0.5) !important;\n        }\n      }\n    }\n    .header-right {\n      justify-content: flex-end;\n      align-items: center;\n      display: flex;\n      flex: 1;\n    }\n  }\n\n  .aside-menu {\n    flex: 1;\n    ui {\n      height: 100%;\n    }\n    overflow: hidden;\n    // overflow-y: auto;\n  }\n\n  .layout-body {\n    flex: 1;\n  }\n}\n//antdv\n.fs-framework {\n  &.ant-layout {\n    flex-direction: row;\n  }\n\n  .ant-layout-sider-children {\n    display: flex;\n    flex-direction: column;\n  }\n\n  .ant-layout-sider {\n    // border-right: 1px solid #eee;\n  }\n\n  .ant-layout-header {\n    height: 50px;\n    padding: 0 10px;\n    line-height: 50px;\n    display: flex;\n    justify-content: flex-start;\n    align-items: center;\n  }\n  .ant-layout-content {\n    background: #fff;\n    height: 100%;\n    position: relative;\n  }\n}\n//element\n.fs-framework {\n  .el-aside {\n    .el-menu {\n      height: 100%;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/layout-outside.vue",
    "content": "<template>\n  <div id=\"userLayout\" :class=\"['user-layout-wrapper']\">\n    <div class=\"login-container flex-center\">\n      <div class=\"user-layout-content flex-center flex-col\">\n        <div class=\"top flex flex-col items-center justify-center\">\n          <div class=\"header flex flex-row items-center\">\n            <img :src=\"siteInfo.loginLogo\" class=\"logo\" alt=\"logo\" />\n            <span class=\"title\"></span>\n          </div>\n          <div class=\"desc\">{{ siteInfo.slogan }}</div>\n        </div>\n\n        <router-view />\n\n        <div class=\"footer\">\n          <div class=\"copyright\">\n            <span v-if=\"!settingStore.isComm\">\n              <span>Copyright</span>\n              <span>&copy;</span>\n              <span>{{ envRef.COPYRIGHT_YEAR }}</span>\n              <span>\n                <a :href=\"envRef.COPYRIGHT_URL\" target=\"_blank\">{{ envRef.COPYRIGHT_NAME }}</a>\n              </span>\n            </span>\n\n            <span v-if=\"siteInfo.licenseTo\">\n              <a-divider type=\"vertical\" />\n              <a :href=\"siteInfo.licenseToUrl\" target=\"_blank\">{{ siteInfo.licenseTo }}</a>\n            </span>\n            <span v-if=\"sysPublic.icpNo\">\n              <a-divider type=\"vertical\" />\n              <a href=\"https://beian.miit.gov.cn/\" target=\"_blank\">{{ sysPublic.icpNo }}</a>\n            </span>\n            <span v-if=\"sysPublic.mpsNo\">\n              <a-divider type=\"vertical\" />\n              <a href=\"http://www.beian.gov.cn/portal/registerSystemInfo\" target=\"_blank\">{{ sysPublic.mpsNo }}</a>\n            </span>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nimport { env } from \"/@/utils/util.env\";\nimport { computed, ref, Ref } from \"vue\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { SiteInfo, SysPublicSetting } from \"/@/store/settings/api.basic\";\n\nconst envRef = ref(env);\nconst settingStore = useSettingStore();\nconst siteInfo: Ref<SiteInfo> = computed(() => {\n  return settingStore.siteInfo;\n});\nconst sysPublic: Ref<SysPublicSetting> = computed(() => {\n  return settingStore.sysPublic;\n});\n</script>\n\n<style lang=\"less\">\n#userLayout.user-layout-wrapper {\n  height: 100%;\n\n  &.mobile {\n    .container {\n      .main {\n        max-width: 368px;\n        width: 96%;\n      }\n    }\n  }\n\n  .login-container {\n    width: 100%;\n    height: 100%;\n    background: #f0f2f5 url(/static/background.svg) no-repeat 50%;\n    background-size: 100%;\n    //padding: 50px 0 84px;\n    position: relative;\n    display: flex;\n    flex-direction: column;\n\n    .user-layout-content {\n      height: 100%;\n\n      .top {\n        margin-top: 100px;\n        text-align: center;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: center;\n        .header {\n          height: 70px;\n          line-height: 70px;\n\n          .badge {\n            position: absolute;\n            display: inline-block;\n            line-height: 1;\n            vertical-align: middle;\n            margin-left: -12px;\n            margin-top: -10px;\n            opacity: 0.8;\n          }\n\n          .logo {\n            height: 100%;\n            vertical-align: top;\n            border-style: none;\n          }\n\n          .title {\n            font-size: 33px;\n            color: rgba(0, 0, 0, 0.85);\n            font-family: Avenir, \"Helvetica Neue\", Arial, Helvetica, sans-serif;\n            font-weight: 600;\n            position: relative;\n            top: 2px;\n          }\n        }\n        .desc {\n          font-size: 14px;\n          color: rgba(0, 0, 0, 0.45);\n          margin-top: 12px;\n          margin-bottom: 40px;\n        }\n      }\n\n      .main {\n        width: 400px;\n        max-width: 90vw;\n        flex: 1;\n      }\n\n      .footer {\n        // position: absolute;\n        width: 100%;\n        bottom: 0;\n        margin: 24px 0 24px;\n        text-align: center;\n\n        .links {\n          margin-bottom: 8px;\n          font-size: 14px;\n          a {\n            color: rgba(0, 0, 0, 0.45);\n            transition: all 0.3s;\n            &:not(:last-child) {\n              margin-right: 40px;\n            }\n          }\n        }\n        .copyright {\n          color: rgba(0, 0, 0, 0.45);\n          font-size: 14px;\n          display: flex;\n          flex-wrap: wrap;\n          justify-content: center;\n          align-items: center;\n          span {\n            margin-left: 5px;\n            margin-right: 5px;\n          }\n          a {\n            color: rgba(0, 0, 0, 0.45);\n            transition: all 0.3s;\n\n            &:hover {\n              color: rgba(0, 0, 0, 0.85);\n            }\n          }\n        }\n      }\n    }\n\n    a {\n      text-decoration: none;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/layout/layout-pass.vue",
    "content": "<template>\n  <router-view> </router-view>\n</template>\n\n<!--<script lang=\"ts\" setup>-->\n<!--import { usePageStore } from \"/@/store/modules/page\";-->\n\n<!--const pageStore = usePageStore();-->\n<!--const keepAlive = pageStore.keepAlive;-->\n<!--</script>-->\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/antdv.ts",
    "content": "import { ref } from \"vue\";\nimport \"dayjs/locale/zh-cn\";\nimport \"dayjs/locale/en\";\nimport zhCN from \"ant-design-vue/es/locale/zh_CN\";\nimport enUS from \"ant-design-vue/es/locale/en_US\";\nimport dayjs from \"dayjs\";\nexport const antdvLocale = ref(zhCN);\n\nexport async function setAntdvLocale(value: string) {\n  console.log(\"locale changed:\", value);\n  if (value.startsWith(\"zh\")) {\n    dayjs.locale(\"zh-cn\");\n    antdvLocale.value = zhCN;\n  } else {\n    dayjs.locale(\"en\");\n    antdvLocale.value = enUS;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/i18n.ts",
    "content": "import type { App } from \"vue\";\nimport type { Locale } from \"vue-i18n\";\nimport { setAntdvLocale } from \"./antdv\";\nimport type { ImportLocaleFn, LoadMessageFn, LocaleSetupOptions, SupportedLanguagesType } from \"./typing\";\n\nimport { unref } from \"vue\";\nimport { createI18n } from \"vue-i18n\";\nimport en_US from \"./langs/en-US/index\";\nimport zh_CN from \"./langs/zh-CN/index\";\n\nimport { useSimpleLocale } from \"/@/vben/composables\";\n\nconst i18n = createI18n({\n  globalInjection: true,\n  legacy: false,\n  fallbackLocale: \"en-US\",\n  locale: \"en-US\",\n  messages: {\n    \"zh-CN\": zh_CN,\n    \"en-US\": en_US,\n  },\n});\n\nconst modules = import.meta.glob(\"./langs/**/*.json\");\n\nconst { setSimpleLocale } = useSimpleLocale();\n\nconst localesMap = loadLocalesMapFromDir(/\\.\\/langs\\/([^/]+)\\/(.*)\\.json$/, modules);\nlet loadMessages: LoadMessageFn;\n\n/**\n * Load locale modules\n * @param modules\n */\nfunction loadLocalesMap(modules: Record<string, () => Promise<unknown>>) {\n  const localesMap: Record<Locale, ImportLocaleFn> = {};\n\n  for (const [path, loadLocale] of Object.entries(modules)) {\n    const key = path.match(/([\\w-]*)\\.(json)/)?.[1];\n    if (key) {\n      localesMap[key] = loadLocale as ImportLocaleFn;\n    }\n  }\n  return localesMap;\n}\n\n/**\n * Load locale modules with directory structure\n * @param regexp - Regular expression to match language and file names\n * @param modules - The modules object containing paths and import functions\n * @returns A map of locales to their corresponding import functions\n */\nfunction loadLocalesMapFromDir(regexp: RegExp, modules: Record<string, () => Promise<unknown>>): Record<Locale, ImportLocaleFn> {\n  const localesRaw: Record<Locale, Record<string, () => Promise<unknown>>> = {};\n  const localesMap: Record<Locale, ImportLocaleFn> = {};\n\n  // Iterate over the modules to extract language and file names\n  for (const path in modules) {\n    const match = path.match(regexp);\n    if (match) {\n      const [_, locale, fileName] = match;\n      if (locale && fileName) {\n        if (!localesRaw[locale]) {\n          localesRaw[locale] = {};\n        }\n        if (modules[path]) {\n          localesRaw[locale][fileName] = modules[path];\n        }\n      }\n    }\n  }\n\n  // Convert raw locale data into async import functions\n  for (const [locale, files] of Object.entries(localesRaw)) {\n    localesMap[locale] = async () => {\n      const messages: Record<string, any> = {};\n      for (const [fileName, importFn] of Object.entries(files)) {\n        messages[fileName] = ((await importFn()) as any)?.default;\n      }\n      return { default: messages };\n    };\n  }\n\n  return localesMap;\n}\n\n/**\n * Set i18n language\n * @param locale\n */\nfunction setI18nLanguage(locale: Locale) {\n  setAntdvLocale(locale);\n  //@ts-ignore\n  i18n.global.locale.value = locale;\n\n  document?.querySelector(\"html\")?.setAttribute(\"lang\", locale);\n}\n\nasync function setupI18n(app: App, options: LocaleSetupOptions = {}) {\n  const { defaultLocale = \"en-US\" } = options;\n  // app可以自行扩展一些第三方库和组件库的国际化\n  loadMessages = options.loadMessages || (async () => ({}));\n  app.use(i18n);\n  await loadLocaleMessages(defaultLocale);\n\n  // 在控制台打印警告\n  i18n.global.setMissingHandler((locale, key) => {\n    if (options.missingWarn && key.includes(\".\")) {\n      console.warn(`[intlify] Not found '${key}' key in '${locale}' locale messages.`);\n    }\n  });\n}\n\n/**\n * Load locale messages\n * @param lang\n */\nasync function loadLocaleMessages(lang: SupportedLanguagesType) {\n  if (unref(i18n.global.locale) === lang) {\n    return setI18nLanguage(lang);\n  }\n  setSimpleLocale(lang);\n\n  const message = await localesMap[lang]?.();\n\n  if (message?.default) {\n    //@ts-ignore\n    i18n.global.setLocaleMessage(lang, message.default);\n  }\n\n  const mergeMessage = await loadMessages(lang);\n  i18n.global.mergeLocaleMessage(lang, mergeMessage);\n\n  return setI18nLanguage(lang);\n}\n\nexport function useI18n() {\n  return {\n    t: i18n.global.t,\n    locale: i18n.global.locale,\n  };\n}\nexport { i18n, loadLocaleMessages, loadLocalesMap, loadLocalesMapFromDir, setupI18n, setI18nLanguage };\nexport default i18n;\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/index.ts",
    "content": "import { i18n, loadLocaleMessages, loadLocalesMap, loadLocalesMapFromDir, setupI18n, setI18nLanguage, useI18n } from \"./i18n\";\n\nconst $t = i18n.global.t;\nconst $te = i18n.global.te;\n\nexport { $t, $te, i18n, loadLocaleMessages, loadLocalesMap, loadLocalesMapFromDir, setupI18n, setI18nLanguage, useI18n };\nexport { type ImportLocaleFn, type LocaleSetupOptions, type SupportedLanguagesType } from \"./typing\";\n// export type { CompileError } from \"@intlify/core-base\";\n\n// export { useI18n } from \"vue-i18n\";\n\nexport type { Locale } from \"vue-i18n\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/en-US/authentication.ts",
    "content": "export default {\n  welcomeBack: \"Welcome Back\",\n  pageTitle: \"Plug-and-play Admin system\",\n  pageDesc: \"Efficient, versatile frontend template\",\n  loginSuccess: \"Login Successful\",\n  loginSuccessDesc: \"Welcome Back\",\n  loginSubtitle: \"Enter your account details to manage your projects\",\n  selectAccount: \"Quick Select Account\",\n  username: \"Username\",\n  password: \"Password\",\n  usernameTip: \"Please enter username\",\n  passwordErrorTip: \"Password is incorrect\",\n  passwordTip: \"Please enter password\",\n  verifyRequiredTip: \"Please complete the verification first\",\n  rememberMe: \"Remember Me\",\n  createAnAccount: \"Create an Account\",\n  createAccount: \"Create Account\",\n  alreadyHaveAccount: \"Already have an account?\",\n  accountTip: \"Don't have an account?\",\n  signUp: \"Sign Up\",\n  signUpSubtitle: \"Make managing your applications simple and fun\",\n  confirmPassword: \"Confirm Password\",\n  confirmPasswordTip: \"The passwords do not match\",\n  agree: \"I agree to\",\n  privacyPolicy: \"Privacy-policy\",\n  terms: \"Terms\",\n  agreeTip: \"Please agree to the Privacy Policy and Terms\",\n  goToLogin: \"Login instead\",\n  passwordStrength: \"Use 8 or more characters with a mix of letters, numbers & symbols\",\n  forgetPassword: \"Forget Password?\",\n  forgetPasswordSubtitle: \"Enter your email and we'll send you instructions to reset your password\",\n  emailTip: \"Please enter email\",\n  emailValidErrorTip: \"The email format you entered is incorrect\",\n  sendResetLink: \"Send Reset Link\",\n  email: \"Email\",\n  qrcodeSubtitle: \"Scan the QR code with your phone to login\",\n  qrcodePrompt: \"Click 'Confirm' after scanning to complete login\",\n  qrcodeLogin: \"QR Code Login\",\n  codeSubtitle: \"Enter your phone number to start managing your project\",\n  code: \"Security code\",\n  codeTip: \"Security code required {0} characters\",\n  mobile: \"Mobile\",\n  mobileLogin: \"Mobile Login\",\n  mobileTip: \"Please enter mobile number\",\n  mobileErrortip: \"The phone number format is incorrect\",\n  sendCode: \"Get Security code\",\n  sendText: \"Resend in {0}s\",\n  thirdPartyLogin: \"Or continue with\",\n  loginAgainTitle: \"Please Log In Again\",\n  loginAgainSubTitle: \"Your login session has expired. Please log in again to continue.\",\n  layout: {\n    center: \"Align Center\",\n    alignLeft: \"Align Left\",\n    alignRight: \"Align Right\",\n  },\n  usernamePlaceholder: \"Please enter username/email/phone number\",\n  passwordPlaceholder: \"Please enter your password\",\n  mobilePlaceholder: \"Please enter your mobile number\",\n  loginButton: \"Log In\",\n  forgotAdminPassword: \"Forgot admin password?\",\n  registerLink: \"Register\",\n\n  smsTab: \"Login via SMS code\",\n  passwordTab: \"Password login\",\n  title: \"Change Password\",\n  weakPasswordWarning: \"For your account security, please change your password immediately\",\n  changeNow: \"Change Now\",\n  successMessage: \"Changed successfully\",\n  oldPassword: \"Old Password\",\n  oldPasswordRequired: \"Please enter the old password\",\n  newPassword: \"New Password\",\n  newPasswordRequired: \"Please enter the new password\",\n  confirmNewPassword: \"Confirm New Password\",\n  confirmNewPasswordRequired: \"Please confirm the new password\",\n  changePasswordButton: \"Change Password\",\n  enterPassword: \"Please enter the password\",\n  newPasswordNotSameOld: \"The new password cannot be the same as the old password\",\n  enterPasswordAgain: \"Please enter the password again\",\n  passwordsNotMatch: \"The two passwords do not match!\",\n  avatar: \"Avatar\",\n  nickName: \"Nickname\",\n  phoneNumber: \"Phone Number\",\n  changePassword: \"Change Password\",\n  updateProfile: \"Update Profile\",\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/en-US/certd.ts",
    "content": "export default {\n  app: {\n    crud: {\n      i18n: {\n        name: \"name\",\n        city: \"city\",\n        status: \"status\",\n      },\n    },\n  },\n  fs: {\n    rowHandle: {\n      title: \"Operation\",\n    },\n  },\n  order: {\n    confirmTitle: \"Order Confirmation\",\n    package: \"Package\",\n    description: \"Description\",\n    specifications: \"Specifications\",\n    pipeline: \"Pipeline\",\n    domain: \"Domain\",\n    deployTimes: \"Deployments\",\n    duration: \"Duration\",\n    price: \"Price\",\n    paymentMethod: \"Payment Method\",\n    free: \"Free\",\n    unit: {\n      pieces: \"pieces\",\n      count: \"count\",\n      times: \"times\",\n    },\n  },\n  framework: {\n    title: \"Framework\",\n    home: \"Home\",\n  },\n  title: \"Certificate Automation\",\n  pipeline: \"Pipeline\",\n  pipelineEdit: \"Edit Pipeline\",\n  history: \"Execution History\",\n  certStore: \"Certificate Repository\",\n  siteMonitor: \"Site Certificate Monitor\",\n  settings: \"Settings\",\n  accessManager: \"Access Management\",\n  cnameRecord: \"CNAME Record Management\",\n  subDomain: \"Subdomain Delegation Settings\",\n  pipelineGroup: \"Pipeline Group Management\",\n  openKey: \"Open API Key\",\n  notification: \"Notification Settings\",\n  siteMonitorSetting: \"Site Monitor Settings\",\n  userSecurity: \"Security Settings\",\n  userProfile: \"Account Info\",\n  suite: \"Suite\",\n  mySuite: \"My Suite\",\n  suiteBuy: \"Suite Purchase\",\n  myTrade: \"My Orders\",\n  paymentReturn: \"Payment Return\",\n  user: {\n    greeting: \"Hello\",\n    profile: \"Account Info\",\n    logout: \"Logout\",\n  },\n  dashboard: {\n    greeting: \"Hello, {name}, welcome to 【{site}】\",\n    latestVersion: \"Latest version: {version}\",\n    validUntil: \"Valid until:\",\n    tutorialTooltip: \"Click to view detailed tutorial\",\n    tutorialText: \"Only 3 steps to automatically apply and deploy certificates\",\n    alertMessage: \"Certificates and credentials are sensitive. Do not use untrusted online Certd services or images. Always self-host and use official release channels:\",\n    helpDoc: \"Help Docs\",\n    pipelineCount: \"Number of Certificate Pipelines\",\n    noPipeline: \"You have no certificate pipelines yet\",\n    createNow: \"Create Now\",\n    managePipeline: \"Manage Pipelines\",\n    pipelineStatus: \"Pipeline Status\",\n    recentRun: \"Recent Run Statistics\",\n    runCount: \"Run Count\",\n    expiringCerts: \"Soon-to-Expire Certificates\",\n    supportedTasks: \"Overview of Supported Deployment Tasks\",\n  },\n  steps: {\n    createPipeline: \"Create Certificate Pipeline\",\n    addTask: \"Add Deployment Task\",\n    scheduledRun: \"Scheduled Run\",\n  },\n  customPipeline: \"Custom Pipeline\",\n  createCertdPipeline: \"Create Certificate Pipeline\",\n  commercialCertHosting: \"Commercial Certificate Hosting\",\n  tooltip: {\n    manualUploadOwnCert: \"Manually upload your own certificate for automatic deployment\",\n    noAutoApplyCommercialCert: \"Does not automatically apply for commercial certificates\",\n    manualUploadOnUpdate: \"Must manually upload once when the certificate is updated\",\n  },\n  table: {\n    confirmDeleteTitle: \"Are you sure you want to delete?\",\n    confirmDeleteMessage: \"This will delete all data related to the pipeline, including execution history, certificate files, and certificate repository records.\",\n  },\n  play: {\n    runPipeline: \"Run Pipeline\",\n    confirm: \"Confirm\",\n    confirmTrigger: \"Are you sure you want to trigger the run?\",\n    pipelineStarted: \"Pipeline has started running\",\n  },\n  actions: {\n    editPipeline: \"Edit Pipeline\",\n    editConfigGroup: \"Modify Configuration/Group\",\n    viewCertificate: \"View Certificate\",\n    downloadCertificate: \"Download Certificate\",\n  },\n  fields: {\n    userId: \"User ID\",\n    pipelineName: \"Pipeline Name\",\n    keyword: \"Keyword\",\n    required: \"This field is required\",\n    pipelineContent: \"Pipeline Content\",\n    scheduledTaskCount: \"Scheduled Task Count\",\n    deployTaskCount: \"Deployment Task Count\",\n    remainingValidity: \"Remaining Validity\",\n    expiryTime: \"Expiry Time\",\n    status: \"Status\",\n    lastRun: \"Last Run\",\n    enabled: \"Enabled\",\n    enabledLabel: \"Enabled\",\n    disabledLabel: \"Disabled\",\n    group: \"Group\",\n    type: \"Type\",\n    order: \"Order Number\",\n    keepHistoryCount: \"History Record Retention Count\",\n    keepHistoryHelper: \"Number of history records to keep; excess will be deleted\",\n    createTime: \"Creation Time\",\n    updateTime: \"Update Time\",\n    triggerType: \"Trigger Type\",\n    pipelineId: \"Pipeline Id\",\n  },\n  types: {\n    certApply: \"Certificate Application\",\n    certUpload: \"Certificate Upload\",\n    custom: \"Custom\",\n  },\n  myPipelines: \"My Pipelines\",\n  selectedCount: \"Selected {count} items\",\n  batchDelete: \"Batch Delete\",\n  batchForceRerun: \"Force Rerun\",\n  applyCertificate: \"Apply for Certificate\",\n  pipelineExecutionRecords: \"Pipeline Execution Records\",\n  confirm: \"Confirm\",\n  confirmBatchDeleteContent: \"Are you sure you want to batch delete these {count} records?\",\n  deleteSuccess: \"Delete successful\",\n  pleaseSelectRecords: \"Please select records first\",\n  triggerTypes: {\n    manual: \"Manual Execution\",\n    timer: \"Scheduled Execution\",\n  },\n  sysResources: {\n    sysRoot: \"System Management\",\n    sysConsole: \"Console\",\n    sysSettings: \"System Settings\",\n    cnameSetting: \"CNAME Service Settings\",\n    emailSetting: \"Email Server Settings\",\n    siteSetting: \"Site Personalization\",\n    headerMenus: \"Top Menu Settings\",\n    sysAccess: \"System-level Authorization\",\n    sysPlugin: \"Plugin Management\",\n    sysPluginEdit: \"Edit Plugin\",\n    sysPluginConfig: \"Certificate Plugin Configuration\",\n    accountBind: \"Account Binding\",\n    permissionManager: \"Permission Management\",\n    roleManager: \"Role Management\",\n    userManager: \"User Management\",\n    suiteManager: \"Suite Management\",\n    suiteSetting: \"Suite Settings\",\n    orderManager: \"Order Management\",\n    userSuites: \"User Suites\",\n  },\n  certificateRepo: {\n    title: \"Certificate Repository\",\n    sub: \"Certificates generated from pipeline\",\n  },\n\n  certificateNotGenerated: \"Certificate not yet generated, please run the pipeline first\",\n  viewCertificateTitle: \"View Certificate\",\n  close: \"Close\",\n  viewCert: {\n    title: \"View Certificate\",\n  },\n  download: {\n    title: \"Download Certificate\",\n  },\n  source: \"Source Code\",\n  github: \"GitHub\",\n  gitee: \"Gitee\",\n  cron: {\n    clearTip: \"Clear Selection\",\n    nextTrigger: \"Next Trigger Time\",\n    tip: \"Please set a valid cron expression first\",\n  },\n  cronForm: {\n    title: \"Scheduled Script\",\n    helper: \"Click the button above to select the time for daily execution.\\nIt is recommended to run once a day. Tasks will be skipped if the certificate is not expiring.\",\n    required: \"This field is required\",\n  },\n  email: {\n    title: \"Recipient Email\",\n    helper: \"Enter your recipient email addresses. Multiple addresses are supported.\",\n    required: \"This field is required\",\n  },\n  plugin: {\n    selectTitle: \"Certificate Apply Plugin\",\n    jsAcme: \"JS-ACME: Easy to use, powerful features [Recommended]\",\n    legoAcme: \"Lego-ACME: Based on Lego, supports a wide range of DNS providers, suitable for users familiar with Lego\",\n  },\n  pipelineForm: {\n    createTitle: \"Create Certificate Pipeline\",\n    moreParams: \"More Parameters\",\n    triggerCronTitle: \"Scheduled Trigger\",\n    triggerCronHelper:\n      \"Click the button above to choose a daily execution time.\\nIt is recommended to trigger once per day. The task will be skipped if the certificate has not expired and will not be executed repeatedly.\",\n    notificationTitle: \"Failure Notification\",\n    notificationHelper: \"Get real-time alerts when the task fails\",\n    groupIdTitle: \"Pipeline Group\",\n  },\n  notificationDefault: \"Use Default Notification\",\n  monitor: {\n    title: \"Site Certificate Monitoring\",\n    description: \"Check website certificates' expiration at 0:00 daily; reminders sent 10 days before expiration (using default notification channel);\",\n    settingLink: \"Site Monitoring Settings\",\n    limitInfo: \"Basic edition limited to 1, professional and above unlimited, current\",\n    checkAll: \"Check All\",\n    confirmTitle: \"Confirm\",\n    confirmContent: \"Confirm to trigger check for all site certificates?\",\n    checkSubmitted: \"Check task submitted\",\n    pleaseRefresh: \"Please refresh the page later to see the results\",\n    siteName: \"Site Name\",\n    enterSiteName: \"Please enter the site name\",\n    domain: \"Domain\",\n    enterDomain: \"Please enter the domain\",\n    enterValidDomain: \"Please enter a valid domain\",\n    httpsPort: \"HTTPS Port\",\n    enterPort: \"Please enter the port\",\n    certInfo: \"Certificate Info\",\n    issuer: \"Issuer\",\n    certDomains: \"Certificate Domains\",\n    certProvider: \"Issuer\",\n    certStatus: \"Certificate Status\",\n    status: {\n      ok: \"Valid\",\n      expired: \"Expired\",\n    },\n    certExpiresTime: \"Certificate Expiration\",\n    expired: \"expired\",\n    days: \"days\",\n    lastCheckTime: \"Last Check Time\",\n    disabled: \"Enable/Disable\",\n    ipCheck: \"Enable IP Check\",\n    selectRequired: \"Please select\",\n    ipCheckConfirm: \"Are you sure to {status} IP check?\",\n    ipCount: \"IP Count\",\n    checkStatus: \"Check Status\",\n    pipelineId: \"Linked Pipeline ID\",\n    certInfoId: \"Certificate ID\",\n    checkSubmittedRefresh: \"Check task submitted. Please refresh later to view the result.\",\n    ipManagement: \"IP Management\",\n    bulkImport: \"Bulk Import\",\n    basicLimitError: \"Basic version allows only one monitoring site. Please upgrade to the Pro version.\",\n    limitExceeded: \"Sorry, you can only create up to {max} monitoring records. Please purchase or upgrade your plan.\",\n    setting: {\n      siteMonitorSettings: \"Site Monitor Settings\",\n      notificationChannel: \"Notification Channel\",\n      setNotificationChannel: \"Set the notification channel\",\n      retryTimes: \"Retry Times\",\n      monitorRetryTimes: \"Number of retry attempts for monitoring requests\",\n      monitorCronSetting: \"Monitoring Schedule\",\n      cronTrigger: \"Scheduled trigger for monitoring\",\n      dnsServer: \"DNS Server\",\n      dnsServerHelper: \"Use a custom domain name resolution server, such as: 1.1.1.1 , support multiple\",\n    },\n  },\n  checkStatus: {\n    success: \"Success\",\n    checking: \"Checking\",\n    error: \"Error\",\n  },\n  domainList: {\n    title: \"Domain List\",\n    helper: \"Format: domain:port:name, one per line. Port and name are optional.\\nExamples:\\nwww.baidu.com:443:Baidu\\nwww.taobao.com::Taobao\\nwww.google.com\",\n    required: \"Please enter domains to import\",\n    placeholder: \"www.baidu.com:443:Baidu\\nwww.taobao.com::Taobao\\nwww.google.com\\n\",\n  },\n  accountInfo: \"Account Information\",\n  securitySettings: \"Security & Settings\",\n  confirmDisable2FA: \"Are you sure you want to disable two-factor authentication login?\",\n  disabledSuccess: \"Disabled successfully\",\n  saveSuccess: \"Saved successfully\",\n  twoFactorAuth: \"2FA Two-Factor Authentication Login\",\n  rebind: \"Rebind\",\n  twoFactorAuthHelper: \"Enable or disable two-factor authentication login\",\n  bindDevice: \"Bind Device\",\n  step1: \"1. Install any authenticator app, for example:\",\n  tooltipGoogleServiceError: \"If you get a Google service not found error, you can install KK Google Assistant\",\n  step2: \"2. Scan the QR code to add the account\",\n  step3: \"3. Enter the verification code\",\n  inputVerifyCode: \"Please enter the verification code\",\n  cancel: \"Cancel\",\n  authorizationManagement: \"Authorization Management\",\n  manageThirdPartyAuth: \"Manage third-party system authorization information\",\n  name: \"Name\",\n  pleaseEnterName: \"Please enter the name\",\n  nameHelper: \"Fill in as you like, useful to distinguish when multiple authorizations of the same type exist\",\n  level: \"Level\",\n  system: \"System\",\n  usera: \"User\",\n  nickName: \"Nickname\",\n  max50Chars: \"Maximum 50 characters\",\n  myInfo: \"My Information\",\n  save: \"Save\",\n  editSchedule: \"Edit Schedule\",\n  timerTrigger: \"Timer Trigger\",\n  schedule: \"Schedule\",\n  selectCron: \"Please select a schedule Cron\",\n  batchEditSchedule: \"Batch Edit Schedule\",\n  editTrigger: \"Edit Trigger\",\n  triggerName: \"Trigger Name\",\n  requiredField: \"This field is required\",\n  type: \"Type\",\n  enterName: \"Please enter a name\",\n  confirmDeleteTrigger: \"Are you sure you want to delete this trigger?\",\n  notificationType: \"Notification Type\",\n  selectNotificationType: \"Please select a notification type\",\n  notificationName: \"Notification Name\",\n  helperNotificationName: \"Fill freely, helps to distinguish when multiple notifications of the same type exist\",\n  isDefault: \"Is Default\",\n  yes: \"Yes\",\n  no: \"No\",\n  selectIsDefault: \"Please select if default\",\n  prompt: \"Prompt\",\n  confirmSetDefaultNotification: \"Are you sure to set as default notification?\",\n  test: \"Test\",\n  scope: \"Scope\",\n  scopeOpenApiOnly: \"Open API Only\",\n  scopeFullAccount: \"Full Account Permissions\",\n  required: \"This field is required\",\n  scopeHelper: \"Open API only allows access to open APIs; full account permissions allow access to all APIs\",\n  add: \"Generate New Key\",\n  gen: {\n    text: \"API Test\",\n    title: \"x-certd-token\",\n    okText: \"Confirm\",\n    contentPart1: \"Test the x-certd-token below, you can use it within 3 minutes to test \",\n    openApi: \"Open API\",\n    contentPart2: \" request testing\",\n  },\n  pending_cname_setup: \"Pending CNAME setup\",\n  validating: \"Validating\",\n  validation_successful: \"Validation successful\",\n  validation_failed: \"Validation failed\",\n  validation_timed_out: \"Validation timed out\",\n  proxied_domain: \"Proxied Domain\",\n  host_record: \"Host Record\",\n  please_set_cname: \"Please set CNAME\",\n  cname_service: \"CNAME Service\",\n  default_public_cname: \"Default public CNAME service, you can also \",\n  customize_cname: \"Customize CNAME Service\",\n  public_cname: \"Public CNAME\",\n  custom_cname: \"Custom CNAME\",\n  validate: \"Validate\",\n  validation_started: \"Validation started, please wait patiently\",\n  click_to_validate: \"Click to Validate\",\n  all: \"All\",\n  cname_feature_guide: \"CNAME feature principle and usage guide\",\n  batch_delete: \"Batch Delete\",\n  confirm_delete_count: \"Are you sure to delete these {count} records in batch?\",\n  delete_successful: \"Delete successful\",\n  please_select_records: \"Please select records first\",\n  edit_notification: \"Edit Notification\",\n  other_notification_method: \"Other Notification Method\",\n  trigger_time: \"Trigger Time\",\n  start_time: \"At Start\",\n  success_time: \"On Success\",\n  fail_to_success_time: \"Fail to Success\",\n  fail_time: \"On Failure\",\n  helper_suggest_fail_only: \"It is recommended to select only 'On Failure' and 'Fail to Success'\",\n  notification_config: \"Notification Configuration\",\n  please_select_notification: \"Please select a notification method\",\n  please_select_type: \"Please select type\",\n  please_select_trigger_time: \"Please select notification trigger time\",\n  please_select_notification_config: \"Please select notification configuration\",\n  confirm_delete_trigger: \"Are you sure you want to delete this trigger?\",\n  gift_package: \"Gift Package\",\n  package_name: \"Package Name\",\n  click_to_select: \"Click to select\",\n  please_select_package: \"Please select a package\",\n  package: \"Package\",\n  addon_package: \"Addon Package\",\n  domain_count: \"Domain Count\",\n  unit_count: \"pcs\",\n  field_required: \"This field is required\",\n  pipeline_count: \"Pipeline Count\",\n  unit_item: \"items\",\n  deploy_count: \"Deploy Count\",\n  unit_times: \"times\",\n  monitor_count: \"Certificate Monitor Count\",\n  duration: \"Duration\",\n  status: \"Status\",\n  active_time: \"Activation Time\",\n  expires_time: \"Expiration Time\",\n  is_present: \"Is Present\",\n  is_present_yes: \"Yes\",\n  is_present_no: \"No\",\n  basicInfo: \"Basic Information\",\n  titlea: \"Title\",\n  disabled: \"Disabled\",\n  ordera: \"Order\",\n  supportBuy: \"Support Purchase\",\n  intro: \"Introduction\",\n  packageContent: \"Package Content\",\n  maxDomainCount: \"Max Domain Count\",\n  maxPipelineCount: \"Max Pipeline Count\",\n  maxDeployCount: \"Max Deploy Count\",\n  maxMonitorCount: \"Max Monitor Count\",\n  price: \"Price\",\n  durationPrices: \"Duration Prices\",\n  packageName: \"Package Name\",\n  addon: \"Addon\",\n  typeHelper: \"Suite: Only the most recently purchased one is active at a time\\nAddon: Multiple can be purchased, effective immediately without affecting the suite\\nThe quantities of suite and addon can be accumulated\",\n  domainCount: \"Domain Count\",\n  pipelineCount: \"Pipeline Count\",\n  unitPipeline: \"pipelines\",\n  deployCount: \"Deployment Count\",\n  unitDeploy: \"times\",\n  monitorCount: \"Certificate Monitor Count\",\n  unitCount: \"pcs\",\n  durationPriceTitle: \"Duration and Price\",\n  selectDuration: \"Select Duration\",\n  supportPurchase: \"Support Purchase\",\n  cannotPurchase: \"Cannot Purchase\",\n  shelfStatus: \"Shelf Status\",\n  onShelf: \"On Shelf\",\n  offShelf: \"Off Shelf\",\n  orderHelper: \"Smaller values appear first\",\n  description: \"Description\",\n  createTime: \"Creation Time\",\n  updateTime: \"Update Time\",\n  edit: \"Edit\",\n  groupName: \"Group Name\",\n  enterGroupName: \"Please enter group name\",\n  subdomainHosting: \"Subdomain Hosting\",\n  subdomainHostingHint: \"When your domain has subdomain hosting set, you need to create records here, otherwise certificate application will fail\",\n  batchDeleteConfirm: \"Are you sure to batch delete these {count} records?\",\n  selectRecordFirst: \"Please select records first\",\n  subdomainHosted: \"Hosted Subdomain\",\n  subdomainHelpText: \"If you don't understand what subdomain hosting is,Do not set it randomly, as it may result in the inability to apply for the certificate. please refer to the documentation \",\n  subdomainManagement: \"Subdomain Management\",\n  isDisabled: \"Is Disabled\",\n  enabled: \"Enabled\",\n  uploadCustomCert: \"Upload Custom Certificate\",\n  sourcee: \"Source\",\n  sourcePipeline: \"Pipeline\",\n  sourceManualUpload: \"Manual Upload\",\n  domains: \"Domains\",\n  enterDomain: \"Please enter domain\",\n  validDays: \"Valid Days\",\n  expires: \" expires\",\n  days: \" days\",\n  expireTime: \"Expiration Time\",\n  certIssuer: \"Certificate Issuer\",\n  applyTime: \"Application Time\",\n  relatedPipeline: \"Related Pipeline\",\n  statusSuccess: \"Success\",\n  statusChecking: \"Checking\",\n  statusError: \"Error\",\n  actionImportBatch: \"Batch Import\",\n  actionSyncIp: \"Sync IP\",\n  modalTitleSyncIp: \"Sync IP\",\n  modalContentSyncIp: \"Are you sure to sync IP?\",\n  notificationSyncComplete: \"Sync Complete\",\n  actionCheckAll: \"Check All\",\n  modalTitleConfirm: \"Confirm\",\n  modalContentCheckAll: \"Confirm to trigger checking all IP site's certificates?\",\n  notificationCheckSubmitted: \"Check task submitted\",\n  notificationCheckDescription: \"Please refresh later to see results\",\n  tooltipCheckNow: \"Check Now\",\n  notificationCheckSubmittedPleaseRefresh: \"Check task submitted, please refresh later\",\n  columnId: \"ID\",\n  columnIp: \"IP\",\n  helperIpCname: \"Supports entering CNAME domain name\",\n  ruleIpRequired: \"Please enter IP\",\n  columnCertDomains: \"Certificate Domains\",\n  columnCertProvider: \"Issuer\",\n  columnCertStatus: \"Certificate Status\",\n  statusNormal: \"Normal\",\n  statusExpired: \"Expired\",\n  columnCertExpiresTime: \"Certificate Expiration Time\",\n  expired: \"expired\",\n  columnCheckStatus: \"Check Status\",\n  columnLastCheckTime: \"Last Check Time\",\n  columnSource: \"Source\",\n  sourceSync: \"Sync\",\n  sourceManual: \"Manual\",\n  sourceImport: \"Import\",\n  columnDisabled: \"Enabled/Disabled\",\n  columnRemark: \"Remark\",\n  pluginFile: \"Plugin File\",\n  selectPluginFile: \"Select plugin file\",\n  overrideSameName: \"Override same name\",\n  override: \"Override\",\n  noOverride: \"No override\",\n  overrideHelper: \"If a plugin with the same name exists, override it directly\",\n  importPlugin: \"Import Plugin\",\n  operationSuccess: \"Operation successful\",\n  customPlugin: \"Custom Plugin\",\n  import: \"Import\",\n  export: \"Export\",\n  pluginType: \"Plugin Type\",\n  auth: \"Authorization\",\n  dns: \"DNS\",\n  deployPlugin: \"Deploy Plugin\",\n  icon: \"Icon\",\n  pluginName: \"Plugin Name\",\n  pluginNameHelper: \"Must be English letters or digits, camelCase with type prefix\\nExample: AliyunDeployToCDN\\nDo not modify name once plugin is used\",\n  pluginNameRuleMsg: \"Must be English letters or digits, camelCase with type prefix\",\n  author: \"Author\",\n  authorHelper: \"Used as prefix when uploading to plugin store, e.g., greper/pluginName\",\n  authorRuleMsg: \"Must be English letters or digits\",\n  titleHelper: \"Plugin name in Chinese\",\n  descriptionHelper: \"Description of the plugin\",\n  builtIn: \"Built-in\",\n  custom: \"Custom\",\n  store: \"Store\",\n  version: \"Version\",\n  pluginDependencies: \"Plugin Dependencies\",\n  pluginDependenciesHelper: \"Dependencies to install first in format: [author/]pluginName[:version]\",\n  editableRunStrategy: \"Editable Run Strategy\",\n  editable: \"Editable\",\n  notEditable: \"Not Editable\",\n  runStrategy: \"Run Strategy\",\n  normalRun: \"Normal Run\",\n  skipOnSuccess: \"Skip on success (Deploy task)\",\n  defaultRunStrategyHelper: \"Default run strategy\",\n  enableDisable: \"Enable/Disable\",\n  clickToToggle: \"Click to toggle enable/disable\",\n  confirmToggle: \"Are you sure to\",\n  disable: \"disable\",\n  enable: \"enable\",\n  pluginGroup: \"Plugin Group\",\n  icpRegistrationNumber: \"ICP Registration Number\",\n  icpPlaceholder: \"Guangdong ICP xxxxxxx Number\",\n  publicSecurityRegistrationNumber: \"Public Security Registration Number\",\n  publicSecurityPlaceholder: \"Beijing Public Security xxxxxxx Number\",\n  enableAssistant: \"Enable Assistant\",\n  allowCrawlers: \"Allow Crawlers\",\n  httpProxy: \"HTTP Proxy\",\n  httpProxyPlaceholder: \"http://192.168.1.2:18010/\",\n  httpProxyHelper: \"Configure when some websites are blocked\",\n  httpsProxy: \"HTTPS Proxy\",\n  httpsProxyPlaceholder: \"http://192.168.1.2:18010/\",\n  saveThenTestTitle: \"Save first, then click test\",\n  testButton: \"Test\",\n  httpsProxyHelper: \"Usually both proxies are the same, save first then test\",\n  dualStackNetwork: \"Dual Stack Network\",\n  default: \"Default\",\n  ipv4Priority: \"IPv4 Priority\",\n  ipv6Priority: \"IPv6 Priority\",\n  dualStackNetworkHelper: \"If IPv6 priority is selected, enable IPv6 in docker-compose.yaml\",\n  enableCommonCnameService: \"Enable Public CNAME Service\",\n  commonCnameHelper: \"Allow use of public CNAME service. If disabled and no <router-link to='/sys/cname/provider'>custom CNAME service</router-link> is set, CNAME proxy certificate application will not work.\",\n  saveButton: \"Save\",\n  stopSuccess: \"Stopped successfully\",\n  google: \"Google\",\n  baidu: \"Baidu\",\n  success: \"Success\",\n  testFailed: \"Test Failed\",\n  testCompleted: \"Test Completed\",\n  manageOtherUserPipeline: \"Manage other users' pipelines\",\n  limitUserPipelineCount: \"Limit user pipeline count\",\n  limitUserPipelineCountHelper: \"0 means no limit\",\n  enableSelfRegistration: \"Enable self-registration\",\n  enableUserValidityPeriod: \"Enable user validity period\",\n  userValidityPeriodHelper: \"Users can use normally within validity; pipelines disabled after expiry\",\n  enableUsernameRegistration: \"Enable username registration\",\n  enableEmailRegistration: \"Enable email registration\",\n  proFeature: \"Pro feature\",\n  emailServerSetup: \"Set up email server\",\n  enableSmsLoginRegister: \"Enable SMS login and registration\",\n  commFeature: \"Commercial feature\",\n  smsProvider: \"SMS provider\",\n  aliyunSms: \"Aliyun SMS\",\n  yfySms: \"YFY SMS\",\n  smsTest: \"SMS test\",\n  testMobilePlaceholder: \"Enter test mobile number\",\n  saveThenTest: \"Save first then test\",\n  enterTestMobile: \"Please enter test mobile number\",\n  sendSuccess: \"Sent successfully\",\n  atLeastOneLoginRequired: \"At least one of password login or SMS login must be enabled\",\n  fieldRequired: \"This field is required\",\n  siteHide: \"Site Hide\",\n  enableSiteHide: \"Enable Site Hide\",\n  siteHideDescription: \"You can disable site accessibility normally and enable it when needed to enhance site security\",\n  helpDoc: \"Help Document\",\n  randomAddress: \"Random Address\",\n  siteHideUrlHelper: \"After the site is hidden, you need to visit this URL to unlock to access normally\",\n  fullUnlockUrl: \"Full Unlock URL\",\n  saveThisUrl: \"Please save this URL carefully\",\n  unlockPassword: \"Unlock Password\",\n  unlockPasswordHelper: \"Password needed to unlock the hide; set on first time or reset when filled\",\n  autoHideTime: \"Auto Hide Time\",\n  autoHideTimeHelper: \"Minutes without requests before auto hiding\",\n  hideOpenApi: \"Hide Open API\",\n  hideOpenApiHelper: \"Whether to hide open APIs; whether to expose /api/v1 prefixed endpoints\",\n  hideSiteImmediately: \"Hide Site Immediately\",\n  hideImmediately: \"Hide Immediately\",\n  confirmHideSiteTitle: \"Are you sure to hide the site immediately?\",\n  confirmHideSiteContent: \"After hiding, the site will be inaccessible. Please operate cautiously.\",\n  siteHiddenSuccess: \"Site has been hidden\",\n  emailServerSettings: \"Email Server Settings\",\n  setEmailSendingServer: \"Set the email sending server\",\n  useCustomEmailServer: \"Use Custom Email Server\",\n  smtpDomain: \"SMTP Domain\",\n  pleaseEnterSmtpDomain: \"Please enter SMTP domain or IP\",\n  smtpPort: \"SMTP Port\",\n  pleaseEnterSmtpPort: \"Please enter SMTP port\",\n  username: \"Username\",\n  pleaseEnterUsername: \"Please enter username\",\n  password: \"Password\",\n  pleaseEnterPassword: \"Please enter password\",\n  qqEmailAuthCodeHelper: \"If using QQ email, get an authorization code in QQ email settings as the password\",\n  senderEmail: \"Sender Email\",\n  pleaseEnterSenderEmail: \"Please enter sender email\",\n  useSsl: \"Use SSL\",\n  sslPortNote: \"SSL and non-SSL SMTP ports are different, please adjust port accordingly\",\n  ignoreCertValidation: \"Ignore Certificate Validation\",\n  useOfficialEmailServer: \"Use Official Email Server\",\n  useOfficialEmailServerHelper: \"Send emails directly using the official server to avoid complicated setup\",\n  testReceiverEmail: \"Test Receiver Email\",\n  pleaseEnterTestReceiverEmail: \"Please enter test receiver email\",\n  saveBeforeTest: \"Save before testing\",\n  sendFailHelpDoc: \"Failed to send??? \",\n  emailConfigHelpDoc: \"Email configuration help document\",\n  tryOfficialEmailServer: \"You can also try using the official email server ↗↗↗↗↗↗↗↗\",\n  pluginManagement: \"Plugin Management\",\n  pluginBetaWarning: \"Custom plugins are in BETA and may have breaking changes in future\",\n  pleaseSelectRecord: \"Please select records first\",\n  permissionManagement: \"Permission Management\",\n  adda: \"Add\",\n  rootNode: \"Root Node\",\n  permissionName: \"Permission Name\",\n  enterPermissionName: \"Please enter permission name\",\n  permissionCode: \"Permission Code\",\n  enterPermissionCode: \"Please enter permission code\",\n  max100Chars: \"Maximum 100 characters\",\n  examplePermissionCode: \"e.g.: sys:user:view\",\n  sortOrder: \"Sort Order\",\n  sortRequired: \"Sort order is required\",\n  parentNode: \"Parent Node\",\n  roleManagement: \"Role Management\",\n  assignPermissions: \"Assign Permissions\",\n  roleName: \"Role Name\",\n  enterRoleName: \"Please enter role name\",\n  unlockLogin: \"Unlock Login\",\n  notice: \"Notice\",\n  confirmUnlock: \"Are you sure you want to unlock this user's login?\",\n  unlockSuccess: \"Unlock successful\",\n  enterUsername: \"Please enter username\",\n  modifyPasswordIfFilled: \"Fill in to change the password\",\n  emaila: \"Email\",\n  mobile: \"Mobile\",\n  avatar: \"Avatar\",\n  validTime: \"Valid Time\",\n  remark: \"Remark\",\n  roles: \"Roles\",\n  cnameTitle: \"CNAME Service Configuration\",\n  cnameDescription:\n    \"The domain name configured here serves as a proxy for verifying other domains. When other domains apply for certificates, they map to this domain via CNAME for ownership verification. The advantage is that any domain can apply for a certificate this way without providing an AccessSecret.\",\n  cnameLinkText: \"CNAME principle and usage instructions\",\n  confirmTitle: \"Confirm\",\n  confirmDeleteBatch: \"Are you sure you want to delete these {count} records?\",\n  selectRecordsFirst: \"Please select records first\",\n  cnameDomain: \"CNAME Domain\",\n  cnameDomainPlaceholder: \"cname.handsfree.work\",\n  cnameDomainHelper:\n    \"Requires a domain registered with a DNS provider on the right (or you can transfer other domain DNS servers here).\\nOnce the CNAME domain is set, it cannot be changed. It is recommended to use a first-level subdomain.\",\n  dnsProvider: \"DNS Provider\",\n  dnsProviderAuthorization: \"DNS Provider Authorization\",\n  setDefault: \"Set Default\",\n  confirmSetDefault: \"Are you sure to set as default?\",\n  setAsDefault: \"Set as Default\",\n  disabledLabel: \"Disabled\",\n  confirmToggleStatus: \"Are you sure to {action}?\",\n  template: {\n    title: \"Pipeline Template\",\n    edit: \"Pipeline Template Edit\",\n    importCreate: \"Pipeline Batch Create\",\n    // intro: \"可根据模版批量创建流水线\",\n    intro: \"Batch create pipeline based on template\",\n    createTemplate: \"Create Template\",\n    useTemplate: \"Use This Template\",\n    batchCreate: \"Batch Create Pipeline\",\n    singleCreate: \"Create Single Pipeline\",\n    templateName: \"Template Name\",\n    enterTemplateName: \"Please enter template name\",\n    copyPipelineConfig: \"Copy this pipeline configuration as template source\",\n    pipeline: \"Pipeline\",\n  },\n\n  sys: {\n    setting: {\n      showRunStrategy: \"Show RunStrategy\",\n      showRunStrategyHelper: \"Allow modify the run strategy of the task\",\n    },\n  },\n  modal: {\n    close: \"Close\",\n    viewCertificateTitle: \"View Certificate\",\n  },\n  domain: {\n    domainManager: \"Domain Manager\",\n    domainDescription: \"used to auto apply for certificate\", //管理域名的校验方式，用于申请证书时自动选择验证方式\n    domain: \"Domain\",\n    challengeType: \"Challenge Type\",\n    dnsProviderType: \"DNS Provider Type\",\n    dnsProviderAccess: \"DNS Provider Access\",\n    httpUploaderType: \"HTTP Uploader Type\",\n    httpUploaderAccess: \"HTTP Uploader Access\",\n    httpUploadRootDir: \"HTTP Upload Root Dir\",\n    disabled: \"Disabled\",\n    challengeSetting: \"Challenge Setting\",\n    gotoCnameTip: \"Please go to CNAME Record Page\",\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/en-US/common.ts",
    "content": "export default {\n  back: \"Back\",\n  backToHome: \"Back To Home\",\n  login: \"Login\",\n  logout: \"Logout\",\n  prompt: \"Prompt\",\n  cancel: \"Cancel\",\n  confirm: \"Confirm\",\n  reset: \"Reset\",\n  noData: \"No Data\",\n  refresh: \"Refresh\",\n  loadingMenu: \"Loading Menu\",\n  query: \"Search\",\n  search: \"Search\",\n  enabled: \"Enabled\",\n  disabled: \"Disabled\",\n  enable: \"Enable\",\n  disable: \"Disable\",\n  edit: \"Edit\",\n  delete: \"Delete\",\n  create: \"Create\",\n  yes: \"Yes\",\n  no: \"No\",\n  handle: \"Handle\",\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/en-US/guide.ts",
    "content": "export default {\n  createCertPipeline: {\n    title: \"Create Certificate Application Pipeline\",\n    description: \"Demonstrate how to configure a certificate application task\",\n    items: {\n      tutorialTitle: \"Tutorial Demo Content\",\n      tutorialDesc1: \"This tutorial demonstrates how to automatically apply for a certificate and deploy it to Nginx\",\n      tutorialDesc2: \"Only 3 steps, fully automatic application and deployment\",\n      createTitle: \"Create Certificate Pipeline\",\n      createDesc: \"Click to add a certificate pipeline and fill in the certificate application information\",\n      successTitle: \"Pipeline Created Successfully\",\n      successDesc: \"Click manual trigger to apply for the certificate\",\n      nextTitle: \"Next, demonstrate how to automatically deploy the certificate\",\n      nextDesc: \"If you only need to apply for a certificate, you can stop here\",\n    },\n  },\n  buttons: {\n    prev: \"Previous Step\",\n    next: \"Next Step\",\n  },\n  addDeployTask: {\n    title: \"Add Deployment Certificate Task\",\n    description: \"Demonstrate deployment of certificate to Nginx\",\n    items: {\n      addTaskTitle: \"Add Certificate Deployment Task\",\n      addTaskDesc1: \"Demonstrate automatic deployment of certificate to nginx\",\n      addTaskDesc2: \"Our system provides numerous deployment plugins to meet your needs\",\n      fillParamsTitle: \"Fill Task Parameters\",\n      fillParamsDesc1: \"Fill in the certificate file path on the host\",\n      fillParamsDesc2: \"Select SSH login authorization for the host\",\n      activateCertTitle: \"Make New Certificate Effective\",\n      activateCertDesc1: \"Execute restart script\",\n      activateCertDesc2: \"Make the certificate effective\",\n      taskSuccessTitle: \"Deployment Task Added Successfully\",\n      taskSuccessDesc: \"Now you can run it\",\n      pluginsTitle: \"Our System Provides Numerous Deployment Plugins\",\n      pluginsDesc: \"You can deploy certificates to various applications and platforms according to your needs\",\n    },\n  },\n  runAndTestTask: {\n    runAndTestTitle: \"Run and Test\",\n    runAndTestDescription: \"Demonstrate pipeline running, view logs, skip on success, etc.\",\n    runTestOnce: \"Run a Test\",\n    clickManualTriggerToTest: \"Click the manual trigger button to test the run\",\n    viewLogs: \"View Logs\",\n    clickTaskToViewStatusAndLogs: \"Click the task to view status and logs\",\n    howToTroubleshootFailure: \"How to Troubleshoot Failure\",\n    viewErrorLogs: \"View error logs\",\n    nginxContainerNotExistFix: \"Shows nginx container not found error, fix by changing to correct nginx container name\",\n    executionSuccess: \"Execution Success\",\n    retryAfterFix: \"After fixing, click manual trigger again to rerun successfully\",\n    autoSkipAfterSuccess: \"Auto Skip After Success\",\n    successSkipExplanation: \"Successful runs will be skipped automatically, rerun only if parameters or certificates update\",\n    viewCertDeploymentSuccess: \"View Certificate Deployment Success\",\n    visitNginxToSeeCert: \"Visit website on nginx to see certificate deployed successfully\",\n    downloadCertManualDeploy: \"Download Certificate for Manual Deployment\",\n    downloadIfNoAutoDeployPlugin: \"If no deployment plugin available, download certificate for manual deployment\",\n  },\n  scheduleAndEmailTask: {\n    title: \"Set Scheduled Execution and Email Notifications\",\n    description: \"Automatic running\",\n    setSchedule: \"Set Scheduled Execution\",\n    pipelineSuccessThenSchedule: \"Pipeline tests succeed, then configure scheduled triggers so it runs automatically daily\",\n    recommendDailyRun: \"Recommend configuring to run once daily; new certs requested 35 days before expiry and auto-skipped otherwise\",\n    setEmailNotification: \"Set Email Notifications\",\n    suggestErrorAndRecoveryEmails: \"Suggest listening for 'On Error' and 'Error to Success' to quickly troubleshoot failures (basic version requires mail server setup)\",\n    basicVersionNeedsMailServer: \"(basic version requires configuring mail server)\",\n    tutorialEndTitle: \"Tutorial End\",\n    thanksForWatching: \"Thank you for watching, hope it helps you\",\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/en-US/index.ts",
    "content": "import certd from \"./certd\";\nimport authentication from \"./authentication\";\nimport vip from \"./vip\";\nimport tutorial from \"./tutorial\";\nimport preferences from \"./preferences\";\nimport ui from \"./ui\";\nimport guide from \"./guide\";\nimport common from \"./common\";\n\nexport default {\n  certd,\n  authentication,\n  vip,\n  ui,\n  tutorial,\n  preferences,\n  guide,\n  common,\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/en-US/preferences.ts",
    "content": "export default {\n  title: \"Preferences\",\n  subtitle: \"Customize Preferences & Preview in Real Time\",\n  resetTip: \"Data has changed, click to reset\",\n  resetTitle: \"Reset Preferences\",\n  resetSuccess: \"Preferences reset successfully\",\n  appearance: \"Appearance\",\n  layout: \"Layout\",\n  content: \"Content\",\n  other: \"Other\",\n  wide: \"Wide\",\n  compact: \"Fixed\",\n  followSystem: \"Follow System\",\n  vertical: \"Vertical\",\n  verticalTip: \"Side vertical menu mode\",\n  horizontal: \"Horizontal\",\n  horizontalTip: \"Horizontal menu mode, all menus displayed at the top\",\n  twoColumn: \"Two Column\",\n  twoColumnTip: \"Vertical Two Column Menu Mode\",\n  headerSidebarNav: \"Header Vertical\",\n  headerSidebarNavTip: \"Header Full Width, Sidebar Navigation Mode\",\n  headerTwoColumn: \"Header Two Column\",\n  headerTwoColumnTip: \"Header Navigation & Sidebar Two Column co-exists\",\n  mixedMenu: \"Mixed Menu\",\n  mixedMenuTip: \"Vertical & Horizontal Menu Co-exists\",\n  fullContent: \"Full Content\",\n  fullContentTip: \"Only display content body, hide all menus\",\n  normal: \"Normal\",\n  plain: \"Plain\",\n  rounded: \"Rounded\",\n  copyPreferences: \"Copy Preferences\",\n  copyPreferencesSuccessTitle: \"Copy successful\",\n  copyPreferencesSuccess: \"Copy successful, please override in `src/preferences.ts` under app\",\n  clearAndLogout: \"Clear Cache & Logout\",\n  mode: \"Mode\",\n  general: \"General\",\n  language: \"Language\",\n  dynamicTitle: \"Dynamic Title\",\n  watermark: \"Watermark\",\n  checkUpdates: \"Periodic update check\",\n  position: {\n    title: \"Preferences Postion\",\n    header: \"Header\",\n    auto: \"Auto\",\n    fixed: \"Fixed\",\n  },\n  sidebar: {\n    title: \"Sidebar\",\n    width: \"Width\",\n    visible: \"Show Sidebar\",\n    collapsed: \"Collpase Menu\",\n    collapsedShowTitle: \"Show Menu Title\",\n    autoActivateChild: \"Auto Activate SubMenu\",\n    autoActivateChildTip: \"`Enabled` to automatically activate the submenu while click menu.\",\n    expandOnHover: \"Expand On Hover\",\n    expandOnHoverTip: \"When the mouse hovers over menu, \\n `Enabled` to expand children menus \\n `Disabled` to expand whole sidebar.\",\n  },\n  tabbar: {\n    title: \"Tabbar\",\n    enable: \"Enable Tab Bar\",\n    icon: \"Show Tabbar Icon\",\n    showMore: \"Show More Button\",\n    showMaximize: \"Show Maximize Button\",\n    persist: \"Persist Tabs\",\n    maxCount: \"Max Count of Tabs\",\n    maxCountTip: \"When the number of tabs exceeds the maximum,\\nthe oldest tab will be closed.\\n Set to 0 to disable count checking.\",\n    draggable: \"Enable Draggable Sort\",\n    wheelable: \"Support Mouse Wheel\",\n    middleClickClose: \"Close Tab when Mouse Middle Button Click\",\n    wheelableTip: \"When enabled, the Tabbar area responds to vertical scrolling events of the scroll wheel.\",\n    styleType: {\n      title: \"Tabs Style\",\n      chrome: \"Chrome\",\n      card: \"Card\",\n      plain: \"Plain\",\n      brisk: \"Brisk\",\n    },\n    contextMenu: {\n      reload: \"Reload\",\n      close: \"Close\",\n      pin: \"Pin\",\n      unpin: \"Unpin\",\n      closeLeft: \"Close Left Tabs\",\n      closeRight: \"Close Right Tabs\",\n      closeOther: \"Close Other Tabs\",\n      closeAll: \"Close All Tabs\",\n      openInNewWindow: \"Open in New Window\",\n      maximize: \"Maximize\",\n      restoreMaximize: \"Restore\",\n    },\n  },\n  navigationMenu: {\n    title: \"Navigation Menu\",\n    style: \"Navigation Menu Style\",\n    accordion: \"Sidebar Accordion Menu\",\n    split: \"Navigation Menu Separation\",\n    splitTip: \"When enabled, the sidebar displays the top bar's submenu\",\n  },\n  breadcrumb: {\n    title: \"Breadcrumb\",\n    home: \"Show Home Button\",\n    enable: \"Enable Breadcrumb\",\n    icon: \"Show Breadcrumb Icon\",\n    background: \"background\",\n    style: \"Breadcrumb Style\",\n    hideOnlyOne: \"Hidden when only one\",\n  },\n  animation: {\n    title: \"Animation\",\n    loading: \"Page Loading\",\n    transition: \"Page Transition\",\n    progress: \"Page Progress\",\n  },\n  theme: {\n    title: \"Theme\",\n    radius: \"Radius\",\n    light: \"Light\",\n    dark: \"Dark\",\n    darkSidebar: \"Semi Dark Sidebar\",\n    darkHeader: \"Semi Dark Header\",\n    weakMode: \"Weak Mode\",\n    grayMode: \"Gray Mode\",\n    builtin: {\n      title: \"Built-in\",\n      default: \"Default\",\n      violet: \"Violet\",\n      pink: \"Pink\",\n      rose: \"Rose\",\n      skyBlue: \"Sky Blue\",\n      deepBlue: \"Deep Blue\",\n      green: \"Green\",\n      deepGreen: \"Deep Green\",\n      orange: \"Orange\",\n      yellow: \"Yellow\",\n      zinc: \"Zinc\",\n      neutral: \"Neutral\",\n      slate: \"Slate\",\n      gray: \"Gray\",\n      custom: \"Custom\",\n    },\n  },\n  header: {\n    title: \"Header\",\n    visible: \"Show Header\",\n    modeStatic: \"Static\",\n    modeFixed: \"Fixed\",\n    modeAuto: \"Auto hide & Show\",\n    modeAutoScroll: \"Scroll to Hide & Show\",\n    menuAlign: \"Menu Align\",\n    menuAlignStart: \"Start\",\n    menuAlignEnd: \"End\",\n    menuAlignCenter: \"Center\",\n  },\n  footer: {\n    title: \"Footer\",\n    visible: \"Show Footer\",\n    fixed: \"Fixed at Bottom\",\n  },\n  copyright: {\n    title: \"Copyright\",\n    enable: \"Enable Copyright\",\n    companyName: \"Company Name\",\n    companySiteLink: \"Company Site Link\",\n    date: \"Date\",\n    icp: \"ICP License Number\",\n    icpLink: \"ICP Site Link\",\n  },\n  shortcutKeys: {\n    title: \"Shortcut Keys\",\n    global: \"Global\",\n    search: \"Global Search\",\n    logout: \"Logout\",\n    preferences: \"Preferences\",\n  },\n  widget: {\n    title: \"Widget\",\n    globalSearch: \"Enable Global Search\",\n    fullscreen: \"Enable Fullscreen\",\n    themeToggle: \"Enable Theme Toggle\",\n    languageToggle: \"Enable Language Toggle\",\n    notification: \"Enable Notification\",\n    sidebarToggle: \"Enable Sidebar Toggle\",\n    lockScreen: \"Enable Lock Screen\",\n    refresh: \"Enable Refresh\",\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/en-US/tutorial.ts",
    "content": "export default {\n  title: \"Tutorial\",\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/en-US/ui.ts",
    "content": "export default {\n  formRules: {\n    required: \"Please enter {0}\",\n    selectRequired: \"Please select {0}\",\n    minLength: \"{0} must be at least {1} characters\",\n    maxLength: \"{0} can be at most {1} characters\",\n    length: \"{0} must be {1} characters long\",\n    alreadyExists: \"{0} `{1}` already exists\",\n    startWith: \"{0} must start with `{1}`\",\n    invalidURL: \"Please input a valid URL\",\n  },\n  actionTitle: {\n    edit: \"Modify {0}\",\n    create: \"Create {0}\",\n    delete: \"Delete {0}\",\n    view: \"View {0}\",\n  },\n  actionMessage: {\n    deleteConfirm: \"Are you sure to delete {0}?\",\n    deleting: \"Deleting {0} ...\",\n    deleteSuccess: \"{0} deleted successfully\",\n    operationSuccess: \"Operation succeeded\",\n    operationFailed: \"Operation failed\",\n  },\n  placeholder: {\n    input: \"Please enter\",\n    select: \"Please select\",\n  },\n  captcha: {\n    title: \"Please complete the security verification\",\n    sliderSuccessText: \"Passed\",\n    sliderDefaultText: \"Slider and drag\",\n    alt: \"Supports img tag src attribute value\",\n    sliderRotateDefaultTip: \"Click picture to refresh\",\n    sliderRotateFailTip: \"Validation failed\",\n    sliderRotateSuccessTip: \"Validation successful, time {0} seconds\",\n    refreshAriaLabel: \"Refresh captcha\",\n    confirmAriaLabel: \"Confirm selection\",\n    confirm: \"Confirm\",\n    pointAriaLabel: \"Click point\",\n    clickInOrder: \"Please click in order\",\n  },\n  iconPicker: {\n    placeholder: \"Select an icon\",\n    search: \"Search icon...\",\n  },\n  jsonViewer: {\n    copy: \"Copy\",\n    copied: \"Copied\",\n  },\n  fallback: {\n    pageNotFound: \"Oops! Page Not Found\",\n    pageNotFoundDesc: \"Sorry, we couldn't find the page you were looking for.\",\n    forbidden: \"Oops! Access Denied\",\n    forbiddenDesc: \"Sorry, but you don't have permission to access this page.\",\n    internalError: \"Oops! Something Went Wrong\",\n    internalErrorDesc: \"Sorry, but the server encountered an error.\",\n    offline: \"Offline Page\",\n    offlineError: \"Oops! Network Error\",\n    offlineErrorDesc: \"Sorry, can't connect to the internet. Check your connection.\",\n    comingSoon: \"Coming Soon\",\n    http: {\n      requestTimeout: \"The request timed out. Please try again later.\",\n      networkError: \"A network error occurred. Please check your internet connection and try again.\",\n      badRequest: \"Bad Request. Please check your input and try again.\",\n      unauthorized: \"Unauthorized. Please log in to continue.\",\n      forbidden: \"Forbidden. You do not have permission to access this resource.\",\n      notFound: \"Not Found. The requested resource could not be found.\",\n      internalServerError: \"Internal Server Error. Something went wrong on our end. Please try again later.\",\n    },\n  },\n  widgets: {\n    document: \"Document\",\n    qa: \"Q&A\",\n    setting: \"Settings\",\n    logoutTip: \"Do you want to logout?\",\n    viewAll: \"View All Messages\",\n    notifications: \"Notifications\",\n    markAllAsRead: \"Make All as Read\",\n    clearNotifications: \"Clear\",\n    checkUpdatesTitle: \"New Version Available\",\n    checkUpdatesDescription: \"Click to refresh and get the latest version\",\n    search: {\n      title: \"Search\",\n      searchNavigate: \"Search Navigation\",\n      select: \"Select\",\n      navigate: \"Navigate\",\n      close: \"Close\",\n      noResults: \"No Search Results Found\",\n      noRecent: \"No Search History\",\n      recent: \"Search History\",\n    },\n    lockScreen: {\n      title: \"Lock Screen\",\n      screenButton: \"Locking\",\n      password: \"Password\",\n      placeholder: \"Please enter password\",\n      unlock: \"Click to unlock\",\n      errorPasswordTip: \"Password error, please re-enter\",\n      backToLogin: \"Back to login\",\n      entry: \"Enter the system\",\n    },\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/en-US/vip.ts",
    "content": "export default {\n  label: {\n    comm: \"Business Edition\",\n    plus: \"Professional Edition\",\n    free: \"Basic Edition\",\n  },\n  comm: {\n    name: \"{vipLabel} Activated\",\n    title: \"Expires on: {expire}\",\n    nav: \"{vipLabel}\",\n  },\n  plus: {\n    name: \"Pro Features\",\n    title: \"Upgrade to Pro for commercial license\",\n  },\n  free: {\n    comm: {\n      name: \"Pro Features\",\n      title: \"Upgrade to Pro for commercial license\",\n    },\n    button: {\n      name: \"Advanced Features\",\n      title: \"Upgrade to Advanced for more VIP privileges\",\n    },\n    nav: {\n      name: \"Basic Version\",\n      title: \"Upgrade to Advanced for more VIP privileges\",\n    },\n  },\n  enterCode: \"Please enter the activation code\",\n  successTitle: \"Activation Successful\",\n  successContent: \"You have successfully activated {vipLabel}, valid until: {expireDate}\",\n  bindAccountTitle: \"Bind Your Account\",\n  bindAccountContent: \"Binding your account helps prevent license loss. Strongly recommended.\",\n  congratulations_vip_trial: \"Congratulations, you have received a Pro version {duration} days trial\",\n  trial_modal_title: \"7-day Pro version trial acquisition\",\n  trial_modal_ok_text: \"Get now\",\n  trial_modal_thanks: \"Thank you for supporting the open source project\",\n  trial_modal_click_confirm: \"Click confirm to get a 7-day Pro version trial\",\n  get_7_day_pro_trial: \"7-day professional version trial\",\n  star_now: \"Star Now\",\n  please_help_star: \"Could you please help by starring? Thanks a lot!\",\n  admin_only_operation: \"Admin operation only\",\n  enter_activation_code: \"Please enter the activation code\",\n  activate_pro_business: \"Activate Professional/Business Edition\",\n  renew_business: \"Renew Business Edition\",\n  renew_pro_upgrade_business: \"Renew Professional Edition / Upgrade to Business Edition\",\n  basic_edition: \"Basic Edition\",\n  community_free_version: \"Community Free Version\",\n  unlimited_certificate_application: \"Unlimited certificate applications\",\n  unlimited_domain_count: \"Unlimited domain count\",\n  unlimited_certificate_pipelines: \"Unlimited certificate pipelines\",\n  common_deployment_plugins: \"Common host, cloud platform, CDN, Baota, 1Panel deployment plugins\",\n  email_webhook_notifications: \"Email, webhook notification methods\",\n\n  professional_edition: \"Professional Edition\",\n  open_source_support: \"Open source requires your sponsorship support\",\n  vip_group_priority: \"Access to VIP group, your requests will have priority\",\n  unlimited_site_certificate_monitoring: \"Unlimited site certificate monitoring\",\n  more_notification_methods: \"More notification methods\",\n  plugins_fully_open: \"All plugins open, including Synology and more\",\n  click_to_get_7_day_trial: \"Click to get 7-day trial\",\n  years: \"years\",\n  afdian_support_vip: 'Get a one-year professional activation code after supporting \"VIP membership\" on Afdian, open source needs your support',\n  get_after_support: \"Get after sponsoring\",\n\n  business_edition: \"Business Edition\",\n  commercial_license: \"Commercial license, allowed for external operation\",\n  all_pro_privileges: \"All professional edition privileges\",\n  allow_commercial_use_modify_logo_title: \"Allows commercial use, can modify logo and title\",\n  data_statistics: \"Data statistics\",\n  plugin_management: \"Plugin management\",\n  unlimited_multi_users: \"Unlimited multi-users\",\n  support_user_payment: \"Supports user payments\",\n  contact_author_for_trial: \"Please contact the author for trial\",\n  activate: \"Activate\",\n  get_pro_code_after_support: 'Get a one-year professional activation code after supporting \"VIP membership\" on Afdian',\n  business_contact_author: \"Business edition please contact the author directly\",\n  year: \"year\",\n  freee: \"Free\",\n  renew: \"Renew\",\n  activate_immediately: \"Activate Immediately\",\n  current: \"Current\",\n  activated_expire_time: \" activated, expiration date: \",\n  site_id: \"Site ID\",\n  invite_code_optional: \"Invite code [optional], can get extra 30 days for Professional / 15 days for Business\",\n  no_activation_code: \"No activation code?\",\n  activation_code_one_use: \"Activation code can only be used once. To change site, please \",\n  bind_account: \"bind account\",\n  transfer_vip: ' then \"Transfer VIP\"',\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/zh-CN/authentication.ts",
    "content": "export default {\n  welcomeBack: \"欢迎回来\",\n  pageTitle: \"开箱即用的大型中后台管理系统\",\n  pageDesc: \"工程化、高性能、跨组件库的前端模版\",\n  loginSuccess: \"登录成功\",\n  loginSuccessDesc: \"欢迎回来\",\n  loginSubtitle: \"请输入您的帐户信息以开始管理您的项目\",\n  selectAccount: \"快速选择账号\",\n  username: \"账号\",\n  password: \"密码\",\n  usernameTip: \"请输入用户名\",\n  passwordTip: \"请输入密码\",\n  verifyRequiredTip: \"请先完成验证\",\n  passwordErrorTip: \"密码错误\",\n  rememberMe: \"记住账号\",\n  createAnAccount: \"创建一个账号\",\n  createAccount: \"创建账号\",\n  alreadyHaveAccount: \"已经有账号了?\",\n  accountTip: \"还没有账号?\",\n  signUp: \"注册\",\n  signUpSubtitle: \"让您的应用程序管理变得简单而有趣\",\n  confirmPassword: \"确认密码\",\n  confirmPasswordTip: \"两次输入的密码不一致\",\n  agree: \"我同意\",\n  privacyPolicy: \"隐私政策\",\n  terms: \"条款\",\n  agreeTip: \"请同意隐私政策和条款\",\n  goToLogin: \"去登录\",\n  passwordStrength: \"使用 8 个或更多字符，混合字母、数字和符号\",\n  forgetPassword: \"忘记密码?\",\n  forgetPasswordSubtitle: \"输入您的电子邮件，我们将向您发送重置密码的连接\",\n  emailTip: \"请输入邮箱\",\n  emailValidErrorTip: \"你输入的邮箱格式不正确\",\n  sendResetLink: \"发送重置链接\",\n  email: \"邮箱\",\n  qrcodeSubtitle: \"请用手机扫描二维码登录\",\n  qrcodePrompt: \"扫码后点击 '确认'，即可完成登录\",\n  qrcodeLogin: \"扫码登录\",\n  codeSubtitle: \"请输入您的手机号码以开始管理您的项目\",\n  code: \"验证码\",\n  codeTip: \"请输入{0}位验证码\",\n  mobile: \"手机号码\",\n  mobileTip: \"请输入手机号\",\n  mobileErrortip: \"手机号码格式错误\",\n  mobileLogin: \"手机号登录\",\n  sendCode: \"获取验证码\",\n  sendText: \"{0}秒后重新获取\",\n  thirdPartyLogin: \"其他登录方式\",\n  loginAgainTitle: \"重新登录\",\n  loginAgainSubTitle: \"您的登录状态已过期，请重新登录以继续。\",\n  layout: {\n    center: \"居中\",\n    alignLeft: \"居左\",\n    alignRight: \"居右\",\n  },\n  usernamePlaceholder: \"请输入用户名/邮箱/手机号\",\n  passwordPlaceholder: \"请输入密码\",\n  mobilePlaceholder: \"请输入手机号\",\n  loginButton: \"登录\",\n  forgotAdminPassword: \"忘记管理员密码？\",\n  registerLink: \"注册\",\n\n  smsTab: \"短信验证码登录\",\n  passwordTab: \"密码登录\",\n\n  title: \"修改密码\",\n  weakPasswordWarning: \"为了您的账户安全，请立即修改密码\",\n  changeNow: \"立即修改\",\n  successMessage: \"修改成功\",\n  oldPassword: \"旧密码\",\n  oldPasswordRequired: \"请输入旧密码\",\n  newPassword: \"新密码\",\n  newPasswordRequired: \"请输入新密码\",\n  confirmNewPassword: \"确认新密码\",\n  confirmNewPasswordRequired: \"请输入确认密码\",\n  changePasswordButton: \"修改密码\",\n  enterPassword: \"请输入密码\",\n  newPasswordNotSameOld: \"新密码不能和旧密码相同\",\n  enterPasswordAgain: \"请再次输入密码\",\n  passwordsNotMatch: \"两次输入密码不一致!\",\n  avatar: \"头像\",\n  nickName: \"昵称\",\n  phoneNumber: \"手机号\",\n  changePassword: \"修改密码\",\n  updateProfile: \"修改个人信息\",\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/zh-CN/certd.ts",
    "content": "export default {\n  app: {\n    crud: {\n      i18n: {\n        name: \"姓名\",\n        city: \"城市\",\n        status: \"状态\",\n      },\n    },\n    login: {\n      logoutTip: \"确认\",\n      logoutMessage: \"确定要注销登录吗？\",\n    },\n  },\n  fs: {\n    rowHandle: {\n      title: \"操作列\",\n    },\n  },\n  order: {\n    confirmTitle: \"订单确认\",\n    package: \"套餐\",\n    description: \"说明\",\n    specifications: \"规格\",\n    pipeline: \"流水线\",\n    domain: \"域名\",\n    deployTimes: \"部署次数\",\n    duration: \"时长\",\n    price: \"价格\",\n    paymentMethod: \"支付方式\",\n    free: \"免费\",\n    unit: {\n      pieces: \"条\",\n      count: \"个\",\n      times: \"次\",\n    },\n  },\n  framework: {\n    title: \"框架\",\n    home: \"首页\",\n  },\n\n  title: \"证书自动化\",\n  pipeline: \"证书自动化流水线\",\n  pipelineEdit: \"编辑流水线\",\n  history: \"执行历史记录\",\n  certStore: \"证书仓库\",\n  siteMonitor: \"站点证书监控\",\n  settings: \"设置\",\n  accessManager: \"授权管理\",\n  cnameRecord: \"CNAME记录管理\",\n  subDomain: \"子域名托管设置\",\n  pipelineGroup: \"流水线分组管理\",\n  openKey: \"开放接口密钥\",\n  notification: \"通知设置\",\n  siteMonitorSetting: \"站点监控设置\",\n  userSecurity: \"认证安全设置\",\n  userProfile: \"账号信息\",\n  suite: \"套餐\",\n  mySuite: \"我的套餐\",\n  suiteBuy: \"套餐购买\",\n  myTrade: \"我的订单\",\n  paymentReturn: \"支付返回\",\n\n  user: {\n    greeting: \"您好\",\n    profile: \"账号信息\",\n    logout: \"注销登录\",\n  },\n  dashboard: {\n    greeting: \"您好，{name}，欢迎使用 【{site}】\",\n    latestVersion: \"最新版本: {version}\",\n    validUntil: \"账户有效期：\",\n    tutorialTooltip: \"点击查看详细教程\",\n    tutorialText: \"仅需3步，全自动申请部署证书\",\n    alertMessage: \"证书和授权为敏感信息，不要使用来历不明的在线Certd服务和镜像，以免泄露；请务必私有化部署使用，认准官方版本发布渠道：\",\n    helpDoc: \"帮助文档\",\n    pipelineCount: \"证书流水线数量\",\n    noPipeline: \"您还没有证书流水线\",\n    createNow: \"立即创建\",\n    managePipeline: \"管理流水线\",\n    pipelineStatus: \"流水线状态\",\n    recentRun: \"最近运行统计\",\n    runCount: \"运行次数\",\n    expiringCerts: \"最快到期证书\",\n    supportedTasks: \"已支持的部署任务总览\",\n  },\n  steps: {\n    createPipeline: \"创建证书流水线\",\n    addTask: \"添加部署任务\",\n    scheduledRun: \"定时运行\",\n  },\n  customPipeline: \"自定义流水线\",\n  createCertdPipeline: \"创建证书流水线\",\n  commercialCertHosting: \"商用证书托管\",\n  tooltip: {\n    manualUploadOwnCert: \"手动上传自有证书，执行自动部署\",\n    noAutoApplyCommercialCert: \"并不能自动申请商业证书\",\n    manualUploadOnUpdate: \"证书有更新时，都需要手动上传一次\",\n  },\n  table: {\n    confirmDeleteTitle: \"确定要删除吗？\",\n    confirmDeleteMessage: \"将删除该流水线相关的所有数据，包括执行历史、证书文件、证书仓库记录等\",\n  },\n  play: {\n    runPipeline: \"运行流水线\",\n    confirm: \"确认\",\n    confirmTrigger: \"确定要触发运行吗？\",\n    pipelineStarted: \"管道已经开始运行\",\n  },\n  actions: {\n    editPipeline: \"编辑流水线\",\n    editConfigGroup: \"修改配置/分组\",\n    viewCertificate: \"查看证书\",\n    downloadCertificate: \"下载证书\",\n  },\n  fields: {\n    userId: \"用户Id\",\n    pipelineName: \"流水线名称\",\n    keyword: \"关键字\",\n    required: \"此项必填\",\n    pipelineContent: \"流水线内容\",\n    scheduledTaskCount: \"定时任务数\",\n    deployTaskCount: \"部署任务数\",\n    remainingValidity: \"到期剩余\",\n    expiryTime: \"过期时间\",\n    status: \"状态\",\n    lastRun: \"最后运行\",\n    enabled: \"启用\",\n    enabledLabel: \"启用\",\n    disabledLabel: \"禁用\",\n    group: \"分组\",\n    type: \"类型\",\n    order: \"排序号\",\n    keepHistoryCount: \"历史记录保持数\",\n    keepHistoryHelper: \"历史记录保持条数，多余的会被删除\",\n    createTime: \"创建时间\",\n    updateTime: \"更新时间\",\n    triggerType: \"触发类型\",\n    pipelineId: \"流水线Id\",\n  },\n  types: {\n    certApply: \"证书申请\",\n    certUpload: \"证书上传\",\n    custom: \"自定义\",\n  },\n  myPipelines: \"我的流水线\",\n  selectedCount: \"已选择 {count} 项\",\n  batchDelete: \"批量删除\",\n  batchForceRerun: \"强制重新运行\",\n  applyCertificate: \"申请证书\",\n  pipelineExecutionRecords: \"流水线执行记录\",\n  confirm: \"确认\",\n  confirmBatchDeleteContent: \"确定要批量删除这{count}条记录吗\",\n  deleteSuccess: \"删除成功\",\n  pleaseSelectRecords: \"请先勾选记录\",\n  triggerTypes: {\n    manual: \"手动执行\",\n    timer: \"定时执行\",\n  },\n  sysResources: {\n    sysRoot: \"系统管理\",\n    sysConsole: \"控制台\",\n    sysSettings: \"系统设置\",\n    cnameSetting: \"CNAME服务设置\",\n    emailSetting: \"邮件服务器设置\",\n    siteSetting: \"站点个性化\",\n    headerMenus: \"顶部菜单设置\",\n    sysAccess: \"系统级授权\",\n    sysPlugin: \"插件管理\",\n    sysPluginEdit: \"编辑插件\",\n    sysPluginConfig: \"证书插件配置\",\n    accountBind: \"账号绑定\",\n    permissionManager: \"权限管理\",\n    roleManager: \"角色管理\",\n    userManager: \"用户管理\",\n    suiteManager: \"套餐管理\",\n    suiteSetting: \"套餐设置\",\n    orderManager: \"订单管理\",\n    userSuites: \"用户套餐\",\n  },\n  certificateRepo: {\n    title: \"证书仓库\",\n    sub: \"从流水线生成的证书\",\n  },\n\n  certificateNotGenerated: \"证书还未生成，请先运行流水线\",\n  viewCertificateTitle: \"查看证书\",\n  close: \"关闭\",\n  viewCert: {\n    title: \"查看证书\",\n  },\n  download: {\n    title: \"下载证书\",\n  },\n  source: \"源码\",\n  github: \"github\",\n  gitee: \"gitee\",\n  cron: {\n    clearTip: \"清除选择\",\n    nextTrigger: \"下次触发时间\",\n    tip: \"请先设置正确的cron表达式\",\n  },\n  cronForm: {\n    title: \"定时脚本\",\n    helper: \"点击上面的按钮，选择每天几点定时执行。\\n建议设置为每天触发一次，证书未到期之前任务会跳过，不会重复执行\",\n    required: \"此项必填\",\n  },\n  email: {\n    title: \"收件邮箱\",\n    helper: \"输入你的收件邮箱地址，支持多个邮箱\",\n    required: \"此项必填\",\n  },\n  plugin: {\n    selectTitle: \"证书申请插件\",\n    jsAcme: \"JS-ACME：使用简单方便，功能强大【推荐】\",\n    legoAcme: \"Lego-ACME：基于Lego实现，支持海量DNS提供商，熟悉LEGO的用户可以使用\",\n  },\n  pipelineForm: {\n    createTitle: \"创建证书流水线\",\n    moreParams: \"更多参数\",\n    triggerCronTitle: \"定时触发\",\n    triggerCronHelper: \"点击上面的按钮，选择每天几点定时执行。\\n建议设置为每天触发一次，证书未到期之前任务会跳过，不会重复执行\",\n    notificationTitle: \"失败通知\",\n    notificationHelper: \"任务执行失败实时提醒\",\n    groupIdTitle: \"流水线分组\",\n  },\n  notificationDefault: \"使用默认通知\",\n  monitor: {\n    title: \"站点证书监控\",\n    description: \"每天0点，检查网站证书的过期时间，到期前10天时将发出提醒（使用默认通知渠道）;\",\n    settingLink: \"站点监控设置\",\n    limitInfo: \"基础版限制1条，专业版以上无限制，当前\",\n    checkAll: \"检查全部\",\n    confirmTitle: \"确认\",\n    confirmContent: \"确认触发检查全部站点证书吗?\",\n    checkSubmitted: \"检查任务已提交\",\n    pleaseRefresh: \"请稍后刷新页面查看结果\",\n    siteName: \"站点名称\",\n    enterSiteName: \"请输入站点名称\",\n    domain: \"网站域名\",\n    enterDomain: \"请输入域名\",\n    enterValidDomain: \"请输入正确的域名\",\n    httpsPort: \"HTTPS端口\",\n    enterPort: \"请输入端口\",\n    certInfo: \"证书信息\",\n    issuer: \"证书颁发机构\",\n    certDomains: \"证书域名\",\n    certProvider: \"颁发机构\",\n    certStatus: \"证书状态\",\n    status: {\n      ok: \"正常\",\n      expired: \"过期\",\n    },\n    certExpiresTime: \"证书到期时间\",\n    expired: \"过期\",\n    days: \"天\",\n    lastCheckTime: \"上次检查时间\",\n    disabled: \"禁用启用\",\n    ipCheck: \"开启IP检查\",\n    selectRequired: \"请选择\",\n    ipCheckConfirm: \"确定{status}IP检查？\",\n    ipCount: \"IP数量\",\n    checkStatus: \"检查状态\",\n    pipelineId: \"关联流水线ID\",\n    certInfoId: \"证书ID\",\n    checkSubmittedRefresh: \"检查任务已提交，请稍后刷新查看结果\",\n    ipManagement: \"IP管理\",\n    bulkImport: \"批量导入\",\n    basicLimitError: \"基础版只能添加一个监控站点，请赞助升级专业版\",\n    limitExceeded: \"对不起，您最多只能创建条{max}监控记录，请购买或升级套餐\",\n    setting: {\n      siteMonitorSettings: \"站点监控设置\",\n      notificationChannel: \"通知渠道\",\n      setNotificationChannel: \"设置通知渠道\",\n      retryTimes: \"重试次数\",\n      monitorRetryTimes: \"监控请求重试次数\",\n      monitorCronSetting: \"监控定时设置\",\n      cronTrigger: \"定时触发监控\",\n      dnsServer: \"DNS服务器\",\n      dnsServerHelper: \"使用自定义的域名解析服务器，如：1.1.1.1 , 支持多个\",\n    },\n  },\n  checkStatus: {\n    success: \"成功\",\n    checking: \"检查中\",\n    error: \"异常\",\n  },\n  domainList: {\n    title: \"域名列表\",\n    helper: \"格式【域名:端口:名称】，一行一个，其中端口、名称可以省略\\n比如：\\nwww.baidu.com:443:百度\\nwww.taobao.com::淘宝\\nwww.google.com\",\n    required: \"请输入要导入的域名\",\n    placeholder: \"www.baidu.com:443:百度\\nwww.taobao.com::淘宝\\nwww.google.com\\n\",\n  },\n  accountInfo: \"账号信息\",\n  securitySettings: \"认证安全设置\",\n  confirmDisable2FA: \"确定要关闭多重验证登录吗？\",\n  disabledSuccess: \"关闭成功\",\n  saveSuccess: \"保存成功\",\n  twoFactorAuth: \"2FA多重验证登录\",\n  rebind: \"重新绑定\",\n  twoFactorAuthHelper: \"是否开启多重验证登录\",\n  bindDevice: \"绑定设备\",\n  step1: \"1. 安装任意一款支持Authenticator的验证APP，比如：\",\n  tooltipGoogleServiceError: \"如果报没有找到谷歌服务的错误，您可以安装KK谷歌助手\",\n  step2: \"2. 扫描二维码添加账号\",\n  step3: \"3. 输入验证码\",\n  inputVerifyCode: \"请输入验证码\",\n  cancel: \"取消\",\n  authorizationManagement: \"授权管理\",\n  manageThirdPartyAuth: \"管理第三方系统授权信息\",\n  name: \"名称\",\n  pleaseEnterName: \"请填写名称\",\n  nameHelper: \"随便填，当多个相同类型的授权时，便于区分\",\n  level: \"级别\",\n  system: \"系统\",\n  usera: \"用户\",\n  nickName: \"昵称\",\n  max50Chars: \"最大50个字符\",\n  myInfo: \"我的信息\",\n\n  save: \"保存\",\n  editSchedule: \"修改定时\",\n  timerTrigger: \"定时触发\",\n  schedule: \"定时\",\n  selectCron: \"请选择定时Cron\",\n  batchEditSchedule: \"批量修改定时\",\n  editTrigger: \"编辑触发器\",\n  triggerName: \"触发器名称\",\n  requiredField: \"此项必填\",\n  type: \"类型\",\n  enterName: \"请输入名称\",\n  confirmDeleteTrigger: \"确定要删除此触发器吗？\",\n  notificationType: \"通知类型\",\n  selectNotificationType: \"请选择通知类型\",\n  notificationName: \"通知名称\",\n  helperNotificationName: \"随便填，当多个相同类型的通知时，便于区分\",\n  isDefault: \"是否默认\",\n  yes: \"是\",\n  no: \"否\",\n  selectIsDefault: \"请选择是否默认\",\n  prompt: \"提示\",\n  confirmSetDefaultNotification: \"确定设置为默认通知？\",\n  test: \"测试\",\n  scope: \"权限范围\",\n  scopeOpenApiOnly: \"仅开放接口\",\n  scopeFullAccount: \"账户所有权限\",\n  required: \"此项必填\",\n  scopeHelper: \"仅开放接口只可以访问开放接口，账户所有权限可以访问所有接口\",\n  add: \"生成新的Key\",\n  gen: {\n    text: \"接口测试\",\n    title: \"x-certd-token\",\n    okText: \"确定\",\n    contentPart1: \"测试x-certd-token如下，您可以在3分钟内使用它进行\",\n    openApi: \"开放接口\",\n    contentPart2: \"请求测试\",\n  },\n  pending_cname_setup: \"待设置CNAME\",\n  validating: \"验证中\",\n  validation_successful: \"验证成功\",\n  validation_failed: \"验证失败\",\n  validation_timed_out: \"验证超时\",\n  proxied_domain: \"被代理域名\",\n  host_record: \"主机记录\",\n  please_set_cname: \"请设置CNAME\",\n  cname_service: \"CNAME服务\",\n  default_public_cname: \"默认提供公共CNAME服务，您还可以\",\n  customize_cname: \"自定义CNAME服务\",\n  public_cname: \"公共CNAME\",\n  custom_cname: \"自定义CNAME\",\n  validate: \"验证\",\n  validation_started: \"开始验证，请耐心等待\",\n  click_to_validate: \"点击验证\",\n  all: \"全部\",\n  cname_feature_guide: \"CNAME功能原理及使用说明\",\n  batch_delete: \"批量删除\",\n  confirm_delete_count: \"确定要批量删除这{count}条记录吗\",\n  delete_successful: \"删除成功\",\n  please_select_records: \"请先勾选记录\",\n  edit_notification: \"编辑通知\",\n  other_notification_method: \"其他通知方式\",\n  trigger_time: \"触发时机\",\n  start_time: \"开始时\",\n  success_time: \"成功时\",\n  fail_to_success_time: \"失败转成功时\",\n  fail_time: \"失败时\",\n  helper_suggest_fail_only: \"建议仅选择'失败时'和'失败转成功'两种即可\",\n  notification_config: \"通知配置\",\n  please_select_notification: \"请选择通知方式\",\n  please_select_type: \"请选择类型\",\n  please_select_trigger_time: \"请选择通知时机\",\n  please_select_notification_config: \"请选择通知配置\",\n  confirm_delete_trigger: \"确定要删除此触发器吗？\",\n  gift_package: \"赠送套餐\",\n  package_name: \"套餐名称\",\n  click_to_select: \"点击选择\",\n  please_select_package: \"请选择套餐\",\n  package: \"套餐\",\n  addon_package: \"加量包\",\n  domain_count: \"域名数量\",\n  unit_count: \"个\",\n  field_required: \"此项必填\",\n  pipeline_count: \"流水线数量\",\n  unit_item: \"条\",\n  deploy_count: \"部署次数\",\n  unit_times: \"次\",\n  monitor_count: \"证书监控数量\",\n  duration: \"时长\",\n  status: \"状态\",\n  active_time: \"激活时间\",\n  expires_time: \"过期时间\",\n  is_present: \"是否赠送\",\n  is_present_yes: \"是\",\n  is_present_no: \"否\",\n  basicInfo: \"基础信息\",\n  titlea: \"名称\",\n  disabled: \"禁用\",\n  ordera: \"排序\",\n  supportBuy: \"支持购买\",\n  intro: \"介绍\",\n  packageContent: \"套餐内容\",\n  maxDomainCount: \"最大域名数\",\n  maxPipelineCount: \"最大流水线数\",\n  maxDeployCount: \"最大部署数\",\n  maxMonitorCount: \"最大监控数\",\n  price: \"价格\",\n  durationPrices: \"时长价格\",\n  packageName: \"套餐名称\",\n  addon: \"加量包\",\n  typeHelper: \"套餐：同一时间只有最新购买的一个生效\\n加量包：可购买多个，购买后立即生效，不影响套餐\\n套餐和加量包数量可叠加\",\n  domainCount: \"域名数量\",\n  pipelineCount: \"流水线数量\",\n  unitPipeline: \"条\",\n  deployCount: \"部署次数\",\n  unitDeploy: \"次\",\n  monitorCount: \"证书监控数量\",\n  unitCount: \"个\",\n  durationPriceTitle: \"时长及价格\",\n  selectDuration: \"选择时长\",\n  supportPurchase: \"支持购买\",\n  cannotPurchase: \"不能购买\",\n  shelfStatus: \"上下架\",\n  onShelf: \"上架\",\n  offShelf: \"下架\",\n  orderHelper: \"越小越靠前\",\n  description: \"说明\",\n  createTime: \"创建时间\",\n  updateTime: \"更新时间\",\n  edit: \"编辑\",\n  groupName: \"分组名称\",\n  enterGroupName: \"请输入分组名称\",\n  subdomainHosting: \"子域名托管\",\n  subdomainHostingHint: \"当你的域名设置了子域名托管，需要在此处创建记录，否则申请证书将失败\",\n  batchDeleteConfirm: \"确定要批量删除这{count}条记录吗\",\n  selectRecordFirst: \"请先勾选记录\",\n  subdomainHosted: \"托管的子域名\",\n  subdomainHelpText: \"如果您不理解什么是子域托管，请不要随意设置，可能导致证书无法申请，可以参考文档\",\n  subdomainManagement: \"子域管理\",\n  isDisabled: \"是否禁用\",\n  enabled: \"启用\",\n  uploadCustomCert: \"上传自定义证书\",\n  sourcee: \"来源\",\n  sourcePipeline: \"流水线\",\n  sourceManualUpload: \"手动上传\",\n  domains: \"域名\",\n  enterDomain: \"请输入域名\",\n  validDays: \"有效天数\",\n  expires: \"过期\",\n  days: \"天\",\n  expireTime: \"过期时间\",\n  certIssuer: \"证书颁发机构\",\n  applyTime: \"申请时间\",\n  relatedPipeline: \"关联流水线\",\n  statusSuccess: \"成功\",\n  statusChecking: \"检查中\",\n  statusError: \"异常\",\n  actionImportBatch: \"批量导入\",\n  actionSyncIp: \"同步IP\",\n  modalTitleSyncIp: \"同步IP\",\n  modalContentSyncIp: \"确定要同步IP吗？\",\n  notificationSyncComplete: \"同步完成\",\n  actionCheckAll: \"检查全部\",\n  modalTitleConfirm: \"确认\",\n  modalContentCheckAll: \"确认触发检查全部IP站点的证书吗?\",\n  notificationCheckSubmitted: \"检查任务已提交\",\n  notificationCheckDescription: \"请稍后刷新页面查看结果\",\n  tooltipCheckNow: \"立即检查\",\n  notificationCheckSubmittedPleaseRefresh: \"检查任务已提交，请稍后刷新查看结果\",\n  columnId: \"ID\",\n  columnIp: \"IP\",\n  helperIpCname: \"也支持填写CNAME域名\",\n  ruleIpRequired: \"请输入IP\",\n  columnCertDomains: \"证书域名\",\n  columnCertProvider: \"颁发机构\",\n  columnCertStatus: \"证书状态\",\n  statusNormal: \"正常\",\n  statusExpired: \"过期\",\n  columnCertExpiresTime: \"证书到期时间\",\n  expired: \"过期\",\n  columnCheckStatus: \"检查状态\",\n  columnLastCheckTime: \"上次检查时间\",\n  columnSource: \"来源\",\n  sourceSync: \"同步\",\n  sourceManual: \"手动\",\n  sourceImport: \"导入\",\n  columnDisabled: \"禁用启用\",\n  columnRemark: \"备注\",\n  pluginFile: \"插件文件\",\n  selectPluginFile: \"选择插件文件\",\n  overrideSameName: \"同名覆盖\",\n  override: \"覆盖\",\n  noOverride: \"不覆盖\",\n  overrideHelper: \"如果已有相同名称插件，直接覆盖\",\n  importPlugin: \"导入插件\",\n  operationSuccess: \"操作成功\",\n  customPlugin: \"自定义插件\",\n  import: \"导入\",\n  export: \"导出\",\n  pluginType: \"插件类型\",\n  auth: \"授权\",\n  dns: \"DNS\",\n  deployPlugin: \"部署插件\",\n  icon: \"图标\",\n  pluginName: \"插件名称\",\n  pluginNameHelper: \"必须为英文或数字，驼峰命名，类型作为前缀\\n示例：AliyunDeployToCDN\\n插件使用后，名称不可修改\",\n  pluginNameRuleMsg: \"必须为英文或数字，驼峰命名，类型作为前缀\",\n  author: \"作者\",\n  authorHelper: \"上传插件市场时作为前缀，如 greper/pluginName\",\n  authorRuleMsg: \"必须为英文或数字\",\n  titleHelper: \"插件中文名称\",\n  descriptionHelper: \"插件描述\",\n  builtIn: \"内置\",\n  custom: \"自定义\",\n  store: \"市场\",\n  version: \"版本\",\n  pluginDependencies: \"插件依赖\",\n  pluginDependenciesHelper: \"格式: [作者/]插件名[:版本]，需先安装依赖插件\",\n  editableRunStrategy: \"可编辑运行策略\",\n  editable: \"可编辑\",\n  notEditable: \"不可编辑\",\n  runStrategy: \"运行策略\",\n  normalRun: \"正常运行\",\n  skipOnSuccess: \"成功跳过（部署任务）\",\n  defaultRunStrategyHelper: \"默认运行策略\",\n  enableDisable: \"启用/禁用\",\n  clickToToggle: \"点击切换启用/禁用\",\n  confirmToggle: \"确认要\",\n  disable: \"禁用\",\n  enable: \"启用\",\n  pluginGroup: \"插件分组\",\n  icpRegistrationNumber: \"ICP备案号\",\n  icpPlaceholder: \"粤ICP备xxxxxxx号\",\n  publicSecurityRegistrationNumber: \"网安备案号\",\n  publicSecurityPlaceholder: \"京公网安备xxxxxxx号\",\n  enableAssistant: \"开启小助手\",\n  allowCrawlers: \"允许爬虫\",\n  httpProxy: \"HTTP代理\",\n  httpProxyPlaceholder: \"http://192.168.1.2:18010/\",\n  httpProxyHelper: \"当某些网站被墙时可以配置\",\n  httpsProxy: \"HTTPS代理\",\n  httpsProxyPlaceholder: \"http://192.168.1.2:18010/\",\n  saveThenTestTitle: \"保存后，再点击测试\",\n  testButton: \"测试\",\n  httpsProxyHelper: \"一般这两个代理填一样的，保存后再测试\",\n  dualStackNetwork: \"双栈网络\",\n  default: \"默认\",\n  ipv4Priority: \"IPV4优先\",\n  ipv6Priority: \"IPV6优先\",\n  dualStackNetworkHelper: \"如果选择IPv6优先，需要在docker-compose.yaml中启用ipv6\",\n  enableCommonCnameService: \"启用公共CNAME服务\",\n  commonCnameHelper: \"是否可以使用公共CNAME服务，如果禁用，且没有设置<router-link to='/sys/cname/provider'>自定义CNAME服务</router-link>，则无法使用CNAME代理方式申请证书\",\n  saveButton: \"保存\",\n  stopSuccess: \"停止成功\",\n  google: \"Google\",\n  baidu: \"百度\",\n  success: \"成功\",\n  testFailed: \"测试失败\",\n  testCompleted: \"测试完成\",\n  manageOtherUserPipeline: \"管理其他用户流水线\",\n  limitUserPipelineCount: \"限制用户流水线数量\",\n  limitUserPipelineCountHelper: \"0为不限制\",\n  enableSelfRegistration: \"开启自助注册\",\n  enableUserValidityPeriod: \"开启用户有效期\",\n  userValidityPeriodHelper: \"有效期内用户可正常使用，失效后流水线将被停用\",\n  enableUsernameRegistration: \"开启用户名注册\",\n  enableEmailRegistration: \"开启邮箱注册\",\n  proFeature: \"专业版功能\",\n  emailServerSetup: \"设置邮箱服务器\",\n  enableSmsLoginRegister: \"开启手机号登录、注册\",\n  commFeature: \"商业版功能\",\n  smsProvider: \"短信提供商\",\n  aliyunSms: \"阿里云短信\",\n  yfySms: \"易发云短信\",\n  smsTest: \"短信测试\",\n  testMobilePlaceholder: \"输入测试手机号\",\n  saveThenTest: \"保存后再点击测试\",\n  enterTestMobile: \"请输入测试手机号\",\n  sendSuccess: \"发送成功\",\n  atLeastOneLoginRequired: \"密码登录和手机号登录至少开启一个\",\n  fieldRequired: \"此项必填\",\n  siteHide: \"站点隐藏\",\n  enableSiteHide: \"启用站点隐藏\",\n  siteHideDescription: \"可以在平时关闭站点的可访问性，需要时再打开，增强站点安全性\",\n  helpDoc: \"帮助说明\",\n  randomAddress: \"随机地址\",\n  siteHideUrlHelper: \"站点被隐藏后，需要访问此URL解锁，才能正常访问\",\n  fullUnlockUrl: \"完整解除隐藏地址\",\n  saveThisUrl: \"请保存好此地址\",\n  unlockPassword: \"解除密码\",\n  unlockPasswordHelper: \"解除隐藏时需要输入密码，第一次需要设置密码，填写则重置密码\",\n  autoHideTime: \"自动隐藏时间\",\n  autoHideTimeHelper: \"多少分钟内无请求自动隐藏\",\n  hideOpenApi: \"隐藏开放接口\",\n  hideOpenApiHelper: \"是否隐藏开放接口，是否放开/api/v1开头的接口\",\n  hideSiteImmediately: \"立即隐藏站点\",\n  hideImmediately: \"立即隐藏\",\n  confirmHideSiteTitle: \"确定要立即隐藏站点吗？\",\n  confirmHideSiteContent: \"隐藏后，将无法访问站点，请谨慎操作\",\n  siteHiddenSuccess: \"站点已隐藏\",\n  emailServerSettings: \"邮件服务器设置\",\n  setEmailSendingServer: \"设置邮件发送服务器\",\n  useCustomEmailServer: \"使用自定义邮件服务器\",\n  smtpDomain: \"SMTP域名\",\n  pleaseEnterSmtpDomain: \"请输入smtp域名或ip\",\n  smtpPort: \"SMTP端口\",\n  pleaseEnterSmtpPort: \"请输入smtp端口号\",\n  username: \"用户名\",\n  pleaseEnterUsername: \"请输入用户名\",\n  password: \"密码\",\n  pleaseEnterPassword: \"请输入密码\",\n  qqEmailAuthCodeHelper: \"如果是qq邮箱，需要到qq邮箱的设置里面申请授权码作为密码\",\n  senderEmail: \"发件邮箱\",\n  pleaseEnterSenderEmail: \"请输入发件邮箱\",\n  useSsl: \"是否ssl\",\n  sslPortNote: \"ssl和非ssl的smtp端口是不一样的，注意修改端口\",\n  ignoreCertValidation: \"忽略证书校验\",\n  useOfficialEmailServer: \"使用官方邮件服务器\",\n  useOfficialEmailServerHelper: \"使用官方邮箱服务器直接发邮件，免除繁琐的配置\",\n  testReceiverEmail: \"测试收件邮箱\",\n  pleaseEnterTestReceiverEmail: \"请输入测试收件邮箱\",\n  saveBeforeTest: \"保存后再点击测试\",\n  sendFailHelpDoc: \"发送失败？？？\",\n  emailConfigHelpDoc: \"邮件配置帮助文档\",\n  tryOfficialEmailServer: \"您还可以试试使用官方邮件服务器↗↗↗↗↗↗↗↗\",\n  pluginManagement: \"插件管理\",\n  pluginBetaWarning: \"自定义插件处于BETA测试版，后续可能会有破坏性变更\",\n  pleaseSelectRecord: \"请先勾选记录\",\n  permissionManagement: \"权限管理\",\n  adda: \"添加\",\n  rootNode: \"根节点\",\n  permissionName: \"权限名称\",\n  enterPermissionName: \"请输入权限名称\",\n  permissionCode: \"权限代码\",\n  enterPermissionCode: \"请输入权限代码\",\n  max100Chars: \"最大100个字符\",\n  examplePermissionCode: \"例如:sys:user:view\",\n  sortOrder: \"排序\",\n  sortRequired: \"排序号必填\",\n  parentNode: \"父节点\",\n  roleManagement: \"角色管理\",\n  assignPermissions: \"分配权限\",\n  roleName: \"角色名称\",\n  enterRoleName: \"请输入角色名称\",\n  unlockLogin: \"解除登录锁定\",\n  notice: \"提示\",\n  confirmUnlock: \"确定要解除该用户的登录锁定吗？\",\n  unlockSuccess: \"解除成功\",\n  enterUsername: \"请输入用户名\",\n  modifyPasswordIfFilled: \"填写则修改密码\",\n  emaila: \"邮箱\",\n  mobile: \"手机号\",\n  avatar: \"头像\",\n  validTime: \"有效期\",\n  remark: \"备注\",\n  roles: \"角色\",\n  cnameTitle: \"CNAME服务配置\",\n  cnameDescription: \"此处配置的域名作为其他域名校验的代理，当别的域名需要申请证书时，通过CNAME映射到此域名上来验证所有权。好处是任何域名都可以通过此方式申请证书，也无需填写AccessSecret。\",\n  cnameLinkText: \"CNAME功能原理及使用说明\",\n  confirmTitle: \"确认\",\n  confirmDeleteBatch: \"确定要批量删除这{count}条记录吗\",\n  selectRecordsFirst: \"请先勾选记录\",\n  cnameDomain: \"CNAME域名\",\n  cnameDomainPlaceholder: \"cname.handsfree.work\",\n  cnameDomainHelper: \"需要一个右边DNS提供商注册的域名（也可以将其他域名的dns服务器转移到这几家来）。\\nCNAME域名一旦确定不可修改，建议使用一级子域名\",\n  dnsProvider: \"DNS提供商\",\n  dnsProviderAuthorization: \"DNS提供商授权\",\n  setDefault: \"设置默认\",\n  confirmSetDefault: \"确定要设置为默认吗？\",\n  setAsDefault: \"设为默认\",\n  disabledLabel: \"禁用\",\n  confirmToggleStatus: \"确定要{action}吗？\",\n\n  template: {\n    title: \"流水线模版\",\n    edit: \"流水线模版编辑\",\n    importCreate: \"流水线模版批量创建\",\n    intro: \"可根据模版批量创建流水线\",\n    createTemplate: \"创建模版\",\n    useTemplate: \"使用此模板\",\n    batchCreate: \"批量创建流水线\",\n    singleCreate: \"创建单个流水线\",\n    templateName: \"模板名称\",\n    enterTemplateName: \"请输入模板名称\",\n    copyPipelineConfig: \"复制该流水线配置作为模板来源\",\n    pipeline: \"流水线\",\n  },\n  sys: {\n    setting: {\n      showRunStrategy: \"显示运行策略选择\",\n      showRunStrategyHelper: \"任务设置中是否允许选择运行策略\",\n    },\n  },\n  modal: {\n    close: \"关闭\",\n    viewCertificateTitle: \"查看证书\",\n  },\n  domain: {\n    domainManager: \"域名管理\",\n    domainDescription: \"管理域名的校验方式，用于申请证书时自动选择验证方式\",\n    domain: \"域名\",\n    challengeType: \"校验类型\",\n    dnsProviderType: \"DNS提供商类型\",\n    dnsProviderAccess: \"DNS提供商授权\",\n    httpUploaderType: \"上传方式\",\n    httpUploaderAccess: \"上传授权信息\",\n    httpUploadRootDir: \"网站根路径\",\n    disabled: \"禁用/启用\",\n    challengeSetting: \"校验配置\",\n    gotoCnameTip: \"CNAME域名配置请前往CNAME记录页面添加\",\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/zh-CN/common.ts",
    "content": "export default {\n  back: \"返回\",\n  backToHome: \"返回首页\",\n  login: \"登录\",\n  logout: \"退出登录\",\n  prompt: \"提示\",\n  cancel: \"取消\",\n  confirm: \"确认\",\n  reset: \"重置\",\n  noData: \"暂无数据\",\n  refresh: \"刷新\",\n  loadingMenu: \"加载菜单中\",\n  query: \"查询\",\n  search: \"搜索\",\n  enabled: \"已启用\",\n  disabled: \"已禁用\",\n  enable: \"启用\",\n  disable: \"禁用\",\n  edit: \"修改\",\n  delete: \"删除\",\n  create: \"新增\",\n  yes: \"是\",\n  no: \"否\",\n  handle: \"操作\",\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/zh-CN/guide.ts",
    "content": "export default {\n  createCertPipeline: {\n    title: \"创建证书申请流水线\",\n    description: \"演示证书申请任务如何配置\",\n    items: {\n      tutorialTitle: \"教程演示内容\",\n      tutorialDesc1: \"本教程演示如何自动申请证书并部署到Nginx上\",\n      tutorialDesc2: \"仅需3步，全自动申请部署证书\",\n      createTitle: \"创建证书流水线\",\n      createDesc: \"点击添加证书流水线，填写证书申请信息\",\n      successTitle: \"流水线创建成功\",\n      successDesc: \"点击手动触发即可申请证书\",\n      nextTitle: \"接下来演示如何自动部署证书\",\n      nextDesc: \"如果您只需要申请证书，那么到这一步就可以了\",\n    },\n  },\n  buttons: {\n    prev: \"上一步\",\n    next: \"下一步\",\n  },\n  addDeployTask: {\n    title: \"添加部署证书任务\",\n    description: \"这里演示部署证书到Nginx\",\n    items: {\n      addTaskTitle: \"添加证书部署任务\",\n      addTaskDesc1: \"这里演示自动部署证书到nginx\",\n      addTaskDesc2: \"本系统提供海量部署插件，满足您的各种部署需求\",\n      fillParamsTitle: \"填写任务参数\",\n      fillParamsDesc1: \"填写主机上证书文件的路径\",\n      fillParamsDesc2: \"选择主机ssh登录授权\",\n      activateCertTitle: \"让新证书生效\",\n      activateCertDesc1: \"执行重启脚本\",\n      activateCertDesc2: \"让证书生效\",\n      taskSuccessTitle: \"部署任务添加成功\",\n      taskSuccessDesc: \"现在可以运行\",\n      pluginsTitle: \"本系统提供茫茫多的部署插件\",\n      pluginsDesc: \"您可以根据自身需求将证书部署到各种应用和平台\",\n    },\n  },\n  runAndTestTask: {\n    runAndTestTitle: \"运行与测试\",\n    runAndTestDescription: \"演示流水线运行,查看日志，成功后跳过等\",\n    runTestOnce: \"运行测试一下\",\n    clickManualTriggerToTest: \"点击手动触发按钮，即可测试运行\",\n    viewLogs: \"查看日志\",\n    clickTaskToViewStatusAndLogs: \"点击任务可以查看状态和日志\",\n    howToTroubleshootFailure: \"执行失败如何排查\",\n    viewErrorLogs: \"查看错误日志\",\n    nginxContainerNotExistFix: \"这里报的是nginx容器不存在，修改命令，改成正确的nginx容器名称即可\",\n    executionSuccess: \"执行成功\",\n    retryAfterFix: \"修改正确后，重新点击手动触发，重新运行一次，执行成功\",\n    autoSkipAfterSuccess: \"成功后自动跳过\",\n    successSkipExplanation: \"可以看到成功过的将会自动跳过，不会重复执行，只有当参数变更或者证书更新了，才会重新运行\",\n    viewCertDeploymentSuccess: \"查看证书部署成功\",\n    visitNginxToSeeCert: \"访问nginx上的网站，可以看到证书已经部署成功\",\n    downloadCertManualDeploy: \"还可以下载证书，手动部署\",\n    downloadIfNoAutoDeployPlugin: \"如果还没有好用的部署插件，没办法自动部署，你还可以下载证书，手动部署\",\n  },\n  scheduleAndEmailTask: {\n    title: \"设置定时执行和邮件通知\",\n    description: \"自动运行\",\n    setSchedule: \"设置定时执行\",\n    pipelineSuccessThenSchedule: \"流水线测试成功，接下来配置定时触发，以后每天定时执行就不用管了\",\n    recommendDailyRun: \"推荐配置每天运行一次，在到期前35天才会重新申请新证书并部署，没到期前会自动跳过，不会重复申请。\",\n    setEmailNotification: \"设置邮件通知\",\n    suggestErrorAndRecoveryEmails: \"建议选择监听'错误时'和'错误转成功'两种即可，在意外失败时可以尽快去排查问题，（基础版需要配置邮件服务器）\",\n    basicVersionNeedsMailServer: \"（基础版需要配置邮件服务器）\",\n    tutorialEndTitle: \"教程结束\",\n    thanksForWatching: \"感谢观看，希望对你有所帮助\",\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/zh-CN/index.ts",
    "content": "import certd from \"./certd\";\nimport authentication from \"./authentication\";\nimport vip from \"./vip\";\nimport tutorial from \"./tutorial\";\nimport preferences from \"./preferences\";\nimport ui from \"./ui\";\nimport guide from \"./guide\";\nimport common from \"./common\";\n\nexport default {\n  certd,\n  authentication,\n  vip,\n  ui,\n  tutorial,\n  preferences,\n  guide,\n  common,\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/zh-CN/preferences.ts",
    "content": "export default {\n  title: \"偏好设置\",\n  subtitle: \"自定义偏好设置 & 实时预览\",\n  resetTitle: \"重置偏好设置\",\n  resetTip: \"数据有变化，点击可进行重置\",\n  resetSuccess: \"重置偏好设置成功\",\n  appearance: \"外观\",\n  layout: \"布局\",\n  content: \"内容\",\n  other: \"其它\",\n  wide: \"流式\",\n  compact: \"定宽\",\n  followSystem: \"跟随系统\",\n  vertical: \"垂直\",\n  verticalTip: \"侧边垂直菜单模式\",\n  horizontal: \"水平\",\n  horizontalTip: \"水平菜单模式，菜单全部显示在顶部\",\n  twoColumn: \"双列菜单\",\n  twoColumnTip: \"垂直双列菜单模式\",\n  headerSidebarNav: \"侧边导航\",\n  headerSidebarNavTip: \"顶部通栏，侧边导航模式\",\n  headerTwoColumn: \"混合双列\",\n  headerTwoColumnTip: \"双列、水平菜单共存模式\",\n  mixedMenu: \"混合垂直\",\n  mixedMenuTip: \"垂直水平菜单共存\",\n  fullContent: \"内容全屏\",\n  fullContentTip: \"不显示任何菜单，只显示内容主体\",\n  normal: \"常规\",\n  plain: \"朴素\",\n  rounded: \"圆润\",\n  copyPreferences: \"复制偏好设置\",\n  copyPreferencesSuccessTitle: \"复制成功\",\n  copyPreferencesSuccess: \"复制成功，请在 app 下的 `src/preferences.ts`内进行覆盖\",\n  clearAndLogout: \"清空缓存 & 退出登录\",\n  mode: \"模式\",\n  general: \"通用\",\n  language: \"语言\",\n  dynamicTitle: \"动态标题\",\n  watermark: \"水印\",\n  checkUpdates: \"定时检查更新\",\n  position: {\n    title: \"偏好设置位置\",\n    header: \"顶栏\",\n    auto: \"自动\",\n    fixed: \"固定\",\n  },\n  sidebar: {\n    title: \"侧边栏\",\n    width: \"宽度\",\n    visible: \"显示侧边栏\",\n    collapsed: \"折叠菜单\",\n    collapsedShowTitle: \"折叠显示菜单名\",\n    autoActivateChild: \"自动激活子菜单\",\n    autoActivateChildTip: \"点击顶层菜单时,自动激活第一个子菜单或者上一次激活的子菜单\",\n    expandOnHover: \"鼠标悬停展开\",\n    expandOnHoverTip: \"鼠标在折叠区域悬浮时，`启用`则展开当前子菜单，`禁用`则展开整个侧边栏\",\n  },\n  tabbar: {\n    title: \"标签栏\",\n    enable: \"启用标签栏\",\n    icon: \"显示标签栏图标\",\n    showMore: \"显示更多按钮\",\n    showMaximize: \"显示最大化按钮\",\n    persist: \"持久化标签页\",\n    maxCount: \"最大标签数\",\n    maxCountTip: \"每次打开新的标签时如果超过最大标签数，\\n会自动关闭一个最先打开的标签\\n设置为 0 则不限制\",\n    draggable: \"启动拖拽排序\",\n    wheelable: \"启用纵向滚轮响应\",\n    middleClickClose: \"点击鼠标中键关闭标签页\",\n    wheelableTip: \"开启后，标签栏区域可以响应滚轮的纵向滚动事件。\\n关闭时，只能响应系统的横向滚动事件（需要按下Shift再滚动滚轮）\",\n    styleType: {\n      title: \"标签页风格\",\n      chrome: \"谷歌\",\n      card: \"卡片\",\n      plain: \"朴素\",\n      brisk: \"轻快\",\n    },\n    contextMenu: {\n      reload: \"重新加载\",\n      close: \"关闭\",\n      pin: \"固定\",\n      unpin: \"取消固定\",\n      closeLeft: \"关闭左侧标签页\",\n      closeRight: \"关闭右侧标签页\",\n      closeOther: \"关闭其它标签页\",\n      closeAll: \"关闭全部标签页\",\n      openInNewWindow: \"在新窗口打开\",\n      maximize: \"最大化\",\n      restoreMaximize: \"还原\",\n    },\n  },\n  navigationMenu: {\n    title: \"导航菜单\",\n    style: \"导航菜单风格\",\n    accordion: \"侧边导航菜单手风琴模式\",\n    split: \"导航菜单分离\",\n    splitTip: \"开启时，侧边栏显示顶栏对应菜单的子菜单\",\n  },\n  breadcrumb: {\n    title: \"面包屑导航\",\n    enable: \"开启面包屑导航\",\n    icon: \"显示面包屑图标\",\n    home: \"显示首页按钮\",\n    style: \"面包屑风格\",\n    hideOnlyOne: \"仅有一个时隐藏\",\n    background: \"背景\",\n  },\n  animation: {\n    title: \"动画\",\n    loading: \"页面切换 Loading\",\n    transition: \"页面切换动画\",\n    progress: \"页面切换进度条\",\n  },\n  theme: {\n    title: \"主题\",\n    radius: \"圆角\",\n    light: \"浅色\",\n    dark: \"深色\",\n    darkSidebar: \"深色侧边栏\",\n    darkHeader: \"深色顶栏\",\n    weakMode: \"色弱模式\",\n    grayMode: \"灰色模式\",\n    builtin: {\n      title: \"内置主题\",\n      default: \"默认\",\n      violet: \"紫罗兰\",\n      pink: \"樱花粉\",\n      rose: \"玫瑰红\",\n      skyBlue: \"天蓝色\",\n      deepBlue: \"深蓝色\",\n      green: \"浅绿色\",\n      deepGreen: \"深绿色\",\n      orange: \"橙黄色\",\n      yellow: \"柠檬黄\",\n      zinc: \"锌色灰\",\n      neutral: \"中性色\",\n      slate: \"石板灰\",\n      gray: \"中灰色\",\n      custom: \"自定义\",\n    },\n  },\n  header: {\n    title: \"顶栏\",\n    modeStatic: \"静止\",\n    modeFixed: \"固定\",\n    modeAuto: \"自动隐藏和显示\",\n    modeAutoScroll: \"滚动隐藏和显示\",\n    visible: \"显示顶栏\",\n    menuAlign: \"菜单位置\",\n    menuAlignStart: \"左侧\",\n    menuAlignEnd: \"右侧\",\n    menuAlignCenter: \"居中\",\n  },\n  footer: {\n    title: \"底栏\",\n    visible: \"显示底栏\",\n    fixed: \"固定在底部\",\n  },\n  copyright: {\n    title: \"版权\",\n    enable: \"启用版权\",\n    companyName: \"公司名\",\n    companySiteLink: \"公司主页\",\n    date: \"日期\",\n    icp: \"ICP 备案号\",\n    icpLink: \"ICP 网站链接\",\n  },\n  shortcutKeys: {\n    title: \"快捷键\",\n    global: \"全局\",\n    search: \"全局搜索\",\n    logout: \"退出登录\",\n    preferences: \"偏好设置\",\n  },\n  widget: {\n    title: \"小部件\",\n    globalSearch: \"启用全局搜索\",\n    fullscreen: \"启用全屏\",\n    themeToggle: \"启用主题切换\",\n    languageToggle: \"启用语言切换\",\n    notification: \"启用通知\",\n    sidebarToggle: \"启用侧边栏切换\",\n    lockScreen: \"启用锁屏\",\n    refresh: \"启用刷新\",\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/zh-CN/tutorial.ts",
    "content": "export default {\n  title: \"使用教程\",\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/zh-CN/ui.ts",
    "content": "export default {\n  formRules: {\n    required: \"请输入{0}\",\n    selectRequired: \"请选择{0}\",\n    minLength: \"{0}至少{1}个字符\",\n    maxLength: \"{0}最多{1}个字符\",\n    length: \"{0}长度必须为{1}个字符\",\n    alreadyExists: \"{0} `{1}` 已存在\",\n    startWith: \"{0}必须以 {1} 开头\",\n    invalidURL: \"请输入有效的链接\",\n  },\n  actionTitle: {\n    edit: \"修改{0}\",\n    create: \"新增{0}\",\n    delete: \"删除{0}\",\n    view: \"查看{0}\",\n  },\n  actionMessage: {\n    deleteConfirm: \"确定删除 {0} 吗？\",\n    deleting: \"正在删除 {0} ...\",\n    deleteSuccess: \"{0} 删除成功\",\n    operationSuccess: \"操作成功\",\n    operationFailed: \"操作失败\",\n  },\n  placeholder: {\n    input: \"请输入\",\n    select: \"请选择\",\n  },\n  captcha: {\n    title: \"请完成安全验证\",\n    sliderSuccessText: \"验证通过\",\n    sliderDefaultText: \"请按住滑块拖动\",\n    sliderRotateDefaultTip: \"点击图片可刷新\",\n    sliderRotateFailTip: \"验证失败\",\n    sliderRotateSuccessTip: \"验证成功，耗时{0}秒\",\n    alt: \"支持img标签src属性值\",\n    refreshAriaLabel: \"刷新验证码\",\n    confirmAriaLabel: \"确认选择\",\n    confirm: \"确认\",\n    pointAriaLabel: \"点击点\",\n    clickInOrder: \"请依次点击\",\n  },\n  iconPicker: {\n    placeholder: \"选择一个图标\",\n    search: \"搜索图标...\",\n  },\n  jsonViewer: {\n    copy: \"复制\",\n    copied: \"已复制\",\n  },\n  fallback: {\n    pageNotFound: \"哎呀！未找到页面\",\n    pageNotFoundDesc: \"抱歉，我们无法找到您要找的页面。\",\n    forbidden: \"哎呀！访问被拒绝\",\n    forbiddenDesc: \"抱歉，您没有权限访问此页面。\",\n    internalError: \"哎呀！出错了\",\n    internalErrorDesc: \"抱歉，服务器遇到错误。\",\n    offline: \"离线页面\",\n    offlineError: \"哎呀！网络错误\",\n    offlineErrorDesc: \"抱歉，无法连接到互联网，请检查您的网络连接并重试。\",\n    comingSoon: \"即将推出\",\n    http: {\n      requestTimeout: \"请求超时，请稍后再试。\",\n      networkError: \"网络异常，请检查您的网络连接后重试。\",\n      badRequest: \"请求错误。请检查您的输入并重试。\",\n      unauthorized: \"登录认证过期，请重新登录后继续。\",\n      forbidden: \"禁止访问, 您没有权限访问此资源。\",\n      notFound: \"未找到, 请求的资源不存在。\",\n      internalServerError: \"内部服务器错误，请稍后再试。\",\n    },\n  },\n  widgets: {\n    document: \"文档\",\n    qa: \"问题 & 帮助\",\n    setting: \"设置\",\n    logoutTip: \"是否退出登录？\",\n    viewAll: \"查看所有消息\",\n    notifications: \"通知\",\n    markAllAsRead: \"全部标记为已读\",\n    clearNotifications: \"清空\",\n    checkUpdatesTitle: \"新版本可用\",\n    checkUpdatesDescription: \"点击刷新以获取最新版本\",\n    search: {\n      title: \"搜索\",\n      searchNavigate: \"搜索导航菜单\",\n      select: \"选择\",\n      navigate: \"导航\",\n      close: \"关闭\",\n      noResults: \"未找到搜索结果\",\n      noRecent: \"没有搜索历史\",\n      recent: \"搜索历史\",\n    },\n    lockScreen: {\n      title: \"锁定屏幕\",\n      screenButton: \"锁定\",\n      password: \"密码\",\n      placeholder: \"请输入锁屏密码\",\n      unlock: \"点击解锁\",\n      errorPasswordTip: \"密码错误，请重新输入\",\n      backToLogin: \"返回登录\",\n      entry: \"进入系统\",\n    },\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/langs/zh-CN/vip.ts",
    "content": "export default {\n  label: {\n    comm: \"商业版\",\n    plus: \"专业版\",\n    free: \"基础版\",\n  },\n  comm: {\n    name: \"{vipLabel}已开通\",\n    title: \"到期时间：{expire}\",\n    nav: \"{vipLabel}\",\n  },\n  plus: {\n    name: \"商业版功能\",\n    title: \"升级商业版，获取商业授权\",\n  },\n  free: {\n    comm: {\n      name: \"商业版功能\",\n      title: \"升级商业版，获取商业授权\",\n    },\n    button: {\n      name: \"专业版功能\",\n      title: \"升级专业版，享受更多VIP特权\",\n    },\n    nav: {\n      name: \"基础版\",\n      title: \"升级专业版，享受更多VIP特权\",\n    },\n  },\n  enterCode: \"请输入激活码\",\n  successTitle: \"激活成功\",\n  successContent: \"您已成功激活{vipLabel},有效期至：{expireDate}\",\n  bindAccountTitle: \"是否绑定袖手账号\",\n  bindAccountContent: \"绑定账号后，可以避免License丢失，强烈建议绑定\",\n  congratulations_vip_trial: \"恭喜，您已获得专业版{duration}天试用\",\n  trial_modal_title: \"7天专业版试用获取\",\n  trial_modal_ok_text: \"立即获取\",\n  trial_modal_thanks: \"感谢您对开源项目的支持\",\n  trial_modal_click_confirm: \"点击确认，即可获取7天专业版试用\",\n  get_7_day_pro_trial: \"7天专业版试用获取\",\n  star_now: \"立即去Star\",\n  please_help_star: \"可以先请您帮忙点个star吗？感谢感谢\",\n  admin_only_operation: \"仅限管理员操作\",\n  enter_activation_code: \"请输入激活码\",\n  activate_pro_business: \"激活专业版/商业版\",\n  renew_business: \"续期商业版\",\n  renew_pro_upgrade_business: \"续期专业版/升级商业版\",\n  basic_edition: \"基础版\",\n  community_free_version: \"社区免费版\",\n  unlimited_certificate_application: \"证书申请无限制\",\n  unlimited_domain_count: \"域名数量无限制\",\n  unlimited_certificate_pipelines: \"证书流水线数量无限制\",\n  common_deployment_plugins: \"常用的主机、云平台、cdn、宝塔、1Panel等部署插件\",\n  email_webhook_notifications: \"邮件、webhook通知方式\",\n\n  professional_edition: \"专业版\",\n  open_source_support: \"开源需要您的赞助支持\",\n  vip_group_priority: \"可加VIP群，您的需求将优先实现\",\n  unlimited_site_certificate_monitoring: \"站点证书监控无限制\",\n  more_notification_methods: \"更多通知方式\",\n  plugins_fully_open: \"插件全开放，群辉等更多插件\",\n  click_to_get_7_day_trial: \"点击获取7天试用\",\n  years: \"年\",\n  afdian_support_vip: \"爱发电赞助“VIP会员”后获取一年期专业版激活码，开源需要您的支持\",\n  get_after_support: \"爱发电赞助后获取\",\n\n  business_edition: \"商业版\",\n  commercial_license: \"商业授权，可对外运营\",\n  all_pro_privileges: \"拥有专业版所有特权\",\n  allow_commercial_use_modify_logo_title: \"允许商用，可修改logo、标题\",\n  data_statistics: \"数据统计\",\n  plugin_management: \"插件管理\",\n  unlimited_multi_users: \"多用户无限制\",\n  support_user_payment: \"支持用户支付\",\n  contact_author_for_trial: \"请联系作者获取试用\",\n  activate: \"激活\",\n  get_pro_code_after_support: \"爱发电赞助“VIP会员”后获取一年期专业版激活码\",\n  business_contact_author: \"商业版请直接联系作者\",\n  year: \"年\",\n  freee: \"免费\",\n  renew: \"续期\",\n  activate_immediately: \"立刻激活\",\n  current: \"当前\",\n  activated_expire_time: \"已激活，到期时间：\",\n  site_id: \"站点ID\",\n  invite_code_optional: \"邀请码【选填】，可额外获得专业版30天/商业版15天时长\",\n  no_activation_code: \"没有激活码？\",\n  activation_code_one_use: \"激活码使用过一次之后，不可再次使用，如果要更换站点，请\",\n  bind_account: \"绑定账号\",\n  transfer_vip: '，然后\"转移VIP\"即可',\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/locales/typing.ts",
    "content": "export type SupportedLanguagesType = \"en-US\" | \"zh-CN\";\n\nexport type ImportLocaleFn = () => Promise<{ default: Record<string, string> }>;\n\nexport type LoadMessageFn = (lang: SupportedLanguagesType) => Promise<Record<string, string> | undefined>;\n\nexport interface LocaleSetupOptions {\n  /**\n   * Default language\n   * @default zh-CN\n   */\n  defaultLocale?: SupportedLanguagesType;\n  /**\n   * Load message function\n   * @param lang\n   * @returns\n   */\n  loadMessages?: LoadMessageFn;\n  /**\n   * Whether to warn when the key is not found\n   */\n  missingWarn?: boolean;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/main.ts",
    "content": "import { createApp } from \"vue\";\nimport App from \"./App.vue\";\n// import Antd from \"ant-design-vue\";\nimport Antd from \"./plugin/antdv-async/index\";\nimport \"./style/common.less\";\nimport { i18n, loadLocaleMessages } from \"/@/locales\";\nimport components from \"./components\";\nimport router from \"./router\";\nimport plugin from \"./plugin/\";\n// 正式项目请删除mock，避免影响性能\n//import \"./mock\";\nimport { setupVben } from \"./vben\";\nimport { util } from \"/@/utils\";\nimport { initPreferences } from \"/@/vben/preferences\";\n// import \"./components/code-editor/import-works\";\n// @ts-ignore\nasync function bootstrap() {\n  const app = createApp(App);\n  // app.use(Antd);\n  app.use(Antd);\n  await setupVben(app, { loadLocaleMessages, router });\n  app.use(router);\n  // app.use(i18n);\n  // app.use(store);\n  app.use(components);\n  app.use(plugin, { i18n });\n\n  const envMode = util.env.MODE;\n  const namespace = `${import.meta.env.VITE_APP_NAMESPACE}-${envMode}`;\n\n  // app偏好设置初始化\n  await initPreferences({\n    namespace,\n    overrides: {\n      app: {\n        name: import.meta.env.VITE_APP_TITLE,\n      },\n    },\n  });\n\n  app.mount(\"#app\");\n}\n\nbootstrap();\n"
  },
  {
    "path": "packages/ui/certd-client/src/mock/base.ts",
    "content": "import { cloneDeep, mergeWith, isArray } from \"lodash-es\";\nfunction copyList(originList: any, newList: any, options: any, parentId?: any) {\n  for (const item of originList) {\n    const newItem: any = cloneDeep(item);\n    if (parentId != null && newItem.parentId == null) {\n      newItem.parentId = parentId;\n    }\n\n    newItem.id = ++options.idGenerator;\n    newList.push(newItem);\n    if (item.children != null) {\n      newItem.children = [];\n      copyList(item.children, newItem.children, options, newItem.id);\n    }\n  }\n}\n\nfunction delById(req: any, list: any) {\n  for (let i = 0; i < list.length; i++) {\n    const item = list[i];\n    console.log(\"remove i\", i, req, req.params.id, item.id);\n    if (item.id === parseInt(req.params.id)) {\n      console.log(\"remove i\", i);\n      list.splice(i, 1);\n      break;\n    }\n    if (item.children != null && item.children.length > 0) {\n      delById(req, item.children);\n    }\n  }\n}\n\nfunction findById(id: any, list: any) {\n  for (const item of list) {\n    if (item.id === id) {\n      return item;\n    }\n    if (item.children != null && item.children.length > 0) {\n      const sub: any = findById(id, item.children);\n      if (sub != null) {\n        return sub;\n      }\n    }\n  }\n}\nfunction findByIds(ids: any[], list: any) {\n  const res = [];\n  for (const id of ids) {\n    const item = findById(id, list);\n    if (item != null) {\n      res.push(item);\n    }\n  }\n  console.log(\"findbyids\", res, ids);\n  return res;\n}\nconst mockUtil: any = {\n  findById,\n  buildMock(options: any) {\n    const name = options.name;\n    if (options.copyTimes == null) {\n      options.copyTimes = 29;\n    }\n    const list: any = [];\n    for (let i = 0; i < options.copyTimes; i++) {\n      copyList(options.list, list, options);\n    }\n    options.list = list;\n    return [\n      {\n        path: \"/mock/\" + name + \"/page\",\n        method: \"get\",\n        handle(req: any) {\n          let data = [...list];\n          let limit = 20;\n          let offset = 0;\n          for (const item of list) {\n            if (item.children != null && item.children.length === 0) {\n              item.hasChildren = false;\n              item.lazy = false;\n            }\n          }\n          let orderProp: any, orderAsc: any;\n          if (req && req.body) {\n            const { page, sort } = req.body;\n            let query = req.body.query;\n            if (page.limit != null) {\n              limit = parseInt(page.limit);\n            }\n            if (page.offset != null) {\n              offset = parseInt(page.offset);\n            }\n            orderProp = sort.prop;\n            orderAsc = sort.asc;\n            query = query || {};\n            if (Object.keys(query).length > 0) {\n              data = list.filter((item: any) => {\n                let allFound = true; // 是否所有条件都符合\n                for (const key in query) {\n                  // 判定某一个条件\n                  const value = query[key];\n                  if (value == null || value === \"\") {\n                    continue;\n                  }\n                  if (value instanceof Array) {\n                    // 如果条件中的value是数组的话，只要查到一个就行\n                    if (value.length === 0) {\n                      continue;\n                    }\n                    let found = false;\n                    for (const i of value) {\n                      if (item[key] instanceof Array) {\n                        for (const j of item[key]) {\n                          if (i === j) {\n                            found = true;\n                            break;\n                          }\n                        }\n                        if (found) {\n                          break;\n                        }\n                      } else if (item[key] === i || (typeof item[key] === \"string\" && item[key].indexOf(i + \"\") >= 0)) {\n                        found = true;\n                        break;\n                      }\n                      if (found) {\n                        break;\n                      }\n                    }\n                    if (!found) {\n                      allFound = false;\n                    }\n                  } else if (value instanceof Object) {\n                    for (const key2 in value) {\n                      const v = value[key2];\n                      if (v && item[key] && v !== item[key][key2]) {\n                        return false;\n                      }\n                    }\n                  } else if (item[key] !== value) {\n                    allFound = false;\n                  }\n                }\n                return allFound;\n              });\n            }\n          }\n\n          const start = offset;\n          let end = offset + limit;\n          if (data.length < end) {\n            end = data.length;\n          }\n\n          if (orderProp) {\n            // 排序\n            data.sort((a, b) => {\n              let ret = 0;\n              if (a[orderProp] > b[orderProp]) {\n                ret = 1;\n              } else {\n                ret = -1;\n              }\n              return orderAsc ? ret : -ret;\n            });\n          }\n\n          const records = data.slice(start, end);\n          const lastOffset = data.length - (data.length % limit);\n          if (offset > lastOffset) {\n            offset = lastOffset;\n          }\n          return {\n            code: 0,\n            msg: \"success\",\n            data: {\n              records: records,\n              total: data.length,\n              limit,\n              offset,\n            },\n          };\n        },\n      },\n      {\n        path: \"/mock/\" + name + \"/get\",\n        method: \"get\",\n        handle(req: any) {\n          let id = req.params.id;\n          id = parseInt(id);\n          const current = findById(req.body.id, list);\n          return {\n            code: 0,\n            msg: \"success\",\n            data: current,\n          };\n        },\n      },\n      {\n        path: \"/mock/\" + name + \"/byIds\",\n        method: \"post\",\n        handle(req: any) {\n          const ids = req.body.ids;\n          const res = findByIds(ids, list);\n          return {\n            code: 0,\n            msg: \"success\",\n            data: res,\n          };\n        },\n      },\n      {\n        path: \"/mock/\" + name + \"/add\",\n        method: \"post\",\n        handle(req: any) {\n          req.body.id = ++options.idGenerator;\n          list.unshift(req.body);\n          return {\n            code: 0,\n            msg: \"success\",\n            data: cloneDeep(req.body),\n          };\n        },\n      },\n      {\n        path: \"/mock/\" + name + \"/update\",\n        method: \"post\",\n        handle(req: any): any {\n          const item = findById(req.body.id, list);\n          if (item) {\n            mergeWith(item, req.body, (objValue: any, srcValue: any) => {\n              if (srcValue == null) {\n                return;\n              }\n              // 如果被合并对象为数组，则直接被覆盖对象覆盖，只要覆盖对象不为空\n              if (isArray(objValue)) {\n                return srcValue;\n              }\n            });\n          }\n          return {\n            code: 0,\n            msg: \"success\",\n            data: null,\n          };\n        },\n      },\n      {\n        path: \"/mock/\" + name + \"/delete\",\n        method: \"post\",\n        handle(req: any): any {\n          delById(req, list);\n          return {\n            code: 0,\n            msg: \"success\",\n            data: null,\n          };\n        },\n      },\n      {\n        path: \"/mock/\" + name + \"/batchDelete\",\n        method: \"post\",\n        handle(req: any): any {\n          const ids = req.body.ids;\n          for (let i = list.length - 1; i >= 0; i--) {\n            const item = list[i];\n            if (ids.indexOf(item.id) >= 0) {\n              list.splice(i, 1);\n            }\n          }\n          return {\n            code: 0,\n            msg: \"success\",\n            data: null,\n          };\n        },\n      },\n      {\n        path: \"/mock/\" + name + \"/delete\",\n        method: \"post\",\n        handle(req: any): any {\n          delById(req, list);\n          return {\n            code: 0,\n            msg: \"success\",\n            data: null,\n          };\n        },\n      },\n      {\n        path: \"/mock/\" + name + \"/all\",\n        method: \"post\",\n        handle(req: any): any {\n          return {\n            code: 0,\n            msg: \"success\",\n            data: list,\n          };\n        },\n      },\n      {\n        path: \"/mock/\" + name + \"/cellUpdate\",\n        method: \"post\",\n        handle(req: any): any {\n          console.log(\"req\", req);\n          let item = findById(req.body.id, list);\n          if (item) {\n            mergeWith(item, { [req.body.key]: req.body.value }, (objValue: any, srcValue: any) => {\n              if (srcValue == null) {\n                return;\n              }\n              // 如果被合并对象为数组，则直接被覆盖对象覆盖，只要覆盖对象不为空\n              if (isArray(objValue)) {\n                return srcValue;\n              }\n            });\n          } else {\n            item = {\n              id: ++options.idGenerator,\n              [req.body.key]: req.body.value,\n            };\n            list.unshift(item);\n          }\n\n          return {\n            code: 0,\n            msg: \"success\",\n            data: item,\n          };\n        },\n      },\n      {\n        path: \"/mock/\" + name + \"/columnUpdate\",\n        method: \"post\",\n        handle(req: any): any {\n          for (const item of req.body) {\n            const item2 = findById(item.id, list);\n            if (item2) {\n              mergeWith(item2, item, (objValue: any, srcValue: any) => {\n                if (srcValue == null) {\n                  return;\n                }\n                // 如果被合并对象为数组，则直接被覆盖对象覆盖，只要覆盖对象不为空\n                if (isArray(objValue)) {\n                  return srcValue;\n                }\n              });\n            }\n          }\n          return {\n            code: 0,\n            msg: \"success\",\n            data: null,\n          };\n        },\n      },\n    ];\n  },\n};\n\nexport default mockUtil;\n"
  },
  {
    "path": "packages/ui/certd-client/src/mock/common/cascader-data.ts",
    "content": "export default [\n  {\n    value: \"zhinan\",\n    label: \"指南\",\n    children: [\n      {\n        value: \"shejiyuanze\",\n        label: \"设计原则\",\n        children: [\n          {\n            value: \"yizhi\",\n            label: \"一致\",\n          },\n          {\n            value: \"fankui\",\n            label: \"反馈\",\n          },\n          {\n            value: \"xiaolv\",\n            label: \"效率\",\n          },\n          {\n            value: \"kekong\",\n            label: \"可控\",\n          },\n        ],\n      },\n      {\n        value: \"daohang\",\n        label: \"导航\",\n        children: [\n          {\n            value: \"cexiangdaohang\",\n            label: \"侧向导航\",\n          },\n          {\n            value: \"dingbudaohang\",\n            label: \"顶部导航\",\n          },\n        ],\n      },\n    ],\n  },\n  {\n    value: \"zujian\",\n    label: \"组件\",\n    children: [\n      {\n        value: \"basic\",\n        label: \"Basic\",\n        children: [\n          {\n            value: \"layout\",\n            label: \"Layout 布局\",\n          },\n          {\n            value: \"color\",\n            label: \"Color 色彩\",\n          },\n          {\n            value: \"typography\",\n            label: \"Typography 字体\",\n          },\n          {\n            value: \"icon\",\n            label: \"Icon 图标\",\n          },\n          {\n            value: \"button\",\n            label: \"Button 按钮\",\n          },\n        ],\n      },\n      {\n        value: \"form\",\n        label: \"Form\",\n        children: [\n          {\n            value: \"radio\",\n            label: \"Radio 单选框\",\n          },\n          {\n            value: \"checkbox\",\n            label: \"Checkbox 多选框\",\n          },\n          {\n            value: \"input\",\n            label: \"Input 输入框\",\n          },\n          {\n            value: \"input-number\",\n            label: \"InputNumber 计数器\",\n          },\n          {\n            value: \"select\",\n            label: \"Select 选择器\",\n          },\n          {\n            value: \"cascader\",\n            label: \"Cascader 级联选择器\",\n          },\n          {\n            value: \"switch\",\n            label: \"Switch 开关\",\n          },\n          {\n            value: \"slider\",\n            label: \"Slider 滑块\",\n          },\n          {\n            value: \"time-picker\",\n            label: \"TimePicker 时间选择器\",\n          },\n          {\n            value: \"date-picker\",\n            label: \"DatePicker 日期选择器\",\n          },\n          {\n            value: \"datetime-picker\",\n            label: \"DateTimePicker 日期时间选择器\",\n          },\n          {\n            value: \"upload\",\n            label: \"Upload 上传\",\n          },\n          {\n            value: \"rate\",\n            label: \"Rate 评分\",\n          },\n          {\n            value: \"form1\",\n            label: \"Form 表单\",\n          },\n        ],\n      },\n      {\n        value: \"data\",\n        label: \"Data\",\n        children: [\n          {\n            value: \"table\",\n            label: \"Table 表格\",\n          },\n          {\n            value: \"tag\",\n            label: \"Tag 标签\",\n          },\n          {\n            value: \"progress\",\n            label: \"Progress 进度条\",\n          },\n          {\n            value: \"tree\",\n            label: \"Tree 树形控件\",\n          },\n          {\n            value: \"pagination\",\n            label: \"Pagination 分页\",\n          },\n          {\n            value: \"badge\",\n            label: \"Badge 标记\",\n          },\n        ],\n      },\n      {\n        value: \"notice\",\n        label: \"Notice\",\n        children: [\n          {\n            value: \"alert\",\n            label: \"Alert 警告\",\n          },\n          {\n            value: \"loading\",\n            label: \"Loading 加载\",\n          },\n          {\n            value: \"message\",\n            label: \"Message 消息提示\",\n          },\n          {\n            value: \"message-box\",\n            label: \"MessageBox 弹框\",\n          },\n          {\n            value: \"notification\",\n            label: \"Notification 通知\",\n          },\n        ],\n      },\n      {\n        value: \"navigation\",\n        label: \"Navigation\",\n        children: [\n          {\n            value: \"menu\",\n            label: \"NavMenu 导航菜单\",\n          },\n          {\n            value: \"tabs\",\n            label: \"Tabs 标签页\",\n          },\n          {\n            value: \"breadcrumb\",\n            label: \"Breadcrumb 面包屑\",\n          },\n          {\n            value: \"dropdown\",\n            label: \"Dropdown 下拉菜单\",\n          },\n          {\n            value: \"steps\",\n            label: \"Steps 步骤条\",\n          },\n        ],\n      },\n      {\n        value: \"others\",\n        label: \"Others\",\n        children: [\n          {\n            value: \"dialog\",\n            label: \"Dialog 对话框\",\n          },\n          {\n            value: \"tooltip\",\n            label: \"Tooltip 文字提示\",\n          },\n          {\n            value: \"popover\",\n            label: \"Popover 弹出框\",\n          },\n          {\n            value: \"card\",\n            label: \"Card 卡片\",\n          },\n          {\n            value: \"carousel\",\n            label: \"Carousel 走马灯\",\n          },\n          {\n            value: \"collapse\",\n            label: \"Collapse 折叠面板\",\n          },\n        ],\n      },\n    ],\n  },\n  {\n    value: \"ziyuan\",\n    label: \"资源\",\n    children: [\n      {\n        value: \"axure\",\n        label: \"Axure Components\",\n      },\n      {\n        value: \"sketch\",\n        label: \"Sketch Templates\",\n      },\n      {\n        value: \"jiaohu\",\n        label: \"组件交互文档\",\n      },\n    ],\n  },\n];\n"
  },
  {
    "path": "packages/ui/certd-client/src/mock/common/mock.dict.ts",
    "content": "import cascaderData from \"./cascader-data\";\n// @ts-ignore\nimport pcaDataLittle from \"./pca-data-little\";\n// @ts-ignore\nimport { TreeNodesLazyLoader, getPcaData } from \"./pcas-data\";\nimport { cloneDeep } from \"lodash-es\";\nconst openStatus = [\n  { value: \"1\", label: \"打开\", color: \"success\", icon: \"ion:radio-button-on\" },\n  { value: \"2\", label: \"停止\", color: \"cyan\" },\n  { value: \"0\", label: \"关闭\", color: \"red\", icon: \"ion:radio-button-off\" },\n];\n\nconst moreOpenStatus = [\n  { value: \"1\", label: \"打开(open)\", color: \"success\" },\n  { value: \"2\", label: \"停止(stop)\", color: \"cyan\" },\n  { value: \"0\", label: \"关闭(close)\", color: \"red\" },\n];\n\nconst textStatus = [\n  { id: \"1\", text: \"打开\", color: \"success\" },\n  { id: \"2\", text: \"停止\", color: \"cyan\" },\n  { id: \"0\", text: \"关闭\", color: \"red\" },\n];\n\nlet manyStatus = [\n  { value: \"1\", label: \"打开\", color: \"success\", icon: \"ion:radio-button-on\" },\n  { value: \"2\", label: \"停止\", color: \"cyan\" },\n  { value: \"0\", label: \"关闭\", color: \"red\", icon: \"ion:radio-button-off\" },\n];\nlet tempManyStatus: any[] = [];\nfor (let i = 0; i < 100; i++) {\n  tempManyStatus = tempManyStatus.concat(cloneDeep(manyStatus));\n}\nmanyStatus = tempManyStatus;\nlet idIndex = 0;\nfor (const item of manyStatus) {\n  idIndex++;\n  item.value = idIndex + \"\";\n}\n\nexport function GetTreeChildrenByParentId(parentId: any) {\n  return TreeNodesLazyLoader.getChildren(parentId);\n}\n\nexport function GetNodesByValues(values: any) {\n  return TreeNodesLazyLoader.getNodesByValues(values);\n}\n\nexport default [\n  {\n    path: \"/mock/dicts/OpenStatusEnum\",\n    method: \"get\",\n    handle() {\n      return {\n        code: 0,\n        msg: \"success\",\n        data: openStatus,\n      };\n    },\n  },\n  {\n    path: \"/mock/dicts/_OpenStatusEnum2\",\n    method: \"get\",\n    handle() {\n      return {\n        code: 0,\n        msg: \"success\",\n        data: textStatus,\n      };\n    },\n  },\n  {\n    path: \"/mock/dicts/ManyOpenStatusEnum\",\n    method: \"get\",\n    handle() {\n      return {\n        code: 0,\n        msg: \"success\",\n        data: manyStatus,\n      };\n    },\n  },\n  {\n    path: \"/mock/dicts/moreOpenStatusEnum\",\n    method: \"get\",\n    handle() {\n      return {\n        code: 0,\n        msg: \"success\",\n        data: moreOpenStatus,\n      };\n    },\n  },\n  {\n    path: \"/mock/dicts/cascaderData\",\n    method: \"get\",\n    handle() {\n      return {\n        code: 0,\n        msg: \"success\",\n        data: cascaderData,\n      };\n    },\n  },\n  {\n    path: \"/mock/dicts/pca\",\n    method: \"get\",\n    async handle() {\n      const data = await getPcaData();\n      return {\n        code: 0,\n        msg: \"success\",\n        data: data,\n      };\n    },\n  },\n  {\n    path: \"/mock/dicts/littlePca\",\n    method: \"get\",\n    async handle() {\n      return {\n        code: 0,\n        msg: \"success\",\n        data: pcaDataLittle,\n      };\n    },\n  },\n  {\n    path: \"/mock/tree/GetTreeChildrenByParentId\",\n    method: \"get\",\n    async handle({ params }: any) {\n      const list = await GetTreeChildrenByParentId(params.parentId);\n      return {\n        code: 0,\n        msg: \"success\",\n        data: list,\n      };\n    },\n  },\n  {\n    path: \"/mock/tree/GetNodesByValues\",\n    method: \"get\",\n    async handle({ params }: any) {\n      const list = await GetNodesByValues(params.values);\n      return {\n        code: 0,\n        msg: \"success\",\n        data: list,\n      };\n    },\n  },\n];\n"
  },
  {
    "path": "packages/ui/certd-client/src/mock/common/pca-data-little.ts",
    "content": "export default [\n  {\n    code: \"1\",\n    name: \"北京\",\n    children: [\n      {\n        code: \"2\",\n        name: \"北京市区\",\n        children: [\n          {\n            code: \"3\",\n            name: \"海淀\",\n          },\n          {\n            code: \"4\",\n            name: \"朝阳\",\n          },\n        ],\n      },\n      {\n        code: \"5\",\n        name: \"北京郊区\",\n        children: [\n          {\n            code: \"6\",\n            name: \"海淀郊区\",\n          },\n          {\n            code: \"7\",\n            name: \"朝阳郊区\",\n          },\n        ],\n      },\n    ],\n  },\n  {\n    code: \"11\",\n    name: \"深圳\",\n    children: [\n      {\n        code: \"12\",\n        name: \"深圳市区\",\n        children: [\n          {\n            code: \"13\",\n            name: \"南山\",\n          },\n          {\n            code: \"14\",\n            name: \"福田\",\n          },\n        ],\n      },\n      {\n        code: \"15\",\n        name: \"深圳郊区\",\n        children: [\n          {\n            code: \"16\",\n            name: \"南山郊区\",\n          },\n          {\n            code: \"17\",\n            name: \"福田郊区\",\n          },\n        ],\n      },\n    ],\n  },\n];\n"
  },
  {
    "path": "packages/ui/certd-client/src/mock/common/pcas-data.ts",
    "content": "import * as _ from \"lodash-es\";\nexport async function getPcasData() {\n  // @ts-ignore\n  const pcasData = () => import(\"china-division/dist/pcas-code.json\");\n  const ret = await pcasData();\n  return ret.default;\n}\nexport async function getPcaData() {\n  // @ts-ignore\n  const pcaData = () => import(\"china-division/dist/pca-code.json\");\n  const ret = await pcaData();\n  return ret.default;\n}\nexport const TreeNodesLazyLoader = {\n  getNodesByValues(values: any) {\n    console.log(\"getNodesByValues\", values);\n    if (!(values instanceof Array)) {\n      values = [values];\n    }\n    return getPcasData().then(data => {\n      const nodes = [];\n      for (const value of values) {\n        const found = this.getNode(data, value);\n        if (found) {\n          const target = _.cloneDeep(found);\n          delete target.children;\n          nodes.push(target);\n        }\n      }\n      return nodes;\n    });\n  },\n  getNode(list: any, value: any) {\n    for (const item of list) {\n      if (item.code === value) {\n        return item;\n      }\n      if (item.children && item.children.length > 0) {\n        const found: any = this.getNode(item.children, value);\n        if (found) {\n          return found;\n        }\n      }\n    }\n  },\n  getChildren(parent: any) {\n    return getPcasData().then(data => {\n      const list = this.getChildrenByParent(parent, data);\n      if (list == null) {\n        return [];\n      }\n      return this.cloneAndDeleteChildren(list);\n    });\n  },\n  getChildrenByParent(parentId: any, tree: any) {\n    if (!parentId) {\n      // 取第一级\n      return tree;\n    } else {\n      for (const node of tree) {\n        if (node.code === parentId) {\n          return node.children;\n        }\n        if (node.children && node.children.length > 0) {\n          // 递归查找\n          const list: any = this.getChildrenByParent(parentId, node.children);\n          if (list) {\n            return list;\n          }\n        }\n      }\n    }\n  },\n  cloneAndDeleteChildren(list: any) {\n    const newList = [];\n    for (const node of list) {\n      const newNode: any = {};\n      Object.assign(newNode, node);\n      if (newNode.children == null || newNode.children.length === 0) {\n        newNode.isLeaf = true;\n        newNode.leaf = true;\n      }\n      delete newNode.children;\n      newList.push(newNode);\n    }\n    console.log(\"found children:\", newList);\n    return newList;\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/mock/index.ts",
    "content": "import { mock } from \"../api/service\";\nimport * as tools from \"../api/tools\";\nimport { forEach } from \"lodash-es\";\nimport { utils } from \"@fast-crud/fast-crud\";\n// @ts-ignore\nconst commonMocks: any = import.meta.glob(\"./common/mock.*.[j|t]s\", { eager: true });\n// @ts-ignore\nconst apiMocks: any = import.meta.glob(\"../api/modules/*.mock.ts\", { eager: true });\n// @ts-ignore\nconst viewMocks: any = import.meta.glob(\"../views/**/mock.[j|t]s\", { eager: true });\n\nconst list: any = [];\nforEach(commonMocks, (value: any) => {\n  list.push(value.default);\n});\nforEach(apiMocks, (value: any) => {\n  list.push(value.default);\n});\nforEach(viewMocks, (value: any) => {\n  list.push(value.default);\n});\n\nlist.forEach((apiFile: any) => {\n  for (const item of apiFile) {\n    mock.onAny(new RegExp(item.path)).reply(async (config: any) => {\n      utils.logger.debug(\"------------fake request start -------------\");\n      utils.logger.debug(\"request:\", config);\n      const data = config.data ? JSON.parse(config.data) : {};\n      const query = config.url.indexOf(\"?\") >= 0 ? config.url.substring(config.url.indexOf(\"?\") + 1) : undefined;\n      const params = config.params || {};\n      if (query) {\n        const arr = query.split(\"&\");\n        for (const item of arr) {\n          const kv = item.split(\"=\");\n          params[kv[0]] = kv[1];\n        }\n      }\n\n      const req = {\n        body: data,\n        params: params,\n      };\n      const ret = await item.handle(req);\n      utils.logger.debug(\"response:\", ret);\n      utils.logger.debug(\"------------fake request end-------------\");\n      if (ret.code === 0) {\n        return tools.responseSuccess(ret.data, ret.msg);\n      } else {\n        return tools.responseError(ret.data, ret.msg, ret.code);\n      }\n    });\n  }\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/antdv-async/index-bak.ts",
    "content": "import { defineAsyncComponent } from \"vue\";\nimport Input from \"ant-design-vue/es/input/Input\";\nimport Button from \"ant-design-vue/es/button/button\";\nimport Divider from \"ant-design-vue/es/divider\";\nimport Badge from \"ant-design-vue/es/badge\";\nimport Empty from \"ant-design-vue/es/empty\";\nimport Avatar from \"ant-design-vue/es/avatar\";\nimport Steps from \"ant-design-vue/es/steps\";\nimport Select from \"ant-design-vue/es/select\";\nimport PageHeader from \"ant-design-vue/es/page-header\";\nimport Card from \"ant-design-vue/es/card\";\n\nexport default {\n  install(app: any) {\n    app.use(Input);\n    app.use(Button);\n    app.use(Divider);\n    app.use(Badge);\n    app.use(Empty);\n    app.use(Avatar);\n    app.use(PageHeader);\n    app.use(Steps);\n    app.use(Select);\n    app.use(Card);\n\n    app.component(\n      \"AAutoComplete\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/auto-complete/index\"))\n    );\n    app.component(\n      \"ARadio\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/radio/Radio\"))\n    );\n    app.component(\n      \"ARadioGroup\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/radio/Group\"))\n    );\n    app.component(\n      \"ATable\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/table/Table\"))\n    );\n    app.component(\n      \"AModal\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/modal/Modal\"))\n    );\n    app.component(\n      \"AForm\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/form/Form\"))\n    );\n    app.component(\n      \"AFormItem\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/form/FormItem\"))\n    );\n    app.component(\n      \"AFormItemRest\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/form/FormItemContext\"))\n    );\n\n    app.component(\n      \"ATabs\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/tabs/src/Tabs\"))\n    );\n\n    app.component(\n      \"ATabPane\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/tabs/src/TabPanelList/TabPane\"))\n    );\n    app.component(\n      \"ATextarea\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/input/TextArea\"))\n    );\n    app.component(\n      \"AInputNumber\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/input-number/index\"))\n    );\n    app.component(\n      \"ADrawer\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/drawer/index\"))\n    );\n    app.component(\n      \"ASwitch\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/switch/index\"))\n    );\n    app.component(\n      \"AUpload\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/upload/index\"))\n    );\n    app.component(\n      \"ADatePicker\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/date-picker/index\"))\n    );\n    app.component(\n      \"ARangePicker\",\n      defineAsyncComponent(async () => {\n        const { RangePicker } = await import(\"ant-design-vue/es/date-picker/index\");\n        return RangePicker;\n      })\n    );\n    app.component(\n      \"ATimePicker\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/time-picker/index\"))\n    );\n    app.component(\n      \"ATag\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/tag/index\"))\n    );\n    app.component(\n      \"AAlert\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/alert/index\"))\n    );\n    app.component(\n      \"AInputAutoComplete\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/auto-complete/index\"))\n    );\n\n    app.component(\n      \"ACascader\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/cascader/index\"))\n    );\n    app.component(\n      \"ACheckbox\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/checkbox\"))\n    );\n    app.component(\n      \"ACheckboxGroup\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/checkbox/Group\"))\n    );\n    app.component(\n      \"ACol\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/col\"))\n    );\n    app.component(\n      \"ARow\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/row\"))\n    );\n    app.component(\n      \"ADropdown\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/dropdown\"))\n    );\n    app.component(\n      \"AGrid\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/grid\"))\n    );\n    app.component(\n      \"AImage\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/image\"))\n    );\n    app.component(\n      \"APagination\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/pagination\"))\n    );\n    app.component(\n      \"ATooltip\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/tooltip\"))\n    );\n    app.component(\n      \"ATree\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/tree\"))\n    );\n    app.component(\n      \"ATreeSelect\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/tree-select\"))\n    );\n    app.component(\n      \"ATour\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/tour\"))\n    );\n\n    app.component(\n      \"AMenu\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/menu/index\"))\n    );\n    app.component(\n      \"ASubMenu\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/menu/src/SubMenu\"))\n    );\n    app.component(\n      \"AMenuItem\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/menu/src/MenuItem\"))\n    );\n\n    app.component(\n      \"AProgress\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/progress\"))\n    );\n    app.component(\n      \"ATimelineItem\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/timeline/TimelineItem\"))\n    );\n    app.component(\n      \"ATimeline\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/timeline/Timeline\"))\n    );\n    app.component(\n      \"APageHeader\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/page-header/index\"))\n    );\n    app.component(\n      \"APopover\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/popover\"))\n    );\n    app.component(\n      \"APopconfirm\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/popconfirm\"))\n    );\n    app.component(\n      \"ACollapse\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/collapse\"))\n    );\n    app.component(\n      \"ADescriptions\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/descriptions\"))\n    );\n    app.component(\n      \"ADescriptionsItem\",\n      defineAsyncComponent(async () => {\n        const m = await import(\"ant-design-vue/es/descriptions/\");\n        return m.DescriptionsItem;\n      })\n    );\n    app.component(\n      \"AResult\",\n      defineAsyncComponent(() => import(\"ant-design-vue/es/result\"))\n    );\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/antdv-async/index.ts",
    "content": "import antdv from \"ant-design-vue\";\nexport default {\n  install(app: any) {\n    app.use(antdv);\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/fast-crud/index.tsx",
    "content": "import { request } from \"/src/api/service\";\n// import \"/src/mock\";\nimport { ColumnCompositionProps, CrudOptions, FastCrud, PageQuery, PageRes, setLogger, TransformResProps, useColumns, UseCrudProps, UserPageQuery, useTypes, utils } from \"@fast-crud/fast-crud\";\nimport \"@fast-crud/fast-crud/dist/style.css\";\nimport { FsExtendsCopyable, FsExtendsEditor, FsExtendsJson, FsExtendsTime, FsExtendsUploader, FsExtendsInput, FsUploaderS3SignedUrlType, FsUploaderGetAuthContext, FsUploaderAliossSTS } from \"@fast-crud/fast-extends\";\nimport \"@fast-crud/fast-extends/dist/style.css\";\nimport UiAntdv from \"@fast-crud/ui-antdv4\";\nimport \"@fast-crud/ui-antdv4/dist/style.css\";\nimport { debounce, merge } from \"lodash-es\";\nimport { useCrudPermission } from \"../permission\";\nimport { App } from \"vue\";\nimport { notification } from \"ant-design-vue\";\nimport { usePreferences } from \"/@/vben/preferences\";\nimport { LocalStorage } from \"/@/utils/util.storage\";\n\nclass ColumnSizeSaver {\n  save: (key: string, size: number) => void;\n  constructor() {\n    this.save = debounce((key: string, size: number) => {\n      const saveKey = this.getKey();\n      let data = LocalStorage.get(saveKey);\n      if (!data) {\n        data = {};\n      }\n      data[key] = size;\n      LocalStorage.set(saveKey, data);\n    });\n  }\n  getKey() {\n    const loc = window.location;\n    const currentUrl = `${loc.pathname}${loc.search}${loc.hash}`;\n    return `columnSize-${currentUrl}`;\n  }\n  get(key: string) {\n    const saveKey = this.getKey();\n    const row = LocalStorage.get(saveKey);\n    return row?.[key];\n  }\n  clear() {\n    const saveKey = this.getKey();\n    LocalStorage.remove(saveKey);\n  }\n}\nconst columnSizeSaver = new ColumnSizeSaver();\n\nfunction install(app: App, options: any = {}) {\n  app.use(UiAntdv);\n  //设置日志级别\n  setLogger({ level: \"info\" });\n\n  app.use(FastCrud, {\n    i18n: options.i18n,\n    async dictRequest({ url }: any) {\n      return await request({ url, method: \"post\" });\n    },\n    /**\n     * useCrud时会被执行\n     * @param props，useCrud的参数\n     */\n    commonOptions(props: UseCrudProps): CrudOptions {\n      utils.logger.debug(\"commonOptions:\", props);\n      const crudBinding = props.crudExpose?.crudBinding;\n      const { isMobile } = usePreferences();\n      const opts: CrudOptions = {\n        settings: {\n          plugins: {\n            mobile: {\n              enabled: true,\n              props: {\n                isMobile: isMobile,\n              },\n            },\n          },\n        },\n        table: {\n          scroll: {\n            x: 960,\n          },\n          size: \"small\",\n          pagination: false,\n          onResizeColumn: (w: number, col: any) => {\n            if (crudBinding.value?.table?.columnsMap && crudBinding.value?.table?.columnsMap[col.key]) {\n              crudBinding.value.table.columnsMap[col.key].width = w;\n              columnSizeSaver.save(col.key, w);\n            }\n          },\n          conditionalRender: {\n            match(scope) {\n              if (scope.column.conditionalRenderDisabled) {\n                return false;\n              }\n              if (scope.key === \"__blank__\") {\n                return false;\n              }\n\n              //不能用 !scope.value ， 否则switch组件设置为关之后就消失了\n              const { value, key, props } = scope;\n              return !value && key != \"_index\" && value != false;\n            },\n            render() {\n              return \"-\";\n            },\n          },\n        },\n        toolbar: {\n          export: {\n            fileType: \"excel\",\n          },\n          columnsFilter: {\n            async onReset() {\n              columnSizeSaver.clear();\n            },\n          },\n          buttons: {\n            export: {\n              show: false,\n            },\n          },\n        },\n        rowHandle: {\n          fixed: \"right\",\n          buttons: {\n            view: { type: \"link\", text: null, icon: \"ion:eye-outline\", tooltip: { title: \"查看\" } },\n            copy: { show: true, type: \"link\", text: null, icon: \"ion:copy-outline\", tooltip: { title: \"复制\" } },\n            edit: { type: \"link\", text: null, icon: \"ion:create-outline\", tooltip: { title: \"编辑\" } },\n            remove: { type: \"link\", style: { color: \"red\" }, text: null, icon: \"ion:trash-outline\", tooltip: { title: \"删除\" } },\n          },\n          dropdown: {\n            more: {\n              type: \"link\",\n            },\n          },\n          resizable: true,\n          width: 200,\n        },\n        request: {\n          transformQuery: ({ page, form, sort }: PageQuery): UserPageQuery => {\n            const limit = page.pageSize;\n            const currentPage = page.currentPage ?? 1;\n            const offset = limit * (currentPage - 1);\n\n            sort = sort == null ? {} : sort;\n\n            return {\n              page: {\n                limit,\n                offset,\n              },\n              query: form,\n              sort,\n            };\n          },\n          transformRes: ({ res }: TransformResProps): PageRes => {\n            const pageSize = res.limit;\n            let currentPage = res.offset / pageSize;\n            if (res.offset % pageSize === 0) {\n              currentPage++;\n            }\n            return { currentPage, pageSize, records: res.records, total: res.total, ...res };\n          },\n        },\n        search: {\n          formItem: {\n            wrapperCol: {\n              style: {\n                width: \"50%\",\n              },\n            },\n          },\n        },\n        form: {\n          display: \"flex\",\n          labelCol: {\n            //固定label宽度\n            span: null,\n            style: {\n              width: \"145px\",\n            },\n          },\n          async afterSubmit({ mode }) {\n            if (mode === \"add\") {\n              notification.success({ message: \"添加成功\" });\n            } else if (mode === \"edit\") {\n              notification.success({ message: \"保存成功\" });\n            }\n          },\n          wrapperCol: {\n            span: null,\n          },\n          wrapper: {\n            saveRemind: true,\n            // inner: true,\n            // innerContainerSelector: \"main.fs-framework-content\"\n          },\n        },\n        columns: {\n          //最后一列空白，用于自动伸缩列宽\n          __blank__: {\n            title: \"\",\n            type: \"text\",\n            form: {\n              show: false,\n            },\n            column: {\n              order: 99999,\n              width: -1,\n              columnSetShow: false,\n              resizable: false,\n            },\n          },\n        },\n      };\n\n      // 从 useCrud({permission}) 里获取permission参数，去设置各个按钮的权限\n      const permission = props.context?.permission || null;\n      const crudPermission = useCrudPermission({ permission });\n      return crudPermission.merge(opts);\n    },\n  });\n\n  // fast-extends里面的扩展组件均为异步组件，只有在使用时才会被加载，并不会影响首页加载速度\n  //安装uploader 公共参数\n\n  // @ts-ignore\n  app.use(FsExtendsUploader, {\n    // @ts-ignore\n    defaultType: \"form\",\n    form: {\n      keepName: true,\n      type: \"form\",\n      action: \"/basic/file/upload\",\n      name: \"file\",\n      withCredentials: false,\n      test: 22,\n      custom: { aaa: 22 },\n      uploadRequest: async (opts: any) => {\n        console.log(\"uploadRequest:\", opts);\n        const { action, file, onProgress } = opts;\n        // @ts-ignore\n        const data = new FormData();\n        data.append(\"file\", file);\n        return await request({\n          url: action,\n          method: \"post\",\n          headers: {\n            \"Content-Type\": \"multipart/form-data\",\n          },\n          timeout: 60000,\n          data,\n          onUploadProgress: (p: any) => {\n            onProgress({ percent: Math.round((p.loaded / p.total) * 100) });\n          },\n        });\n      },\n      successHandle(res: any) {\n        return res;\n      },\n    },\n  });\n\n  //安装editor\n  app.use(FsExtendsEditor, {\n    //编辑器的公共配置\n    wangEditor: {\n      editorConfig: {\n        MENU_CONF: {},\n      },\n      toolbarConfig: {},\n    },\n  });\n  app.use(FsExtendsJson);\n  app.use(FsExtendsTime);\n  app.use(FsExtendsCopyable);\n  app.use(FsExtendsInput);\n\n  const { addTypes, getType } = useTypes();\n  //此处演示修改官方字段类型\n  const textType = getType(\"text\");\n  textType.search.autoSearchTrigger = \"change\"; //修改官方的字段类型，变化就触发 ， \"enter\"=回车键触发\n  if (!textType.column) {\n    textType.column = {};\n  }\n  textType.column.ellipsis = true;\n  textType.column.showTitle = true;\n\n  // 此处演示自定义字段类型\n  addTypes({\n    time2: {\n      //如果与官方字段类型同名，将会覆盖官方的字段类型\n      form: { component: { name: \"a-date-picker\" } },\n      column: { component: { name: \"fs-date-format\", format: \"YYYY-MM-DD\" } },\n      valueBuilder(context: any) {\n        console.log(\"time2,valueBuilder\", context);\n      },\n    },\n  });\n\n  // 此处演示自定义字段合并插件\n  const { registerMergeColumnPlugin } = useColumns();\n  registerMergeColumnPlugin({\n    name: \"readonly-plugin\",\n    order: 1,\n    handle: (columnProps: ColumnCompositionProps) => {\n      // 你可以在此处做你自己的处理\n      // 比如你可以定义一个readonly的公共属性，处理该字段只读，不能编辑\n      if (columnProps.readonly) {\n        // 合并column配置\n        merge(columnProps, {\n          form: { show: false },\n          viewForm: { show: true },\n        });\n      }\n      return columnProps;\n    },\n  });\n\n  //默认宽度，支持自动拖动调整列宽\n  registerMergeColumnPlugin({\n    name: \"resize-column-plugin\",\n    order: 2,\n    handle: (columnProps: ColumnCompositionProps) => {\n      if (!columnProps.column) {\n        columnProps.column = {};\n      }\n      columnProps.column.resizable = true;\n      const savedColumnWidth = columnSizeSaver.get(columnProps.key as string);\n      if (savedColumnWidth) {\n        columnProps.column.width = savedColumnWidth;\n      } else if (columnProps.column.width == null) {\n        columnProps.column.width = 200;\n      } else if (typeof columnProps.column?.width === \"string\" && columnProps.column.width.indexOf(\"px\") > -1) {\n        columnProps.column.width = parseInt(columnProps.column.width.replace(\"px\", \"\"));\n      }\n      return columnProps;\n    },\n  });\n\n  registerMergeColumnPlugin({\n    name: \"reset-values-format-colors\",\n    order: 10,\n    handle: (columnProps: ColumnCompositionProps) => {\n      // 你可以在此处做你自己的处理\n      // 比如你可以定义一个readonly的公共属性，处理该字段只读，不能编辑\n      if (columnProps.column?.component?.name === \"fs-values-format\") {\n        // 合并column配置\n        if (!columnProps.column.component.autoColors) {\n          columnProps.column.component.autoColors = [\"green\", \"cyan\", \"blue\", \"purple\", \"geekblue\"];\n        }\n      }\n      return columnProps;\n    },\n  });\n}\n\nexport default {\n  install,\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/iconfont/iconfont.js",
    "content": "!(function (t) {\n  var e,\n    c,\n    o,\n    n,\n    l,\n    a =\n      '<svg><symbol id=\"icon-CI\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64z m0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z\"  ></path><path d=\"M730 311.9h-50.4c-4.4 0-8 3.6-8 8v384.2c0 4.4 3.6 8 8 8H730c4.4 0 8-3.6 8-8V319.9c0-4.4-3.6-8-8-8zM448.6 361.5c49.5 0 83.1 31.5 87 77.6 0.4 4.2 3.8 7.4 8 7.4h52.6c2.4 0 4.4-2 4.4-4.4 0-81.2-64-138.1-152.3-138.1C345.4 304 286 373.5 286 488.4v49c0 114 59.4 182.6 162.3 182.6 88 0 152.3-55.1 152.3-132.5 0-2.4-2-4.4-4.4-4.4h-52.7c-4.2 0-7.6 3.2-8 7.3-4.2 43-37.7 72.4-87 72.4-61.1 0-95.6-44.9-95.6-125.2v-49.3c0.1-81.4 34.6-126.8 95.7-126.8z\"  ></path></symbol><symbol id=\"icon-Dollar\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64z m0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z\"  ></path><path d=\"M559.7 488.8l-25.4-5.9V348.6c38 5.2 61.5 29 65.5 58.2 0.5 4 3.9 6.9 7.9 6.9h44.9c4.7 0 8.4-4.1 8-8.8-6.1-62.3-57.4-102.3-125.9-109.2V263c0-4.4-3.6-8-8-8h-28.1c-4.4 0-8 3.6-8 8v33c-70.8 6.9-126.2 46-126.2 119 0 67.6 49.8 100.2 102.1 112.7l24.7 6.3v142.7c-44.2-5.9-69-29.5-74.1-61.3-0.6-3.8-4-6.6-7.9-6.6H363c-4.7 0-8.4 4-8 8.7 4.5 55 46.2 105.6 135.2 112.1V761c0 4.4 3.6 8 8 8h28.4c4.4 0 8-3.6 8-8.1l-0.2-31.7c78.3-6.9 134.3-48.8 134.3-124-0.1-69.4-44.2-100.4-109-116.4z m-68.6-16.2c-5.6-1.6-10.3-3.1-15-5-33.8-12.2-49.5-31.9-49.5-57.3 0-36.3 27.5-57 64.5-61.7v124zM534.3 677V543.3c3.1 0.9 5.9 1.6 8.8 2.2 47.3 14.4 63.2 34.4 63.2 65.1 0 39.1-29.4 62.6-72 66.4z\"  ></path></symbol><symbol id=\"icon-compass\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64z m0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z\"  ></path><path d=\"M710.4 295.9c-8-3.1-16.7-2.9-24.5 0.5L414.9 415 296.4 686c-3.6 8.2-3.6 17.5 0 25.7 3.4 7.8 9.7 13.9 17.7 17 3.8 1.5 7.7 2.2 11.7 2.2 4.4 0 8.7-0.9 12.8-2.7l271-118.6 118.5-271c3.6-8.2 3.6-17.5 0-25.7-3.5-7.9-9.8-13.9-17.7-17zM576.8 534.4l26.2 26.2-42.4 42.4-26.2-26.2L380 644.4 447.5 490 422 464.4l42.4-42.4 25.5 25.5L644.4 380l-67.6 154.4z\"  ></path><path d=\"M464.4 422L422 464.4l25.5 25.6 86.9 86.8 26.2 26.2 42.4-42.4-26.2-26.2-86.8-86.9z\"  ></path></symbol><symbol id=\"icon-close-circle\" viewBox=\"0 0 1024 1024\"><path d=\"M685.4 354.8c0-4.4-3.6-8-8-8l-66 0.3L512 465.6l-99.3-118.4-66.1-0.3c-4.4 0-8 3.5-8 8 0 1.9 0.7 3.7 1.9 5.2l130.1 155L340.5 670c-1.2 1.5-1.9 3.3-1.9 5.2 0 4.4 3.6 8 8 8l66.1-0.3L512 564.4l99.3 118.4 66 0.3c4.4 0 8-3.5 8-8 0-1.9-0.7-3.7-1.9-5.2L553.5 515l130.1-155c1.2-1.4 1.8-3.3 1.8-5.2z\"  ></path><path d=\"M512 65C264.6 65 64 265.6 64 513s200.6 448 448 448 448-200.6 448-448S759.4 65 512 65z m0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z\"  ></path></symbol><symbol id=\"icon-frown\" viewBox=\"0 0 1024 1024\"><path d=\"M336 421m-48 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0Z\"  ></path><path d=\"M688 421m-48 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0Z\"  ></path><path d=\"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64z m263 711c-34.2 34.2-74 61-118.3 79.8C611 874.2 562.3 884 512 884c-50.3 0-99-9.8-144.8-29.2-44.3-18.7-84.1-45.6-118.3-79.8-34.2-34.2-61-74-79.8-118.3C149.8 611 140 562.3 140 512s9.8-99 29.2-144.8c18.7-44.3 45.6-84.1 79.8-118.3 34.2-34.2 74-61 118.3-79.8C413 149.8 461.7 140 512 140c50.3 0 99 9.8 144.8 29.2 44.3 18.7 84.1 45.6 118.3 79.8 34.2 34.2 61 74 79.8 118.3C874.2 413 884 461.7 884 512s-9.8 99-29.2 144.8c-18.7 44.3-45.6 84.1-79.8 118.2z\"  ></path><path d=\"M512 533c-85.5 0-155.6 67.3-160 151.6-0.2 4.6 3.4 8.4 8 8.4h48.1c4.2 0 7.8-3.2 8.1-7.4C420 636.1 461.5 597 512 597s92.1 39.1 95.8 88.6c0.3 4.2 3.9 7.4 8.1 7.4H664c4.6 0 8.2-3.8 8-8.4-4.4-84.3-74.5-151.6-160-151.6z\"  ></path></symbol><symbol id=\"icon-left-circle\" viewBox=\"0 0 1024 1024\"><path d=\"M603.3 327.5l-246 178c-4.4 3.2-4.4 9.7 0 12.9l246 178c5.3 3.8 12.7 0 12.7-6.5V643c0-10.2-4.9-19.9-13.2-25.9L457.4 512l145.4-105.2c8.3-6 13.2-15.6 13.2-25.9V334c0-6.5-7.4-10.3-12.7-6.5z\"  ></path><path d=\"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64z m0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z\"  ></path></symbol><symbol id=\"icon-down-circle\" viewBox=\"0 0 1024 1024\"><path d=\"M690 405h-46.9c-10.2 0-19.9 4.9-25.9 13.2L512 563.6 406.8 418.2c-6-8.3-15.6-13.2-25.9-13.2H334c-6.5 0-10.3 7.4-6.5 12.7l178 246c3.2 4.4 9.7 4.4 12.9 0l178-246c3.9-5.3 0.1-12.7-6.4-12.7z\"  ></path><path d=\"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64z m0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z\"  ></path></symbol></svg>',\n    i = (i = document.getElementsByTagName(\"script\"))[i.length - 1].getAttribute(\"data-injectcss\"),\n    h = function (t, e) {\n      e.parentNode.insertBefore(t, e);\n    };\n  if (i && !t.__iconfont__svg__cssinject__) {\n    t.__iconfont__svg__cssinject__ = !0;\n    try {\n      document.write(\"<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>\");\n    } catch (t) {\n      console && console.log(t);\n    }\n  }\n  function s() {\n    l || ((l = !0), o());\n  }\n  function d() {\n    try {\n      n.documentElement.doScroll(\"left\");\n    } catch (t) {\n      return void setTimeout(d, 50);\n    }\n    s();\n  }\n  (e = function () {\n    var t,\n      e = document.createElement(\"div\");\n    (e.innerHTML = a),\n      (a = null),\n      (e = e.getElementsByTagName(\"svg\")[0]) &&\n        (e.setAttribute(\"aria-hidden\", \"true\"),\n        (e.style.position = \"absolute\"),\n        (e.style.width = 0),\n        (e.style.height = 0),\n        (e.style.overflow = \"hidden\"),\n        (e = e),\n        (t = document.body).firstChild ? h(e, t.firstChild) : t.appendChild(e));\n  }),\n    document.addEventListener\n      ? ~[\"complete\", \"loaded\", \"interactive\"].indexOf(document.readyState)\n        ? setTimeout(e, 0)\n        : ((c = function () {\n            document.removeEventListener(\"DOMContentLoaded\", c, !1), e();\n          }),\n          document.addEventListener(\"DOMContentLoaded\", c, !1))\n      : document.attachEvent &&\n        ((o = e),\n        (n = t.document),\n        (l = !1),\n        d(),\n        (n.onreadystatechange = function () {\n          \"complete\" == n.readyState && ((n.onreadystatechange = null), s());\n        }));\n})(window);\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/iconfont/index.ts",
    "content": "import \"./iconfont.js\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/iconify/index.ts",
    "content": "// import \"@iconify/iconify\";\n// import \"@purge-icons/generated\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/index.ts",
    "content": "import \"./iconify\";\nimport \"./iconfont\";\nimport FastCrud from \"./fast-crud\";\nimport permission from \"./permission\";\nimport { App } from \"vue\";\nimport \"./validator/index.js\";\nfunction install(app: App, options: any = {}) {\n  app.use(FastCrud, options);\n  app.use(permission);\n}\n\nexport default {\n  install,\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/permission/api.ts",
    "content": "import { request } from \"/src/api/service\";\nexport async function getPermissions() {\n  const ret = await request({\n    url: \"/sys/authority/user/permissions\",\n    method: \"post\",\n  });\n  // 如果使用你自己的后端，需要在此处将返回结果改造为本模块需要的结构\n  // 结构详情，请参考示例中打印的日志 ”获取权限数据成功：{...}“ （实际上就是“资源管理”页面中列出来的数据）\n  return ret;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/permission/directive/index.ts",
    "content": "import permission from \"./permission.js\";\nimport permissionUtil from \"../util.permission\";\nconst install = function (app: any) {\n  app.directive(\"permission\", permission);\n  app.config.globalProperties.$hasPermissions = permissionUtil.hasPermissions;\n};\n\nexport default {\n  install,\n  ...permission,\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/permission/directive/permission.ts",
    "content": "import permissionUtil from \"../util.permission\";\nexport default {\n  mounted(el: any, binding: any, vnode: any) {\n    const { value } = binding;\n    const hasPermission = permissionUtil.hasPermissions(value);\n\n    if (!hasPermission) {\n      el.parentNode && el.parentNode.removeChild(el);\n    }\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/permission/errors.ts",
    "content": "export class NoPermissionError extends Error {\n  constructor(message?: string) {\n    super(message || \"对不起，您没有权限执行此操作\");\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/permission/hook.ts",
    "content": "import router from \"/src/router\";\nimport { useUserStore } from \"/@/store/user\";\nimport { usePermissionStore } from \"./store.permission\";\nimport util from \"./util.permission\";\nimport { message } from \"ant-design-vue\";\nimport NProgress from \"nprogress\";\nexport function registerRouterHook() {\n  // 注册路由beforeEach钩子，在第一次加载路由页面时，加载权限\n  router.beforeEach(async (to, from) => {\n    const permissionStore = usePermissionStore();\n    if (permissionStore.isInited) {\n      if (to.meta.permission) {\n        //校验权限\n        // @ts-ignore\n        if (!util.hasPermissions(to.meta.permission)) {\n          //没有权限\n          message.warn(\"对不起，您没有权限\");\n          //throw new Error(\"对不起，您没有权限\");\n          NProgress.done();\n          return false;\n        }\n      }\n      return true;\n    }\n\n    const userStore = useUserStore();\n    const token = userStore.getToken;\n    if (!token || token === \"undefined\") {\n      return true;\n    }\n    // 初始化权限列表\n    try {\n      console.log(\"permission is enabled\");\n      await permissionStore.loadFromRemote();\n      console.log(\"PM load success\");\n      return { ...to, replace: true };\n    } catch (e) {\n      console.error(\"加载动态路由失败\", e);\n      return false;\n    }\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/permission/index.ts",
    "content": "import permissionDirective from \"./directive/index.js\";\nimport { registerRouterHook } from \"./hook\";\nimport util from \"./util.permission\";\nexport * from \"./use-crud-permission\";\nexport * from \"./errors\";\n\nexport function usePermission() {\n  return {\n    ...util,\n  };\n}\n\nexport default {\n  install(app: any) {\n    // 开启权限模块\n    // 注册v-permission指令, 用于控制按钮权限\n    app.use(permissionDirective);\n    // 注册路由钩子\n    // 通过路由守卫，在登录成功后拦截路由，从后台加载权限数据\n    // 然后将权限数据转化为菜单和路由，添加到系统中\n    registerRouterHook();\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/permission/store.permission.ts",
    "content": "import { defineStore } from \"pinia\";\n// import { useResourceStore } from \"/src/store/modules/resource\";\nimport { getPermissions } from \"./api\";\nimport { mitter } from \"/@/utils/util.mitt\";\nimport { env } from \"/@/utils/util.env\";\nimport { useAccessStore } from \"/@/vben/stores\";\nimport { eachTree } from \"/@/utils/util.tree\";\nimport util from \"/@/plugin/permission/util.permission\";\n\n//监听注销事件\nmitter.on(\"app.logout\", () => {\n  const permissionStore = usePermissionStore();\n  permissionStore.clear();\n  const accessStore = useAccessStore();\n  accessStore.setIsAccessChecked(false);\n});\n\nmitter.on(\"app.login\", () => {\n  const accessStore = useAccessStore();\n  accessStore.setIsAccessChecked(false);\n  const permissionStore = usePermissionStore();\n  permissionStore.clear();\n  // const accessStore = useAccessStore();\n  // accessStore.setAccessCode([]);\n  // permissionStore.init();\n});\n\ninterface PermissionState {\n  permissions: [];\n  inited: boolean;\n}\n\n/**\n * 构建权限码列表\n * @param menuTree\n * @param permissionList\n * @returns {*}\n */\nexport function formatPermissions(menuTree: Array<any>, permissionList: any[] = []) {\n  if (menuTree == null) {\n    menuTree = [];\n  }\n  menuTree.forEach((item: any) => {\n    if (item.permission) {\n      // @ts-ignore\n      permissionList.push(item.permission);\n    }\n    if (item.children != null && item.children.length > 0) {\n      formatPermissions(item.children, permissionList);\n    }\n  });\n  return permissionList;\n}\n\nexport const usePermissionStore = defineStore({\n  id: \"app.permission\",\n  state: (): PermissionState => ({\n    permissions: [],\n    inited: false,\n  }),\n  getters: {\n    // @ts-ignore\n    getPermissions() {\n      // @ts-ignore\n      return this.permissions;\n    },\n    // @ts-ignore\n    isInited() {\n      // @ts-ignore\n      return this.inited;\n    },\n  },\n  actions: {\n    init({ permissions }: any) {\n      this.permissions = permissions;\n      this.inited = true;\n    },\n    clear() {\n      this.permissions = [];\n      this.inited = false;\n    },\n    resolve(resourceTree: any) {\n      const permissions = formatPermissions(resourceTree);\n      this.init({ permissions });\n\n      //过滤没有权限的菜单\n      const accessStore = useAccessStore();\n      accessStore.setAccessCodes(permissions);\n    },\n    async loadFromRemote() {\n      let permissionTree = [];\n      if (env.PM_ENABLED === \"false\") {\n        console.warn(\"当前权限模块未开启，权限列表为空\");\n      } else {\n        //开启了权限模块，向后台请求权限列表\n        const data = await getPermissions();\n        if (data != null) {\n          permissionTree = data;\n        } else {\n          console.warn(\"当前获取到的权限列表为空\");\n        }\n      }\n      this.resolve(permissionTree);\n    },\n  },\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/permission/use-crud-permission.ts",
    "content": "import { usePermission } from \"/@/plugin/permission\";\nimport { merge as LodashMerge } from \"lodash-es\";\n\nexport type UseCrudPermissionExtraProps = {\n  hasActionPermission: (action: string) => boolean;\n};\nexport type UseCrudPermissionExtra = (props: UseCrudPermissionExtraProps) => any;\nexport type UseCrudPermissionCompProps = {\n  prefix: string;\n  extra?: UseCrudPermissionExtra;\n  [key: string]: any;\n};\nexport type UseCrudPermissionProps = {\n  permission: string | UseCrudPermissionCompProps;\n};\n/**\n * 设置按钮动作权限\n * @param permission {prefix,extra}\n */\nexport function useCrudPermission({ permission }: UseCrudPermissionProps) {\n  const { hasPermissions } = usePermission();\n\n  const prefix = permission instanceof Object ? permission.prefix : permission;\n\n  //根据权限显示按钮\n  function hasActionPermission(action: string) {\n    if (!prefix) {\n      return true;\n    }\n    return hasPermissions(prefix + \":\" + action);\n  }\n\n  function buildCrudPermission(): any {\n    if (permission == null) {\n      return {};\n    }\n\n    let extra = {};\n    if (permission instanceof Object) {\n      extra = permission.extra;\n      if (permission.extra && permission.extra instanceof Function) {\n        extra = permission.extra({ hasActionPermission });\n      }\n    }\n\n    return LodashMerge(\n      {\n        actionbar: {\n          buttons: {\n            add: { show: hasActionPermission(\"add\") },\n          },\n        },\n        rowHandle: {\n          buttons: {\n            edit: { show: hasActionPermission(\"edit\") },\n            remove: { show: hasActionPermission(\"remove\") },\n            view: { show: hasActionPermission(\"view\") },\n          },\n        },\n      },\n      extra\n    );\n  }\n\n  function merge(userOptions: any) {\n    const permissionOptions = buildCrudPermission();\n    LodashMerge(permissionOptions, userOptions);\n    return permissionOptions;\n  }\n\n  return { merge, buildCrudPermission, hasActionPermission };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/permission/util.permission.ts",
    "content": "import { usePermissionStore } from \"./store.permission\";\nimport { NoPermissionError } from \"./errors\";\nimport { message } from \"ant-design-vue\";\nconst util = {\n  hasPermissions: (value: string | string[]): boolean => {\n    let need: string[] = [];\n    if (typeof value === \"string\") {\n      need.push(value);\n    } else if (value && value instanceof Array && value.length > 0) {\n      need = need.concat(value);\n    }\n    if (need.length === 0) {\n      throw new Error('need permissions! Like \"sys:user:view\" ');\n    }\n    const permissionStore = usePermissionStore();\n    const userPermissionList = permissionStore.getPermissions;\n    return userPermissionList.some((permission: any) => {\n      if (permission === \"*\") {\n        return true;\n      }\n      return need.includes(permission);\n    });\n  },\n  requirePermissions: (value: any) => {\n    if (!util.hasPermissions(value)) {\n      message.error(\"对不起，您没有权限执行此操作\");\n      throw new NoPermissionError();\n    }\n  },\n};\n\nexport default util;\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/validator/__tests__/validator.spec.ts",
    "content": "import { describe, expect, it } from \"vitest\";\nimport { isDomain, isFilePath } from \"/@/plugin/validator\";\n\ndescribe(\"domain_validator\", () => {\n  it(\"ok\", () => {\n    const value = [\"a.cc.com\", \"*.zz.com\", \"a.cc.com\"];\n    const v = isDomain({}, value);\n    expect(v).to.be.true;\n  });\n\n  it(\"allowDotStart\", () => {\n    let value = [\"&.cc.com\"];\n    function test() {\n      return isDomain({ allowDotStart: true }, value);\n    }\n    expect(test).to.throw(Error, \"域名有误：&.cc.com，请输入正确的域名\");\n\n    value = [\"a,cc.com\"];\n    expect(test).to.throw(Error, \"域名有误：a,cc.com，请输入正确的域名\");\n\n    value = [\"&cc.com\"];\n    expect(test).to.throw(Error, \"域名有误：&cc.com，请输入正确的域名\");\n\n    value = [\".cc.com\"];\n    expect(test()).to.be.true;\n  });\n\n  it(\"default\", () => {\n    let value = [\"&.cc.com\"];\n    function test() {\n      return isDomain({ allowDotStart: false }, value);\n    }\n    expect(test).to.throw(Error, \"域名有误：&.cc.com，请输入正确的域名\");\n\n    value = [\"&cc.com\"];\n    expect(test).to.throw(Error, \"域名有误：&cc.com，请输入正确的域名\");\n\n    value = [\"a,cc.com\"];\n    expect(test).to.throw(Error, \"域名有误：a,cc.com，请输入正确的域名\");\n\n    value = [\".cc.com\"];\n    expect(test).to.throw(Error, \"域名有误：.cc.com，请输入正确的域名\");\n  });\n\n  it(\"isFilePath\", () => {\n    let value = \"/a/$/bc\";\n\n    function test() {\n      return isFilePath({}, value);\n    }\n\n    expect(test()).to.be.true;\n\n    value = \"/a/&/bc\";\n    expect(test()).to.be.true;\n\n    //*?“<>|等特殊字符\n\n    value = \"/a/&/b>c.txt\";\n    const errorMessage = '文件名不能包含*?\"<>|等特殊字符';\n    expect(test).to.throw(Error, errorMessage);\n\n    value = \"/a/&/b<c.txt\";\n    expect(test).to.throw(Error, errorMessage);\n\n    value = \"/a/&/b|c.txt\";\n    expect(test).to.throw(Error, errorMessage);\n\n    value = \"/a/&/b?c.txt\";\n    expect(test).to.throw(Error, errorMessage);\n\n    value = \"/a/&/b*c.txt\";\n    expect(test).to.throw(Error, errorMessage);\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/plugin/validator/index.ts",
    "content": "import Validator from \"async-validator\";\n// 自定义验证器函数\nexport function isDomain(rule: any, value: any) {\n  if (value == null || value == \"\") {\n    return true;\n  }\n  let domains: string[] = value;\n  if (typeof value === \"string\") {\n    domains = value.split(\",\");\n  }\n\n  const allowDotStart = rule.allowDotStart ? \"\\\\.|\" : \"\";\n  const exp = `^(?:${allowDotStart}\\\\*\\\\.|[0-9a-zA-Z\\u4e00-\\u9fa5-]+\\\\.)+[0-9a-zA-Z\\u4e00-\\u9fa5-]+$`;\n  const compiled = new RegExp(exp);\n  for (const domain of domains) {\n    //域名可以是泛域名，中文域名，数字域名，英文域名，域名中可以包含-和. ,可以_开头\n\n    if (!compiled.test(domain)) {\n      throw new Error(`域名有误：${domain}，请输入正确的域名`);\n    }\n  }\n  return true;\n}\n\n// 注册自定义验证器\nValidator.register(\"domains\", isDomain);\n\nexport function isFilePath(rule: any, value: any) {\n  if (value == null) {\n    return true;\n  }\n  // 文件名不能用*?\"<>|等特殊符号\n  if (!/^[^*?\"<>|]*$/.test(value)) {\n    throw new Error(`文件名不能包含*?\"<>|等特殊字符`);\n  }\n  return true;\n}\nValidator.register(\"filepath\", isFilePath);\n"
  },
  {
    "path": "packages/ui/certd-client/src/router/access.ts",
    "content": "import type { ComponentRecordType, GenerateMenuAndRoutesOptions } from \"/@/vben/types\";\n\nimport { generateAccessible } from \"/@/vben/access\";\nimport { preferences } from \"/@/vben/preferences\";\n\nimport { BasicLayout, IFrameView } from \"/@/vben/layouts\";\n\nconst forbiddenComponent = () => import(\"#/views/_core/fallback/forbidden.vue\");\n\nasync function generateAccess(options: GenerateMenuAndRoutesOptions) {\n  const pageMap: ComponentRecordType = import.meta.glob(\"../views/**/*.vue\");\n\n  const layoutMap: ComponentRecordType = {\n    BasicLayout,\n    IFrameView,\n  } as any;\n\n  return await generateAccessible(preferences.app.accessMode, {\n    ...options,\n    // fetchMenuListAsync: async () => {\n    //   message.loading({\n    //     content: `${$t(\"common.loadingMenu\")}...`,\n    //     duration: 1.5\n    //   });\n    //   return await getAllMenusApi();\n    // },\n    // 可以指定没有权限跳转403页面\n    forbiddenComponent,\n    // 如果 route.meta.menuVisibleWithForbidden = true\n    layoutMap,\n    pageMap,\n  });\n}\n\nexport { generateAccess };\n"
  },
  {
    "path": "packages/ui/certd-client/src/router/guard.ts",
    "content": "import type { Router } from \"vue-router\";\n\nimport { DEFAULT_HOME_PATH, LOGIN_PATH } from \"/@/vben/constants\";\nimport { preferences } from \"/@/vben/preferences\";\nimport { useAccessStore } from \"/@/vben/stores\";\nimport { generateMenus, startProgress, stopProgress } from \"/@/vben/utils\";\nimport { frameworkRoutes } from \"/@/router/resolve\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { usePermissionStore } from \"/@/plugin/permission/store.permission\";\nimport util from \"/@/plugin/permission/util.permission\";\nimport { useUserStore } from \"/@/store/user\";\n\nfunction buildAccessedMenus(menus: any) {\n  if (menus == null) {\n    return;\n  }\n  const list: any = [];\n  for (const sub of menus) {\n    if (sub.meta?.permission != null) {\n      if (!util.hasPermissions(sub.meta.permission)) {\n        continue;\n      }\n    }\n    const item: any = {\n      ...sub,\n    };\n\n    list.push(item);\n    if (sub.children && sub.children.length > 0) {\n      item.children = buildAccessedMenus(sub.children);\n    }\n  }\n  return list;\n}\n/**\n * 通用守卫配置\n * @param router\n */\nexport function setupCommonGuard(router: Router) {\n  // 记录已经加载的页面\n  const loadedPaths = new Set<string>();\n\n  router.beforeEach(async to => {\n    const settingStore = useSettingStore();\n    await settingStore.initOnce();\n\n    to.meta.loaded = loadedPaths.has(to.path);\n\n    // 页面加载进度条\n    if (!to.meta.loaded && preferences.transition.progress) {\n      startProgress();\n    }\n    return true;\n  });\n\n  router.afterEach(to => {\n    // 记录页面是否加载,如果已经加载，后续的页面切换动画等效果不在重复执行\n\n    loadedPaths.add(to.path);\n\n    // 关闭页面加载进度条\n    if (preferences.transition.progress) {\n      stopProgress();\n    }\n  });\n}\n\n/**\n * 权限访问守卫配置\n * @param router\n */\nfunction setupAccessGuard(router: Router) {\n  router.beforeEach(async (to, from) => {\n    if (to.matched && to.matched.length > 2) {\n      to.matched.splice(1, to.matched.length - 2);\n    }\n\n    const accessStore = useAccessStore();\n    // 是否已经生成过动态路由\n    if (!accessStore.isAccessChecked) {\n      if (accessStore.accessToken) {\n        //如果已登录\n        const permissionStore = usePermissionStore();\n        await permissionStore.loadFromRemote();\n        const userStore = useUserStore();\n        await userStore.getUserInfoAction();\n      }\n\n      const settingsStore = useSettingStore();\n      const headerMenus: any[] = settingsStore.getHeaderMenus;\n      let allMenus = await generateMenus(frameworkRoutes[0].children, router);\n      allMenus = allMenus.concat(headerMenus);\n      const accessibleMenus = buildAccessedMenus(allMenus);\n      accessStore.setAccessRoutes(frameworkRoutes);\n      accessStore.setAccessMenus(accessibleMenus);\n      accessStore.setIsAccessChecked(true);\n    }\n\n    // 基本路由，这些路由不需要进入权限拦截\n    const needAuth = to.matched.some(r => {\n      return r.meta?.auth || r.meta?.permission;\n    });\n\n    if (!needAuth) {\n      return true;\n    }\n    if (!accessStore.accessToken) {\n      // 没有访问权限，跳转登录页面\n      if (to.fullPath !== LOGIN_PATH) {\n        return {\n          path: LOGIN_PATH,\n          // 如不需要，直接删除 query\n          query: to.fullPath === DEFAULT_HOME_PATH ? {} : { redirect: encodeURIComponent(to.fullPath) },\n          // 携带当前跳转的页面，登录后重新跳转该页面\n          replace: true,\n        };\n      }\n      return true;\n    }\n  });\n}\n\n/**\n * 项目守卫配置\n * @param router\n */\nfunction createRouterGuard(router: Router) {\n  /** 通用 */\n  setupCommonGuard(router);\n  /** 权限访问 */\n  setupAccessGuard(router);\n}\n\nexport { createRouterGuard };\n"
  },
  {
    "path": "packages/ui/certd-client/src/router/index.ts",
    "content": "import { createRouter, createWebHashHistory } from \"vue-router\";\n// 进度条\nimport \"nprogress/nprogress.css\";\nimport { routes } from \"./resolve\";\nimport { createRouterGuard } from \"/@/router/guard\";\n\nconst router = createRouter({\n  history: createWebHashHistory(),\n  routes,\n});\n/**\n\n */\ncreateRouterGuard(router);\nexport default router;\n//\n// /**\n//  * 路由拦截\n//  */\n// router.beforeEach(async (to, from, next) => {\n//   // 进度条\n//   NProgress.start();\n//   const settingStore = useSettingStore();\n//   await settingStore.initOnce();\n//   const resourceStore = useResourceStore();\n//   resourceStore.init();\n//   // 修复三级以上路由页面无法缓存的问题\n//   if (to.matched && to.matched.length > 2) {\n//     to.matched.splice(1, to.matched.length - 2);\n//   }\n//   // 验证当前路由所有的匹配中是否需要有登录验证的\n//   if (\n//     to.matched.some((r) => {\n//       return r.meta?.auth || r.meta?.permission;\n//     })\n//   ) {\n//     const userStore = useUserStore();\n//     // 这里暂时将cookie里是否存有token作为验证是否登录的条件\n//     // 请根据自身业务需要修改\n//     const token = userStore.getToken;\n//     if (token) {\n//       next();\n//     } else {\n//       // 没有登录的时候跳转到登录界面\n//       // 携带上登陆成功之后需要跳转的页面完整路径\n//       resourceStore.clear();\n//       next({\n//         name: \"login\",\n//         query: {\n//           redirect: to.fullPath\n//         }\n//       });\n//       // https://github.com/d2-projects/d2-admin/issues/138\n//       NProgress.done();\n//     }\n//   } else {\n//     // 不需要身份校验 直接通过\n//     next();\n//   }\n// });\n//\n// router.afterEach((to: any) => {\n//   // 进度条\n//   NProgress.done();\n//   // 多页控制 打开新的页面\n//   const pageStore = usePageStore();\n//   // for (const item of to.matched) {\n//   //   pageStore.keepAlivePush(item.name);\n//   // }\n//   pageStore.open(to);\n//   // 更改标题\n//   const settingStore = useSettingStore();\n//   site.title(to.meta.title, settingStore.siteInfo.title);\n"
  },
  {
    "path": "packages/ui/certd-client/src/router/resolve.ts",
    "content": "import LayoutPass from \"/src/layout/layout-pass.vue\";\nimport { cloneDeep } from \"lodash-es\";\nimport { outsideResource } from \"./source/outside\";\nimport { headerResource } from \"./source/header\";\nimport { frameworkResource } from \"./source/framework\";\nconst modules = import.meta.glob(\"/src/views/**/*.vue\");\n\nlet index = 0;\nfunction transformOneResource(resource: any, parent: any) {\n  let menu: any = null;\n  if (resource.meta == null) {\n    resource.meta = {};\n  }\n  const meta = resource.meta;\n  meta.title = meta.title ?? resource.title ?? \"未命名\";\n  if (resource.title == null) {\n    resource.title = meta.title;\n  }\n  if (meta.isMenu === false) {\n    menu = null;\n  } else {\n    menu = cloneDeep(resource);\n    delete menu.component;\n    if (menu.path?.startsWith(\"/\")) {\n      menu.fullPath = menu.path;\n    } else {\n      menu.fullPath = (parent?.fullPath || \"\") + \"/\" + menu.path;\n    }\n  }\n  let route;\n  if (meta.isRoute === false || resource.path == null) {\n    //没有route\n    route = null;\n  } else {\n    route = cloneDeep(resource);\n    if (route.component && typeof route.component === \"string\") {\n      const path = \"/src/views\" + route.component;\n      route.component = modules[path];\n    }\n    if (route.component == null) {\n      route.component = LayoutPass;\n    }\n    if (route?.meta?.keepAlive !== true) {\n      if (route.meta == null) {\n        route.meta = {};\n      }\n      route.meta.keepAlive = false;\n    }\n  }\n  if (resource.children) {\n    const { menus, routes } = buildMenusAndRouters(resource.children, resource);\n    if (menu) {\n      menu.children = menus;\n    }\n    if (route) {\n      route.children = routes;\n    }\n  }\n  return {\n    menu,\n    route,\n  };\n}\n\nexport const buildMenusAndRouters = (resources: any, parent: any = null) => {\n  const routes: Array<any> = [];\n  const menus: Array<any> = [];\n  for (const item of resources) {\n    const { menu, route } = transformOneResource(item, parent);\n\n    if (menu) {\n      menus.push(menu);\n    }\n    if (route) {\n      routes.push(route);\n    }\n  }\n\n  setIndex(menus);\n  return {\n    routes,\n    menus,\n  };\n};\n\nfunction setIndex(menus: any) {\n  for (const menu of menus) {\n    menu.index = \"index_\" + index;\n    index++;\n    if (menu.children && menu.children.length > 0) {\n      setIndex(menu.children);\n    }\n  }\n}\n\nfunction findMenus(menus: any, condition: any) {\n  const list: any = [];\n  for (const menu of menus) {\n    if (condition(menu)) {\n      list.push(menu);\n    }\n    if (menu.children && menu.children.length > 0) {\n      const subList = findMenus(menu.children, condition);\n      for (const item of subList) {\n        list.push(item);\n      }\n    }\n  }\n  return list;\n}\n\nfunction filterMenus(menus: any, condition: any) {\n  const list = menus.filter((item: any) => {\n    return condition(item);\n  });\n\n  for (const item of list) {\n    if (item.children && item.children.length > 0) {\n      item.children = filterMenus(item.children, condition);\n    }\n  }\n  return list;\n}\n\nfunction flatChildren(list: any, children: any) {\n  for (const child of children) {\n    list.push(child);\n    if (child.children && child.children.length > 0) {\n      flatChildren(list, child.children);\n    }\n    child.children = null;\n  }\n}\nfunction flatSubRouters(routers: any) {\n  for (const router of routers) {\n    const children: Array<any> = [];\n    if (router.children && router.children.length > 0) {\n      flatChildren(children, router.children);\n    }\n    router.children = children;\n  }\n  return routers;\n}\n\nconst frameworkRet = buildMenusAndRouters(frameworkResource);\nconst outsideRet = buildMenusAndRouters(outsideResource);\nconst headerRet = buildMenusAndRouters(headerResource);\n\nconst outsideRoutes = outsideRet.routes;\nconst frameworkRoutes = frameworkRet.routes;\nconst routes = [...outsideRoutes, ...frameworkRoutes];\nconst frameworkMenus = frameworkRet.menus;\nconst headerMenus = headerRet.menus;\nexport { routes, outsideRoutes, frameworkRoutes, frameworkMenus, headerMenus, findMenus, filterMenus };\n"
  },
  {
    "path": "packages/ui/certd-client/src/router/source/framework.ts",
    "content": "import LayoutBasic from \"/@/layout/layout-basic.vue\";\n\nimport type { RouteRecordRaw } from \"vue-router\";\nimport i18n from \"/@/locales/i18n\";\n\nimport { mergeRouteModules } from \"/@/vben/utils\";\nconst dynamicRouteFiles = import.meta.glob(\"./modules/**/*.ts*\", {\n  eager: true,\n});\n\n/** 动态路由 */\nconst dynamicRoutes: RouteRecordRaw[] = mergeRouteModules(dynamicRouteFiles);\nexport const frameworkResource = [\n  {\n    title: \"certd.framework.title\",\n    name: \"root\",\n    path: \"/\",\n    redirect: \"/index\",\n    component: LayoutBasic,\n    meta: {\n      icon: \"ion:accessibility\",\n      hideInBreadcrumb: true,\n    },\n    children: [\n      {\n        title: \"certd.framework.home\",\n        name: \"index\",\n        path: \"/index\",\n        component: \"/framework/home/index.vue\",\n        meta: {\n          fixedAside: true,\n          showOnHeader: false,\n          icon: \"ion:home-outline\",\n          auth: true,\n        },\n      },\n      // @ts-ignore\n\n      ...dynamicRoutes,\n    ],\n  },\n];\n\nconsole.assert(frameworkResource.length === 1, \"frameworkResource数组长度只能为1，你只能配置framework路由的子路由\");\n"
  },
  {
    "path": "packages/ui/certd-client/src/router/source/header.ts",
    "content": "import i18n from \"/@/locales/i18n\";\n\nexport const headerResource = [\n  {\n    title: \"certd.helpDoc\",\n    path: \"https://certd.docmirror.cn\",\n    meta: {\n      icon: \"ion:document-text-outline\",\n    },\n  },\n  {\n    title: \"certd.source\",\n    name: \"source\",\n    key: \"source\",\n    meta: {\n      icon: \"ion:git-branch-outline\",\n    },\n    children: [\n      {\n        title: \"certd.github\",\n        path: \"https://github.com/certd/certd\",\n        meta: {\n          icon: \"ion:logo-github\",\n        },\n      },\n      {\n        title: \"certd.gitee\",\n        path: \"https://gitee.com/certd/certd\",\n        meta: {\n          icon: \"ion:logo-octocat\",\n        },\n      },\n    ],\n  },\n];\n"
  },
  {
    "path": "packages/ui/certd-client/src/router/source/modules/about.tsx",
    "content": "import { IFrameView } from \"/@/vben/layouts\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { computed } from \"vue\";\nimport TutorialButton from \"/@/components/tutorial/index.vue\";\nimport i18n from \"/@/locales/i18n\";\n\nexport const aboutResource = [\n  {\n    title: \"certd.dashboard.helpDoc\",\n    name: \"document\",\n    path: \"/about/doc\",\n    component: IFrameView,\n    meta: {\n      icon: \"lucide:book-open-text\",\n      link: \"https://certd.docmirror.cn\",\n      title: \"certd.dashboard.helpDoc\",\n      order: 9999,\n      show: () => {\n        const settingStore = useSettingStore();\n        return !settingStore.isComm;\n      },\n    },\n  },\n];\n\nexport default aboutResource;\n"
  },
  {
    "path": "packages/ui/certd-client/src/router/source/modules/certd.ts",
    "content": "import { useSettingStore } from \"/@/store/settings\";\nimport aboutResource from \"/@/router/source/modules/about\";\nimport i18n from \"/@/locales/i18n\";\n\nexport const certdResources = [\n  {\n    title: \"certd.title\",\n    name: \"CertdRoot\",\n    path: \"/certd\",\n    redirect: \"/certd/pipeline\",\n    meta: {\n      icon: \"ion:key-outline\",\n      auth: true,\n      order: 0,\n    },\n    children: [\n      {\n        title: \"certd.pipeline\",\n        name: \"PipelineManager\",\n        path: \"/certd/pipeline\",\n        component: \"/certd/pipeline/index.vue\",\n        meta: {\n          icon: \"ion:analytics-sharp\",\n          keepAlive: true,\n        },\n      },\n      {\n        title: \"certd.pipelineEdit\",\n        name: \"PipelineEdit\",\n        path: \"/certd/pipeline/detail\",\n        component: \"/certd/pipeline/detail.vue\",\n        meta: {\n          isMenu: false,\n        },\n      },\n      {\n        title: \"certd.history\",\n        name: \"PipelineHistory\",\n        path: \"/certd/history\",\n        component: \"/certd/history/index.vue\",\n        meta: {\n          icon: \"ion:timer-outline\",\n          keepAlive: true,\n        },\n      },\n      {\n        title: \"certd.template.title\",\n        name: \"PipelineTemplate\",\n        path: \"/certd/pipeline/template\",\n        component: \"/certd/pipeline/template/index.vue\",\n        meta: {\n          isMenu: true,\n          icon: \"ion:duplicate-outline\",\n        },\n      },\n      {\n        title: \"certd.template.edit\",\n        name: \"PipelineTemplateEdit\",\n        path: \"/certd/pipeline/template/edit\",\n        component: \"/certd/pipeline/template/edit.vue\",\n        meta: {\n          isMenu: false,\n        },\n      },\n      {\n        title: \"certd.template.importCreate\",\n        name: \"PipelineTemplateImport\",\n        path: \"/certd/pipeline/template/import\",\n        component: \"/certd/pipeline/template/import/index.vue\",\n        meta: {\n          isMenu: false,\n        },\n      },\n      {\n        title: \"certd.certStore\",\n        name: \"CertStore\",\n        path: \"/certd/monitor/cert\",\n        component: \"/certd/monitor/cert/index.vue\",\n        meta: {\n          icon: \"ion:shield-checkmark-outline\",\n          auth: true,\n          isMenu: true,\n          keepAlive: true,\n        },\n      },\n      {\n        title: \"certd.siteMonitor\",\n        name: \"SiteCertMonitor\",\n        path: \"/certd/monitor/site\",\n        component: \"/certd/monitor/site/index.vue\",\n        meta: {\n          icon: \"ion:videocam-outline\",\n          auth: true,\n          keepAlive: true,\n        },\n      },\n      {\n        title: \"certd.settings\",\n        name: \"MineSetting\",\n        path: \"/certd/setting\",\n        redirect: \"/certd/access\",\n        meta: {\n          icon: \"ion:settings-outline\",\n          auth: true,\n          keepAlive: true,\n        },\n        children: [\n          {\n            title: \"certd.accessManager\",\n            name: \"AccessManager\",\n            path: \"/certd/access\",\n            component: \"/certd/access/index.vue\",\n            meta: {\n              icon: \"ion:disc-outline\",\n              auth: true,\n              keepAlive: true,\n            },\n          },\n          {\n            title: \"certd.domain.domainManager\",\n            name: \"DomainManager\",\n            path: \"/certd/cert/domain\",\n            component: \"/certd/cert/domain/index.vue\",\n            meta: {\n              icon: \"ion:globe-outline\",\n              auth: true,\n              keepAlive: true,\n            },\n          },\n          {\n            title: \"certd.cnameRecord\",\n            name: \"CnameRecord\",\n            path: \"/certd/cname/record\",\n            component: \"/certd/cname/record/index.vue\",\n            meta: {\n              icon: \"ion:link-outline\",\n              auth: true,\n              keepAlive: true,\n            },\n          },\n          {\n            title: \"certd.subDomain\",\n            name: \"SubDomain\",\n            path: \"/certd/pipeline/subDomain\",\n            component: \"/certd/pipeline/sub-domain/index.vue\",\n            meta: {\n              icon: \"material-symbols:approval-delegation-outline\",\n              auth: true,\n              keepAlive: true,\n            },\n          },\n          {\n            title: \"certd.pipelineGroup\",\n            name: \"PipelineGroupManager\",\n            path: \"/certd/pipeline/group\",\n            component: \"/certd/pipeline/group/index.vue\",\n            meta: {\n              icon: \"mdi:format-list-group\",\n              auth: true,\n              keepAlive: true,\n            },\n          },\n          {\n            title: \"certd.openKey\",\n            name: \"OpenKey\",\n            path: \"/certd/open/openkey\",\n            component: \"/certd/open/openkey/index.vue\",\n            meta: {\n              icon: \"hugeicons:api\",\n              auth: true,\n              keepAlive: true,\n            },\n          },\n          {\n            title: \"certd.notification\",\n            name: \"NotificationManager\",\n            path: \"/certd/notification\",\n            component: \"/certd/notification/index.vue\",\n            meta: {\n              icon: \"ion:megaphone-outline\",\n              auth: true,\n              keepAlive: true,\n            },\n          },\n          {\n            title: \"certd.siteMonitorSetting\",\n            name: \"SiteMonitorSetting\",\n            path: \"/certd/monitor/setting\",\n            component: \"/certd/monitor/site/setting/index.vue\",\n            meta: {\n              icon: \"ion:videocam-outline\",\n              auth: true,\n              isMenu: true,\n            },\n          },\n          {\n            title: \"certd.userSecurity\",\n            name: \"UserSecurity\",\n            path: \"/certd/mine/security\",\n            component: \"/certd/mine/security/index.vue\",\n            meta: {\n              icon: \"fluent:shield-keyhole-16-regular\",\n              auth: true,\n              isMenu: true,\n            },\n          },\n          {\n            title: \"certd.userProfile\",\n            name: \"UserProfile\",\n            path: \"/certd/mine/user-profile\",\n            component: \"/certd/mine/user-profile.vue\",\n            meta: {\n              icon: \"ion:person-outline\",\n              auth: true,\n              isMenu: false,\n            },\n          },\n        ],\n      },\n      {\n        title: \"certd.suite\",\n        name: \"SuiteProduct\",\n        path: \"/certd/suite\",\n        redirect: \"/certd/suite/mine\",\n        meta: {\n          show: () => {\n            const settingStore = useSettingStore();\n            return settingStore.isComm && settingStore.isSuiteEnabled;\n          },\n          icon: \"ion:cart-outline\",\n          auth: true,\n        },\n        children: [\n          {\n            title: \"certd.mySuite\",\n            name: \"MySuite\",\n            path: \"/certd/suite/mine\",\n            component: \"/certd/suite/mine/index.vue\",\n            meta: {\n              show: () => {\n                const settingStore = useSettingStore();\n                return settingStore.isComm;\n              },\n              icon: \"ion:gift-outline\",\n              auth: true,\n            },\n          },\n          {\n            title: \"certd.suiteBuy\",\n            name: \"SuiteProductBuy\",\n            path: \"/certd/suite/buy\",\n            component: \"/certd/suite/buy.vue\",\n            meta: {\n              show: () => {\n                const settingStore = useSettingStore();\n                return settingStore.isComm;\n              },\n              icon: \"ion:cart-outline\",\n              auth: true,\n            },\n          },\n          {\n            title: \"certd.myTrade\",\n            name: \"MyTrade\",\n            path: \"/certd/trade\",\n            component: \"/certd/trade/index.vue\",\n            meta: {\n              show: () => {\n                const settingStore = useSettingStore();\n                return settingStore.isComm;\n              },\n              icon: \"ion:bag-check-outline\",\n              auth: true,\n              keepAlive: true,\n            },\n          },\n          {\n            title: \"certd.paymentReturn\",\n            name: \"PaymentReturn\",\n            path: \"/certd/payment/return/:type\",\n            component: \"/certd/payment/return.vue\",\n            meta: {\n              icon: \"ant-design:pay-circle-outlined\",\n              auth: false,\n              isMenu: false,\n            },\n          },\n        ],\n      },\n    ],\n  },\n];\n\nexport default certdResources;\n"
  },
  {
    "path": "packages/ui/certd-client/src/router/source/modules/sys.ts",
    "content": "import LayoutPass from \"/@/layout/layout-pass.vue\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport aboutResource from \"/@/router/source/modules/about\";\nimport i18n from \"/@/locales/i18n\";\n\nexport const sysResources = [\n  {\n    title: \"certd.sysResources.sysRoot\",\n    name: \"SysRoot\",\n    path: \"/sys\",\n    redirect: \"/sys/settings\",\n    meta: {\n      icon: \"ion:settings-outline\",\n      permission: \"sys:settings:view\",\n      order: 10,\n    },\n    children: [\n      {\n        title: \"certd.sysResources.sysConsole\",\n        name: \"SysConsole\",\n        path: \"/sys/console\",\n        component: \"/sys/console/index.vue\",\n        meta: {\n          show: () => {\n            const settingStore = useSettingStore();\n            return settingStore.isComm;\n          },\n          icon: \"ion:speedometer-outline\",\n          permission: \"sys:auth:user:view\",\n        },\n      },\n\n      {\n        title: \"certd.sysResources.sysSettings\",\n        name: \"SysSettings\",\n        path: \"/sys/settings\",\n        component: \"/sys/settings/index.vue\",\n        meta: {\n          icon: \"ion:settings-outline\",\n          permission: \"sys:settings:view\",\n        },\n      },\n      {\n        title: \"certd.sysResources.cnameSetting\",\n        name: \"CnameSetting\",\n        path: \"/sys/cname/provider\",\n        component: \"/sys/cname/provider/index.vue\",\n        meta: {\n          icon: \"ion:earth-outline\",\n          permission: \"sys:settings:view\",\n          keepAlive: true,\n        },\n      },\n      {\n        title: \"certd.sysResources.emailSetting\",\n        name: \"EmailSetting\",\n        path: \"/sys/settings/email\",\n        component: \"/sys/settings/email/index.vue\",\n        meta: {\n          permission: \"sys:settings:view\",\n          icon: \"ion:mail-outline\",\n          auth: true,\n        },\n      },\n      {\n        title: \"certd.sysResources.siteSetting\",\n        name: \"SiteSetting\",\n        path: \"/sys/site\",\n        component: \"/sys/site/index.vue\",\n        meta: {\n          show: () => {\n            const settingStore = useSettingStore();\n            return settingStore.isComm;\n          },\n          icon: \"ion:document-text-outline\",\n          permission: \"sys:settings:view\",\n        },\n      },\n      {\n        title: \"certd.sysResources.headerMenus\",\n        name: \"HeaderMenus\",\n        path: \"/sys/settings/header-menus\",\n        component: \"/sys/settings/header-menus/index.vue\",\n        meta: {\n          show: () => {\n            const settingStore = useSettingStore();\n            return settingStore.isComm;\n          },\n          icon: \"ion:menu\",\n          permission: \"sys:settings:view\",\n          keepAlive: true,\n        },\n      },\n      {\n        title: \"certd.sysResources.sysAccess\",\n        name: \"SysAccess\",\n        path: \"/sys/access\",\n        component: \"/sys/access/index.vue\",\n        meta: {\n          show: () => {\n            const settingStore = useSettingStore();\n            return settingStore.isComm;\n          },\n          icon: \"ion:disc-outline\",\n          permission: \"sys:settings:view\",\n          keepAlive: true,\n        },\n      },\n      {\n        title: \"certd.sysResources.sysPlugin\",\n        name: \"SysPlugin\",\n        path: \"/sys/plugin\",\n        component: \"/sys/plugin/index.vue\",\n        meta: {\n          icon: \"ion:extension-puzzle-outline\",\n          permission: \"sys:settings:view\",\n          keepAlive: true,\n        },\n      },\n      {\n        title: \"certd.sysResources.sysPluginEdit\",\n        name: \"SysPluginEdit\",\n        path: \"/sys/plugin/edit\",\n        component: \"/sys/plugin/edit.vue\",\n        meta: {\n          isMenu: false,\n          icon: \"ion:extension-puzzle\",\n          permission: \"sys:settings:view\",\n          keepAlive: true,\n        },\n      },\n      {\n        title: \"certd.sysResources.sysPluginConfig\",\n        name: \"SysPluginConfig\",\n        path: \"/sys/plugin/config\",\n        component: \"/sys/plugin/config.vue\",\n        meta: {\n          show: () => {\n            const settingStore = useSettingStore();\n            return settingStore.isComm;\n          },\n          icon: \"ion:extension-puzzle\",\n          permission: \"sys:settings:view\",\n        },\n      },\n      {\n        title: \"certd.sysResources.accountBind\",\n        name: \"AccountBind\",\n        path: \"/sys/account\",\n        component: \"/sys/account/index.vue\",\n        meta: {\n          icon: \"ion:golf-outline\",\n          permission: \"sys:settings:view\",\n          keepAlive: true,\n        },\n      },\n      {\n        title: \"certd.sysResources.permissionManager\",\n        name: \"PermissionManager\",\n        path: \"/sys/authority/permission\",\n        component: \"/sys/authority/permission/index.vue\",\n        meta: {\n          icon: \"ion:list-outline\",\n          permission: \"sys:auth:per:view\",\n          keepAlive: true,\n        },\n      },\n      {\n        title: \"certd.sysResources.roleManager\",\n        name: \"RoleManager\",\n        path: \"/sys/authority/role\",\n        component: \"/sys/authority/role/index.vue\",\n        meta: {\n          icon: \"ion:people-outline\",\n          permission: \"sys:auth:role:view\",\n          keepAlive: true,\n        },\n      },\n      {\n        title: \"certd.sysResources.userManager\",\n        name: \"UserManager\",\n        path: \"/sys/authority/user\",\n        component: \"/sys/authority/user/index.vue\",\n        meta: {\n          icon: \"ion:person-outline\",\n          permission: \"sys:auth:user:view\",\n          keepAlive: true,\n        },\n      },\n\n      {\n        title: \"certd.sysResources.suiteManager\",\n        name: \"SuiteManager\",\n        path: \"/sys/suite\",\n        redirect: \"/sys/suite/setting\",\n        meta: {\n          icon: \"ion:cart-outline\",\n          permission: \"sys:settings:edit\",\n          show: () => {\n            const settingStore = useSettingStore();\n            return settingStore.isComm;\n          },\n          keepAlive: true,\n        },\n        children: [\n          {\n            title: \"certd.sysResources.suiteSetting\",\n            name: \"SuiteSetting\",\n            path: \"/sys/suite/setting\",\n            component: \"/sys/suite/setting/index.vue\",\n            meta: {\n              show: () => {\n                const settingStore = useSettingStore();\n                return settingStore.isComm;\n              },\n              icon: \"ion:cart\",\n              permission: \"sys:settings:edit\",\n            },\n          },\n          {\n            title: \"certd.sysResources.orderManager\",\n            name: \"OrderManager\",\n            path: \"/sys/suite/trade\",\n            component: \"/sys/suite/trade/index.vue\",\n            meta: {\n              show: () => {\n                const settingStore = useSettingStore();\n                return settingStore.isComm;\n              },\n              icon: \"ion:bag-check\",\n              permission: \"sys:settings:edit\",\n              keepAlive: true,\n            },\n          },\n          {\n            title: \"certd.sysResources.userSuites\",\n            name: \"UserSuites\",\n            path: \"/sys/suite/user-suite\",\n            component: \"/sys/suite/user-suite/index.vue\",\n            meta: {\n              show: () => {\n                const settingStore = useSettingStore();\n                return settingStore.isComm;\n              },\n              icon: \"ion:gift-outline\",\n              auth: true,\n              keepAlive: true,\n            },\n          },\n        ],\n      },\n    ],\n  },\n];\n\nexport default sysResources;\n"
  },
  {
    "path": "packages/ui/certd-client/src/router/source/outside.ts",
    "content": "import LayoutOutside from \"/src/layout/layout-outside.vue\";\nimport Error404 from \"/src/views/framework/error/404.vue\";\nconst errorPage = [{ path: \"/:pathMatch(.*)*\", name: \"not-found\", component: Error404 }];\nexport const outsideResource = [\n  {\n    title: \"outside\",\n    name: \"outside\",\n    path: \"/outside\",\n    component: LayoutOutside,\n    children: [\n      {\n        meta: {\n          title: \"登录\",\n        },\n        name: \"login\",\n        path: \"/login\",\n        component: \"/framework/login/index.vue\",\n      },\n      {\n        meta: {\n          title: \"注册\",\n        },\n        name: \"register\",\n        path: \"/register\",\n        component: \"/framework/register/index.vue\",\n      },\n    ],\n  },\n  ...errorPage,\n];\n"
  },
  {
    "path": "packages/ui/certd-client/src/shims-vue.d.ts",
    "content": "declare module \"*.vue\" {\n  import { DefineComponent } from \"vue\";\n  const component: DefineComponent<{}, {}, any>;\n  export default component;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/store/plugin/api.plugin.ts",
    "content": "import { request } from \"/src/api/service\";\nimport * as _ from \"lodash-es\";\nimport { PluginConfigBean, PluginSysSetting } from \"/@/views/sys/plugin/api\";\nconst apiPrefix = \"/pi/plugin\";\n\nconst defaultInputDefine = {\n  component: {\n    name: \"a-input\",\n    vModel: \"modelValue\",\n  },\n};\n\nfunction initPlugins(plugins: any) {\n  const checkedComponents = [\"a-checkbox\", \"a-radio\", \"a-switch\"];\n  for (const plugin of plugins) {\n    for (const key in plugin.input) {\n      const field = _.merge({}, defaultInputDefine, plugin.input[key]);\n      const componentName = field.component.name;\n      if (componentName.startsWith(\"a-\")) {\n        if (checkedComponents.includes(componentName)) {\n          field.component.vModel = \"checked\";\n        } else {\n          field.component.vModel = \"value\";\n        }\n      }\n      //嵌套对象\n      field.key = [\"input\", key];\n      if (field.required) {\n        // delete field.required;\n        if (field.rules == null) {\n          field.rules = [];\n        }\n        field.rules.push({ required: true, message: \"此项必填\" });\n      }\n      plugin.input[key] = field;\n    }\n  }\n}\n\nexport async function GetList(query: any) {\n  const plugins = await request({\n    url: apiPrefix + \"/list\",\n    method: \"post\",\n    params: query,\n  });\n  initPlugins(plugins);\n  return plugins;\n}\n\nexport async function GetGroups(query: any) {\n  const groups = await request({\n    url: apiPrefix + \"/groups\",\n    method: \"post\",\n    params: query,\n  });\n  const plugins: any = [];\n  for (const groupKey in groups) {\n    plugins.push(...groups[groupKey].plugins);\n  }\n  initPlugins(plugins);\n  return groups;\n}\n\nexport async function GetPluginDefine(type: string) {\n  const define = await request({\n    url: apiPrefix + \"/getDefineByType\",\n    method: \"post\",\n    data: {\n      type,\n    },\n  });\n  initPlugins([define]);\n  return define;\n}\n\nexport async function GetPluginConfig(req: { id?: number; name: string; type: string }): Promise<PluginConfigBean> {\n  return await request({\n    url: apiPrefix + \"/config\",\n    method: \"post\",\n    data: req,\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/store/plugin/index.ts",
    "content": "import { defineStore } from \"pinia\";\nimport * as api from \"./api.plugin\";\nimport { DynamicType, FormItemProps } from \"@fast-crud/fast-crud\";\nimport { i18n } from \"/src/locales/i18n\";\ninterface PluginState {\n  group?: PluginGroups;\n}\n\nexport type PluginGroup = {\n  key: string;\n  title: string;\n  desc?: string;\n  order: number;\n  icon: string;\n  plugins: any[];\n};\n\nexport type PluginDefine = {\n  name: string;\n  title: string;\n  desc?: string;\n  shortcut: any;\n  input: {\n    [key: string]: DynamicType<FormItemProps>;\n  };\n  output: {\n    [key: string]: any;\n  };\n};\n\nexport class PluginGroups {\n  groups!: { [key: string]: PluginGroup };\n  map!: { [key: string]: PluginDefine };\n  t: any;\n  constructor(groups: { [key: string]: PluginGroup }) {\n    this.groups = groups;\n    this.t = i18n.global.t;\n    this.initGroup(groups);\n    this.initMap();\n  }\n\n  private initGroup(groups: { [p: string]: PluginGroup }) {\n    const all: PluginGroup = {\n      key: \"all\",\n      title: this.t(\"certd.all\"),\n      order: 0,\n      plugins: [],\n      icon: \"material-symbols:border-all-rounded\",\n    };\n    for (const key in groups) {\n      all.plugins.push(...groups[key].plugins);\n    }\n    this.groups = {\n      all,\n      ...groups,\n    };\n  }\n\n  initMap() {\n    const map: { [key: string]: PluginDefine } = {};\n    for (const key in this.groups) {\n      const group = this.groups[key];\n      for (const plugin of group.plugins) {\n        map[plugin.name] = plugin;\n      }\n    }\n    this.map = map;\n  }\n\n  getGroups() {\n    return this.groups;\n  }\n\n  get(name: string) {\n    return this.map[name];\n  }\n\n  getPreStepOutputOptions({ pipeline, currentStageIndex, currentTaskIndex, currentStepIndex, currentTask }: any) {\n    const steps = this.collectionPreStepOutputs({\n      pipeline,\n      currentStageIndex,\n      currentTaskIndex,\n      currentStepIndex,\n      currentTask,\n    });\n    const options: any[] = [];\n    for (const step of steps) {\n      const stepDefine = this.get(step.type);\n      for (const key in stepDefine?.output) {\n        const inputDefine = stepDefine.output[key];\n        options.push({\n          value: `step.${step.id}.${key}`,\n          label: `${inputDefine.title}【from：${step.title}】`,\n          type: step.type,\n          valueType: inputDefine.type,\n          key: key,\n        });\n      }\n    }\n    return options;\n  }\n\n  collectionPreStepOutputs({ pipeline, currentStageIndex, currentTaskIndex, currentStepIndex, currentTask }: any) {\n    const steps: any[] = [];\n    // 开始放step\n    for (let i = 0; i < currentStageIndex; i++) {\n      const stage = pipeline.stages[i];\n      for (const task of stage.tasks) {\n        for (const step of task.steps) {\n          steps.push(step);\n        }\n      }\n    }\n    //当前阶段之前的task\n    const currentStage = pipeline.stages[currentStageIndex];\n    for (let i = 0; i < currentTaskIndex; i++) {\n      const task = currentStage.tasks[i];\n      for (const step of task.steps) {\n        steps.push(step);\n      }\n    }\n    //放当前任务下的step\n    for (let i = 0; i < currentStepIndex; i++) {\n      const step = currentTask.steps[i];\n      steps.push(step);\n    }\n    return steps;\n  }\n}\n\nexport const usePluginStore = defineStore({\n  id: \"app.plugin\",\n  state: (): PluginState => ({\n    group: null,\n  }),\n  actions: {\n    async reload() {\n      const groups = await api.GetGroups({});\n      this.group = new PluginGroups(groups);\n    },\n    async init() {\n      if (!this.group) {\n        await this.reload();\n      }\n      return this.group;\n    },\n    async getGroups(): Promise<PluginGroups> {\n      await this.init();\n      return this.group as PluginGroups;\n    },\n    async clear() {\n      this.group = null;\n    },\n    async getList(): Promise<PluginDefine[]> {\n      await this.init();\n      return this.group.groups.all.plugins;\n    },\n    async getPluginDefine(name: string): Promise<PluginDefine> {\n      await this.init();\n      return this.group.get(name);\n    },\n    async getPluginConfig(query: any) {\n      return await api.GetPluginConfig(query);\n    },\n    getPluginDefineSync(name: string) {\n      return this.group.get(name);\n    },\n  },\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/store/settings/api.basic.ts",
    "content": "import { request } from \"/src/api/service\";\n\nexport type SiteEnv = {\n  agent?: {\n    enabled?: boolean;\n    contactText?: string;\n    contactLink?: string;\n  };\n};\nexport type AppInfo = {\n  version?: string;\n  time?: number;\n  deltaTime?: number;\n};\nexport type SiteInfo = {\n  title?: string;\n  slogan?: string;\n  logo?: string;\n  loginLogo?: string;\n  icpNo?: string;\n  licenseTo?: string;\n  licenseToUrl?: string;\n};\n\nexport type PlusInfo = {\n  vipType?: string;\n  expireTime?: number;\n  isPlus: boolean;\n  isComm?: boolean;\n};\nexport type SysPublicSetting = {\n  registerEnabled?: boolean;\n  userValidTimeEnabled?: boolean;\n  usernameRegisterEnabled?: boolean;\n  mobileRegisterEnabled?: boolean;\n  emailRegisterEnabled?: boolean;\n  passwordLoginEnabled?: boolean;\n  smsLoginEnabled?: boolean;\n\n  limitUserPipelineCount?: number;\n  managerOtherUserPipeline?: boolean;\n  icpNo?: string;\n  mpsNo?: string;\n  robots?: boolean;\n  aiChatEnabled?: boolean;\n\n  showRunStrategy?: boolean;\n};\nexport type SuiteSetting = {\n  enabled?: boolean;\n};\nexport type SysPrivateSetting = {\n  httpProxy?: string;\n  httpsProxy?: string;\n  dnsResultOrder?: string;\n  commonCnameEnabled?: boolean;\n  sms?: {\n    type?: string;\n    config?: any;\n  };\n};\nexport type SysInstallInfo = {\n  siteId: string;\n};\nexport type MenuItem = {\n  id: string;\n  title: string;\n  icon?: string;\n  path?: string;\n  children?: MenuItem[];\n};\nexport type HeaderMenus = {\n  menus: MenuItem[];\n};\n\nexport type AllSettings = {\n  sysPublic: SysPublicSetting;\n  installInfo: SysInstallInfo;\n  plusInfo: PlusInfo;\n  siteInfo: SiteInfo;\n  siteEnv: SiteEnv;\n  headerMenus: HeaderMenus;\n  suiteSetting: SuiteSetting;\n  app: AppInfo;\n};\n\nexport async function loadAllSettings(): Promise<AllSettings> {\n  return await request({\n    url: \"/basic/settings/all\",\n    method: \"get\",\n  });\n}\n\nexport async function bindUrl(data: any): Promise<any> {\n  return await request({\n    url: \"/sys/plus/bindUrl\",\n    method: \"post\",\n    data,\n  });\n}\n\nexport async function sendSmsCode(data: any): Promise<any> {\n  return await request({\n    url: \"/basic/code/sendSmsCode\",\n    method: \"post\",\n    data,\n  });\n}\n\nexport async function sendEmailCode(data: any): Promise<any> {\n  return await request({\n    url: \"/basic/code/sendEmailCode\",\n    method: \"post\",\n    data,\n  });\n}\n\nexport async function getProductInfo(): Promise<any> {\n  return await request({\n    url: \"/basic/settings/productInfo\",\n    method: \"get\",\n    showErrorNotify: false,\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/store/settings/index.ts",
    "content": "import { defineStore } from \"pinia\";\nimport { Modal, notification } from \"ant-design-vue\";\nimport * as _ from \"lodash-es\";\nimport * as basicApi from \"./api.basic\";\nimport { AppInfo, HeaderMenus, PlusInfo, SiteEnv, SiteInfo, SuiteSetting, SysInstallInfo, SysPublicSetting } from \"./api.basic\";\nimport { useUserStore } from \"../user\";\nimport { mitter } from \"/@/utils/util.mitt\";\nimport { env } from \"/@/utils/util.env\";\nimport { updatePreferences } from \"/@/vben/preferences\";\nimport { useTitle } from \"@vueuse/core\";\nimport { utils } from \"/@/utils\";\nimport { cloneDeep, merge } from \"lodash-es\";\nimport { useI18n } from \"/src/locales\";\nexport interface SettingState {\n  sysPublic?: SysPublicSetting;\n  installInfo?: {\n    siteId: string;\n    installTime?: number;\n    bindUserId?: number;\n    bindUrl?: string;\n    accountServerBaseUrl?: string;\n    appKey?: string;\n  };\n  siteInfo: SiteInfo;\n  plusInfo?: PlusInfo;\n  siteEnv?: SiteEnv;\n  headerMenus?: HeaderMenus;\n  inited?: boolean;\n  suiteSetting?: SuiteSetting;\n  app: {\n    version?: string;\n    time?: number;\n    deltaTime?: number;\n  };\n  productInfo: {\n    notice?: string;\n    plus: {\n      name: string;\n      price: number;\n      price3: number;\n      tooltip?: string;\n    };\n    comm: {\n      name: string;\n      price: number;\n      price3: number;\n      tooltip?: string;\n    };\n  };\n}\n\nconst defaultSiteInfo: SiteInfo = {\n  title: env.TITLE || \"Certd\",\n  slogan: env.SLOGAN || \"让你的证书永不过期\",\n  logo: env.LOGO || \"/static/images/logo/logo.svg\",\n  loginLogo: env.LOGIN_LOGO || \"/static/images/logo/rect-block.svg\",\n  licenseTo: \"\",\n  licenseToUrl: \"\",\n};\nexport const useSettingStore = defineStore({\n  id: \"app.setting\",\n  state: (): SettingState => ({\n    plusInfo: {\n      isPlus: false,\n      vipType: \"free\",\n      isComm: false,\n    },\n    sysPublic: {\n      registerEnabled: false,\n      managerOtherUserPipeline: false,\n      icpNo: env.ICP_NO || \"\",\n    },\n    installInfo: {\n      siteId: \"\",\n      bindUserId: null,\n      bindUrl: \"\",\n      accountServerBaseUrl: \"\",\n      appKey: \"\",\n    },\n    siteInfo: defaultSiteInfo,\n    siteEnv: {\n      agent: {\n        enabled: undefined,\n        contactText: \"\",\n        contactLink: \"\",\n      },\n    },\n    headerMenus: {\n      menus: [],\n    },\n    suiteSetting: { enabled: false },\n    inited: false,\n    app: {\n      version: \"\",\n      time: 0,\n      deltaTime: 0,\n    },\n    productInfo: {\n      notice: \"\",\n      plus: {\n        name: \"专业版\",\n        price: 29.9,\n        price3: 89.9,\n      },\n      comm: {\n        name: \"商业版\",\n        price: 399,\n        price3: 899,\n      },\n    },\n  }),\n  getters: {\n    getSysPublic(): SysPublicSetting {\n      return this.sysPublic;\n    },\n    getInstallInfo(): SysInstallInfo {\n      return this.installInfo;\n    },\n    isPlus(): boolean {\n      return this.plusInfo?.isPlus && this.plusInfo?.expireTime > new Date().getTime();\n    },\n    isComm(): boolean {\n      return this.plusInfo?.isComm && this.plusInfo?.expireTime > new Date().getTime();\n    },\n    isAgent(): boolean {\n      return this.siteEnv?.agent?.enabled === true;\n    },\n    isCommOrAgent() {\n      return this.isComm || this.isAgent;\n    },\n    vipLabel(): string {\n      const { t } = useI18n();\n      const vipLabelMap: any = {\n        free: t(\"vip.label.free\"),\n        plus: t(\"vip.label.plus\"),\n        comm: t(\"vip.label.comm\"),\n      };\n      return vipLabelMap[this.plusInfo?.vipType || \"free\"];\n    },\n    getHeaderMenus(): any[] {\n      // @ts-ignore\n      let menus = this.headerMenus?.menus || [];\n      menus = cloneDeep(menus);\n      return utils.tree.treeMap(menus, (menu: any) => {\n        return {\n          ...menu,\n          name: menu.title,\n          path: menu.path ?? \"/\" + menu.title,\n          meta: {\n            title: menu.title,\n            icon: menu.icon,\n            link: menu.path,\n            order: 99999,\n          },\n        };\n      });\n    },\n    isSuiteEnabled(): boolean {\n      // @ts-ignore\n      return this.suiteSetting?.enabled === true;\n    },\n  },\n  actions: {\n    checkPlus() {\n      if (!this.isPlus) {\n        notification.warn({\n          message: \"此为专业版功能，请先升级到专业版\",\n        });\n        throw new Error(\"此为专业版功能，请升级到专业版\");\n      }\n    },\n    async loadSysSettings() {\n      const allSettings = await basicApi.loadAllSettings();\n      _.merge(this.sysPublic, allSettings.sysPublic || {});\n      _.merge(this.installInfo, allSettings.installInfo || {});\n      _.merge(this.siteEnv, allSettings.siteEnv || {});\n      _.merge(this.plusInfo, allSettings.plusInfo || {});\n      _.merge(this.headerMenus, allSettings.headerMenus || {});\n      _.merge(this.suiteSetting, allSettings.suiteSetting || {});\n      //@ts-ignore\n      this.initSiteInfo(allSettings.siteInfo || {});\n      this.initAppInfo(allSettings.app || {});\n    },\n    initAppInfo(appInfo: AppInfo) {\n      this.app.time = appInfo.time;\n      this.app.version = appInfo.version;\n      this.app.deltaTime = new Date().getTime() - this.app.time;\n    },\n    initSiteInfo(siteInfo: SiteInfo) {\n      //@ts-ignore\n      if (this.isComm) {\n        if (siteInfo.logo) {\n          siteInfo.logo = `api/basic/file/download?key=${siteInfo.logo}`;\n        }\n        if (siteInfo.loginLogo) {\n          siteInfo.loginLogo = `api/basic/file/download?key=${siteInfo.loginLogo}`;\n        }\n      }\n      this.siteInfo = _.merge({}, defaultSiteInfo, siteInfo);\n\n      if (this.siteInfo.logo) {\n        updatePreferences({\n          logo: {\n            source: this.siteInfo.logo,\n          },\n        });\n      }\n      if (this.siteInfo.title) {\n        updatePreferences({\n          app: {\n            name: this.siteInfo.title,\n          },\n        });\n        useTitle(this.siteInfo.title);\n      }\n    },\n    getBaseUrl() {\n      let url = window.location.href;\n      //只要hash前面的部分\n      url = url.split(\"#\")[0];\n      return url;\n    },\n    async doBindUrl() {\n      const url = this.getBaseUrl();\n      await basicApi.bindUrl({ url });\n      await this.loadSysSettings();\n    },\n    async checkUrlBound() {\n      const userStore = useUserStore();\n      const settingStore = useSettingStore();\n      if (!userStore.isAdmin) {\n        return;\n      }\n\n      const bindUrl = this.installInfo.bindUrl;\n\n      if (!bindUrl) {\n        //绑定url\n        await this.doBindUrl();\n      } else {\n        //检查当前url 是否与绑定的url一致\n        const url = window.location.href;\n        if (!url.startsWith(bindUrl)) {\n          Modal.confirm({\n            title: \"URL地址有变化\",\n            content: \"以后都用这个新地址访问本系统吗？\",\n            onOk: async () => {\n              await this.doBindUrl();\n            },\n            okText: \"是的，继续\",\n            cancelText: \"不是，回到原来的地址\",\n            onCancel: () => {\n              window.location.href = bindUrl;\n            },\n          });\n        }\n      }\n    },\n    async loadProductInfo() {\n      try {\n        const productInfo = await basicApi.getProductInfo();\n        merge(this.productInfo, productInfo);\n      } catch (e) {\n        console.error(e);\n      }\n    },\n    async init() {\n      await this.loadSysSettings();\n    },\n    async initOnce() {\n      if (this.inited) {\n        return;\n      }\n      await this.init();\n      this.loadProductInfo();\n      this.inited = true;\n    },\n  },\n});\n\nmitter.on(\"app.login\", async () => {\n  await useSettingStore().init();\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/store/user/api.user.ts",
    "content": "import { request } from \"/src/api/service\";\n\nexport interface RegisterReq {\n  username: string;\n  password: string;\n  confirmPassword: string;\n}\n/**\n * @description: Login interface parameters\n */\nexport interface LoginReq {\n  username: string;\n  password: string;\n}\n\nexport interface SmsLoginReq {\n  mobile: string;\n  phoneCode: string;\n  smsCode: string;\n  randomStr: string;\n}\n\nexport interface UserInfoRes {\n  id: string | number;\n  username: string;\n  nickName: string;\n  avatar?: string;\n  roleIds: number[];\n  isWeak?: boolean;\n  validTime?: number;\n  status?: number;\n}\n\nexport interface LoginRes {\n  token: string;\n  expire: number;\n}\n\nexport async function register(user: RegisterReq): Promise<UserInfoRes> {\n  return await request({\n    url: \"/register\",\n    method: \"post\",\n    data: user,\n  });\n}\nexport async function logout() {\n  return await request({\n    url: \"/logout\",\n    method: \"post\",\n  });\n}\n\nexport async function login(data: LoginReq): Promise<LoginRes> {\n  //如果开启了登录与权限模块，则真实登录\n  return await request({\n    url: \"/login\",\n    method: \"post\",\n    data,\n  });\n}\n\nexport async function loginBySms(data: SmsLoginReq): Promise<LoginRes> {\n  //如果开启了登录与权限模块，则真实登录\n  return await request({\n    url: \"/loginBySms\",\n    method: \"post\",\n    data,\n  });\n}\n\nexport async function mine(): Promise<UserInfoRes> {\n  return await request({\n    url: \"/mine/info\",\n    method: \"post\",\n  });\n}\n\nexport async function loginByTwoFactor(data: any) {\n  return await request({\n    url: \"/loginByTwoFactor\",\n    method: \"post\",\n    data,\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/store/user/index.ts",
    "content": "import { defineStore } from \"pinia\";\nimport router from \"../../router\";\n// @ts-ignore\nimport { LocalStorage } from \"/src/utils/util.storage\";\n// @ts-ignore\nimport * as UserApi from \"./api.user\";\nimport { RegisterReq, SmsLoginReq } from \"./api.user\";\n// @ts-ignore\nimport { LoginReq, UserInfoRes } from \"/@/store/user/api.user\";\nimport { message, Modal, notification } from \"ant-design-vue\";\nimport { useI18n } from \"vue-i18n\";\n\nimport { mitter } from \"/src/utils/util.mitt\";\nimport { resetAllStores, useAccessStore } from \"/@/vben/stores\";\n\nimport { useUserStore as vbenUserStore } from \"/@/vben/stores/modules/user\";\n\ninterface UserState {\n  userInfo: Nullable<UserInfoRes>;\n  token?: string;\n}\n\nconst USER_INFO_KEY = \"USER_INFO\";\nconst TOKEN_KEY = \"TOKEN\";\nexport const useUserStore = defineStore({\n  id: \"app.user\",\n  state: (): UserState => ({\n    // user info\n    userInfo: null,\n    // token\n    token: undefined,\n  }),\n  getters: {\n    getUserInfo(): UserInfoRes {\n      return this.userInfo || LocalStorage.get(USER_INFO_KEY) || {};\n    },\n    getToken(): string {\n      return this.token || LocalStorage.get(TOKEN_KEY);\n    },\n    isAdmin(): boolean {\n      return this.getUserInfo.roleIds?.includes(1) || this.getUserInfo.id === 1;\n    },\n  },\n  actions: {\n    setToken(token: string, expire: number) {\n      this.token = token;\n      const accessStore = useAccessStore();\n      accessStore.setAccessToken(token);\n      LocalStorage.set(TOKEN_KEY, this.token, expire);\n    },\n    setUserInfo(info: UserInfoRes) {\n      this.userInfo = info;\n      const userStore = vbenUserStore();\n      userStore.setUserInfo(info as any);\n      LocalStorage.set(USER_INFO_KEY, info);\n    },\n    resetState() {\n      this.userInfo = null;\n      this.token = \"\";\n      LocalStorage.remove(TOKEN_KEY);\n      LocalStorage.remove(USER_INFO_KEY);\n    },\n    async register(user: RegisterReq) {\n      await UserApi.register(user);\n      notification.success({\n        message: \"注册成功，请登录\",\n      });\n      await router.replace(\"/login\");\n    },\n    /**\n     * @description: login\n     */\n    async login(loginType: string, params: LoginReq | SmsLoginReq): Promise<any> {\n      let loginRes: any = null;\n      if (loginType === \"sms\") {\n        loginRes = await UserApi.loginBySms(params as SmsLoginReq);\n      } else {\n        loginRes = await UserApi.login(params as LoginReq);\n      }\n      return await this.onLoginSuccess(loginRes);\n    },\n\n    async loginByTwoFactor(form: any) {\n      const loginRes = await UserApi.loginByTwoFactor(form);\n      return await this.onLoginSuccess(loginRes);\n    },\n    async getUserInfoAction(): Promise<UserInfoRes> {\n      const userInfo = await UserApi.mine();\n      this.setUserInfo(userInfo);\n      return userInfo;\n    },\n\n    async loadUserInfo() {\n      await this.getUserInfoAction();\n    },\n\n    async onLoginSuccess(loginData: any) {\n      const { token, expire } = loginData;\n      // save token\n      this.setToken(token, expire);\n      // get user info\n      // await this.getUserInfoAction();\n      // const userInfo = await this.getUserInfoAction();\n      mitter.emit(\"app.login\", { ...loginData });\n      await router.replace(\"/\");\n    },\n\n    /**\n     * @description: logout\n     */\n    async logout(goLogin = true, from401 = false) {\n      this.resetState();\n      resetAllStores();\n      if (!from401) {\n        await UserApi.logout(); //主要是清空cookie\n      }\n      goLogin && router.push(\"/login\");\n      mitter.emit(\"app.logout\");\n    },\n\n    /**\n     * @description: Confirm before logging out\n     */\n    confirmLoginOut() {\n      const { t } = useI18n();\n      Modal.confirm({\n        iconType: \"warning\",\n        title: t(\"app.login.logoutTip\"),\n        content: t(\"app.login.logoutMessage\"),\n        onOk: async () => {\n          await this.logout(true);\n        },\n      });\n    },\n  },\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/style/antdv4.less",
    "content": ".ant-layout .ant-layout-sider {\n  background-color: #ebf1f6;\n}\n\n.ant-layout .ant-layout-header {\n  background-color: #ebf1f6;\n}\n\n.fs-multiple-page-control-group .fs-multiple-page-control-content {\n  overflow-y: hidden;\n}\n\n.fs-multiple-page-control-group .fs-multiple-page-control-btn .ant-btn {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.ant-menu-horizontal {\n  border-bottom: 0;\n}\n\n.fs-framework .header-menu {\n  overflow-y: hidden;\n}\n\n.ant-btn.ant-btn-icon-only {\n  padding-inline: revert;\n}\n\n.fs-form-wrapper .fs-form-header {\n  padding-right: 30px !important;\n}\n\n.fs-values-format .fs-tag {\n  display: inline-flex;\n  .fs-icon {\n    margin-right: 3px;\n  }\n}\n\n.fs-search .ant-row {\n}\n\n//适配手机端\n.ant-tour {\n  max-width: 90vw;\n}\n\n.fs-page {\n  .fs-page-header {\n    background-color: hsl(var(--card));\n  }\n  .fs-crud-table {\n    background-color: hsl(var(--card));\n  }\n}\n\nfooter {\n  background-color: hsl(var(--card)) !important;\n}\n\n.ant-select-multiple .ant-select-selection-item-remove {\n  display: flex;\n  align-items: center;\n}\n\n.ant-progress.ant-progress-show-info .ant-progress-outer {\n  margin-inline-end: calc(-3em - 8px);\n  padding-inline-end: calc(3em + 8px);\n}\n\n\n.ant-progress .ant-progress-text{\n  width:3em;\n}"
  },
  {
    "path": "packages/ui/certd-client/src/style/certd.less",
    "content": ".fs-iconify.fs-icon {\n  display: inline-flex;\n  justify-content: center;\n  align-items: center;\n  font-size: 16px;\n}\n.fs-icon {\n  font-size: 16px;\n}\n\n.ant-btn {\n  display: inline-flex;\n  justify-content: center;\n  align-items: center;\n  .fs-iconify {\n    margin-right: 5px;\n  }\n}\n\n.cd-icon-button {\n  display: inline-flex;\n  justify-content: center;\n  align-items: center;\n  cursor: pointer;\n}\n\n.cd-flex {\n  display: flex;\n  justify-content: left;\n  align-items: center;\n}\n\n.cd-flex-inline {\n  display: inline-flex;\n  justify-content: left;\n  align-items: center;\n}\n\n.ant-drawer-content {\n  &.fullscreen {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    width: 100%;\n    height: 100%;\n    background: #fff;\n  }\n}\n\n.icon-button {\n  cursor: pointer;\n  font-size: 22px;\n}\n\n.ant-drawer {\n  .ant-drawer-header-title {\n    display: flex;\n    align-items: center;\n\n    .ant-drawer-title {\n      flex: 1;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n    }\n  }\n}\n\n.settings-form {\n  width: 800px;\n  margin: 20px;\n}\n\n.fs-crud-table {\n  .ant-table-body {\n    height: 60vh;\n    table {\n    }\n  }\n}\n\nbody a {\n  color: #1890ff;\n  &:hover {\n    color: #40a9ff;\n  }\n}\n\nspan.fs-icon-svg {\n  display: inline-flex;\n  align-items: center;\n}\n\n.ant-btn .fs-icon:last-child {\n  margin-right: 0px;\n}\n\n.fs-iconify fs-icon {\n  svg {\n    vertical-align: 0 !important;\n  }\n}\n\n.fs-button {\n  span {\n    &:first-child {\n      margin-right: 5px;\n    }\n    &:last-child {\n      margin-left: 5px;\n    }\n  }\n  .fs-icon,\n  .fs-button-icon {\n    margin: 0 !important;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/style/common.less",
    "content": "//@import \"./theme/index.less\";\n//@import \"./theme/default.less\";\n@import \"./scroll.less\";\n@import \"./transition.less\";\n@import \"./fix-windicss.less\";\n@import \"./antdv4.less\";\n@import \"./certd.less\";\n\nhtml,\nbody {\n  margin: 0;\n  padding: 0;\n  height: 100%;\n  width: 100%;\n  box-sizing: border-box;\n}\n\ndiv#app {\n  height: 100%;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  margin-bottom: 0;\n  margin-top: 0;\n}\n\n.fs-desc {\n  font-size: 12px;\n  color: #888888;\n  margin-left: 5px;\n  margin-right: 5px;\n}\n\n.ant-btn-link {\n  height: 24px;\n}\n\n.ant-input-affix-wrapper {\n  padding: 4px 11px;\n}\n\n.anticon {\n  vertical-align: 0 !important;\n}\n\n.pointer {\n  cursor: pointer;\n}\n\n.flex-center {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n.flex-vc {\n  align-items: center;\n}\n.flex-vb {\n  align-items: baseline;\n}\n.flex-o {\n  display: flex !important;\n  align-items: center;\n}\n.flex-baseline {\n  display: flex !important;\n  align-items: baseline;\n}\n\n.flex-between {\n  display: flex;\n  justify-content: space-between;\n  align-items: baseline;\n}\n\n.flex {\n  display: flex;\n}\n.flex-inline {\n  display: inline-flex;\n  align-items: center;\n}\n\n.flex-1 {\n  flex: 1;\n}\n.flex-0 {\n  flex: 0;\n}\n\n.flex-col {\n  display: flex;\n  flex-direction: column;\n}\n.align-left {\n  text-align: left;\n}\n.align-right {\n  text-align: right;\n}\n\n.scroll-y {\n  overflow-y: auto;\n}\n.m-0 {\n  margin: 0 !important;\n}\n.m-2 {\n  margin: 2px !important;\n}\n.m-3 {\n  margin: 3px !important;\n}\n.m-5 {\n  margin: 5px !important;\n}\n.m-10 {\n  margin: 10px !important;\n}\n\n.m-20 {\n  margin: 20px !important;\n}\n.mb-2 {\n  margin-bottom: 2px !important;\n}\n\n.mb-5 {\n  margin-bottom: 5px !important;\n}\n.ml-5 {\n  margin-left: 5px !important;\n}\n\n.ml-10 {\n  margin-left: 10px !important;\n}\n\n.ml-20 {\n  margin-left: 20px !important;\n}\n\n.ml-15 {\n  margin-left: 15px !important;\n}\n\n.mr-5 {\n  margin-right: 5px !important;\n}\n\n.mr-10 {\n  margin-right: 10px !important;\n}\n\n.mr-20 {\n  margin-right: 20px !important;\n}\n\n.mr-15 {\n  margin-right: 15px !important;\n}\n\n.mt-5 {\n  margin-top: 5px !important;\n}\n\n.mt-10 {\n  margin-top: 10px !important;\n}\n\n.mb-10 {\n  margin-bottom: 10px !important;\n}\n\n.p-5 {\n  padding: 5px !important;\n}\n\n.p-10 {\n  padding: 10px !important;\n}\n\n.p-20 {\n  padding: 20px !important;\n}\n.ellipsis {\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.w-100 {\n  width: 100%;\n}\n\n.h-100 {\n  height: 100%;\n}\n\n.overflow-hidden {\n  overflow: hidden;\n}\n\n.block-header {\n  margin: 3px;\n  padding-top: 15px;\n  padding-bottom: 3px;\n  border-bottom: 1px solid #dedede;\n}\n\n.color-plus {\n  color: #c5913f;\n}\n.color-blue {\n  color: #1890ff;\n}\n\n.color-red {\n  color: red;\n}\n\n.color-green {\n  color: green;\n}\n.color-gray {\n  color: gray;\n}\n\n.iconify {\n  //font-size: 16px;\n}\n\n.icon-box {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n\n  .fs-icon {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n}\n\n.need-plus {\n  color: #c5913f !important;\n}\n\n.deleted {\n  color: #c7c7c7;\n  //删除线\n  text-decoration: line-through;\n}\n\n.cursor-move {\n  cursor: move !important;\n}\n\n.cursor-pointer {\n  cursor: pointer;\n}\n\n.helper {\n  color: #aeaeae;\n  font-size: 12px;\n  margin-top: 3px;\n  margin-bottom: 3px;\n  &.error {\n    color: #ff4d4f;\n  }\n}\n\n.fs-copyable {\n  display: inline-flex;\n  .text {\n    flex: 1;\n  }\n\n  .copy-button {\n    position: relative !important;\n    /* right: 0; */\n  }\n}\n\n.fs-16 {\n  font-size: 16px;\n}\n\n.w-50\\% {\n  width: 50%;\n}\n\n.ant-drawer-content-wrapper {\n  max-width: 90vw;\n}\n\n.block-title {\n  font-size: 14px;\n  padding: 10px;\n  color: #6e6e6e;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/style/fix-windicss.less",
    "content": "img.ant-image-preview-img {\n  display: initial;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/style/scroll.less",
    "content": "::-webkit-scrollbar {\n  width: 8px;\n  height: 8px;\n}\n\n::-webkit-scrollbar-track {\n  width: 8px;\n  background: rgba(#101f1c, 0.1);\n  -webkit-border-radius: 2em;\n  -moz-border-radius: 2em;\n  border-radius: 2em;\n}\n\n::-webkit-scrollbar-thumb {\n  // background-color: rgba(#101F1C, 0.5);\n  background-clip: padding-box;\n  min-height: 28px;\n  -webkit-border-radius: 2em;\n  -moz-border-radius: 2em;\n  border-radius: 2em;\n  background-color: #b3b3b3;\n  box-shadow: 0px 1px 1px #eee inset;\n}\n\n::-webkit-scrollbar-thumb:hover {\n  //background-color: rgba(#101F1C, 1);\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/style/tailwind.less",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n"
  },
  {
    "path": "packages/ui/certd-client/src/style/transition.less",
    "content": "//.v-enter-from,\n//.v-leave-to {\n//  opacity: 0;\n//}\n//\n//.v-leave-from,\n//.v-enter-to {\n//  opacity: 1;\n//}\n// 过渡动画 横向渐变\n.fade-transverse-leave-active,\n.fade-transverse-enter-active {\n  transition: all 0.5s;\n}\n.fade-transverse-enter-from {\n  opacity: 0;\n  transform: translateX(-30px);\n}\n.fade-transverse-leave-to {\n  opacity: 0;\n  transform: translateX(30px);\n}\n\n// 过渡动画 缩放渐变\n.fade-scale-leave-active,\n.fade-scale-enter-active {\n  transition: all 0.3s;\n}\n.fade-scale-enter {\n  opacity: 0;\n  transform: scale(1.2);\n}\n.fade-scale-leave-to {\n  opacity: 0;\n  transform: scale(0.8);\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/style.css",
    "content": "/*占位，勿删*/\n"
  },
  {
    "path": "packages/ui/certd-client/src/types/global.d.ts",
    "content": "import type { ComponentRenderProxy, VNode, ComponentPublicInstance, FunctionalComponent, PropType as VuePropType } from \"vue\";\n\ndeclare global {\n  const __APP_INFO__: {\n    pkg: {\n      name: string;\n      version: string;\n      dependencies: Recordable<string>;\n      devDependencies: Recordable<string>;\n    };\n    lastBuildTime: string;\n  };\n  declare interface Window {\n    // Global vue app instance\n    __APP__: App<Element>;\n  }\n\n  // vue\n  declare type PropType<T> = VuePropType<T>;\n\n  export type Writable<T> = {\n    -readonly [P in keyof T]: T[P];\n  };\n\n  declare type Nullable<T> = T | null;\n  declare type NonNullable<T> = T extends null | undefined ? never : T;\n  declare type Recordable<T = any> = Record<string, T>;\n  declare type ReadonlyRecordable<T = any> = {\n    readonly [key: string]: T;\n  };\n  declare type Indexable<T = any> = {\n    [key: string]: T;\n  };\n  declare type DeepPartial<T> = {\n    [P in keyof T]?: DeepPartial<T[P]>;\n  };\n  declare type TimeoutHandle = ReturnType<typeof setTimeout>;\n  declare type IntervalHandle = ReturnType<typeof setInterval>;\n\n  declare interface ChangeEvent extends Event {\n    target: HTMLInputElement;\n  }\n\n  declare interface WheelEvent {\n    path?: EventTarget[];\n  }\n  interface ImportMetaEnv extends ViteEnv {\n    __: unknown;\n  }\n\n  declare interface ViteEnv {\n    VITE_PORT: number;\n    VITE_USE_MOCK: boolean;\n    VITE_USE_PWA: boolean;\n    VITE_PUBLIC_PATH: string;\n    VITE_PROXY: [string, string][];\n    VITE_GLOB_APP_TITLE: string;\n    VITE_GLOB_APP_SHORT_NAME: string;\n    VITE_USE_CDN: boolean;\n    VITE_DROP_CONSOLE: boolean;\n    VITE_BUILD_COMPRESS: \"gzip\" | \"brotli\" | \"none\";\n    VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE: boolean;\n    VITE_LEGACY: boolean;\n    VITE_USE_IMAGEMIN: boolean;\n    VITE_GENERATE_UI: string;\n  }\n\n  declare function parseInt(s: string | number, radix?: number): number;\n\n  declare function parseFloat(string: string | number): number;\n\n  namespace JSX {\n    // tslint:disable no-empty-interface\n    type Element = VNode;\n    // tslint:disable no-empty-interface\n    type ElementClass = ComponentRenderProxy;\n    interface ElementAttributesProperty {\n      $props: any;\n    }\n    interface IntrinsicElements {\n      [elem: string]: any;\n    }\n    interface IntrinsicAttributes {\n      [elem: string]: any;\n    }\n  }\n}\n\ndeclare module \"vue\" {\n  export type JSXComponent<Props = any> = { new (): ComponentPublicInstance<Props> } | FunctionalComponent<Props>;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/use/use-modal.ts",
    "content": "import { inject } from \"vue\";\nimport type { ModalStaticFunctions } from \"ant-design-vue/es/modal/confirm\";\nimport { ModalFuncWithRef } from \"ant-design-vue/es/modal/useModal\";\n\nexport function useModal(): ModalStaticFunctions<ModalFuncWithRef> {\n  return inject(\"modal\");\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/use/use-refrence.tsx",
    "content": "import * as _ from \"lodash-es\";\nimport { asyncCompute, compute } from \"@fast-crud/fast-crud\";\nimport { computed } from \"vue\";\n\nexport type MergeScriptContext = {\n  compute: typeof compute;\n  asyncCompute: typeof asyncCompute;\n  computed: typeof computed;\n};\n\nexport function useReference(formItem: any) {\n  if (formItem.mergeScript) {\n    const ctx = {\n      compute,\n      asyncCompute,\n      computed,\n    };\n    const script = formItem.mergeScript;\n    const func = new Function(\"ctx\", script);\n    const merged = func(ctx);\n    _.merge(formItem, merged);\n\n    delete formItem.mergeScript;\n  }\n  //helper\n  if (formItem.helper && typeof formItem.helper === \"string\") {\n    //正则表达式替换 [name](url) 成 <a href=\"url\" >\n    let helper = formItem.helper.replace(/\\[(.*)\\]\\((.*)\\)/g, '<a href=\"$2\" target=\"_blank\">$1</a>');\n    helper = helper.replace(/\\n/g, \"<br/>\");\n    formItem.helper = {\n      render: () => {\n        return <div innerHTML={helper}></div>;\n      },\n    };\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/utils/index.ts",
    "content": "import * as envs from \"./util.env\";\nimport * as sites from \"./util.site\";\nimport * as storages from \"./util.storage\";\nimport commons from \"./util.common\";\nimport * as mitt from \"./util.mitt\";\nimport { routerUtils } from \"./util.router\";\nimport { treeUtils } from \"./util.tree\";\nimport { hashUtils } from \"./util.hash\";\nimport { amountUtils } from \"./util.amount\";\nimport { cache } from \"./util.cache\";\nexport const util = {\n  ...envs,\n  ...sites,\n  ...storages,\n  ...commons,\n  ...mitt,\n  router: routerUtils,\n  tree: treeUtils,\n  hash: hashUtils,\n  amount: amountUtils,\n  cache,\n};\nexport const utils = util;\n"
  },
  {
    "path": "packages/ui/certd-client/src/utils/util.amount.ts",
    "content": "export const amountUtils = {\n  toCent(amount: number): number {\n    return parseInt((amount * 100).toFixed(0));\n  },\n\n  toYuan(amount: number): number {\n    return parseFloat((amount / 100).toFixed(2));\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/utils/util.cache.ts",
    "content": "export class Cache {\n  bucket: Record<string, any> = {};\n\n  async get(key: string) {\n    return this.bucket[key];\n  }\n\n  async set(key: string, value: any, ttl?: number) {\n    this.bucket[key] = value;\n  }\n\n  async del(key: string) {\n    delete this.bucket[key];\n  }\n}\n\nexport const cache = new Cache();\n"
  },
  {
    "path": "packages/ui/certd-client/src/utils/util.common.ts",
    "content": "import { isArray } from \"lodash-es\";\nexport default {\n  arrayToMap(array: any) {\n    if (!array) {\n      return {};\n    }\n    if (!isArray(array)) {\n      return array;\n    }\n    const map: any = {};\n    for (const item of array) {\n      if (item.key) {\n        map[item.key] = item;\n      }\n    }\n    return map;\n  },\n  mapToArray(map: any) {\n    if (!map) {\n      return [];\n    }\n    if (isArray(map)) {\n      return map;\n    }\n    const array: any = [];\n    for (const key in map) {\n      const item = map[key];\n      item.key = key;\n      array.push(item);\n    }\n    return array;\n  },\n\n  async sleep(ms: number) {\n    return new Promise(resolve => setTimeout(resolve, ms));\n  },\n\n  maxLength(str?: string, length = 100) {\n    if (str) {\n      return str.length > length ? str.slice(0, length) + \"...\" : str;\n    }\n    return \"\";\n  },\n  transformLink(desc: string = \"\") {\n    if (!desc) {\n      return \"\";\n    }\n    return desc.replace(/\\[(.*)\\]\\((.*)\\)/g, '<a href=\"$2\" target=\"_blank\">$1</a>');\n  },\n\n  randomString(length: number) {\n    const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n    let result = \"\";\n    for (let i = 0; i < length; i++) {\n      result += chars.charAt(Math.floor(Math.random() * chars.length));\n    }\n    return result;\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/utils/util.env.ts",
    "content": "import { forEach } from \"lodash-es\";\nexport function getEnvValue(key: string) {\n  // @ts-ignore\n  return import.meta.env[\"VITE_APP_\" + key];\n}\n\nexport class EnvConfig {\n  MODE: string = import.meta.env.MODE;\n  API: string = import.meta.env.VITE_APP_API;\n  STORAGE: string = import.meta.env.VITE_APP_STORAGE;\n  TITLE: string = import.meta.env.VITE_APP_TITLE;\n  SLOGAN: string = import.meta.env.VITE_APP_SLOGAN;\n  LOGO: string = import.meta.env.VITE_APP_LOGO;\n  LOGIN_LOGO: string = import.meta.env.VITE_APP_LOGIN_LOGO;\n  ICP_NO: string = import.meta.env.VITE_APP_ICP_NO;\n  COPYRIGHT_YEAR: string = import.meta.env.VITE_APP_COPYRIGHT_YEAR;\n  COPYRIGHT_NAME: string = import.meta.env.VITE_APP_COPYRIGHT_NAME;\n  COPYRIGHT_URL: string = import.meta.env.VITE_APP_COPYRIGHT_URL;\n  PM_ENABLED: string = import.meta.env.VITE_APP_PM_ENABLED;\n\n  init(env: any) {\n    for (const key in this) {\n      if (this.hasOwnProperty(key)) {\n        this[key] = env[key];\n      }\n    }\n  }\n\n  get(key: string, defaultValue: string) {\n    //@ts-ignore\n    return this[key] ?? defaultValue;\n  }\n  isDev() {\n    return this.MODE === \"development\" || this.MODE === \"debug\";\n  }\n  isProd() {\n    return this.MODE === \"production\";\n  }\n}\n\nexport const env = new EnvConfig();\n"
  },
  {
    "path": "packages/ui/certd-client/src/utils/util.hash.ts",
    "content": "export const hashUtils = {\n  md5(data: string) {\n    throw new Error(\"Not implemented\");\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/utils/util.mitt.ts",
    "content": "import mitt from \"mitt\";\nexport const mitter = mitt();\n"
  },
  {
    "path": "packages/ui/certd-client/src/utils/util.router.ts",
    "content": "import router from \"/@/router\";\n\nasync function open(path: any) {\n  if (path == null) {\n    return;\n  }\n  if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) {\n    window.open(path);\n    return;\n  }\n  try {\n    const navigationResult = await router.push(path);\n    if (navigationResult) {\n      // 导航被阻止\n    } else {\n      // 导航成功 (包括重新导航的情况)\n    }\n  } catch (e) {\n    console.error(\"导航失败\", e);\n  }\n}\n\nexport const routerUtils = {\n  open,\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/utils/util.site.ts",
    "content": "import { env } from \"./util.env\";\nexport const site = {\n  /**\n   * @description 更新标题\n   * @param titleText\n   */\n  title: function (titleText: string, baseTitle?: string) {\n    const processTitle = baseTitle || env.TITLE || \"Certd\";\n    window.document.title = `${processTitle}${titleText ? ` | ${titleText}` : \"\"}`;\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/utils/util.storage.ts",
    "content": "import { env } from \"./util.env\";\nfunction isNullOrUnDef(value: any) {\n  return value == null;\n}\nconst DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7;\nexport interface CreateStorageParams {\n  prefixKey: string;\n  storage: Storage;\n  timeout?: number;\n}\n\n/**\n *Cache class\n *Construction parameters can be passed into sessionStorage, localStorage,\n * @class Cache\n * @example\n */\nexport class WebStorage {\n  private storage: Storage;\n  private prefixKey?: string;\n  private timeout?: number;\n  /**\n   *\n   * @param option\n   */\n  constructor(option: Partial<CreateStorageParams>) {\n    this.storage = option.storage ?? localStorage;\n    this.prefixKey = option.prefixKey ?? getStorageShortName();\n    this.timeout = option.timeout ?? DEFAULT_CACHE_TIME;\n  }\n\n  private getKey(key: string) {\n    return `${this.prefixKey}${key}`.toUpperCase();\n  }\n\n  /**\n   *\n   *  Set cache\n   * @param {string} key\n   * @param {*} value\n   * @param expire\n   * @expire Expiration time in seconds\n   * @memberof Cache\n   */\n  set(key: string, value: any, expire: number | undefined = this.timeout) {\n    const stringData = JSON.stringify({\n      value,\n      time: Date.now(),\n      expire: expire != null ? new Date().getTime() + expire * 1000 : null,\n    });\n    this.storage.setItem(this.getKey(key), stringData);\n  }\n\n  /**\n   *Read cache\n   * @param {string} key\n   * @param def\n   * @memberof Cache\n   */\n  get(key: string, def: any = null): any {\n    const val = this.storage.getItem(this.getKey(key));\n    if (!val) return def;\n\n    try {\n      const data = JSON.parse(val);\n      const { value, expire } = data;\n      if (isNullOrUnDef(expire) || expire >= new Date().getTime()) {\n        return value;\n      }\n      this.remove(key);\n    } catch (e) {\n      return def;\n    }\n  }\n\n  /**\n   * Delete cache based on key\n   * @param {string} key\n   * @memberof Cache\n   */\n  remove(key: string) {\n    this.storage.removeItem(this.getKey(key));\n  }\n\n  /**\n   * Delete all caches of this instance\n   */\n  clear(): void {\n    this.storage.clear();\n  }\n}\nexport const createStorage = (option: Partial<CreateStorageParams> = {}): WebStorage => {\n  return new WebStorage(option);\n};\n\nexport type Options = Partial<CreateStorageParams>;\n\nfunction getStorageShortName() {\n  return env.MODE + \"_\" + env.get(\"STORAGE\", \"certd\") + \"_\";\n}\n\nexport const createSessionStorage = (options: Options = {}): WebStorage => {\n  return createStorage({ storage: sessionStorage, ...options });\n};\n\nexport const createLocalStorage = (options: Options = {}): WebStorage => {\n  return createStorage({ storage: localStorage, timeout: DEFAULT_CACHE_TIME, ...options });\n};\n\nexport const SessionStorage = createSessionStorage();\nexport const LocalStorage = createLocalStorage();\n\nexport default WebStorage;\n"
  },
  {
    "path": "packages/ui/certd-client/src/utils/util.tree.ts",
    "content": "export function eachTree(tree: any[], callback: (item: any) => void) {\n  tree.forEach(item => {\n    callback(item);\n    if (item.children) {\n      eachTree(item.children, callback);\n    }\n  });\n}\n\nexport function treeMap(tree: any[], mapFunc: (item: any) => {}) {\n  return tree.map((item: any) => {\n    const newItem: any = mapFunc(item);\n    if (item.children) {\n      newItem.children = treeMap(item.children, mapFunc);\n    }\n    return newItem;\n  });\n}\n\nexport const treeUtils = {\n  eachTree,\n  treeMap,\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/access/access-control.vue",
    "content": "<!--\n Access control component for fine-grained access control.\n TODO: 可以扩展更完善的功能：\n 1. 支持多个权限码，只要有一个权限码满足即可 或者 多个权限码全部满足\n 2. 支持多个角色，只要有一个角色满足即可 或者 多个角色全部满足\n 3. 支持自定义权限码和角色的判断逻辑\n-->\n<script lang=\"ts\" setup>\nimport { computed } from \"vue\";\n\nimport { useAccess } from \"./use-access\";\n\ninterface Props {\n  /**\n   * Specified codes is visible\n   * @default []\n   */\n  codes?: string[];\n\n  /**\n   * 通过什么方式来控制组件，如果是 role，则传入角色，如果是 code，则传入权限码\n   * @default 'role'\n   */\n  type?: \"code\" | \"role\";\n}\n\ndefineOptions({\n  name: \"AccessControl\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  codes: () => [],\n  type: \"role\",\n});\n\nconst { hasAccessByCodes, hasAccessByRoles } = useAccess();\n\nconst hasAuth = computed(() => {\n  const { codes, type } = props;\n  return type === \"role\" ? hasAccessByRoles(codes) : hasAccessByCodes(codes);\n});\n</script>\n\n<template>\n  <slot v-if=\"!codes\"></slot>\n  <slot v-else-if=\"hasAuth\"></slot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/access/accessible.ts",
    "content": "import type { AccessModeType, GenerateMenuAndRoutesOptions, RouteRecordRaw } from \"/@/vben/types\";\n\nimport { cloneDeep, generateMenus, generateRoutesByBackend, generateRoutesByFrontend, mapTree } from \"/@/vben/utils\";\n\nasync function generateAccessible(mode: AccessModeType, options: GenerateMenuAndRoutesOptions) {\n  const { router } = options;\n\n  options.routes = cloneDeep(options.routes);\n  // 生成路由\n  const accessibleRoutes = await generateRoutes(mode, options);\n\n  const root = router.getRoutes().find((item: any) => item.path === \"/\");\n\n  // 动态添加到router实例内\n  accessibleRoutes.forEach(route => {\n    if (root && !route.meta?.noBasicLayout) {\n      // 为了兼容之前的版本用法，如果包含子路由，则将component移除，以免出现多层BasicLayout\n      // 如果你的项目已经跟进了本次修改，移除了所有自定义菜单首级的BasicLayout，可以将这段if代码删除\n      if (route.children && route.children.length > 0) {\n        delete route.component;\n      }\n      root.children?.push(route);\n    } else {\n      router.addRoute(route);\n    }\n  });\n\n  if (root) {\n    if (root.name) {\n      router.removeRoute(root.name);\n    }\n    router.addRoute(root);\n  }\n\n  // 生成菜单\n  const accessibleMenus = await generateMenus(accessibleRoutes, options.router);\n\n  return { accessibleMenus, accessibleRoutes };\n}\n\n/**\n * Generate routes\n * @param mode\n * @param options\n */\nasync function generateRoutes(mode: AccessModeType, options: GenerateMenuAndRoutesOptions) {\n  const { forbiddenComponent, roles, routes } = options;\n\n  let resultRoutes: RouteRecordRaw[] = routes;\n  switch (mode) {\n    case \"backend\": {\n      resultRoutes = await generateRoutesByBackend(options);\n      break;\n    }\n    case \"frontend\": {\n      resultRoutes = await generateRoutesByFrontend(routes, roles || [], forbiddenComponent);\n      break;\n    }\n  }\n\n  /**\n   * 调整路由树，做以下处理：\n   * 1. 对未添加redirect的路由添加redirect\n   */\n  resultRoutes = mapTree(resultRoutes, route => {\n    // 如果有redirect或者没有子路由，则直接返回\n    if (route.redirect || !route.children || route.children.length === 0) {\n      return route;\n    }\n    const firstChild = route.children[0];\n\n    // 如果子路由不是以/开头，则直接返回,这种情况需要计算全部父级的path才能得出正确的path，这里不做处理\n    if (!firstChild?.path || !firstChild.path.startsWith(\"/\")) {\n      return route;\n    }\n\n    route.redirect = firstChild.path;\n    return route;\n  });\n\n  return resultRoutes;\n}\n\nexport { generateAccessible };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/access/directive.ts",
    "content": "/**\n * Global authority directive\n * Used for fine-grained control of component permissions\n * @Example v-access:role=\"[ROLE_NAME]\" or v-access:role=\"ROLE_NAME\"\n * @Example v-access:code=\"[ROLE_CODE]\" or v-access:code=\"ROLE_CODE\"\n */\nimport type { App, Directive, DirectiveBinding } from \"vue\";\n\nimport { useAccess } from \"./use-access\";\n\nfunction isAccessible(el: Element, binding: DirectiveBinding<string | string[]>) {\n  const { accessMode, hasAccessByCodes, hasAccessByRoles } = useAccess();\n\n  const value = binding.value;\n\n  if (!value) return;\n  const authMethod = accessMode.value === \"frontend\" && binding.arg === \"role\" ? hasAccessByRoles : hasAccessByCodes;\n\n  const values = Array.isArray(value) ? value : [value];\n\n  if (!authMethod(values)) {\n    el?.remove();\n  }\n}\n\nconst mounted = (el: Element, binding: DirectiveBinding<string | string[]>) => {\n  isAccessible(el, binding);\n};\n\nconst authDirective: Directive = {\n  mounted,\n};\n\nexport function registerAccessDirective(app: App) {\n  app.directive(\"access\", authDirective);\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/access/index.ts",
    "content": "export { default as AccessControl } from \"./access-control.vue\";\nexport * from \"./accessible\";\nexport * from \"./directive\";\nexport * from \"./use-access\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/access/use-access.ts",
    "content": "import { computed } from \"vue\";\n\nimport { preferences, updatePreferences } from \"@vben/preferences\";\nimport { useAccessStore, useUserStore } from \"@vben/stores\";\n\nfunction useAccess() {\n  const accessStore = useAccessStore();\n  const userStore = useUserStore();\n  const accessMode = computed(() => {\n    return preferences.app.accessMode;\n  });\n\n  /**\n   * 基于角色判断是否有权限\n   * @description: Determine whether there is permission，The role is judged by the user's role\n   * @param roles\n   */\n  function hasAccessByRoles(roles: string[]) {\n    const userRoleSet = new Set(userStore.userRoles);\n    const intersection = roles.filter(item => userRoleSet.has(item));\n    return intersection.length > 0;\n  }\n\n  /**\n   * 基于权限码判断是否有权限\n   * @description: Determine whether there is permission，The permission code is judged by the user's permission code\n   * @param codes\n   */\n  function hasAccessByCodes(codes: string[]) {\n    const userCodesSet = new Set(accessStore.accessCodes);\n\n    const intersection = codes.filter(item => userCodesSet.has(item));\n    return intersection.length > 0;\n  }\n\n  async function toggleAccessMode() {\n    updatePreferences({\n      app: {\n        accessMode: preferences.app.accessMode === \"frontend\" ? \"backend\" : \"frontend\",\n      },\n    });\n  }\n\n  return {\n    accessMode,\n    hasAccessByCodes,\n    hasAccessByRoles,\n    toggleAccessMode,\n  };\n}\n\nexport { useAccess };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/api-component/api-component.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { Component } from \"vue\";\n\nimport type { AnyPromiseFunction } from \"/@/vben/types\";\n\nimport { computed, ref, unref, useAttrs, watch } from \"vue\";\n\nimport { LoaderCircle } from \"/@/vben/icons\";\n\nimport { get, isEqual, isFunction } from \"/@/vben/shared/utils\";\n\nimport { objectOmit } from \"@vueuse/core\";\n\ntype OptionsItem = {\n  [name: string]: any;\n  children?: OptionsItem[];\n  disabled?: boolean;\n  label?: string;\n  value?: string;\n};\n\ninterface Props {\n  /** 组件 */\n  component: Component;\n  /** 是否将value从数字转为string */\n  numberToString?: boolean;\n  /** 获取options数据的函数 */\n  api?: (arg?: any) => Promise<OptionsItem[] | Record<string, any>>;\n  /** 传递给api的参数 */\n  params?: Record<string, any>;\n  /** 从api返回的结果中提取options数组的字段名 */\n  resultField?: string;\n  /** label字段名 */\n  labelField?: string;\n  /** children字段名，需要层级数据的组件可用 */\n  childrenField?: string;\n  /** value字段名 */\n  valueField?: string;\n  /** 组件接收options数据的属性名 */\n  optionsPropName?: string;\n  /** 是否立即调用api */\n  immediate?: boolean;\n  /** 每次`visibleEvent`事件发生时都重新请求数据 */\n  alwaysLoad?: boolean;\n  /** 在api请求之前的回调函数 */\n  beforeFetch?: AnyPromiseFunction<any, any>;\n  /** 在api请求之后的回调函数 */\n  afterFetch?: AnyPromiseFunction<any, any>;\n  /** 直接传入选项数据，也作为api返回空数据时的后备数据 */\n  options?: OptionsItem[];\n  /** 组件的插槽名称，用来显示一个\"加载中\"的图标 */\n  loadingSlot?: string;\n  /** 触发api请求的事件名 */\n  visibleEvent?: string;\n  /** 组件的v-model属性名，默认为modelValue。部分组件可能为value */\n  modelPropName?: string;\n}\n\ndefineOptions({ name: \"ApiComponent\", inheritAttrs: false });\n\nconst props = withDefaults(defineProps<Props>(), {\n  labelField: \"label\",\n  valueField: \"value\",\n  childrenField: \"\",\n  optionsPropName: \"options\",\n  resultField: \"\",\n  visibleEvent: \"\",\n  numberToString: false,\n  params: () => ({}),\n  immediate: true,\n  alwaysLoad: false,\n  loadingSlot: \"\",\n  beforeFetch: undefined,\n  afterFetch: undefined,\n  modelPropName: \"modelValue\",\n  api: undefined,\n  options: () => [],\n});\n\nconst emit = defineEmits<{\n  optionsChange: [OptionsItem[]];\n}>();\n\nconst modelValue = defineModel({ default: \"\" });\n\nconst attrs = useAttrs();\n\nconst refOptions = ref<OptionsItem[]>([]);\nconst loading = ref(false);\n// 首次是否加载过了\nconst isFirstLoaded = ref(false);\n\nconst getOptions = computed(() => {\n  const { labelField, valueField, childrenField, numberToString } = props;\n\n  const refOptionsData = unref(refOptions);\n\n  function transformData(data: OptionsItem[]): OptionsItem[] {\n    return data.map(item => {\n      const value = get(item, valueField);\n      return {\n        ...objectOmit(item, [labelField, valueField, childrenField]),\n        label: get(item, labelField),\n        value: numberToString ? `${value}` : value,\n        ...(childrenField && item[childrenField] ? { children: transformData(item[childrenField]) } : {}),\n      };\n    });\n  }\n\n  const data: OptionsItem[] = transformData(refOptionsData);\n\n  return data.length > 0 ? data : props.options;\n});\n\nconst bindProps = computed(() => {\n  return {\n    [props.modelPropName]: unref(modelValue),\n    [props.optionsPropName]: unref(getOptions),\n    [`onUpdate:${props.modelPropName}`]: (val: string) => {\n      modelValue.value = val;\n    },\n    ...objectOmit(attrs, [`onUpdate:${props.modelPropName}`]),\n    ...(props.visibleEvent\n      ? {\n          [props.visibleEvent]: handleFetchForVisible,\n        }\n      : {}),\n  };\n});\n\nasync function fetchApi() {\n  let { api, beforeFetch, afterFetch, params, resultField } = props;\n\n  if (!api || !isFunction(api) || loading.value) {\n    return;\n  }\n  refOptions.value = [];\n  try {\n    loading.value = true;\n    if (beforeFetch && isFunction(beforeFetch)) {\n      params = (await beforeFetch(params)) || params;\n    }\n    let res = await api(params);\n    if (afterFetch && isFunction(afterFetch)) {\n      res = (await afterFetch(res)) || res;\n    }\n    isFirstLoaded.value = true;\n    if (Array.isArray(res)) {\n      refOptions.value = res;\n      emitChange();\n      return;\n    }\n    if (resultField) {\n      refOptions.value = get(res, resultField) || [];\n    }\n    emitChange();\n  } catch (error) {\n    console.warn(error);\n    // reset status\n    isFirstLoaded.value = false;\n  } finally {\n    loading.value = false;\n  }\n}\n\nasync function handleFetchForVisible(visible: boolean) {\n  if (visible) {\n    if (props.alwaysLoad) {\n      await fetchApi();\n    } else if (!props.immediate && !unref(isFirstLoaded)) {\n      await fetchApi();\n    }\n  }\n}\n\nwatch(\n  () => props.params,\n  (value, oldValue) => {\n    if (isEqual(value, oldValue)) {\n      return;\n    }\n    fetchApi();\n  },\n  { deep: true, immediate: props.immediate }\n);\n\nfunction emitChange() {\n  emit(\"optionsChange\", unref(getOptions));\n}\n</script>\n<template>\n  <component :is=\"component\" v-bind=\"bindProps\" :placeholder=\"$attrs.placeholder\">\n    <template v-for=\"item in Object.keys($slots)\" #[item]=\"data\">\n      <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n    </template>\n    <template v-if=\"loadingSlot && loading\" #[loadingSlot]>\n      <LoaderCircle class=\"animate-spin\" />\n    </template>\n  </component>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/api-component/index.ts",
    "content": "export { default as ApiComponent } from \"./api-component.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/captcha/hooks/useCaptchaPoints.ts",
    "content": "import type { CaptchaPoint } from \"../types\";\n\nimport { reactive } from \"vue\";\n\nexport function useCaptchaPoints() {\n  const points = reactive<CaptchaPoint[]>([]);\n  function addPoint(point: CaptchaPoint) {\n    points.push(point);\n  }\n\n  function clearPoints() {\n    points.splice(0, points.length);\n  }\n  return {\n    addPoint,\n    clearPoints,\n    points,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/captcha/index.ts",
    "content": "export { default as PointSelectionCaptcha } from \"./point-selection-captcha/index.vue\";\nexport { default as PointSelectionCaptchaCard } from \"./point-selection-captcha/index.vue\";\n\nexport { default as SliderCaptcha } from \"./slider-captcha/index.vue\";\nexport { default as SliderRotateCaptcha } from \"./slider-rotate-captcha/index.vue\";\nexport type * from \"./types\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/captcha/point-selection-captcha/index.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CaptchaPoint, PointSelectionCaptchaProps } from \"../types\";\n\nimport { RotateCw } from \"/@/vben/icons\";\nimport { $t } from \"/@/locales\";\n\nimport { VbenButton, VbenIconButton } from \"/@/vben/shadcn-ui\";\n\nimport { useCaptchaPoints } from \"../hooks/useCaptchaPoints\";\nimport CaptchaCard from \"./point-selection-captcha-card.vue\";\n\nconst props = withDefaults(defineProps<PointSelectionCaptchaProps>(), {\n  height: \"220px\",\n  hintImage: \"\",\n  hintText: \"\",\n  paddingX: \"12px\",\n  paddingY: \"16px\",\n  showConfirm: false,\n  title: \"\",\n  width: \"300px\",\n});\nconst emit = defineEmits<{\n  click: [CaptchaPoint];\n  confirm: [Array<CaptchaPoint>, clear: () => void];\n  refresh: [];\n}>();\nconst { addPoint, clearPoints, points } = useCaptchaPoints();\n\nif (!props.hintImage && !props.hintText) {\n  console.warn(\"At least one of hint image or hint text must be provided\");\n}\n\nconst POINT_OFFSET = 11;\n\nfunction getElementPosition(element: HTMLElement) {\n  const rect = element.getBoundingClientRect();\n  return {\n    x: rect.left + window.scrollX,\n    y: rect.top + window.scrollY,\n  };\n}\n\nfunction handleClick(e: MouseEvent) {\n  try {\n    const dom = e.currentTarget as HTMLElement;\n    if (!dom) throw new Error(\"Element not found\");\n\n    const { x: domX, y: domY } = getElementPosition(dom);\n\n    const mouseX = e.clientX + window.scrollX;\n    const mouseY = e.clientY + window.scrollY;\n\n    if (typeof mouseX !== \"number\" || typeof mouseY !== \"number\") {\n      throw new TypeError(\"Mouse coordinates not found\");\n    }\n\n    const xPos = mouseX - domX;\n    const yPos = mouseY - domY;\n\n    const rect = dom.getBoundingClientRect();\n\n    // 点击位置边界校验\n    if (xPos < 0 || yPos < 0 || xPos > rect.width || yPos > rect.height) {\n      console.warn(\"Click position is out of the valid range\");\n      return;\n    }\n\n    const x = Math.ceil(xPos);\n    const y = Math.ceil(yPos);\n\n    const point = {\n      i: points.length,\n      t: Date.now(),\n      x,\n      y,\n    };\n\n    addPoint(point);\n\n    emit(\"click\", point);\n    e.stopPropagation();\n    e.preventDefault();\n  } catch (error) {\n    console.error(\"Error in handleClick:\", error);\n  }\n}\n\nfunction clear() {\n  try {\n    clearPoints();\n  } catch (error) {\n    console.error(\"Error in clear:\", error);\n  }\n}\n\nfunction handleRefresh() {\n  try {\n    clear();\n    emit(\"refresh\");\n  } catch (error) {\n    console.error(\"Error in handleRefresh:\", error);\n  }\n}\n\nfunction handleConfirm() {\n  if (!props.showConfirm) return;\n  try {\n    emit(\"confirm\", points, clear);\n  } catch (error) {\n    console.error(\"Error in handleConfirm:\", error);\n  }\n}\n</script>\n<template>\n  <CaptchaCard :captcha-image=\"captchaImage\" :height=\"height\" :padding-x=\"paddingX\" :padding-y=\"paddingY\" :title=\"title\" :width=\"width\" @click=\"handleClick\">\n    <template #title>\n      <slot name=\"title\">{{ $t(\"ui.captcha.title\") }}</slot>\n    </template>\n\n    <template #extra>\n      <VbenIconButton :aria-label=\"$t('ui.captcha.refreshAriaLabel')\" class=\"ml-1\" @click=\"handleRefresh\">\n        <RotateCw class=\"size-5\" />\n      </VbenIconButton>\n      <VbenButton v-if=\"showConfirm\" :aria-label=\"$t('ui.captcha.confirmAriaLabel')\" class=\"ml-2\" size=\"sm\" @click=\"handleConfirm\">\n        {{ $t(\"ui.captcha.confirm\") }}\n      </VbenButton>\n    </template>\n\n    <div\n      v-for=\"(point, index) in points\"\n      :key=\"index\"\n      :aria-label=\"$t('ui.captcha.pointAriaLabel') + (index + 1)\"\n      :style=\"{\n        top: `${point.y - POINT_OFFSET}px`,\n        left: `${point.x - POINT_OFFSET}px`,\n      }\"\n      class=\"bg-primary text-primary-50 border-primary-50 absolute z-20 flex h-5 w-5 cursor-default items-center justify-center rounded-full border-2\"\n      role=\"button\"\n      tabindex=\"0\"\n    >\n      {{ index + 1 }}\n    </div>\n    <template #footer>\n      <img v-if=\"hintImage\" :alt=\"$t('ui.captcha.alt')\" :src=\"hintImage\" class=\"border-border h-10 w-full rounded border\" />\n      <div v-else-if=\"hintText\" class=\"border-border flex-center h-10 w-full rounded border\">\n        {{ `${$t(\"ui.captcha.clickInOrder\")}` + `【${hintText}】` }}\n      </div>\n    </template>\n  </CaptchaCard>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/captcha/point-selection-captcha/point-selection-captcha-card.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PointSelectionCaptchaCardProps } from \"../types\";\n\nimport { computed } from \"vue\";\n\nimport { $t } from \"/@/locales\";\n\nimport { Card, CardContent, CardFooter, CardHeader, CardTitle } from \"/@/vben/shadcn-ui\";\n\nconst props = withDefaults(defineProps<PointSelectionCaptchaCardProps>(), {\n  height: \"220px\",\n  paddingX: \"12px\",\n  paddingY: \"16px\",\n  title: \"\",\n  width: \"300px\",\n});\n\nconst emit = defineEmits<{\n  click: [MouseEvent];\n}>();\n\nconst parseValue = (value: number | string) => {\n  if (typeof value === \"number\") {\n    return value;\n  }\n  const parsed = Number.parseFloat(value);\n  return Number.isNaN(parsed) ? 0 : parsed;\n};\n\nconst rootStyles = computed(() => ({\n  padding: `${parseValue(props.paddingY)}px ${parseValue(props.paddingX)}px`,\n  width: `${parseValue(props.width) + parseValue(props.paddingX) * 2}px`,\n}));\n\nconst captchaStyles = computed(() => {\n  return {\n    height: `${parseValue(props.height)}px`,\n    width: `${parseValue(props.width)}px`,\n  };\n});\n\nfunction handleClick(e: MouseEvent) {\n  emit(\"click\", e);\n}\n</script>\n<template>\n  <Card :style=\"rootStyles\" aria-labelledby=\"captcha-title\" role=\"region\">\n    <CardHeader class=\"p-0\">\n      <CardTitle id=\"captcha-title\" class=\"flex items-center justify-between\">\n        <template v-if=\"$slots.title\">\n          <slot name=\"title\">{{ $t(\"ui.captcha.title\") }}</slot>\n        </template>\n        <template v-else>\n          <span>{{ title }}</span>\n        </template>\n        <div class=\"flex items-center justify-end\">\n          <slot name=\"extra\"></slot>\n        </div>\n      </CardTitle>\n    </CardHeader>\n    <CardContent class=\"relative mt-2 flex w-full overflow-hidden rounded p-0\">\n      <img v-show=\"captchaImage\" :alt=\"$t('ui.captcha.alt')\" :src=\"captchaImage\" :style=\"captchaStyles\" class=\"relative z-10\" @click=\"handleClick\" />\n      <div class=\"absolute inset-0\">\n        <slot></slot>\n      </div>\n    </CardContent>\n    <CardFooter class=\"mt-2 flex justify-between p-0\">\n      <slot name=\"footer\"></slot>\n    </CardFooter>\n  </Card>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/captcha/slider-captcha/index.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CaptchaVerifyPassingData, SliderCaptchaProps, SliderRotateVerifyPassingData } from \"../types\";\n\nimport { reactive, unref, useTemplateRef, watch, watchEffect } from \"vue\";\n\nimport { $t } from \"/@/locales\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { useTimeoutFn } from \"@vueuse/core\";\n\nimport SliderCaptchaAction from \"./slider-captcha-action.vue\";\nimport SliderCaptchaBar from \"./slider-captcha-bar.vue\";\nimport SliderCaptchaContent from \"./slider-captcha-content.vue\";\n\nconst props = withDefaults(defineProps<SliderCaptchaProps>(), {\n  actionStyle: () => ({}),\n  barStyle: () => ({}),\n  contentStyle: () => ({}),\n  isSlot: false,\n  successText: \"\",\n  text: \"\",\n  wrapperStyle: () => ({}),\n});\n\nconst emit = defineEmits<{\n  end: [MouseEvent | TouchEvent];\n  move: [SliderRotateVerifyPassingData];\n  start: [MouseEvent | TouchEvent];\n  success: [CaptchaVerifyPassingData];\n}>();\n\nconst modelValue = defineModel<boolean>({ default: false });\n\nconst state = reactive({\n  endTime: 0,\n  isMoving: false,\n  isPassing: false,\n  moveDistance: 0,\n  startTime: 0,\n  toLeft: false,\n});\n\ndefineExpose({\n  resume,\n});\n\nconst wrapperRef = useTemplateRef<HTMLDivElement>(\"wrapperRef\");\nconst barRef = useTemplateRef<typeof SliderCaptchaBar>(\"barRef\");\nconst contentRef = useTemplateRef<typeof SliderCaptchaContent>(\"contentRef\");\nconst actionRef = useTemplateRef<typeof SliderCaptchaAction>(\"actionRef\");\n\nwatch(\n  () => state.isPassing,\n  isPassing => {\n    if (isPassing) {\n      const { endTime, startTime } = state;\n      const time = (endTime - startTime) / 1000;\n      emit(\"success\", { isPassing, time: time.toFixed(1) });\n      modelValue.value = isPassing;\n    }\n  }\n);\n\nwatchEffect(() => {\n  state.isPassing = !!modelValue.value;\n});\n\nfunction getEventPageX(e: MouseEvent | TouchEvent): number {\n  if (\"pageX\" in e) {\n    return e.pageX;\n  } else if (\"touches\" in e && e.touches[0]) {\n    return e.touches[0].pageX;\n  }\n  return 0;\n}\n\nfunction handleDragStart(e: MouseEvent | TouchEvent) {\n  if (state.isPassing) {\n    return;\n  }\n  if (!actionRef.value) return;\n  emit(\"start\", e);\n\n  state.moveDistance = getEventPageX(e) - Number.parseInt(actionRef.value.getStyle().left.replace(\"px\", \"\") || \"0\", 10);\n  state.startTime = Date.now();\n  state.isMoving = true;\n}\n\nfunction getOffset(actionEl: HTMLDivElement) {\n  const wrapperWidth = wrapperRef.value?.offsetWidth ?? 220;\n  const actionWidth = actionEl?.offsetWidth ?? 40;\n  const offset = wrapperWidth - actionWidth - 6;\n  return { actionWidth, offset, wrapperWidth };\n}\n\nfunction handleDragMoving(e: MouseEvent | TouchEvent) {\n  const { isMoving, moveDistance } = state;\n  if (isMoving) {\n    const actionEl = unref(actionRef);\n    const barEl = unref(barRef);\n    if (!actionEl || !barEl) return;\n    const { actionWidth, offset, wrapperWidth } = getOffset(actionEl.getEl());\n    const moveX = getEventPageX(e) - moveDistance;\n\n    emit(\"move\", {\n      event: e,\n      moveDistance,\n      moveX,\n    });\n    if (moveX > 0 && moveX <= offset) {\n      actionEl.setLeft(`${moveX}px`);\n      barEl.setWidth(`${moveX + actionWidth / 2}px`);\n    } else if (moveX > offset) {\n      actionEl.setLeft(`${wrapperWidth - actionWidth}px`);\n      barEl.setWidth(`${wrapperWidth - actionWidth / 2}px`);\n      if (!props.isSlot) {\n        checkPass();\n      }\n    }\n  }\n}\n\nfunction handleDragOver(e: MouseEvent | TouchEvent) {\n  const { isMoving, isPassing, moveDistance } = state;\n  if (isMoving && !isPassing) {\n    emit(\"end\", e);\n    const actionEl = actionRef.value;\n    const barEl = unref(barRef);\n    if (!actionEl || !barEl) return;\n    const moveX = getEventPageX(e) - moveDistance;\n    const { actionWidth, offset, wrapperWidth } = getOffset(actionEl.getEl());\n    if (moveX < offset) {\n      if (props.isSlot) {\n        setTimeout(() => {\n          if (modelValue.value) {\n            const contentEl = unref(contentRef);\n            if (contentEl) {\n              contentEl.getEl().style.width = `${Number.parseInt(barEl.getEl().style.width)}px`;\n            }\n          } else {\n            resume();\n          }\n        }, 0);\n      } else {\n        resume();\n      }\n    } else {\n      actionEl.setLeft(`${wrapperWidth - actionWidth}px`);\n      barEl.setWidth(`${wrapperWidth - actionWidth / 2}px`);\n      checkPass();\n    }\n    state.isMoving = false;\n  }\n}\n\nfunction checkPass() {\n  if (props.isSlot) {\n    resume();\n    return;\n  }\n  state.endTime = Date.now();\n  state.isPassing = true;\n  state.isMoving = false;\n}\n\nfunction resume() {\n  state.isMoving = false;\n  state.isPassing = false;\n  state.moveDistance = 0;\n  state.toLeft = false;\n  state.startTime = 0;\n  state.endTime = 0;\n  const actionEl = unref(actionRef);\n  const barEl = unref(barRef);\n  const contentEl = unref(contentRef);\n  if (!actionEl || !barEl || !contentEl) return;\n\n  contentEl.getEl().style.width = \"100%\";\n  state.toLeft = true;\n  useTimeoutFn(() => {\n    state.toLeft = false;\n    actionEl.setLeft(\"0\");\n    barEl.setWidth(\"0\");\n  }, 300);\n}\n</script>\n\n<template>\n  <div\n    ref=\"wrapperRef\"\n    :class=\"cn('border-border bg-background-deep relative flex h-10 w-full items-center overflow-hidden rounded-md border text-center', props.class)\"\n    :style=\"wrapperStyle\"\n    @mouseleave=\"handleDragOver\"\n    @mousemove=\"handleDragMoving\"\n    @mouseup=\"handleDragOver\"\n    @touchend=\"handleDragOver\"\n    @touchmove=\"handleDragMoving\"\n  >\n    <SliderCaptchaBar ref=\"barRef\" :bar-style=\"barStyle\" :to-left=\"state.toLeft\" />\n    <SliderCaptchaContent ref=\"contentRef\" :content-style=\"contentStyle\" :is-passing=\"state.isPassing\" :success-text=\"successText || $t('ui.captcha.sliderSuccessText')\" :text=\"text || $t('ui.captcha.sliderDefaultText')\">\n      <template v-if=\"$slots.text\" #text>\n        <slot :is-passing=\"state.isPassing\" name=\"text\"></slot>\n      </template>\n    </SliderCaptchaContent>\n\n    <SliderCaptchaAction ref=\"actionRef\" :action-style=\"actionStyle\" :is-passing=\"state.isPassing\" :to-left=\"state.toLeft\" @mousedown=\"handleDragStart\" @touchstart=\"handleDragStart\">\n      <template v-if=\"$slots.actionIcon\" #icon>\n        <slot :is-passing=\"state.isPassing\" name=\"actionIcon\"></slot>\n      </template>\n    </SliderCaptchaAction>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/captcha/slider-captcha/slider-captcha-action.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CSSProperties } from \"vue\";\n\nimport { computed, ref, useTemplateRef } from \"vue\";\n\nimport { Check, ChevronsRight } from \"/@/vben/icons\";\n\nimport { Slot } from \"/@/vben/shadcn-ui\";\n\nconst props = defineProps<{\n  actionStyle: CSSProperties;\n  isPassing: boolean;\n  toLeft: boolean;\n}>();\n\nconst actionRef = useTemplateRef<HTMLDivElement>(\"actionRef\");\n\nconst left = ref(\"0\");\n\nconst style = computed(() => {\n  const { actionStyle } = props;\n  return {\n    ...actionStyle,\n    left: left.value,\n  };\n});\n\nconst isDragging = computed(() => {\n  const currentLeft = Number.parseInt(left.value as string);\n\n  return currentLeft > 10 && !props.isPassing;\n});\n\ndefineExpose({\n  getEl: () => {\n    return actionRef.value;\n  },\n  getStyle: () => {\n    return actionRef?.value?.style;\n  },\n  setLeft: (val: string) => {\n    left.value = val;\n  },\n});\n</script>\n\n<template>\n  <div\n    ref=\"actionRef\"\n    :class=\"{\n      'transition-width !left-0 duration-300': toLeft,\n      'rounded-md': isDragging,\n    }\"\n    :style=\"style\"\n    class=\"bg-background dark:bg-accent absolute left-0 top-0 flex h-full cursor-move items-center justify-center px-3.5 shadow-md\"\n    name=\"captcha-action\"\n  >\n    <Slot :is-passing=\"isPassing\" class=\"text-foreground/60 size-4\">\n      <slot name=\"icon\">\n        <ChevronsRight v-if=\"!isPassing\" />\n        <Check v-else />\n      </slot>\n    </Slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/captcha/slider-captcha/slider-captcha-bar.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CSSProperties } from \"vue\";\n\nimport { computed, ref, useTemplateRef } from \"vue\";\n\nconst props = defineProps<{\n  barStyle: CSSProperties;\n  toLeft: boolean;\n}>();\n\nconst barRef = useTemplateRef<HTMLDivElement>(\"barRef\");\n\nconst width = ref(\"0\");\n\nconst style = computed(() => {\n  const { barStyle } = props;\n  return {\n    ...barStyle,\n    width: width.value,\n  };\n});\n\ndefineExpose({\n  getEl: () => {\n    return barRef.value;\n  },\n  setWidth: (val: string) => {\n    width.value = val;\n  },\n});\n</script>\n\n<template>\n  <div ref=\"barRef\" :class=\"toLeft && 'transition-width !w-0 duration-300'\" :style=\"style\" class=\"bg-success absolute h-full\"></div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/captcha/slider-captcha/slider-captcha-content.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CSSProperties } from \"vue\";\n\nimport { computed, useTemplateRef } from \"vue\";\n\nimport { VbenSpineText } from \"/@/vben/shadcn-ui\";\n\nconst props = defineProps<{\n  contentStyle: CSSProperties;\n  isPassing: boolean;\n  successText: string;\n  text: string;\n}>();\n\nconst contentRef = useTemplateRef<HTMLDivElement>(\"contentRef\");\n\nconst style = computed(() => {\n  const { contentStyle } = props;\n\n  return {\n    ...contentStyle,\n  };\n});\n\ndefineExpose({\n  getEl: () => {\n    return contentRef.value;\n  },\n});\n</script>\n\n<template>\n  <div\n    ref=\"contentRef\"\n    :class=\"{\n      [$style.success]: isPassing,\n    }\"\n    :style=\"style\"\n    class=\"absolute top-0 flex size-full select-none items-center justify-center text-xs\"\n  >\n    <slot name=\"text\">\n      <VbenSpineText class=\"flex h-full items-center\">\n        {{ isPassing ? successText : text }}\n      </VbenSpineText>\n    </slot>\n  </div>\n</template>\n\n<style module>\n.success {\n  -webkit-text-fill-color: hsl(0deg 0% 98%);\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/captcha/slider-rotate-captcha/index.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CaptchaVerifyPassingData, SliderCaptchaActionType, SliderRotateCaptchaProps, SliderRotateVerifyPassingData } from \"../types\";\n\nimport { computed, reactive, unref, useTemplateRef, watch } from \"vue\";\n\nimport { $t } from \"/@/locales\";\n\nimport { useTimeoutFn } from \"@vueuse/core\";\n\nimport SliderCaptcha from \"../slider-captcha/index.vue\";\n\nconst props = withDefaults(defineProps<SliderRotateCaptchaProps>(), {\n  defaultTip: \"\",\n  diffDegree: 20,\n  imageSize: 260,\n  maxDegree: 300,\n  minDegree: 120,\n  src: \"\",\n});\n\nconst emit = defineEmits<{\n  success: [CaptchaVerifyPassingData];\n}>();\n\nconst slideBarRef = useTemplateRef<SliderCaptchaActionType>(\"slideBarRef\");\n\nconst state = reactive({\n  currentRotate: 0,\n  dragging: false,\n  endTime: 0,\n  imgStyle: {},\n  isPassing: false,\n  randomRotate: 0,\n  showTip: false,\n  startTime: 0,\n  toOrigin: false,\n});\n\nconst modalValue = defineModel<boolean>({ default: false });\n\nwatch(\n  () => state.isPassing,\n  isPassing => {\n    if (isPassing) {\n      const { endTime, startTime } = state;\n      const time = (endTime - startTime) / 1000;\n      emit(\"success\", { isPassing, time: time.toFixed(1) });\n    }\n    modalValue.value = isPassing;\n  }\n);\n\nconst getImgWrapStyleRef = computed(() => {\n  const { imageSize, imageWrapperStyle } = props;\n  return {\n    height: `${imageSize}px`,\n    width: `${imageSize}px`,\n    ...imageWrapperStyle,\n  };\n});\n\nconst getFactorRef = computed(() => {\n  const { maxDegree, minDegree } = props;\n  if (minDegree > maxDegree) {\n    console.warn(\"minDegree should not be greater than maxDegree\");\n  }\n\n  if (minDegree === maxDegree) {\n    return Math.floor(1 + Math.random() * 1) / 10 + 1;\n  }\n  return 1;\n});\n\nfunction handleStart() {\n  state.startTime = Date.now();\n}\n\nfunction handleDragBarMove(data: SliderRotateVerifyPassingData) {\n  state.dragging = true;\n  const { imageSize, maxDegree } = props;\n  const { moveX } = data;\n  const denominator = imageSize!;\n  if (denominator === 0) {\n    return;\n  }\n  const currentRotate = Math.ceil((moveX / denominator) * 1.5 * maxDegree! * unref(getFactorRef));\n  state.currentRotate = currentRotate;\n  setImgRotate(state.randomRotate - currentRotate);\n}\n\nfunction handleImgOnLoad() {\n  const { maxDegree, minDegree } = props;\n  const ranRotate = Math.floor(minDegree! + Math.random() * (maxDegree! - minDegree!)); // 生成随机角度\n  state.randomRotate = ranRotate;\n  setImgRotate(ranRotate);\n}\n\nfunction handleDragEnd() {\n  const { currentRotate, randomRotate } = state;\n  const { diffDegree } = props;\n\n  if (Math.abs(randomRotate - currentRotate) >= (diffDegree || 20)) {\n    setImgRotate(randomRotate);\n    state.toOrigin = true;\n    useTimeoutFn(() => {\n      state.toOrigin = false;\n      state.showTip = true;\n      //  时间与动画时间保持一致\n    }, 300);\n  } else {\n    checkPass();\n  }\n  state.showTip = true;\n  state.dragging = false;\n}\n\nfunction setImgRotate(deg: number) {\n  state.imgStyle = {\n    transform: `rotateZ(${deg}deg)`,\n  };\n}\n\nfunction checkPass() {\n  state.isPassing = true;\n  state.endTime = Date.now();\n}\n\nfunction resume() {\n  state.showTip = false;\n  const basicEl = unref(slideBarRef);\n  if (!basicEl) {\n    return;\n  }\n  state.isPassing = false;\n\n  basicEl.resume();\n  handleImgOnLoad();\n}\n\nconst imgCls = computed(() => {\n  return state.toOrigin ? [\"transition-transform duration-300\"] : [];\n});\n\nconst verifyTip = computed(() => {\n  return state.isPassing ? $t(\"ui.captcha.sliderRotateSuccessTip\", [((state.endTime - state.startTime) / 1000).toFixed(1)]) : $t(\"ui.captcha.sliderRotateFailTip\");\n});\n\ndefineExpose({\n  resume,\n});\n</script>\n\n<template>\n  <div class=\"relative flex flex-col items-center\">\n    <div :style=\"getImgWrapStyleRef\" class=\"border-border relative cursor-pointer overflow-hidden rounded-full border shadow-md\">\n      <img :class=\"imgCls\" :src=\"src\" :style=\"state.imgStyle\" alt=\"verify\" class=\"w-full rounded-full\" @click=\"resume\" @load=\"handleImgOnLoad\" />\n      <div class=\"absolute bottom-3 left-0 z-10 block h-7 w-full text-center text-xs leading-[30px] text-white\">\n        <div\n          v-if=\"state.showTip\"\n          :class=\"{\n            'bg-success/80': state.isPassing,\n            'bg-destructive/80': !state.isPassing,\n          }\"\n        >\n          {{ verifyTip }}\n        </div>\n        <div v-if=\"!state.dragging\" class=\"bg-black/30\">\n          {{ defaultTip || $t(\"ui.captcha.sliderRotateDefaultTip\") }}\n        </div>\n      </div>\n    </div>\n\n    <SliderCaptcha ref=\"slideBarRef\" v-model=\"modalValue\" class=\"mt-5\" is-slot @end=\"handleDragEnd\" @move=\"handleDragBarMove\" @start=\"handleStart\">\n      <template v-for=\"(_, key) in $slots\" :key=\"key\" #[key]=\"slotProps\">\n        <slot :name=\"key\" v-bind=\"slotProps\"></slot>\n      </template>\n    </SliderCaptcha>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/captcha/types.ts",
    "content": "import type { CSSProperties } from \"vue\";\n\nimport type { ClassType } from \"/@/vben/types\";\n\nexport interface CaptchaData {\n  /**\n   * x\n   */\n  x: number;\n  /**\n   * y\n   */\n  y: number;\n  /**\n   * 时间戳\n   */\n  t: number;\n}\nexport interface CaptchaPoint extends CaptchaData {\n  /**\n   * 数据索引\n   */\n  i: number;\n}\nexport interface PointSelectionCaptchaCardProps {\n  /**\n   * 验证码图片\n   */\n  captchaImage: string;\n  /**\n   * 验证码图片高度\n   * @default '220px'\n   */\n  height?: number | string;\n  /**\n   * 水平内边距\n   * @default '12px'\n   */\n  paddingX?: number | string;\n  /**\n   * 垂直内边距\n   * @default '16px'\n   */\n  paddingY?: number | string;\n  /**\n   * 标题\n   * @default '请按图依次点击'\n   */\n  title?: string;\n  /**\n   * 验证码图片宽度\n   * @default '300px'\n   */\n  width?: number | string;\n}\n\nexport interface PointSelectionCaptchaProps extends PointSelectionCaptchaCardProps {\n  /**\n   * 是否展示确定按钮\n   * @default false\n   */\n  showConfirm?: boolean;\n  /**\n   * 提示图片\n   * @default ''\n   */\n  hintImage?: string;\n  /**\n   * 提示文本\n   * @default ''\n   */\n  hintText?: string;\n}\n\nexport interface SliderCaptchaProps {\n  class?: ClassType;\n  /**\n   * @description 滑块的样式\n   * @default {}\n   */\n  actionStyle?: CSSProperties;\n\n  /**\n   * @description 滑块条的样式\n   * @default {}\n   */\n  barStyle?: CSSProperties;\n\n  /**\n   * @description 内容的样式\n   * @default {}\n   */\n  contentStyle?: CSSProperties;\n\n  /**\n   * @description 组件的样式\n   * @default {}\n   */\n  wrapperStyle?: CSSProperties;\n\n  /**\n   * @description 是否作为插槽使用，用于联动组件，可参考旋转校验组件\n   * @default false\n   */\n  isSlot?: boolean;\n\n  /**\n   * @description 验证成功的提示\n   * @default '验证通过'\n   */\n  successText?: string;\n\n  /**\n   * @description 提示文字\n   * @default '请按住滑块拖动'\n   */\n  text?: string;\n}\n\nexport interface SliderRotateCaptchaProps {\n  /**\n   * @description 旋转的角度\n   * @default 20\n   */\n  diffDegree?: number;\n\n  /**\n   * @description 图片的宽度\n   * @default 260\n   */\n  imageSize?: number;\n\n  /**\n   * @description 图片的样式\n   * @default {}\n   */\n  imageWrapperStyle?: CSSProperties;\n\n  /**\n   * @description 最大旋转角度\n   * @default 270\n   */\n  maxDegree?: number;\n\n  /**\n   * @description 最小旋转角度\n   * @default 90\n   */\n  minDegree?: number;\n\n  /**\n   * @description 图片的地址\n   */\n  src?: string;\n  /**\n   * @description 默认提示文本\n   */\n  defaultTip?: string;\n}\n\nexport interface CaptchaVerifyPassingData {\n  isPassing: boolean;\n  time: number | string;\n}\n\nexport interface SliderCaptchaActionType {\n  resume: () => void;\n}\n\nexport interface SliderRotateVerifyPassingData {\n  event: MouseEvent | TouchEvent;\n  moveDistance: number;\n  moveX: number;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/col-page/col-page.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { ColPageProps } from \"./types\";\n\nimport { computed, ref, useSlots } from \"vue\";\n\nimport { ResizableHandle, ResizablePanel, ResizablePanelGroup } from \"/@/vben/shadcn-ui\";\n\nimport Page from \"../page/page.vue\";\n\ndefineOptions({\n  name: \"ColPage\",\n  inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<ColPageProps>(), {\n  leftWidth: 30,\n  rightWidth: 70,\n  resizable: true,\n});\n\nconst delegatedProps = computed(() => {\n  const { leftWidth: _, ...delegated } = props;\n  return delegated;\n});\n\nconst slots = useSlots();\n\nconst delegatedSlots = computed(() => {\n  const resultSlots: string[] = [];\n\n  for (const key of Object.keys(slots)) {\n    if (![\"default\", \"left\"].includes(key)) {\n      resultSlots.push(key);\n    }\n  }\n  return resultSlots;\n});\n\nconst leftPanelRef = ref<InstanceType<typeof ResizablePanel>>();\n\nfunction expandLeft() {\n  leftPanelRef.value?.expand();\n}\n\nfunction collapseLeft() {\n  leftPanelRef.value?.collapse();\n}\n\ndefineExpose({\n  expandLeft,\n  collapseLeft,\n});\n</script>\n<template>\n  <Page v-bind=\"delegatedProps\">\n    <!-- 继承默认的slot -->\n    <template v-for=\"slotName in delegatedSlots\" :key=\"slotName\" #[slotName]=\"slotProps\">\n      <slot :name=\"slotName\" v-bind=\"slotProps\"></slot>\n    </template>\n\n    <ResizablePanelGroup class=\"w-full\" direction=\"horizontal\">\n      <ResizablePanel ref=\"leftPanelRef\" :collapsed-size=\"leftCollapsedWidth\" :collapsible=\"leftCollapsible\" :default-size=\"leftWidth\" :max-size=\"leftMaxWidth\" :min-size=\"leftMinWidth\">\n        <template #default=\"slotProps\">\n          <slot\n            name=\"left\"\n            v-bind=\"{\n              ...slotProps,\n              expand: expandLeft,\n              collapse: collapseLeft,\n            }\"\n          ></slot>\n        </template>\n      </ResizablePanel>\n      <ResizableHandle v-if=\"resizable\" :style=\"{ backgroundColor: splitLine ? undefined : 'transparent' }\" :with-handle=\"splitHandle\" />\n      <ResizablePanel :collapsed-size=\"rightCollapsedWidth\" :collapsible=\"rightCollapsible\" :default-size=\"rightWidth\" :max-size=\"rightMaxWidth\" :min-size=\"rightMinWidth\">\n        <template #default>\n          <slot></slot>\n        </template>\n      </ResizablePanel>\n    </ResizablePanelGroup>\n  </Page>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/col-page/index.ts",
    "content": "export { default as ColPage } from \"./col-page.vue\";\nexport * from \"./types\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/col-page/types.ts",
    "content": "import type { PageProps } from \"../page/types\";\n\nexport interface ColPageProps extends PageProps {\n  /**\n   * 左侧宽度\n   * @default 30\n   */\n  leftWidth?: number;\n  leftMinWidth?: number;\n  leftMaxWidth?: number;\n  leftCollapsedWidth?: number;\n  leftCollapsible?: boolean;\n  /**\n   * 右侧宽度\n   * @default 70\n   */\n  rightWidth?: number;\n  rightMinWidth?: number;\n  rightCollapsedWidth?: number;\n  rightMaxWidth?: number;\n  rightCollapsible?: boolean;\n\n  resizable?: boolean;\n  splitLine?: boolean;\n  splitHandle?: boolean;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/count-to/count-to.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { CountToProps } from \"./types\";\n\nimport { computed, onMounted, ref, watch } from \"vue\";\n\nimport { isString } from \"/@/vben/shared/utils\";\n\nimport { TransitionPresets, useTransition } from \"@vueuse/core\";\n\nconst props = withDefaults(defineProps<CountToProps>(), {\n  startVal: 0,\n  duration: 2000,\n  separator: \",\",\n  decimal: \".\",\n  decimals: 0,\n  delay: 0,\n  transition: () => TransitionPresets.easeOutExpo,\n});\n\nconst emit = defineEmits([\"started\", \"finished\"]);\n\nconst lastValue = ref(props.startVal);\n\nonMounted(() => {\n  lastValue.value = props.endVal;\n});\n\nwatch(\n  () => props.endVal,\n  val => {\n    lastValue.value = val;\n  }\n);\n\nconst currentValue = useTransition(lastValue, {\n  delay: computed(() => props.delay),\n  duration: computed(() => props.duration),\n  disabled: computed(() => props.disabled),\n  transition: computed(() => {\n    return isString(props.transition) ? TransitionPresets[props.transition] : props.transition;\n  }),\n  onStarted() {\n    emit(\"started\");\n  },\n  onFinished() {\n    emit(\"finished\");\n  },\n});\n\nconst numMain = computed(() => {\n  const result = currentValue.value\n    .toFixed(props.decimals)\n    .split(\".\")[0]\n    ?.replaceAll(/\\B(?=(\\d{3})+(?!\\d))/g, props.separator);\n  return result;\n});\n\nconst numDec = computed(() => {\n  return props.decimal + currentValue.value.toFixed(props.decimals).split(\".\")[1];\n});\n</script>\n<template>\n  <div class=\"count-to\" v-bind=\"$attrs\">\n    <slot name=\"prefix\">\n      <div v-if=\"prefix\" class=\"count-to-prefix\" :style=\"prefixStyle\" :class=\"prefixClass\">\n        {{ prefix }}\n      </div>\n    </slot>\n    <div class=\"count-to-main\" :class=\"mainClass\" :style=\"mainStyle\">\n      <span>{{ numMain }}</span>\n      <span v-if=\"decimals > 0\" class=\"count-to-main-decimal\" :class=\"decimalClass\" :style=\"decimalStyle\">\n        {{ numDec }}\n      </span>\n    </div>\n    <slot name=\"suffix\">\n      <div v-if=\"suffix\" class=\"count-to-suffix\" :style=\"suffixStyle\" :class=\"suffixClass\">\n        {{ suffix }}\n      </div>\n    </slot>\n  </div>\n</template>\n<style lang=\"scss\" scoped>\n.count-to {\n  display: flex;\n  align-items: baseline;\n\n  &-prefix {\n    // font-size: 1rem;\n  }\n\n  &-suffix {\n    // font-size: 1rem;\n  }\n\n  &-main {\n    font-family: \"Segoe UI\", Tahoma, Geneva, Verdana, sans-serif;\n    // font-size: 1.5rem;\n\n    &-decimal {\n      // font-size: 0.8rem;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/count-to/index.ts",
    "content": "export { default as CountTo } from \"./count-to.vue\";\nexport * from \"./types\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/count-to/types.ts",
    "content": "import type { CubicBezierPoints, EasingFunction } from \"@vueuse/core\";\n\nimport type { StyleValue } from \"vue\";\n\nimport { TransitionPresets as TransitionPresetsData } from \"@vueuse/core\";\n\nexport type TransitionPresets = keyof typeof TransitionPresetsData;\n\nexport const TransitionPresetsKeys = Object.keys(TransitionPresetsData) as TransitionPresets[];\n\nexport interface CountToProps {\n  /** 初始值 */\n  startVal?: number;\n  /** 当前值 */\n  endVal: number;\n  /** 是否禁用动画 */\n  disabled?: boolean;\n  /** 延迟动画开始的时间 */\n  delay?: number;\n  /** 持续时间  */\n  duration?: number;\n  /** 小数位数  */\n  decimals?: number;\n  /** 小数点  */\n  decimal?: string;\n  /** 分隔符  */\n  separator?: string;\n  /** 前缀  */\n  prefix?: string;\n  /** 后缀  */\n  suffix?: string;\n  /** 过渡效果  */\n  transition?: CubicBezierPoints | EasingFunction | TransitionPresets;\n  /** 整数部分的类名 */\n  mainClass?: string;\n  /** 小数部分的类名 */\n  decimalClass?: string;\n  /** 前缀部分的类名 */\n  prefixClass?: string;\n  /** 后缀部分的类名 */\n  suffixClass?: string;\n\n  /** 整数部分的样式 */\n  mainStyle?: StyleValue;\n  /** 小数部分的样式 */\n  decimalStyle?: StyleValue;\n  /** 前缀部分的样式 */\n  prefixStyle?: StyleValue;\n  /** 后缀部分的样式 */\n  suffixStyle?: StyleValue;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/ellipsis-text/ellipsis-text.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CSSProperties } from \"vue\";\n\nimport { computed, ref, watchEffect } from \"vue\";\n\nimport { VbenTooltip } from \"/@/vben/shadcn-ui\";\n\nimport { useElementSize } from \"@vueuse/core\";\n\ninterface Props {\n  /**\n   * 是否启用点击文本展开全部\n   * @default false\n   */\n  expand?: boolean;\n  /**\n   * 文本最大行数\n   * @default 1\n   */\n  line?: number;\n  /**\n   * 文本最大宽度\n   * @default '100%'\n   */\n  maxWidth?: number | string;\n  /**\n   * 提示框位置\n   * @default 'top'\n   */\n  placement?: \"bottom\" | \"left\" | \"right\" | \"top\";\n  /**\n   * 是否启用文本提示框\n   * @default true\n   */\n  tooltip?: boolean;\n  /**\n   * 提示框背景颜色，优先级高于 overlayStyle\n   */\n  tooltipBackgroundColor?: string;\n  /**\n   * 提示文本字体颜色，优先级高于 overlayStyle\n   */\n  tooltipColor?: string;\n  /**\n   * 提示文本字体大小，单位px，优先级高于 overlayStyle\n   */\n  tooltipFontSize?: number;\n  /**\n   * 提示框内容最大宽度，单位px，默认不设置时，提示文本内容自动与展示文本宽度保持一致\n   */\n  tooltipMaxWidth?: number;\n  /**\n   * 提示框内容区域样式\n   * @default { textAlign: 'justify' }\n   */\n  tooltipOverlayStyle?: CSSProperties;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  expand: false,\n  line: 1,\n  maxWidth: \"100%\",\n  placement: \"top\",\n  tooltip: true,\n  tooltipBackgroundColor: \"\",\n  tooltipColor: \"\",\n  tooltipFontSize: 14,\n  tooltipMaxWidth: undefined,\n  tooltipOverlayStyle: () => ({ textAlign: \"justify\" }),\n});\nconst emit = defineEmits<{ expandChange: [boolean] }>();\n\nconst textMaxWidth = computed(() => {\n  if (typeof props.maxWidth === \"number\") {\n    return `${props.maxWidth}px`;\n  }\n  return props.maxWidth;\n});\nconst ellipsis = ref();\nconst isExpand = ref(false);\nconst defaultTooltipMaxWidth = ref();\n\nconst { width: eleWidth } = useElementSize(ellipsis);\n\nwatchEffect(\n  () => {\n    if (props.tooltip && eleWidth.value) {\n      defaultTooltipMaxWidth.value = props.tooltipMaxWidth ?? eleWidth.value + 24;\n    }\n  },\n  { flush: \"post\" }\n);\nfunction onExpand() {\n  isExpand.value = !isExpand.value;\n  emit(\"expandChange\", isExpand.value);\n}\n\nfunction handleExpand() {\n  props.expand && onExpand();\n}\n</script>\n<template>\n  <div>\n    <VbenTooltip\n      :content-style=\"{\n        ...tooltipOverlayStyle,\n        maxWidth: `${defaultTooltipMaxWidth}px`,\n        fontSize: `${tooltipFontSize}px`,\n        color: tooltipColor,\n        backgroundColor: tooltipBackgroundColor,\n      }\"\n      :disabled=\"!props.tooltip || isExpand\"\n      :side=\"placement\"\n    >\n      <slot name=\"tooltip\">\n        <slot></slot>\n      </slot>\n\n      <template #trigger>\n        <div\n          ref=\"ellipsis\"\n          :class=\"{\n            '!cursor-pointer': expand,\n            ['block truncate']: line === 1,\n            [$style.ellipsisMultiLine]: line > 1,\n          }\"\n          :style=\"{\n            '-webkit-line-clamp': isExpand ? '' : line,\n            'max-width': textMaxWidth,\n          }\"\n          class=\"cursor-text overflow-hidden\"\n          v-bind=\"$attrs\"\n          @click=\"handleExpand\"\n        >\n          <slot></slot>\n        </div>\n      </template>\n    </VbenTooltip>\n  </div>\n</template>\n\n<style module>\n.ellipsisMultiLine {\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/ellipsis-text/index.ts",
    "content": "export { default as EllipsisText } from \"./ellipsis-text.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/icon-picker/icon-picker.vue",
    "content": "<script setup lang=\"ts\">\nimport type { VNode } from \"vue\";\n\nimport { computed, ref, watch, watchEffect } from \"vue\";\n\nimport { usePagination } from \"/@/vben/hooks\";\nimport { EmptyIcon, Grip, listIcons } from \"/@/vben/icons\";\nimport { $t } from \"/@/locales\";\n\nimport {\n  Button,\n  Input,\n  Pagination,\n  PaginationEllipsis,\n  PaginationFirst,\n  PaginationLast,\n  PaginationList,\n  PaginationListItem,\n  PaginationNext,\n  PaginationPrev,\n  VbenIcon,\n  VbenIconButton,\n  VbenPopover,\n} from \"/@/vben/shadcn-ui\";\n\nimport { refDebounced, watchDebounced } from \"@vueuse/core\";\n\nimport { fetchIconsData } from \"./icons\";\n\ninterface Props {\n  pageSize?: number;\n  /** 图标集的名字 */\n  prefix?: string;\n  /** 是否自动请求API以获得图标集的数据.提供prefix时有效 */\n  autoFetchApi?: boolean;\n  /**\n   * 图标列表\n   */\n  icons?: string[];\n  /** Input组件 */\n  inputComponent?: VNode;\n  /** 图标插槽名，预览图标将被渲染到此插槽中 */\n  iconSlot?: string;\n  /** input组件的值属性名称 */\n  modelValueProp?: string;\n  /** 图标样式 */\n  iconClass?: string;\n  type?: \"icon\" | \"input\";\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  prefix: \"ant-design\",\n  pageSize: 36,\n  icons: () => [],\n  iconSlot: \"default\",\n  iconClass: \"size-4\",\n  autoFetchApi: true,\n  modelValueProp: \"modelValue\",\n  inputComponent: undefined,\n  type: \"input\",\n});\n\nconst emit = defineEmits<{\n  change: [string];\n}>();\n\nconst modelValue = defineModel({ default: \"\", type: String });\n\nconst visible = ref(false);\nconst currentSelect = ref(\"\");\nconst currentPage = ref(1);\nconst keyword = ref(\"\");\nconst keywordDebounce = refDebounced(keyword, 300);\nconst innerIcons = ref<string[]>([]);\n\nwatchDebounced(\n  () => props.prefix,\n  async prefix => {\n    if (prefix && prefix !== \"svg\" && props.autoFetchApi) {\n      innerIcons.value = await fetchIconsData(prefix);\n    }\n  },\n  { immediate: true, debounce: 500, maxWait: 1000 }\n);\n\nconst currentList = computed(() => {\n  try {\n    if (props.prefix) {\n      if (props.prefix !== \"svg\" && props.autoFetchApi && props.icons.length === 0) {\n        return innerIcons.value;\n      }\n      const icons = listIcons(\"\", props.prefix);\n      if (icons.length === 0) {\n        console.warn(`No icons found for prefix: ${props.prefix}`);\n      }\n      return icons;\n    } else {\n      return props.icons;\n    }\n  } catch (error) {\n    console.error(\"Failed to load icons:\", error);\n    return [];\n  }\n});\n\nconst showList = computed(() => {\n  return currentList.value.filter(item => item.includes(keywordDebounce.value));\n});\n\nconst { paginationList, total, setCurrentPage } = usePagination(showList, props.pageSize);\n\nwatchEffect(() => {\n  currentSelect.value = modelValue.value;\n});\n\nwatch(\n  () => currentSelect.value,\n  v => {\n    emit(\"change\", v);\n  }\n);\n\nconst handleClick = (icon: string) => {\n  currentSelect.value = icon;\n  modelValue.value = icon;\n  close();\n};\n\nconst handlePageChange = (page: number) => {\n  currentPage.value = page;\n  setCurrentPage(page);\n};\n\nfunction toggleOpenState() {\n  visible.value = !visible.value;\n}\n\nfunction open() {\n  visible.value = true;\n}\n\nfunction close() {\n  visible.value = false;\n}\n\nfunction onKeywordChange(v: string) {\n  keyword.value = v;\n}\n\nconst searchInputProps = computed(() => {\n  return {\n    placeholder: $t(\"ui.iconPicker.search\"),\n    [props.modelValueProp]: keyword.value,\n    [`onUpdate:${props.modelValueProp}`]: onKeywordChange,\n    class: \"mx-2\",\n  };\n});\n\ndefineExpose({ toggleOpenState, open, close });\n</script>\n<template>\n  <VbenPopover v-model:open=\"visible\" :content-props=\"{ align: 'end', alignOffset: -11, sideOffset: 8 }\" content-class=\"p-0 pt-3\">\n    <template #trigger>\n      <template v-if=\"props.type === 'input'\">\n        <component\n          :is=\"inputComponent\"\n          v-if=\"props.inputComponent\"\n          :[modelValueProp]=\"currentSelect\"\n          :placeholder=\"$t('ui.iconPicker.placeholder')\"\n          role=\"combobox\"\n          :aria-label=\"$t('ui.iconPicker.placeholder')\"\n          aria-expanded=\"visible\"\n          v-bind=\"$attrs\"\n        >\n          <template #[iconSlot]>\n            <VbenIcon :icon=\"currentSelect || Grip\" class=\"size-4\" aria-hidden=\"true\" />\n          </template>\n        </component>\n        <div v-else class=\"relative w-full\">\n          <Input v-bind=\"$attrs\" v-model=\"currentSelect\" :placeholder=\"$t('ui.iconPicker.placeholder')\" class=\"h-8 w-full pr-8\" role=\"combobox\" :aria-label=\"$t('ui.iconPicker.placeholder')\" aria-expanded=\"visible\" />\n          <VbenIcon :icon=\"currentSelect || Grip\" class=\"absolute right-1 top-1 size-6\" aria-hidden=\"true\" />\n        </div>\n      </template>\n      <VbenIcon v-else :icon=\"currentSelect || Grip\" class=\"size-4\" v-bind=\"$attrs\" />\n    </template>\n    <div class=\"mb-2 flex w-full\">\n      <component :is=\"inputComponent\" v-if=\"inputComponent\" v-bind=\"searchInputProps\" />\n      <Input v-else v-model=\"keyword\" class=\"mx-2 h-8 w-full\" :placeholder=\"$t('ui.iconPicker.search')\" />\n    </div>\n\n    <template v-if=\"paginationList.length > 0\">\n      <div class=\"grid max-h-[360px] w-full grid-cols-6 justify-items-center\">\n        <VbenIconButton v-for=\"(item, index) in paginationList\" :key=\"index\" :tooltip=\"item\" tooltip-side=\"top\" @click=\"handleClick(item)\">\n          <VbenIcon\n            :class=\"{\n              'text-primary transition-all': currentSelect === item,\n            }\"\n            :icon=\"item\"\n          />\n        </VbenIconButton>\n      </div>\n      <div v-if=\"total >= pageSize\" class=\"flex-center flex justify-end overflow-hidden border-t py-2 pr-3\">\n        <Pagination :items-per-page=\"36\" :sibling-count=\"1\" :total=\"total\" show-edges size=\"small\" @update:page=\"handlePageChange\">\n          <PaginationList v-slot=\"{ items }\" class=\"flex w-full items-center gap-1\">\n            <PaginationFirst class=\"size-5\" />\n            <PaginationPrev class=\"size-5\" />\n            <template v-for=\"(item, index) in items\">\n              <PaginationListItem v-if=\"item.type === 'page'\" :key=\"index\" :value=\"item.value\" as-child>\n                <Button :variant=\"item.value === currentPage ? 'default' : 'outline'\" class=\"size-5 p-0 text-sm\">\n                  {{ item.value }}\n                </Button>\n              </PaginationListItem>\n              <PaginationEllipsis v-else :key=\"item.type\" :index=\"index\" class=\"size-5\" />\n            </template>\n            <PaginationNext class=\"size-5\" />\n            <PaginationLast class=\"size-5\" />\n          </PaginationList>\n        </Pagination>\n      </div>\n    </template>\n\n    <template v-else>\n      <div class=\"flex-col-center text-muted-foreground min-h-[150px] w-full\">\n        <EmptyIcon class=\"size-10\" />\n        <div class=\"mt-1 text-sm\">{{ $t(\"common.noData\") }}</div>\n      </div>\n    </template>\n  </VbenPopover>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/icon-picker/icons.ts",
    "content": "import type { Recordable } from \"/@/vben/types\";\n\n/**\n * 一个缓存对象，在不刷新页面时，无需重复请求远程接口\n */\nexport const ICONS_MAP: Recordable<string[]> = {};\n\ninterface IconifyResponse {\n  prefix: string;\n  total: number;\n  title: string;\n  uncategorized?: string[];\n  categories?: Recordable<string[]>;\n  aliases?: Recordable<string>;\n}\n\nconst PENDING_REQUESTS: Recordable<Promise<string[]>> = {};\n\n/**\n * 通过Iconify接口获取图标集数据。\n * 同一时间多个图标选择器同时请求同一个图标集时，实际上只会发起一次请求（所有请求共享同一份结果）。\n * 请求结果会被缓存，刷新页面前同一个图标集不会再次请求\n * @param prefix 图标集名称\n * @returns 图标集中包含的所有图标名称\n */\nexport async function fetchIconsData(prefix: string): Promise<string[]> {\n  if (Reflect.has(ICONS_MAP, prefix) && ICONS_MAP[prefix]) {\n    return ICONS_MAP[prefix];\n  }\n  if (Reflect.has(PENDING_REQUESTS, prefix) && PENDING_REQUESTS[prefix]) {\n    return PENDING_REQUESTS[prefix];\n  }\n  PENDING_REQUESTS[prefix] = (async () => {\n    try {\n      const controller = new AbortController();\n      const timeoutId = setTimeout(() => controller.abort(), 1000 * 10);\n      const response: IconifyResponse = await fetch(`https://api.iconify.design/collection?prefix=${prefix}`, { signal: controller.signal }).then(res => res.json());\n      clearTimeout(timeoutId);\n      const list = response.uncategorized || [];\n      if (response.categories) {\n        for (const category in response.categories) {\n          list.push(...(response.categories[category] || []));\n        }\n      }\n      ICONS_MAP[prefix] = list.map(v => `${prefix}:${v}`);\n    } catch (error) {\n      console.error(`Failed to fetch icons for prefix ${prefix}:`, error);\n      return [] as string[];\n    }\n    return ICONS_MAP[prefix];\n  })();\n  return PENDING_REQUESTS[prefix];\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/icon-picker/index.ts",
    "content": "export { default as IconPicker } from \"./icon-picker.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/index.ts",
    "content": "export * from \"./api-component\";\nexport * from \"./captcha\";\nexport * from \"./col-page\";\nexport * from \"./count-to\";\nexport * from \"./ellipsis-text\";\nexport * from \"./icon-picker\";\nexport * from \"./json-viewer\";\nexport * from \"./loading\";\nexport * from \"./page\";\nexport * from \"./resize\";\nexport * from \"./tippy\";\nexport * from \"/@/vben/form-ui\";\nexport * from \"/@/vben/popup-ui\";\n\n// 给文档用\nexport { VbenButton, VbenButtonGroup, VbenCheckButtonGroup, VbenCountToAnimator, VbenInputPassword, VbenLoading, VbenPinInput, VbenSpinner } from \"/@/vben/shadcn-ui\";\n\nexport { globalShareState } from \"/@/vben/shared/global-state\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/json-viewer/index.ts",
    "content": "export { default as JsonViewer } from \"./index.vue\";\n\nexport * from \"./types\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/json-viewer/index.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { SetupContext } from \"vue\";\n\nimport type { Recordable } from \"/@/vben/types\";\n\nimport type { JsonViewerAction, JsonViewerProps, JsonViewerToggle, JsonViewerValue } from \"./types\";\n\nimport { computed, useAttrs } from \"vue\";\n// @ts-ignore\nimport VueJsonViewer from \"vue-json-viewer\";\n\nimport { $t } from \"/@/locales\";\n\nimport { isBoolean } from \"/@/vben/shared/utils\";\n\ndefineOptions({ name: \"JsonViewer\" });\n\nconst props = withDefaults(defineProps<JsonViewerProps>(), {\n  expandDepth: 1,\n  copyable: false,\n  sort: false,\n  boxed: false,\n  theme: \"default-json-theme\",\n  expanded: false,\n  previewMode: false,\n  showArrayIndex: true,\n  showDoubleQuotes: false,\n});\n\nconst emit = defineEmits<{\n  click: [event: MouseEvent];\n  copied: [event: JsonViewerAction];\n  keyClick: [key: string];\n  toggle: [param: JsonViewerToggle];\n  valueClick: [value: JsonViewerValue];\n}>();\n\nconst attrs: SetupContext[\"attrs\"] = useAttrs();\n\nfunction handleClick(event: MouseEvent) {\n  if (event.target instanceof HTMLElement && event.target.classList.contains(\"jv-item\")) {\n    const pathNode = event.target.closest(\".jv-push\");\n    if (!pathNode || !pathNode.hasAttribute(\"path\")) {\n      return;\n    }\n    const param: JsonViewerValue = {\n      path: \"\",\n      value: \"\",\n      depth: 0,\n      el: event.target,\n    };\n\n    param.path = pathNode.getAttribute(\"path\") || \"\";\n    param.depth = Number(pathNode.getAttribute(\"depth\")) || 0;\n\n    param.value = event.target.textContent || undefined;\n    param.value = JSON.parse(param.value);\n    emit(\"valueClick\", param);\n  }\n  emit(\"click\", event);\n}\n\nconst bindProps = computed<Recordable<any>>(() => {\n  const copyable = {\n    copyText: $t(\"ui.jsonViewer.copy\"),\n    copiedText: $t(\"ui.jsonViewer.copied\"),\n    timeout: 2000,\n    ...(isBoolean(props.copyable) ? {} : props.copyable),\n  };\n\n  return {\n    ...props,\n    ...attrs,\n    onCopied: (event: JsonViewerAction) => emit(\"copied\", event),\n    onKeyclick: (key: string) => emit(\"keyClick\", key),\n    onClick: (event: MouseEvent) => handleClick(event),\n    copyable: props.copyable ? copyable : false,\n  };\n});\n</script>\n<template>\n  <VueJsonViewer v-bind=\"bindProps\">\n    <template #copy=\"slotProps\">\n      <slot name=\"copy\" v-bind=\"slotProps\"></slot>\n    </template>\n  </VueJsonViewer>\n</template>\n<style lang=\"scss\">\n@use \"./style.scss\";\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/json-viewer/style.scss",
    "content": ".default-json-theme {\n  font-family: Consolas, Menlo, Courier, monospace;\n  font-size: 14px;\n  color: hsl(var(--foreground));\n  white-space: nowrap;\n  background: hsl(var(--background));\n\n  &.jv-container.boxed {\n    border: 1px solid hsl(var(--border));\n  }\n\n  .jv-ellipsis {\n    display: inline-block;\n    padding: 0 4px 2px;\n    font-size: 0.9em;\n    line-height: 0.9;\n    color: hsl(var(--secondary-foreground));\n    vertical-align: 2px;\n    cursor: pointer;\n    user-select: none;\n    background-color: hsl(var(--secondary));\n    border-radius: 3px;\n  }\n\n  .jv-button {\n    color: hsl(var(--primary));\n  }\n\n  .jv-key {\n    color: hsl(var(--heavy-foreground));\n  }\n\n  .jv-item {\n    &.jv-array {\n      color: hsl(var(--heavy-foreground));\n    }\n\n    &.jv-boolean {\n      color: hsl(var(--red-400));\n    }\n\n    &.jv-function {\n      color: hsl(var(--destructive-foreground));\n    }\n\n    &.jv-number {\n      color: hsl(var(--info-foreground));\n    }\n\n    &.jv-number-float {\n      color: hsl(var(--info-foreground));\n    }\n\n    &.jv-number-integer {\n      color: hsl(var(--info-foreground));\n    }\n\n    &.jv-object {\n      color: hsl(var(--accent-darker));\n    }\n\n    &.jv-undefined {\n      color: hsl(var(--secondary-foreground));\n    }\n\n    &.jv-string {\n      color: hsl(var(--primary));\n      word-break: break-word;\n      white-space: normal;\n    }\n  }\n\n  &.jv-container .jv-code {\n    padding: 10px;\n\n    &.boxed:not(.open) {\n      padding-bottom: 20px;\n      margin-bottom: 10px;\n    }\n\n    &.open {\n      padding-bottom: 10px;\n    }\n\n    .jv-toggle {\n      &::before {\n        padding: 0 2px;\n        border-radius: 2px;\n      }\n\n      &:hover {\n        &::before {\n          background: hsl(var(--accent-foreground));\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/json-viewer/types.ts",
    "content": "export interface JsonViewerProps {\n  /** 要展示的结构数据 */\n  value: any;\n  /** 展开深度 */\n  expandDepth?: number;\n  /** 是否可复制 */\n  copyable?: boolean;\n  /** 是否排序 */\n  sort?: boolean;\n  /** 显示边框 */\n  boxed?: boolean;\n  /** 主题 */\n  theme?: string;\n  /** 是否展开 */\n  expanded?: boolean;\n  /** 时间格式化函数 */\n  timeformat?: (time: Date | number | string) => string;\n  /** 预览模式 */\n  previewMode?: boolean;\n  /** 显示数组索引 */\n  showArrayIndex?: boolean;\n  /** 显示双引号 */\n  showDoubleQuotes?: boolean;\n}\n\nexport interface JsonViewerAction {\n  action: string;\n  text: string;\n  trigger: HTMLElement;\n}\n\nexport interface JsonViewerValue {\n  value: any;\n  path: string;\n  depth: number;\n  el: HTMLElement;\n}\n\nexport interface JsonViewerToggle {\n  /** 鼠标事件 */\n  event: MouseEvent;\n  /** 当前展开状态 */\n  open: boolean;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/loading/directive.ts",
    "content": "import type { App, Directive, DirectiveBinding } from \"vue\";\n\nimport { h, render } from \"vue\";\n\nimport { VbenLoading, VbenSpinner } from \"/@/vben/shadcn-ui\";\nimport { isString } from \"/@/vben/shared/utils\";\n\nconst LOADING_INSTANCE_KEY = Symbol(\"loading\");\nconst SPINNER_INSTANCE_KEY = Symbol(\"spinner\");\n\nconst CLASS_NAME_RELATIVE = \"spinner-parent--relative\";\n\nconst loadingDirective: Directive = {\n  mounted(el, binding) {\n    const instance = h(VbenLoading, getOptions(binding));\n    render(instance, el);\n\n    el.classList.add(CLASS_NAME_RELATIVE);\n    el[LOADING_INSTANCE_KEY] = instance;\n  },\n  unmounted(el) {\n    const instance = el[LOADING_INSTANCE_KEY];\n    el.classList.remove(CLASS_NAME_RELATIVE);\n    render(null, el);\n    instance.el.remove();\n\n    el[LOADING_INSTANCE_KEY] = null;\n  },\n\n  updated(el, binding) {\n    const instance = el[LOADING_INSTANCE_KEY];\n    const options = getOptions(binding);\n    if (options && instance?.component) {\n      try {\n        Object.keys(options).forEach(key => {\n          instance.component.props[key] = options[key];\n        });\n        instance.component.update();\n      } catch (error) {\n        console.error(\"Failed to update loading component in directive:\", error);\n      }\n    }\n  },\n};\n\nfunction getOptions(binding: DirectiveBinding) {\n  if (binding.value === undefined) {\n    return { spinning: true };\n  } else if (typeof binding.value === \"boolean\") {\n    return { spinning: binding.value };\n  } else {\n    return { ...binding.value };\n  }\n}\n\nconst spinningDirective: Directive = {\n  mounted(el, binding) {\n    const instance = h(VbenSpinner, getOptions(binding));\n    render(instance, el);\n\n    el.classList.add(CLASS_NAME_RELATIVE);\n    el[SPINNER_INSTANCE_KEY] = instance;\n  },\n  unmounted(el) {\n    const instance = el[SPINNER_INSTANCE_KEY];\n    el.classList.remove(CLASS_NAME_RELATIVE);\n    render(null, el);\n    instance.el.remove();\n\n    el[SPINNER_INSTANCE_KEY] = null;\n  },\n\n  updated(el, binding) {\n    const instance = el[SPINNER_INSTANCE_KEY];\n    const options = getOptions(binding);\n    if (options && instance?.component) {\n      try {\n        Object.keys(options).forEach(key => {\n          instance.component.props[key] = options[key];\n        });\n        instance.component.update();\n      } catch (error) {\n        console.error(\"Failed to update spinner component in directive:\", error);\n      }\n    }\n  },\n};\n\ntype loadingDirectiveParams = {\n  /** 是否注册loading指令。如果提供一个string，则将指令注册为指定的名称 */\n  loading?: boolean | string;\n  /** 是否注册spinning指令。如果提供一个string，则将指令注册为指定的名称 */\n  spinning?: boolean | string;\n};\n\n/**\n * 注册loading指令\n * @param app\n * @param params\n */\nexport function registerLoadingDirective(app: App, params?: loadingDirectiveParams) {\n  // 注入一个样式供指令使用，确保容器是相对定位\n  const style = document.createElement(\"style\");\n  style.id = CLASS_NAME_RELATIVE;\n  style.innerHTML = `\n    .${CLASS_NAME_RELATIVE} {\n      position: relative !important;\n    }\n  `;\n  document.head.append(style);\n  if (params?.loading !== false) {\n    app.directive(isString(params?.loading) ? params.loading : \"loading\", loadingDirective);\n  }\n  if (params?.spinning !== false) {\n    app.directive(isString(params?.spinning) ? params.spinning : \"spinning\", spinningDirective);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/loading/index.ts",
    "content": "export * from \"./directive\";\nexport { default as Loading } from \"./loading.vue\";\nexport { default as Spinner } from \"./spinner.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/loading/loading.vue",
    "content": "<script lang=\"ts\" setup>\nimport { VbenLoading } from \"/@/vben/shadcn-ui\";\nimport { cn } from \"/@/vben/shared/utils\";\ndefineOptions({\n  name: \"VbenLoading\",\n});\ninterface LoadingProps {\n  class?: string;\n  /**\n   * @zh_CN 最小加载时间\n   * @en_US Minimum loading time\n   */\n  minLoadingTime?: number;\n\n  /**\n   * @zh_CN loading状态开启\n   */\n  spinning?: boolean;\n  /**\n   * @zh_CN 文字\n   */\n  text?: string;\n}\n\ndefineOptions({ name: \"Loading\" });\nconst props = defineProps<LoadingProps>();\n</script>\n<template>\n  <div :class=\"cn('relative min-h-20', props.class)\">\n    <slot></slot>\n    <VbenLoading :min-loading-time=\"props.minLoadingTime\" :spinning=\"props.spinning\" :text=\"props.text\">\n      <template v-if=\"$slots.icon\" #icon>\n        <slot name=\"icon\"></slot>\n      </template>\n    </VbenLoading>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/loading/spinner.vue",
    "content": "<script lang=\"ts\" setup>\nimport { VbenSpinner } from \"/@/vben/shadcn-ui\";\nimport { cn } from \"/@/vben/shared/utils\";\n\ninterface SpinnerProps {\n  class?: string;\n  /**\n   * @zh_CN 最小加载时间\n   * @en_US Minimum loading time\n   */\n  minLoadingTime?: number;\n  /**\n   * @zh_CN loading状态开启\n   */\n  spinning?: boolean;\n}\ndefineOptions({ name: \"Spinner\" });\nconst props = defineProps<SpinnerProps>();\n</script>\n<template>\n  <div :class=\"cn('relative min-h-20', props.class)\">\n    <slot></slot>\n    <VbenSpinner :min-loading-time=\"props.minLoadingTime\" :spinning=\"props.spinning\" />\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/page/__tests__/page.test.ts",
    "content": "import { mount } from \"@vue/test-utils\";\n\nimport { describe, expect, it } from \"vitest\";\n\nimport { Page } from \"..\";\n\ndescribe(\"page.vue\", () => {\n  it(\"renders title when passed\", () => {\n    const wrapper = mount(Page, {\n      props: {\n        title: \"Test Title\",\n      },\n    });\n\n    expect(wrapper.text()).toContain(\"Test Title\");\n  });\n\n  it(\"renders description when passed\", () => {\n    const wrapper = mount(Page, {\n      props: {\n        description: \"Test Description\",\n      },\n    });\n\n    expect(wrapper.text()).toContain(\"Test Description\");\n  });\n\n  it(\"renders default slot content\", () => {\n    const wrapper = mount(Page, {\n      slots: {\n        default: \"<p>Default Slot Content</p>\",\n      },\n    });\n\n    expect(wrapper.html()).toContain(\"<p>Default Slot Content</p>\");\n  });\n\n  it(\"renders footer slot when showFooter is true\", () => {\n    const wrapper = mount(Page, {\n      props: {\n        showFooter: true,\n      },\n      slots: {\n        footer: \"<p>Footer Slot Content</p>\",\n      },\n    });\n\n    expect(wrapper.html()).toContain(\"<p>Footer Slot Content</p>\");\n  });\n\n  it(\"applies the custom contentClass\", () => {\n    const wrapper = mount(Page, {\n      props: {\n        contentClass: \"custom-class\",\n      },\n    });\n\n    const contentDiv = wrapper.find(\".p-4\");\n    expect(contentDiv.classes()).toContain(\"custom-class\");\n  });\n\n  it(\"does not render title slot if title prop is provided\", () => {\n    const wrapper = mount(Page, {\n      props: {\n        title: \"Test Title\",\n      },\n      slots: {\n        title: \"<p>Title Slot Content</p>\",\n      },\n    });\n\n    expect(wrapper.text()).toContain(\"Title Slot Content\");\n    expect(wrapper.html()).not.toContain(\"Test Title\");\n  });\n\n  it(\"does not render description slot if description prop is provided\", () => {\n    const wrapper = mount(Page, {\n      props: {\n        description: \"Test Description\",\n      },\n      slots: {\n        description: \"<p>Description Slot Content</p>\",\n      },\n    });\n\n    expect(wrapper.text()).toContain(\"Description Slot Content\");\n    expect(wrapper.html()).not.toContain(\"Test Description\");\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/page/index.ts",
    "content": "export { default as Page } from \"./page.vue\";\nexport * from \"./types\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/page/page.vue",
    "content": "<script setup lang=\"ts\">\nimport type { StyleValue } from \"vue\";\n\nimport type { PageProps } from \"./types\";\n\nimport { computed, nextTick, onMounted, ref, useTemplateRef } from \"vue\";\n\nimport { CSS_VARIABLE_LAYOUT_CONTENT_HEIGHT } from \"/@/vben/shared/constants\";\nimport { cn } from \"/@/vben/shared/utils\";\n\ndefineOptions({\n  name: \"Page\",\n});\n\nconst { autoContentHeight = false } = defineProps<PageProps>();\n\nconst headerHeight = ref(0);\nconst footerHeight = ref(0);\nconst shouldAutoHeight = ref(false);\n\nconst headerRef = useTemplateRef<HTMLDivElement>(\"headerRef\");\nconst footerRef = useTemplateRef<HTMLDivElement>(\"footerRef\");\n\nconst contentStyle = computed<StyleValue>(() => {\n  if (autoContentHeight) {\n    return {\n      height: `calc(var(${CSS_VARIABLE_LAYOUT_CONTENT_HEIGHT}) - ${headerHeight.value}px)`,\n      overflowY: shouldAutoHeight.value ? \"auto\" : \"unset\",\n    };\n  }\n  return {};\n});\n\nasync function calcContentHeight() {\n  if (!autoContentHeight) {\n    return;\n  }\n  await nextTick();\n  headerHeight.value = headerRef.value?.offsetHeight || 0;\n  footerHeight.value = footerRef.value?.offsetHeight || 0;\n  setTimeout(() => {\n    shouldAutoHeight.value = true;\n  }, 30);\n}\n\nonMounted(() => {\n  calcContentHeight();\n});\n</script>\n\n<template>\n  <div class=\"relative\">\n    <div v-if=\"description || $slots.description || title || $slots.title || $slots.extra\" ref=\"headerRef\" :class=\"cn('bg-card border-border relative flex items-end border-b px-6 py-4', headerClass)\">\n      <div class=\"flex-auto\">\n        <slot name=\"title\">\n          <div v-if=\"title\" class=\"mb-2 flex text-lg font-semibold\">\n            {{ title }}\n          </div>\n        </slot>\n\n        <slot name=\"description\">\n          <p v-if=\"description\" class=\"text-muted-foreground\">\n            {{ description }}\n          </p>\n        </slot>\n      </div>\n\n      <div v-if=\"$slots.extra\">\n        <slot name=\"extra\"></slot>\n      </div>\n    </div>\n\n    <div :class=\"cn('h-full p-4', contentClass)\" :style=\"contentStyle\">\n      <slot></slot>\n    </div>\n\n    <div v-if=\"$slots.footer\" ref=\"footerRef\" :class=\"cn('bg-card align-center absolute bottom-0 left-0 right-0 flex px-6 py-4', footerClass)\">\n      <slot name=\"footer\"></slot>\n    </div>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/page/types.ts",
    "content": "export interface PageProps {\n  title?: string;\n  description?: string;\n  contentClass?: string;\n  /**\n   * 根据content可见高度自适应\n   */\n  autoContentHeight?: boolean;\n  headerClass?: string;\n  footerClass?: string;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/resize/index.ts",
    "content": "export { default as VResize } from \"./resize.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/resize/resize.vue",
    "content": "<script lang=\"ts\" setup>\n/**\n * This components is refactored from vue-drag-resize: https://github.com/kirillmurashov/vue-drag-resize\n */\n\nimport { computed, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, ref, toRefs, watch } from \"vue\";\n\nconst props = defineProps({\n  stickSize: {\n    type: Number,\n    default: 8,\n  },\n  parentScaleX: {\n    type: Number,\n    default: 1,\n  },\n  parentScaleY: {\n    type: Number,\n    default: 1,\n  },\n  isActive: {\n    type: Boolean,\n    default: false,\n  },\n  preventActiveBehavior: {\n    type: Boolean,\n    default: false,\n  },\n  isDraggable: {\n    type: Boolean,\n    default: true,\n  },\n  isResizable: {\n    type: Boolean,\n    default: true,\n  },\n  aspectRatio: {\n    type: Boolean,\n    default: false,\n  },\n  parentLimitation: {\n    type: Boolean,\n    default: false,\n  },\n  snapToGrid: {\n    type: Boolean,\n    default: false,\n  },\n  gridX: {\n    type: Number,\n    default: 50,\n    validator(val: number) {\n      return val >= 0;\n    },\n  },\n  gridY: {\n    type: Number,\n    default: 50,\n    validator(val: number) {\n      return val >= 0;\n    },\n  },\n  parentW: {\n    type: Number,\n    default: 0,\n    validator(val: number) {\n      return val >= 0;\n    },\n  },\n  parentH: {\n    type: Number,\n    default: 0,\n    validator(val: number) {\n      return val >= 0;\n    },\n  },\n  w: {\n    type: [String, Number],\n    default: 200,\n    validator(val: number) {\n      return typeof val === \"string\" ? val === \"auto\" : val >= 0;\n    },\n  },\n  h: {\n    type: [String, Number],\n    default: 200,\n    validator(val: number) {\n      return typeof val === \"string\" ? val === \"auto\" : val >= 0;\n    },\n  },\n  minw: {\n    type: Number,\n    default: 50,\n    validator(val: number) {\n      return val >= 0;\n    },\n  },\n  minh: {\n    type: Number,\n    default: 50,\n    validator(val: number) {\n      return val >= 0;\n    },\n  },\n  x: {\n    type: Number,\n    default: 0,\n    validator(val: number) {\n      return typeof val === \"number\";\n    },\n  },\n  y: {\n    type: Number,\n    default: 0,\n    validator(val: number) {\n      return typeof val === \"number\";\n    },\n  },\n  z: {\n    type: [String, Number],\n    default: \"auto\",\n    validator(val: number) {\n      return typeof val === \"string\" ? val === \"auto\" : val >= 0;\n    },\n  },\n  dragHandle: {\n    type: String,\n    default: null,\n  },\n  dragCancel: {\n    type: String,\n    default: null,\n  },\n  sticks: {\n    type: Array<\"bl\" | \"bm\" | \"br\" | \"ml\" | \"mr\" | \"tl\" | \"tm\" | \"tr\">,\n    default() {\n      return [\"tl\", \"tm\", \"tr\", \"mr\", \"br\", \"bm\", \"bl\", \"ml\"];\n    },\n  },\n  axis: {\n    type: String,\n    default: \"both\",\n    validator(val: string) {\n      return [\"both\", \"none\", \"x\", \"y\"].includes(val);\n    },\n  },\n  contentClass: {\n    type: String,\n    required: false,\n    default: \"\",\n  },\n});\n\nconst emit = defineEmits([\"clicked\", \"dragging\", \"dragstop\", \"resizing\", \"resizestop\", \"activated\", \"deactivated\"]);\n\nconst styleMapping = {\n  y: {\n    t: \"top\",\n    m: \"marginTop\",\n    b: \"bottom\",\n  },\n  x: {\n    l: \"left\",\n    m: \"marginLeft\",\n    r: \"right\",\n  },\n};\n\nfunction addEvents(events: Map<string, (...args: any[]) => void>) {\n  events.forEach((cb, eventName) => {\n    document.documentElement.addEventListener(eventName, cb);\n  });\n}\n\nfunction removeEvents(events: Map<string, (...args: any[]) => void>) {\n  events.forEach((cb, eventName) => {\n    document.documentElement.removeEventListener(eventName, cb);\n  });\n}\n\nconst {\n  stickSize,\n  parentScaleX,\n  parentScaleY,\n  isActive,\n  preventActiveBehavior,\n  isDraggable,\n  isResizable,\n  aspectRatio,\n  parentLimitation,\n  snapToGrid,\n  gridX,\n  gridY,\n  parentW,\n  parentH,\n  w,\n  h,\n  minw,\n  minh,\n  x,\n  y,\n  z,\n  dragHandle,\n  dragCancel,\n  sticks,\n  axis,\n  contentClass,\n} = toRefs(props);\n\n// states\nconst active = ref(false);\nconst zIndex = ref<null | number>(null);\nconst parentWidth = ref<null | number>(null);\nconst parentHeight = ref<null | number>(null);\nconst left = ref<null | number>(null);\nconst top = ref<null | number>(null);\nconst right = ref<null | number>(null);\nconst bottom = ref<null | number>(null);\n\nconst aspectFactor = ref<null | number>(null);\n\n// state end\n\nconst stickDrag = ref(false);\nconst bodyDrag = ref(false);\nconst dimensionsBeforeMove = ref({\n  pointerX: 0,\n  pointerY: 0,\n  x: 0,\n  y: 0,\n  w: 0,\n  h: 0,\n  top: 0,\n  right: 0,\n  bottom: 0,\n  left: 0,\n  width: 0,\n  height: 0,\n});\nconst limits = ref({\n  left: { min: null as null | number, max: null as null | number },\n  right: { min: null as null | number, max: null as null | number },\n  top: { min: null as null | number, max: null as null | number },\n  bottom: { min: null as null | number, max: null as null | number },\n});\nconst currentStick = ref<null | string>(null);\n\nconst parentElement = ref<HTMLElement | null>(null);\n\nconst width = computed(() => parentWidth.value! - left.value! - right.value!);\n\nconst height = computed(() => parentHeight.value! - top.value! - bottom.value!);\n\nconst rect = computed(() => ({\n  left: Math.round(left.value!),\n  top: Math.round(top.value!),\n  width: Math.round(width.value),\n  height: Math.round(height.value),\n}));\n\nconst saveDimensionsBeforeMove = ({ pointerX, pointerY }: { pointerX: number; pointerY: number }) => {\n  dimensionsBeforeMove.value.pointerX = pointerX;\n  dimensionsBeforeMove.value.pointerY = pointerY;\n\n  dimensionsBeforeMove.value.left = left.value as number;\n  dimensionsBeforeMove.value.right = right.value as number;\n  dimensionsBeforeMove.value.top = top.value as number;\n  dimensionsBeforeMove.value.bottom = bottom.value as number;\n\n  dimensionsBeforeMove.value.width = width.value as number;\n  dimensionsBeforeMove.value.height = height.value as number;\n\n  aspectFactor.value = width.value / height.value;\n};\n\nconst sideCorrectionByLimit = (limit: { max: number; min: number }, current: number) => {\n  let value = current;\n\n  if (limit.min !== null && current < limit.min) {\n    value = limit.min;\n  } else if (limit.max !== null && limit.max < current) {\n    value = limit.max;\n  }\n\n  return value;\n};\n\nconst rectCorrectionByLimit = (rect: { newBottom: number; newLeft: number; newRight: number; newTop: number }) => {\n  // const { limits } = this;\n  let { newRight, newLeft, newBottom, newTop } = rect;\n\n  type RectRange = {\n    max: number;\n    min: number;\n  };\n\n  newLeft = sideCorrectionByLimit(limits.value.left as RectRange, newLeft);\n  newRight = sideCorrectionByLimit(limits.value.right as RectRange, newRight);\n  newTop = sideCorrectionByLimit(limits.value.top as RectRange, newTop);\n  newBottom = sideCorrectionByLimit(limits.value.bottom as RectRange, newBottom);\n\n  return {\n    newLeft,\n    newRight,\n    newTop,\n    newBottom,\n  };\n};\n\nconst rectCorrectionByAspectRatio = (rect: { newBottom: number; newLeft: number; newRight: number; newTop: number }) => {\n  let { newLeft, newRight, newTop, newBottom } = rect;\n  // const { parentWidth, parentHeight, currentStick, aspectFactor, dimensionsBeforeMove } = this;\n\n  let newWidth = parentWidth.value! - newLeft - newRight;\n  let newHeight = parentHeight.value! - newTop - newBottom;\n\n  if (currentStick.value![1] === \"m\") {\n    const deltaHeight = newHeight - dimensionsBeforeMove.value.height;\n\n    newLeft -= (deltaHeight * aspectFactor.value!) / 2;\n    newRight -= (deltaHeight * aspectFactor.value!) / 2;\n  } else if (currentStick.value![0] === \"m\") {\n    const deltaWidth = newWidth - dimensionsBeforeMove.value.width;\n\n    newTop -= deltaWidth / aspectFactor.value! / 2;\n    newBottom -= deltaWidth / aspectFactor.value! / 2;\n  } else if (newWidth / newHeight > aspectFactor.value!) {\n    newWidth = aspectFactor.value! * newHeight;\n\n    if (currentStick.value![1] === \"l\") {\n      newLeft = parentWidth.value! - newRight - newWidth;\n    } else {\n      newRight = parentWidth.value! - newLeft - newWidth;\n    }\n  } else {\n    newHeight = newWidth / aspectFactor.value!;\n\n    if (currentStick.value![0] === \"t\") {\n      newTop = parentHeight.value! - newBottom - newHeight;\n    } else {\n      newBottom = parentHeight.value! - newTop - newHeight;\n    }\n  }\n\n  return { newLeft, newRight, newTop, newBottom };\n};\n\nconst stickMove = (delta: { x: number; y: number }) => {\n  let newTop = dimensionsBeforeMove.value.top;\n  let newBottom = dimensionsBeforeMove.value.bottom;\n  let newLeft = dimensionsBeforeMove.value.left;\n  let newRight = dimensionsBeforeMove.value.right;\n  switch (currentStick.value![0]) {\n    case \"b\": {\n      newBottom = dimensionsBeforeMove.value.bottom + delta.y;\n\n      if (snapToGrid.value) {\n        newBottom = (parentHeight.value as number) - Math.round(((parentHeight.value as number) - newBottom) / gridY.value) * gridY.value;\n      }\n\n      break;\n    }\n\n    case \"t\": {\n      newTop = dimensionsBeforeMove.value.top - delta.y;\n\n      if (snapToGrid.value) {\n        newTop = Math.round(newTop / gridY.value) * gridY.value;\n      }\n\n      break;\n    }\n    default: {\n      break;\n    }\n  }\n\n  switch (currentStick.value![1]) {\n    case \"l\": {\n      newLeft = dimensionsBeforeMove.value.left - delta.x;\n\n      if (snapToGrid.value) {\n        newLeft = Math.round(newLeft / gridX.value) * gridX.value;\n      }\n\n      break;\n    }\n\n    case \"r\": {\n      newRight = dimensionsBeforeMove.value.right + delta.x;\n\n      if (snapToGrid.value) {\n        newRight = (parentWidth.value as number) - Math.round(((parentWidth.value as number) - newRight) / gridX.value) * gridX.value;\n      }\n\n      break;\n    }\n    default: {\n      break;\n    }\n  }\n\n  ({ newLeft, newRight, newTop, newBottom } = rectCorrectionByLimit({\n    newLeft,\n    newRight,\n    newTop,\n    newBottom,\n  }));\n\n  if (aspectRatio.value) {\n    ({ newLeft, newRight, newTop, newBottom } = rectCorrectionByAspectRatio({\n      newLeft,\n      newRight,\n      newTop,\n      newBottom,\n    }));\n  }\n\n  left.value = newLeft;\n  right.value = newRight;\n  top.value = newTop;\n  bottom.value = newBottom;\n\n  emit(\"resizing\", rect.value);\n};\n\nconst stickUp = () => {\n  stickDrag.value = false;\n  // dimensionsBeforeMove.value = {\n  //   pointerX: 0,\n  //   pointerY: 0,\n  //   x: 0,\n  //   y: 0,\n  //   w: 0,\n  //   h: 0,\n  // };\n\n  Object.assign(dimensionsBeforeMove.value, {\n    pointerX: 0,\n    pointerY: 0,\n    x: 0,\n    y: 0,\n    w: 0,\n    h: 0,\n  });\n\n  limits.value = {\n    left: { min: null, max: null },\n    right: { min: null, max: null },\n    top: { min: null, max: null },\n    bottom: { min: null, max: null },\n  };\n\n  emit(\"resizing\", rect.value);\n  emit(\"resizestop\", rect.value);\n};\n\nconst calcDragLimitation = () => {\n  return {\n    left: { min: 0, max: (parentWidth.value as number) - width.value },\n    right: { min: 0, max: (parentWidth.value as number) - width.value },\n    top: { min: 0, max: (parentHeight.value as number) - height.value },\n    bottom: { min: 0, max: (parentHeight.value as number) - height.value },\n  };\n};\n\nconst calcResizeLimits = () => {\n  // const { aspectFactor, width, height, bottom, top, left, right } = this;\n\n  const parentLim = parentLimitation.value ? 0 : null;\n\n  if (aspectRatio.value) {\n    if (minw.value / minh.value > (aspectFactor.value as number)) {\n      minh.value = minw.value / (aspectFactor.value as number);\n    } else {\n      minw.value = ((aspectFactor.value as number) * minh.value) as number;\n    }\n  }\n\n  const limits = {\n    left: {\n      min: parentLim,\n      max: (left.value as number) + (width.value - minw.value),\n    },\n    right: {\n      min: parentLim,\n      max: (right.value as number) + (width.value - minw.value),\n    },\n    top: {\n      min: parentLim,\n      max: (top.value as number) + (height.value - minh.value),\n    },\n    bottom: {\n      min: parentLim,\n      max: (bottom.value as number) + (height.value - minh.value),\n    },\n  };\n\n  if (aspectRatio.value) {\n    const aspectLimits = {\n      left: {\n        min: left.value! - Math.min(top.value!, bottom.value!) * aspectFactor.value! * 2,\n        max: left.value! + ((height.value - minh.value!) / 2) * aspectFactor.value! * 2,\n      },\n      right: {\n        min: right.value! - Math.min(top.value!, bottom.value!) * aspectFactor.value! * 2,\n        max: right.value! + ((height.value - minh.value!) / 2) * aspectFactor.value! * 2,\n      },\n      top: {\n        min: top.value! - (Math.min(left.value!, right.value!) / aspectFactor.value!) * 2,\n        max: top.value! + ((width.value - minw.value) / 2 / aspectFactor.value!) * 2,\n      },\n      bottom: {\n        min: bottom.value! - (Math.min(left.value!, right.value!) / aspectFactor.value!) * 2,\n        max: bottom.value! + ((width.value - minw.value) / 2 / aspectFactor.value!) * 2,\n      },\n    };\n\n    if (currentStick.value![0] === \"m\") {\n      limits.left = {\n        min: Math.max(limits.left.min!, aspectLimits.left.min),\n        max: Math.min(limits.left.max, aspectLimits.left.max),\n      };\n      limits.right = {\n        min: Math.max(limits.right.min!, aspectLimits.right.min),\n        max: Math.min(limits.right.max, aspectLimits.right.max),\n      };\n    } else if (currentStick.value![1] === \"m\") {\n      limits.top = {\n        min: Math.max(limits.top.min!, aspectLimits.top.min),\n        max: Math.min(limits.top.max, aspectLimits.top.max),\n      };\n      limits.bottom = {\n        min: Math.max(limits.bottom.min!, aspectLimits.bottom.min),\n        max: Math.min(limits.bottom.max, aspectLimits.bottom.max),\n      };\n    }\n  }\n\n  return limits;\n};\n\nconst positionStyle = computed(() => ({\n  top: `${top.value}px`,\n  left: `${left.value}px`,\n  zIndex: zIndex.value!,\n}));\n\nconst sizeStyle = computed(() => ({\n  width: w.value === \"auto\" ? \"auto\" : `${width.value}px`,\n  height: h.value === \"auto\" ? \"auto\" : `${height.value}px`,\n}));\n\nconst stickStyles = computed(() => (stick: string) => {\n  const stickStyle = {\n    width: `${stickSize.value / parentScaleX.value}px`,\n    height: `${stickSize.value / parentScaleY.value}px`,\n  };\n  stickStyle[styleMapping.y[stick[0] as \"b\" | \"m\" | \"t\"] as \"height\" | \"width\"] = `${stickSize.value / parentScaleX.value / -2}px`;\n  stickStyle[styleMapping.x[stick[1] as \"l\" | \"m\" | \"r\"] as \"height\" | \"width\"] = `${stickSize.value / parentScaleX.value / -2}px`;\n  return stickStyle;\n});\n\nconst bodyMove = (delta: { x: number; y: number }) => {\n  let newTop = dimensionsBeforeMove.value.top - delta.y;\n  let newBottom = dimensionsBeforeMove.value.bottom + delta.y;\n  let newLeft = dimensionsBeforeMove.value.left - delta.x;\n  let newRight = dimensionsBeforeMove.value.right + delta.x;\n\n  if (snapToGrid.value) {\n    let alignTop = true;\n    let alignLeft = true;\n\n    let diffT = newTop - Math.floor(newTop / gridY.value) * gridY.value;\n    let diffB = (parentHeight.value as number) - newBottom - Math.floor(((parentHeight.value as number) - newBottom) / gridY.value) * gridY.value;\n    let diffL = newLeft - Math.floor(newLeft / gridX.value) * gridX.value;\n    let diffR = (parentWidth.value as number) - newRight - Math.floor(((parentWidth.value as number) - newRight) / gridX.value) * gridX.value;\n\n    if (diffT > gridY.value / 2) {\n      diffT -= gridY.value;\n    }\n    if (diffB > gridY.value / 2) {\n      diffB -= gridY.value;\n    }\n    if (diffL > gridX.value / 2) {\n      diffL -= gridX.value;\n    }\n    if (diffR > gridX.value / 2) {\n      diffR -= gridX.value;\n    }\n\n    if (Math.abs(diffB) < Math.abs(diffT)) {\n      alignTop = false;\n    }\n    if (Math.abs(diffR) < Math.abs(diffL)) {\n      alignLeft = false;\n    }\n\n    newTop -= alignTop ? diffT : diffB;\n    newBottom = (parentHeight.value as number) - height.value - newTop;\n    newLeft -= alignLeft ? diffL : diffR;\n    newRight = (parentWidth.value as number) - width.value - newLeft;\n  }\n\n  ({ newLeft: left.value, newRight: right.value, newTop: top.value, newBottom: bottom.value } = rectCorrectionByLimit({ newLeft, newRight, newTop, newBottom }));\n\n  emit(\"dragging\", rect.value);\n};\n\nconst bodyUp = () => {\n  bodyDrag.value = false;\n  emit(\"dragging\", rect.value);\n  emit(\"dragstop\", rect.value);\n\n  // dimensionsBeforeMove.value = { pointerX: 0, pointerY: 0, x: 0, y: 0, w: 0, h: 0 };\n  Object.assign(dimensionsBeforeMove.value, {\n    pointerX: 0,\n    pointerY: 0,\n    x: 0,\n    y: 0,\n    w: 0,\n    h: 0,\n  });\n\n  limits.value = {\n    left: { min: null, max: null },\n    right: { min: null, max: null },\n    top: { min: null, max: null },\n    bottom: { min: null, max: null },\n  };\n};\n\nconst stickDown = (stick: string, ev: { pageX: any; pageY: any; touches?: any }, force = false) => {\n  if ((!isResizable.value || !active.value) && !force) {\n    return;\n  }\n\n  stickDrag.value = true;\n\n  const pointerX = ev.pageX === undefined ? ev.touches[0].pageX : ev.pageX;\n  const pointerY = ev.pageY === undefined ? ev.touches[0].pageY : ev.pageY;\n\n  saveDimensionsBeforeMove({ pointerX, pointerY });\n\n  currentStick.value = stick;\n\n  limits.value = calcResizeLimits();\n};\n\nconst move = (ev: MouseEvent & TouchEvent) => {\n  if (!stickDrag.value && !bodyDrag.value) {\n    return;\n  }\n\n  ev.stopPropagation();\n\n  // touches 兼容性代码\n  const pageX = ev.pageX === undefined ? ev.touches![0]!.pageX : ev.pageX;\n  const pageY = ev.pageY === undefined ? ev.touches![0]!.pageY : ev.pageY;\n\n  const delta = {\n    x: (dimensionsBeforeMove.value.pointerX - pageX) / parentScaleX.value,\n    y: (dimensionsBeforeMove.value.pointerY - pageY) / parentScaleY.value,\n  };\n\n  if (stickDrag.value) {\n    stickMove(delta);\n  }\n\n  if (bodyDrag.value) {\n    switch (axis.value) {\n      case \"none\": {\n        return;\n      }\n      case \"x\": {\n        delta.y = 0;\n\n        break;\n      }\n      case \"y\": {\n        delta.x = 0;\n\n        break;\n      }\n      // No default\n    }\n    bodyMove(delta);\n  }\n};\n\nconst up = () => {\n  if (stickDrag.value) {\n    stickUp();\n  } else if (bodyDrag.value) {\n    bodyUp();\n  }\n};\n\nconst deselect = () => {\n  if (preventActiveBehavior.value) {\n    return;\n  }\n  active.value = false;\n};\n\nconst domEvents = ref(\n  new Map([\n    [\"mousedown\", deselect],\n    [\"mouseleave\", up],\n    [\"mousemove\", move],\n    [\"mouseup\", up],\n    [\"touchcancel\", up],\n    [\"touchend\", up],\n    [\"touchmove\", move],\n    [\"touchstart\", up],\n  ])\n);\n\nconst container = ref<HTMLDivElement>();\n\nonMounted(() => {\n  const currentInstance = getCurrentInstance();\n  const $el = currentInstance?.vnode.el as HTMLElement;\n\n  parentElement.value = $el?.parentNode as HTMLElement;\n  parentWidth.value = parentW.value ?? parentElement.value?.clientWidth;\n  parentHeight.value = parentH.value ?? parentElement.value?.clientHeight;\n\n  left.value = x.value;\n  top.value = y.value;\n  right.value = (parentWidth.value - (w.value === \"auto\" ? container.value!.scrollWidth : (w.value as number)) - left.value) as number;\n  bottom.value = (parentHeight.value - (h.value === \"auto\" ? container.value!.scrollHeight : (h.value as number)) - top.value) as number;\n\n  addEvents(domEvents.value);\n\n  if (dragHandle.value) {\n    [...($el?.querySelectorAll(dragHandle.value) || [])].forEach(dragHandle => {\n      (dragHandle as HTMLElement).dataset.dragHandle = String(currentInstance?.uid);\n    });\n  }\n\n  if (dragCancel.value) {\n    [...($el?.querySelectorAll(dragCancel.value) || [])].forEach(cancelHandle => {\n      (cancelHandle as HTMLElement).dataset.dragCancel = String(currentInstance?.uid);\n    });\n  }\n});\n\nonBeforeUnmount(() => {\n  removeEvents(domEvents.value);\n});\n\nconst bodyDown = (ev: MouseEvent & TouchEvent) => {\n  const { target, button } = ev;\n\n  if (!preventActiveBehavior.value) {\n    active.value = true;\n  }\n\n  if (button && button !== 0) {\n    return;\n  }\n\n  emit(\"clicked\", ev);\n\n  if (!active.value) {\n    return;\n  }\n\n  if (dragHandle.value && (target! as HTMLElement).dataset.dragHandle !== getCurrentInstance()?.uid.toString()) {\n    return;\n  }\n\n  if (dragCancel.value && (target! as HTMLElement).dataset.dragCancel === getCurrentInstance()?.uid.toString()) {\n    return;\n  }\n\n  if (ev.stopPropagation !== undefined) {\n    ev.stopPropagation();\n  }\n\n  if (ev.preventDefault !== undefined) {\n    ev.preventDefault();\n  }\n\n  if (isDraggable.value) {\n    bodyDrag.value = true;\n  }\n\n  const pointerX = ev.pageX === undefined ? ev.touches[0]!.pageX : ev.pageX;\n  const pointerY = ev.pageY === undefined ? ev.touches[0]!.pageY : ev.pageY;\n\n  saveDimensionsBeforeMove({ pointerX, pointerY });\n\n  if (parentLimitation.value) {\n    limits.value = calcDragLimitation();\n  }\n};\n\nwatch(\n  () => active.value,\n  isActive => {\n    if (isActive) {\n      emit(\"activated\");\n    } else {\n      emit(\"deactivated\");\n    }\n  }\n);\n\nwatch(\n  () => isActive.value,\n  val => {\n    active.value = val;\n  },\n  { immediate: true }\n);\n\nwatch(\n  () => z.value,\n  val => {\n    if ((val as number) >= 0 || val === \"auto\") {\n      zIndex.value = val as number;\n    }\n  },\n  { immediate: true }\n);\n\nwatch(\n  () => x.value,\n  (newVal, oldVal) => {\n    if (stickDrag.value || bodyDrag.value || newVal === left.value) {\n      return;\n    }\n\n    const delta = oldVal - newVal;\n\n    bodyDown({ pageX: left.value!, pageY: top.value! } as MouseEvent & TouchEvent);\n    bodyMove({ x: delta, y: 0 });\n\n    nextTick(() => {\n      bodyUp();\n    });\n  }\n);\n\nwatch(\n  () => y.value,\n  (newVal, oldVal) => {\n    if (stickDrag.value || bodyDrag.value || newVal === top.value) {\n      return;\n    }\n\n    const delta = oldVal - newVal;\n\n    bodyDown({ pageX: left.value, pageY: top.value } as MouseEvent & TouchEvent);\n    bodyMove({ x: 0, y: delta });\n\n    nextTick(() => {\n      bodyUp();\n    });\n  }\n);\n\nwatch(\n  () => w.value,\n  (newVal, oldVal) => {\n    if (stickDrag.value || bodyDrag.value || newVal === width.value) {\n      return;\n    }\n\n    const stick = \"mr\";\n    const delta = (oldVal as number) - (newVal as number);\n\n    stickDown(stick, { pageX: right.value, pageY: top.value! + height.value / 2 }, true);\n    stickMove({ x: delta, y: 0 });\n\n    nextTick(() => {\n      stickUp();\n    });\n  }\n);\n\nwatch(\n  () => h.value,\n  (newVal, oldVal) => {\n    if (stickDrag.value || bodyDrag.value || newVal === height.value) {\n      return;\n    }\n\n    const stick = \"bm\";\n    const delta = (oldVal as number) - (newVal as number);\n\n    stickDown(stick, { pageX: left.value! + width.value / 2, pageY: bottom.value }, true);\n    stickMove({ x: 0, y: delta });\n\n    nextTick(() => {\n      stickUp();\n    });\n  }\n);\n\nwatch(\n  () => parentW.value,\n  val => {\n    right.value = val - width.value - left.value!;\n    parentWidth.value = val;\n  }\n);\n\nwatch(\n  () => parentH.value,\n  val => {\n    bottom.value = val - height.value - top.value!;\n    parentHeight.value = val;\n  }\n);\n</script>\n\n<template>\n  <div\n    :class=\"`${active || isActive ? 'active' : 'inactive'} ${contentClass ? contentClass : ''}`\"\n    :style=\"positionStyle\"\n    class=\"resize\"\n    @mousedown=\"bodyDown($event as TouchEvent & MouseEvent)\"\n    @touchend=\"up\"\n    @touchstart=\"bodyDown($event as TouchEvent & MouseEvent)\"\n  >\n    <div ref=\"container\" :style=\"sizeStyle\" class=\"content-container\">\n      <slot></slot>\n    </div>\n    <div\n      v-for=\"(stick, index) of sticks\"\n      :key=\"index\"\n      :class=\"[`resize-stick-${stick}`, isResizable ? '' : 'not-resizable']\"\n      :style=\"stickStyles(stick)\"\n      class=\"resize-stick\"\n      @mousedown.stop.prevent=\"stickDown(stick, $event as TouchEvent & MouseEvent)\"\n      @touchstart.stop.prevent=\"stickDown(stick, $event as TouchEvent & MouseEvent)\"\n    ></div>\n  </div>\n</template>\n\n<style lang=\"css\" scoped>\n.resize {\n  position: absolute;\n  box-sizing: border-box;\n}\n\n.resize.active::before {\n  position: absolute;\n  top: 0;\n  left: 0;\n  box-sizing: border-box;\n  width: 100%;\n  height: 100%;\n  content: \"\";\n  outline: 1px dashed #d6d6d6;\n}\n\n.resize-stick {\n  position: absolute;\n  box-sizing: border-box;\n  font-size: 1px;\n  background: #fff;\n  border: 1px solid #6c6c6c;\n  box-shadow: 0 0 2px #bbb;\n}\n\n.inactive .resize-stick {\n  display: none;\n}\n\n.resize-stick-tl,\n.resize-stick-br {\n  cursor: nwse-resize;\n}\n\n.resize-stick-tm,\n.resize-stick-bm {\n  left: 50%;\n  cursor: ns-resize;\n}\n\n.resize-stick-tr,\n.resize-stick-bl {\n  cursor: nesw-resize;\n}\n\n.resize-stick-ml,\n.resize-stick-mr {\n  top: 50%;\n  cursor: ew-resize;\n}\n\n.resize-stick.not-resizable {\n  display: none;\n}\n\n.content-container {\n  position: relative;\n  display: block;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/tippy/directive.ts",
    "content": "import type { ComputedRef, Directive } from \"vue\";\n\nimport { useTippy } from \"vue-tippy\";\n\nexport default function useTippyDirective(isDark: ComputedRef<boolean>) {\n  const directive: Directive = {\n    mounted(el, binding, vnode) {\n      const opts = typeof binding.value === \"string\" ? { content: binding.value } : binding.value || {};\n\n      const modifiers = Object.keys(binding.modifiers || {});\n      const placement = modifiers.find(modifier => modifier !== \"arrow\");\n      const withArrow = modifiers.includes(\"arrow\");\n\n      if (placement) {\n        opts.placement = opts.placement || placement;\n      }\n\n      if (withArrow) {\n        opts.arrow = opts.arrow === undefined ? true : opts.arrow;\n      }\n\n      if (vnode.props && vnode.props.onTippyShow) {\n        opts.onShow = function (...args: any[]) {\n          return vnode.props?.onTippyShow(...args);\n        };\n      }\n\n      if (vnode.props && vnode.props.onTippyShown) {\n        opts.onShown = function (...args: any[]) {\n          return vnode.props?.onTippyShown(...args);\n        };\n      }\n\n      if (vnode.props && vnode.props.onTippyHidden) {\n        opts.onHidden = function (...args: any[]) {\n          return vnode.props?.onTippyHidden(...args);\n        };\n      }\n\n      if (vnode.props && vnode.props.onTippyHide) {\n        opts.onHide = function (...args: any[]) {\n          return vnode.props?.onTippyHide(...args);\n        };\n      }\n\n      if (vnode.props && vnode.props.onTippyMount) {\n        opts.onMount = function (...args: any[]) {\n          return vnode.props?.onTippyMount(...args);\n        };\n      }\n\n      if (el.getAttribute(\"title\") && !opts.content) {\n        opts.content = el.getAttribute(\"title\");\n        el.removeAttribute(\"title\");\n      }\n\n      if (el.getAttribute(\"content\") && !opts.content) {\n        opts.content = el.getAttribute(\"content\");\n      }\n\n      useTippy(el, opts);\n    },\n    unmounted(el) {\n      if (el.$tippy) {\n        el.$tippy.destroy();\n      } else if (el._tippy) {\n        el._tippy.destroy();\n      }\n    },\n\n    updated(el, binding) {\n      const opts = typeof binding.value === \"string\" ? { content: binding.value, theme: isDark.value ? \"\" : \"light\" } : Object.assign({ theme: isDark.value ? \"\" : \"light\" }, binding.value);\n\n      if (el.getAttribute(\"title\") && !opts.content) {\n        opts.content = el.getAttribute(\"title\");\n        el.removeAttribute(\"title\");\n      }\n\n      if (el.getAttribute(\"content\") && !opts.content) {\n        opts.content = el.getAttribute(\"content\");\n      }\n\n      if (el.$tippy) {\n        el.$tippy.setProps(opts || {});\n      } else if (el._tippy) {\n        el._tippy.setProps(opts || {});\n      }\n    },\n  };\n  return directive;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/components/tippy/index.ts",
    "content": "import type { DefaultProps, Props } from \"tippy.js\";\n\nimport type { App, SetupContext } from \"vue\";\n\nimport { h, watchEffect } from \"vue\";\nimport { setDefaultProps, Tippy as TippyComponent } from \"vue-tippy\";\n\nimport { usePreferences } from \"/@/vben/preferences\";\n\nimport useTippyDirective from \"./directive\";\n\nimport \"tippy.js/dist/tippy.css\";\nimport \"tippy.js/dist/backdrop.css\";\nimport \"tippy.js/themes/light.css\";\nimport \"tippy.js/animations/scale.css\";\nimport \"tippy.js/animations/shift-toward.css\";\nimport \"tippy.js/animations/shift-away.css\";\nimport \"tippy.js/animations/perspective.css\";\n\nconst { isDark } = usePreferences();\nexport type TippyProps = Partial<\n  Props & {\n    animation?: \"fade\" | \"perspective\" | \"scale\" | \"shift-away\" | \"shift-toward\" | boolean;\n    theme?: \"auto\" | \"dark\" | \"light\";\n  }\n>;\n\nexport function initTippy(app: App<Element>, options?: DefaultProps) {\n  setDefaultProps({\n    allowHTML: true,\n    delay: [500, 200],\n    theme: isDark.value ? \"\" : \"light\",\n    ...options,\n  });\n  if (!options || !Reflect.has(options, \"theme\") || options.theme === \"auto\") {\n    watchEffect(() => {\n      setDefaultProps({ theme: isDark.value ? \"\" : \"light\" });\n    });\n  }\n\n  app.directive(\"tippy\", useTippyDirective(isDark));\n}\n\nexport const Tippy = (props: any, { attrs, slots }: SetupContext) => {\n  let theme: string = (attrs.theme as string) ?? \"auto\";\n  if (theme === \"auto\") {\n    theme = isDark.value ? \"\" : \"light\";\n  }\n  if (theme === \"dark\") {\n    theme = \"\";\n  }\n  return h(\n    TippyComponent,\n    {\n      ...props,\n      ...attrs,\n      theme,\n    },\n    slots\n  );\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/index.ts",
    "content": "export * from \"./components\";\nexport * from \"./ui\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/about/about.ts",
    "content": "import type { Component } from \"vue\";\n\ninterface AboutProps {\n  description?: string;\n  name?: string;\n  title?: string;\n}\n\ninterface DescriptionItem {\n  content: Component | string;\n  title: string;\n}\n\nexport type { AboutProps, DescriptionItem };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/about/about.vue",
    "content": "<script setup lang=\"ts\">\nimport type { AboutProps, DescriptionItem } from \"./about\";\n\nimport { h } from \"vue\";\n\nimport { VBEN_DOC_URL, VBEN_GITHUB_URL, VBEN_PREVIEW_URL } from \"/@/vben/constants\";\n\nimport { VbenRenderContent } from \"/@/vben/shadcn-ui\";\n\nimport { Page } from \"../../components\";\n\ninterface Props extends AboutProps {}\n\ndefineOptions({\n  name: \"AboutUI\",\n});\n\nwithDefaults(defineProps<Props>(), {\n  description:\n    \"是一个现代化开箱即用的中后台解决方案，采用最新的技术栈，包括 Vue 3.0、Vite、TailwindCSS 和 TypeScript 等前沿技术，代码规范严谨，提供丰富的配置选项，旨在为中大型项目的开发提供现成的开箱即用解决方案及丰富的示例，同时，它也是学习和深入前端技术的一个极佳示例。\",\n  name: \"Vben Admin\",\n  title: \"关于项目\",\n});\n\ndeclare global {\n  const __VBEN_ADMIN_METADATA__: {\n    authorEmail: string;\n    authorName: string;\n    authorUrl: string;\n    buildTime: string;\n    dependencies: Record<string, string>;\n    description: string;\n    devDependencies: Record<string, string>;\n    homepage: string;\n    license: string;\n    repositoryUrl: string;\n    version: string;\n  };\n}\n\nconst renderLink = (href: string, text: string) => h(\"a\", { href, target: \"_blank\", class: \"vben-link\" }, { default: () => text });\n\nconst {\n  authorEmail,\n  authorName,\n  authorUrl,\n  buildTime,\n  dependencies = {},\n  devDependencies = {},\n  homepage,\n  license,\n  version,\n  // vite inject-metadata 插件注入的全局变量\n} = __VBEN_ADMIN_METADATA__ || {};\n\nconst vbenDescriptionItems: DescriptionItem[] = [\n  {\n    content: version,\n    title: \"版本号\",\n  },\n  {\n    content: license,\n    title: \"开源许可协议\",\n  },\n  {\n    content: buildTime,\n    title: \"最后构建时间\",\n  },\n  {\n    content: renderLink(homepage, \"点击查看\"),\n    title: \"主页\",\n  },\n  {\n    content: renderLink(VBEN_DOC_URL, \"点击查看\"),\n    title: \"文档地址\",\n  },\n  {\n    content: renderLink(VBEN_PREVIEW_URL, \"点击查看\"),\n    title: \"预览地址\",\n  },\n  {\n    content: renderLink(VBEN_GITHUB_URL, \"点击查看\"),\n    title: \"Github\",\n  },\n  {\n    content: h(\"div\", [renderLink(authorUrl, `${authorName}  `), renderLink(`mailto:${authorEmail}`, authorEmail)]),\n    title: \"作者\",\n  },\n];\n\nconst dependenciesItems = Object.keys(dependencies).map(key => ({\n  content: dependencies[key],\n  title: key,\n}));\n\nconst devDependenciesItems = Object.keys(devDependencies).map(key => ({\n  content: devDependencies[key],\n  title: key,\n}));\n</script>\n\n<template>\n  <Page :title=\"title\">\n    <template #description>\n      <p class=\"text-foreground mt-3 text-sm leading-6\">\n        <a :href=\"VBEN_GITHUB_URL\" class=\"vben-link\" target=\"_blank\">\n          {{ name }}\n        </a>\n        {{ description }}\n      </p>\n    </template>\n    <div class=\"card-box p-5\">\n      <div>\n        <h5 class=\"text-foreground text-lg\">基本信息</h5>\n      </div>\n      <div class=\"mt-4\">\n        <dl class=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4\">\n          <template v-for=\"item in vbenDescriptionItems\" :key=\"item.title\">\n            <div class=\"border-border border-t px-4 py-6 sm:col-span-1 sm:px-0\">\n              <dt class=\"text-foreground text-sm font-medium leading-6\">\n                {{ item.title }}\n              </dt>\n              <dd class=\"text-foreground mt-1 text-sm leading-6 sm:mt-2\">\n                <VbenRenderContent :content=\"item.content\" />\n              </dd>\n            </div>\n          </template>\n        </dl>\n      </div>\n    </div>\n\n    <div class=\"card-box mt-6 p-5\">\n      <div>\n        <h5 class=\"text-foreground text-lg\">生产环境依赖</h5>\n      </div>\n      <div class=\"mt-4\">\n        <dl class=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4\">\n          <template v-for=\"item in dependenciesItems\" :key=\"item.title\">\n            <div class=\"border-border border-t px-4 py-3 sm:col-span-1 sm:px-0\">\n              <dt class=\"text-foreground text-sm\">\n                {{ item.title }}\n              </dt>\n              <dd class=\"text-foreground/80 mt-1 text-sm sm:mt-2\">\n                <VbenRenderContent :content=\"item.content\" />\n              </dd>\n            </div>\n          </template>\n        </dl>\n      </div>\n    </div>\n    <div class=\"card-box mt-6 p-5\">\n      <div>\n        <h5 class=\"text-foreground text-lg\">开发环境依赖</h5>\n      </div>\n      <div class=\"mt-4\">\n        <dl class=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4\">\n          <template v-for=\"item in devDependenciesItems\" :key=\"item.title\">\n            <div class=\"border-border border-t px-4 py-3 sm:col-span-1 sm:px-0\">\n              <dt class=\"text-foreground text-sm\">\n                {{ item.title }}\n              </dt>\n              <dd class=\"text-foreground/80 mt-1 text-sm sm:mt-2\">\n                <VbenRenderContent :content=\"item.content\" />\n              </dd>\n            </div>\n          </template>\n        </dl>\n      </div>\n    </div>\n  </Page>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/about/index.ts",
    "content": "export { default as About } from \"./about.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/authentication/auth-title.vue",
    "content": "<template>\n  <div class=\"mb-7 sm:mx-auto sm:w-full sm:max-w-md\">\n    <h2 class=\"text-foreground mb-3 text-3xl font-bold leading-9 tracking-tight lg:text-4xl\">\n      <slot></slot>\n    </h2>\n\n    <p class=\"text-muted-foreground lg:text-md text-sm\">\n      <slot name=\"desc\"></slot>\n    </p>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/authentication/code-login.vue",
    "content": "<script setup lang=\"ts\">\nimport type { Recordable } from \"/@/vben/types\";\n\nimport type { VbenFormSchema } from \"/@/vben/form-ui\";\n\nimport { computed, reactive } from \"vue\";\nimport { useRouter } from \"vue-router\";\n\nimport { $t } from \"/@/locales\";\n\nimport { useVbenForm } from \"/@/vben/form-ui\";\nimport { VbenButton } from \"/@/vben/shadcn-ui\";\n\nimport Title from \"./auth-title.vue\";\n\ninterface Props {\n  formSchema: VbenFormSchema[];\n  /**\n   * @zh_CN 是否处于加载处理状态\n   */\n  loading?: boolean;\n  /**\n   * @zh_CN 登录路径\n   */\n  loginPath?: string;\n  /**\n   * @zh_CN 标题\n   */\n  title?: string;\n  /**\n   * @zh_CN 描述\n   */\n  subTitle?: string;\n  /**\n   * @zh_CN 按钮文本\n   */\n  submitButtonText?: string;\n}\n\ndefineOptions({\n  name: \"AuthenticationCodeLogin\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  loading: false,\n  loginPath: \"/auth/login\",\n  submitButtonText: \"\",\n  subTitle: \"\",\n  title: \"\",\n});\n\nconst emit = defineEmits<{\n  submit: [Recordable<any>];\n}>();\n\nconst router = useRouter();\n\nconst [Form, formApi] = useVbenForm(\n  reactive({\n    commonConfig: {\n      hideLabel: true,\n      hideRequiredMark: true,\n    },\n    schema: computed(() => props.formSchema),\n    showDefaultActions: false,\n  })\n);\n\nasync function handleSubmit() {\n  const { valid } = await formApi.validate();\n  const values = await formApi.getValues();\n  if (valid) {\n    emit(\"submit\", values);\n  }\n}\n\nfunction goToLogin() {\n  router.push(props.loginPath);\n}\n\ndefineExpose({\n  getFormApi: () => formApi,\n});\n</script>\n\n<template>\n  <div>\n    <Title>\n      <slot name=\"title\"> {{ title || $t(\"authentication.welcomeBack\") }} 📲 </slot>\n      <template #desc>\n        <span class=\"text-muted-foreground\">\n          <slot name=\"subTitle\">\n            {{ subTitle || $t(\"authentication.codeSubtitle\") }}\n          </slot>\n        </span>\n      </template>\n    </Title>\n    <Form />\n    <VbenButton\n      :class=\"{\n        'cursor-wait': loading,\n      }\"\n      :loading=\"loading\"\n      class=\"w-full\"\n      @click=\"handleSubmit\"\n    >\n      <slot name=\"submitButtonText\">\n        {{ submitButtonText || $t(\"common.login\") }}\n      </slot>\n    </VbenButton>\n    <VbenButton class=\"mt-4 w-full\" variant=\"outline\" @click=\"goToLogin()\">\n      {{ $t(\"common.back\") }}\n    </VbenButton>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/authentication/forget-password.vue",
    "content": "<script setup lang=\"ts\">\nimport type { VbenFormSchema } from \"/@/vben/form-ui\";\n\nimport { computed, reactive } from \"vue\";\nimport { useRouter } from \"vue-router\";\n\nimport { $t } from \"/@/locales\";\n\nimport { useVbenForm } from \"/@/vben/form-ui\";\nimport { VbenButton } from \"/@/vben/shadcn-ui\";\n\nimport Title from \"./auth-title.vue\";\n\ninterface Props {\n  formSchema: VbenFormSchema[];\n  /**\n   * @zh_CN 是否处于加载处理状态\n   */\n  loading?: boolean;\n  /**\n   * @zh_CN 登录路径\n   */\n  loginPath?: string;\n  /**\n   * @zh_CN 标题\n   */\n  title?: string;\n  /**\n   * @zh_CN 描述\n   */\n  subTitle?: string;\n  /**\n   * @zh_CN 按钮文本\n   */\n  submitButtonText?: string;\n}\n\ndefineOptions({\n  name: \"ForgetPassword\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  loading: false,\n  loginPath: \"/auth/login\",\n  submitButtonText: \"\",\n  subTitle: \"\",\n  title: \"\",\n});\n\nconst emit = defineEmits<{\n  submit: [Record<string, any>];\n}>();\n\nconst [Form, formApi] = useVbenForm(\n  reactive({\n    commonConfig: {\n      hideLabel: true,\n      hideRequiredMark: true,\n    },\n    schema: computed(() => props.formSchema),\n    showDefaultActions: false,\n  })\n);\n\nconst router = useRouter();\n\nasync function handleSubmit() {\n  const { valid } = await formApi.validate();\n  const values = await formApi.getValues();\n  if (valid) {\n    emit(\"submit\", values);\n  }\n}\n\nfunction goToLogin() {\n  router.push(props.loginPath);\n}\n\ndefineExpose({\n  getFormApi: () => formApi,\n});\n</script>\n\n<template>\n  <div>\n    <Title>\n      <slot name=\"title\"> {{ title || $t(\"authentication.forgetPassword\") }} 🤦🏻‍♂️ </slot>\n      <template #desc>\n        <slot name=\"subTitle\">\n          {{ subTitle || $t(\"authentication.forgetPasswordSubtitle\") }}\n        </slot>\n      </template>\n    </Title>\n    <Form />\n\n    <div>\n      <VbenButton\n        :class=\"{\n          'cursor-wait': loading,\n        }\"\n        aria-label=\"submit\"\n        class=\"mt-2 w-full\"\n        @click=\"handleSubmit\"\n      >\n        <slot name=\"submitButtonText\">\n          {{ submitButtonText || $t(\"authentication.sendResetLink\") }}\n        </slot>\n      </VbenButton>\n      <VbenButton class=\"mt-4 w-full\" variant=\"outline\" @click=\"goToLogin()\">\n        {{ $t(\"common.back\") }}\n      </VbenButton>\n    </div>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/authentication/index.ts",
    "content": "export { default as AuthenticationCodeLogin } from \"./code-login.vue\";\nexport { default as AuthenticationForgetPassword } from \"./forget-password.vue\";\nexport { default as AuthenticationLoginExpiredModal } from \"./login-expired-modal.vue\";\nexport { default as AuthenticationLogin } from \"./login.vue\";\nexport { default as AuthenticationQrCodeLogin } from \"./qrcode-login.vue\";\nexport { default as AuthenticationRegister } from \"./register.vue\";\nexport type { AuthenticationProps } from \"./types\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/authentication/login-expired-modal.vue",
    "content": "<script setup lang=\"ts\">\nimport type { AuthenticationProps } from \"./types\";\n\nimport { computed, watch } from \"vue\";\n\nimport { useVbenModal } from \"/@/vben/popup-ui\";\nimport { Slot, VbenAvatar } from \"/@/vben/shadcn-ui\";\n\ninterface Props extends AuthenticationProps {\n  avatar?: string;\n  zIndex?: number;\n}\n\ndefineOptions({\n  name: \"LoginExpiredModal\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  avatar: \"\",\n  zIndex: 0,\n});\n\nconst open = defineModel<boolean>(\"open\");\n\nconst [Modal, modalApi] = useVbenModal();\n\nwatch(\n  () => open.value,\n  val => {\n    modalApi.setState({ isOpen: val });\n  }\n);\n\nconst getZIndex = computed(() => {\n  return props.zIndex || calcZIndex();\n});\n\n/**\n * 获取最大的zIndex值\n */\nfunction calcZIndex() {\n  let maxZ = 0;\n  const elements = document.querySelectorAll(\"*\");\n  [...elements].forEach(element => {\n    const style = window.getComputedStyle(element);\n    const zIndex = style.getPropertyValue(\"z-index\");\n    if (zIndex && !Number.isNaN(Number.parseInt(zIndex))) {\n      maxZ = Math.max(maxZ, Number.parseInt(zIndex));\n    }\n  });\n  return maxZ + 1;\n}\n</script>\n\n<template>\n  <div>\n    <Modal\n      :closable=\"false\"\n      :close-on-click-modal=\"false\"\n      :close-on-press-escape=\"false\"\n      :footer=\"false\"\n      :fullscreen-button=\"false\"\n      :header=\"false\"\n      :z-index=\"getZIndex\"\n      class=\"border-none px-10 py-6 text-center shadow-xl sm:w-[600px] sm:rounded-2xl md:h-[unset]\"\n    >\n      <VbenAvatar :src=\"avatar\" class=\"mx-auto mb-6 size-20\" />\n      <Slot :show-forget-password=\"false\" :show-register=\"false\" :show-remember-me=\"false\" :sub-title=\"$t('authentication.loginAgainSubTitle')\" :title=\"$t('authentication.loginAgainTitle')\">\n        <slot> </slot>\n      </Slot>\n    </Modal>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/authentication/login.vue",
    "content": "<script setup lang=\"ts\">\nimport type { Recordable } from \"/@/vben/types\";\n\nimport type { VbenFormSchema } from \"/@/vben/form-ui\";\n\nimport type { AuthenticationProps } from \"./types\";\n\nimport { computed, onMounted, reactive, ref } from \"vue\";\nimport { useRouter } from \"vue-router\";\n\nimport { $t } from \"/@/locales\";\n\nimport { useVbenForm } from \"/@/vben/form-ui\";\nimport { VbenButton, VbenCheckbox } from \"/@/vben/shadcn-ui\";\n\nimport Title from \"./auth-title.vue\";\nimport ThirdPartyLogin from \"./third-party-login.vue\";\n\ninterface Props extends AuthenticationProps {\n  formSchema: VbenFormSchema[];\n}\n\ndefineOptions({\n  name: \"AuthenticationLogin\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  codeLoginPath: \"/auth/code-login\",\n  forgetPasswordPath: \"/auth/forget-password\",\n  formSchema: () => [],\n  loading: false,\n  qrCodeLoginPath: \"/auth/qrcode-login\",\n  registerPath: \"/auth/register\",\n  showCodeLogin: true,\n  showForgetPassword: true,\n  showQrcodeLogin: true,\n  showRegister: true,\n  showRememberMe: true,\n  showThirdPartyLogin: true,\n  submitButtonText: \"\",\n  subTitle: \"\",\n  title: \"\",\n});\n\nconst emit = defineEmits<{\n  submit: [Recordable<any>];\n}>();\n\nconst [Form, formApi] = useVbenForm(\n  reactive({\n    commonConfig: {\n      hideLabel: true,\n      hideRequiredMark: true,\n    },\n    schema: computed(() => props.formSchema),\n    showDefaultActions: false,\n  })\n);\nconst router = useRouter();\n\nconst REMEMBER_ME_KEY = `REMEMBER_ME_USERNAME_${location.hostname}`;\n\nconst localUsername = localStorage.getItem(REMEMBER_ME_KEY) || \"\";\n\nconst rememberMe = ref(!!localUsername);\n\nasync function handleSubmit() {\n  const { valid } = await formApi.validate();\n  const values = await formApi.getValues();\n  if (valid) {\n    localStorage.setItem(REMEMBER_ME_KEY, rememberMe.value ? values?.username : \"\");\n    emit(\"submit\", values);\n  }\n}\n\nfunction handleGo(path: string) {\n  router.push(path);\n}\n\nonMounted(() => {\n  if (localUsername) {\n    formApi.setFieldValue(\"username\", localUsername);\n  }\n});\n\ndefineExpose({\n  getFormApi: () => formApi,\n});\n</script>\n\n<template>\n  <div @keydown.enter.prevent=\"handleSubmit\">\n    <slot name=\"title\">\n      <Title>\n        <slot name=\"title\">\n          {{ title || `${$t(\"authentication.welcomeBack\")} 👋🏻` }}\n        </slot>\n        <template #desc>\n          <span class=\"text-muted-foreground\">\n            <slot name=\"subTitle\">\n              {{ subTitle || $t(\"authentication.loginSubtitle\") }}\n            </slot>\n          </span>\n        </template>\n      </Title>\n    </slot>\n\n    <Form />\n\n    <div v-if=\"showRememberMe || showForgetPassword\" class=\"mb-6 flex justify-between\">\n      <div class=\"flex-center\">\n        <VbenCheckbox v-if=\"showRememberMe\" v-model:checked=\"rememberMe\" name=\"rememberMe\">\n          {{ $t(\"authentication.rememberMe\") }}\n        </VbenCheckbox>\n      </div>\n\n      <span v-if=\"showForgetPassword\" class=\"vben-link text-sm font-normal\" @click=\"handleGo(forgetPasswordPath)\">\n        {{ $t(\"authentication.forgetPassword\") }}\n      </span>\n    </div>\n    <VbenButton\n      :class=\"{\n        'cursor-wait': loading,\n      }\"\n      :loading=\"loading\"\n      aria-label=\"login\"\n      class=\"w-full\"\n      @click=\"handleSubmit\"\n    >\n      {{ submitButtonText || $t(\"common.login\") }}\n    </VbenButton>\n\n    <div v-if=\"showCodeLogin || showQrcodeLogin\" class=\"mb-2 mt-4 flex items-center justify-between\">\n      <VbenButton v-if=\"showCodeLogin\" class=\"w-1/2\" variant=\"outline\" @click=\"handleGo(codeLoginPath)\">\n        {{ $t(\"authentication.mobileLogin\") }}\n      </VbenButton>\n      <VbenButton v-if=\"showQrcodeLogin\" class=\"ml-4 w-1/2\" variant=\"outline\" @click=\"handleGo(qrCodeLoginPath)\">\n        {{ $t(\"authentication.qrcodeLogin\") }}\n      </VbenButton>\n    </div>\n\n    <!-- 第三方登录 -->\n    <slot name=\"third-party-login\">\n      <ThirdPartyLogin v-if=\"showThirdPartyLogin\" />\n    </slot>\n\n    <slot name=\"to-register\">\n      <div v-if=\"showRegister\" class=\"mt-3 text-center text-sm\">\n        {{ $t(\"authentication.accountTip\") }}\n        <span class=\"vben-link text-sm font-normal\" @click=\"handleGo(registerPath)\">\n          {{ $t(\"authentication.createAccount\") }}\n        </span>\n      </div>\n    </slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/authentication/qrcode-login.vue",
    "content": "<script setup lang=\"ts\">\nimport { ref } from \"vue\";\nimport { useRouter } from \"vue-router\";\n\nimport { $t } from \"/@/vben/locales\";\n\nimport { VbenButton } from \"/@/vben/shadcn-ui\";\n\nimport { useQRCode } from \"@vueuse/integrations/useQRCode\";\n\nimport Title from \"./auth-title.vue\";\n\ninterface Props {\n  /**\n   * @zh_CN 是否处于加载处理状态\n   */\n  loading?: boolean;\n  /**\n   * @zh_CN 登录路径\n   */\n  loginPath?: string;\n  /**\n   * @zh_CN 标题\n   */\n  title?: string;\n  /**\n   * @zh_CN 描述\n   */\n  subTitle?: string;\n  /**\n   * @zh_CN 按钮文本\n   */\n  submitButtonText?: string;\n  /**\n   * @zh_CN 描述\n   */\n  description?: string;\n}\n\ndefineOptions({\n  name: \"AuthenticationQrCodeLogin\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  description: \"\",\n  loading: false,\n  loginPath: \"/auth/login\",\n  submitButtonText: \"\",\n  subTitle: \"\",\n  title: \"\",\n});\n\nconst router = useRouter();\n\nconst text = ref(\"https://vben.vvbin.cn\");\n\nconst qrcode = useQRCode(text, {\n  errorCorrectionLevel: \"H\",\n  margin: 4,\n});\n\nfunction goToLogin() {\n  router.push(props.loginPath);\n}\n</script>\n\n<template>\n  <div>\n    <Title>\n      <slot name=\"title\"> {{ title || $t(\"authentication.welcomeBack\") }} 📱 </slot>\n      <template #desc>\n        <span class=\"text-muted-foreground\">\n          <slot name=\"subTitle\">\n            {{ subTitle || $t(\"authentication.qrcodeSubtitle\") }}\n          </slot>\n        </span>\n      </template>\n    </Title>\n\n    <div class=\"flex-col-center mt-6\">\n      <img :src=\"qrcode\" alt=\"qrcode\" class=\"w-1/2\" />\n      <p class=\"text-muted-foreground mt-4 text-sm\">\n        <slot name=\"description\">\n          {{ description || $t(\"authentication.qrcodePrompt\") }}\n        </slot>\n      </p>\n    </div>\n\n    <VbenButton class=\"mt-4 w-full\" variant=\"outline\" @click=\"goToLogin()\">\n      {{ $t(\"common.back\") }}\n    </VbenButton>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/authentication/register.vue",
    "content": "<script setup lang=\"ts\">\nimport type { Recordable } from \"/@/vben/types\";\n\nimport type { VbenFormSchema } from \"/@/vben/form-ui\";\n\nimport { computed, reactive } from \"vue\";\nimport { useRouter } from \"vue-router\";\n\nimport { $t } from \"/@/locales\";\n\nimport { useVbenForm } from \"/@/vben/form-ui\";\nimport { VbenButton } from \"/@/vben/shadcn-ui\";\n\nimport Title from \"./auth-title.vue\";\n\ninterface Props {\n  formSchema: VbenFormSchema[];\n  /**\n   * @zh_CN 是否处于加载处理状态\n   */\n  loading?: boolean;\n  /**\n   * @zh_CN 登录路径\n   */\n  loginPath?: string;\n  /**\n   * @zh_CN 标题\n   */\n  title?: string;\n  /**\n   * @zh_CN 描述\n   */\n  subTitle?: string;\n  /**\n   * @zh_CN 按钮文本\n   */\n  submitButtonText?: string;\n}\n\ndefineOptions({\n  name: \"RegisterForm\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  formSchema: () => [],\n  loading: false,\n  loginPath: \"/auth/login\",\n  submitButtonText: \"\",\n  subTitle: \"\",\n  title: \"\",\n});\n\nconst emit = defineEmits<{\n  submit: [Recordable<any>];\n}>();\n\nconst [Form, formApi] = useVbenForm(\n  reactive({\n    commonConfig: {\n      hideLabel: true,\n      hideRequiredMark: true,\n    },\n    schema: computed(() => props.formSchema),\n    showDefaultActions: false,\n  })\n);\n\nconst router = useRouter();\n\nasync function handleSubmit() {\n  const { valid } = await formApi.validate();\n  const values = await formApi.getValues();\n  if (valid) {\n    emit(\"submit\", values as { password: string; username: string });\n  }\n}\n\nfunction goToLogin() {\n  router.push(props.loginPath);\n}\n\ndefineExpose({\n  getFormApi: () => formApi,\n});\n</script>\n\n<template>\n  <div>\n    <Title>\n      <slot name=\"title\"> {{ title || $t(\"authentication.createAnAccount\") }} 🚀 </slot>\n      <template #desc>\n        <slot name=\"subTitle\">\n          {{ subTitle || $t(\"authentication.signUpSubtitle\") }}\n        </slot>\n      </template>\n    </Title>\n    <Form />\n\n    <VbenButton\n      :class=\"{\n        'cursor-wait': loading,\n      }\"\n      :loading=\"loading\"\n      aria-label=\"register\"\n      class=\"mt-2 w-full\"\n      @click=\"handleSubmit\"\n    >\n      <slot name=\"submitButtonText\">\n        {{ submitButtonText || $t(\"authentication.signUp\") }}\n      </slot>\n    </VbenButton>\n    <div class=\"mt-4 text-center text-sm\">\n      {{ $t(\"authentication.alreadyHaveAccount\") }}\n      <span class=\"vben-link text-sm font-normal\" @click=\"goToLogin()\">\n        {{ $t(\"authentication.goToLogin\") }}\n      </span>\n    </div>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/authentication/third-party-login.vue",
    "content": "<script setup lang=\"ts\">\nimport { MdiGithub, MdiGoogle, MdiQqchat, MdiWechat } from \"/@/vben/icons\";\nimport { $t } from \"/@/locales\";\n\nimport { VbenIconButton } from \"/@/vben/shadcn-ui\";\n\ndefineOptions({\n  name: \"ThirdPartyLogin\",\n});\n</script>\n\n<template>\n  <div class=\"w-full sm:mx-auto md:max-w-md\">\n    <div class=\"mt-4 flex items-center justify-between\">\n      <span class=\"border-input w-[35%] border-b dark:border-gray-600\"></span>\n      <span class=\"text-muted-foreground text-center text-xs uppercase\">\n        {{ $t(\"authentication.thirdPartyLogin\") }}\n      </span>\n      <span class=\"border-input w-[35%] border-b dark:border-gray-600\"></span>\n    </div>\n\n    <div class=\"mt-4 flex flex-wrap justify-center\">\n      <VbenIconButton class=\"mb-3\">\n        <MdiWechat />\n      </VbenIconButton>\n      <VbenIconButton class=\"mb-3\">\n        <MdiQqchat />\n      </VbenIconButton>\n      <VbenIconButton class=\"mb-3\">\n        <MdiGithub />\n      </VbenIconButton>\n      <VbenIconButton class=\"mb-3\">\n        <MdiGoogle />\n      </VbenIconButton>\n    </div>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/authentication/types.ts",
    "content": "interface AuthenticationProps {\n  /**\n   * @zh_CN 验证码登录路径\n   */\n  codeLoginPath?: string;\n  /**\n   * @zh_CN 忘记密码路径\n   */\n  forgetPasswordPath?: string;\n\n  /**\n   * @zh_CN 是否处于加载处理状态\n   */\n  loading?: boolean;\n\n  /**\n   * @zh_CN 二维码登录路径\n   */\n  qrCodeLoginPath?: string;\n\n  /**\n   * @zh_CN 注册路径\n   */\n  registerPath?: string;\n\n  /**\n   * @zh_CN 是否显示验证码登录\n   */\n  showCodeLogin?: boolean;\n  /**\n   * @zh_CN 是否显示忘记密码\n   */\n  showForgetPassword?: boolean;\n\n  /**\n   * @zh_CN 是否显示二维码登录\n   */\n  showQrcodeLogin?: boolean;\n\n  /**\n   * @zh_CN 是否显示注册按钮\n   */\n  showRegister?: boolean;\n\n  /**\n   * @zh_CN 是否显示记住账号\n   */\n  showRememberMe?: boolean;\n\n  /**\n   * @zh_CN 是否显示第三方登录\n   */\n  showThirdPartyLogin?: boolean;\n\n  /**\n   * @zh_CN 登录框子标题\n   */\n  subTitle?: string;\n\n  /**\n   * @zh_CN 登录框标题\n   */\n  title?: string;\n  /**\n   * @zh_CN 提交按钮文本\n   */\n  submitButtonText?: string;\n}\n\nexport type { AuthenticationProps };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/dashboard/analysis/analysis-chart-card.vue",
    "content": "<script setup lang=\"ts\">\nimport { Card, CardContent, CardHeader, CardTitle } from \"/@/vben/shadcn-ui\";\n\ninterface Props {\n  title: string;\n}\n\ndefineOptions({\n  name: \"AnalysisChartCard\",\n});\n\nwithDefaults(defineProps<Props>(), {});\n</script>\n\n<template>\n  <Card>\n    <CardHeader>\n      <CardTitle class=\"text-xl\">{{ title }}</CardTitle>\n    </CardHeader>\n    <CardContent>\n      <slot></slot>\n    </CardContent>\n  </Card>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/dashboard/analysis/analysis-charts-tabs.vue",
    "content": "<script setup lang=\"ts\">\nimport type { TabOption } from \"/@/vben/types\";\n\nimport { computed } from \"vue\";\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"/@/vben/shadcn-ui\";\n\ninterface Props {\n  tabs: TabOption[];\n}\n\ndefineOptions({\n  name: \"AnalysisChartsTabs\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  tabs: () => [],\n});\n\nconst defaultValue = computed(() => {\n  return props.tabs?.[0]?.value;\n});\n</script>\n\n<template>\n  <div class=\"card-box w-full px-4 pb-5 pt-3\">\n    <Tabs :default-value=\"defaultValue\">\n      <TabsList>\n        <template v-for=\"tab in tabs\" :key=\"tab.label\">\n          <TabsTrigger :value=\"tab.value\"> {{ tab.label }} </TabsTrigger>\n        </template>\n      </TabsList>\n      <template v-for=\"tab in tabs\" :key=\"tab.label\">\n        <TabsContent :value=\"tab.value\" class=\"pt-4\">\n          <slot :name=\"tab.value\"></slot>\n        </TabsContent>\n      </template>\n    </Tabs>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/dashboard/analysis/analysis-overview.vue",
    "content": "<script setup lang=\"ts\">\nimport type { AnalysisOverviewItem } from \"../typing\";\n\nimport { Card, CardContent, CardFooter, CardHeader, CardTitle, VbenCountToAnimator, VbenIcon } from \"/@/vben/shadcn-ui\";\n\ninterface Props {\n  items: AnalysisOverviewItem[];\n}\n\ndefineOptions({\n  name: \"AnalysisOverview\",\n});\n\nwithDefaults(defineProps<Props>(), {\n  items: () => [],\n});\n</script>\n\n<template>\n  <div class=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-4\">\n    <template v-for=\"item in items\" :key=\"item.title\">\n      <Card :title=\"item.title\" class=\"w-full\">\n        <CardHeader>\n          <CardTitle class=\"text-xl\">{{ item.title }}</CardTitle>\n        </CardHeader>\n\n        <CardContent class=\"flex items-center justify-between\">\n          <VbenCountToAnimator :end-val=\"item.value\" :start-val=\"1\" class=\"text-xl\" prefix=\"\" />\n          <VbenIcon :icon=\"item.icon\" class=\"size-8 flex-shrink-0\" />\n        </CardContent>\n        <CardFooter class=\"justify-between\">\n          <span>{{ item.totalTitle }}</span>\n          <VbenCountToAnimator :end-val=\"item.totalValue\" :start-val=\"1\" prefix=\"\" />\n        </CardFooter>\n      </Card>\n    </template>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/dashboard/analysis/index.ts",
    "content": "export { default as AnalysisChartCard } from \"./analysis-chart-card.vue\";\nexport { default as AnalysisChartsTabs } from \"./analysis-charts-tabs.vue\";\nexport { default as AnalysisOverview } from \"./analysis-overview.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/dashboard/index.ts",
    "content": "export * from \"./analysis\";\nexport type * from \"./typing\";\nexport * from \"./workbench\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/dashboard/typing.ts",
    "content": "import type { Component } from \"vue\";\n\ninterface AnalysisOverviewItem {\n  icon: Component | string;\n  title: string;\n  totalTitle: string;\n  totalValue: number;\n  value: number;\n}\n\ninterface WorkbenchProjectItem {\n  color?: string;\n  content: string;\n  date: string;\n  group: string;\n  icon: Component | string;\n  title: string;\n  url?: string;\n}\n\ninterface WorkbenchTrendItem {\n  avatar: string;\n  content: string;\n  date: string;\n  title: string;\n}\n\ninterface WorkbenchTodoItem {\n  completed: boolean;\n  content: string;\n  date: string;\n  title: string;\n}\n\ninterface WorkbenchQuickNavItem {\n  color?: string;\n  icon: Component | string;\n  title: string;\n  url?: string;\n}\n\nexport type { AnalysisOverviewItem, WorkbenchProjectItem, WorkbenchQuickNavItem, WorkbenchTodoItem, WorkbenchTrendItem };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/dashboard/workbench/index.ts",
    "content": "export { default as WorkbenchHeader } from \"./workbench-header.vue\";\nexport { default as WorkbenchProject } from \"./workbench-project.vue\";\nexport { default as WorkbenchQuickNav } from \"./workbench-quick-nav.vue\";\nexport { default as WorkbenchTodo } from \"./workbench-todo.vue\";\nexport { default as WorkbenchTrends } from \"./workbench-trends.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/dashboard/workbench/workbench-header.vue",
    "content": "<script lang=\"ts\" setup>\nimport { VbenAvatar } from \"/@/vben/shadcn-ui\";\n\ninterface Props {\n  avatar?: string;\n}\n\ndefineOptions({\n  name: \"WorkbenchHeader\",\n});\n\nwithDefaults(defineProps<Props>(), {\n  avatar: \"\",\n});\n</script>\n<template>\n  <div class=\"card-box p-4 py-6 lg:flex\">\n    <VbenAvatar :src=\"avatar\" class=\"size-20\" />\n    <div v-if=\"$slots.title || $slots.description\" class=\"flex flex-col justify-center md:ml-6 md:mt-0\">\n      <h1 v-if=\"$slots.title\" class=\"text-md font-semibold md:text-xl\">\n        <slot name=\"title\"></slot>\n      </h1>\n      <span v-if=\"$slots.description\" class=\"text-foreground/80 mt-1\">\n        <slot name=\"description\"></slot>\n      </span>\n    </div>\n    <div class=\"mt-4 flex flex-1 justify-end md:mt-0\">\n      <div class=\"flex flex-col justify-center text-right\">\n        <span class=\"text-foreground/80\"> 待办 </span>\n        <span class=\"text-2xl\">2/10</span>\n      </div>\n\n      <div class=\"mx-12 flex flex-col justify-center text-right md:mx-16\">\n        <span class=\"text-foreground/80\"> 项目 </span>\n        <span class=\"text-2xl\">8</span>\n      </div>\n      <div class=\"mr-4 flex flex-col justify-center text-right md:mr-10\">\n        <span class=\"text-foreground/80\"> 团队 </span>\n        <span class=\"text-2xl\">300</span>\n      </div>\n    </div>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/dashboard/workbench/workbench-project.vue",
    "content": "<script setup lang=\"ts\">\nimport type { WorkbenchProjectItem } from \"../typing\";\n\nimport { Card, CardContent, CardHeader, CardTitle, VbenIcon } from \"/@/vben/shadcn-ui\";\n\ninterface Props {\n  items: WorkbenchProjectItem[];\n  title: string;\n}\n\ndefineOptions({\n  name: \"WorkbenchProject\",\n});\n\nwithDefaults(defineProps<Props>(), {\n  items: () => [],\n});\n\ndefineEmits([\"click\"]);\n</script>\n\n<template>\n  <Card>\n    <CardHeader class=\"py-4\">\n      <CardTitle class=\"text-lg\">{{ title }}</CardTitle>\n    </CardHeader>\n    <CardContent class=\"flex flex-wrap p-0\">\n      <template v-for=\"(item, index) in items\" :key=\"item.title\">\n        <div\n          :class=\"{\n            'border-r-0': index % 3 === 2,\n            'border-b-0': index < 3,\n            'pb-4': index > 2,\n          }\"\n          class=\"border-border group w-full cursor-pointer border-r border-t p-4 transition-all hover:shadow-xl md:w-1/2 lg:w-1/3\"\n        >\n          <div class=\"flex items-center\">\n            <VbenIcon :color=\"item.color\" :icon=\"item.icon\" class=\"size-8 transition-all duration-300 group-hover:scale-110\" @click=\"$emit('click', item)\" />\n            <span class=\"ml-4 text-lg font-medium\">{{ item.title }}</span>\n          </div>\n          <div class=\"text-foreground/80 mt-4 flex h-10\">\n            {{ item.content }}\n          </div>\n          <div class=\"text-foreground/80 flex justify-between\">\n            <span>{{ item.group }}</span>\n            <span>{{ item.date }}</span>\n          </div>\n        </div>\n      </template>\n    </CardContent>\n  </Card>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/dashboard/workbench/workbench-quick-nav.vue",
    "content": "<script setup lang=\"ts\">\nimport type { WorkbenchQuickNavItem } from \"../typing\";\n\nimport { Card, CardContent, CardHeader, CardTitle, VbenIcon } from \"/@/vben/shadcn-ui\";\n\ninterface Props {\n  items: WorkbenchQuickNavItem[];\n  title: string;\n}\n\ndefineOptions({\n  name: \"WorkbenchQuickNav\",\n});\n\nwithDefaults(defineProps<Props>(), {\n  items: () => [],\n});\n\ndefineEmits([\"click\"]);\n</script>\n\n<template>\n  <Card>\n    <CardHeader class=\"py-4\">\n      <CardTitle class=\"text-lg\">{{ title }}</CardTitle>\n    </CardHeader>\n    <CardContent class=\"flex flex-wrap p-0\">\n      <template v-for=\"(item, index) in items\" :key=\"item.title\">\n        <div\n          :class=\"{\n            'border-r-0': index % 3 === 2,\n            'pb-4': index > 2,\n            'border-b-0': index < 3,\n          }\"\n          class=\"flex-col-center border-border group w-1/3 cursor-pointer border-r border-t py-8 hover:shadow-xl\"\n          @click=\"$emit('click', item)\"\n        >\n          <VbenIcon :color=\"item.color\" :icon=\"item.icon\" class=\"size-7 transition-all duration-300 group-hover:scale-125\" />\n          <span class=\"text-md mt-2 truncate\">{{ item.title }}</span>\n        </div>\n      </template>\n    </CardContent>\n  </Card>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/dashboard/workbench/workbench-todo.vue",
    "content": "<script setup lang=\"ts\">\nimport type { WorkbenchTodoItem } from \"../typing\";\n\nimport { Card, CardContent, CardHeader, CardTitle, VbenCheckbox } from \"/@/vben/shadcn-ui\";\n\ninterface Props {\n  items: WorkbenchTodoItem[];\n  title: string;\n}\n\ndefineOptions({\n  name: \"WorkbenchTodo\",\n});\n\nwithDefaults(defineProps<Props>(), {\n  items: () => [],\n});\n</script>\n\n<template>\n  <Card>\n    <CardHeader class=\"py-4\">\n      <CardTitle class=\"text-lg\">{{ title }}</CardTitle>\n    </CardHeader>\n    <CardContent class=\"flex flex-wrap p-5 pt-0\">\n      <ul class=\"divide-border w-full divide-y\" role=\"list\">\n        <li\n          v-for=\"item in items\"\n          :key=\"item.title\"\n          :class=\"{\n            'select-none line-through opacity-60': item.completed,\n          }\"\n          class=\"flex cursor-pointer justify-between gap-x-6 py-5\"\n        >\n          <div class=\"flex min-w-0 items-center gap-x-4\">\n            <VbenCheckbox v-model:checked=\"item.completed\" name=\"completed\" />\n            <div class=\"min-w-0 flex-auto\">\n              <p class=\"text-foreground text-sm font-semibold leading-6\">\n                {{ item.title }}\n              </p>\n              <!-- eslint-disable vue/no-v-html -->\n              <p class=\"text-foreground/80 *:text-primary mt-1 truncate text-xs leading-5\" v-html=\"item.content\"></p>\n            </div>\n          </div>\n          <div class=\"hidden h-full shrink-0 sm:flex sm:flex-col sm:items-end\">\n            <span class=\"text-foreground/80 mt-6 text-xs leading-6\">\n              {{ item.date }}\n            </span>\n          </div>\n        </li>\n      </ul>\n    </CardContent>\n  </Card>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/dashboard/workbench/workbench-trends.vue",
    "content": "<script setup lang=\"ts\">\nimport type { WorkbenchTrendItem } from \"../typing\";\n\nimport { Card, CardContent, CardHeader, CardTitle, VbenIcon } from \"/@/vben/shadcn-ui\";\n\ninterface Props {\n  items: WorkbenchTrendItem[];\n  title: string;\n}\n\ndefineOptions({\n  name: \"WorkbenchTrends\",\n});\n\nwithDefaults(defineProps<Props>(), {\n  items: () => [],\n});\n</script>\n\n<template>\n  <Card>\n    <CardHeader class=\"py-4\">\n      <CardTitle class=\"text-lg\">{{ title }}</CardTitle>\n    </CardHeader>\n    <CardContent class=\"flex flex-wrap p-5 pt-0\">\n      <ul class=\"divide-border w-full divide-y\" role=\"list\">\n        <li v-for=\"item in items\" :key=\"item.title\" class=\"flex justify-between gap-x-6 py-5\">\n          <div class=\"flex min-w-0 items-center gap-x-4\">\n            <VbenIcon :icon=\"item.avatar\" alt=\"\" class=\"size-10 flex-none rounded-full\" />\n            <div class=\"min-w-0 flex-auto\">\n              <p class=\"text-foreground text-sm font-semibold leading-6\">\n                {{ item.title }}\n              </p>\n              <!-- eslint-disable vue/no-v-html -->\n              <p class=\"text-foreground/80 *:text-primary mt-1 truncate text-xs leading-5\" v-html=\"item.content\"></p>\n            </div>\n          </div>\n          <div class=\"hidden h-full shrink-0 sm:flex sm:flex-col sm:items-end\">\n            <span class=\"text-foreground/80 mt-6 text-xs leading-6\">\n              {{ item.date }}\n            </span>\n          </div>\n        </li>\n      </ul>\n    </CardContent>\n  </Card>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/fallback/fallback.ts",
    "content": "interface FallbackProps {\n  /**\n   * 描述\n   */\n  description?: string;\n  /**\n   *  @zh_CN 首页路由地址\n   *  @default /\n   */\n  homePath?: string;\n  /**\n   * @zh_CN 默认显示的图片\n   * @default pageNotFoundSvg\n   */\n  image?: string;\n  /**\n   *  @zh_CN 内置类型\n   */\n  status?: \"403\" | \"404\" | \"500\" | \"coming-soon\" | \"offline\";\n  /**\n   *  @zh_CN 页面提示语\n   */\n  title?: string;\n}\nexport type { FallbackProps };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/fallback/fallback.vue",
    "content": "<script setup lang=\"ts\">\nimport type { FallbackProps } from \"./fallback\";\n\nimport { computed, defineAsyncComponent } from \"vue\";\nimport { useRouter } from \"vue-router\";\n\nimport { ArrowLeft, RotateCw } from \"/@/vben/icons\";\nimport { $t } from \"/@/locales\";\n\nimport { VbenButton } from \"/@/vben/shadcn-ui\";\n\ninterface Props extends FallbackProps {}\n\ndefineOptions({\n  // @ts-ignore\n  name: \"Fallback\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  description: \"\",\n  homePath: \"/\",\n  image: \"\",\n  showBack: true,\n  status: \"coming-soon\",\n  title: \"\",\n});\n\nconst Icon403 = defineAsyncComponent(() => import(\"./icons/icon-403.vue\"));\nconst Icon404 = defineAsyncComponent(() => import(\"./icons/icon-404.vue\"));\nconst Icon500 = defineAsyncComponent(() => import(\"./icons/icon-500.vue\"));\nconst IconHello = defineAsyncComponent(() => import(\"./icons/icon-coming-soon.vue\"));\nconst IconOffline = defineAsyncComponent(() => import(\"./icons/icon-offline.vue\"));\n\nconst titleText = computed(() => {\n  if (props.title) {\n    return props.title;\n  }\n\n  switch (props.status) {\n    case \"403\": {\n      return $t(\"ui.fallback.forbidden\");\n    }\n    case \"404\": {\n      return $t(\"ui.fallback.pageNotFound\");\n    }\n    case \"500\": {\n      return $t(\"ui.fallback.internalError\");\n    }\n    case \"coming-soon\": {\n      return $t(\"ui.fallback.comingSoon\");\n    }\n    case \"offline\": {\n      return $t(\"ui.fallback.offlineError\");\n    }\n    default: {\n      return \"\";\n    }\n  }\n});\n\nconst descText = computed(() => {\n  if (props.description) {\n    return props.description;\n  }\n  switch (props.status) {\n    case \"403\": {\n      return $t(\"ui.fallback.forbiddenDesc\");\n    }\n    case \"404\": {\n      return $t(\"ui.fallback.pageNotFoundDesc\");\n    }\n    case \"500\": {\n      return $t(\"ui.fallback.internalErrorDesc\");\n    }\n    case \"offline\": {\n      return $t(\"ui.fallback.offlineErrorDesc\");\n    }\n    default: {\n      return \"\";\n    }\n  }\n});\n\nconst fallbackIcon = computed(() => {\n  switch (props.status) {\n    case \"403\": {\n      return Icon403;\n    }\n    case \"404\": {\n      return Icon404;\n    }\n    case \"500\": {\n      return Icon500;\n    }\n    case \"coming-soon\": {\n      return IconHello;\n    }\n    case \"offline\": {\n      return IconOffline;\n    }\n    default: {\n      return null;\n    }\n  }\n});\n\nconst showBack = computed(() => {\n  return props.status === \"403\" || props.status === \"404\";\n});\n\nconst showRefresh = computed(() => {\n  return props.status === \"500\" || props.status === \"offline\";\n});\n\nconst { push } = useRouter();\n\n// 返回首页\nfunction back() {\n  push(props.homePath);\n}\n\nfunction refresh() {\n  location.reload();\n}\n</script>\n\n<template>\n  <div class=\"flex size-full flex-col items-center justify-center duration-300\">\n    <img v-if=\"image\" :src=\"image\" class=\"md:1/3 w-1/2 lg:w-1/4\" />\n    <component :is=\"fallbackIcon\" v-else-if=\"fallbackIcon\" class=\"md:1/3 h-1/3 w-1/2 lg:w-1/4\" />\n    <div class=\"flex-col-center\">\n      <slot v-if=\"$slots.title\" name=\"title\"></slot>\n      <p v-else-if=\"titleText\" class=\"text-foreground mt-8 text-2xl md:text-3xl lg:text-4xl\">\n        {{ titleText }}\n      </p>\n      <slot v-if=\"$slots.describe\" name=\"describe\"></slot>\n      <p v-else-if=\"descText\" class=\"text-muted-foreground md:text-md my-4 lg:text-lg\">\n        {{ descText }}\n      </p>\n      <slot v-if=\"$slots.action\" name=\"action\"></slot>\n      <VbenButton v-else-if=\"showBack\" size=\"lg\" @click=\"back\">\n        <ArrowLeft class=\"mr-2 size-4\" />\n        {{ $t(\"common.backToHome\") }}\n      </VbenButton>\n      <VbenButton v-else-if=\"showRefresh\" size=\"lg\" @click=\"refresh\">\n        <RotateCw class=\"mr-2 size-4\" />\n        {{ $t(\"common.refresh\") }}\n      </VbenButton>\n    </div>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/fallback/icons/icon-403.vue",
    "content": "<template>\n  <svg height=\"659.29778\" viewBox=\"0 0 586 659.29778\" width=\"586\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n    <circle cx=\"332.47856\" cy=\"254\" fill=\"#f2f2f2\" r=\"254.00001\" />\n    <path\n      d=\"M498.46363,113.58835H33.17063c-.99774-.02133-1.78931-.84746-1.76797-1.84521,.02069-.96771,.80026-1.74727,1.76797-1.76796H498.46363c.99774,.02133,1.78931,.84746,1.76794,1.84521-.02069,.96771-.80023,1.74727-1.76794,1.76796Z\"\n      fill=\"#cacaca\"\n    />\n    <rect fill=\"#fff\" height=\"34.98639\" rx=\"17.49318\" ry=\"17.49318\" width=\"163.61147\" x=\"193.77441\" y=\"174.47256\" />\n    <path\n      d=\"M128.17493,244.44534H422.98542c9.66122,0,17.49316,7.83197,17.49316,17.49319h0c0,9.66122-7.83194,17.49319-17.49316,17.49319H128.17493c-9.66122,0-17.49318-7.83197-17.49318-17.49319h0c0-9.66122,7.83196-17.49319,17.49318-17.49319Z\"\n      fill=\"#fff\"\n    />\n    <path\n      d=\"M128.17493,314.41812H422.98542c9.66122,0,17.49316,7.83197,17.49316,17.49319h0c0,9.66122-7.83194,17.49319-17.49316,17.49319H128.17493c-9.66122,0-17.49318-7.83197-17.49318-17.49319h0c0-9.66122,7.83196-17.49319,17.49318-17.49319Z\"\n      fill=\"#fff\"\n    />\n    <path\n      d=\"M91.64085,657.75932l-.69385-.06793c-23.54068-2.42871-44.82135-15.08929-58.18845-34.61835-3.66138-5.44159-6.62299-11.32251-8.815-17.50409l-.21069-.58966,.62375-.05048c7.44699-.59924,15.09732-1.86292,18.49585-2.46417l-21.91473-7.42511-.1355-.65033c-1.29926-6.10406,1.24612-12.38458,6.4285-15.86176,5.19641-3.64447,12.08731-3.76111,17.40405-.29449,2.38599,1.52399,4.88162,3.03339,7.29489,4.49359,8.29321,5.01636,16.8688,10.20337,23.29828,17.30121,9.74951,10.97778,14.02298,25.76984,11.63,40.25562l4.7829,17.47595Z\"\n      fill=\"#f2f2f2\"\n    />\n    <polygon fill=\"#a0616a\" points=\"171.30016 646.86102 182.10017 646.85999 187.23916 605.198 171.29716 605.19897 171.30016 646.86102\" />\n    <path d=\"M170.9192,658.12816l33.21436-.00122v-.41998c-.00049-7.13965-5.78833-12.92737-12.92798-12.92773h-.00079l-6.06702-4.60278-11.3197,4.60345-2.89941,.00012,.00055,13.34814Z\" fill=\"#2f2e41\" />\n    <polygon fill=\"#a0616a\" points=\"84.74116 616.94501 93.38016 623.42603 122.49316 593.185 109.74116 583.61902 84.74116 616.94501\" />\n    <path d=\"M77.67448,625.72966l26.569,19.93188,.25208-.336c4.2843-5.71136,3.12799-13.81433-2.58279-18.09937l-.00064-.00049-2.09079-7.32275-11.81735-3.11102-2.31931-1.73993-8.01019,10.67767Z\" fill=\"#2f2e41\" />\n    <path\n      d=\"M120.64463,451.35271s.59625,16.26422,1.3483,29.30737c.12335,2.13916-4.88821,4.46301-4.75842,6.7901,.08609,1.54395,1.02808,3.04486,1.1156,4.65472,.09235,1.69897-1.20822,3.20282-1.1156,4.95984,.09052,1.71667,1.57422,3.6853,1.66373,5.44244,.96317,18.9093,4.45459,41.54633,.9584,47.87439-1.72299,3.11871-23.68533,46.32446-23.68533,46.32446,0,0,12.23666,18.35498,15.73285,12.23663,4.61771-8.08099,40.20615-45.88745,40.20615-53.10712,0-7.21088,8.23346-61.25323,8.23346-61.25323l5.74103,31.98169,2.63239,6.33655-.82715,3.71997,1.70117,5.02045,.09192,4.96838,1.65619,9.22614s-4.98199,71.88159-2.17633,73.88312c2.81439,2.01038,16.44086,5.62018,18.04901,2.01038,1.59955-3.6098,12.0108-75.01947,12.0108-75.01947,0,0,1.6781-32.72424,3.49622-63.14111,.1048-1.76556,1.34607-3.89825,1.4422-5.63763,.11365-2.01898-.67297-4.64111-.56818-6.599,.11365-2.24628,1.11005-3.82831,1.20618-5.97852,.74292-16.6156-3.42761-36.84912-4.7561-38.84192-4.01202-6.01343-7.62177-10.82074-7.62177-10.82074,0,0-54.03558-17.75403-68.47485,.28625l-3.30185,25.37585Z\"\n      fill=\"#2f2e41\"\n    />\n    <path\n      d=\"M174.53779,284.10378l-21.4209-4.28418-9.9964,13.56656h0c-18.65262,18.34058-18.93359,34.52753-15.60379,60.47382v36.41553l-2.41,24.41187s-8.53156,17.84521,.26788,22.00006,66.59857,3.80066,72.117,2.14209,.73517-3.69482-.71399-11.4245c-2.72211-14.51929-.90131-7.51562-.71399-12.13849,2.68585-66.31363-3.57013-93.5379-4.20544-100.69376l-10.89398-19.75858-6.42639-10.71042Z\"\n      fill=\"#3f3d56\"\n    />\n    <path\n      d=\"M287.43909,337.57097c-2.23248,4.23007-7.47144,5.84943-11.70148,3.61694-.45099-.23804-.88013-.51541-1.28229-.82895l-46.26044,29.37308,.13336-15.9924,44.93842-26.07846c3.20093-3.58887,8.70514-3.90332,12.29401-.70239,3.00305,2.67844,3.7796,7.0657,1.87842,10.61218Z\"\n      fill=\"#a0616a\"\n    />\n    <path\n      d=\"M157.62488,302.62425l-5.26666-.55807c-4.86633-.50473-9.64093,1.57941-12.57947,5.491-1.12549,1.48346-1.9339,3.18253-2.37491,4.99164l-.00317,.01447c-1.32108,5.44534,.75095,11.15201,5.25803,14.48117l18.19031,13.41101c12.76544,17.24899,36.75653,28.69272,64.89832,37.98978l43.74274-27.16666-15.47186-18.73843-30.00336,16.0798-44.59833-34.52374-.0257-.02075-16.97424-10.936-4.79169-.5152Z\"\n      fill=\"#3f3d56\"\n    />\n    <circle cx=\"167.29993\" cy=\"248.60526\" fill=\"#a0616a\" r=\"24.9798\" />\n    <path d=\"M167.8769,273.59047c-.20135,.00662-.4032,.01108-.6048,.01657-.0863,.22388-.17938,.44583-.2868,.66357l.8916-.68015Z\" fill=\"#2f2e41\" />\n    <path d=\"M174.73243,249.29823c.03918,.24612,.09912,.48846,.17914,.72449-.03302-.24731-.09308-.49026-.17914-.72449Z\" fill=\"#2f2e41\" />\n    <path\n      d=\"M192.59852,224.6942c-1.0282,3.19272-1.94586-.85715-5.32825-.12869-4.06885,.87625-8.80377,.57532-12.13586-1.91879-4.96478-3.64273-11.39874-4.62335-17.22333-2.62509-5.70154,2.01706-15.25348,3.43933-16.73907,9.30179-.51642,2.03781-.7215,4.24933-1.97321,5.9382-1.09436,1.47662-2.82166,2.31854-4.26608,3.45499-4.87726,3.83743-1.14954,14.73981,1.15881,20.50046,2.30838,5.76065,7.60355,9.95721,13.42526,12.10678,5.63281,2.07977,11.7464,2.44662,17.75531,2.28317,1.04517-2.7106,.59363-5.84137-.26874-8.65134-.93359-3.04199-2.31592-5.97791-2.70593-9.13599s.46643-6.74527,3.11444-8.50986c2.4339-1.62192,6.39465-.63388,7.32062,1.98843-.54028-3.27841,2.7807-6.4509,6.20508-7.00882,3.67651-.599,7.35291,.72833,11.01886,1.38901s2.36475-14.77301,.64209-18.98425Z\"\n      fill=\"#2f2e41\"\n    />\n    <circle cx=\"281.3585\" cy=\"285.71051\" fill=\"hsl(var(--primary))\" r=\"51.12006\" transform=\"translate(-26.58509 542.54478) rotate(-85.26884)\" />\n    <path\n      d=\"M294.78675,264.41051l-13.42828,13.42828-13.42828-13.42828c-2.17371-2.17374-5.69806-2.17374-7.87177,0s-2.17371,5.69803,0,7.87177l13.42828,13.42828-13.42828,13.42828c-2.17169,2.17575-2.1684,5.70007,.00739,7.87177,2.17285,2.16879,5.69153,2.16879,7.86438-.00003l13.42828-13.42828,13.42828,13.42828c2.17578,2.17169,5.70007,2.1684,7.87177-.00735,2.16882-2.17288,2.16882-5.6915,0-7.86438l-13.42828-13.42828,13.42828-13.42828c2.17371-2.17374,2.17371-5.69803,0-7.87177s-5.69806-2.17374-7.87177,0h0Z\"\n      fill=\"#fff\"\n    />\n    <path\n      d=\"M261.21387,242.74385c1.5069,4.53946-.95154,9.44101-5.49097,10.94791-.48401,.16064-.9812,.27823-1.4859,.35141l-10.83051,53.71692-11.44788-11.16785,12.29266-50.48209c-.37366-4.7944,3.21008-8.98395,8.00452-9.3576,4.01166-.31265,7.71509,2.16425,8.95807,5.9913Z\"\n      fill=\"#a0616a\"\n    />\n    <path\n      d=\"M146.12519,312.22478l-4.04883,3.41412c-3.73322,3.16214-5.53476,8.05035-4.74649,12.87888,.29129,1.83917,.95773,3.59879,1.95786,5.16949l.00824,.0123c3.01477,4.72311,8.5672,7.17865,14.08978,6.23117l22.27075-3.84171c21.28461,2.72995,46.15155-6.65967,72.34302-20.53055l10.67969-50.37274-24.23297-1.80811-9.16821,32.78271-55.78815,8.28149-.03278,.00415-19.64294,4.67767-3.68896,3.1011Z\"\n      fill=\"#3f3d56\"\n    />\n    <path\n      d=\"M272.93684,658.99046l-271.75,.30731c-.65759-.00214-1.18896-.53693-1.18683-1.19452,.00211-.6546,.53223-1.18469,1.18683-1.18683l271.75-.30731c.65759,.00214,1.18896,.53693,1.18683,1.19452-.00208,.6546-.53223,1.18469-1.18683,1.18683Z\"\n      fill=\"#cacaca\"\n    />\n    <g>\n      <ellipse cx=\"56.77685\" cy=\"82.05834\" fill=\"#3f3d56\" rx=\"8.45661\" ry=\"8.64507\" />\n      <ellipse cx=\"85.9906\" cy=\"82.05834\" fill=\"#3f3d56\" rx=\"8.45661\" ry=\"8.64507\" />\n      <ellipse cx=\"115.20435\" cy=\"82.05834\" fill=\"#3f3d56\" rx=\"8.45661\" ry=\"8.64507\" />\n      <path\n        d=\"M148.51577,88.89113c-.25977,0-.51904-.10059-.71484-.30078l-5.70605-5.83301c-.38037-.38867-.38037-1.00977,0-1.39844l5.70605-5.83252c.38721-.39453,1.021-.40088,1.41406-.01562,.39502,.38623,.40186,1.01953,.01562,1.41406l-5.02197,5.1333,5.02197,5.13379c.38623,.39453,.37939,1.02783-.01562,1.41406-.19434,.19043-.44678,.28516-.69922,.28516Z\"\n        fill=\"#3f3d56\"\n      />\n      <path\n        d=\"M158.10415,88.89113c-.25244,0-.50488-.09473-.69922-.28516-.39502-.38623-.40186-1.01904-.01562-1.41406l5.02148-5.13379-5.02148-5.1333c-.38623-.39453-.37939-1.02783,.01562-1.41406,.39404-.38672,1.02783-.37939,1.41406,.01562l5.70557,5.83252c.38037,.38867,.38037,1.00977,0,1.39844l-5.70557,5.83301c-.1958,.2002-.45508,.30078-.71484,.30078Z\"\n        fill=\"#3f3d56\"\n      />\n      <path\n        d=\"M456.61398,74.41416h-10.60999c-1.21002,0-2.19,.97998-2.19,2.19v10.62c0,1.21002,.97998,2.19,2.19,2.19h10.60999c1.21002,0,2.20001-.97998,2.20001-2.19v-10.62c0-1.21002-.98999-2.19-2.20001-2.19Z\"\n        fill=\"#3f3d56\"\n      />\n      <path\n        d=\"M430.61398,74.41416h-10.60999c-1.21002,0-2.19,.97998-2.19,2.19v10.62c0,1.21002,.97998,2.19,2.19,2.19h10.60999c1.21002,0,2.20001-.97998,2.20001-2.19v-10.62c0-1.21002-.98999-2.19-2.20001-2.19Z\"\n        fill=\"#3f3d56\"\n      />\n      <path\n        d=\"M481.11398,74.91416h-10.60999c-1.21002,0-2.19,.97998-2.19,2.19v10.62c0,1.21002,.97998,2.19,2.19,2.19h10.60999c1.21002,0,2.20001-.97998,2.20001-2.19v-10.62c0-1.21002-.98999-2.19-2.20001-2.19Z\"\n        fill=\"#3f3d56\"\n      />\n      <path d=\"M321.19229,78.95414h-84.81c-1.48004,0-2.67004,1.20001-2.67004,2.67004s1.19,2.66998,2.67004,2.66998h84.81c1.46997,0,2.66998-1.20001,2.66998-2.66998s-1.20001-2.67004-2.66998-2.67004Z\" fill=\"#3f3d56\" />\n    </g>\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/fallback/icons/icon-404.vue",
    "content": "<template>\n  <svg height=\"571\" viewBox=\"0 0 860 571\" width=\"860\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n    <path\n      d=\"M605.66974,324.95306c-7.66934-12.68446-16.7572-26.22768-30.98954-30.36953-16.482-4.7965-33.4132,4.73193-47.77473,14.13453a1392.15692,1392.15692,0,0,0-123.89338,91.28311l.04331.49238q46.22556-3.1878,92.451-6.37554c22.26532-1.53546,45.29557-3.2827,64.97195-13.8156,7.46652-3.99683,14.74475-9.33579,23.20555-9.70782,10.51175-.46217,19.67733,6.87923,26.8802,14.54931,42.60731,45.371,54.937,114.75409,102.73817,154.61591A1516.99453,1516.99453,0,0,0,605.66974,324.95306Z\"\n      fill=\"#f2f2f2\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M867.57068,709.78146c-4.71167-5.94958-6.6369-7.343-11.28457-13.34761q-56.7644-73.41638-106.70791-151.79237-33.92354-53.23-64.48275-108.50439-14.54864-26.2781-28.29961-52.96872-10.67044-20.6952-20.8646-41.63793c-1.94358-3.98782-3.8321-7.99393-5.71122-12.00922-4.42788-9.44232-8.77341-18.93047-13.43943-28.24449-5.31686-10.61572-11.789-21.74485-21.55259-28.877a29.40493,29.40493,0,0,0-15.31855-5.89458c-7.948-.51336-15.28184,2.76855-22.17568,6.35295-50.43859,26.301-97.65922,59.27589-140.3696,96.79771A730.77816,730.77816,0,0,0,303.32241,496.24719c-1.008,1.43927-3.39164.06417-2.37419-1.38422q6.00933-8.49818,12.25681-16.81288A734.817,734.817,0,0,1,500.80465,303.06436q18.24824-11.82581,37.18269-22.54245c6.36206-3.60275,12.75188-7.15967,19.25136-10.49653,6.37146-3.27274,13.13683-6.21547,20.41563-6.32547,24.7701-.385,37.59539,27.66695,46.40506,46.54248q4.15283,8.9106,8.40636,17.76626,16.0748,33.62106,33.38729,66.628,10.68453,20.379,21.83683,40.51955,34.7071,62.71816,73.77854,122.897c34.5059,53.1429,68.73651,100.08874,108.04585,149.78472C870.59617,709.21309,868.662,711.17491,867.57068,709.78146Z\"\n      fill=\"#e4e4e4\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M414.91613,355.804c-1.43911-1.60428-2.86927-3.20856-4.31777-4.81284-11.42244-12.63259-23.6788-25.11847-39.3644-32.36067a57.11025,57.11025,0,0,0-23.92679-5.54622c-8.56213.02753-16.93178,2.27348-24.84306,5.41792-3.74034,1.49427-7.39831,3.1902-11.00078,4.99614-4.11634,2.07182-8.15927,4.28118-12.1834,6.50883q-11.33112,6.27044-22.36816,13.09089-21.9606,13.57221-42.54566,29.21623-10.67111,8.11311-20.90174,16.75788-9.51557,8.03054-18.64618,16.492c-1.30169,1.20091-3.24527-.74255-1.94358-1.94347,1.60428-1.49428,3.22691-2.97938,4.84955-4.44613q6.87547-6.21546,13.9712-12.19257,12.93921-10.91827,26.54851-20.99312,21.16293-15.67614,43.78288-29.22541,11.30361-6.76545,22.91829-12.96259c2.33794-1.24675,4.70318-2.466,7.09572-3.6211a113.11578,113.11578,0,0,1,16.86777-6.86632,60.0063,60.0063,0,0,1,25.476-2.50265,66.32706,66.32706,0,0,1,23.50512,8.1314c15.40091,8.60812,27.34573,21.919,38.97,34.90915C418.03337,355.17141,416.09875,357.12405,414.91613,355.804Z\"\n      fill=\"#e4e4e4\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M730.47659,486.71092l36.90462-13.498,18.32327-6.70183c5.96758-2.18267,11.92082-4.66747,18.08988-6.23036a28.53871,28.53871,0,0,1,16.37356.20862,37.73753,37.73753,0,0,1,12.771,7.91666,103.63965,103.63965,0,0,1,10.47487,11.18643c3.98932,4.79426,7.91971,9.63877,11.86772,14.46706q24.44136,29.89094,48.56307,60.04134,24.12117,30.14991,47.91981,60.556,23.85681,30.48041,47.38548,61.21573,2.88229,3.76518,5.75966,7.53415c1.0598,1.38809,3.44949.01962,2.37472-1.38808Q983.582,650.9742,959.54931,620.184q-24.09177-30.86383-48.51647-61.46586-24.42421-30.60141-49.17853-60.93743-6.16706-7.55761-12.35445-15.09858c-3.47953-4.24073-6.91983-8.52718-10.73628-12.47427-7.00539-7.24516-15.75772-13.64794-26.23437-13.82166-6.15972-.10214-12.121,1.85248-17.844,3.92287-6.16968,2.232-12.32455,4.50571-18.48633,6.75941l-37.16269,13.59243-9.29067,3.3981c-1.64875.603-.93651,3.2619.73111,2.652Z\"\n      fill=\"#e4e4e4\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M366.37741,334.52609c-18.75411-9.63866-42.77137-7.75087-60.00508,4.29119a855.84708,855.84708,0,0,1,97.37056,22.72581C390.4603,353.75916,380.07013,341.5635,366.37741,334.52609Z\"\n      fill=\"#f2f2f2\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path d=\"M306.18775,338.7841l-3.61042,2.93462c1.22123-1.02713,2.4908-1.99013,3.795-2.90144C306.31073,338.80665,306.24935,338.79473,306.18775,338.7841Z\" fill=\"#f2f2f2\" transform=\"translate(-169.93432 -164.42601)\" />\n    <path\n      d=\"M831.54929,486.84576c-3.6328-4.42207-7.56046-9.05222-12.99421-10.84836l-5.07308.20008A575.436,575.436,0,0,0,966.74929,651.418Q899.14929,569.13192,831.54929,486.84576Z\"\n      fill=\"#f2f2f2\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M516.08388,450.36652A37.4811,37.4811,0,0,0,531.015,471.32518c2.82017,1.92011,6.15681,3.76209,7.12158,7.03463a8.37858,8.37858,0,0,1-.87362,6.1499,24.88351,24.88351,0,0,1-3.86126,5.04137l-.13667.512c-6.99843-4.14731-13.65641-9.3934-17.52227-16.55115s-4.40553-16.53895.34116-23.14544\"\n      fill=\"#f2f2f2\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M749.08388,653.36652A37.4811,37.4811,0,0,0,764.015,674.32518c2.82017,1.92011,6.15681,3.76209,7.12158,7.03463a8.37858,8.37858,0,0,1-.87362,6.1499,24.88351,24.88351,0,0,1-3.86126,5.04137l-.13667.512c-6.99843-4.14731-13.65641-9.3934-17.52227-16.55115s-4.40553-16.53895.34116-23.14544\"\n      fill=\"#f2f2f2\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M284.08388,639.36652A37.4811,37.4811,0,0,0,299.015,660.32518c2.82017,1.92011,6.15681,3.76209,7.12158,7.03463a8.37858,8.37858,0,0,1-.87362,6.1499,24.88351,24.88351,0,0,1-3.86126,5.04137l-.13667.512c-6.99843-4.14731-13.65641-9.3934-17.52227-16.55115s-4.40553-16.53895.34116-23.14544\"\n      fill=\"#f2f2f2\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <circle cx=\"649.24878\" cy=\"51\" fill=\"hsl(var(--primary))\" r=\"51\" />\n    <path\n      d=\"M911.21851,176.29639c-24.7168-3.34094-52.93512,10.01868-59.34131,34.12353a21.59653,21.59653,0,0,0-41.09351,2.10871l2.82972,2.02667a372.27461,372.27461,0,0,0,160.65881-.72638C957.07935,195.76,935.93537,179.63727,911.21851,176.29639Z\"\n      fill=\"#f0f0f0\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M805.21851,244.29639c-24.7168-3.34094-52.93512,10.01868-59.34131,34.12353a21.59653,21.59653,0,0,0-41.09351,2.10871l2.82972,2.02667a372.27461,372.27461,0,0,0,160.65881-.72638C851.07935,263.76,829.93537,247.63727,805.21851,244.29639Z\"\n      fill=\"#f0f0f0\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M1020.94552,257.15423a.98189.98189,0,0,1-.30176-.04688C756.237,173.48919,523.19942,184.42376,374.26388,208.32122c-20.26856,3.251-40.59131,7.00586-60.40381,11.16113-5.05811,1.05957-10.30567,2.19532-15.59668,3.37793-6.31885,1.40723-12.55371,2.85645-18.53223,4.30567q-3.873.917-7.59472,1.84863c-3.75831.92773-7.57178,1.89453-11.65967,2.957-4.56787,1.17774-9.209,2.41309-13.79737,3.67188a.44239.44239,0,0,1-.05127.01465l.00049.001c-5.18261,1.415-10.33789,2.8711-15.32324,4.3252-2.69824.77929-5.30371,1.54785-7.79932,2.30664-.2788.07715-.52587.15136-.77636.22754l-.53614.16308c-.31054.09473-.61718.1875-.92382.27539l-.01953.00586.00048.001-.81152.252c-.96777.293-1.91211.5791-2.84082.86426-24.54492,7.56641-38.03809,12.94922-38.17139,13.00195a1,1,0,1,1-.74414-1.85644c.13428-.05274,13.69336-5.46289,38.32764-13.05762.93213-.28613,1.87891-.57226,2.84961-.86621l.7539-.23438c.02588-.00976.05176-.01757.07813-.02539.30518-.08691.60986-.17968.91943-.27343l.53711-.16309c.26758-.08105.53125-.16113.80127-.23535,2.47852-.75391,5.09278-1.52441,7.79785-2.30664,4.98731-1.45508,10.14746-2.91113,15.334-4.32813.01611-.00586.03271-.00976.04883-.01464v-.001c4.60449-1.2627,9.26269-2.50293,13.84521-3.68457,4.09424-1.06348,7.915-2.03223,11.67969-2.96192q3.73755-.93017,7.60937-1.85253c5.98536-1.45118,12.23291-2.90235,18.563-4.3125,5.29932-1.1836,10.55567-2.32227,15.62207-3.38282,19.84326-4.16211,40.19776-7.92285,60.49707-11.17871C523.09591,182.415,756.46749,171.46282,1021.2463,255.2011a.99974.99974,0,0,1-.30078,1.95313Z\"\n      fill=\"#ccc\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M432.92309,584.266a6.72948,6.72948,0,0,0-1.7-2.67,6.42983,6.42983,0,0,0-.92-.71c-2.61-1.74-6.51-2.13-8.99,0a5.81012,5.81012,0,0,0-.69.71q-1.11,1.365-2.28,2.67c-1.28,1.46-2.59,2.87-3.96,4.24-.39.38-.78.77-1.18,1.15-.23.23-.46.45-.69.67-.88.84-1.78,1.65-2.69,2.45-.48.43-.96.85-1.45,1.26-.73.61-1.46,1.22-2.2,1.81-.07.05-.14.1-.21.16-.02.01-.03.03-.05.04-.01,0-.02,0-.03.02a.17861.17861,0,0,0-.07.05c-.22.15-.37.25-.48.34.04-.01995.08-.05.12-.07-.18.14-.37.28-.55.42-1.75,1.29-3.54,2.53-5.37,3.69a99.21022,99.21022,0,0,1-14.22,7.55c-.33.13-.67.27-1.01.4a85.96993,85.96993,0,0,1-40.85,6.02q-2.13008-.165-4.26-.45c-1.64-.24-3.27-.53-4.89-.86a97.93186,97.93186,0,0,1-18.02-5.44,118.65185,118.65185,0,0,1-20.66-12.12c-1-.71-2.01-1.42-3.02-2.11,1.15-2.82,2.28-5.64,3.38-8.48.55-1.37,1.08-2.74,1.6-4.12,4.09-10.63,7.93-21.36,11.61-32.13q5.58-16.365,10.53-32.92.51-1.68.99-3.36,2.595-8.745,4.98-17.53c.15-.56994.31-1.12994.45-1.7q.68994-2.52,1.35-5.04c1-3.79-1.26-8.32-5.24-9.23a7.63441,7.63441,0,0,0-9.22,5.24c-.43,1.62-.86,3.23-1.3,4.85q-3.165,11.74494-6.66,23.41-.51,1.68-1.02,3.36-7.71,25.41-16.93,50.31-1.11,3.015-2.25,6.01c-.37.98-.74,1.96-1.12,2.94-.73,1.93-1.48,3.86-2.23,5.79-.43006,1.13-.87006,2.26-1.31,3.38-.29.71-.57,1.42-.85,2.12a41.80941,41.80941,0,0,0-8.81-2.12l-.48-.06a27.397,27.397,0,0,0-7.01.06,23.91419,23.91419,0,0,0-17.24,10.66c-4.77,7.51-4.71,18.25,1.98,24.63,6.89,6.57,17.32,6.52,25.43,2.41a28.35124,28.35124,0,0,0,10.52-9.86,50.56939,50.56939,0,0,0,2.74-4.65c.21.14.42.28.63.43.8.56,1.6,1.13,2.39,1.69a111.73777,111.73777,0,0,0,14.51,8.91,108.35887,108.35887,0,0,0,34.62,10.47c.27.03.53.07.8.1,1.33.17,2.67.3,4.01.41a103.78229,103.78229,0,0,0,55.58-11.36q2.175-1.125,4.31-2.36,3.315-1.92,6.48-4.08c1.15-.78,2.27-1.57,3.38-2.4a101.04244,101.04244,0,0,0,13.51-11.95q2.35491-2.475,4.51-5.11005a8.0612,8.0612,0,0,0,2.2-5.3A7.5644,7.5644,0,0,0,432.92309,584.266Zm-165.59,23.82c.21-.15.42-.31.62-.47C267.89312,607.766,267.60308,607.936,267.33312,608.086Zm3.21-3.23c-.23.26-.44.52-.67.78a23.36609,23.36609,0,0,1-2.25,2.2c-.11.1-.23.2-.35.29a.00976.00976,0,0,0-.01.01,3.80417,3.80417,0,0,0-.42005.22q-.645.39-1.31994.72a17.00459,17.00459,0,0,1-2.71.75,16.79925,16.79925,0,0,1-2.13.02h-.02a14.82252,14.82252,0,0,1-1.45-.4c-.24-.12-.47-.25994-.7-.4-.09-.08-.17005-.16-.22-.21a2.44015,2.44015,0,0,1-.26995-.29.0098.0098,0,0,0-.01-.01c-.11005-.2-.23005-.4-.34-.6a.031.031,0,0,1-.01-.02c-.08-.25-.15-.51-.21-.77a12.51066,12.51066,0,0,1,.01-1.37,13.4675,13.4675,0,0,1,.54-1.88,11.06776,11.06776,0,0,1,.69-1.26c.02-.04.12-.2.23-.38.01-.01.01-.01.01-.02.15-.17.3-.35.46-.51.27-.3.56-.56.85-.83a18.02212,18.02212,0,0,1,1.75-1.01,19.48061,19.48061,0,0,1,2.93-.79,24.98945,24.98945,0,0,1,4.41.04,30.30134,30.30134,0,0,1,4.1,1.01,36.94452,36.94452,0,0,1-2.77,4.54C270.6231,604.746,270.58312,604.806,270.54308,604.856Zm-11.12-3.29a2.18029,2.18029,0,0,1-.31.38995A1.40868,1.40868,0,0,1,259.42309,601.566Z\"\n      fill=\"hsl(var(--foreground))\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M402.86309,482.136q-.13494,4.71-.27,9.42-.285,10.455-.59,20.92-.315,11.775-.66,23.54-.165,6.07507-.34,12.15-.465,16.365-.92,32.72c-.03,1.13-.07,2.25-.1,3.38q-.225,8.11506-.45,16.23-.255,8.805-.5,17.61-.18,6.59994-.37,13.21-1.34994,47.895-2.7,95.79a7.64844,7.64844,0,0,1-7.5,7.5,7.56114,7.56114,0,0,1-7.5-7.5q.75-26.94,1.52-53.88.675-24.36,1.37-48.72.225-8.025.45-16.06.345-12.09.68-24.18c.03-1.13.07-2.25.1-3.38.02-.99.05-1.97.08-2.96q.66-23.475,1.32-46.96.27-9.24.52-18.49.3-10.545.6-21.08c.09-3.09.17005-6.17.26-9.26a7.64844,7.64844,0,0,1,7.5-7.5A7.56116,7.56116,0,0,1,402.86309,482.136Z\"\n      fill=\"hsl(var(--foreground))\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M814.29118,484.2172a893.23753,893.23753,0,0,1-28.16112,87.94127c-3.007,7.94641-6.08319,15.877-9.3715,23.71185l.75606-1.7916a54.58274,54.58274,0,0,1-5.58953,10.61184q-.22935.32119-.46685.63642,1.16559-1.49043.4428-.589c-.25405.30065-.5049.60219-.7676.89546a23.66436,23.66436,0,0,1-2.2489,2.20318q-.30139.25767-.61188.5043l.93783-.729c-.10884.25668-.87275.59747-1.11067.74287a18.25362,18.25362,0,0,1-2.40479,1.21853l1.7916-.75606a19.0859,19.0859,0,0,1-4.23122,1.16069l1.9938-.26791a17.02055,17.02055,0,0,1-4.29785.046l1.99379.2679a14.0022,14.0022,0,0,1-3.40493-.917l1.79159.75606a12.01175,12.01175,0,0,1-1.67882-.89614c-.27135-.17688-1.10526-.80852-.01487.02461,1.13336.86595.14562.07434-.08763-.15584-.19427-.19171-.36962-.4-.55974-.595-.88208-.90454.99637,1.55662.39689.49858a18.18179,18.18179,0,0,1-.87827-1.63672l.75606,1.7916a11.92493,11.92493,0,0,1-.728-2.65143l.26791,1.9938a13.65147,13.65147,0,0,1-.00316-3.40491l-.2679,1.9938a15.96371,15.96371,0,0,1,.99486-3.68011l-.75606,1.7916a16.72914,16.72914,0,0,1,1.17794-2.29848,6.72934,6.72934,0,0,1,.72851-1.0714c.04915.01594-1.26865,1.51278-.56937.757.1829-.19767.354-.40592.539-.602.29617-.31382.61354-.60082.92561-.89791,1.04458-.99442-1.46188.966-.25652.17907a19.0489,19.0489,0,0,1,2.74925-1.49923l-1.79159.75606a20.31136,20.31136,0,0,1,4.99523-1.33984l-1.9938.2679a25.62828,25.62828,0,0,1,6.46062.07647l-1.9938-.2679a33.21056,33.21056,0,0,1,7.89178,2.2199l-1.7916-.75606c5.38965,2.31383,10.16308,5.74926,14.928,9.118a111.94962,111.94962,0,0,0,14.50615,8.9065,108.38849,108.38849,0,0,0,34.62226,10.47371,103.93268,103.93268,0,0,0,92.58557-36.75192,8.07773,8.07773,0,0,0,2.1967-5.3033,7.63232,7.63232,0,0,0-2.1967-5.3033c-2.75154-2.52586-7.94926-3.239-10.6066,0a95.63575,95.63575,0,0,1-8.10664,8.72692q-2.01736,1.914-4.14232,3.70983-1.21364,1.02588-2.46086,2.01121c-.3934.31081-1.61863,1.13807.26309-.19744-.43135.30614-.845.64036-1.27058.95478a99.26881,99.26881,0,0,1-20.33215,11.56478l1.79159-.75606a96.8364,96.8364,0,0,1-24.17119,6.62249l1.99379-.2679a97.64308,97.64308,0,0,1-25.75362-.03807l1.99379.2679a99.79982,99.79982,0,0,1-24.857-6.77027l1.7916.75607a116.02515,116.02515,0,0,1-21.7364-12.59112,86.87725,86.87725,0,0,0-11.113-6.99417,42.8238,42.8238,0,0,0-14.43784-4.38851c-9.43884-1.11076-19.0571,2.56562-24.24624,10.72035-4.77557,7.50482-4.71394,18.24362,1.97369,24.62519,6.8877,6.5725,17.31846,6.51693,25.43556,2.40567,7.81741-3.95946,12.51288-12.18539,15.815-19.94186,7.43109-17.45514,14.01023-35.31364,20.1399-53.263q9.09651-26.63712,16.49855-53.81332.91661-3.36581,1.80683-6.73869c1.001-3.78869-1.26094-8.32-5.23829-9.22589a7.63317,7.63317,0,0,0-9.22589,5.23829Z\"\n      fill=\"hsl(var(--foreground))\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M889.12382,482.13557l-2.69954,95.79311-2.68548,95.29418-1.5185,53.88362a7.56465,7.56465,0,0,0,7.5,7.5,7.64923,7.64923,0,0,0,7.5-7.5l2.69955-95.79311,2.68548-95.29418,1.51849-53.88362a7.56465,7.56465,0,0,0-7.5-7.5,7.64923,7.64923,0,0,0-7.5,7.5Z\"\n      fill=\"hsl(var(--foreground))\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M629.52566,700.36106h2.32885V594.31942h54.32863v-2.32291H631.85451V547.25214H673.8102q-.92256-1.17339-1.89893-2.31694H631.85451V515.38231c-.7703-.32846-1.54659-.64493-2.32885-.9435V544.9352h-45.652V507.07c-.78227.03583-1.55258.08959-2.3289.15527v37.71h-36.4201V516.68409c-.78227.34636-1.55258.71061-2.31694,1.0928V544.9352h-30.6158v2.31694h30.6158v44.74437h-30.6158v2.32291h30.6158V700.36106h2.31694V594.31942a36.41283,36.41283,0,0,1,36.4201,36.42007v69.62157h2.3289V594.31942h45.652Zm-84.401-108.36455V547.25214h36.4201v44.74437Zm38.749,0V547.25214h.91362a44.74135,44.74135,0,0,1,44.73842,44.74437Z\"\n      opacity=\"0.2\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M615.30309,668.566a63.05854,63.05854,0,0,1-20.05,33.7c-.74.64-1.48,1.26-2.25,1.87q-2.805.25506-5.57.52c-1.53.14-3.04.29-4.54.43l-.27.03-.19-1.64-.76-6.64a37.623,37.623,0,0,1-3.3-32.44c2.64-7.12,7.42-13.41,12.12-19.65,6.49-8.62,12.8-17.14,13.03-27.65a60.54415,60.54415,0,0,1,7.9,13.33,16.432,16.432,0,0,0-5.12,3.76995c-.41.45-.82,1.08-.54,1.62006.24.46.84.57,1.36.62994,1.25.13,2.51.26,3.76.39,1,.11,2,.21,3,.32a63.99025,63.99025,0,0,1,2.45,12.18A61.18851,61.18851,0,0,1,615.30309,668.566Z\"\n      fill=\"hsl(var(--foreground))\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M648.50311,642.356c-5.9,4.29-9.35,10.46-12.03,17.26a16.62776,16.62776,0,0,0-7.17,4.58c-.41.45-.82,1.08-.54,1.62006.24.46.84.57,1.36.62994,1.25.13,2.51.26,3.76.39-2.68,8.04-5.14,16.36-9.88,23.15a36.98942,36.98942,0,0,1-12.03,10.91,38.49166,38.49166,0,0,1-4.02,1.99q-7.62.585-14.95,1.25-2.805.25506-5.57.52c-1.53.14-3.04.29-4.54.43q-.015-.825,0-1.65a63.30382,63.30382,0,0,1,15.25-39.86c.45-.52.91-1.03,1.38-1.54a61.7925,61.7925,0,0,1,16.81-12.7A62.65425,62.65425,0,0,1,648.50311,642.356Z\"\n      fill=\"hsl(var(--primary))\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M589.16308,699.526l-1.15,3.4-.58,1.73c-1.53.14-3.04.29-4.54.43l-.27.03c-1.66.17-3.31.34-4.96.51-.43-.5-.86-1.01-1.28-1.53a62.03045,62.03045,0,0,1,8.07-87.11c-1.32,6.91.22,13.53,2.75,20.1-.27.11-.53.22-.78.34a16.432,16.432,0,0,0-5.12,3.76995c-.41.45-.82,1.08-.54,1.62006.24.46.84.57,1.36.62994,1.25.13,2.51.26,3.76.39,1,.11,2,.21,3,.32q.705.075,1.41.15c.07.15.13.29.2.44,2.85,6.18,5.92,12.39,7.65,18.83a43.66591,43.66591,0,0,1,1.02,4.91A37.604,37.604,0,0,1,589.16308,699.526Z\"\n      fill=\"hsl(var(--primary))\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M689.82123,554.48655c-8.60876-16.79219-21.94605-30.92088-37.63219-41.30357a114.2374,114.2374,0,0,0-52.5626-18.37992q-3.69043-.33535-7.399-.39281c-2.92141-.04371-46.866,12.63176-61.58712,22.98214a114.29462,114.29462,0,0,0-35.333,39.527,102.49972,102.49972,0,0,0-12.12557,51.6334,113.56387,113.56387,0,0,0,14.70268,51.47577,110.47507,110.47507,0,0,0,36.44425,38.74592C549.66655,708.561,565.07375,734.51,583.1831,735.426c18.24576.923,39.05418-23.55495,55.6951-30.98707a104.42533,104.42533,0,0,0,41.72554-34.005,110.24964,110.24964,0,0,0,19.599-48.94777c2.57368-18.08313,1.37415-36.73271-4.80123-54.01627a111.85969,111.85969,0,0,0-5.58024-12.9833c-1.77961-3.50519-6.996-4.7959-10.26142-2.69063a7.67979,7.67979,0,0,0-2.69064,10.26142q1.56766,3.08773,2.91536,6.27758l-.75606-1.7916a101.15088,101.15088,0,0,1,6.87641,25.53816l-.26791-1.99379a109.2286,109.2286,0,0,1-.06613,28.68252l.26791-1.9938a109.73379,109.73379,0,0,1-7.55462,27.67419l.75606-1.79159a104.212,104.212,0,0,1-6.67151,13.09835q-1.92308,3.18563-4.08062,6.22159c-.63172.8881-1.28287,1.761-1.939,2.63114-.85625,1.13555,1.16691-1.48321.28228-.36941-.15068.18972-.30049.3801-.45182.5693q-.68121.85165-1.3818,1.68765a93.61337,93.61337,0,0,1-10.17647,10.38359q-1.36615,1.19232-2.77786,2.33115c-.46871.37832-.932.77269-1.42079,1.12472.01861-.0134,1.57956-1.19945.65556-.511-.2905.21644-.57851.43619-.86961.65184q-2.90994,2.1558-5.97433,4.092a103.48509,103.48509,0,0,1-14.75565,7.7131l1.7916-.75606a109.21493,109.21493,0,0,1-27.59663,7.55154l1.9938-.26791a108.15361,108.15361,0,0,1-28.58907.0506l1.99379.2679a99.835,99.835,0,0,1-25.09531-6.78448l1.79159.75607a93.64314,93.64314,0,0,1-13.41605-6.99094q-3.17437-2-6.18358-4.24743c-.2862-.21359-.56992-.43038-.855-.64549-.9155-.69088.65765.50965.67021.51787a19.16864,19.16864,0,0,1-1.535-1.22469q-1.45353-1.18358-2.86136-2.4218a101.98931,101.98931,0,0,1-10.49319-10.70945q-1.21308-1.43379-2.37407-2.91054c-.33524-.4263-.9465-1.29026.40424.5289-.17775-.23939-.36206-.47414-.54159-.71223q-.64657-.85751-1.27568-1.72793-2.203-3.048-4.18787-6.24586a109.29037,109.29037,0,0,1-7.8054-15.10831l.75606,1.7916a106.58753,106.58753,0,0,1-7.34039-26.837l.26791,1.9938a97.86589,97.86589,0,0,1-.04843-25.63587l-.2679,1.9938A94.673,94.673,0,0,1,505.27587,570.55l-.75606,1.7916a101.55725,101.55725,0,0,1,7.19519-13.85624q2.0655-3.32328,4.37767-6.4847.52528-.71832,1.06244-1.42786c.324-.4279,1.215-1.49333-.30537.38842.14906-.18449.29252-.37428.43942-.56041q1.26882-1.60756,2.59959-3.1649A107.40164,107.40164,0,0,1,530.772,536.21508q1.47408-1.29171,2.99464-2.52906.6909-.56218,1.39108-1.11284c.18664-.14673.37574-.29073.56152-.43858-1.99743,1.58953-.555.43261-.10157.09288q3.13393-2.34833,6.43534-4.46134a103.64393,103.64393,0,0,1,15.38655-8.10791l-1.7916.75606c7.76008-3.25839,42.14086-10.9492,48.394-10.10973l-1.99379-.26791A106.22471,106.22471,0,0,1,628.768,517.419l-1.7916-.75606a110.31334,110.31334,0,0,1,12.6002,6.32922q3.04344,1.78405,5.96742,3.76252,1.38351.93658,2.73809,1.915.677.48917,1.34626.98885c.24789.185.49386.37253.74135.558,1.03924.779-1.43148-1.1281-.34209-.26655a110.84261,110.84261,0,0,1,10.36783,9.2532q2.401,2.445,4.63686,5.04515,1.14659,1.33419,2.24643,2.70757c.36436.45495,1.60506,2.101.08448.08457.37165.49285.74744.98239,1.11436,1.47884a97.97718,97.97718,0,0,1,8.39161,13.53807c1.79317,3.49775,6.98675,4.80186,10.26142,2.69064A7.67666,7.67666,0,0,0,689.82123,554.48655Z\"\n      fill=\"hsl(var(--foreground))\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <path\n      d=\"M602.43116,676.88167a3.77983,3.77983,0,0,1-2.73939-6.55137c.09531-.37882.16368-.65085.259-1.02968q-.05115-.12366-.1029-.24717c-3.47987-8.29769-25.685,14.83336-26.645,22.63179a30.029,30.029,0,0,0,.52714,10.32752A120.39223,120.39223,0,0,1,562.77838,652.01a116.20247,116.20247,0,0,1,.72078-12.96332q.59712-5.293,1.65679-10.51055a121.78667,121.78667,0,0,1,24.1515-51.61646c6.87378.38364,12.898-.66348,13.47967-13.98532.10346-2.36972,1.86113-4.42156,2.24841-6.756-.65621.08607-1.32321.13985-1.97941.18285-.20444.0107-.41958.02149-.624.03228l-.07709.00346a3.745,3.745,0,0,1-3.07566-6.10115q.425-.52305.85054-1.04557c.43036-.53793.87143-1.06507,1.30171-1.60292a1.865,1.865,0,0,0,.13986-.16144c.49494-.61322.98971-1.21564,1.48465-1.82885a10.82911,10.82911,0,0,0-3.55014-3.43169c-4.95941-2.90463-11.80146-.89293-15.38389,3.59313-3.59313,4.486-4.27083,10.77947-3.023,16.3843a43.39764,43.39764,0,0,0,6.003,13.3828c-.269.34429-.54872.67779-.81765,1.02209a122.57366,122.57366,0,0,0-12.79359,20.2681c1.0163-7.93863-11.41159-36.60795-16.21776-42.68052-5.773-7.29409-17.61108-4.11077-18.62815,5.13562q-.01476.13428-.02884.26849,1.07082.60411,2.0964,1.28237a5.12707,5.12707,0,0,1-2.06713,9.33031l-.10452.01613c-9.55573,13.64367,21.07745,49.1547,28.74518,41.18139a125.11045,125.11045,0,0,0-6.73449,31.69282,118.66429,118.66429,0,0,0,.08607,19.15986l-.03231-.22593C558.90163,648.154,529.674,627.51374,521.139,629.233c-4.91675.99041-9.75952.76525-9.01293,5.72484q.01788.11874.03635.2375a34.4418,34.4418,0,0,1,3.862,1.86105q1.07082.60423,2.09639,1.28237a5.12712,5.12712,0,0,1-2.06712,9.33039l-.10464.01606c-.07528.01079-.13987.02157-.21507.03237-4.34967,14.96631,27.90735,39.12,47.5177,31.43461h.01081a125.07484,125.07484,0,0,0,8.402,24.52806H601.679c.10765-.3335.20443-.67779.3013-1.01129a34.102,34.102,0,0,1-8.30521-.49477c2.22693-2.73257,4.45377-5.48664,6.6807-8.21913a1.86122,1.86122,0,0,0,.13986-.16135c1.12956-1.39849,2.26992-2.78627,3.39948-4.18476l.00061-.00173a49.95232,49.95232,0,0,0-1.46367-12.72495Zm-34.37066-67.613.0158-.02133-.0158.04282Zm-6.64832,59.93237-.25822-.58084c.01079-.41957.01079-.83914,0-1.26942,0-.11845-.0215-.23672-.0215-.35508.09678.74228.18285,1.48464.29042,2.22692Z\"\n      fill=\"hsl(var(--foreground))\"\n      transform=\"translate(-169.93432 -164.42601)\"\n    />\n    <circle cx=\"95.24878\" cy=\"439\" fill=\"hsl(var(--foreground))\" r=\"11\" />\n    <circle cx=\"227.24878\" cy=\"559\" fill=\"hsl(var(--foreground))\" r=\"11\" />\n    <circle cx=\"728.24878\" cy=\"559\" fill=\"hsl(var(--foreground))\" r=\"11\" />\n    <circle cx=\"755.24878\" cy=\"419\" fill=\"hsl(var(--foreground))\" r=\"11\" />\n    <circle cx=\"723.24878\" cy=\"317\" fill=\"hsl(var(--foreground))\" r=\"11\" />\n    <path d=\"M434.1831,583.426a10.949,10.949,0,1,1-.21-2.16A10.9921,10.9921,0,0,1,434.1831,583.426Z\" fill=\"hsl(var(--foreground))\" transform=\"translate(-169.93432 -164.42601)\" />\n    <circle cx=\"484.24878\" cy=\"349\" fill=\"hsl(var(--foreground))\" r=\"11\" />\n    <path d=\"M545.1831,513.426a10.949,10.949,0,1,1-.21-2.16A10.9921,10.9921,0,0,1,545.1831,513.426Z\" fill=\"hsl(var(--foreground))\" transform=\"translate(-169.93432 -164.42601)\" />\n    <path d=\"M403.1831,481.426a10.949,10.949,0,1,1-.21-2.16A10.9921,10.9921,0,0,1,403.1831,481.426Z\" fill=\"hsl(var(--foreground))\" transform=\"translate(-169.93432 -164.42601)\" />\n    <circle cx=\"599.24878\" cy=\"443\" fill=\"hsl(var(--foreground))\" r=\"11\" />\n    <circle cx=\"426.24878\" cy=\"338\" fill=\"hsl(var(--foreground))\" r=\"16\" />\n    <path d=\"M1028.875,735.26666l-857.75.30733a1.19068,1.19068,0,1,1,0-2.38136l857.75-.30734a1.19069,1.19069,0,0,1,0,2.38137Z\" fill=\"#cacaca\" transform=\"translate(-169.93432 -164.42601)\" />\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/fallback/icons/icon-500.vue",
    "content": "<template>\n  <svg height=\"699\" viewBox=\"0 0 1119 699\" width=\"1119\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n    <title>server down</title>\n    <circle cx=\"292.60911\" cy=\"213\" fill=\"#f2f2f2\" r=\"213\" />\n    <path d=\"M31.39089,151.64237c0,77.49789,48.6181,140.20819,108.70073,140.20819\" fill=\"#2f2e41\" transform=\"translate(-31.39089 -100.5)\" />\n    <path d=\"M140.09162,291.85056c0-78.36865,54.255-141.78356,121.30372-141.78356\" fill=\"hsl(var(--primary))\" transform=\"translate(-31.39089 -100.5)\" />\n    <path d=\"M70.77521,158.66768c0,73.61476,31.00285,133.18288,69.31641,133.18288\" fill=\"hsl(var(--primary))\" transform=\"translate(-31.39089 -100.5)\" />\n    <path d=\"M140.09162,291.85056c0-100.13772,62.7103-181.16788,140.20819-181.16788\" fill=\"#2f2e41\" transform=\"translate(-31.39089 -100.5)\" />\n    <path\n      d=\"M117.22379,292.83905s15.41555-.47479,20.06141-3.783,23.713-7.2585,24.86553-1.95278,23.16671,26.38821,5.76263,26.5286-40.43935-2.711-45.07627-5.53549S117.22379,292.83905,117.22379,292.83905Z\"\n      fill=\"#a8a8a8\"\n      transform=\"translate(-31.39089 -100.5)\"\n    />\n    <path\n      d=\"M168.224,311.78489c-17.40408.14042-40.43933-2.71094-45.07626-5.53548-3.53126-2.151-4.93843-9.86945-5.40926-13.43043-.32607.014-.51463.02-.51463.02s.97638,12.43276,5.61331,15.2573,27.67217,5.67589,45.07626,5.53547c5.02386-.04052,6.7592-1.82793,6.66391-4.47526C173.87935,310.756,171.96329,311.75474,168.224,311.78489Z\"\n      opacity=\"0.2\"\n      transform=\"translate(-31.39089 -100.5)\"\n    />\n    <ellipse cx=\"198.60911\" cy=\"424.5\" fill=\"#3f3d56\" rx=\"187\" ry=\"25.43993\" />\n    <ellipse cx=\"198.60911\" cy=\"424.5\" opacity=\"0.1\" rx=\"157\" ry=\"21.35866\" />\n    <ellipse cx=\"836.60911\" cy=\"660.5\" fill=\"#3f3d56\" rx=\"283\" ry=\"38.5\" />\n    <ellipse cx=\"310.60911\" cy=\"645.5\" fill=\"#3f3d56\" rx=\"170\" ry=\"23.12721\" />\n    <path d=\"M494,726.5c90,23,263-30,282-90\" fill=\"none\" stroke=\"#2f2e41\" stroke-miterlimit=\"10\" stroke-width=\"2\" transform=\"translate(-31.39089 -100.5)\" />\n    <path d=\"M341,359.5s130-36,138,80-107,149-17,172\" fill=\"none\" stroke=\"#2f2e41\" stroke-miterlimit=\"10\" stroke-width=\"2\" transform=\"translate(-31.39089 -100.5)\" />\n    <path d=\"M215.40233,637.78332s39.0723-10.82,41.47675,24.04449-32.15951,44.78287-5.10946,51.69566\" fill=\"none\" stroke=\"#2f2e41\" stroke-miterlimit=\"10\" stroke-width=\"2\" transform=\"translate(-31.39089 -100.5)\" />\n    <path d=\"M810.09554,663.73988,802.218,714.03505s-38.78182,20.60284-11.51335,21.20881,155.73324,0,155.73324,0,24.84461,0-14.54318-21.81478l-7.87756-52.719Z\" fill=\"#2f2e41\" transform=\"translate(-31.39089 -100.5)\" />\n    <path\n      d=\"M785.21906,734.69812c6.193-5.51039,16.9989-11.252,16.9989-11.252l7.87756-50.2952,113.9216.10717,7.87756,49.582c9.185,5.08711,14.8749,8.987,18.20362,11.97818,5.05882-1.15422,10.58716-5.44353-18.20362-21.38921l-7.87756-52.719-113.9216,3.02983L802.218,714.03506S769.62985,731.34968,785.21906,734.69812Z\"\n      opacity=\"0.1\"\n      transform=\"translate(-31.39089 -100.5)\"\n    />\n    <rect fill=\"#2f2e41\" height=\"357.51989\" rx=\"18.04568\" width=\"513.25314\" x=\"578.43291\" y=\"212.68859\" />\n    <rect fill=\"#3f3d56\" height=\"267.83694\" width=\"478.71308\" x=\"595.70294\" y=\"231.77652\" />\n    <circle cx=\"835.05948\" cy=\"223.29299\" fill=\"#f2f2f2\" r=\"3.02983\" />\n    <path d=\"M1123.07694,621.32226V652.6628a18.04341,18.04341,0,0,1-18.04568,18.04568H627.86949A18.04341,18.04341,0,0,1,609.8238,652.6628V621.32226Z\" fill=\"#2f2e41\" transform=\"translate(-31.39089 -100.5)\" />\n    <polygon fill=\"#2f2e41\" points=\"968.978 667.466 968.978 673.526 642.968 673.526 642.968 668.678 643.417 667.466 651.452 645.651 962.312 645.651 968.978 667.466\" />\n    <path\n      d=\"M1125.828,762.03359c-.59383,2.539-2.83591,5.21743-7.90178,7.75032-18.179,9.08949-55.1429-2.42386-55.1429-2.42386s-28.4804-4.84773-28.4804-17.573a22.72457,22.72457,0,0,1,2.49658-1.48459c7.64294-4.04351,32.98449-14.02122,77.9177.42248a18.73921,18.73921,0,0,1,8.54106,5.59715C1125.07908,756.45353,1126.50669,759.15715,1125.828,762.03359Z\"\n      fill=\"#2f2e41\"\n      transform=\"translate(-31.39089 -100.5)\"\n    />\n    <path\n      d=\"M1125.828,762.03359c-22.251,8.526-42.0843,9.1622-62.43871-4.975-10.26507-7.12617-19.59089-8.88955-26.58979-8.75618,7.64294-4.04351,32.98449-14.02122,77.9177.42248a18.73921,18.73921,0,0,1,8.54106,5.59715C1125.07908,756.45353,1126.50669,759.15715,1125.828,762.03359Z\"\n      opacity=\"0.1\"\n      transform=\"translate(-31.39089 -100.5)\"\n    />\n    <ellipse cx=\"1066.53846\" cy=\"654.13477\" fill=\"#f2f2f2\" rx=\"7.87756\" ry=\"2.42386\" />\n    <circle cx=\"835.05948\" cy=\"545.66686\" fill=\"#f2f2f2\" r=\"11.51335\" />\n    <polygon opacity=\"0.1\" points=\"968.978 667.466 968.978 673.526 642.968 673.526 642.968 668.678 643.417 667.466 968.978 667.466\" />\n    <rect fill=\"#2f2e41\" height=\"242\" width=\"208\" x=\"108.60911\" y=\"159\" />\n    <rect fill=\"#3f3d56\" height=\"86\" width=\"250\" x=\"87.60911\" y=\"135\" />\n    <rect fill=\"#3f3d56\" height=\"86\" width=\"250\" x=\"87.60911\" y=\"237\" />\n    <rect fill=\"#3f3d56\" height=\"86\" width=\"250\" x=\"87.60911\" y=\"339\" />\n    <rect fill=\"#6c63ff\" height=\"16\" opacity=\"0.4\" width=\"16\" x=\"271.60911\" y=\"150\" />\n    <rect fill=\"#6c63ff\" height=\"16\" opacity=\"0.8\" width=\"16\" x=\"294.60911\" y=\"150\" />\n    <rect fill=\"#6c63ff\" height=\"16\" width=\"16\" x=\"317.60911\" y=\"150\" />\n    <rect fill=\"#6c63ff\" height=\"16\" opacity=\"0.4\" width=\"16\" x=\"271.60911\" y=\"251\" />\n    <rect fill=\"#6c63ff\" height=\"16\" opacity=\"0.8\" width=\"16\" x=\"294.60911\" y=\"251\" />\n    <rect fill=\"#6c63ff\" height=\"16\" width=\"16\" x=\"317.60911\" y=\"251\" />\n    <rect fill=\"#6c63ff\" height=\"16\" opacity=\"0.4\" width=\"16\" x=\"271.60911\" y=\"352\" />\n    <rect fill=\"#6c63ff\" height=\"16\" opacity=\"0.8\" width=\"16\" x=\"294.60911\" y=\"352\" />\n    <rect fill=\"#6c63ff\" height=\"16\" width=\"16\" x=\"317.60911\" y=\"352\" />\n    <circle cx=\"316.60911\" cy=\"538\" fill=\"#2f2e41\" r=\"79\" />\n    <rect fill=\"#2f2e41\" height=\"43\" width=\"24\" x=\"280.60911\" y=\"600\" />\n    <rect fill=\"#2f2e41\" height=\"43\" width=\"24\" x=\"328.60911\" y=\"600\" />\n    <ellipse cx=\"300.60911\" cy=\"643.5\" fill=\"#2f2e41\" rx=\"20\" ry=\"7.5\" />\n    <ellipse cx=\"348.60911\" cy=\"642.5\" fill=\"#2f2e41\" rx=\"20\" ry=\"7.5\" />\n    <circle cx=\"318.60911\" cy=\"518\" fill=\"#fff\" r=\"27\" />\n    <circle cx=\"318.60911\" cy=\"518\" fill=\"#3f3d56\" r=\"9\" />\n    <path\n      d=\"M271.36733,565.03228c-6.37889-28.56758,14.01185-57.43392,45.544-64.47477s62.2651,10.41,68.644,38.9776-14.51861,39.10379-46.05075,46.14464S277.74622,593.59986,271.36733,565.03228Z\"\n      fill=\"#6c63ff\"\n      transform=\"translate(-31.39089 -100.5)\"\n    />\n    <ellipse cx=\"417.21511\" cy=\"611.34365\" fill=\"#2f2e41\" rx=\"39.5\" ry=\"12.40027\" transform=\"translate(-238.28665 112.98044) rotate(-23.17116)\" />\n    <ellipse cx=\"269.21511\" cy=\"664.34365\" fill=\"#2f2e41\" rx=\"39.5\" ry=\"12.40027\" transform=\"translate(-271.07969 59.02084) rotate(-23.17116)\" />\n    <path d=\"M394,661.5c0,7.732-19.90861,23-42,23s-43-14.268-43-22,20.90861-6,43-6S394,653.768,394,661.5Z\" fill=\"#fff\" transform=\"translate(-31.39089 -100.5)\" />\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/fallback/icons/icon-coming-soon.vue",
    "content": "<template>\n  <svg data-name=\"Layer 1\" height=\"424.8366\" viewBox=\"0 0 979.32677 424.8366\" width=\"979.32677\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n    <path\n      d=\"M993.71816,412.83936H419.142a9.19888,9.19888,0,0,0,0,18.39776H435.417V651.3026a9.19888,9.19888,0,0,0,18.39776,0l.1398-220.06548h461.1557l42.52,220.06548a9.19887,9.19887,0,1,0,18.39775,0l2.67633-220.06548h15.01383a9.19888,9.19888,0,0,0,0-18.39776Z\"\n      fill=\"#ccc\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path d=\"M518.73716,371.85047v38.9547H421.141a19.48915,19.48915,0,1,1-1.35523-38.95474q.67739-.02358,1.35523,0Z\" fill=\"#f2f2f2\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path\n      d=\"M521.13449,410.50552a1.49881,1.49881,0,0,1-1.49822,1.49822H419.40273a20.52615,20.52615,0,0,1,0-41.05229H519.63627a1.49827,1.49827,0,1,1,0,2.99653H419.40273a17.52964,17.52964,0,0,0,0,35.05924H519.63627A1.49883,1.49883,0,0,1,521.13449,410.50552Z\"\n      fill=\"hsl(var(--primary))\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path d=\"M518.73716,380.84H413.85905a.29966.29966,0,0,1-.00552-.59929H518.73716a.29966.29966,0,0,1,0,.59929Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path d=\"M518.73716,388.03169H413.85905a.29966.29966,0,0,1-.00552-.59929H518.73716a.29966.29966,0,0,1,0,.59929Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path d=\"M518.73716,395.22332H413.85905a.29966.29966,0,0,1-.00552-.59929H518.73716a.29966.29966,0,0,1,0,.59929Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path d=\"M518.73716,402.41487H413.85905a.29966.29966,0,0,1-.00552-.59929H518.73716a.29966.29966,0,0,1,0,.59929Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path d=\"M500.33941,330.80932v38.95474H402.74324a19.48915,19.48915,0,0,1-1.35522-38.95474q.67737-.02358,1.35522,0Z\" fill=\"#f2f2f2\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path\n      d=\"M502.73673,369.46442a1.49885,1.49885,0,0,1-1.49822,1.49826H401.005a20.52614,20.52614,0,0,1,0-41.05229H501.23851a1.49826,1.49826,0,1,1,0,2.99652H401.005a17.52964,17.52964,0,0,0,0,35.05928H501.23851A1.49884,1.49884,0,0,1,502.73673,369.46442Z\"\n      fill=\"#3f3d56\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path d=\"M500.33941,339.79886H395.4613a.29966.29966,0,0,1-.00553-.59929H500.33941a.29966.29966,0,0,1,0,.59929Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path d=\"M500.33941,346.99054H395.4613a.29966.29966,0,0,1-.00553-.59929H500.33941a.29966.29966,0,0,1,0,.59929Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path d=\"M500.33941,354.18217H395.4613a.29966.29966,0,0,1-.00553-.59929H500.33941a.29966.29966,0,0,1,0,.59929Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path d=\"M500.33941,361.37376H395.4613a.29966.29966,0,0,1-.00553-.59929H500.33941a.29966.29966,0,0,1,0,.59929Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path d=\"M613.87355,550.68347V516.71838a5.661,5.661,0,0,0-5.66085-5.66085H479.4284a5.661,5.661,0,0,0-5.66084,5.66085v33.96509Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <rect fill=\"#ccc\" height=\"43.87158\" width=\"140.10602\" x=\"363.43092\" y=\"325.83868\" />\n    <path d=\"M473.76756,620.02887V653.994a5.661,5.661,0,0,0,5.66084,5.66084H608.2127a5.661,5.661,0,0,0,5.66085-5.66084V620.02887Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <circle cx=\"432.77633\" cy=\"294.70402\" fill=\"#fff\" r=\"4.24564\" />\n    <circle cx=\"432.77633\" cy=\"351.3125\" fill=\"#fff\" r=\"4.24564\" />\n    <circle cx=\"433.00385\" cy=\"406.72228\" fill=\"#fff\" r=\"4.24564\" />\n    <path d=\"M597.989,472.33053v38.9547H500.39287a19.48916,19.48916,0,0,1-1.35647-38.9547q.678-.02358,1.35647,0Z\" fill=\"#f2f2f2\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path\n      d=\"M600.38637,510.98558a1.49881,1.49881,0,0,1-1.49822,1.49822H498.65461a20.52615,20.52615,0,0,1-.0247-41.05229H598.88815a1.49827,1.49827,0,1,1,0,2.99653H498.65461a17.52963,17.52963,0,0,0,0,35.05923H598.88815A1.49885,1.49885,0,0,1,600.38637,510.98558Z\"\n      fill=\"#3f3d56\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path d=\"M597.989,481.32H493.111a.29966.29966,0,0,1-.00553-.59929H597.98913a.29966.29966,0,0,1,0,.59929Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path d=\"M597.989,488.51175H493.111a.29966.29966,0,0,1-.00553-.59929H597.98913a.29966.29966,0,0,1,0,.59929Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path d=\"M597.989,495.70338H493.111a.29966.29966,0,0,1-.00553-.59929H597.98913a.29966.29966,0,0,1,0,.59929Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path d=\"M597.989,502.89493H493.111a.29966.29966,0,0,1-.00553-.59929H597.98913a.29966.29966,0,0,1,0,.59929Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path\n      d=\"M483.36747,317.81415H438.90162a2.74745,2.74745,0,0,0-1.21689.28306l-11.22288,5.61835a2.0452,2.0452,0,0,0,0,3.76443l11.22288,5.61835a2.74718,2.74718,0,0,0,1.21689.28306h44.46585a2.33381,2.33381,0,0,0,2.4628-2.16532v-11.2367A2.3338,2.3338,0,0,0,483.36747,317.81415Z\"\n      fill=\"#3f3d56\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M485.83027,319.97947v11.2367a2.33383,2.33383,0,0,1-2.4628,2.16532h-8.8589V317.81415h8.8589A2.33383,2.33383,0,0,1,485.83027,319.97947Z\"\n      fill=\"hsl(var(--primary))\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M216.78083,537.99332a35.33951,35.33951,0,0,0,34.12552-6.01134c11.95262-10.03214,15.70013-26.56,18.74934-41.864q4.50949-22.63308,9.019-45.26617l-18.88217,13.00153c-13.57891,9.34993-27.46375,18.99939-36.86572,32.54233S209.42082,522.42587,216.975,537.08\"\n      fill=\"#e6e6e6\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M218.39489,592.79741c-1.91113-13.92071-3.87625-28.0202-2.53572-42.09016,1.19057-12.4956,5.00277-24.70032,12.764-34.70734a57.73582,57.73582,0,0,1,14.81307-13.42309c1.48131-.935,2.84468,1.41257,1.36983,2.34348a54.88844,54.88844,0,0,0-21.71125,26.19626c-4.72684,12.02273-5.48591,25.12848-4.67135,37.90006.4926,7.72345,1.53656,15.39627,2.58859,23.05926a1.40615,1.40615,0,0,1-.94781,1.66928,1.3653,1.3653,0,0,1-1.6693-.94781Z\"\n      fill=\"#f2f2f2\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M236.80246,568.16434a26.01425,26.01425,0,0,0,22.6665,11.69871c11.47417-.54466,21.04-8.55293,29.651-16.15584l25.46969-22.48783-16.85671-.80672c-12.12234-.58011-24.55745-1.12124-36.10356,2.617s-22.19457,12.73508-24.30583,24.68624\"\n      fill=\"#e6e6e6\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M212.99392,600.79976c9.19853-16.27621,19.86805-34.36538,38.93262-40.14695A43.445,43.445,0,0,1,268.3022,558.962c1.73863.14991,1.30448,2.82994-.431,2.6803a40.36111,40.36111,0,0,0-26.133,6.91386c-7.36852,5.01554-13.10573,11.98848-17.96161,19.383-2.97439,4.52936-5.63867,9.25082-8.30346,13.966-.85161,1.50687-3.34078.41915-2.47922-1.10534Z\"\n      fill=\"#f2f2f2\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M198.25523,617.93168a19.69836,19.69836,0,0,1,12.0709-16.49847v-9.40956h15.782v9.70608a19.68812,19.68812,0,0,1,11.41362,16.202l3.711,43.13835H194.54417Z\"\n      fill=\"#f2f2f2\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M734.973,411.955l-4.69488-1.97685-3.22067-23.53551h-42.889l-3.491,23.43936-4.20031,2.10013a.99744.99744,0,0,0,.44611,1.88955h57.66283A.99739.99739,0,0,0,734.973,411.955Z\"\n      fill=\"#e6e6e6\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path d=\"M811.1898,389.574H600.50692a4.174,4.174,0,0,1-4.16467-4.174V355.69092H815.35446V385.4A4.17408,4.17408,0,0,1,811.1898,389.574Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path d=\"M815.57469,369.73213H596.15V242.61337a5.0375,5.0375,0,0,1,5.03186-5.03167h209.361a5.03755,5.03755,0,0,1,5.03191,5.03167Z\" fill=\"#3f3d56\" transform=\"translate(-110.33661 -237.5817)\" />\n    <path\n      d=\"M802.46932,360.50584h-193.214a3.88344,3.88344,0,0,1-3.87919-3.87908V250.68707a3.88365,3.88365,0,0,1,3.87919-3.87932h193.214a3.88366,3.88366,0,0,1,3.8792,3.87932V356.62676A3.88345,3.88345,0,0,1,802.46932,360.50584Z\"\n      fill=\"#fff\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M751.57964,397.88662a11.6159,11.6159,0,0,1,17.666,2.27241l26.13446-4.64642,6.69716,15.19317-36.99908,6.04328a11.67883,11.67883,0,0,1-13.49855-18.86244Z\"\n      fill=\"#ffb6b6\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M775.77611,417.286l27.24571-.33963,3.44882-.04668,55.43253-.69843s15.05312-14.3609,28.16068-29.1465l-1.83719-13.28833A54.29159,54.29159,0,0,0,870.023,340.1519C851.24988,352.696,840.363,377.52559,840.363,377.52559l-34.37018,8.22071-3.43848.82227-21.35608,5.10326Z\"\n      fill=\"hsl(var(--primary))\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M915.25011,498.96167H864.39249c0,2.17915-55.59414,3.94772-55.59414,3.94772a20.30858,20.30858,0,0,0-3.33166,3.15818,19.59694,19.59694,0,0,0-4.58,12.63271v3.15818a19.74588,19.74588,0,0,0,19.73861,19.73861h94.62478a19.75579,19.75579,0,0,0,19.73862-19.73861v-3.15818A19.76607,19.76607,0,0,0,915.25011,498.96167Z\"\n      fill=\"#e4e4e4\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <rect fill=\"#e4e4e4\" height=\"118.48951\" width=\"20.52816\" x=\"747.4019\" y=\"303.23122\" />\n    <path\n      d=\"M799.31222,658.58132c0,2.218,31.10721.858,69.47992.858s69.47991,1.36012,69.47991-.858-31.1072-19.807-69.47991-19.807S799.31222,656.36323,799.31222,658.58132Z\"\n      fill=\"#e4e4e4\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <polygon fill=\"#ffb6b6\" points=\"675.186 407.461 659.908 407.46 652.64 348.531 675.188 348.532 675.186 407.461\" />\n    <path d=\"M789.41863,659.852l-49.2623-.00183v-.62309a19.17528,19.17528,0,0,1,19.17426-19.17395h.00122l30.08773.00122Z\" fill=\"#2f2e41\" transform=\"translate(-110.33661 -237.5817)\" />\n    <polygon fill=\"#ffb6b6\" points=\"630.031 407.461 614.753 407.46 607.485 348.531 630.033 348.532 630.031 407.461\" />\n    <path d=\"M744.2636,659.852l-49.2623-.00183v-.62309a19.1753,19.1753,0,0,1,19.17426-19.17395h.00122l30.08773.00122Z\" fill=\"#2f2e41\" transform=\"translate(-110.33661 -237.5817)\" />\n    <circle cx=\"766.88656\" cy=\"41.63615\" fill=\"#ffb6b6\" r=\"26.56401\" />\n    <path\n      d=\"M920.21655,461.22417s8.91308,47.1307-24.99958,53.13247-82.86639,10.21993-82.86639,10.21993L790.36706,627.14324l-29.53443-2.63675s3.928-123.46737,13.5876-133.127,70.71212-38.58282,70.71212-38.58282Z\"\n      fill=\"#2f2e41\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M853.98286,441.47135,839.151,456.35062s-107.0941,17.25-111.22553,41.9852c-6.23747,37.34427-13.60493,118.552-13.60493,118.552l32.1988-2.41491,12.62647-92.31123,51.5182-11.71874L869.27729,478.5Z\"\n      fill=\"#2f2e41\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M902.78526,263.36115c-2.6223-4.94751-5.95413-14.80785-11.24679-16.63657a42.07731,42.07731,0,0,0-9.05841-1.92972l-8.99618,3.46009,4.89616-3.808q-1.42988-.08519-2.85817-.13928l-6.0699,2.33453,3.10542-2.41532c-5.65883-.05808-11.5.53031-15.88468,3.9752-3.73817,2.93677-7.44169,14.06185-8.04057,18.77753a35.9171,35.9171,0,0,0,.6603,13.53055l1.53716,1.46166a18.85936,18.85936,0,0,0,1.206-3.83883,18.18056,18.18056,0,0,1,8.70263-11.80641l.08368-.0472c2.5782-1.451,5.7065-1.3841,8.66308-1.27769l14.04158.50527c3.37829.12158,7.01608.33533,9.64978,2.45443a15.888,15.888,0,0,1,3.85826,5.58929c1.30868,2.6414,3.8661,12.60418,3.8661,12.60418s1.44689-1.88062,2.1404-.48092a48.39766,48.39766,0,0,0,2.01437-11.23347A22.00877,22.00877,0,0,0,902.78526,263.36115Z\"\n      fill=\"#2f2e41\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M995.69426,290.88349A11.61582,11.61582,0,0,0,985.181,305.26136l-21.3614,15.75722,6.40951,15.31674,29.8539-22.67594a11.67883,11.67883,0,0,0-4.38876-22.77589Z\"\n      fill=\"#ffb6b6\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M992.25627,323.052l-53.551,59.4744s-25.60913-8.19816-45.41466-17.08624l-8.8977-27.32787a54.34329,54.34329,0,0,1-2.60112-19.66442c27.45606-7.306,59.391,19.87863,59.391,19.87863l40.08517-31.39877Z\"\n      fill=\"hsl(var(--primary))\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path\n      d=\"M867.301,465.6169c-9.554-3.30029-19.43312-6.71277-30.08912-7.99385l-.45773-.05533.12632-.443c11.03073-38.7308,8.27761-63.50657,2.87195-100.72306a37.59072,37.59072,0,0,1,21.5483-39.50121l.06542-.02958,30.43436-1.93391.06935-.00423,22.13437,6.50989a15.18313,15.18313,0,0,1,10.86724,14.83111c-.23987,12.23937.26868,25.9043.80711,40.37114,1.20787,32.45569,2.45686,66.01647-4.63045,87.79166l-.03718.11412-.09462.07416a36.09883,36.09883,0,0,1-23.08086,8.10758C887.90057,472.73235,877.76186,469.23034,867.301,465.6169Z\"\n      fill=\"hsl(var(--primary))\"\n      transform=\"translate(-110.33661 -237.5817)\"\n    />\n    <path d=\"M1088.24817,662.4183H111.75183a1.41521,1.41521,0,1,1,0-2.83042h976.49634a1.41521,1.41521,0,1,1,0,2.83042Z\" fill=\"#ccc\" transform=\"translate(-110.33661 -237.5817)\" />\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/fallback/icons/icon-offline.vue",
    "content": "<template>\n  <svg height=\"458.68642\" viewBox=\"0 0 656 458.68642\" width=\"656\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n    <rect fill=\"#3f3d56\" height=\"2\" width=\"656\" y=\"434.34322\" />\n    <g>\n      <path\n        d=\"M471.97092,210.81397c-6.0733-36.41747-37.72842-64.16942-75.86423-64.16942H240.14931c-38.12099,0-69.76869,27.72972-75.86421,64.12497-.70358,4.16241-1.06653,8.44331-1.06653,12.80573v135.88599c0,4.36237,.36295,8.63589,1.06653,12.79831,4.85126,28.99625,25.92996,52.49686,53.58563,60.84393,7.05095,2.13306,14.53143,3.28104,22.27859,3.28104h155.9574c7.74716,0,15.22763-1.14798,22.27859-3.28104,27.66309-8.35449,48.74921-31.86993,53.58563-60.88837,.6962-4.14758,1.05911-8.40628,1.05911-12.75388V223.57525c0-4.34758-.36292-8.61369-1.05911-12.76128h-.00003Zm-62.66592,222.28954c-4.2883,.76285-8.69516,1.16281-13.19827,1.16281H240.14931c-4.50313,0-8.90997-.39999-13.19829-1.16281-35.01768-6.22885-61.60677-36.83228-61.60677-73.64224v-45.10526c0-127.45004,103.31242-165.58582,230.76244-165.58582,41.31314,0,74.80505,33.49194,74.80505,74.80505v135.88599c-100.29059,13.42047-26.58911,67.41339-61.60678,73.64224l.00003,.00003Z\"\n        fill=\"#3f3d56\"\n      />\n      <polygon fill=\"hsl(var(--primary))\" points=\"349.16196 249.18644 355.16196 288.18642 443.16196 276.18642 434.66196 230.6195 349.16196 249.18644\" />\n      <rect fill=\"#2f2e41\" height=\"37.66125\" width=\"36.38461\" x=\"381.84177\" y=\"30.34218\" />\n      <polygon fill=\"#ffb6b6\" points=\"385.16196 70.18643 394.16196 43.18643 411.70447 43.18643 412.62653 70.18643 385.16196 70.18643\" />\n      <polygon isolation=\"isolate\" opacity=\".1\" points=\"385.16196 70.18643 394.16196 43.18643 411.70447 43.18643 412.62653 70.18643 385.16196 70.18643\" />\n      <path d=\"M394.66196,310.68642l-1,104-1,8v11.48425l15,1.51575,1-23s16-45,12-80-2-25-2-25l-24,3Z\" fill=\"#ffb6b6\" />\n      <path\n        d=\"M404.18408,318.85363l-36.90134,97.23831-1.97873,7.81567-4.1777,10.69742-14.52368-4.04477,7.43539-21.78796s1.46619-47.7373,17.92432-78.88422,10.9574-22.5596,10.9574-22.5596l21.26434,11.52512v.00003Z\"\n        fill=\"#ffb6b6\"\n      />\n      <path d=\"M385.16196,67.18643l-27,12,17.23959,89.01208-2.72385,127.75565-18,38s-3.01575,21.73227,27.98425,7.73227,66-18,66-18l-8.5-58.5-7.5-153.5,1-34-22-14s-26.5,3.5-26.5,3.50001Z\" fill=\"#2f2e41\" />\n      <path d=\"M370.1243,335.34322l-29.96231-50.15677,34.23959-116.98792-16.23959-89.01208,28.49045-12.19685s14.74915,14.36248,14.74915,26.20894-31.27728,242.1447-31.27728,242.1447v-.00003Z\" fill=\"#e6e6e6\" />\n      <path d=\"M435.1243,325.34322l-27.19693-233.62811c-.34341-2.94999,.16013-5.93678,1.45178-8.6111l7.78284-16.11441,30.5,8.69685-12.26041,95.51208,32.76041,93.98792-33.03769,60.15677Z\" fill=\"#e6e6e6\" />\n      <path d=\"M410.66196,433.68642s-19-11-21-5-3,11-3,11c0,0-5,19,10,19s14-8.64172,14-8.64172v-16.35828Z\" fill=\"#2f2e41\" />\n      <path\n        d=\"M344.53574,427.60598s21.69977-3.33459,21.3801,2.9819c-.3197,6.31647-1.20709,11.33768-1.20709,11.33768,0,0-2.25433,19.51712-16.22662,14.06046s-9.89713-13.14252-9.89713-13.14252l5.95078-15.23749-.00003-.00003Z\"\n        fill=\"#2f2e41\"\n      />\n      <circle cx=\"404.10297\" cy=\"33.02146\" fill=\"#ffb6b6\" r=\"24.85993\" />\n      <path\n        d=\"M423.96469,10.86766c-1.15707-6.12936-7.44913-10.27514-13.66504-10.79501s-12.30453,1.82726-17.90228,4.57921c-3.79456,1.86548-7.53061,3.96811-10.60425,6.87182s-5.46063,6.69692-6.01202,10.88913c-.19507,1.48324-.1698,3.03289-.77692,4.40016-.75845,1.708-2.38654,2.86795-3.36917,4.4576-1.76227,2.85096-.95267,6.99858,1.75238,8.97753-3.40024,1.44912-6.89398,2.96069-9.48602,5.59563s-4.08878,6.70308-2.66644,10.11462c.50323,1.20699,1.33481,2.26349,1.76489,3.49843,.81668,2.34499,.03943,5.00909-1.40924,7.02585s-3.49316,3.51228-5.50174,4.97226c5.16196,1.01177,10.43097,1.80015,15.66992,1.32811s10.49707-2.30805,14.29086-5.95176c3.79379-3.64371,5.88083-9.26437,4.51974-14.34539-1.04269-3.89231-3.95898-7.30301-3.95712-11.33256,.00143-3.09747,1.7431-5.89158,3.4249-8.49271,3.67291-5.68066,7.34579-11.36132,11.01868-17.04197,.66068-1.02183,1.35739-2.07924,2.4014-2.70425,1.77606-1.06326,4.0798-.59568,5.95227,.28683,1.87244,.88252,3.58304,2.14867,5.57941,2.69585,4.07452,1.11677,8.80106-1.44789,10.08575-5.47261\"\n        fill=\"#2f2e41\"\n      />\n      <path\n        d=\"M409.27951,61.42523c-2.07159,2.0061-5.05701,2.65225-7.82379,3.46516s-5.70978,2.09141-6.95499,4.69243c-1.22101,2.55043-.33459,5.78793,1.68692,7.76505s4.95816,2.80999,7.78555,2.77077c2.82736-.03922,5.58282-.86796,8.24176-1.8301,7.27054-2.63087,14.15665-6.32148,20.37314-10.919-4.02679-1.11411-6.66107-5.81614-5.50836-9.83205,.93768-3.26677,3.80499-5.54528,5.75616-8.32809,3.35959-4.79151,3.91925-11.10753,2.80676-16.85277-1.11246-5.74524-3.73163-11.07097-6.32358-16.3176-.81934-1.65853-1.65805-3.34513-2.93619-4.68245-1.27814-1.33731-3.08783-2.29539-4.92776-2.10379-3.05334,.31795-5.00302,3.66989-5.02377,6.7397s1.32593,5.95491,2.34732,8.84988c1.05231,2.98259,1.78381,6.14409,1.50146,9.29425-.2366,2.63989-1.19669,5.21132-2.74811,7.36029-1.19809,1.65954-2.72479,3.05223-4.0275,4.63097-1.00714,1.22055-1.90009,2.60309-2.16486,4.16321-.48181,2.83914,1.18356,5.71186,.72714,8.55519-.48248,3.0056-3.6452,5.3067-6.65341,4.84085\"\n        fill=\"#2f2e41\"\n      />\n      <g>\n        <circle cx=\"333.2486\" cy=\"323.64455\" fill=\"hsl(var(--primary))\" r=\"85\" />\n        <g>\n          <path\n            d=\"M384.17838,316.82296h-10.56668c-1.64377-9.68713-6.7168-18.46011-14.2923-24.71729-17.43427-14.39993-43.24109-11.94022-57.64099,5.49411-.04913,.05563-.09644,.11282-.14169,.17151-1.15063,1.49146-.87427,3.63333,.61716,4.784,1.49118,1.1507,3.63306,.87448,4.78394-.61697,6.25537-7.5788,15.72369-12.40167,26.31064-12.40167,16.20853,.00195,30.17899,11.40631,33.42572,27.28629h-9.31805c-.3988,.00012-.78458,.13992-1.09082,.39502-.72375,.60281-.82175,1.6781-.21915,2.40186l13.41125,16.09894c.06577,.07889,.13855,.1517,.21759,.21747,.72324,.60327,1.79871,.50583,2.40186-.21747l13.41125-16.09894c.25504-.30624,.3949-.69223,.39514-1.09082,.00027-.94186-.763-1.70566-1.70486-1.70605v.00003Z\"\n            fill=\"#fff\"\n          />\n          <path\n            d=\"M364.34329,344.7337c-1.49146-1.15063-3.63333-.87433-4.78394,.6171-4.96201,6.00781-11.83066,10.13629-19.46436,11.69922-18.46167,3.77988-36.49231-8.12213-40.27225-26.58392h9.3183c.94186-.0004,1.70514-.76419,1.70486-1.70605-.00027-.39853-.14011-.78452-.39514-1.09082l-13.41125-16.09888c-.60312-.72336-1.67862-.8208-2.40186-.21753-.07904,.06577-.15182,.13855-.21759,.21753l-13.41125,16.09888c-.6026,.72375-.50461,1.7991,.21915,2.40186,.30624,.25516,.69205,.3949,1.09082,.39502h10.56641c1.64404,9.68723,6.7168,18.46011,14.29254,24.71729,17.43427,14.39999,43.24109,11.94022,57.64099-5.49405,.04913-.05569,.09619-.11295,.14142-.17163,1.15088-1.49146,.87454-3.63327-.61691-4.784h.00006Z\"\n            fill=\"#fff\"\n          />\n        </g>\n      </g>\n      <path\n        id=\"uuid-da16df1e-5659-4232-96f6-61e8c639a9ec-574\"\n        d=\"M356.98148,237.19363c-1.02939,7.36621-5.66458,12.80598-10.35239,12.15012-4.68781-.65588-7.65225-7.15837-6.62149-14.52707,.37137-2.94914,1.4436-5.76646,3.12701-8.21626l4.75577-31.15587,14.57297,2.54338-6.23553,30.44414c.94736,2.81844,1.20581,5.82278,.75369,8.76157h-.00003Z\"\n        fill=\"#ffb6b6\"\n      />\n      <path d=\"M369.66196,77.68643s-15-5-17,13-4,39.99999-4,39.99999c0,0-9,21-5,32s11,3.3307,4,12.66534-6.02478,40.04724-6.02478,40.04724l22.52478-1.13387s12.5-82.57875,12.5-84.57875-7-52-7-52v.00004Z\" fill=\"#e6e6e6\" />\n      <g>\n        <path\n          id=\"uuid-6bf35aa9-e432-4b51-af77-8f4eb19e6e42-575\"\n          d=\"M467.16132,233.84998c.27881,7.43257-3.33017,13.60114-8.06033,13.7778s-8.78937-5.70491-9.06732-13.14017c-.15176-2.96857,.40961-5.93028,1.63712-8.63741l-.78369-31.507,14.79315-.05261-.798,31.0659c1.42709,2.60854,2.20859,5.52095,2.27905,8.49347l.00003,.00002Z\"\n          fill=\"#ffb6b6\"\n        />\n        <path\n          d=\"M444.06961,77.34876s15.08694-4.73121,16.76505,13.30165,3.28473,51.06508,3.28473,51.06508c0,0,8.62338,21.15744,4.42749,32.08421s-11.05774,3.13365-4.22565,12.59187c6.83212,9.45822,4.37997,36.13126,4.37997,36.13126l-22.50095-1.53612s-10.09427-78.77167-10.05853-80.77133,7.92792-62.86664,7.92792-62.86664l-.00003,.00002Z\"\n          fill=\"#e6e6e6\"\n        />\n      </g>\n    </g>\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/fallback/index.ts",
    "content": "export type * from \"./fallback\";\nexport { default as Fallback } from \"./fallback.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/common-ui/ui/index.ts",
    "content": "export * from \"./about\";\nexport * from \"./authentication\";\nexport * from \"./dashboard\";\nexport * from \"./fallback\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/composables/__tests__/use-sortable.test.ts",
    "content": "import type { SortableOptions } from \"sortablejs\";\n\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { useSortable } from \"../use-sortable\";\n\ndescribe(\"useSortable\", () => {\n  beforeEach(() => {\n    vi.mock(\"sortablejs/modular/sortable.complete.esm.js\", () => ({\n      default: {\n        create: vi.fn(),\n      },\n    }));\n  });\n  it(\"should call Sortable.create with the correct options\", async () => {\n    // Create a mock element\n    const mockElement = document.createElement(\"div\") as HTMLDivElement;\n\n    // Define custom options\n    const customOptions: SortableOptions = {\n      group: \"test-group\",\n      sort: false,\n    };\n\n    // Use the useSortable function\n    const { initializeSortable } = useSortable(mockElement, customOptions);\n\n    // Initialize sortable\n    await initializeSortable();\n\n    // Import sortablejs to access the mocked create function\n    const Sortable = await import(\"sortablejs/modular/sortable.complete.esm.js\");\n\n    // Verify that Sortable.create was called with the correct parameters\n    expect(Sortable.default.create).toHaveBeenCalledTimes(1);\n    expect(Sortable.default.create).toHaveBeenCalledWith(\n      mockElement,\n      expect.objectContaining({\n        animation: 300,\n        delay: 400,\n        delayOnTouchOnly: true,\n        ...customOptions,\n      })\n    );\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/composables/index.ts",
    "content": "export * from \"./use-is-mobile\";\nexport * from \"./use-layout-style\";\nexport * from \"./use-namespace\";\nexport * from \"./use-priority-value\";\nexport * from \"./use-scroll-lock\";\nexport * from \"./use-simple-locale\";\nexport * from \"./use-sortable\";\nexport { useEmitAsProps, useForwardExpose, useForwardProps, useForwardPropsEmits } from \"radix-vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/composables/use-is-mobile.ts",
    "content": "import { breakpointsTailwind, useBreakpoints } from \"@vueuse/core\";\n\nexport function useIsMobile() {\n  const breakpoints = useBreakpoints(breakpointsTailwind);\n  const isMobile = breakpoints.smaller(\"md\");\n  return { isMobile };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/composables/use-layout-style.ts",
    "content": "import type { CSSProperties } from \"vue\";\n\nimport type { VisibleDomRect } from \"/@/vben/shared/utils\";\n\nimport { computed, onMounted, onUnmounted, ref } from \"vue\";\n\nimport { CSS_VARIABLE_LAYOUT_CONTENT_HEIGHT, CSS_VARIABLE_LAYOUT_CONTENT_WIDTH, CSS_VARIABLE_LAYOUT_FOOTER_HEIGHT, CSS_VARIABLE_LAYOUT_HEADER_HEIGHT } from \"/@/vben/shared/constants\";\nimport { getElementVisibleRect } from \"/@/vben/shared/utils\";\n\nimport { useCssVar, useDebounceFn } from \"@vueuse/core\";\n\n/**\n * @zh_CN content style\n */\nexport function useLayoutContentStyle() {\n  let resizeObserver: null | ResizeObserver = null;\n  const contentElement = ref<HTMLDivElement | null>(null);\n  const visibleDomRect = ref<null | VisibleDomRect>(null);\n  const contentHeight = useCssVar(CSS_VARIABLE_LAYOUT_CONTENT_HEIGHT);\n  const contentWidth = useCssVar(CSS_VARIABLE_LAYOUT_CONTENT_WIDTH);\n\n  const overlayStyle = computed((): CSSProperties => {\n    const { height, left, top, width } = visibleDomRect.value ?? {};\n    return {\n      height: `${height}px`,\n      left: `${left}px`,\n      position: \"fixed\",\n      top: `${top}px`,\n      width: `${width}px`,\n      zIndex: 150,\n    };\n  });\n\n  const debouncedCalcHeight = useDebounceFn((_entries: ResizeObserverEntry[]) => {\n    visibleDomRect.value = getElementVisibleRect(contentElement.value);\n    contentHeight.value = `${visibleDomRect.value.height}px`;\n    contentWidth.value = `${visibleDomRect.value.width}px`;\n  }, 16);\n\n  onMounted(() => {\n    if (contentElement.value && !resizeObserver) {\n      resizeObserver = new ResizeObserver(debouncedCalcHeight);\n      resizeObserver.observe(contentElement.value);\n    }\n  });\n\n  onUnmounted(() => {\n    resizeObserver?.disconnect();\n    resizeObserver = null;\n  });\n\n  return { contentElement, overlayStyle, visibleDomRect };\n}\n\nexport function useLayoutHeaderStyle() {\n  const headerHeight = useCssVar(CSS_VARIABLE_LAYOUT_HEADER_HEIGHT);\n\n  return {\n    getLayoutHeaderHeight: () => {\n      return Number.parseInt(`${headerHeight.value}`, 10);\n    },\n    setLayoutHeaderHeight: (height: number) => {\n      headerHeight.value = `${height}px`;\n    },\n  };\n}\n\nexport function useLayoutFooterStyle() {\n  const footerHeight = useCssVar(CSS_VARIABLE_LAYOUT_FOOTER_HEIGHT);\n\n  return {\n    getLayoutFooterHeight: () => {\n      return Number.parseInt(`${footerHeight.value}`, 10);\n    },\n    setLayoutFooterHeight: (height: number) => {\n      footerHeight.value = `${height}px`;\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/composables/use-namespace.ts",
    "content": "import { DEFAULT_NAMESPACE } from \"../shared/constants\";\n\n/**\n * @see copy https://github.com/element-plus/element-plus/blob/dev/packages/hooks/use-namespace/index.ts\n */\n\nconst statePrefix = \"is-\";\n\nconst _bem = (namespace: string, block: string, blockSuffix: string, element: string, modifier: string) => {\n  let cls = `${namespace}-${block}`;\n  if (blockSuffix) {\n    cls += `-${blockSuffix}`;\n  }\n  if (element) {\n    cls += `__${element}`;\n  }\n  if (modifier) {\n    cls += `--${modifier}`;\n  }\n  return cls;\n};\n\nconst is: {\n  (name: string): string;\n  // eslint-disable-next-line @typescript-eslint/unified-signatures\n  (name: string, state: boolean | undefined): string;\n} = (name: string, ...args: [] | [boolean | undefined]) => {\n  const state = args.length > 0 ? args[0] : true;\n  return name && state ? `${statePrefix}${name}` : \"\";\n};\n\nconst useNamespace = (block: string) => {\n  const namespace = DEFAULT_NAMESPACE;\n  const b = (blockSuffix = \"\") => _bem(namespace, block, blockSuffix, \"\", \"\");\n  const e = (element?: string) => (element ? _bem(namespace, block, \"\", element, \"\") : \"\");\n  const m = (modifier?: string) => (modifier ? _bem(namespace, block, \"\", \"\", modifier) : \"\");\n  const be = (blockSuffix?: string, element?: string) => (blockSuffix && element ? _bem(namespace, block, blockSuffix, element, \"\") : \"\");\n  const em = (element?: string, modifier?: string) => (element && modifier ? _bem(namespace, block, \"\", element, modifier) : \"\");\n  const bm = (blockSuffix?: string, modifier?: string) => (blockSuffix && modifier ? _bem(namespace, block, blockSuffix, \"\", modifier) : \"\");\n  const bem = (blockSuffix?: string, element?: string, modifier?: string) => (blockSuffix && element && modifier ? _bem(namespace, block, blockSuffix, element, modifier) : \"\");\n\n  // for css var\n  // --el-xxx: value;\n  const cssVar = (object: Record<string, string>) => {\n    const styles: Record<string, string> = {};\n    for (const key in object) {\n      if (object[key]) {\n        styles[`--${namespace}-${key}`] = object[key];\n      }\n    }\n    return styles;\n  };\n  // with block\n  const cssVarBlock = (object: Record<string, string>) => {\n    const styles: Record<string, string> = {};\n    for (const key in object) {\n      if (object[key]) {\n        styles[`--${namespace}-${block}-${key}`] = object[key];\n      }\n    }\n    return styles;\n  };\n\n  const cssVarName = (name: string) => `--${namespace}-${name}`;\n  const cssVarBlockName = (name: string) => `--${namespace}-${block}-${name}`;\n\n  return {\n    b,\n    be,\n    bem,\n    bm,\n    // css\n    cssVar,\n    cssVarBlock,\n    cssVarBlockName,\n    cssVarName,\n    e,\n    em,\n    is,\n    m,\n    namespace,\n  };\n};\n\ntype UseNamespaceReturn = ReturnType<typeof useNamespace>;\n\nexport type { UseNamespaceReturn };\nexport { useNamespace };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/composables/use-priority-value.ts",
    "content": "import type { ComputedRef, Ref } from \"vue\";\n\nimport { computed, getCurrentInstance, unref, useAttrs, useSlots } from \"vue\";\n\nimport { getFirstNonNullOrUndefined, kebabToCamelCase } from \"../shared/utils\";\n\n/**\n * 依次从插槽、attrs、props、state 中获取值\n * @param key\n * @param props\n * @param state\n */\nexport function usePriorityValue<T extends Record<string, any>, S extends Record<string, any>, K extends keyof T = keyof T>(key: K, props: T, state: Readonly<Ref<NoInfer<S>>> | undefined) {\n  const instance = getCurrentInstance();\n  const slots = useSlots();\n  const attrs = useAttrs() as T;\n\n  const value = computed((): T[K] => {\n    // props不管有没有传，都会有默认值，会影响这里的顺序，\n    // 通过判断原始props是否有值来判断是否传入\n    const rawProps = (instance?.vnode?.props || {}) as T;\n\n    const standardRawProps = {} as T;\n\n    for (const [key, value] of Object.entries(rawProps)) {\n      standardRawProps[kebabToCamelCase(key) as K] = value;\n    }\n    const propsKey = standardRawProps?.[key] === undefined ? undefined : props[key];\n\n    // slot可以关闭\n    return getFirstNonNullOrUndefined(slots[key as string], attrs[key], propsKey, state?.value?.[key as keyof S]) as T[K];\n  });\n\n  return value;\n}\n\n/**\n * 批量获取state中的值（每个值都是ref）\n * @param props\n * @param state\n */\nexport function usePriorityValues<T extends Record<string, any>, S extends Ref<Record<string, any>> = Readonly<Ref<NoInfer<T>, NoInfer<T>>>>(props: T, state: S | undefined) {\n  const result: { [K in keyof T]: ComputedRef<T[K]> } = {} as never;\n\n  (Object.keys(props) as (keyof T)[]).forEach(key => {\n    result[key] = usePriorityValue(key as keyof typeof props, props, state);\n  });\n\n  return result;\n}\n\n/**\n * 批量获取state中的值（集中在一个computed，用于透传）\n * @param props\n * @param state\n */\nexport function useForwardPriorityValues<T extends Record<string, any>, S extends Ref<Record<string, any>> = Readonly<Ref<NoInfer<T>, NoInfer<T>>>>(props: T, state: S | undefined) {\n  const computedResult: { [K in keyof T]: ComputedRef<T[K]> } = {} as never;\n\n  (Object.keys(props) as (keyof T)[]).forEach(key => {\n    computedResult[key] = usePriorityValue(key as keyof typeof props, props, state);\n  });\n\n  return computed(() => {\n    const unwrapResult: Record<string, any> = {};\n    Object.keys(props).forEach(key => {\n      unwrapResult[key] = unref(computedResult[key]);\n    });\n    return unwrapResult as { [K in keyof T]: T[K] };\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/composables/use-scroll-lock.ts",
    "content": "import { getScrollbarWidth, needsScrollbar } from \"../shared/utils\";\n\nimport { useScrollLock as _useScrollLock, tryOnBeforeUnmount, tryOnMounted } from \"@vueuse/core\";\n\nexport const SCROLL_FIXED_CLASS = `_scroll__fixed_`;\n\nexport function useScrollLock() {\n  const isLocked = _useScrollLock(document.body);\n  const scrollbarWidth = getScrollbarWidth();\n\n  tryOnMounted(() => {\n    if (!needsScrollbar()) {\n      return;\n    }\n    document.body.style.paddingRight = `${scrollbarWidth}px`;\n\n    const layoutFixedNodes = document.querySelectorAll<HTMLElement>(`.${SCROLL_FIXED_CLASS}`);\n    const nodes = [...layoutFixedNodes];\n    if (nodes.length > 0) {\n      nodes.forEach(node => {\n        node.dataset.transition = node.style.transition;\n        node.style.transition = \"none\";\n        node.style.paddingRight = `${scrollbarWidth}px`;\n      });\n    }\n    isLocked.value = true;\n  });\n\n  tryOnBeforeUnmount(() => {\n    if (!needsScrollbar()) {\n      return;\n    }\n    isLocked.value = false;\n    const layoutFixedNodes = document.querySelectorAll<HTMLElement>(`.${SCROLL_FIXED_CLASS}`);\n    const nodes = [...layoutFixedNodes];\n    if (nodes.length > 0) {\n      nodes.forEach(node => {\n        node.style.paddingRight = \"\";\n        requestAnimationFrame(() => {\n          node.style.transition = node.dataset.transition || \"\";\n        });\n      });\n    }\n    document.body.style.paddingRight = \"\";\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/composables/use-simple-locale/README.md",
    "content": "# Simple i18n\n\nSimple i18 implementation\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/composables/use-simple-locale/index.ts",
    "content": "import type { Locale } from \"./messages\";\n\nimport { computed, ref } from \"vue\";\n\nimport { createSharedComposable } from \"@vueuse/core\";\n\nimport { getMessages } from \"./messages\";\n\nexport const useSimpleLocale = createSharedComposable(() => {\n  const currentLocale = ref<Locale>(\"zh-CN\");\n\n  const setSimpleLocale = (locale: Locale) => {\n    currentLocale.value = locale;\n  };\n\n  const $t = computed(() => {\n    const localeMessages = getMessages(currentLocale.value);\n    return (key: string) => {\n      return localeMessages[key] || key;\n    };\n  });\n  return {\n    $t,\n    currentLocale,\n    setSimpleLocale,\n  };\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/composables/use-simple-locale/messages.ts",
    "content": "export type Locale = \"en-US\" | \"zh-CN\";\n\nexport const messages: Record<Locale, Record<string, string>> = {\n  \"en-US\": {\n    cancel: \"Cancel\",\n    collapse: \"Collapse\",\n    confirm: \"Confirm\",\n    expand: \"Expand\",\n    reset: \"Reset\",\n    submit: \"Submit\",\n  },\n  \"zh-CN\": {\n    cancel: \"取消\",\n    collapse: \"收起\",\n    confirm: \"确认\",\n    expand: \"展开\",\n    reset: \"重置\",\n    submit: \"提交\",\n  },\n};\n\nexport const getMessages = (locale: Locale) => messages[locale];\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/composables/use-sortable.ts",
    "content": "import type { SortableOptions } from \"sortablejs\";\nimport type Sortable from \"sortablejs\";\n\nfunction useSortable<T extends HTMLElement>(sortableContainer: T, options: SortableOptions = {}) {\n  const initializeSortable = async () => {\n    const Sortable = await import(\n      // @ts-expect-error - This is a dynamic import\n      \"sortablejs/modular/sortable.complete.esm.js\"\n    );\n    const sortable = Sortable?.default?.create?.(sortableContainer, {\n      animation: 300,\n      delay: 400,\n      delayOnTouchOnly: true,\n      ...options,\n    });\n    return sortable as Sortable;\n  };\n\n  return {\n    initializeSortable,\n  };\n}\n\nexport { useSortable };\n\nexport type { Sortable };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/constants/core.ts",
    "content": "/**\n * @zh_CN 登录页面 url 地址\n */\nexport const LOGIN_PATH = \"/login\";\n\n/**\n * @zh_CN 默认首页地址\n */\nexport const DEFAULT_HOME_PATH = \"/\";\n\nexport interface LanguageOption {\n  label: string;\n  value: \"en-US\" | \"zh-CN\";\n}\n\n/**\n * Supported languages\n */\nexport const SUPPORT_LANGUAGES: LanguageOption[] = [\n  {\n    label: \"简体中文\",\n    value: \"zh-CN\",\n  },\n  {\n    label: \"English\",\n    value: \"en-US\",\n  },\n];\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/constants/globals.ts",
    "content": "/** layout content 组件的高度 */\nexport const CSS_VARIABLE_LAYOUT_CONTENT_HEIGHT = `--vben-content-height`;\n/** layout content 组件的宽度 */\nexport const CSS_VARIABLE_LAYOUT_CONTENT_WIDTH = `--vben-content-width`;\n/** layout header 组件的高度 */\nexport const CSS_VARIABLE_LAYOUT_HEADER_HEIGHT = `--vben-header-height`;\n/** layout footer 组件的高度 */\nexport const CSS_VARIABLE_LAYOUT_FOOTER_HEIGHT = `--vben-footer-height`;\n\n/** 内容区域的组件ID */\nexport const ELEMENT_ID_MAIN_CONTENT = `__vben_main_content`;\n\n/**\n * @zh_CN 默认命名空间\n */\nexport const DEFAULT_NAMESPACE = \"vben\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/constants/index.ts",
    "content": "export * from \"./globals\";\nexport * from \"./vben\";\nexport * from \"./core\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/constants/vben.ts",
    "content": "/**\n * @zh_CN GITHUB 仓库地址\n */\nexport const VBEN_GITHUB_URL = \"https://github.com/vbenjs/vue-vben-admin\";\n\n/**\n * @zh_CN 文档地址\n */\nexport const VBEN_DOC_URL = \"https://doc.vben.pro\";\n\n/**\n * @zh_CN Vben Logo\n */\nexport const VBEN_LOGO_URL = \"https://unpkg.com/@vbenjs/static-source@0.1.7/source/logo-v1.webp\";\n\n/**\n * @zh_CN Vben Admin 首页地址\n */\nexport const VBEN_PREVIEW_URL = \"https://www.vben.pro\";\n\nexport const VBEN_ELE_PREVIEW_URL = \"https://ele.vben.pro\";\n\nexport const VBEN_NAIVE_PREVIEW_URL = \"https://naive.vben.pro\";\n\nexport const VBEN_ANT_PREVIEW_URL = \"https://ant.vben.pro\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/design/css/global.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n  *,\n  ::after,\n  ::before {\n    @apply border-border;\n\n    box-sizing: border-box;\n    border-style: solid;\n    border-width: 0;\n  }\n\n  html {\n    @apply text-foreground bg-background font-sans text-[100%];\n\n    font-variation-settings: normal;\n    line-height: 1.5;\n    text-size-adjust: 100%;\n    font-synthesis-weight: none;\n    scroll-behavior: smooth;\n    text-rendering: optimizelegibility;\n    -webkit-tap-highlight-color: transparent;\n\n    /* -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale; */\n  }\n\n  #app,\n  body,\n  html {\n    @apply size-full;\n\n    /* scrollbar-gutter: stable; */\n  }\n\n  body {\n    min-height: 100vh;\n\n    /* pointer-events: auto !important; */\n\n    /* overflow: overlay; */\n\n    /* -webkit-font-smoothing: antialiased; */\n\n    /* -moz-osx-font-smoothing: grayscale; */\n  }\n\n  a,\n  a:active,\n  a:hover,\n  a:link,\n  a:visited {\n    @apply no-underline;\n  }\n\n  ::view-transition-new(root),\n  ::view-transition-old(root) {\n    @apply animate-none mix-blend-normal;\n  }\n\n  ::view-transition-old(root) {\n    @apply z-[1];\n  }\n\n  ::view-transition-new(root) {\n    @apply z-[2147483646];\n  }\n\n  html.dark::view-transition-old(root) {\n    @apply z-[2147483646];\n  }\n\n  html.dark::view-transition-new(root) {\n    @apply z-[1];\n  }\n\n  input::placeholder,\n  textarea::placeholder {\n    @apply opacity-100;\n  }\n\n  /* input:-webkit-autofill {\n    @apply border-none;\n\n    box-shadow: 0 0 0 1000px transparent inset;\n  } */\n\n  input[type=\"number\"]::-webkit-inner-spin-button,\n  input[type=\"number\"]::-webkit-outer-spin-button {\n    @apply m-0 appearance-none;\n  }\n\n  /* 只有非mac下才进行调整，mac下使用默认滚动条 */\n  html:not([data-platform=\"macOs\"]) {\n    ::-webkit-scrollbar {\n      @apply h-[10px] w-[10px];\n    }\n\n    ::-webkit-scrollbar-thumb {\n      @apply bg-border rounded-sm border-none;\n    }\n\n    ::-webkit-scrollbar-track {\n      @apply rounded-sm border-none bg-transparent shadow-none;\n    }\n\n    ::-webkit-scrollbar-button {\n      @apply hidden;\n    }\n  }\n}\n\n@layer components {\n  .flex-center {\n    @apply flex items-center justify-center;\n  }\n\n  .flex-col-center {\n    @apply flex flex-col items-center justify-center;\n  }\n\n  .outline-box {\n    @apply outline-border relative cursor-pointer rounded-md p-1 outline outline-1;\n  }\n\n  .outline-box::after {\n    @apply absolute left-1/2 top-1/2 z-20 h-0 w-[1px] rounded-sm opacity-0 outline outline-2 outline-transparent transition-all duration-300 content-[\"\"];\n  }\n\n  .outline-box.outline-box-active {\n    @apply outline-primary outline outline-2;\n  }\n\n  .outline-box.outline-box-active::after {\n    display: none;\n  }\n\n  .outline-box:not(.outline-box-active):hover::after {\n    @apply outline-primary left-0 top-0 h-full w-full p-1 opacity-100;\n  }\n\n  .vben-link {\n    @apply text-primary hover:text-primary-hover active:text-primary-active cursor-pointer;\n  }\n\n  .card-box {\n    @apply bg-card text-card-foreground border-border rounded-xl border;\n  }\n}\n\nhtml.invert-mode {\n  @apply invert;\n}\n\nhtml.grayscale-mode {\n  @apply grayscale;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/design/css/nprogress.css",
    "content": "/* Make clicks pass-through */\n#nprogress {\n  @apply pointer-events-none;\n}\n\n#nprogress .bar {\n  @apply bg-primary fixed left-0 top-0 z-[1031] h-[2px] w-full;\n}\n\n/* Fancy blur effect */\n#nprogress .peg {\n  @apply absolute right-0 block h-full w-[100px];\n\n  box-shadow:\n    0 0 10px hsl(var(--primary)),\n    0 0 5px hsl(var(--primary));\n  opacity: 1;\n  transform: rotate(3deg) translate(0, -4px);\n}\n\n/* Remove these to get rid of the spinner */\n#nprogress .spinner {\n  @apply fixed right-4 top-4 z-[1031] block;\n}\n\n#nprogress .spinner-icon {\n  @apply border-t-primary border-l-primary size-4 rounded-full border-[2px] border-solid border-transparent;\n\n  animation: nprogress-spinner 400ms linear infinite;\n}\n\n.nprogress-custom-parent {\n  @apply relative overflow-hidden;\n}\n\n.nprogress-custom-parent #nprogress .spinner,\n.nprogress-custom-parent #nprogress .bar {\n  @apply absolute;\n}\n\n@keyframes nprogress-spinner {\n  0% {\n    transform: rotate(0deg);\n  }\n\n  100% {\n    transform: rotate(360deg);\n  }\n}\n\n@keyframes nprogress-spinner {\n  0% {\n    transform: rotate(0deg);\n  }\n\n  100% {\n    transform: rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/design/css/transition.css",
    "content": ".slide-up-enter-active,\n.slide-up-leave-active {\n  transition: 0.25s cubic-bezier(0.25, 0.8, 0.5, 1);\n}\n\n.slide-up-move {\n  transition: transform 0.3s;\n}\n\n.slide-up-enter-from,\n.slide-up-leave-to {\n  opacity: 0;\n  transform: translateY(-15px);\n}\n\n.slide-down-enter-active,\n.slide-down-leave-active {\n  transition: 0.25s cubic-bezier(0.25, 0.8, 0.5, 1);\n}\n\n.slide-down-move {\n  transition: transform 0.3s;\n}\n\n.slide-down-enter-from,\n.slide-down-leave-to {\n  opacity: 0;\n  transform: translateY(15px);\n}\n\n.slide-left-enter-active,\n.slide-left-leave-active {\n  transition: 0.25s cubic-bezier(0.25, 0.8, 0.5, 1);\n}\n\n.slide-left-move {\n  transition: transform 0.3s;\n}\n\n.slide-left-enter-from,\n.slide-left-leave-to {\n  opacity: 0;\n  transform: translate(-15px);\n}\n\n.slide-right-enter-active,\n.slide-right-leave-active {\n  transition: 0.25s cubic-bezier(0.25, 0.8, 0.5, 1);\n}\n\n.slide-right-move {\n  transition: transform 0.3s;\n}\n\n.slide-right-enter-from,\n.slide-right-leave-to {\n  opacity: 0;\n  transform: translate(15px);\n}\n\n.fade-transition-enter-active,\n.fade-transition-leave-active {\n  transition: opacity 0.2s ease-in-out;\n}\n\n.fade-transition-enter-from,\n.fade-transition-leave-to {\n  opacity: 0;\n}\n\n.fade-enter-active,\n.fade-leave-active {\n  transition: opacity 0.2s ease-in-out;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n  opacity: 0;\n}\n\n.fade-slide-leave-active,\n.fade-slide-enter-active {\n  transition: all 0.3s;\n}\n\n.fade-slide-enter-from {\n  opacity: 0;\n  transform: translate(-30px);\n}\n\n.fade-slide-leave-to {\n  opacity: 0;\n  transform: translate(30px);\n}\n\n.fade-down-enter-active,\n.fade-down-leave-active {\n  transition:\n    opacity 0.25s,\n    transform 0.3s;\n}\n\n.fade-down-enter-from {\n  opacity: 0;\n  transform: translateY(-10%);\n}\n\n.fade-down-leave-to {\n  opacity: 0;\n  transform: translateY(10%);\n}\n\n.fade-scale-leave-active,\n.fade-scale-enter-active {\n  transition: all 0.28s;\n}\n\n.fade-scale-enter-from {\n  opacity: 0;\n  transform: scale(1.2);\n}\n\n.fade-scale-leave-to {\n  opacity: 0;\n  transform: scale(0.8);\n}\n\n.fade-up-enter-active,\n.fade-up-leave-active {\n  transition:\n    opacity 0.2s,\n    transform 0.25s;\n}\n\n.fade-up-enter-from {\n  opacity: 0;\n  transform: translateY(10%);\n}\n\n.fade-up-leave-to {\n  opacity: 0;\n  transform: translateY(-10%);\n}\n\n@keyframes fade-slide {\n  0% {\n    opacity: 0;\n    transform: translate(-30px);\n  }\n\n  50% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    transform: translate(30px);\n  }\n}\n\n@keyframes fade {\n  0% {\n    opacity: 0;\n  }\n\n  50% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n  }\n}\n\n@keyframes fade-up {\n  0% {\n    opacity: 0;\n    transform: translateY(10%);\n  }\n\n  50% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    transform: translateY(-10%);\n  }\n}\n\n@keyframes fade-down {\n  0% {\n    opacity: 0;\n    transform: translateY(-10%);\n  }\n\n  50% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    transform: translateY(10%);\n  }\n}\n\n.fade-slow {\n  animation: fade 3s infinite;\n}\n\n.fade-slide-slow {\n  animation: fade-slide 3s infinite;\n}\n\n.fade-up-slow {\n  animation: fade-up 3s infinite;\n}\n\n.fade-down-slow {\n  animation: fade-down 3s infinite;\n}\n\n.collapse-transition {\n  transition:\n    0.2s height ease-in-out,\n    0.2s padding-top ease-in-out,\n    0.2s padding-bottom ease-in-out;\n}\n\n.collapse-transition-leave-active,\n.collapse-transition-enter-active {\n  transition:\n    0.2s max-height ease-in-out,\n    0.2s padding-top ease-in-out,\n    0.2s margin-top ease-in-out;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/design/css/ui.css",
    "content": ".side-content {\n  animation-duration: 0.2s;\n  animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.side-content[data-side=\"top\"] {\n  animation-name: slide-up;\n}\n\n.side-content[data-side=\"bottom\"] {\n  animation-name: slide-down;\n}\n\n.side-content[data-side=\"left\"] {\n  animation-name: slide-left;\n}\n\n.side-content[data-side=\"right\"] {\n  animation-name: slide-right;\n}\n\n.breadcrumb-transition-enter-active {\n  transition:\n    transform 0.4s cubic-bezier(0.76, 0, 0.24, 1),\n    opacity 0.4s cubic-bezier(0.76, 0, 0.24, 1);\n}\n\n.breadcrumb-transition-leave-active {\n  display: none;\n}\n\n.breadcrumb-transition-enter-from {\n  opacity: 0;\n  transform: translateX(30px) skewX(-30deg);\n}\n\n@keyframes slide-down {\n  from {\n    opacity: 0;\n    transform: translateY(-10px);\n  }\n\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n@keyframes slide-left {\n  from {\n    opacity: 0;\n    transform: translateX(-10px);\n  }\n\n  to {\n    opacity: 1;\n    transform: translateX(0);\n  }\n}\n\n@keyframes slide-right {\n  from {\n    opacity: 0;\n    transform: translateX(-10px);\n  }\n\n  to {\n    opacity: 1;\n    transform: translateX(0);\n  }\n}\n\n@keyframes slide-up {\n  from {\n    opacity: 0;\n    transform: translateY(10px);\n  }\n\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.z-popup {\n  z-index: var(--popup-z-index);\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/design/design-tokens/dark.css",
    "content": ".dark,\n.dark[data-theme=\"custom\"],\n.dark[data-theme=\"default\"] {\n  /* Default background color of <body />...etc */\n  --background: 222.34deg 10.43% 12.27%;\n\n  /* 主体区域背景色 */\n  --background-deep: 220deg 13.06% 9%;\n  --foreground: 0 0% 95%;\n\n  /* Background color for <Card /> */\n  --card: 222.34deg 10.43% 12.27%;\n\n  /* --card: 222.2 84% 4.9%; */\n  --card-foreground: 210 40% 98%;\n\n  /* Background color for popovers such as <DropdownMenu />, <HoverCard />, <Popover /> */\n\n  /* --popover: 222.82deg 8.43% 12.27%; */\n\n  /* 弹出层的背景色与主题区域背景色太过接近  */\n  --popover: 0 0 14.2%;\n  --popover-foreground: 210 40% 98%;\n\n  /* Muted backgrounds such as <TabsList />, <Skeleton /> and <Switch /> */\n\n  /* --muted: 220deg 6.82% 17.25%; */\n\n  /* --muted-foreground: 215 20.2% 65.1%; */\n\n  --muted: 240 3.7% 15.9%;\n  --muted-foreground: 240 5% 64.9%;\n\n  /* 主题颜色 */\n\n  /* --primary: 245 82% 67%; */\n  --primary-foreground: 0 0% 98%;\n\n  /* Used for destructive actions such as <Button variant=\"destructive\"> */\n\n  --destructive: 359.21 68.47% 56.47%;\n  --destructive-foreground: 0 0% 98%;\n\n  /* Used for success actions such as <message> */\n\n  --info: 180, 1.54%, 12.75%;\n  --info-foreground: 220, 4%, 58%;\n\n  /* Used for success actions such as <message> */\n\n  --success: 144 57% 58%;\n  --success-foreground: 0 0% 98%;\n\n  /* Used for warning actions such as <message> */\n\n  --warning: 42 84% 61%;\n  --warning-foreground: 0 0% 98%;\n\n  /* 颜色次要 */\n  --secondary: 240 5% 17%;\n  --secondary-foreground: 0 0% 98%;\n\n  /* Used for accents such as hover effects on <DropdownMenuItem>, <SelectItem>...etc */\n  --accent: 216 5% 19%;\n  --accent-dark: 240 0% 22%;\n  --accent-darker: 240 0% 26%;\n  --accent-lighter: 216 5% 12%;\n  --accent-hover: 216 5% 24%;\n  --accent-foreground: 0 0% 98%;\n\n  /* Darker color */\n  --heavy: 216 5% 24%;\n  --heavy-foreground: var(--accent-foreground);\n\n  /* Default border color */\n  --border: 240 3.7% 22%;\n\n  /* Border color for inputs such as <Input />, <Select />, <Textarea /> */\n  --input: 0deg 0% 100% / 10%;\n  --input-placeholder: 218deg 11% 65%;\n  --input-background: 0deg 0% 100% / 5%;\n\n  /* Used for focus ring */\n  --ring: 222.2 84% 4.9%;\n\n  /* 基本圆角大小 */\n  --radius: 0.5rem;\n\n  /* ============= Custom ============= */\n\n  /* 遮罩颜色 */\n  --overlay: 0deg 0% 0% / 40%;\n  --overlay-content: 0deg 0% 0% / 40%;\n\n  /* 基本文字大小 */\n  --font-size-base: 16px;\n\n  /* =============component & UI============= */\n\n  --sidebar: 222.34deg 10.43% 12.27%;\n  --sidebar-deep: 220deg 13.06% 9%;\n  --menu: var(--sidebar);\n\n  /* header */\n  --header: 222.34deg 10.43% 12.27%;\n\n  color-scheme: dark;\n}\n\n.dark[data-theme=\"violet\"],\n[data-theme=\"violet\"] .dark {\n  --background: 224 71.4% 4.1%;\n  --background-deep: var(--background);\n  --foreground: 210 20% 98%;\n  --card: 224 71.4% 4.1%;\n  --card-foreground: 210 20% 98%;\n  --popover: 224 71.4% 4.1%;\n  --popover-foreground: 210 20% 98%;\n  --primary-foreground: 210 20% 98%;\n  --secondary: 215 27.9% 16.9%;\n  --secondary-foreground: 210 20% 98%;\n  --muted: 215 27.9% 16.9%;\n  --muted-foreground: 217.9 10.6% 64.9%;\n  --accent: 215 27.9% 16.9%;\n  --accent-foreground: 210 20% 98%;\n  --destructive: 359.21 68.47% 56.47%;\n  --destructive-foreground: 210 20% 98%;\n  --border: 215 27.9% 16.9%;\n  --input: 215 27.9% 16.9%;\n  --ring: 263.4 70% 50.4%;\n  --sidebar: 224 71.4% 4.1%;\n  --sidebar-deep: 224 71.4% 4.1%;\n  --header: 224 71.4% 4.1%;\n}\n\n.dark[data-theme=\"pink\"],\n[data-theme=\"pink\"] .dark {\n  --background: 20 14.3% 4.1%;\n  --background-deep: var(--background);\n  --foreground: 0 0% 95%;\n  --card: 0 0% 9%;\n  --card-foreground: 0 0% 95%;\n  --popover: 0 0% 9%;\n  --popover-foreground: 0 0% 95%;\n  --primary-foreground: 355.7 100% 97.3%;\n  --secondary: 240 3.7% 15.9%;\n  --secondary-foreground: 0 0% 98%;\n  --muted: 0 0% 15%;\n  --muted-foreground: 240 5% 64.9%;\n  --accent: 12 6.5% 15.1%;\n  --accent-foreground: 0 0% 98%;\n  --destructive: 359.21 68.47% 56.47%;\n  --destructive-foreground: 0 85.7% 97.3%;\n  --border: 240 3.7% 15.9%;\n  --input: 240 3.7% 15.9%;\n  --ring: 346.8 77.2% 49.8%;\n  --sidebar: 20 14.3% 4.1%;\n  --sidebar-deep: 20 14.3% 4.1%;\n  --header: 20 14.3% 4.1%;\n}\n\n.dark[data-theme=\"rose\"],\n[data-theme=\"rose\"] .dark {\n  --background: 0 0% 3.9%;\n  --background-deep: var(--background);\n  --foreground: 0 0% 98%;\n  --card: 0 0% 3.9%;\n  --card-foreground: 0 0% 98%;\n  --popover: 0 0% 3.9%;\n  --popover-foreground: 0 0% 98%;\n  --primary-foreground: 0 85.7% 97.3%;\n  --secondary: 0 0% 14.9%;\n  --secondary-foreground: 0 0% 98%;\n  --muted: 0 0% 14.9%;\n  --muted-foreground: 0 0% 63.9%;\n  --accent: 0 0% 14.9%;\n  --accent-foreground: 0 0% 98%;\n  --destructive: 359.21 68.47% 56.47%;\n  --destructive-foreground: 0 0% 98%;\n  --border: 0 0% 14.9%;\n  --input: 0 0% 14.9%;\n  --ring: 0 72.2% 50.6%;\n  --sidebar: 0 0% 3.9%;\n  --sidebar-deep: 0 0% 3.9%;\n  --header: 0 0% 3.9%;\n}\n\n.dark[data-theme=\"sky-blue\"],\n[data-theme=\"sky-blue\"] .dark {\n  --background: 222.2 84% 4.9%;\n  --background-deep: var(--background);\n  --foreground: 210 40% 98%;\n  --card: 222.2 84% 4.9%;\n  --card-foreground: 210 40% 98%;\n  --popover: 222.2 84% 4.9%;\n  --popover-foreground: 210 40% 98%;\n  --primary-foreground: 210 20% 98%;\n  --secondary: 217.2 32.6% 17.5%;\n  --secondary-foreground: 210 40% 98%;\n  --muted: 217.2 32.6% 17.5%;\n  --muted-foreground: 215 20.2% 65.1%;\n  --accent: 217.2 32.6% 17.5%;\n  --accent-foreground: 210 40% 98%;\n  --destructive: 359.21 68.47% 56.47%;\n  --destructive-foreground: 210 40% 98%;\n  --border: 217.2 32.6% 17.5%;\n  --input: 217.2 32.6% 17.5%;\n  --ring: 224.3 76.3% 48%;\n  --sidebar: 222.2 84% 4.9%;\n  --sidebar-deep: 222.2 84% 4.9%;\n  --header: 222.2 84% 4.9%;\n}\n\n.dark[data-theme=\"deep-blue\"],\n[data-theme=\"deep-blue\"] .dark {\n  --background: 222.2 84% 4.9%;\n  --background-deep: var(--background);\n  --foreground: 210 40% 98%;\n  --card: 222.2 84% 4.9%;\n  --card-foreground: 210 40% 98%;\n  --popover: 222.2 84% 4.9%;\n  --popover-foreground: 210 40% 98%;\n  --primary-foreground: 210 20% 98%;\n  --secondary: 217.2 32.6% 17.5%;\n  --secondary-foreground: 210 40% 98%;\n  --muted: 217.2 32.6% 17.5%;\n  --muted-foreground: 215 20.2% 65.1%;\n  --accent: 217.2 32.6% 17.5%;\n  --accent-foreground: 210 40% 98%;\n  --destructive: 359.21 68.47% 56.47%;\n  --destructive-foreground: 210 40% 98%;\n  --border: 217.2 32.6% 17.5%;\n  --input: 217.2 32.6% 17.5%;\n  --ring: 224.3 76.3% 48%;\n  --sidebar: 222.2 84% 4.9%;\n  --sidebar-deep: 222.2 84% 4.9%;\n  --header: 222.2 84% 4.9%;\n}\n\n.dark[data-theme=\"green\"],\n[data-theme=\"green\"] .dark {\n  --background: 20 14.3% 4.1%;\n  --background-deep: var(--background);\n  --foreground: 0 0% 95%;\n  --card: 24 9.8% 6%;\n  --card-foreground: 0 0% 95%;\n  --popover: 0 0% 9%;\n  --popover-foreground: 0 0% 95%;\n  --primary-foreground: 210 20% 98%;\n  --secondary: 240 3.7% 15.9%;\n  --secondary-foreground: 0 0% 98%;\n  --muted: 0 0% 15%;\n  --muted-foreground: 240 5% 64.9%;\n  --accent: 12 6.5% 15.1%;\n  --accent-foreground: 0 0% 98%;\n  --destructive: 359.21 68.47% 56.47%;\n  --destructive-foreground: 0 85.7% 97.3%;\n  --border: 240 3.7% 15.9%;\n  --input: 240 3.7% 15.9%;\n  --ring: 142.4 71.8% 29.2%;\n  --sidebar: 20 14.3% 4.1%;\n  --sidebar-deep: 20 14.3% 4.1%;\n  --header: 20 14.3% 4.1%;\n}\n\n.dark[data-theme=\"deep-green\"],\n[data-theme=\"deep-green\"] .dark {\n  --background: 20 14.3% 4.1%;\n  --background-deep: var(--background);\n  --foreground: 0 0% 95%;\n  --card: 24 9.8% 6%;\n  --card-foreground: 0 0% 95%;\n  --popover: 0 0% 9%;\n  --popover-foreground: 0 0% 95%;\n  --primary-foreground: 210 20% 98%;\n  --secondary: 240 3.7% 15.9%;\n  --secondary-foreground: 0 0% 98%;\n  --muted: 0 0% 15%;\n  --muted-foreground: 240 5% 64.9%;\n  --accent: 12 6.5% 15.1%;\n  --accent-foreground: 0 0% 98%;\n  --destructive: 359.21 68.47% 56.47%;\n  --destructive-foreground: 0 85.7% 97.3%;\n  --border: 240 3.7% 15.9%;\n  --input: 240 3.7% 15.9%;\n  --ring: 142.4 71.8% 29.2%;\n  --sidebar: 20 14.3% 4.1%;\n  --sidebar-deep: 20 14.3% 4.1%;\n  --header: 20 14.3% 4.1%;\n}\n\n.dark[data-theme=\"orange\"],\n[data-theme=\"orange\"] .dark {\n  --background: 20 14.3% 4.1%;\n  --background-deep: var(--background);\n  --foreground: 60 9.1% 97.8%;\n  --card: 20 14.3% 4.1%;\n  --card-foreground: 60 9.1% 97.8%;\n  --popover: 20 14.3% 4.1%;\n  --popover-foreground: 60 9.1% 97.8%;\n  --primary-foreground: 60 9.1% 97.8%;\n  --secondary: 12 6.5% 15.1%;\n  --secondary-foreground: 60 9.1% 97.8%;\n  --muted: 12 6.5% 15.1%;\n  --muted-foreground: 24 5.4% 63.9%;\n  --accent: 12 6.5% 15.1%;\n  --accent-foreground: 60 9.1% 97.8%;\n  --destructive: 0 72.2% 50.6%;\n  --destructive-foreground: 60 9.1% 97.8%;\n  --border: 12 6.5% 15.1%;\n  --input: 12 6.5% 15.1%;\n  --ring: 20.5 90.2% 48.2%;\n  --sidebar: 20 14.3% 4.1%;\n  --sidebar-deep: 20 14.3% 4.1%;\n  --header: 20 14.3% 4.1%;\n}\n\n.dark[data-theme=\"yellow\"],\n[data-theme=\"yellow\"] .dark {\n  --background: 20 14.3% 4.1%;\n  --background-deep: var(--background);\n  --foreground: 60 9.1% 97.8%;\n  --card: 20 14.3% 4.1%;\n  --card-foreground: 60 9.1% 97.8%;\n  --popover: 20 14.3% 4.1%;\n  --popover-foreground: 60 9.1% 97.8%;\n  --primary-foreground: 26 83.3% 14.1%;\n  --secondary: 12 6.5% 15.1%;\n  --secondary-foreground: 60 9.1% 97.8%;\n  --muted: 12 6.5% 15.1%;\n  --muted-foreground: 24 5.4% 63.9%;\n  --accent: 12 6.5% 15.1%;\n  --accent-foreground: 60 9.1% 97.8%;\n  --destructive: 359.21 68.47% 56.47%;\n  --destructive-foreground: 60 9.1% 97.8%;\n  --border: 12 6.5% 15.1%;\n  --input: 12 6.5% 15.1%;\n  --ring: 35.5 91.7% 32.9%;\n  --sidebar: 20 14.3% 4.1%;\n  --sidebar-deep: 20 14.3% 4.1%;\n  --header: 20 14.3% 4.1%;\n}\n\n.dark[data-theme=\"zinc\"],\n[data-theme=\"zinc\"] .dark {\n  --background: 240 10% 3.9%;\n  --background-deep: var(--background);\n  --foreground: 0 0% 98%;\n  --card: 240 10% 3.9%;\n  --card-foreground: 0 0% 98%;\n  --popover: 240 10% 3.9%;\n  --popover-foreground: 0 0% 98%;\n  --primary-foreground: 240 5.9% 10%;\n  --secondary: 240 3.7% 15.9%;\n  --secondary-foreground: 0 0% 98%;\n  --muted: 240 3.7% 15.9%;\n  --muted-foreground: 240 5% 64.9%;\n  --accent: 240 3.7% 15.9%;\n  --accent-foreground: 0 0% 98%;\n  --destructive: 359.21 68.47% 56.47%;\n  --destructive-foreground: 0 0% 98%;\n  --border: 240 3.7% 15.9%;\n  --input: 240 3.7% 15.9%;\n  --ring: 240 4.9% 83.9%;\n  --sidebar: 240 10% 3.9%;\n  --sidebar-deep: 240 10% 3.9%;\n  --header: 240 10% 3.9%;\n}\n\n.dark[data-theme=\"neutral\"],\n[data-theme=\"neutral\"] .dark {\n  --background: 0 0% 3.9%;\n  --background-deep: var(--background);\n  --foreground: 0 0% 98%;\n  --card: 0 0% 3.9%;\n  --card-foreground: 0 0% 98%;\n  --popover: 0 0% 3.9%;\n  --popover-foreground: 0 0% 98%;\n  --primary-foreground: 0 0% 9%;\n  --secondary: 0 0% 14.9%;\n  --secondary-foreground: 0 0% 98%;\n  --muted: 0 0% 14.9%;\n  --muted-foreground: 0 0% 63.9%;\n  --accent: 0 0% 14.9%;\n  --accent-foreground: 0 0% 98%;\n  --destructive: 359.21 68.47% 56.47%;\n  --destructive-foreground: 0 0% 98%;\n  --border: 0 0% 14.9%;\n  --input: 0 0% 14.9%;\n  --ring: 0 0% 83.1%;\n  --sidebar: 0 0% 3.9%;\n  --sidebar-deep: 0 0% 3.9%;\n  --header: 0 0% 3.9%;\n}\n\n.dark[data-theme=\"slate\"],\n[data-theme=\"slate\"] .dark {\n  --background: 222.2 84% 4.9%;\n  --background-deep: var(--background);\n  --foreground: 210 40% 98%;\n  --card: 222.2 84% 4.9%;\n  --card-foreground: 210 40% 98%;\n  --popover: 222.2 84% 4.9%;\n  --popover-foreground: 210 40% 98%;\n  --primary-foreground: 222.2 47.4% 11.2%;\n  --secondary: 217.2 32.6% 17.5%;\n  --secondary-foreground: 210 40% 98%;\n  --muted: 217.2 32.6% 17.5%;\n  --muted-foreground: 215 20.2% 65.1%;\n  --accent: 217.2 32.6% 17.5%;\n  --accent-foreground: 210 40% 98%;\n  --destructive: 359.21 68.47% 56.47%;\n  --destructive-foreground: 210 40% 98%;\n  --border: 217.2 32.6% 17.5%;\n  --input: 217.2 32.6% 17.5%;\n  --ring: 212.7 26.8% 83.9;\n  --sidebar: 222.2 84% 4.9%;\n  --sidebar-deep: 222.2 84% 4.9%;\n  --header: 222.2 84% 4.9%;\n}\n\n.dark[data-theme=\"gray\"],\n[data-theme=\"gray\"] .dark {\n  --background: 224 71.4% 4.1%;\n  --background-deep: var(--background);\n  --foreground: 210 20% 98%;\n  --card: 224 71.4% 4.1%;\n  --card-foreground: 210 20% 98%;\n  --popover: 224 71.4% 4.1%;\n  --popover-foreground: 210 20% 98%;\n  --primary-foreground: 220.9 39.3% 11%;\n  --secondary: 215 27.9% 16.9%;\n  --secondary-foreground: 210 20% 98%;\n  --muted: 215 27.9% 16.9%;\n  --muted-foreground: 217.9 10.6% 64.9%;\n  --accent: 215 27.9% 16.9%;\n  --accent-foreground: 210 20% 98%;\n  --destructive: 359.21 68.47% 56.47%;\n  --destructive-foreground: 210 20% 98%;\n  --border: 215 27.9% 16.9%;\n  --input: 215 27.9% 16.9%;\n  --ring: 216 12.2% 83.9%;\n  --sidebar: 224 71.4% 4.1%;\n  --sidebar-deep: 224 71.4% 4.1%;\n  --header: 224 71.4% 4.1%;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/design/design-tokens/default.css",
    "content": ":root {\n  /** 弹出层的基础层级 **/\n  --popup-z-index: 2000;\n  --font-family: -apple-system, blinkmacsystemfont, \"Segoe UI\", roboto, \"Helvetica Neue\", arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n\n  /* Default background color of <body />...etc */\n  --background: 0 0% 100%;\n\n  /* 主体区域背景色 */\n  --background-deep: 216 20.11% 95.47%;\n  --foreground: 210 6% 21%;\n\n  /* Background color for <Card /> */\n  --card: 0 0% 100%;\n  --card-foreground: 222.2 84% 4.9%;\n\n  /* Background color for popovers such as <DropdownMenu />, <HoverCard />, <Popover /> */\n  --popover: 0 0% 100%;\n  --popover-foreground: 222.2 84% 4.9%;\n\n  /* Muted backgrounds such as <TabsList />, <Skeleton /> and <Switch /> */\n\n  /* --muted: 210 40% 96.1%;\n  --muted-foreground: 215.4 16.3% 46.9%; */\n\n  --muted: 240 4.8% 95.9%;\n  --muted-foreground: 240 3.8% 46.1%;\n\n  /* 主题颜色 */\n\n  --primary: 212 100% 45%;\n  --primary-foreground: 0 0% 98%;\n\n  /* Used for destructive actions such as <Button variant=\"destructive\"> */\n\n  --destructive: 359.33 100% 65.1%;\n  --destructive-foreground: 0 0% 98%;\n\n  /* Used for success actions such as <message> */\n\n  --info: 240, 5%, 96%;\n  --info-foreground: 220, 4%, 58%;\n\n  /* Used for success actions such as <message> */\n\n  --success: 144 57% 58%;\n  --success-foreground: 0 0% 98%;\n\n  /* Used for warning actions such as <message> */\n\n  --warning: 42 84% 61%;\n  --warning-foreground: 0 0% 98%;\n\n  /* Secondary colors for <Button /> */\n\n  --secondary: 240 5% 96%;\n  --secondary-foreground: 240 6% 10%;\n\n  /* Used for accents such as hover effects on <DropdownMenuItem>, <SelectItem>...etc */\n  --accent: 240 5% 96%;\n  --accent-dark: 216 14% 93%;\n  --accent-darker: 216 11% 91%;\n  --accent-lighter: 240 0% 98%;\n  --accent-hover: 200deg 10% 90%;\n  --accent-foreground: 240 6% 10%;\n\n  /* Darker color */\n  --heavy: 192deg 9.43% 89.61%;\n  --heavy-foreground: var(--accent-foreground);\n\n  /* Default border color */\n  --border: 240 5.9% 90%;\n\n  /* Border color for inputs such as <Input />, <Select />, <Textarea /> */\n  --input: 240deg 5.88% 90%;\n  --input-placeholder: 217 10.6% 65%;\n  --input-background: 0 0% 100%;\n\n  /* Used for focus ring */\n  --ring: 222.2 84% 4.9%;\n\n  /* Border radius for card, input and buttons */\n  --radius: 0.5rem;\n\n  /* ============= custom ============= */\n\n  /* 遮罩颜色 */\n  --overlay: 0 0% 0% / 45%;\n  --overlay-content: 0 0% 95% / 45%;\n\n  /* 基本文字大小 */\n  --font-size-base: 16px;\n\n  /* =============component & UI============= */\n\n  /* menu */\n  --sidebar: 0 0% 100%;\n  --sidebar-deep: 0 0% 100%;\n  --menu: var(--sidebar);\n\n  /* header */\n  --header: 0 0% 100%;\n\n  accent-color: var(--primary);\n  color-scheme: light;\n}\n\n[data-theme=\"violet\"] {\n  /* --background: 0 0% 100%; */\n  --foreground: 224 71.4% 4.1%;\n  --card: 0 0% 100%;\n  --card-foreground: 224 71.4% 4.1%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 224 71.4% 4.1%;\n  --primary-foreground: 210 20% 98%;\n  --secondary: 220 14.3% 95.9%;\n  --secondary-foreground: 220.9 39.3% 11%;\n  --muted: 220 14.3% 95.9%;\n  --muted-foreground: 220 8.9% 46.1%;\n  --accent: 220 14.3% 95.9%;\n  --accent-foreground: 220.9 39.3% 11%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 210 20% 98%;\n  --border: 220 13% 91%;\n  --input: 220 13% 91%;\n  --ring: 262.1 83.3% 57.8%;\n}\n\n[data-theme=\"pink\"] {\n  /* --background: 0 0% 100%; */\n  --foreground: 240 10% 3.9%;\n  --card: 0 0% 100%;\n  --card-foreground: 240 10% 3.9%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 240 10% 3.9%;\n  --primary-foreground: 355.7 100% 97.3%;\n  --secondary: 240 4.8% 95.9%;\n  --secondary-foreground: 240 5.9% 10%;\n  --muted: 240 4.8% 95.9%;\n  --muted-foreground: 240 3.8% 46.1%;\n  --accent: 240 4.8% 95.9%;\n  --accent-foreground: 240 5.9% 10%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 0 0% 98%;\n  --border: 240 5.9% 90%;\n  --input: 240 5.9% 90%;\n  --ring: 346.8 77.2% 49.8%;\n}\n\n[data-theme=\"rose\"] {\n  /* --background: 0 0% 100%; */\n  --foreground: 240 10% 3.9%;\n  --card: 0 0% 100%;\n  --card-foreground: 240 10% 3.9%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 240 10% 3.9%;\n  --primary-foreground: 355.7 100% 97.3%;\n  --secondary: 240 4.8% 95.9%;\n  --secondary-foreground: 240 5.9% 10%;\n  --muted: 240 4.8% 95.9%;\n  --muted-foreground: 240 3.8% 46.1%;\n  --accent: 240 4.8% 95.9%;\n  --accent-foreground: 240 5.9% 10%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 0 0% 98%;\n  --border: 240 5.9% 90%;\n  --input: 240 5.9% 90%;\n  --ring: 346.8 77.2% 49.8%;\n}\n\n[data-theme=\"sky-blue\"] {\n  /* --background: 0 0% 100%; */\n  --foreground: 222.2 84% 4.9%;\n  --card: 0 0% 100%;\n  --card-foreground: 222.2 84% 4.9%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 222.2 84% 4.9%;\n  --primary-foreground: 210 40% 98%;\n  --secondary: 210 40% 96.1%;\n  --secondary-foreground: 222.2 47.4% 11.2%;\n  --muted: 210 40% 96.1%;\n  --muted-foreground: 215.4 16.3% 46.9%;\n  --accent: 210 40% 96.1%;\n  --accent-foreground: 222.2 47.4% 11.2%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 210 40% 98%;\n  --border: 214.3 31.8% 91.4%;\n  --input: 214.3 31.8% 91.4%;\n  --ring: 221.2 83.2% 53.3%;\n}\n\n[data-theme=\"deep-blue\"] {\n  /* --background: 0 0% 100%; */\n  --foreground: 222.2 84% 4.9%;\n  --card: 0 0% 100%;\n  --card-foreground: 222.2 84% 4.9%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 222.2 84% 4.9%;\n  --primary-foreground: 210 40% 98%;\n  --secondary: 210 40% 96.1%;\n  --secondary-foreground: 222.2 47.4% 11.2%;\n  --muted: 210 40% 96.1%;\n  --muted-foreground: 215.4 16.3% 46.9%;\n  --accent: 210 40% 96.1%;\n  --accent-foreground: 222.2 47.4% 11.2%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 210 40% 98%;\n  --border: 214.3 31.8% 91.4%;\n  --input: 214.3 31.8% 91.4%;\n  --ring: 221.2 83.2% 53.3%;\n}\n\n[data-theme=\"green\"] {\n  /* --background: 0 0% 100%; */\n  --foreground: 240 10% 3.9%;\n  --card: 0 0% 100%;\n  --card-foreground: 240 10% 3.9%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 240 10% 3.9%;\n  --primary-foreground: 355.7 100% 97.3%;\n  --secondary: 240 4.8% 95.9%;\n  --secondary-foreground: 240 5.9% 10%;\n  --muted: 240 4.8% 95.9%;\n  --muted-foreground: 240 3.8% 46.1%;\n  --accent: 240 4.8% 95.9%;\n  --accent-foreground: 240 5.9% 10%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 0 0% 98%;\n  --border: 240 5.9% 90%;\n  --input: 240 5.9% 90%;\n  --ring: 142.1 76.2% 36.3%;\n}\n\n[data-theme=\"deep-green\"] {\n  /* --background: 0 0% 100%; */\n  --foreground: 240 10% 3.9%;\n  --card: 0 0% 100%;\n  --card-foreground: 240 10% 3.9%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 240 10% 3.9%;\n  --primary-foreground: 355.7 100% 97.3%;\n  --secondary: 240 4.8% 95.9%;\n  --secondary-foreground: 240 5.9% 10%;\n  --muted: 240 4.8% 95.9%;\n  --muted-foreground: 240 3.8% 46.1%;\n  --accent: 240 4.8% 95.9%;\n  --accent-foreground: 240 5.9% 10%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 0 0% 98%;\n  --border: 240 5.9% 90%;\n  --input: 240 5.9% 90%;\n  --ring: 142.1 76.2% 36.3%;\n}\n\n[data-theme=\"orange\"] {\n  /* --background: 0 0% 100%; */\n  --foreground: 20 14.3% 4.1%;\n  --card: 0 0% 100%;\n  --card-foreground: 20 14.3% 4.1%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 20 14.3% 4.1%;\n  --primary-foreground: 60 9.1% 97.8%;\n  --secondary: 60 4.8% 95.9%;\n  --secondary-foreground: 24 9.8% 10%;\n  --muted: 60 4.8% 95.9%;\n  --muted-foreground: 25 5.3% 44.7%;\n  --accent: 60 4.8% 95.9%;\n  --accent-foreground: 24 9.8% 10%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 60 9.1% 97.8%;\n  --border: 20 5.9% 90%;\n  --input: 20 5.9% 90%;\n  --ring: 24.6 95% 53.1%;\n}\n\n[data-theme=\"yellow\"] {\n  /* --background: 0 0% 100%; */\n  --foreground: 20 14.3% 4.1%;\n  --card: 0 0% 100%;\n  --card-foreground: 20 14.3% 4.1%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 20 14.3% 4.1%;\n  --primary-foreground: 26 83.3% 14.1%;\n  --secondary: 60 4.8% 95.9%;\n  --secondary-foreground: 24 9.8% 10%;\n  --muted: 60 4.8% 95.9%;\n  --muted-foreground: 25 5.3% 44.7%;\n  --accent: 60 4.8% 95.9%;\n  --accent-foreground: 24 9.8% 10%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 60 9.1% 97.8%;\n  --border: 20 5.9% 90%;\n  --input: 20 5.9% 90%;\n  --ring: 20 14.3% 4.1%;\n}\n\n[data-theme=\"zinc\"] {\n  /* --background: 0 0% 100%; */\n  --foreground: 240 10% 3.9%;\n  --card: 0 0% 100%;\n  --card-foreground: 240 10% 3.9%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 240 10% 3.9%;\n  --primary-foreground: 0 0% 98%;\n  --secondary: 240 4.8% 95.9%;\n  --secondary-foreground: 240 5.9% 10%;\n  --muted: 240 4.8% 95.9%;\n  --muted-foreground: 240 3.8% 46.1%;\n  --accent: 240 4.8% 95.9%;\n  --accent-foreground: 240 5.9% 10%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 0 0% 98%;\n  --border: 240 5.9% 90%;\n  --input: 240 5.9% 90%;\n  --ring: 240 5.9% 10%;\n}\n\n[data-theme=\"neutral\"] {\n  /* --background: 0 0% 100%; */\n  --foreground: 0 0% 3.9%;\n  --card: 0 0% 100%;\n  --card-foreground: 0 0% 3.9%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 0 0% 3.9%;\n  --primary-foreground: 0 0% 98%;\n  --secondary: 0 0% 96.1%;\n  --secondary-foreground: 0 0% 9%;\n  --muted: 0 0% 96.1%;\n  --muted-foreground: 0 0% 45.1%;\n  --accent: 0 0% 96.1%;\n  --accent-foreground: 0 0% 9%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 0 0% 98%;\n  --border: 0 0% 89.8%;\n  --input: 0 0% 89.8%;\n  --ring: 0 0% 3.9%;\n}\n\n[data-theme=\"slate\"] {\n  /* --background: 0 0% 100%; */\n  --foreground: 222.2 84% 4.9%;\n  --card: 0 0% 100%;\n  --card-foreground: 222.2 84% 4.9%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 222.2 84% 4.9%;\n  --primary-foreground: 210 40% 98%;\n  --secondary: 210 40% 96.1%;\n  --secondary-foreground: 222.2 47.4% 11.2%;\n  --muted: 210 40% 96.1%;\n  --muted-foreground: 215.4 16.3% 46.9%;\n  --accent: 210 40% 96.1%;\n  --accent-foreground: 222.2 47.4% 11.2%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 210 40% 98%;\n  --border: 214.3 31.8% 91.4%;\n  --input: 214.3 31.8% 91.4%;\n  --ring: 222.2 84% 4.9%;\n}\n\n[data-theme=\"gray\"] {\n  /* --background: 0 0% 100%; */\n  --foreground: 224 71.4% 4.1%;\n  --card: 0 0% 100%;\n  --card-foreground: 224 71.4% 4.1%;\n  --popover: 0 0% 100%;\n  --popover-foreground: 224 71.4% 4.1%;\n  --primary-foreground: 210 20% 98%;\n  --secondary: 220 14.3% 95.9%;\n  --secondary-foreground: 220.9 39.3% 11%;\n  --muted: 220 14.3% 95.9%;\n  --muted-foreground: 220 8.9% 46.1%;\n  --accent: 220 14.3% 95.9%;\n  --accent-foreground: 220.9 39.3% 11%;\n  --destructive: 0 84.2% 60.2%;\n  --destructive-foreground: 210 20% 98%;\n  --border: 220 13% 91%;\n  --input: 220 13% 91%;\n  --ring: 224 71.4% 4.1%;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/design/design-tokens/index.ts",
    "content": "import \"./default.css\";\nimport \"./dark.css\";\n\nexport {};\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/design/index.ts",
    "content": "import \"./design-tokens\";\n\nimport \"./css/global.css\";\nimport \"./css/transition.css\";\nimport \"./css/nprogress.css\";\nimport \"./css/ui.css\";\n\nexport {};\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/design/scss-bem/bem.scss",
    "content": "@forward \"./constants\";\n\n@mixin b($block) {\n  $B: $namespace + \"-\" + $block !global;\n\n  .#{$B} {\n    @content;\n  }\n}\n\n@mixin e($name) {\n  @at-root {\n    &#{$element-separator}#{$name} {\n      @content;\n    }\n  }\n}\n\n@mixin m($name) {\n  @at-root {\n    &#{$modifier-separator}#{$name} {\n      @content;\n    }\n  }\n}\n\n// block__element.is-active {}\n@mixin is($state, $prefix: $state-prefix) {\n  @at-root {\n    &.#{$prefix}-#{$state} {\n      @content;\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/design/scss-bem/constants.scss",
    "content": "$namespace: \"vben\" !default;\n$common-separator: \"-\" !default;\n$element-separator: \"__\" !default;\n$modifier-separator: \"--\" !default;\n$state-prefix: \"is\" !default;\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/components/form-actions.vue",
    "content": "<script setup lang=\"ts\">\nimport { computed, toRaw, unref, watch } from \"vue\";\n\nimport { useSimpleLocale } from \"../../composables\";\nimport { VbenExpandableArrow } from \"../../shadcn-ui\";\nimport { cn, isFunction, triggerWindowResize } from \"../../shared/utils\";\n\nimport { COMPONENT_MAP } from \"../config\";\nimport { injectFormProps } from \"../use-form-context\";\n\nconst { $t } = useSimpleLocale();\n\nconst [rootProps, form] = injectFormProps();\n\nconst collapsed = defineModel({ default: false });\n\nconst resetButtonOptions = computed(() => {\n  return {\n    content: `${$t.value(\"reset\")}`,\n    show: true,\n    ...unref(rootProps).resetButtonOptions,\n  };\n});\n\nconst submitButtonOptions = computed(() => {\n  return {\n    content: `${$t.value(\"submit\")}`,\n    show: true,\n    ...unref(rootProps).submitButtonOptions,\n  };\n});\n\n// const isQueryForm = computed(() => {\n//   return !!unref(rootProps).showCollapseButton;\n// });\n\nconst queryFormStyle = computed(() => {\n  if (!unref(rootProps).actionWrapperClass) {\n    return {\n      \"grid-column\": `-2 / -1`,\n      marginLeft: \"auto\",\n    };\n  }\n\n  return {};\n});\n\nasync function handleSubmit(e: Event) {\n  e?.preventDefault();\n  e?.stopPropagation();\n  const { valid } = await form.validate();\n  if (!valid) {\n    return;\n  }\n\n  const values = toRaw(await unref(rootProps).formApi?.getValues());\n  await unref(rootProps).handleSubmit?.(values);\n}\n\nasync function handleReset(e: Event) {\n  e?.preventDefault();\n  e?.stopPropagation();\n  const props = unref(rootProps);\n\n  const values = toRaw(props.formApi?.getValues());\n\n  if (isFunction(props.handleReset)) {\n    await props.handleReset?.(values);\n  } else {\n    form.resetForm();\n  }\n}\n\nwatch(\n  () => collapsed.value,\n  () => {\n    const props = unref(rootProps);\n    if (props.collapseTriggerResize) {\n      triggerWindowResize();\n    }\n  }\n);\n\ndefineExpose({\n  handleReset,\n  handleSubmit,\n});\n</script>\n<template>\n  <div :class=\"cn('col-span-full w-full text-right', rootProps.compact ? 'pb-2' : 'pb-6', rootProps.actionWrapperClass)\" :style=\"queryFormStyle\">\n    <template v-if=\"rootProps.actionButtonsReverse\">\n      <!-- 提交按钮前 -->\n      <slot name=\"submit-before\"></slot>\n\n      <component :is=\"COMPONENT_MAP.PrimaryButton\" v-if=\"submitButtonOptions.show\" class=\"ml-3\" type=\"button\" v-bind=\"submitButtonOptions\" @click=\"handleSubmit\">\n        {{ submitButtonOptions.content }}\n      </component>\n    </template>\n\n    <!-- 重置按钮前 -->\n    <slot name=\"reset-before\"></slot>\n\n    <component :is=\"COMPONENT_MAP.DefaultButton\" v-if=\"resetButtonOptions.show\" class=\"ml-3\" type=\"button\" v-bind=\"resetButtonOptions\" @click=\"handleReset\">\n      {{ resetButtonOptions.content }}\n    </component>\n\n    <template v-if=\"!rootProps.actionButtonsReverse\">\n      <!-- 提交按钮前 -->\n      <slot name=\"submit-before\"></slot>\n\n      <component :is=\"COMPONENT_MAP.PrimaryButton\" v-if=\"submitButtonOptions.show\" class=\"ml-3\" type=\"button\" v-bind=\"submitButtonOptions\" @click=\"handleSubmit\">\n        {{ submitButtonOptions.content }}\n      </component>\n    </template>\n\n    <!-- 展开按钮前 -->\n    <slot name=\"expand-before\"></slot>\n\n    <VbenExpandableArrow v-if=\"rootProps.showCollapseButton\" v-model:model-value=\"collapsed\" class=\"ml-2\">\n      <span>{{ collapsed ? $t(\"expand\") : $t(\"collapse\") }}</span>\n    </VbenExpandableArrow>\n\n    <!-- 展开按钮后 -->\n    <slot name=\"expand-after\"></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/config.ts",
    "content": "import type { Component } from \"vue\";\n\nimport type { BaseFormComponentType, FormCommonConfig, VbenFormAdapterOptions } from \"./types\";\n\nimport { h } from \"vue\";\n\nimport { VbenButton, VbenCheckbox, Input as VbenInput, VbenInputPassword, VbenPinInput, VbenSelect } from \"../shadcn-ui\";\nimport { globalShareState } from \"../shared/global-state\";\n\nimport { defineRule } from \"vee-validate\";\n\nconst DEFAULT_MODEL_PROP_NAME = \"modelValue\";\n\nexport const DEFAULT_FORM_COMMON_CONFIG: FormCommonConfig = {};\n\nexport const COMPONENT_MAP: Record<BaseFormComponentType, Component> = {\n  DefaultButton: h(VbenButton, { size: \"sm\", variant: \"outline\" }),\n  PrimaryButton: h(VbenButton, { size: \"sm\", variant: \"default\" }),\n  VbenCheckbox,\n  VbenInput,\n  VbenInputPassword,\n  VbenPinInput,\n  VbenSelect,\n};\n\nexport const COMPONENT_BIND_EVENT_MAP: Partial<Record<BaseFormComponentType, string>> = {\n  VbenCheckbox: \"checked\",\n};\n\nexport function setupVbenForm<T extends BaseFormComponentType = BaseFormComponentType>(options: VbenFormAdapterOptions<T>) {\n  const { config, defineRules } = options;\n\n  const { disabledOnChangeListener = true, disabledOnInputListener = true, emptyStateValue = undefined } = (config || {}) as FormCommonConfig;\n\n  Object.assign(DEFAULT_FORM_COMMON_CONFIG, {\n    disabledOnChangeListener,\n    disabledOnInputListener,\n    emptyStateValue,\n  });\n\n  if (defineRules) {\n    for (const key of Object.keys(defineRules)) {\n      defineRule(key, defineRules[key as never]);\n    }\n  }\n\n  const baseModelPropName = config?.baseModelPropName ?? DEFAULT_MODEL_PROP_NAME;\n  const modelPropNameMap = config?.modelPropNameMap as Record<BaseFormComponentType, string> | undefined;\n\n  const components = globalShareState.getComponents();\n\n  for (const component of Object.keys(components)) {\n    const key = component as BaseFormComponentType;\n    COMPONENT_MAP[key] = components[component as never];\n\n    if (baseModelPropName !== DEFAULT_MODEL_PROP_NAME) {\n      COMPONENT_BIND_EVENT_MAP[key] = baseModelPropName;\n    }\n\n    // 覆盖特殊组件的modelPropName\n    if (modelPropNameMap && modelPropNameMap[key]) {\n      COMPONENT_BIND_EVENT_MAP[key] = modelPropNameMap[key];\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/form-api.ts",
    "content": "import type { FormState, GenericObject, ResetFormOpts, ValidationOptions } from \"vee-validate\";\n\nimport type { Recordable } from \"/@/vben/typings\";\n\nimport type { FormActions, FormSchema, VbenFormProps } from \"./types\";\n\nimport { toRaw } from \"vue\";\n\nimport { Store } from \"/@/vben/shared/store\";\nimport { bindMethods, createMerge, formatDate, isDate, isDayjsObject, isFunction, isObject, mergeWithArrayOverride, StateHandler } from \"/@/vben/shared/utils\";\n\nfunction getDefaultState(): VbenFormProps {\n  return {\n    actionWrapperClass: \"\",\n    collapsed: false,\n    collapsedRows: 1,\n    collapseTriggerResize: false,\n    commonConfig: {},\n    handleReset: undefined,\n    handleSubmit: undefined,\n    handleValuesChange: undefined,\n    layout: \"horizontal\",\n    resetButtonOptions: {},\n    schema: [],\n    showCollapseButton: false,\n    showDefaultActions: true,\n    submitButtonOptions: {},\n    submitOnChange: false,\n    submitOnEnter: false,\n    wrapperClass: \"grid-cols-1\",\n  };\n}\n\nexport class FormApi {\n  // private api: Pick<VbenFormProps, 'handleReset' | 'handleSubmit'>;\n  public form = {} as FormActions;\n  isMounted = false;\n\n  public state: null | VbenFormProps = null;\n  stateHandler: StateHandler;\n\n  public store: Store<VbenFormProps>;\n\n  // 最后一次点击提交时的表单值\n  private latestSubmissionValues: null | Recordable<any> = null;\n\n  private prevState: null | VbenFormProps = null;\n\n  constructor(options: VbenFormProps = {}) {\n    const { ...storeState } = options;\n\n    const defaultState = getDefaultState();\n\n    this.store = new Store<VbenFormProps>(\n      {\n        ...defaultState,\n        ...storeState,\n      },\n      {\n        onUpdate: () => {\n          this.prevState = this.state;\n          this.state = this.store.state;\n          this.updateState();\n        },\n      }\n    );\n\n    this.state = this.store.state;\n    this.stateHandler = new StateHandler();\n    bindMethods(this);\n  }\n\n  getLatestSubmissionValues() {\n    return this.latestSubmissionValues || {};\n  }\n\n  getState() {\n    return this.state;\n  }\n\n  async getValues<T = Recordable<any>>() {\n    const form = await this.getForm();\n    return (form.values ? this.handleRangeTimeValue(form.values) : {}) as T;\n  }\n\n  async isFieldValid(fieldName: string) {\n    const form = await this.getForm();\n    return form.isFieldValid(fieldName);\n  }\n\n  merge(formApi: FormApi) {\n    const chain = [this, formApi];\n    const proxy = new Proxy(formApi, {\n      get(target: any, prop: any) {\n        if (prop === \"merge\") {\n          return (nextFormApi: FormApi) => {\n            chain.push(nextFormApi);\n            return proxy;\n          };\n        }\n        if (prop === \"submitAllForm\") {\n          return async (needMerge: boolean = true) => {\n            try {\n              const results = await Promise.all(\n                chain.map(async api => {\n                  const validateResult = await api.validate();\n                  if (!validateResult.valid) {\n                    return;\n                  }\n                  const rawValues = toRaw((await api.getValues()) || {});\n                  return rawValues;\n                })\n              );\n              if (needMerge) {\n                const mergedResults = Object.assign({}, ...results);\n                return mergedResults;\n              }\n              return results;\n            } catch (error) {\n              console.error(\"Validation error:\", error);\n            }\n          };\n        }\n        return target[prop];\n      },\n    });\n\n    return proxy;\n  }\n\n  mount(formActions: FormActions) {\n    if (!this.isMounted) {\n      Object.assign(this.form, formActions);\n      this.stateHandler.setConditionTrue();\n      this.setLatestSubmissionValues({\n        ...toRaw(this.handleRangeTimeValue(this.form.values)),\n      });\n      this.isMounted = true;\n    }\n  }\n\n  /**\n   * 根据字段名移除表单项\n   * @param fields\n   */\n  async removeSchemaByFields(fields: string[]) {\n    const fieldSet = new Set(fields);\n    const schema = this.state?.schema ?? [];\n\n    const filterSchema = schema.filter(item => !fieldSet.has(item.fieldName));\n\n    this.setState({\n      schema: filterSchema,\n    });\n  }\n\n  /**\n   * 重置表单\n   */\n  async resetForm(state?: Partial<FormState<GenericObject>> | undefined, opts?: Partial<ResetFormOpts>) {\n    const form = await this.getForm();\n    return form.resetForm(state, opts);\n  }\n\n  async resetValidate() {\n    const form = await this.getForm();\n    const fields = Object.keys(form.errors.value);\n    fields.forEach(field => {\n      form.setFieldError(field, undefined);\n    });\n  }\n\n  async setFieldValue(field: string, value: any, shouldValidate?: boolean) {\n    const form = await this.getForm();\n    form.setFieldValue(field, value, shouldValidate);\n  }\n\n  setLatestSubmissionValues(values: null | Recordable<any>) {\n    this.latestSubmissionValues = { ...toRaw(values) };\n  }\n\n  setState(stateOrFn: ((prev: VbenFormProps) => Partial<VbenFormProps>) | Partial<VbenFormProps>) {\n    if (isFunction(stateOrFn)) {\n      this.store.setState(prev => {\n        return mergeWithArrayOverride(stateOrFn(prev), prev);\n      });\n    } else {\n      this.store.setState(prev => mergeWithArrayOverride(stateOrFn, prev));\n    }\n  }\n\n  /**\n   * 设置表单值\n   * @param fields record\n   * @param filterFields 过滤不在schema中定义的字段 默认为true\n   * @param shouldValidate\n   */\n  async setValues(fields: Record<string, any>, filterFields: boolean = true, shouldValidate: boolean = false) {\n    const form = await this.getForm();\n    if (!filterFields) {\n      form.setValues(fields, shouldValidate);\n      return;\n    }\n\n    /**\n     * 合并算法有待改进，目前的算法不支持object类型的值。\n     * antd的日期时间相关组件的值类型为dayjs对象\n     * element-plus的日期时间相关组件的值类型可能为Date对象\n     * 以上两种类型需要排除深度合并\n     */\n    const fieldMergeFn = createMerge((obj, key, value) => {\n      if (key in obj) {\n        obj[key] = !Array.isArray(obj[key]) && isObject(obj[key]) && !isDayjsObject(obj[key]) && !isDate(obj[key]) ? fieldMergeFn(obj[key], value) : value;\n      }\n      return true;\n    });\n    const filteredFields = fieldMergeFn(fields, form.values);\n    form.setValues(filteredFields, shouldValidate);\n  }\n\n  async submitForm(e?: Event) {\n    e?.preventDefault();\n    e?.stopPropagation();\n    const form = await this.getForm();\n    await form.submitForm();\n    const rawValues = toRaw(await this.getValues());\n    await this.state?.handleSubmit?.(rawValues);\n\n    return rawValues;\n  }\n\n  unmount() {\n    this.form?.resetForm?.();\n    // this.state = null;\n    this.latestSubmissionValues = null;\n    this.isMounted = false;\n    this.stateHandler.reset();\n  }\n\n  updateSchema(schema: Partial<FormSchema>[]) {\n    const updated: Partial<FormSchema>[] = [...schema];\n    const hasField = updated.every(item => Reflect.has(item, \"fieldName\") && item.fieldName);\n\n    if (!hasField) {\n      console.error(\"All items in the schema array must have a valid `fieldName` property to be updated\");\n      return;\n    }\n    const currentSchema = [...(this.state?.schema ?? [])];\n\n    const updatedMap: Record<string, any> = {};\n\n    updated.forEach(item => {\n      if (item.fieldName) {\n        updatedMap[item.fieldName] = item;\n      }\n    });\n\n    currentSchema.forEach((schema, index) => {\n      const updatedData = updatedMap[schema.fieldName];\n      if (updatedData) {\n        currentSchema[index] = mergeWithArrayOverride(updatedData, schema) as FormSchema;\n      }\n    });\n    this.setState({ schema: currentSchema });\n  }\n\n  async validate(opts?: Partial<ValidationOptions>) {\n    const form = await this.getForm();\n\n    const validateResult = await form.validate(opts);\n\n    if (Object.keys(validateResult?.errors ?? {}).length > 0) {\n      console.error(\"validate error\", validateResult?.errors);\n    }\n    return validateResult;\n  }\n\n  async validateAndSubmitForm() {\n    const form = await this.getForm();\n    const { valid } = await form.validate();\n    if (!valid) {\n      return;\n    }\n    return await this.submitForm();\n  }\n\n  async validateField(fieldName: string, opts?: Partial<ValidationOptions>) {\n    const form = await this.getForm();\n    const validateResult = await form.validateField(fieldName, opts);\n\n    if (Object.keys(validateResult?.errors ?? {}).length > 0) {\n      console.error(\"validate error\", validateResult?.errors);\n    }\n    return validateResult;\n  }\n\n  private async getForm() {\n    if (!this.isMounted) {\n      // 等待form挂载\n      await this.stateHandler.waitForCondition();\n    }\n    if (!this.form?.meta) {\n      throw new Error(\"<VbenForm /> is not mounted\");\n    }\n    return this.form;\n  }\n\n  private handleRangeTimeValue = (originValues: Record<string, any>) => {\n    const values = { ...originValues };\n    const fieldMappingTime = this.state?.fieldMappingTime;\n\n    if (!fieldMappingTime || !Array.isArray(fieldMappingTime)) {\n      return values;\n    }\n\n    fieldMappingTime.forEach(([field, [startTimeKey, endTimeKey], format = \"YYYY-MM-DD\"]) => {\n      if (startTimeKey && endTimeKey && values[field] === null) {\n        Reflect.deleteProperty(values, startTimeKey);\n        Reflect.deleteProperty(values, endTimeKey);\n        // delete values[startTimeKey];\n        // delete values[endTimeKey];\n      }\n\n      if (!values[field]) {\n        Reflect.deleteProperty(values, field);\n        // delete values[field];\n        return;\n      }\n\n      const [startTime, endTime] = values[field];\n      if (format === null) {\n        values[startTimeKey] = startTime;\n        values[endTimeKey] = endTime;\n      } else if (isFunction(format)) {\n        values[startTimeKey] = format(startTime, startTimeKey);\n        values[endTimeKey] = format(endTime, endTimeKey);\n      } else {\n        const [startTimeFormat, endTimeFormat] = Array.isArray(format) ? format : [format, format];\n\n        values[startTimeKey] = startTime ? formatDate(startTime, startTimeFormat) : undefined;\n        values[endTimeKey] = endTime ? formatDate(endTime, endTimeFormat) : undefined;\n      }\n      // delete values[field];\n      Reflect.deleteProperty(values, field);\n    });\n    return values;\n  };\n\n  private updateState() {\n    const currentSchema = this.state?.schema ?? [];\n    const prevSchema = this.prevState?.schema ?? [];\n    // 进行了删除schema操作\n    if (currentSchema.length < prevSchema.length) {\n      const currentFields = new Set(currentSchema.map(item => item.fieldName));\n      const deletedSchema = prevSchema.filter(item => !currentFields.has(item.fieldName));\n      for (const schema of deletedSchema) {\n        this.form?.setFieldValue?.(schema.fieldName, undefined);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/form-render/context.ts",
    "content": "import type { FormRenderProps } from \"../types\";\n\nimport { computed } from \"vue\";\n\nimport { createContext } from \"/@/vben/shadcn-ui\";\n\nexport const [injectRenderFormProps, provideFormRenderProps] = createContext<FormRenderProps>(\"FormRenderProps\");\n\nexport const useFormContext = () => {\n  const formRenderProps = injectRenderFormProps();\n\n  const isVertical = computed(() => formRenderProps.layout === \"vertical\");\n\n  const componentMap = computed(() => formRenderProps.componentMap);\n  const componentBindEventMap = computed(() => formRenderProps.componentBindEventMap);\n  return {\n    componentBindEventMap,\n    componentMap,\n    isVertical,\n  };\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/form-render/dependencies.ts",
    "content": "import type { FormItemDependencies, FormSchemaRuleType, MaybeComponentProps } from \"../types\";\n\nimport { computed, ref, watch } from \"vue\";\n\nimport { isBoolean, isFunction } from \"/@/vben/shared/utils\";\n\nimport { useFormValues } from \"vee-validate\";\n\nimport { injectRenderFormProps } from \"./context\";\n\nexport default function useDependencies(getDependencies: () => FormItemDependencies | undefined) {\n  const values = useFormValues();\n\n  const formRenderProps = injectRenderFormProps();\n\n  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n  const formApi = formRenderProps.form!;\n\n  if (!values) {\n    throw new Error(\"useDependencies should be used within <VbenForm>\");\n  }\n\n  const isIf = ref(true);\n  const isDisabled = ref(false);\n  const isShow = ref(true);\n  const isRequired = ref(false);\n  const dynamicComponentProps = ref<MaybeComponentProps>({});\n  const dynamicRules = ref<FormSchemaRuleType>();\n\n  const triggerFieldValues = computed(() => {\n    // 该字段可能会被多个字段触发\n    const triggerFields = getDependencies()?.triggerFields ?? [];\n    return triggerFields.map(dep => {\n      return values.value[dep];\n    });\n  });\n\n  const resetConditionState = () => {\n    isDisabled.value = false;\n    isIf.value = true;\n    isShow.value = true;\n    isRequired.value = false;\n    dynamicRules.value = undefined;\n    dynamicComponentProps.value = {};\n  };\n\n  watch(\n    [triggerFieldValues, getDependencies],\n    async ([_values, dependencies]) => {\n      if (!dependencies || !dependencies?.triggerFields?.length) {\n        return;\n      }\n      resetConditionState();\n      const { componentProps, disabled, if: whenIf, required, rules, show, trigger } = dependencies;\n\n      // 1. 优先判断if，如果if为false，则不渲染dom，后续判断也不再执行\n      const formValues = values.value;\n\n      if (isFunction(whenIf)) {\n        isIf.value = !!(await whenIf(formValues, formApi));\n        // 不渲染\n        if (!isIf.value) return;\n      } else if (isBoolean(whenIf)) {\n        isIf.value = whenIf;\n        if (!isIf.value) return;\n      }\n\n      // 2. 判断show，如果show为false，则隐藏\n      if (isFunction(show)) {\n        isShow.value = !!(await show(formValues, formApi));\n        if (!isShow.value) return;\n      } else if (isBoolean(show)) {\n        isShow.value = show;\n        if (!isShow.value) return;\n      }\n\n      if (isFunction(componentProps)) {\n        dynamicComponentProps.value = await componentProps(formValues, formApi);\n      }\n\n      if (isFunction(rules)) {\n        dynamicRules.value = await rules(formValues, formApi);\n      }\n\n      if (isFunction(disabled)) {\n        isDisabled.value = !!(await disabled(formValues, formApi));\n      } else if (isBoolean(disabled)) {\n        isDisabled.value = disabled;\n      }\n\n      if (isFunction(required)) {\n        isRequired.value = !!(await required(formValues, formApi));\n      }\n\n      if (isFunction(trigger)) {\n        await trigger(formValues, formApi);\n      }\n    },\n    { deep: true, immediate: true }\n  );\n\n  return {\n    dynamicComponentProps,\n    dynamicRules,\n    isDisabled,\n    isIf,\n    isRequired,\n    isShow,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/form-render/expandable.ts",
    "content": "import type { FormRenderProps } from \"../types\";\n\nimport { computed, nextTick, onMounted, ref, useTemplateRef, watch } from \"vue\";\n\nimport { breakpointsTailwind, useBreakpoints } from \"@vueuse/core\";\n\n/**\n * 动态计算行数\n */\nexport function useExpandable(props: FormRenderProps) {\n  const wrapperRef = useTemplateRef<HTMLElement>(\"wrapperRef\");\n  const rowMapping = ref<Record<number, number>>({});\n  // 是否已经计算过一次\n  const isCalculated = ref(false);\n\n  const breakpoints: any = useBreakpoints(breakpointsTailwind);\n\n  const keepFormItemIndex = computed(() => {\n    const rows = props.collapsedRows ?? 1;\n    const mapping = rowMapping.value;\n    let maxItem = 0;\n    for (let index = 1; index <= rows; index++) {\n      maxItem += mapping?.[index] ?? 0;\n    }\n    // 保持一行\n    return maxItem - 1 || 1;\n  });\n\n  watch([() => props.showCollapseButton, () => breakpoints.active().value, () => props.schema?.length], async ([val]) => {\n    if (val) {\n      await nextTick();\n      rowMapping.value = {};\n      isCalculated.value = false;\n      await calculateRowMapping();\n    }\n  });\n\n  async function calculateRowMapping() {\n    if (!props.showCollapseButton) {\n      return;\n    }\n\n    await nextTick();\n    if (!wrapperRef.value) {\n      return;\n    }\n    // 小屏幕不计算\n    // if (breakpoints.smaller('sm').value) {\n    //   // 保持一行\n    //   rowMapping.value = { 1: 2 };\n    //   return;\n    // }\n\n    const formItems = [...wrapperRef.value.children];\n\n    const container = wrapperRef.value;\n    const containerStyles = window.getComputedStyle(container);\n    const rowHeights = containerStyles.getPropertyValue(\"grid-template-rows\").split(\" \");\n\n    const containerRect = container?.getBoundingClientRect();\n\n    formItems.forEach(el => {\n      const itemRect = el.getBoundingClientRect();\n\n      // 计算元素在第几行\n      const itemTop = itemRect.top - containerRect.top;\n      let rowStart = 0;\n      let cumulativeHeight = 0;\n\n      for (const [i, rowHeight] of rowHeights.entries()) {\n        cumulativeHeight += Number.parseFloat(rowHeight);\n        if (itemTop < cumulativeHeight) {\n          rowStart = i + 1;\n          break;\n        }\n      }\n      if (rowStart > (props?.collapsedRows ?? 1)) {\n        return;\n      }\n      rowMapping.value[rowStart] = (rowMapping.value[rowStart] ?? 0) + 1;\n      isCalculated.value = true;\n    });\n  }\n\n  onMounted(() => {\n    calculateRowMapping();\n  });\n\n  return { isCalculated, keepFormItemIndex, wrapperRef };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/form-render/form-field.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ZodType } from \"zod\";\n\nimport type { FormSchema, MaybeComponentProps } from \"../types\";\n\nimport { computed, nextTick, useTemplateRef, watch } from \"vue\";\n\nimport { FormControl, FormDescription, FormField, FormItem, FormMessage, VbenRenderContent } from \"/@/vben/shadcn-ui\";\nimport { cn, isFunction, isObject, isString } from \"/@/vben/shared/utils\";\n\nimport { toTypedSchema } from \"@vee-validate/zod\";\nimport { useFieldError, useFormValues } from \"vee-validate\";\n\nimport { injectRenderFormProps, useFormContext } from \"./context\";\nimport useDependencies from \"./dependencies\";\nimport FormLabel from \"./form-label.vue\";\nimport { isEventObjectLike } from \"./helper\";\n\ninterface Props extends FormSchema {}\n\nconst {\n  colon,\n  commonComponentProps,\n  component,\n  componentProps,\n  dependencies,\n  description,\n  disabled,\n  disabledOnChangeListener,\n  disabledOnInputListener,\n  emptyStateValue,\n  fieldName,\n  formFieldProps,\n  label,\n  labelClass,\n  labelWidth,\n  modelPropName,\n  renderComponentContent,\n  rules,\n} = defineProps<\n  Props & {\n    commonComponentProps: MaybeComponentProps;\n  }\n>();\n\nconst { componentBindEventMap, componentMap, isVertical } = useFormContext();\nconst formRenderProps = injectRenderFormProps();\nconst values = useFormValues();\nconst errors = useFieldError(fieldName);\nconst fieldComponentRef = useTemplateRef<HTMLInputElement>(\"fieldComponentRef\");\nconst formApi = formRenderProps.form;\nconst compact = formRenderProps.compact;\nconst isInValid = computed(() => errors.value?.length > 0);\n\nconst FieldComponent = computed(() => {\n  const finalComponent = isString(component) ? componentMap.value[component] : component;\n  if (!finalComponent) {\n    // 组件未注册\n    console.warn(`Component ${component} is not registered`);\n  }\n  return finalComponent;\n});\n\nconst { dynamicComponentProps, dynamicRules, isDisabled, isIf, isRequired, isShow } = useDependencies(() => dependencies);\n\nconst labelStyle = computed(() => {\n  return labelClass?.includes(\"w-\") || isVertical.value\n    ? {}\n    : {\n        width: `${labelWidth}px`,\n      };\n});\n\nconst currentRules = computed(() => {\n  return dynamicRules.value || rules;\n});\n\nconst visible = computed(() => {\n  return isIf.value && isShow.value;\n});\n\nconst shouldRequired = computed(() => {\n  if (!visible.value) {\n    return false;\n  }\n\n  if (!currentRules.value) {\n    return isRequired.value;\n  }\n\n  if (isRequired.value) {\n    return true;\n  }\n\n  if (isString(currentRules.value)) {\n    return [\"required\", \"selectRequired\"].includes(currentRules.value);\n  }\n\n  let isOptional = currentRules?.value?.isOptional?.();\n\n  // 如果有设置默认值，则不是必填，需要特殊处理\n  const typeName = currentRules?.value?._def?.typeName;\n  if (typeName === \"ZodDefault\") {\n    const innerType = currentRules?.value?._def.innerType;\n    if (innerType) {\n      isOptional = innerType.isOptional?.();\n    }\n  }\n\n  return !isOptional;\n});\n\nconst fieldRules = computed(() => {\n  if (!visible.value) {\n    return null;\n  }\n\n  let rules = currentRules.value;\n  if (!rules) {\n    return isRequired.value ? \"required\" : null;\n  }\n\n  if (isString(rules)) {\n    return rules;\n  }\n\n  const isOptional = !shouldRequired.value;\n  if (!isOptional) {\n    const unwrappedRules = (rules as any)?.unwrap?.();\n    if (unwrappedRules) {\n      rules = unwrappedRules;\n    }\n  }\n  return toTypedSchema(rules as ZodType);\n});\n\nconst computedProps = computed(() => {\n  const finalComponentProps = isFunction(componentProps) ? componentProps(values.value, formApi!) : componentProps;\n\n  return {\n    ...commonComponentProps,\n    ...finalComponentProps,\n    ...dynamicComponentProps.value,\n  };\n});\n\nwatch(\n  () => computedProps.value?.autofocus,\n  value => {\n    if (value === true) {\n      nextTick(() => {\n        autofocus();\n      });\n    }\n  },\n  { immediate: true }\n);\n\nconst shouldDisabled = computed(() => {\n  return isDisabled.value || disabled || computedProps.value?.disabled;\n});\n\nconst customContentRender = computed(() => {\n  if (!isFunction(renderComponentContent)) {\n    return {};\n  }\n  return renderComponentContent(values.value, formApi!);\n});\n\nconst renderContentKey = computed(() => {\n  return Object.keys(customContentRender.value);\n});\n\nconst fieldProps = computed(() => {\n  const rules = fieldRules.value;\n  return {\n    keepValue: true,\n    label: isString(label) ? label : \"\",\n    ...(rules ? { rules } : {}),\n    ...(formFieldProps as Record<string, any>),\n  };\n});\n\nfunction fieldBindEvent(slotProps: Record<string, any>) {\n  const modelValue = slotProps.componentField.modelValue;\n  const handler = slotProps.componentField[\"onUpdate:modelValue\"];\n\n  const bindEventField = modelPropName || (isString(component) ? componentBindEventMap.value?.[component] : null);\n\n  let value = modelValue;\n  // antd design 的一些组件会传递一个 event 对象\n  if (modelValue && isObject(modelValue) && bindEventField) {\n    value = isEventObjectLike(modelValue) ? modelValue?.target?.[bindEventField] : (modelValue?.[bindEventField] ?? modelValue);\n  }\n\n  if (bindEventField) {\n    return {\n      [`onUpdate:${bindEventField}`]: handler,\n      [bindEventField]: value === undefined ? emptyStateValue : value,\n      onChange: disabledOnChangeListener\n        ? undefined\n        : (e: Record<string, any>) => {\n            const shouldUnwrap = isEventObjectLike(e);\n            const onChange = slotProps?.componentField?.onChange;\n            if (!shouldUnwrap) {\n              return onChange?.(e);\n            }\n\n            return onChange?.(e?.target?.[bindEventField] ?? e);\n          },\n      ...(disabledOnInputListener ? { onInput: undefined } : {}),\n    };\n  }\n  return {\n    ...(disabledOnInputListener ? { onInput: undefined } : {}),\n    ...(disabledOnChangeListener ? { onChange: undefined } : {}),\n  };\n}\n\nfunction createComponentProps(slotProps: Record<string, any>) {\n  const bindEvents = fieldBindEvent(slotProps);\n\n  const binds = {\n    ...slotProps.componentField,\n    ...computedProps.value,\n    ...bindEvents,\n    ...(Reflect.has(computedProps.value, \"onChange\") ? { onChange: computedProps.value.onChange } : {}),\n    ...(Reflect.has(computedProps.value, \"onInput\") ? { onInput: computedProps.value.onInput } : {}),\n  };\n\n  return binds;\n}\n\nfunction autofocus() {\n  if (\n    fieldComponentRef.value &&\n    isFunction(fieldComponentRef.value.focus) &&\n    // 检查当前是否有元素被聚焦\n    document.activeElement !== fieldComponentRef.value\n  ) {\n    fieldComponentRef.value?.focus?.();\n  }\n}\n</script>\n\n<template>\n  <FormField v-if=\"isIf\" v-slot=\"slotProps\" v-bind=\"fieldProps\" :name=\"fieldName\">\n    <FormItem\n      v-show=\"isShow\"\n      :class=\"{\n        'form-valid-error': isInValid,\n        'flex-col': isVertical,\n        'flex-row items-center': !isVertical,\n        'pb-6': !compact,\n        'pb-2': compact,\n      }\"\n      class=\"relative flex\"\n      v-bind=\"$attrs\"\n    >\n      <FormLabel\n        v-if=\"!hideLabel\"\n        :class=\"\n          cn(\n            'flex leading-6',\n            {\n              'mr-2 flex-shrink-0 justify-end': !isVertical,\n              'mb-1 flex-row': isVertical,\n            },\n            labelClass\n          )\n        \"\n        :help=\"help\"\n        :colon=\"colon\"\n        :label=\"label\"\n        :required=\"shouldRequired && !hideRequiredMark\"\n        :style=\"labelStyle\"\n      >\n        <template v-if=\"label\">\n          <VbenRenderContent :content=\"label\" />\n        </template>\n      </FormLabel>\n      <div class=\"w-full overflow-hidden\">\n        <div :class=\"cn('relative flex w-full items-center', wrapperClass)\">\n          <div class=\"flex-auto overflow-hidden p-[2px]\">\n            <FormControl :class=\"cn(controlClass)\">\n              <slot\n                v-bind=\"{\n                  ...slotProps,\n                  ...createComponentProps(slotProps),\n                  disabled: shouldDisabled,\n                  isInValid,\n                }\"\n              >\n                <component\n                  :is=\"FieldComponent\"\n                  ref=\"fieldComponentRef\"\n                  :class=\"{\n                    'border-destructive focus:border-destructive hover:border-destructive/80 focus:shadow-[0_0_0_2px_rgba(255,38,5,0.06)]': isInValid,\n                  }\"\n                  v-bind=\"createComponentProps(slotProps)\"\n                  :disabled=\"shouldDisabled\"\n                >\n                  <template v-for=\"name in renderContentKey\" :key=\"name\" #[name]=\"renderSlotProps\">\n                    <VbenRenderContent :content=\"customContentRender[name]\" v-bind=\"{ ...renderSlotProps, formContext: slotProps }\" />\n                  </template>\n                  <!-- <slot></slot> -->\n                </component>\n              </slot>\n            </FormControl>\n          </div>\n\n          <!-- 自定义后缀 -->\n          <div v-if=\"suffix\" class=\"ml-1\">\n            <VbenRenderContent :content=\"suffix\" />\n          </div>\n          <FormDescription v-if=\"description\" class=\"ml-1\">\n            <VbenRenderContent :content=\"description\" />\n          </FormDescription>\n        </div>\n\n        <Transition name=\"slide-up\">\n          <FormMessage class=\"absolute bottom-1\" />\n        </Transition>\n      </div>\n    </FormItem>\n  </FormField>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/form-render/form-label.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CustomRenderType } from \"../types\";\n\nimport { FormLabel, VbenHelpTooltip, VbenRenderContent } from \"/@/vben/shadcn-ui\";\nimport { cn } from \"/@/vben/shared/utils\";\n\ninterface Props {\n  class?: string;\n  colon?: boolean;\n  help?: CustomRenderType;\n  label?: CustomRenderType;\n  required?: boolean;\n}\n\nconst props = defineProps<Props>();\n</script>\n\n<template>\n  <FormLabel :class=\"cn('flex items-center', props.class)\">\n    <span v-if=\"required\" class=\"text-destructive mr-[2px]\">*</span>\n    <slot></slot>\n    <VbenHelpTooltip v-if=\"help\" trigger-class=\"size-3.5 ml-1\">\n      <VbenRenderContent :content=\"help\" />\n    </VbenHelpTooltip>\n    <span v-if=\"colon && label\" class=\"ml-[2px]\">:</span>\n  </FormLabel>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/form-render/form.vue",
    "content": "<script setup lang=\"ts\">\nimport type { GenericObject } from \"vee-validate\";\nimport type { ZodTypeAny } from \"zod\";\n\nimport type { FormCommonConfig, FormRenderProps, FormSchema, FormShape } from \"../types\";\n\nimport { computed } from \"vue\";\n\nimport { Form } from \"../../shadcn-ui\";\nimport { cn, isString, mergeWithArrayOverride } from \"../../shared/utils\";\n\nimport { provideFormRenderProps } from \"./context\";\nimport { useExpandable } from \"./expandable\";\nimport FormField from \"./form-field.vue\";\nimport { getBaseRules, getDefaultValueInZodStack } from \"./helper\";\n\ninterface Props extends FormRenderProps {}\n\nconst props = withDefaults(defineProps<Props & { globalCommonConfig?: FormCommonConfig }>(), {\n  collapsedRows: 1,\n  commonConfig: () => ({}),\n  globalCommonConfig: () => ({}),\n  showCollapseButton: false,\n  wrapperClass: \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3\",\n});\n\nconst emits = defineEmits<{\n  submit: [event: any];\n}>();\n\nprovideFormRenderProps(props);\n\nconst { isCalculated, keepFormItemIndex, wrapperRef } = useExpandable(props);\n\nconst shapes = computed(() => {\n  const resultShapes: FormShape[] = [];\n  props.schema?.forEach(schema => {\n    const { fieldName } = schema;\n    const rules = schema.rules as ZodTypeAny;\n\n    let typeName = \"\";\n    if (rules && !isString(rules)) {\n      typeName = rules._def.typeName;\n    }\n\n    const baseRules = getBaseRules(rules) as ZodTypeAny;\n\n    resultShapes.push({\n      default: getDefaultValueInZodStack(rules),\n      fieldName,\n      required: ![\"ZodNullable\", \"ZodOptional\"].includes(typeName),\n      rules: baseRules,\n    });\n  });\n  return resultShapes;\n});\n\nconst formComponent = computed(() => (props.form ? \"form\" : Form));\n\nconst formComponentProps = computed(() => {\n  return props.form\n    ? {\n        onSubmit: props.form.handleSubmit((val: any) => emits(\"submit\", val)),\n      }\n    : {\n        onSubmit: (val: GenericObject) => emits(\"submit\", val),\n      };\n});\n\nconst formCollapsed = computed(() => {\n  return props.collapsed && isCalculated.value;\n});\n\nconst computedSchema = computed(\n  (): (Omit<FormSchema, \"formFieldProps\"> & {\n    commonComponentProps: Record<string, any>;\n    formFieldProps: Record<string, any>;\n  })[] => {\n    const {\n      colon = false,\n      componentProps = {},\n      controlClass = \"\",\n      disabled,\n      disabledOnChangeListener = true,\n      disabledOnInputListener = true,\n      emptyStateValue = undefined,\n      formFieldProps = {},\n      formItemClass = \"\",\n      hideLabel = false,\n      hideRequiredMark = false,\n      labelClass = \"\",\n      labelWidth = 100,\n      modelPropName = \"\",\n      wrapperClass = \"\",\n    } = mergeWithArrayOverride(props.commonConfig, props.globalCommonConfig);\n    return (props.schema || []).map((schema, index) => {\n      const keepIndex = keepFormItemIndex.value;\n\n      const hidden =\n        // 折叠状态 & 显示折叠按钮 & 当前索引大于保留索引\n        props.showCollapseButton && !!formCollapsed.value && keepIndex ? keepIndex <= index : false;\n\n      return {\n        colon,\n        disabled,\n        disabledOnChangeListener,\n        disabledOnInputListener,\n        emptyStateValue,\n        hideLabel,\n        hideRequiredMark,\n        labelWidth,\n        modelPropName,\n        wrapperClass,\n        ...schema,\n        commonComponentProps: componentProps,\n        componentProps: schema.componentProps,\n        controlClass: cn(controlClass, schema.controlClass),\n        formFieldProps: {\n          ...formFieldProps,\n          ...schema.formFieldProps,\n        },\n        formItemClass: cn(\"flex-shrink-0\", { hidden }, formItemClass, schema.formItemClass),\n        labelClass: cn(labelClass, schema.labelClass),\n      };\n    });\n  }\n);\n</script>\n\n<template>\n  <component :is=\"formComponent\" v-bind=\"formComponentProps\">\n    <div ref=\"wrapperRef\" :class=\"wrapperClass\" class=\"grid\">\n      <template v-for=\"cSchema in computedSchema\" :key=\"cSchema.fieldName\">\n        <!-- <div v-if=\"$slots[cSchema.fieldName]\" :class=\"cSchema.formItemClass\">\n          <slot :definition=\"cSchema\" :name=\"cSchema.fieldName\"> </slot>\n        </div> -->\n        <FormField v-bind=\"cSchema\" :class=\"cSchema.formItemClass\" :rules=\"cSchema.rules\">\n          <template #default=\"slotProps\">\n            <slot v-bind=\"slotProps\" :name=\"cSchema.fieldName\"> </slot>\n          </template>\n        </FormField>\n      </template>\n      <slot :shapes=\"shapes\"></slot>\n    </div>\n  </component>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/form-render/helper.ts",
    "content": "import type { AnyZodObject, ZodDefault, ZodEffects, ZodNumber, ZodString, ZodTypeAny } from \"zod\";\n\nimport { isObject, isString } from \"/@/vben/shared/utils\";\n\n/**\n * Get the lowest level Zod type.\n * This will unpack optionals, refinements, etc.\n */\nexport function getBaseRules<ChildType extends AnyZodObject | ZodTypeAny = ZodTypeAny>(schema: ChildType | ZodEffects<ChildType>): ChildType | null {\n  if (!schema || isString(schema)) return null;\n  if (\"innerType\" in schema._def) return getBaseRules(schema._def.innerType as ChildType);\n\n  if (\"schema\" in schema._def) return getBaseRules(schema._def.schema as ChildType);\n\n  return schema as ChildType;\n}\n\n/**\n * Search for a \"ZodDefault\" in the Zod stack and return its value.\n */\nexport function getDefaultValueInZodStack(schema: ZodTypeAny): any {\n  if (!schema || isString(schema)) {\n    return;\n  }\n  const typedSchema = schema as unknown as ZodDefault<ZodNumber | ZodString>;\n\n  if (typedSchema._def.typeName === \"ZodDefault\") return typedSchema._def.defaultValue();\n\n  if (\"innerType\" in typedSchema._def) {\n    return getDefaultValueInZodStack(typedSchema._def.innerType as unknown as ZodTypeAny);\n  }\n  if (\"schema\" in typedSchema._def) {\n    return getDefaultValueInZodStack((typedSchema._def as any).schema as ZodTypeAny);\n  }\n\n  return undefined;\n}\n\nexport function isEventObjectLike(obj: any) {\n  if (!obj || !isObject(obj)) {\n    return false;\n  }\n  return Reflect.has(obj, \"target\") && Reflect.has(obj, \"stopPropagation\");\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/form-render/index.ts",
    "content": "export { default as FormField } from \"./form-field.vue\";\nexport { default as FormLabel } from \"./form-label.vue\";\nexport { default as Form } from \"./form.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/index.ts",
    "content": "export { setupVbenForm } from \"./config\";\n\nexport type { BaseFormComponentType, ExtendedFormApi, VbenFormProps, FormSchema as VbenFormSchema } from \"./types\";\n\nexport * from \"./use-vben-form\";\n// export { default as VbenForm } from './vben-form.vue';\nexport * as z from \"zod\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/types.ts",
    "content": "import type { FieldOptions, FormContext, GenericObject } from \"vee-validate\";\nimport type { ZodTypeAny } from \"zod\";\n\nimport type { Component, HtmlHTMLAttributes, Ref } from \"vue\";\n\nimport type { VbenButtonProps } from \"/@/vben/shadcn-ui\";\nimport type { ClassType, MaybeComputedRef } from \"/@/vben/typings\";\n\nimport type { FormApi } from \"./form-api\";\n\nexport type FormLayout = \"horizontal\" | \"vertical\";\n\nexport type BaseFormComponentType = \"DefaultButton\" | \"PrimaryButton\" | \"VbenCheckbox\" | \"VbenInput\" | \"VbenInputPassword\" | \"VbenPinInput\" | \"VbenSelect\" | (Record<never, never> & string);\n\ntype Breakpoints = \"2xl:\" | \"3xl:\" | \"\" | \"lg:\" | \"md:\" | \"sm:\" | \"xl:\";\n\ntype GridCols = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13;\n\nexport type WrapperClassType = `${Breakpoints}grid-cols-${GridCols}` | (Record<never, never> & string);\n\nexport type FormItemClassType =\n  | `${Breakpoints}cols-end-${\"auto\" | GridCols}`\n  | `${Breakpoints}cols-span-${\"auto\" | \"full\" | GridCols}`\n  | `${Breakpoints}cols-start-${\"auto\" | GridCols}`\n  | (Record<never, never> & string)\n  | WrapperClassType;\n\nexport type FormFieldOptions = Partial<\n  FieldOptions & {\n    validateOnBlur?: boolean;\n    validateOnChange?: boolean;\n    validateOnInput?: boolean;\n    validateOnModelUpdate?: boolean;\n  }\n>;\n\nexport interface FormShape {\n  /** 默认值 */\n  default?: any;\n  /** 字段名 */\n  fieldName: string;\n  /** 是否必填 */\n  required?: boolean;\n  rules?: ZodTypeAny;\n}\n\nexport type MaybeComponentPropKey = \"options\" | \"placeholder\" | \"title\" | keyof HtmlHTMLAttributes | (Record<never, never> & string);\n\nexport type MaybeComponentProps = { [K in MaybeComponentPropKey]?: any };\n\nexport type FormActions = FormContext<GenericObject>;\n\nexport type CustomRenderType = (() => Component | string) | string;\n\nexport type FormSchemaRuleType = \"required\" | \"selectRequired\" | null | (Record<never, never> & string) | ZodTypeAny;\n\ntype FormItemDependenciesCondition<T = boolean | PromiseLike<boolean>> = (value: Partial<Record<string, any>>, actions: FormActions) => T;\n\ntype FormItemDependenciesConditionWithRules = (value: Partial<Record<string, any>>, actions: FormActions) => FormSchemaRuleType | PromiseLike<FormSchemaRuleType>;\n\ntype FormItemDependenciesConditionWithProps = (value: Partial<Record<string, any>>, actions: FormActions) => MaybeComponentProps | PromiseLike<MaybeComponentProps>;\n\nexport interface FormItemDependencies {\n  /**\n   * 组件参数\n   * @returns 组件参数\n   */\n  componentProps?: FormItemDependenciesConditionWithProps;\n  /**\n   * 是否禁用\n   * @returns 是否禁用\n   */\n  disabled?: boolean | FormItemDependenciesCondition;\n  /**\n   * 是否渲染（删除dom）\n   * @returns 是否渲染\n   */\n  if?: boolean | FormItemDependenciesCondition;\n  /**\n   * 是否必填\n   * @returns 是否必填\n   */\n  required?: FormItemDependenciesCondition;\n  /**\n   * 字段规则\n   */\n  rules?: FormItemDependenciesConditionWithRules;\n  /**\n   * 是否隐藏(Css)\n   * @returns 是否隐藏\n   */\n  show?: boolean | FormItemDependenciesCondition;\n  /**\n   * 任意触发都会执行\n   */\n  trigger?: FormItemDependenciesCondition<void>;\n  /**\n   * 触发字段\n   */\n  triggerFields: string[];\n}\n\ntype ComponentProps = ((value: Partial<Record<string, any>>, actions: FormActions) => MaybeComponentProps) | MaybeComponentProps;\n\nexport interface FormCommonConfig {\n  /**\n   * 在Label后显示一个冒号\n   */\n  colon?: boolean;\n  /**\n   * 所有表单项的props\n   */\n  componentProps?: ComponentProps;\n  /**\n   * 所有表单项的控件样式\n   */\n  controlClass?: string;\n  /**\n   * 所有表单项的禁用状态\n   * @default false\n   */\n  disabled?: boolean;\n  /**\n   * 是否禁用所有表单项的change事件监听\n   * @default true\n   */\n  disabledOnChangeListener?: boolean;\n  /**\n   * 是否禁用所有表单项的input事件监听\n   * @default true\n   */\n  disabledOnInputListener?: boolean;\n  /**\n   * 所有表单项的空状态值,默认都是undefined，naive-ui的空状态值是null\n   */\n  emptyStateValue?: null | undefined;\n  /**\n   * 所有表单项的控件样式\n   * @default {}\n   */\n  formFieldProps?: FormFieldOptions;\n  /**\n   * 所有表单项的栅格布局\n   * @default \"\"\n   */\n  formItemClass?: string;\n  /**\n   * 隐藏所有表单项label\n   * @default false\n   */\n  hideLabel?: boolean;\n  /**\n   * 是否隐藏必填标记\n   * @default false\n   */\n  hideRequiredMark?: boolean;\n  /**\n   * 所有表单项的label样式\n   * @default \"\"\n   */\n  labelClass?: string;\n  /**\n   * 所有表单项的label宽度\n   */\n  labelWidth?: number;\n  /**\n   * 所有表单项的model属性名\n   * @default \"modelValue\"\n   */\n  modelPropName?: string;\n  /**\n   * 所有表单项的wrapper样式\n   */\n  wrapperClass?: string;\n}\n\ntype RenderComponentContentType = (value: Partial<Record<string, any>>, api: FormActions) => Record<string, any>;\n\nexport type HandleSubmitFn = (values: Record<string, any>) => Promise<void> | void;\n\nexport type HandleResetFn = (values: Record<string, any>) => Promise<void> | void;\n\nexport type FieldMappingTime = [string, [string, string], (((value: any, fieldName: string) => any) | [string, string] | null | string)?][];\n\nexport interface FormSchema<T extends BaseFormComponentType = BaseFormComponentType> extends FormCommonConfig {\n  /** 组件 */\n  component: Component | T;\n  /** 组件参数 */\n  componentProps?: ComponentProps;\n  /** 默认值 */\n  defaultValue?: any;\n  /** 依赖 */\n  dependencies?: FormItemDependencies;\n  /** 描述 */\n  description?: CustomRenderType;\n  /** 字段名 */\n  fieldName: string;\n  /** 帮助信息 */\n  help?: CustomRenderType;\n  /** 表单项 */\n  label?: CustomRenderType;\n  // 自定义组件内部渲染\n  renderComponentContent?: RenderComponentContentType;\n  /** 字段规则 */\n  rules?: FormSchemaRuleType;\n  /** 后缀 */\n  suffix?: CustomRenderType;\n}\n\nexport interface FormFieldProps extends FormSchema {\n  required?: boolean;\n}\n\nexport interface FormRenderProps<T extends BaseFormComponentType = BaseFormComponentType> {\n  /**\n   * 是否展开，在showCollapseButton=true下生效\n   */\n  collapsed?: boolean;\n  /**\n   * 折叠时保持行数\n   * @default 1\n   */\n  collapsedRows?: number;\n  /**\n   * 是否触发resize事件\n   * @default false\n   */\n  collapseTriggerResize?: boolean;\n  /**\n   * 表单项通用后备配置，当子项目没配置时使用这里的配置，子项目配置优先级高于此配置\n   */\n  commonConfig?: FormCommonConfig;\n  /**\n   * 紧凑模式（移除表单每一项底部为校验信息预留的空间）\n   */\n  compact?: boolean;\n  /**\n   * 组件v-model事件绑定\n   */\n  componentBindEventMap?: Partial<Record<BaseFormComponentType, string>>;\n  /**\n   * 组件集合\n   */\n  componentMap: Record<BaseFormComponentType, Component>;\n  /**\n   * 表单实例\n   */\n  form?: FormContext<GenericObject>;\n  /**\n   * 表单项布局\n   */\n  layout?: FormLayout;\n  /**\n   * 表单定义\n   */\n  schema?: FormSchema<T>[];\n  /**\n   * 是否显示展开/折叠\n   */\n  showCollapseButton?: boolean;\n  /**\n   * 表单栅格布局\n   * @default \"grid-cols-1\"\n   */\n  wrapperClass?: WrapperClassType;\n}\n\nexport interface ActionButtonOptions extends VbenButtonProps {\n  [key: string]: any;\n  content?: MaybeComputedRef<string>;\n  show?: boolean;\n}\n\nexport interface VbenFormProps<T extends BaseFormComponentType = BaseFormComponentType> extends Omit<FormRenderProps<T>, \"componentBindEventMap\" | \"componentMap\" | \"form\"> {\n  /**\n   * 操作按钮是否反转（提交按钮前置）\n   */\n  actionButtonsReverse?: boolean;\n  /**\n   * 表单操作区域class\n   */\n  actionWrapperClass?: ClassType;\n  /**\n   * 表单字段映射\n   */\n  fieldMappingTime?: FieldMappingTime;\n  /**\n   * 表单重置回调\n   */\n  handleReset?: HandleResetFn;\n  /**\n   * 表单提交回调\n   */\n  handleSubmit?: HandleSubmitFn;\n  /**\n   * 表单值变化回调\n   */\n  handleValuesChange?: (values: Record<string, any>) => void;\n  /**\n   * 重置按钮参数\n   */\n  resetButtonOptions?: ActionButtonOptions;\n  /**\n   * 是否显示默认操作按钮\n   * @default true\n   */\n  showDefaultActions?: boolean;\n\n  /**\n   * 提交按钮参数\n   */\n  submitButtonOptions?: ActionButtonOptions;\n\n  /**\n   * 是否在字段值改变时提交表单\n   * @default false\n   */\n  submitOnChange?: boolean;\n\n  /**\n   * 是否在回车时提交表单\n   * @default false\n   */\n  submitOnEnter?: boolean;\n}\n\nexport type ExtendedFormApi = FormApi & {\n  useStore: <T = NoInfer<VbenFormProps>>(selector?: (state: NoInfer<VbenFormProps>) => T) => Readonly<Ref<T>>;\n};\n\nexport interface VbenFormAdapterOptions<T extends BaseFormComponentType = BaseFormComponentType> {\n  config?: {\n    baseModelPropName?: string;\n    disabledOnChangeListener?: boolean;\n    disabledOnInputListener?: boolean;\n    emptyStateValue?: null | undefined;\n    modelPropNameMap?: Partial<Record<T, string>>;\n  };\n  defineRules?: {\n    required?: (value: any, params: any, ctx: Record<string, any>) => boolean | string;\n    selectRequired?: (value: any, params: any, ctx: Record<string, any>) => boolean | string;\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/use-form-context.ts",
    "content": "import type { ZodRawShape } from \"zod\";\n\nimport type { ComputedRef } from \"vue\";\n\nimport type { ExtendedFormApi, FormActions, VbenFormProps } from \"./types\";\n\nimport { computed, unref, useSlots } from \"vue\";\n\nimport { createContext } from \"/@/vben/shadcn-ui\";\nimport { isString } from \"/@/vben/shared/utils\";\n\nimport { useForm } from \"vee-validate\";\nimport { object } from \"zod\";\nimport { getDefaultsForSchema } from \"zod-defaults\";\n\ntype ExtendFormProps = VbenFormProps & { formApi: ExtendedFormApi };\n\nexport const [injectFormProps, provideFormProps] = createContext<[ComputedRef<ExtendFormProps> | ExtendFormProps, FormActions]>(\"VbenFormProps\");\n\nexport function useFormInitial(props: ComputedRef<VbenFormProps> | VbenFormProps) {\n  const slots = useSlots();\n  const initialValues = generateInitialValues();\n\n  const form = useForm({\n    ...(Object.keys(initialValues)?.length ? { initialValues } : {}),\n  });\n\n  const delegatedSlots = computed(() => {\n    const resultSlots: string[] = [];\n\n    for (const key of Object.keys(slots)) {\n      if (key !== \"default\") {\n        resultSlots.push(key);\n      }\n    }\n    return resultSlots;\n  });\n\n  function generateInitialValues() {\n    const initialValues: Record<string, any> = {};\n\n    const zodObject: ZodRawShape = {};\n    (unref(props).schema || []).forEach(item => {\n      if (Reflect.has(item, \"defaultValue\")) {\n        initialValues[item.fieldName] = item.defaultValue;\n      } else if (item.rules && !isString(item.rules)) {\n        zodObject[item.fieldName] = item.rules;\n      }\n    });\n\n    const schemaInitialValues = getDefaultsForSchema(object(zodObject));\n\n    return { ...initialValues, ...schemaInitialValues };\n  }\n\n  return {\n    delegatedSlots,\n    form,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/use-vben-form.ts",
    "content": "import type { BaseFormComponentType, ExtendedFormApi, VbenFormProps } from \"./types\";\n\nimport { defineComponent, h, isReactive, onBeforeUnmount, watch } from \"vue\";\n\nimport { useStore } from \"/@/vben/shared/store\";\n\nimport { FormApi } from \"./form-api\";\nimport VbenUseForm from \"./vben-use-form.vue\";\n\nexport function useVbenForm<T extends BaseFormComponentType = BaseFormComponentType>(options: VbenFormProps<T>) {\n  const IS_REACTIVE = isReactive(options);\n  const api = new FormApi(options);\n  const extendedApi: ExtendedFormApi = api as never;\n  extendedApi.useStore = selector => {\n    return useStore(api.store, selector);\n  };\n\n  const Form = defineComponent(\n    (props: VbenFormProps, { attrs, slots }) => {\n      onBeforeUnmount(() => {\n        api.unmount();\n      });\n      api.setState({ ...props, ...attrs });\n      return () => h(VbenUseForm, { ...props, ...attrs, formApi: extendedApi }, slots);\n    },\n    {\n      name: \"VbenUseForm\",\n      inheritAttrs: false,\n    }\n  );\n  // Add reactivity support\n  if (IS_REACTIVE) {\n    watch(\n      () => options.schema,\n      () => {\n        api.setState({ schema: options.schema });\n      },\n      { immediate: true }\n    );\n  }\n\n  return [Form, extendedApi] as const;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/vben-form.vue",
    "content": "<script setup lang=\"ts\">\nimport type { VbenFormProps } from \"./types\";\n\nimport { ref, watchEffect } from \"vue\";\n\nimport { useForwardPropsEmits } from \"../composables\";\n\nimport FormActions from \"./components/form-actions.vue\";\nimport { COMPONENT_BIND_EVENT_MAP, COMPONENT_MAP, DEFAULT_FORM_COMMON_CONFIG } from \"./config\";\nimport { Form } from \"./form-render\";\nimport { provideFormProps, useFormInitial } from \"./use-form-context\";\n\n// 通过 extends 会导致热更新卡死\ninterface Props extends VbenFormProps {}\nconst props = withDefaults(defineProps<Props>(), {\n  actionWrapperClass: \"\",\n  collapsed: false,\n  collapsedRows: 1,\n  commonConfig: () => ({}),\n  handleReset: undefined,\n  handleSubmit: undefined,\n  layout: \"horizontal\",\n  resetButtonOptions: () => ({}),\n  showCollapseButton: false,\n  showDefaultActions: true,\n  submitButtonOptions: () => ({}),\n  wrapperClass: \"grid-cols-1\",\n});\n\nconst forward = useForwardPropsEmits(props);\n\nconst currentCollapsed = ref(false);\n\nconst { delegatedSlots, form } = useFormInitial(props);\n\nprovideFormProps([props, form]);\n\nconst handleUpdateCollapsed = (value: boolean) => {\n  currentCollapsed.value = !!value;\n};\n\nwatchEffect(() => {\n  currentCollapsed.value = props.collapsed;\n});\n</script>\n\n<template>\n  <Form v-bind=\"forward\" :collapsed=\"currentCollapsed\" :component-bind-event-map=\"COMPONENT_BIND_EVENT_MAP\" :component-map=\"COMPONENT_MAP\" :form=\"form\" :global-common-config=\"DEFAULT_FORM_COMMON_CONFIG\">\n    <template v-for=\"slotName in delegatedSlots\" :key=\"slotName\" #[slotName]=\"slotProps\">\n      <slot :name=\"slotName\" v-bind=\"slotProps\"></slot>\n    </template>\n    <template #default=\"slotProps\">\n      <slot v-bind=\"slotProps\">\n        <FormActions v-if=\"showDefaultActions\" :model-value=\"currentCollapsed\" @update:model-value=\"handleUpdateCollapsed\" />\n      </slot>\n    </template>\n  </Form>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/form-ui/vben-use-form.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ExtendedFormApi, VbenFormProps } from \"./types\";\n\n// import { toRaw, watch } from 'vue';\nimport { nextTick, onMounted, watch } from \"vue\";\n// import { isFunction } from '/@/vben/shared/utils';\n\nimport { useForwardPriorityValues } from \"../composables\";\nimport { cloneDeep } from \"../shared/utils\";\n\nimport { useDebounceFn } from \"@vueuse/core\";\n\nimport FormActions from \"./components/form-actions.vue\";\nimport { COMPONENT_BIND_EVENT_MAP, COMPONENT_MAP, DEFAULT_FORM_COMMON_CONFIG } from \"./config\";\nimport { Form } from \"./form-render\";\nimport { provideFormProps, useFormInitial } from \"./use-form-context\";\n// 通过 extends 会导致热更新卡死，所以重复写了一遍\ninterface Props extends VbenFormProps {\n  formApi: ExtendedFormApi;\n}\n\nconst props = defineProps<Props>();\n\nconst state = props.formApi?.useStore?.();\n\nconst forward = useForwardPriorityValues(props, state);\n\nconst { delegatedSlots, form } = useFormInitial(forward);\n\nprovideFormProps([forward, form]);\n\nprops.formApi?.mount?.(form);\n\nconst handleUpdateCollapsed = (value: boolean) => {\n  props.formApi?.setState({ collapsed: !!value });\n};\n\nfunction handleKeyDownEnter(event: KeyboardEvent) {\n  if (!state.value.submitOnEnter || !forward.value.formApi?.isMounted) {\n    return;\n  }\n  // 如果是 textarea 不阻止默认行为，否则会导致无法换行。\n  // 跳过 textarea 的回车提交处理\n  if (event.target instanceof HTMLTextAreaElement) {\n    return;\n  }\n  event.preventDefault();\n\n  forward.value.formApi.validateAndSubmitForm();\n}\n\nconst handleValuesChangeDebounced = useDebounceFn(async () => {\n  forward.value.handleValuesChange?.(cloneDeep(await forward.value.formApi.getValues()));\n  state.value.submitOnChange && forward.value.formApi?.validateAndSubmitForm();\n}, 300);\n\nonMounted(async () => {\n  // 只在挂载后开始监听，form.values会有一个初始化的过程\n  await nextTick();\n  watch(() => form.values, handleValuesChangeDebounced, { deep: true });\n});\n</script>\n\n<template>\n  <Form\n    v-bind=\"forward\"\n    :collapsed=\"state.collapsed\"\n    :component-bind-event-map=\"COMPONENT_BIND_EVENT_MAP\"\n    :component-map=\"COMPONENT_MAP\"\n    :form=\"form\"\n    :global-common-config=\"DEFAULT_FORM_COMMON_CONFIG\"\n    @keydown.enter=\"handleKeyDownEnter\"\n  >\n    <template v-for=\"slotName in delegatedSlots\" :key=\"slotName\" #[slotName]=\"slotProps\">\n      <slot :name=\"slotName\" v-bind=\"slotProps\"></slot>\n    </template>\n    <template #default=\"slotProps\">\n      <slot v-bind=\"slotProps\">\n        <FormActions v-if=\"forward.showDefaultActions\" :model-value=\"state.collapsed\" @update:model-value=\"handleUpdateCollapsed\">\n          <template #reset-before=\"resetSlotProps\">\n            <slot name=\"reset-before\" v-bind=\"resetSlotProps\"></slot>\n          </template>\n          <template #submit-before=\"submitSlotProps\">\n            <slot name=\"submit-before\" v-bind=\"submitSlotProps\"></slot>\n          </template>\n          <template #expand-before=\"expandBeforeSlotProps\">\n            <slot name=\"expand-before\" v-bind=\"expandBeforeSlotProps\"></slot>\n          </template>\n          <template #expand-after=\"expandAfterSlotProps\">\n            <slot name=\"expand-after\" v-bind=\"expandAfterSlotProps\"></slot>\n          </template>\n        </FormActions>\n      </slot>\n    </template>\n  </Form>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/hooks/index.ts",
    "content": "export * from \"./use-app-config\";\nexport * from \"./use-content-maximize\";\nexport * from \"./use-design-tokens\";\nexport * from \"./use-hover-toggle\";\nexport * from \"./use-pagination\";\nexport * from \"./use-refresh\";\nexport * from \"./use-tabs\";\nexport * from \"./use-watermark\";\nexport * from \"../composables\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/hooks/use-app-config.ts",
    "content": "import type { ApplicationConfig, VbenAdminProAppConfigRaw } from \"/@/vben/types/global\";\n\n/**\n * 由 vite-inject-app-config 注入的全局配置\n */\nexport function useAppConfig(env: Record<string, any>, isProduction: boolean): ApplicationConfig {\n  // 生产环境下，直接使用 window._VBEN_ADMIN_PRO_APP_CONF_ 全局变量\n  const config = isProduction ? window._VBEN_ADMIN_PRO_APP_CONF_ : (env as VbenAdminProAppConfigRaw);\n\n  const { VITE_GLOB_API_URL } = config;\n\n  return {\n    apiURL: VITE_GLOB_API_URL,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/hooks/use-content-maximize.ts",
    "content": "import { updatePreferences, usePreferences } from \"/@/vben/preferences\";\n/**\n * 主体区域最大化\n */\nexport function useContentMaximize() {\n  const { contentIsMaximize } = usePreferences();\n\n  function toggleMaximize() {\n    const isMaximize = contentIsMaximize.value;\n\n    updatePreferences({\n      header: {\n        hidden: !isMaximize,\n      },\n      sidebar: {\n        hidden: !isMaximize,\n      },\n    });\n  }\n  return {\n    contentIsMaximize,\n    toggleMaximize,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/hooks/use-design-tokens.ts",
    "content": "import { reactive, watch } from \"vue\";\n\nimport { preferences, usePreferences } from \"/@/vben/preferences\";\nimport { convertToRgb, updateCSSVariables } from \"/@/vben/utils\";\n\n/**\n * 用于适配各个框架的设计系统\n */\n\nexport function useAntdDesignTokens() {\n  const rootStyles = getComputedStyle(document.documentElement);\n\n  const tokens = reactive({\n    borderRadius: \"\" as any,\n    colorBgBase: \"\",\n    colorBgContainer: \"\",\n    colorBgElevated: \"\",\n    colorBgLayout: \"\",\n    colorBgMask: \"\",\n    colorBorder: \"\",\n    colorBorderSecondary: \"\",\n    colorError: \"\",\n    colorInfo: \"\",\n    colorPrimary: \"\",\n    colorSuccess: \"\",\n    colorTextBase: \"\",\n    colorWarning: \"\",\n    zIndexPopupBase: 2000, // 调整基础弹层层级，避免下拉等组件被弹窗或者最大化状态下的表格遮挡\n  });\n\n  const getCssVariableValue = (variable: string, isColor: boolean = true) => {\n    const value = rootStyles.getPropertyValue(variable);\n    return isColor ? `hsl(${value})` : value;\n  };\n\n  watch(\n    () => preferences.theme,\n    () => {\n      tokens.colorPrimary = getCssVariableValue(\"--primary\");\n\n      tokens.colorInfo = getCssVariableValue(\"--primary\");\n\n      tokens.colorError = getCssVariableValue(\"--destructive\");\n\n      tokens.colorWarning = getCssVariableValue(\"--warning\");\n\n      tokens.colorSuccess = getCssVariableValue(\"--success\");\n\n      tokens.colorTextBase = getCssVariableValue(\"--foreground\");\n\n      getCssVariableValue(\"--primary-foreground\");\n\n      tokens.colorBorderSecondary = tokens.colorBorder = getCssVariableValue(\"--border\");\n\n      tokens.colorBgElevated = getCssVariableValue(\"--popover\");\n\n      tokens.colorBgContainer = getCssVariableValue(\"--card\");\n\n      tokens.colorBgBase = getCssVariableValue(\"--background\");\n\n      const radius = Number.parseFloat(getCssVariableValue(\"--radius\", false));\n      // 1rem = 16px\n      tokens.borderRadius = radius * 16;\n\n      tokens.colorBgLayout = getCssVariableValue(\"--background-deep\");\n      tokens.colorBgMask = getCssVariableValue(\"--overlay\");\n    },\n    { immediate: true }\n  );\n\n  return {\n    tokens,\n  };\n}\n\nexport function useNaiveDesignTokens() {\n  const rootStyles = getComputedStyle(document.documentElement);\n\n  const commonTokens = reactive({\n    baseColor: \"\",\n    bodyColor: \"\",\n    borderColor: \"\",\n    borderRadius: \"\",\n    cardColor: \"\",\n    dividerColor: \"\",\n    errorColor: \"\",\n    errorColorHover: \"\",\n    errorColorPressed: \"\",\n    errorColorSuppl: \"\",\n    invertedColor: \"\",\n    modalColor: \"\",\n    popoverColor: \"\",\n    primaryColor: \"\",\n    primaryColorHover: \"\",\n    primaryColorPressed: \"\",\n    primaryColorSuppl: \"\",\n    successColor: \"\",\n    successColorHover: \"\",\n    successColorPressed: \"\",\n    successColorSuppl: \"\",\n    tableColor: \"\",\n    textColorBase: \"\",\n    warningColor: \"\",\n    warningColorHover: \"\",\n    warningColorPressed: \"\",\n    warningColorSuppl: \"\",\n  });\n\n  const getCssVariableValue = (variable: string, isColor: boolean = true) => {\n    const value = rootStyles.getPropertyValue(variable);\n    return isColor ? convertToRgb(`hsl(${value})`) : value;\n  };\n\n  watch(\n    () => preferences.theme,\n    () => {\n      commonTokens.primaryColor = getCssVariableValue(\"--primary\");\n      commonTokens.primaryColorHover = getCssVariableValue(\"--primary-600\");\n      commonTokens.primaryColorPressed = getCssVariableValue(\"--primary-700\");\n      commonTokens.primaryColorSuppl = getCssVariableValue(\"--primary-800\");\n\n      commonTokens.errorColor = getCssVariableValue(\"--destructive\");\n      commonTokens.errorColorHover = getCssVariableValue(\"--destructive-600\");\n      commonTokens.errorColorPressed = getCssVariableValue(\"--destructive-700\");\n      commonTokens.errorColorSuppl = getCssVariableValue(\"--destructive-800\");\n\n      commonTokens.warningColor = getCssVariableValue(\"--warning\");\n      commonTokens.warningColorHover = getCssVariableValue(\"--warning-600\");\n      commonTokens.warningColorPressed = getCssVariableValue(\"--warning-700\");\n      commonTokens.warningColorSuppl = getCssVariableValue(\"--warning-800\");\n\n      commonTokens.successColor = getCssVariableValue(\"--success\");\n      commonTokens.successColorHover = getCssVariableValue(\"--success-600\");\n      commonTokens.successColorPressed = getCssVariableValue(\"--success-700\");\n      commonTokens.successColorSuppl = getCssVariableValue(\"--success-800\");\n\n      commonTokens.textColorBase = getCssVariableValue(\"--foreground\");\n\n      commonTokens.baseColor = getCssVariableValue(\"--primary-foreground\");\n\n      commonTokens.dividerColor = commonTokens.borderColor = getCssVariableValue(\"--border\");\n\n      commonTokens.modalColor = commonTokens.popoverColor = getCssVariableValue(\"--popover\");\n\n      commonTokens.tableColor = commonTokens.cardColor = getCssVariableValue(\"--card\");\n\n      commonTokens.bodyColor = getCssVariableValue(\"--background\");\n      commonTokens.invertedColor = getCssVariableValue(\"--background-deep\");\n\n      commonTokens.borderRadius = getCssVariableValue(\"--radius\", false);\n    },\n    { immediate: true }\n  );\n  return {\n    commonTokens,\n  };\n}\n\nexport function useElementPlusDesignTokens() {\n  const { isDark } = usePreferences();\n  const rootStyles = getComputedStyle(document.documentElement);\n\n  const getCssVariableValueRaw = (variable: string) => {\n    return rootStyles.getPropertyValue(variable);\n  };\n\n  const getCssVariableValue = (variable: string, isColor: boolean = true) => {\n    const value = getCssVariableValueRaw(variable);\n    return isColor ? convertToRgb(`hsl(${value})`) : value;\n  };\n\n  watch(\n    () => preferences.theme,\n    () => {\n      const background = getCssVariableValue(\"--background\");\n      const border = getCssVariableValue(\"--border\");\n      const accent = getCssVariableValue(\"--accent\");\n\n      const variables: Record<string, string> = {\n        \"--el-bg-color\": background,\n        \"--el-bg-color-overlay\": getCssVariableValue(\"--popover\"),\n        \"--el-bg-color-page\": getCssVariableValue(\"--background-deep\"),\n        \"--el-border-color\": border,\n        \"--el-border-color-dark\": border,\n        \"--el-border-color-extra-light\": border,\n        \"--el-border-color-hover\": accent,\n        \"--el-border-color-light\": border,\n        \"--el-border-color-lighter\": border,\n\n        \"--el-border-radius-base\": getCssVariableValue(\"--radius\", false),\n        \"--el-color-danger\": getCssVariableValue(\"--destructive-500\"),\n        \"--el-color-danger-dark-2\": getCssVariableValue(\"--destructive\"),\n        \"--el-color-danger-light-3\": getCssVariableValue(\"--destructive-400\"),\n        \"--el-color-danger-light-5\": getCssVariableValue(\"--destructive-300\"),\n        \"--el-color-danger-light-7\": getCssVariableValue(\"--destructive-200\"),\n        \"--el-color-danger-light-8\": isDark.value ? border : getCssVariableValue(\"--destructive-100\"),\n        \"--el-color-danger-light-9\": isDark.value ? accent : getCssVariableValue(\"--destructive-50\"),\n\n        \"--el-color-error\": getCssVariableValue(\"--destructive-500\"),\n        \"--el-color-error-dark-2\": getCssVariableValue(\"--destructive\"),\n        \"--el-color-error-light-3\": getCssVariableValue(\"--destructive-400\"),\n        \"--el-color-error-light-5\": getCssVariableValue(\"--destructive-300\"),\n        \"--el-color-error-light-7\": getCssVariableValue(\"--destructive-200\"),\n        \"--el-color-error-light-8\": isDark.value ? border : getCssVariableValue(\"--destructive-100\"),\n        \"--el-color-error-light-9\": isDark.value ? accent : getCssVariableValue(\"--destructive-50\"),\n\n        \"--el-color-info-light-8\": border,\n        \"--el-color-info-light-9\": getCssVariableValue(\"--info\"), // getCssVariableValue('--secondary'),\n        \"--el-color-primary\": getCssVariableValue(\"--primary-500\"),\n        \"--el-color-primary-dark-2\": getCssVariableValue(\"--primary\"),\n        \"--el-color-primary-light-3\": getCssVariableValue(\"--primary-400\"),\n        \"--el-color-primary-light-5\": getCssVariableValue(\"--primary-300\"),\n        \"--el-color-primary-light-7\": isDark.value ? border : getCssVariableValue(\"--primary-200\"),\n        \"--el-color-primary-light-8\": isDark.value ? border : getCssVariableValue(\"--primary-100\"),\n        \"--el-color-primary-light-9\": isDark.value ? accent : getCssVariableValue(\"--primary-50\"),\n\n        \"--el-color-success\": getCssVariableValue(\"--success-500\"),\n        \"--el-color-success-dark-2\": getCssVariableValue(\"--success\"),\n        \"--el-color-success-light-3\": getCssVariableValue(\"--success-400\"),\n        \"--el-color-success-light-5\": getCssVariableValue(\"--success-300\"),\n        \"--el-color-success-light-7\": getCssVariableValue(\"--success-200\"),\n        \"--el-color-success-light-8\": isDark.value ? border : getCssVariableValue(\"--success-100\"),\n        \"--el-color-success-light-9\": isDark.value ? accent : getCssVariableValue(\"--success-50\"),\n\n        \"--el-color-warning\": getCssVariableValue(\"--warning-500\"),\n        \"--el-color-warning-dark-2\": getCssVariableValue(\"--warning\"),\n        \"--el-color-warning-light-3\": getCssVariableValue(\"--warning-400\"),\n        \"--el-color-warning-light-5\": getCssVariableValue(\"--warning-300\"),\n        \"--el-color-warning-light-7\": getCssVariableValue(\"--warning-200\"),\n        \"--el-color-warning-light-8\": isDark.value ? border : getCssVariableValue(\"--warning-100\"),\n        \"--el-color-warning-light-9\": isDark.value ? accent : getCssVariableValue(\"--warning-50\"),\n\n        \"--el-fill-color\": getCssVariableValue(\"--accent\"),\n        \"--el-fill-color-blank\": background,\n        \"--el-fill-color-light\": getCssVariableValue(\"--accent\"),\n        \"--el-fill-color-lighter\": getCssVariableValue(\"--accent-lighter\"),\n\n        \"--el-fill-color-dark\": getCssVariableValue(\"--accent-dark\"),\n        \"--el-fill-color-darker\": getCssVariableValue(\"--accent-darker\"),\n\n        // 解决ElLoading背景色问题\n        \"--el-mask-color\": isDark.value ? \"rgba(0,0,0,.8)\" : \"rgba(255,255,255,.9)\",\n\n        \"--el-text-color-primary\": getCssVariableValue(\"--foreground\"),\n\n        \"--el-text-color-regular\": getCssVariableValue(\"--foreground\"),\n      };\n\n      updateCSSVariables(variables, `__vben_design_styles__`);\n    },\n    { immediate: true }\n  );\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/hooks/use-hover-toggle.ts",
    "content": "import type { Arrayable, MaybeElementRef } from \"@vueuse/core\";\n\nimport type { Ref } from \"vue\";\n\nimport { computed, onUnmounted, ref, unref, watch } from \"vue\";\n\nimport { isFunction } from \"/@/vben/utils\";\n\nimport { useElementHover } from \"@vueuse/core\";\n\n/**\n * 监测鼠标是否在元素内部，如果在元素内部则返回 true，否则返回 false\n * @param refElement 所有需要检测的元素。如果提供了一个数组，那么鼠标在任何一个元素内部都会返回 true\n * @param delay 延迟更新状态的时间\n * @returns 返回一个数组，第一个元素是一个 ref，表示鼠标是否在元素内部，第二个元素是一个控制器，可以通过 enable 和 disable 方法来控制监听器的启用和禁用\n */\nexport function useHoverToggle(refElement: Arrayable<MaybeElementRef>, delay: (() => number) | number = 500) {\n  const isHovers: Array<Ref<boolean>> = [];\n  const value = ref(false);\n  const timer = ref<ReturnType<typeof setTimeout> | undefined>();\n  const refs = Array.isArray(refElement) ? refElement : [refElement];\n  refs.forEach(refEle => {\n    const eleRef = computed(() => {\n      const ele = unref(refEle);\n      return ele instanceof Element ? ele : (ele?.$el as Element);\n    });\n    const isHover = useElementHover(eleRef);\n    isHovers.push(isHover);\n  });\n  const isOutsideAll = computed(() => isHovers.every(v => !v.value));\n\n  function setValueDelay(val: boolean) {\n    timer.value && clearTimeout(timer.value);\n    timer.value = setTimeout(\n      () => {\n        value.value = val;\n        timer.value = undefined;\n      },\n      isFunction(delay) ? delay() : delay\n    );\n  }\n\n  const watcher = watch(\n    isOutsideAll,\n    val => {\n      setValueDelay(!val);\n    },\n    { immediate: true }\n  );\n\n  const controller = {\n    enable() {\n      watcher.resume();\n    },\n    disable() {\n      watcher.pause();\n    },\n  };\n\n  onUnmounted(() => {\n    timer.value && clearTimeout(timer.value);\n  });\n\n  return [value, controller] as [typeof value, typeof controller];\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/hooks/use-pagination.ts",
    "content": "import type { Ref } from \"vue\";\n\nimport { computed, ref, unref } from \"vue\";\n\n/**\n * Paginates an array of items\n * @param list The array to paginate\n * @param pageNo The current page number (1-based)\n * @param pageSize Number of items per page\n * @returns Paginated array slice\n * @throws {Error} If pageNo or pageSize are invalid\n */\nfunction pagination<T = any>(list: T[], pageNo: number, pageSize: number): T[] {\n  if (pageNo < 1) throw new Error(\"Page number must be positive\");\n  if (pageSize < 1) throw new Error(\"Page size must be positive\");\n\n  const offset = (pageNo - 1) * Number(pageSize);\n  const ret = offset + pageSize >= list.length ? list.slice(offset) : list.slice(offset, offset + pageSize);\n  return ret;\n}\n\nexport function usePagination<T = any>(list: Ref<T[]>, pageSize: number) {\n  const currentPage = ref(1);\n  const pageSizeRef = ref(pageSize);\n\n  const totalPages = computed(() => Math.ceil(unref(list).length / unref(pageSizeRef)));\n\n  const paginationList = computed(() => {\n    return pagination(unref(list), unref(currentPage), unref(pageSizeRef));\n  });\n\n  const total = computed(() => {\n    return unref(list).length;\n  });\n\n  function setCurrentPage(page: number) {\n    if (page < 1 || page > unref(totalPages)) {\n      throw new Error(\"Invalid page number\");\n    }\n    currentPage.value = page;\n  }\n\n  function setPageSize(pageSize: number) {\n    if (pageSize < 1) {\n      throw new Error(\"Page size must be positive\");\n    }\n    pageSizeRef.value = pageSize;\n    // Reset to first page to prevent invalid state\n    currentPage.value = 1;\n  }\n\n  return { setCurrentPage, total, setPageSize, paginationList };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/hooks/use-refresh.ts",
    "content": "import { useRouter } from \"vue-router\";\n\nimport { useTabbarStore } from \"../stores\";\n\nexport function useRefresh() {\n  const router = useRouter();\n  const tabbarStore = useTabbarStore();\n\n  async function refresh() {\n    await tabbarStore.refresh(router);\n  }\n\n  return {\n    refresh,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/hooks/use-tabs.ts",
    "content": "import type { RouteLocationNormalized } from \"vue-router\";\n\nimport { useRoute, useRouter } from \"vue-router\";\n\nimport { useTabbarStore } from \"../stores\";\n\nexport function useTabs() {\n  const router = useRouter();\n  const route = useRoute();\n  const tabbarStore = useTabbarStore();\n\n  async function closeLeftTabs(tab?: RouteLocationNormalized) {\n    await tabbarStore.closeLeftTabs(tab || route);\n  }\n\n  async function closeAllTabs() {\n    await tabbarStore.closeAllTabs(router);\n  }\n\n  async function closeRightTabs(tab?: RouteLocationNormalized) {\n    await tabbarStore.closeRightTabs(tab || route);\n  }\n\n  async function closeOtherTabs(tab?: RouteLocationNormalized) {\n    await tabbarStore.closeOtherTabs(tab || route);\n  }\n\n  async function closeCurrentTab(tab?: RouteLocationNormalized) {\n    await tabbarStore.closeTab(tab || route, router);\n  }\n\n  async function pinTab(tab?: RouteLocationNormalized) {\n    await tabbarStore.pinTab(tab || route);\n  }\n\n  async function unpinTab(tab?: RouteLocationNormalized) {\n    await tabbarStore.unpinTab(tab || route);\n  }\n\n  async function toggleTabPin(tab?: RouteLocationNormalized) {\n    await tabbarStore.toggleTabPin(tab || route);\n  }\n\n  async function refreshTab() {\n    await tabbarStore.refresh(router);\n  }\n\n  async function openTabInNewWindow(tab?: RouteLocationNormalized) {\n    await tabbarStore.openTabInNewWindow(tab || route);\n  }\n\n  async function closeTabByKey(key: string) {\n    await tabbarStore.closeTabByKey(key, router);\n  }\n\n  async function setTabTitle(title: string) {\n    tabbarStore.setUpdateTime();\n    await tabbarStore.setTabTitle(route, title);\n  }\n\n  async function resetTabTitle() {\n    tabbarStore.setUpdateTime();\n    await tabbarStore.resetTabTitle(route);\n  }\n\n  /**\n   * 获取操作是否禁用\n   * @param tab\n   */\n  function getTabDisableState(tab: RouteLocationNormalized = route) {\n    const tabs = tabbarStore.getTabs;\n    const affixTabs = tabbarStore.affixTabs;\n    const index = tabs.findIndex((item: any) => item.path === tab.path);\n\n    const disabled = tabs.length <= 1;\n\n    const { meta } = tab;\n    const affixTab = meta?.affixTab ?? false;\n    const isCurrentTab = route.path === tab.path;\n\n    // 当前处于最左侧或者减去固定标签页的数量等于0\n    const disabledCloseLeft = index === 0 || index - affixTabs.length <= 0 || !isCurrentTab;\n\n    const disabledCloseRight = !isCurrentTab || index === tabs.length - 1;\n\n    const disabledCloseOther = disabled || !isCurrentTab || tabs.length - affixTabs.length <= 1;\n    return {\n      disabledCloseAll: disabled,\n      disabledCloseCurrent: !!affixTab || disabled,\n      disabledCloseLeft,\n      disabledCloseOther,\n      disabledCloseRight,\n      disabledRefresh: !isCurrentTab,\n    };\n  }\n\n  return {\n    closeAllTabs,\n    closeCurrentTab,\n    closeLeftTabs,\n    closeOtherTabs,\n    closeRightTabs,\n    closeTabByKey,\n    getTabDisableState,\n    openTabInNewWindow,\n    pinTab,\n    refreshTab,\n    resetTabTitle,\n    setTabTitle,\n    toggleTabPin,\n    unpinTab,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/hooks/use-watermark.ts",
    "content": "import type { Watermark, WatermarkOptions } from \"watermark-js-plus\";\n\nimport { nextTick, onUnmounted, readonly, ref } from \"vue\";\n\nimport { updatePreferences } from \"/@/vben/preferences\";\n\nconst watermark = ref<Watermark>();\nconst unmountedHooked = ref<boolean>(false);\nconst cachedOptions = ref<Partial<WatermarkOptions>>({\n  advancedStyle: {\n    colorStops: [\n      {\n        color: \"gray\",\n        offset: 0,\n      },\n      {\n        color: \"gray\",\n        offset: 1,\n      },\n    ],\n    type: \"linear\",\n  },\n  // fontSize: '20px',\n  content: \"\",\n  contentType: \"multi-line-text\",\n  globalAlpha: 0.25,\n  gridLayoutOptions: {\n    cols: 2,\n    gap: [20, 20],\n    matrix: [\n      [1, 0],\n      [0, 1],\n    ],\n    rows: 2,\n  },\n  height: 200,\n  layout: \"grid\",\n  rotate: 30,\n  width: 160,\n});\n\nexport function useWatermark() {\n  async function initWatermark(options: Partial<WatermarkOptions>) {\n    const { Watermark } = await import(\"watermark-js-plus\");\n\n    cachedOptions.value = {\n      ...cachedOptions.value,\n      ...options,\n    };\n    watermark.value = new Watermark(cachedOptions.value);\n    updatePreferences({ app: { watermark: true } });\n    await watermark.value?.create();\n  }\n\n  async function updateWatermark(options: Partial<WatermarkOptions>) {\n    if (watermark.value) {\n      await nextTick();\n      await watermark.value?.changeOptions({\n        ...cachedOptions.value,\n        ...options,\n      });\n    } else {\n      await initWatermark(options);\n    }\n  }\n\n  function destroyWatermark() {\n    if (watermark.value) {\n      watermark.value.destroy();\n      watermark.value = undefined;\n    }\n    updatePreferences({ app: { watermark: false } });\n  }\n\n  // 只在第一次调用时注册卸载钩子，防止重复注册以致于在路由切换时销毁了水印\n  if (!unmountedHooked.value) {\n    unmountedHooked.value = true;\n    onUnmounted(() => {\n      destroyWatermark();\n    });\n  }\n\n  return {\n    destroyWatermark,\n    updateWatermark,\n    watermark: readonly(watermark),\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/icons/create-icon.ts",
    "content": "import { defineComponent, h } from \"vue\";\n\nimport { Icon } from \"@iconify/vue\";\n\nfunction createIconifyIcon(icon: string) {\n  return defineComponent({\n    name: `Icon-${icon}`,\n    setup(props, { attrs }) {\n      return () => h(Icon, { icon, ...props, ...attrs });\n    },\n  });\n}\n\nexport { createIconifyIcon };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/icons/index.ts",
    "content": "import { createIconifyIcon } from \"./create-icon\";\n\nexport * from \"./create-icon\";\n\nexport * from \"./lucide\";\n\nexport type { IconifyIcon as IconifyIconStructure } from \"@iconify/vue\";\nexport { addCollection, addIcon, Icon as IconifyIcon, listIcons } from \"@iconify/vue\";\n\nexport const MdiKeyboardEsc = createIconifyIcon(\"mdi:keyboard-esc\");\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/icons/lucide.ts",
    "content": "export {\n  ArrowDown,\n  ArrowLeft,\n  ArrowLeftToLine,\n  ArrowRightLeft,\n  ArrowRightToLine,\n  ArrowUp,\n  ArrowUpToLine,\n  Bell,\n  BookOpenText,\n  Check,\n  ChevronDown,\n  ChevronLeft,\n  ChevronRight,\n  ChevronsLeft,\n  ChevronsRight,\n  Circle,\n  CircleCheckBig,\n  CircleHelp,\n  Copy,\n  CornerDownLeft,\n  Ellipsis,\n  Expand,\n  ExternalLink,\n  Eye,\n  EyeOff,\n  FoldHorizontal,\n  Fullscreen,\n  Github,\n  Grip,\n  GripVertical,\n  Menu as IconDefault,\n  Info,\n  InspectionPanel,\n  Languages,\n  LoaderCircle,\n  LockKeyhole,\n  LogOut,\n  MailCheck,\n  Maximize,\n  ArrowRightFromLine as MdiMenuClose,\n  ArrowLeftFromLine as MdiMenuOpen,\n  Menu,\n  Minimize,\n  Minimize2,\n  MoonStar,\n  Palette,\n  PanelLeft,\n  PanelRight,\n  Pin,\n  PinOff,\n  Plus,\n  RotateCw,\n  Search,\n  SearchX,\n  Settings,\n  Shrink,\n  Sun,\n  SunMoon,\n  SwatchBook,\n  UserRoundPen,\n  X,\n  CircleX,\n} from \"lucide-vue-next\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/index.ts",
    "content": "import { createApp, watchEffect } from \"vue\";\n\n// import { registerAccessDirective } from \"./access\";\nimport { initTippy, registerLoadingDirective } from \"./common-ui\";\n// import { MotionPlugin } from \"./plugins/motion\";\nimport { preferences } from \"./preferences\";\nimport { initStores } from \"./stores\";\nimport \"./styles\";\nimport \"./styles/antd/index.css\";\n\nimport { useTitle } from \"@vueuse/core\";\nimport { setupI18n, useI18n } from \"../locales\";\nimport { useSettingStore } from \"/@/store/settings\";\n\nexport async function setupVben(app: any, { loadMessages, router }: any) {\n  await setupI18n(app, { loadMessages });\n  const store = await initStores(app, { namespace: \"fs\" });\n  const settingStore = useSettingStore();\n  const { t } = useI18n();\n  watchEffect(() => {\n    if (preferences.app.dynamicTitle) {\n      let routeTitle = router.currentRoute.value.meta?.title;\n      const appName = settingStore.inited ? preferences.app.name : \"\";\n      if (routeTitle && routeTitle.indexOf(\".\") >= 0) {\n        routeTitle = t(routeTitle);\n      }\n      const pageTitle = (routeTitle ? `${routeTitle} - ` : \"\") + preferences.app.name;\n      useTitle(pageTitle);\n    }\n  });\n  return { store };\n}\n\n// import { $t, setupI18n } from \"#/locales\";\n\n// import { initComponentAdapter } from \"./adapter/component\";\n// import App from \"./app.vue\";\n// import { router } from \"./router\";\n//\n// async function bootstrap(namespace: string) {\n//   // // 初始化组件适配器\n//   // await initComponentAdapter();\n//\n//   // // 设置弹窗的默认配置\n//   // setDefaultModalProps({\n//   //   fullscreenButton: false,\n//   // });\n//   // // 设置抽屉的默认配置\n//   // setDefaultDrawerProps({\n//   //   zIndex: 1020,\n//   // });\n//\n//   // const app = createApp(App);\n//\n//   // 注册v-loading指令\n//   registerLoadingDirective(app, {\n//     loading: \"loading\", // 在这里可以自定义指令名称，也可以明确提供false表示不注册这个指令\n//     spinning: \"spinning\"\n//   });\n//\n//   // 国际化 i18n 配置\n//   await setupI18n(app);\n//\n//   // 配置 pinia-tore\n//   await initStores(app, { namespace });\n//\n//   // 安装权限指令\n//   registerAccessDirective(app);\n//\n//   // 初始化 tippy\n//   initTippy(app);\n//\n//   // 配置路由及路由守卫\n//   app.use(router);\n//\n//   // 配置Motion插件\n//   app.use(MotionPlugin);\n//\n//   // 动态更新标题\n//   watchEffect(() => {\n//     if (preferences.app.dynamicTitle) {\n//       const routeTitle = router.currentRoute.value.meta?.title;\n//       const pageTitle = (routeTitle ? `${$t(routeTitle)} - ` : \"\") + preferences.app.name;\n//       useTitle(pageTitle);\n//     }\n//   });\n//\n//   app.mount(\"#app\");\n// }\n//\n// export { bootstrap };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layout-ui/components/index.ts",
    "content": "export { default as LayoutContent } from \"./layout-content.vue\";\nexport { default as LayoutFooter } from \"./layout-footer.vue\";\nexport { default as LayoutHeader } from \"./layout-header.vue\";\nexport { default as LayoutSidebar } from \"./layout-sidebar.vue\";\nexport { default as LayoutTabbar } from \"./layout-tabbar.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layout-ui/components/layout-content.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CSSProperties } from \"vue\";\n\nimport type { ContentCompactType } from \"../../typings\";\n\nimport { computed } from \"vue\";\n\nimport { useLayoutContentStyle } from \"../../composables\";\nimport { Slot } from \"../../shadcn-ui\";\n\ninterface Props {\n  /**\n   * 内容区域定宽\n   */\n  contentCompact: ContentCompactType;\n  /**\n   * 定宽布局宽度\n   */\n  contentCompactWidth: number;\n  padding: number;\n  paddingBottom: number;\n  paddingLeft: number;\n  paddingRight: number;\n  paddingTop: number;\n}\n\nconst props = withDefaults(defineProps<Props>(), {});\n\nconst { contentElement, overlayStyle } = useLayoutContentStyle();\n\nconst style = computed((): CSSProperties => {\n  const { contentCompact, padding, paddingBottom, paddingLeft, paddingRight, paddingTop } = props;\n\n  const compactStyle: CSSProperties = contentCompact === \"compact\" ? { margin: \"0 auto\", width: `${props.contentCompactWidth}px` } : {};\n  return {\n    ...compactStyle,\n    flex: 1,\n    padding: `${padding}px`,\n    paddingBottom: `${paddingBottom}px`,\n    paddingLeft: `${paddingLeft}px`,\n    paddingRight: `${paddingRight}px`,\n    paddingTop: `${paddingTop}px`,\n  };\n});\n</script>\n\n<template>\n  <main ref=\"contentElement\" :style=\"style\" class=\"bg-background-deep relative\">\n    <Slot :style=\"overlayStyle\">\n      <slot name=\"overlay\"></slot>\n    </Slot>\n    <slot></slot>\n  </main>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layout-ui/components/layout-footer.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CSSProperties } from \"vue\";\n\nimport { computed } from \"vue\";\n\ninterface Props {\n  /**\n   * 是否固定在底部\n   */\n  fixed?: boolean;\n  height: number;\n  /**\n   * 是否显示\n   * @default true\n   */\n  show?: boolean;\n  width: string;\n  zIndex: number;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  show: true,\n});\n\nconst style = computed((): CSSProperties => {\n  const { fixed, height, show, width, zIndex } = props;\n  return {\n    height: `${height}px`,\n    marginBottom: show ? \"0\" : `-${height}px`,\n    position: fixed ? \"fixed\" : \"static\",\n    width,\n    zIndex,\n  };\n});\n</script>\n\n<template>\n  <footer :style=\"style\" class=\"bg-background-deep bottom-0 w-full transition-all duration-200\">\n    <slot></slot>\n  </footer>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layout-ui/components/layout-header.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CSSProperties } from \"vue\";\n\nimport { computed, useSlots } from \"vue\";\n\ninterface Props {\n  /**\n   * 横屏\n   */\n  fullWidth: boolean;\n  /**\n   * 高度\n   */\n  height: number;\n  /**\n   * 是否移动端\n   */\n  isMobile: boolean;\n  /**\n   * 是否显示\n   */\n  show: boolean;\n  /**\n   * 侧边菜单宽度\n   */\n  sidebarWidth: number;\n  /**\n   * 主题\n   */\n  theme: string | undefined;\n  /**\n   * 宽度\n   */\n  width: string;\n  /**\n   * zIndex\n   */\n  zIndex: number;\n}\n\nconst props = withDefaults(defineProps<Props>(), {});\n\nconst slots = useSlots();\n\nconst style = computed((): CSSProperties => {\n  const { fullWidth, height, show } = props;\n  const right = !show || !fullWidth ? undefined : 0;\n\n  return {\n    height: `${height}px`,\n    marginTop: show ? 0 : `-${height}px`,\n    right,\n  };\n});\n\nconst logoStyle = computed((): CSSProperties => {\n  return {\n    minWidth: `${props.isMobile ? 40 : props.sidebarWidth}px`,\n  };\n});\n</script>\n\n<template>\n  <header :class=\"theme\" :style=\"style\" class=\"border-border bg-header top-0 flex w-full flex-[0_0_auto] items-center border-b pl-2 transition-[margin-top] duration-200\">\n    <div v-if=\"slots.logo\" :style=\"logoStyle\">\n      <slot name=\"logo\"></slot>\n    </div>\n\n    <slot name=\"toggle-button\"> </slot>\n\n    <slot></slot>\n  </header>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layout-ui/components/layout-sidebar.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CSSProperties } from \"vue\";\n\nimport { computed, shallowRef, useSlots, watchEffect } from \"vue\";\n\nimport { VbenScrollbar } from \"../../shadcn-ui\";\n\nimport { useScrollLock } from \"@vueuse/core\";\n\nimport { SidebarCollapseButton, SidebarFixedButton } from \"./widgets\";\n\ninterface Props {\n  /**\n   * 折叠区域高度\n   * @default 42\n   */\n  collapseHeight?: number;\n  /**\n   * 折叠宽度\n   * @default 48\n   */\n  collapseWidth?: number;\n  /**\n   * 隐藏的dom是否可见\n   * @default true\n   */\n  domVisible?: boolean;\n  /**\n   * 扩展区域宽度\n   */\n  extraWidth: number;\n  /**\n   * 固定扩展区域\n   * @default false\n   */\n  fixedExtra?: boolean;\n  /**\n   * 头部高度\n   */\n  headerHeight: number;\n  /**\n   * 是否侧边混合模式\n   * @default false\n   */\n  isSidebarMixed?: boolean;\n  /**\n   * 顶部margin\n   * @default 60\n   */\n  marginTop?: number;\n  /**\n   * 混合菜单宽度\n   * @default 80\n   */\n  mixedWidth?: number;\n  /**\n   * 顶部padding\n   * @default 60\n   */\n  paddingTop?: number;\n  /**\n   * 是否显示\n   * @default true\n   */\n  show?: boolean;\n  /**\n   * 显示折叠按钮\n   * @default false\n   */\n  showCollapseButton?: boolean;\n  /**\n   * 主题\n   */\n  theme: string;\n\n  /**\n   * 宽度\n   */\n  width: number;\n  /**\n   * zIndex\n   * @default 0\n   */\n  zIndex?: number;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  collapseHeight: 42,\n  collapseWidth: 48,\n  domVisible: true,\n  fixedExtra: false,\n  isSidebarMixed: false,\n  marginTop: 0,\n  mixedWidth: 70,\n  paddingTop: 0,\n  show: true,\n  showCollapseButton: true,\n  zIndex: 0,\n});\n\nconst emit = defineEmits<{ leave: [] }>();\nconst collapse = defineModel<boolean>(\"collapse\");\nconst extraCollapse = defineModel<boolean>(\"extraCollapse\");\nconst expandOnHovering = defineModel<boolean>(\"expandOnHovering\");\nconst expandOnHover = defineModel<boolean>(\"expandOnHover\");\nconst extraVisible = defineModel<boolean>(\"extraVisible\");\n\nconst isLocked = useScrollLock(document.body);\nconst slots = useSlots();\n\nconst asideRef = shallowRef<HTMLDivElement | null>();\n\nconst hiddenSideStyle = computed((): CSSProperties => calcMenuWidthStyle(true));\n\nconst style = computed((): CSSProperties => {\n  const { isSidebarMixed, marginTop, paddingTop, zIndex } = props;\n\n  return {\n    \"--scroll-shadow\": \"var(--sidebar)\",\n    ...calcMenuWidthStyle(false),\n    height: `calc(100% - ${marginTop}px)`,\n    marginTop: `${marginTop}px`,\n    paddingTop: `${paddingTop}px`,\n    zIndex,\n    ...(isSidebarMixed && extraVisible.value ? { transition: \"none\" } : {}),\n  };\n});\n\nconst extraStyle = computed((): CSSProperties => {\n  const { extraWidth, show, width, zIndex } = props;\n\n  return {\n    left: `${width}px`,\n    width: extraVisible.value && show ? `${extraWidth}px` : 0,\n    zIndex,\n  };\n});\n\nconst extraTitleStyle = computed((): CSSProperties => {\n  const { headerHeight } = props;\n\n  return {\n    height: `${headerHeight - 1}px`,\n  };\n});\n\nconst contentWidthStyle = computed((): CSSProperties => {\n  const { collapseWidth, fixedExtra, isSidebarMixed, mixedWidth } = props;\n  if (isSidebarMixed && fixedExtra) {\n    return { width: `${collapse.value ? collapseWidth : mixedWidth}px` };\n  }\n  return {};\n});\n\nconst contentStyle = computed((): CSSProperties => {\n  const { collapseHeight, headerHeight } = props;\n\n  return {\n    height: `calc(100% - ${headerHeight + collapseHeight}px)`,\n    paddingTop: \"8px\",\n    ...contentWidthStyle.value,\n  };\n});\n\nconst headerStyle = computed((): CSSProperties => {\n  const { headerHeight, isSidebarMixed } = props;\n\n  return {\n    ...(isSidebarMixed ? { display: \"flex\", justifyContent: \"center\" } : {}),\n    height: `${headerHeight - 1}px`,\n    ...contentWidthStyle.value,\n  };\n});\n\nconst extraContentStyle = computed((): CSSProperties => {\n  const { collapseHeight, headerHeight } = props;\n  return {\n    height: `calc(100% - ${headerHeight + collapseHeight}px)`,\n  };\n});\n\nconst collapseStyle = computed((): CSSProperties => {\n  return {\n    height: `${props.collapseHeight}px`,\n  };\n});\n\nwatchEffect(() => {\n  extraVisible.value = props.fixedExtra ? true : extraVisible.value;\n});\n\nfunction calcMenuWidthStyle(isHiddenDom: boolean): CSSProperties {\n  const { extraWidth, fixedExtra, isSidebarMixed, show, width } = props;\n\n  let widthValue = width === 0 ? \"0px\" : `${width + (isSidebarMixed && fixedExtra && extraVisible.value ? extraWidth : 0)}px`;\n\n  const { collapseWidth } = props;\n\n  if (isHiddenDom && expandOnHovering.value && !expandOnHover.value) {\n    widthValue = `${collapseWidth}px`;\n  }\n\n  return {\n    ...(widthValue === \"0px\" ? { overflow: \"hidden\" } : {}),\n    flex: `0 0 ${widthValue}`,\n    marginLeft: show ? 0 : `-${widthValue}`,\n    maxWidth: widthValue,\n    minWidth: widthValue,\n    width: widthValue,\n  };\n}\n\nfunction handleMouseenter(e: MouseEvent) {\n  if (e?.offsetX < 10) {\n    return;\n  }\n\n  // 未开启和未折叠状态不生效\n  if (expandOnHover.value) {\n    return;\n  }\n  if (!expandOnHovering.value) {\n    collapse.value = false;\n  }\n  if (props.isSidebarMixed) {\n    isLocked.value = true;\n  }\n  expandOnHovering.value = true;\n}\n\nfunction handleMouseleave() {\n  emit(\"leave\");\n  if (props.isSidebarMixed) {\n    isLocked.value = false;\n  }\n  if (expandOnHover.value) {\n    return;\n  }\n\n  expandOnHovering.value = false;\n  collapse.value = true;\n  extraVisible.value = false;\n}\n</script>\n\n<template>\n  <div v-if=\"domVisible\" :class=\"theme\" :style=\"hiddenSideStyle\" class=\"h-full transition-all duration-150\"></div>\n  <aside\n    :class=\"[\n      theme,\n      {\n        'bg-sidebar-deep': isSidebarMixed,\n        'bg-sidebar border-border border-r': !isSidebarMixed,\n      },\n    ]\"\n    :style=\"style\"\n    class=\"fixed left-0 top-0 h-full transition-all duration-150\"\n    @mouseenter=\"handleMouseenter\"\n    @mouseleave=\"handleMouseleave\"\n  >\n    <SidebarFixedButton v-if=\"!collapse && !isSidebarMixed\" v-model:expand-on-hover=\"expandOnHover\" />\n    <div v-if=\"slots.logo\" :style=\"headerStyle\">\n      <slot name=\"logo\"></slot>\n    </div>\n    <VbenScrollbar :style=\"contentStyle\" shadow shadow-border>\n      <slot></slot>\n    </VbenScrollbar>\n\n    <div :style=\"collapseStyle\"></div>\n    <SidebarCollapseButton v-if=\"showCollapseButton && !isSidebarMixed\" v-model:collapsed=\"collapse\" />\n    <div\n      v-if=\"isSidebarMixed\"\n      ref=\"asideRef\"\n      :class=\"{\n        'border-l': extraVisible,\n      }\"\n      :style=\"extraStyle\"\n      class=\"border-border bg-sidebar fixed top-0 h-full overflow-hidden border-r transition-all duration-200\"\n    >\n      <SidebarCollapseButton v-if=\"isSidebarMixed && expandOnHover\" v-model:collapsed=\"extraCollapse\" />\n\n      <SidebarFixedButton v-if=\"!extraCollapse\" v-model:expand-on-hover=\"expandOnHover\" />\n      <div v-if=\"!extraCollapse\" :style=\"extraTitleStyle\" class=\"pl-2\">\n        <slot name=\"extra-title\"></slot>\n      </div>\n      <VbenScrollbar :style=\"extraContentStyle\" class=\"border-border py-2\" shadow shadow-border>\n        <slot name=\"extra\"></slot>\n      </VbenScrollbar>\n    </div>\n  </aside>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layout-ui/components/layout-tabbar.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CSSProperties } from \"vue\";\n\nimport { computed } from \"vue\";\n\ninterface Props {\n  /**\n   * 高度\n   */\n  height: number;\n}\n\nconst props = withDefaults(defineProps<Props>(), {});\n\nconst style = computed((): CSSProperties => {\n  const { height } = props;\n  return {\n    height: `${height}px`,\n  };\n});\n</script>\n\n<template>\n  <section :style=\"style\" class=\"border-border bg-background flex w-full border-b transition-all\">\n    <slot></slot>\n  </section>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layout-ui/components/widgets/index.ts",
    "content": "export { default as SidebarCollapseButton } from \"./sidebar-collapse-button.vue\";\nexport { default as SidebarFixedButton } from \"./sidebar-fixed-button.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layout-ui/components/widgets/sidebar-collapse-button.vue",
    "content": "<script setup lang=\"ts\">\nimport { ChevronsLeft, ChevronsRight } from \"../../../icons\";\n\nconst collapsed = defineModel<boolean>(\"collapsed\");\n\nfunction handleCollapsed() {\n  collapsed.value = !collapsed.value;\n}\n</script>\n\n<template>\n  <div class=\"flex-center hover:text-foreground text-foreground/60 hover:bg-accent-hover bg-accent absolute bottom-2 left-3 z-10 cursor-pointer rounded-sm p-1\" @click.stop=\"handleCollapsed\">\n    <ChevronsRight v-if=\"collapsed\" class=\"size-4\" />\n    <ChevronsLeft v-else class=\"size-4\" />\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layout-ui/components/widgets/sidebar-fixed-button.vue",
    "content": "<script setup lang=\"ts\">\nimport { Pin, PinOff } from \"../../../icons\";\n\nconst expandOnHover = defineModel<boolean>(\"expandOnHover\");\n\nfunction toggleFixed() {\n  expandOnHover.value = !expandOnHover.value;\n}\n</script>\n\n<template>\n  <div class=\"flex-center hover:text-foreground text-foreground/60 hover:bg-accent-hover bg-accent absolute bottom-2 right-3 z-10 cursor-pointer rounded-sm p-[5px] transition-all duration-300\" @click=\"toggleFixed\">\n    <PinOff v-if=\"!expandOnHover\" class=\"size-3.5\" />\n    <Pin v-else class=\"size-3.5\" />\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layout-ui/hooks/use-layout.ts",
    "content": "import type { LayoutType } from \"/@/vben/typings\";\n\nimport type { VbenLayoutProps } from \"../vben-layout\";\n\nimport { computed } from \"vue\";\n\nexport function useLayout(props: VbenLayoutProps) {\n  const currentLayout = computed(() => (props.isMobile ? \"sidebar-nav\" : (props.layout as LayoutType)));\n\n  /**\n   * 是否全屏显示content，不需要侧边、底部、顶部、tab区域\n   */\n  const isFullContent = computed(() => currentLayout.value === \"full-content\");\n\n  /**\n   * 是否侧边混合模式\n   */\n  const isSidebarMixedNav = computed(() => currentLayout.value === \"sidebar-mixed-nav\");\n\n  /**\n   * 是否为头部导航模式\n   */\n  const isHeaderNav = computed(() => currentLayout.value === \"header-nav\");\n\n  /**\n   * 是否为混合导航模式\n   */\n  const isMixedNav = computed(() => currentLayout.value === \"mixed-nav\" || currentLayout.value === \"header-sidebar-nav\");\n\n  /**\n   * 是否为头部混合模式\n   */\n  const isHeaderMixedNav = computed(() => currentLayout.value === \"header-mixed-nav\");\n\n  return {\n    currentLayout,\n    isFullContent,\n    isHeaderMixedNav,\n    isHeaderNav,\n    isMixedNav,\n    isSidebarMixedNav,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layout-ui/index.ts",
    "content": "export type * from \"./vben-layout\";\nexport { default as VbenAdminLayout } from \"./vben-layout.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layout-ui/vben-layout.ts",
    "content": "import type { ContentCompactType, LayoutHeaderModeType, LayoutType, ThemeModeType } from \"/@/vben/typings\";\n\ninterface VbenLayoutProps {\n  /**\n   * 内容区域定宽\n   * @default 'wide'\n   */\n  contentCompact?: ContentCompactType;\n  /**\n   * 定宽布局宽度\n   * @default 1200\n   */\n  contentCompactWidth?: number;\n  /**\n   * padding\n   * @default 16\n   */\n  contentPadding?: number;\n  /**\n   * paddingBottom\n   * @default 16\n   */\n  contentPaddingBottom?: number;\n  /**\n   * paddingLeft\n   * @default 16\n   */\n  contentPaddingLeft?: number;\n  /**\n   * paddingRight\n   * @default 16\n   */\n  contentPaddingRight?: number;\n  /**\n   * paddingTop\n   * @default 16\n   */\n  contentPaddingTop?: number;\n  /**\n   * footer 是否可见\n   * @default false\n   */\n  footerEnable?: boolean;\n  /**\n   * footer 是否固定\n   * @default true\n   */\n  footerFixed?: boolean;\n  /**\n   * footer 高度\n   * @default 32\n   */\n  footerHeight?: number;\n\n  /**\n   * header高度\n   * @default 48\n   */\n  headerHeight?: number;\n  /**\n   * 顶栏是否隐藏\n   * @default false\n   */\n  headerHidden?: boolean;\n  /**\n   * header 显示模式\n   * @default 'fixed'\n   */\n  headerMode?: LayoutHeaderModeType;\n  /**\n   * header 顶栏主题\n   */\n  headerTheme?: ThemeModeType;\n  /**\n   * 是否显示header切换侧边栏按钮\n   * @default\n   */\n  headerToggleSidebarButton?: boolean;\n  /**\n   * header是否显示\n   * @default true\n   */\n  headerVisible?: boolean;\n  /**\n   * 是否移动端显示\n   * @default false\n   */\n  isMobile?: boolean;\n  /**\n   * 布局方式\n   * sidebar-nav 侧边菜单布局\n   * header-nav 顶部菜单布局\n   * mixed-nav 侧边&顶部菜单布局\n   * sidebar-mixed-nav 侧边混合菜单布局\n   * full-content 全屏内容布局\n   * @default sidebar-nav\n   */\n  layout?: LayoutType;\n  /**\n   * 侧边菜单折叠状态\n   * @default false\n   */\n  sidebarCollapse?: boolean;\n  /**\n   * 侧边菜单是否折叠时，是否显示title\n   * @default true\n   */\n  sidebarCollapseShowTitle?: boolean;\n  /**\n   * 侧边栏是否可见\n   * @default true\n   */\n  sidebarEnable?: boolean;\n  /**\n   * 侧边菜单折叠额外宽度\n   * @default 48\n   */\n  sidebarExtraCollapsedWidth?: number;\n  /**\n   * 侧边栏是否隐藏\n   * @default false\n   */\n  sidebarHidden?: boolean;\n  /**\n   * 混合侧边栏宽度\n   * @default 80\n   */\n  sidebarMixedWidth?: number;\n  /**\n   * 侧边栏\n   * @default dark\n   */\n  sidebarTheme?: ThemeModeType;\n  /**\n   * 侧边栏宽度\n   * @default 210\n   */\n  sidebarWidth?: number;\n  /**\n   *  侧边菜单折叠宽度\n   * @default 48\n   */\n  sideCollapseWidth?: number;\n  /**\n   * tab是否可见\n   * @default true\n   */\n  tabbarEnable?: boolean;\n  /**\n   * tab高度\n   * @default 30\n   */\n  tabbarHeight?: number;\n  /**\n   * zIndex\n   * @default 100\n   */\n  zIndex?: number;\n}\nexport type { VbenLayoutProps };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layout-ui/vben-layout.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CSSProperties } from \"vue\";\n\nimport type { VbenLayoutProps } from \"./vben-layout\";\n\nimport { computed, ref, watch } from \"vue\";\n\nimport { SCROLL_FIXED_CLASS, useLayoutFooterStyle, useLayoutHeaderStyle } from \"../composables\";\nimport { Menu } from \"../icons\";\nimport { VbenIconButton } from \"../shadcn-ui\";\nimport { ELEMENT_ID_MAIN_CONTENT } from \"../shared/constants\";\n\nimport { useMouse, useScroll, useThrottleFn } from \"@vueuse/core\";\n\nimport { LayoutContent, LayoutFooter, LayoutHeader, LayoutSidebar, LayoutTabbar } from \"./components\";\nimport { useLayout } from \"./hooks/use-layout\";\n\ninterface Props extends VbenLayoutProps {}\n\ndefineOptions({\n  name: \"VbenLayout\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  contentCompact: \"wide\",\n  contentCompactWidth: 1200,\n  contentPadding: 0,\n  contentPaddingBottom: 0,\n  contentPaddingLeft: 0,\n  contentPaddingRight: 0,\n  contentPaddingTop: 0,\n  footerEnable: false,\n  footerFixed: true,\n  footerHeight: 32,\n  headerHeight: 50,\n  headerHidden: false,\n  headerMode: \"fixed\",\n  headerToggleSidebarButton: true,\n  headerVisible: true,\n  isMobile: false,\n  layout: \"sidebar-nav\",\n  sidebarCollapseShowTitle: false,\n  sidebarExtraCollapsedWidth: 60,\n  sidebarHidden: false,\n  sidebarMixedWidth: 80,\n  sidebarTheme: \"dark\",\n  sidebarWidth: 180,\n  sideCollapseWidth: 60,\n  tabbarEnable: true,\n  tabbarHeight: 40,\n  zIndex: 200,\n});\n\nconst emit = defineEmits<{ sideMouseLeave: []; toggleSidebar: [] }>();\nconst sidebarCollapse = defineModel<boolean>(\"sidebarCollapse\");\nconst sidebarExtraVisible = defineModel<boolean>(\"sidebarExtraVisible\");\nconst sidebarExtraCollapse = defineModel<boolean>(\"sidebarExtraCollapse\");\nconst sidebarExpandOnHover = defineModel<boolean>(\"sidebarExpandOnHover\");\nconst sidebarEnable = defineModel<boolean>(\"sidebarEnable\", { default: true });\n\n// side是否处于hover状态展开菜单中\nconst sidebarExpandOnHovering = ref(false);\nconst headerIsHidden = ref(false);\nconst contentRef = ref();\n\nconst { arrivedState, directions, isScrolling, y: scrollY } = useScroll(document);\n\nconst { setLayoutHeaderHeight } = useLayoutHeaderStyle();\nconst { setLayoutFooterHeight } = useLayoutFooterStyle();\n\nconst { y: mouseY } = useMouse({ target: contentRef, type: \"client\" });\n\nconst { currentLayout, isFullContent, isHeaderMixedNav, isHeaderNav, isMixedNav, isSidebarMixedNav } = useLayout(props);\n\n/**\n * 顶栏是否自动隐藏\n */\nconst isHeaderAutoMode = computed(() => props.headerMode === \"auto\");\n\nconst headerWrapperHeight = computed(() => {\n  let height = 0;\n  if (props.headerVisible && !props.headerHidden) {\n    height += props.headerHeight;\n  }\n  if (props.tabbarEnable) {\n    height += props.tabbarHeight;\n  }\n  return height;\n});\n\nconst getSideCollapseWidth = computed(() => {\n  const { sidebarCollapseShowTitle, sidebarMixedWidth, sideCollapseWidth } = props;\n\n  return sidebarCollapseShowTitle || isSidebarMixedNav.value || isHeaderMixedNav.value ? sidebarMixedWidth : sideCollapseWidth;\n});\n\n/**\n * 动态获取侧边区域是否可见\n */\nconst sidebarEnableState = computed(() => {\n  return !isHeaderNav.value && sidebarEnable.value;\n});\n\n/**\n * 侧边区域离顶部高度\n */\nconst sidebarMarginTop = computed(() => {\n  const { headerHeight, isMobile } = props;\n  return isMixedNav.value && !isMobile ? headerHeight : 0;\n});\n\n/**\n * 动态获取侧边宽度\n */\nconst getSidebarWidth = computed(() => {\n  const { isMobile, sidebarHidden, sidebarMixedWidth, sidebarWidth } = props;\n  let width = 0;\n\n  if (sidebarHidden) {\n    return width;\n  }\n\n  if (!sidebarEnableState.value || (sidebarHidden && !isSidebarMixedNav.value && !isMixedNav.value && !isHeaderMixedNav.value)) {\n    return width;\n  }\n\n  if ((isHeaderMixedNav.value || isSidebarMixedNav.value) && !isMobile) {\n    width = sidebarMixedWidth;\n  } else if (sidebarCollapse.value) {\n    width = isMobile ? 0 : getSideCollapseWidth.value;\n  } else {\n    width = sidebarWidth;\n  }\n  return width;\n});\n\n/**\n * 获取扩展区域宽度\n */\nconst sidebarExtraWidth = computed(() => {\n  const { sidebarExtraCollapsedWidth, sidebarWidth } = props;\n\n  return sidebarExtraCollapse.value ? sidebarExtraCollapsedWidth : sidebarWidth;\n});\n\n/**\n * 是否侧边栏模式，包含混合侧边\n */\nconst isSideMode = computed(\n  () =>\n    currentLayout.value === \"mixed-nav\" ||\n    currentLayout.value === \"sidebar-mixed-nav\" ||\n    currentLayout.value === \"sidebar-nav\" ||\n    currentLayout.value === \"header-mixed-nav\" ||\n    currentLayout.value === \"header-sidebar-nav\"\n);\n\n/**\n * header fixed值\n */\nconst headerFixed = computed(() => {\n  const { headerMode } = props;\n  return isMixedNav.value || headerMode === \"fixed\" || headerMode === \"auto-scroll\" || headerMode === \"auto\";\n});\n\nconst showSidebar = computed(() => {\n  return isSideMode.value && sidebarEnable.value && !props.sidebarHidden;\n});\n\n/**\n * 遮罩可见性\n */\nconst maskVisible = computed(() => !sidebarCollapse.value && props.isMobile);\n\nconst mainStyle = computed(() => {\n  let width = \"100%\";\n  let sidebarAndExtraWidth = \"unset\";\n  if (headerFixed.value && currentLayout.value !== \"header-nav\" && currentLayout.value !== \"mixed-nav\" && currentLayout.value !== \"header-sidebar-nav\" && showSidebar.value && !props.isMobile) {\n    // fixed模式下生效\n    const isSideNavEffective = (isSidebarMixedNav.value || isHeaderMixedNav.value) && sidebarExpandOnHover.value && sidebarExtraVisible.value;\n\n    if (isSideNavEffective) {\n      const sideCollapseWidth = sidebarCollapse.value ? getSideCollapseWidth.value : props.sidebarMixedWidth;\n      const sideWidth = sidebarExtraCollapse.value ? props.sidebarExtraCollapsedWidth : props.sidebarWidth;\n\n      // 100% - 侧边菜单混合宽度 - 菜单宽度\n      sidebarAndExtraWidth = `${sideCollapseWidth + sideWidth}px`;\n      width = `calc(100% - ${sidebarAndExtraWidth})`;\n    } else {\n      sidebarAndExtraWidth = sidebarExpandOnHovering.value && !sidebarExpandOnHover.value ? `${getSideCollapseWidth.value}px` : `${getSidebarWidth.value}px`;\n      width = `calc(100% - ${sidebarAndExtraWidth})`;\n    }\n  }\n  return {\n    sidebarAndExtraWidth,\n    width,\n  };\n});\n\n// 计算 tabbar 的样式\nconst tabbarStyle = computed((): CSSProperties => {\n  let width = \"\";\n  let marginLeft = 0;\n\n  // 如果不是混合导航，tabbar 的宽度为 100%\n  if (!isMixedNav.value || props.sidebarHidden) {\n    width = \"100%\";\n  } else if (sidebarEnable.value) {\n    // 鼠标在侧边栏上时，且侧边栏展开时的宽度\n    const onHoveringWidth = sidebarExpandOnHover.value ? props.sidebarWidth : getSideCollapseWidth.value;\n\n    // 设置 marginLeft，根据侧边栏是否折叠来决定\n    marginLeft = sidebarCollapse.value ? getSideCollapseWidth.value : onHoveringWidth;\n\n    // 设置 tabbar 的宽度，计算方式为 100% 减去侧边栏的宽度\n    width = `calc(100% - ${sidebarCollapse.value ? getSidebarWidth.value : onHoveringWidth}px)`;\n  } else {\n    // 默认情况下，tabbar 的宽度为 100%\n    width = \"100%\";\n  }\n\n  return {\n    marginLeft: `${marginLeft}px`,\n    width,\n  };\n});\n\nconst contentStyle = computed((): CSSProperties => {\n  const fixed = headerFixed.value;\n\n  const { footerEnable, footerFixed, footerHeight } = props;\n  return {\n    marginTop: fixed && !isFullContent.value && !headerIsHidden.value && (!isHeaderAutoMode.value || scrollY.value < headerWrapperHeight.value) ? `${headerWrapperHeight.value}px` : 0,\n    paddingBottom: `${footerEnable && footerFixed ? footerHeight : 0}px`,\n  };\n});\n\nconst headerZIndex = computed(() => {\n  const { zIndex } = props;\n  const offset = isMixedNav.value ? 1 : 0;\n  return zIndex + offset;\n});\n\nconst headerWrapperStyle = computed((): CSSProperties => {\n  const fixed = headerFixed.value;\n  return {\n    height: isFullContent.value ? \"0\" : `${headerWrapperHeight.value}px`,\n    left: isMixedNav.value ? 0 : mainStyle.value.sidebarAndExtraWidth,\n    position: fixed ? \"fixed\" : \"static\",\n    top: headerIsHidden.value || isFullContent.value ? `-${headerWrapperHeight.value}px` : 0,\n    width: mainStyle.value.width,\n    \"z-index\": headerZIndex.value,\n  };\n});\n\n/**\n * 侧边栏z-index\n */\nconst sidebarZIndex = computed(() => {\n  const { isMobile, zIndex } = props;\n  let offset = isMobile || isSideMode.value ? 1 : -1;\n\n  if (isMixedNav.value) {\n    offset += 1;\n  }\n\n  return zIndex + offset;\n});\n\nconst footerWidth = computed(() => {\n  if (!props.footerFixed) {\n    return \"100%\";\n  }\n\n  return mainStyle.value.width;\n});\n\nconst maskStyle = computed((): CSSProperties => {\n  return { zIndex: props.zIndex };\n});\n\nconst showHeaderToggleButton = computed(() => {\n  return props.isMobile || (props.headerToggleSidebarButton && isSideMode.value && !isSidebarMixedNav.value && !isMixedNav.value && !props.isMobile);\n});\n\nconst showHeaderLogo = computed(() => {\n  return !isSideMode.value || isMixedNav.value || props.isMobile;\n});\n\nwatch(\n  () => props.isMobile,\n  val => {\n    if (val) {\n      sidebarCollapse.value = true;\n    }\n  },\n  {\n    immediate: true,\n  }\n);\n\nwatch(\n  [() => headerWrapperHeight.value, () => isFullContent.value],\n  ([height]) => {\n    setLayoutHeaderHeight(isFullContent.value ? 0 : height);\n  },\n  {\n    immediate: true,\n  }\n);\n\nwatch(\n  () => props.footerHeight,\n  (height: number) => {\n    setLayoutFooterHeight(height);\n  },\n  {\n    immediate: true,\n  }\n);\n\n{\n  const mouseMove = () => {\n    mouseY.value > headerWrapperHeight.value ? (headerIsHidden.value = true) : (headerIsHidden.value = false);\n  };\n  watch(\n    [() => props.headerMode, () => mouseY.value],\n    () => {\n      if (!isHeaderAutoMode.value || isMixedNav.value || isFullContent.value) {\n        if (props.headerMode !== \"auto-scroll\") {\n          headerIsHidden.value = false;\n        }\n        return;\n      }\n      headerIsHidden.value = true;\n      mouseMove();\n    },\n    {\n      immediate: true,\n    }\n  );\n}\n\n{\n  const checkHeaderIsHidden = useThrottleFn((top, bottom, topArrived) => {\n    if (scrollY.value < headerWrapperHeight.value) {\n      headerIsHidden.value = false;\n      return;\n    }\n    if (topArrived) {\n      headerIsHidden.value = false;\n      return;\n    }\n\n    if (top) {\n      headerIsHidden.value = false;\n    } else if (bottom) {\n      headerIsHidden.value = true;\n    }\n  }, 300);\n\n  watch(\n    () => scrollY.value,\n    () => {\n      if (props.headerMode !== \"auto-scroll\" || isMixedNav.value || isFullContent.value) {\n        return;\n      }\n      if (isScrolling.value) {\n        checkHeaderIsHidden(directions.top, directions.bottom, arrivedState.top);\n      }\n    }\n  );\n}\n\nfunction handleClickMask() {\n  sidebarCollapse.value = true;\n}\n\nfunction handleHeaderToggle() {\n  if (props.isMobile) {\n    sidebarCollapse.value = false;\n  } else {\n    emit(\"toggleSidebar\");\n  }\n}\n\nconst idMainContent = ELEMENT_ID_MAIN_CONTENT;\n</script>\n\n<template>\n  <div class=\"relative flex min-h-full w-full\">\n    <LayoutSidebar\n      v-if=\"sidebarEnableState\"\n      v-model:collapse=\"sidebarCollapse\"\n      v-model:expand-on-hover=\"sidebarExpandOnHover\"\n      v-model:expand-on-hovering=\"sidebarExpandOnHovering\"\n      v-model:extra-collapse=\"sidebarExtraCollapse\"\n      v-model:extra-visible=\"sidebarExtraVisible\"\n      :collapse-width=\"getSideCollapseWidth\"\n      :dom-visible=\"!isMobile\"\n      :extra-width=\"sidebarExtraWidth\"\n      :fixed-extra=\"sidebarExpandOnHover\"\n      :header-height=\"isMixedNav ? 0 : headerHeight\"\n      :is-sidebar-mixed=\"isSidebarMixedNav || isHeaderMixedNav\"\n      :margin-top=\"sidebarMarginTop\"\n      :mixed-width=\"sidebarMixedWidth\"\n      :show=\"showSidebar\"\n      :theme=\"sidebarTheme\"\n      :width=\"getSidebarWidth\"\n      :z-index=\"sidebarZIndex\"\n      @leave=\"() => emit('sideMouseLeave')\"\n    >\n      <template v-if=\"isSideMode && !isMixedNav\" #logo>\n        <slot name=\"logo\"></slot>\n      </template>\n\n      <template v-if=\"isSidebarMixedNav || isHeaderMixedNav\">\n        <slot name=\"mixed-menu\"></slot>\n      </template>\n      <template v-else>\n        <slot name=\"menu\"></slot>\n      </template>\n\n      <template #extra>\n        <slot name=\"side-extra\"></slot>\n      </template>\n      <template #extra-title>\n        <slot name=\"side-extra-title\"></slot>\n      </template>\n    </LayoutSidebar>\n\n    <div ref=\"contentRef\" class=\"flex flex-1 flex-col overflow-hidden transition-all duration-300 ease-in\">\n      <div\n        :class=\"[\n          {\n            'shadow-[0_16px_24px_hsl(var(--background))]': scrollY > 20,\n          },\n          SCROLL_FIXED_CLASS,\n        ]\"\n        :style=\"headerWrapperStyle\"\n        class=\"overflow-hidden transition-all duration-200\"\n      >\n        <LayoutHeader\n          v-if=\"headerVisible\"\n          :full-width=\"!isSideMode\"\n          :height=\"headerHeight\"\n          :is-mobile=\"isMobile\"\n          :show=\"!isFullContent && !headerHidden\"\n          :sidebar-width=\"sidebarWidth\"\n          :theme=\"headerTheme\"\n          :width=\"mainStyle.width\"\n          :z-index=\"headerZIndex\"\n        >\n          <template v-if=\"showHeaderLogo\" #logo>\n            <slot name=\"logo\"></slot>\n          </template>\n\n          <template #toggle-button>\n            <VbenIconButton v-if=\"showHeaderToggleButton\" class=\"my-0 mr-1 rounded-md\" @click=\"handleHeaderToggle\">\n              <Menu class=\"size-4\" />\n            </VbenIconButton>\n          </template>\n          <slot name=\"header\"></slot>\n        </LayoutHeader>\n\n        <LayoutTabbar v-if=\"tabbarEnable\" :height=\"tabbarHeight\" :style=\"tabbarStyle\">\n          <slot name=\"tabbar\"></slot>\n        </LayoutTabbar>\n      </div>\n\n      <!-- </div> -->\n      <LayoutContent\n        :id=\"idMainContent\"\n        :content-compact=\"contentCompact\"\n        :content-compact-width=\"contentCompactWidth\"\n        :padding=\"contentPadding\"\n        :padding-bottom=\"contentPaddingBottom\"\n        :padding-left=\"contentPaddingLeft\"\n        :padding-right=\"contentPaddingRight\"\n        :padding-top=\"contentPaddingTop\"\n        :style=\"contentStyle\"\n        class=\"transition-[margin-top] duration-200\"\n      >\n        <slot name=\"content\"></slot>\n\n        <template #overlay>\n          <slot name=\"content-overlay\"></slot>\n        </template>\n      </LayoutContent>\n\n      <LayoutFooter v-if=\"footerEnable\" class=\"hidden md:block\" :fixed=\"footerFixed\" :height=\"footerHeight\" :show=\"!isFullContent\" :width=\"footerWidth\" :z-index=\"zIndex + 2\">\n        <slot name=\"footer\"></slot>\n      </LayoutFooter>\n    </div>\n    <slot name=\"extra\"></slot>\n    <div v-if=\"maskVisible\" :style=\"maskStyle\" class=\"bg-overlay fixed left-0 top-0 h-full w-full transition-[background-color] duration-200\" @click=\"handleClickMask\"></div>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/README.md",
    "content": "## layout\n\n### header\n\n- 支持N个自定义插槽，命名方式：header-right-n，header-left-n\n- header-left-n ，排序方式：0-19 ,breadcrumb 21-x\n- header-right-n ，排序方式：0-49，global-search，51-59，theme-toggle，61-69，language-toggle，71-79，fullscreen，81-89，notification，91-149，user-dropdown，151-x\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/content/content-spinner.vue",
    "content": "<script lang=\"ts\" setup>\nimport { VbenSpinner } from \"../../../shadcn-ui\";\n\nimport { useContentSpinner } from \"./use-content-spinner\";\n\ndefineOptions({ name: \"LayoutContentSpinner\" });\n\nconst { spinning } = useContentSpinner();\n</script>\n<template>\n  <VbenSpinner :spinning=\"spinning\" />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/content/content.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { VNode } from \"vue\";\nimport type { RouteLocationNormalizedLoaded, RouteLocationNormalizedLoadedGeneric } from \"vue-router\";\n\nimport { RouterView } from \"vue-router\";\n\nimport { preferences, usePreferences } from \"../../../preferences\";\nimport { storeToRefs, useTabbarStore } from \"../../../stores\";\n\nimport { IFrameRouterView } from \"../../iframe\";\n\ndefineOptions({ name: \"LayoutContent\" });\n\nconst tabbarStore = useTabbarStore();\nconst { keepAlive } = usePreferences();\n\nconst { getCachedTabs, getExcludeCachedTabs, renderRouteView } = storeToRefs(tabbarStore);\n\n// 页面切换动画\nfunction getTransitionName(_route: RouteLocationNormalizedLoaded) {\n  // 如果偏好设置未设置，则不使用动画\n  const { tabbar, transition } = preferences;\n  const transitionName = transition.name;\n  if (!transitionName || !transition.enable) {\n    return;\n  }\n\n  // 标签页未启用或者未开启缓存，则使用全局配置动画\n  if (!tabbar.enable || !keepAlive) {\n    return transitionName;\n  }\n\n  // 如果页面已经加载过，则不使用动画\n  // if (route.meta.loaded) {\n  //   return;\n  // }\n  // 已经打开且已经加载过的页面不使用动画\n  // const inTabs = getCachedTabs.value.includes(route.name as string);\n\n  // return inTabs && route.meta.loaded ? undefined : transitionName;\n  return transitionName;\n}\n\n/**\n * 转换组件，自动添加 name\n * @param component\n */\nfunction transformComponent(component: VNode, route: RouteLocationNormalizedLoadedGeneric) {\n  // 组件视图未找到，如果有设置后备视图，则返回后备视图，如果没有，则抛出错误\n  if (!component) {\n    console.error(\"Component view not found，please check the route configuration\");\n    return undefined;\n  }\n\n  const routeName = route.name as string;\n  // 如果组件没有 name，则直接返回\n  if (!routeName) {\n    return component;\n  }\n  const componentName = (component?.type as any)?.name;\n\n  // 已经设置过 name，则直接返回\n  if (componentName) {\n    return component;\n  }\n\n  // componentName 与 routeName 一致，则直接返回\n  if (componentName === routeName) {\n    return component;\n  }\n\n  // 设置 name\n  component.type ||= {};\n  (component.type as any).name = routeName;\n\n  return component;\n}\n</script>\n\n<template>\n  <div class=\"relative h-full bg-white dark:bg-black\">\n    <IFrameRouterView />\n    <RouterView v-slot=\"{ Component, route }\">\n      <Transition :name=\"getTransitionName(route)\" appear mode=\"out-in\">\n        <KeepAlive v-if=\"keepAlive\" :exclude=\"getExcludeCachedTabs\" :include=\"getCachedTabs\">\n          <component :is=\"transformComponent(Component, route)\" v-if=\"renderRouteView\" v-show=\"!route.meta.iframeSrc\" :key=\"route.fullPath\" />\n        </KeepAlive>\n        <component :is=\"Component\" v-else-if=\"renderRouteView\" :key=\"route.fullPath\" />\n      </Transition>\n    </RouterView>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/content/index.ts",
    "content": "export { default as LayoutContentSpinner } from \"./content-spinner.vue\";\nexport { default as LayoutContent } from \"./content.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/content/use-content-spinner.ts",
    "content": "import { computed, ref } from \"vue\";\nimport { useRouter } from \"vue-router\";\n\nimport { preferences } from \"/@/vben/preferences\";\n\nfunction useContentSpinner() {\n  const spinning = ref(false);\n  const startTime = ref(0);\n  const router = useRouter();\n  const minShowTime = 500; // 最小显示时间\n  const enableLoading = computed(() => preferences.transition.loading);\n\n  // 结束加载动画\n  const onEnd = () => {\n    if (!enableLoading.value) {\n      return;\n    }\n    const processTime = performance.now() - startTime.value;\n    if (processTime < minShowTime) {\n      setTimeout(() => {\n        spinning.value = false;\n      }, minShowTime - processTime);\n    } else {\n      spinning.value = false;\n    }\n  };\n\n  // 路由前置守卫\n  router.beforeEach(to => {\n    if (to.meta.loaded || !enableLoading.value || to.meta.iframeSrc) {\n      return true;\n    }\n    startTime.value = performance.now();\n    spinning.value = true;\n    return true;\n  });\n\n  // 路由后置守卫\n  router.afterEach(to => {\n    if (to.meta.loaded || !enableLoading.value || to.meta.iframeSrc) {\n      return true;\n    }\n    onEnd();\n    return true;\n  });\n\n  return { spinning };\n}\n\nexport { useContentSpinner };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/copyright/copyright.vue",
    "content": "<script lang=\"ts\" setup>\ninterface Props {\n  companyName: string;\n  companySiteLink?: string;\n  date: string;\n  icp?: string;\n  icpLink?: string;\n}\n\ndefineOptions({\n  name: \"Copyright\",\n});\n\nwithDefaults(defineProps<Props>(), {\n  companyName: \"Vben Admin\",\n  companySiteLink: \"\",\n  date: \"2024\",\n  icp: \"\",\n  icpLink: \"\",\n});\n</script>\n\n<template>\n  <div class=\"text-md flex-center\">\n    <!-- ICP Link -->\n    <a v-if=\"icp\" :href=\"icpLink || 'javascript:void(0)'\" class=\"hover:text-primary-hover mx-1\" target=\"_blank\">\n      {{ icp }}\n    </a>\n\n    <!-- Copyright Text -->\n    Copyright © {{ date }}\n\n    <!-- Company Link -->\n    <a v-if=\"companyName\" :href=\"companySiteLink || 'javascript:void(0)'\" class=\"hover:text-primary-hover mx-1\" target=\"_blank\">\n      {{ companyName }}\n    </a>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/copyright/index.ts",
    "content": "export { default as Copyright } from \"./copyright.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/footer/footer.vue",
    "content": "<script lang=\"ts\" setup>\ndefineOptions({\n  name: \"LayoutFooter\",\n});\n</script>\n\n<template>\n  <div class=\"flex-center text-muted-foreground relative h-full w-full text-xs\">\n    <slot></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/footer/index.ts",
    "content": "export { default as LayoutFooter } from \"./footer.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/header/header.vue",
    "content": "<script lang=\"ts\" setup>\nimport { computed, useSlots } from \"vue\";\n\nimport { useRefresh } from \"../../../hooks\";\nimport { RotateCw } from \"../../../icons\";\nimport { preferences, usePreferences } from \"../../../preferences\";\nimport { useAccessStore } from \"../../../stores\";\n\nimport { VbenFullScreen, VbenIconButton } from \"../../../shadcn-ui\";\n\nimport { GlobalSearch, LanguageToggle, PreferencesButton, ThemeToggle } from \"../../widgets\";\n\ninterface Props {\n  /**\n   * Logo 主题\n   */\n  theme?: string;\n}\n\ndefineOptions({\n  name: \"LayoutHeader\",\n});\n\nwithDefaults(defineProps<Props>(), {\n  theme: \"light\",\n});\n\nconst emit = defineEmits<{ clearPreferencesAndLogout: [] }>();\n\nconst REFERENCE_VALUE = 50;\n\nconst accessStore = useAccessStore();\nconst { globalSearchShortcutKey, preferencesButtonPosition } = usePreferences();\nconst slots = useSlots();\nconst { refresh } = useRefresh();\n\nconst rightSlots = computed(() => {\n  const list = [{ index: REFERENCE_VALUE + 100, name: \"user-dropdown\" }];\n  if (preferences.widget.globalSearch) {\n    list.push({\n      index: REFERENCE_VALUE,\n      name: \"global-search\",\n    });\n  }\n\n  if (preferencesButtonPosition.value.header) {\n    list.push({\n      index: REFERENCE_VALUE + 10,\n      name: \"preferences\",\n    });\n  }\n  if (preferences.widget.themeToggle) {\n    list.push({\n      index: REFERENCE_VALUE + 20,\n      name: \"theme-toggle\",\n    });\n  }\n  if (preferences.widget.languageToggle) {\n    list.push({\n      index: REFERENCE_VALUE + 30,\n      name: \"language-toggle\",\n    });\n  }\n  if (preferences.widget.fullscreen) {\n    list.push({\n      index: REFERENCE_VALUE + 40,\n      name: \"fullscreen\",\n    });\n  }\n  if (preferences.widget.notification) {\n    list.push({\n      index: REFERENCE_VALUE + 50,\n      name: \"notification\",\n    });\n  }\n\n  Object.keys(slots).forEach(key => {\n    const name = key.split(\"-\");\n    if (key.startsWith(\"header-right\")) {\n      list.push({ index: Number(name[2]), name: key });\n    }\n  });\n  return list.sort((a, b) => a.index - b.index);\n});\n\nconst leftSlots = computed(() => {\n  const list: Array<{ index: number; name: string }> = [];\n\n  if (preferences.widget.refresh) {\n    list.push({\n      index: 0,\n      name: \"refresh\",\n    });\n  }\n\n  Object.keys(slots).forEach(key => {\n    const name = key.split(\"-\");\n    if (key.startsWith(\"header-left\")) {\n      list.push({ index: Number(name[2]), name: key });\n    }\n  });\n  return list.sort((a, b) => a.index - b.index);\n});\n\nfunction clearPreferencesAndLogout() {\n  emit(\"clearPreferencesAndLogout\");\n}\n</script>\n\n<template>\n  <template v-for=\"slot in leftSlots.filter(item => item.index < REFERENCE_VALUE)\" :key=\"slot.name\">\n    <slot :name=\"slot.name\">\n      <template v-if=\"slot.name === 'refresh'\">\n        <VbenIconButton class=\"my-0 mr-1 rounded-md\" @click=\"refresh\">\n          <RotateCw class=\"size-4\" />\n        </VbenIconButton>\n      </template>\n    </slot>\n  </template>\n  <div class=\"flex-center hidden lg:block\">\n    <slot name=\"breadcrumb\"></slot>\n  </div>\n  <template v-for=\"slot in leftSlots.filter(item => item.index > REFERENCE_VALUE)\" :key=\"slot.name\">\n    <slot :name=\"slot.name\"></slot>\n  </template>\n  <div :class=\"`menu-align-${preferences.header.menuAlign}`\" class=\"flex h-full min-w-0 flex-1 items-center\">\n    <slot name=\"menu\"></slot>\n    <slot name=\"header-menu-right\"></slot>\n  </div>\n  <div class=\"flex h-full min-w-0 flex-shrink-0 items-center\">\n    <template v-for=\"slot in rightSlots\" :key=\"slot.name\">\n      <slot :name=\"slot.name\">\n        <template v-if=\"slot.name === 'global-search'\">\n          <GlobalSearch :enable-shortcut-key=\"globalSearchShortcutKey\" :menus=\"accessStore.accessMenus\" class=\"mr-1 sm:mr-4\" />\n        </template>\n\n        <template v-else-if=\"slot.name === 'preferences'\">\n          <PreferencesButton class=\"mr-1\" @clear-preferences-and-logout=\"clearPreferencesAndLogout\" />\n        </template>\n        <template v-else-if=\"slot.name === 'theme-toggle'\">\n          <ThemeToggle class=\"mr-1 mt-[2px]\" />\n        </template>\n        <template v-else-if=\"slot.name === 'language-toggle'\">\n          <LanguageToggle class=\"mr-1\" />\n        </template>\n        <template v-else-if=\"slot.name === 'fullscreen'\">\n          <VbenFullScreen class=\"mr-1\" />\n        </template>\n      </slot>\n    </template>\n  </div>\n</template>\n<style lang=\"less\" scoped>\n.menu-align-start {\n  --menu-align: start;\n}\n\n.menu-align-center {\n  --menu-align: center;\n}\n\n.menu-align-end {\n  --menu-align: end;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/header/index.ts",
    "content": "export { default as LayoutHeader } from \"./header.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/index.ts",
    "content": "export { default as BasicLayout } from \"./layout.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/layout.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { SetupContext } from \"vue\";\n\nimport type { MenuRecordRaw } from \"../../types\";\n\nimport { computed, useSlots, watch } from \"vue\";\n\nimport { useRefresh } from \"../../hooks\";\nimport { $t, i18n } from \"/@/locales\";\nimport { preferences, updatePreferences, usePreferences } from \"../../preferences\";\nimport { useLockStore } from \"../../stores\";\nimport { cloneDeep, mapTree } from \"../../utils\";\n\nimport { VbenAdminLayout } from \"../../layout-ui\";\nimport { VbenBackTop, VbenLogo } from \"../../shadcn-ui\";\n\nimport { Breadcrumb, CheckUpdates, Preferences } from \"../widgets\";\nimport { LayoutContent, LayoutContentSpinner } from \"./content\";\nimport { Copyright } from \"./copyright\";\nimport { LayoutFooter } from \"./footer\";\nimport { LayoutHeader } from \"./header\";\nimport { LayoutExtraMenu, LayoutMenu, LayoutMixedMenu, useExtraMenu, useMixedMenu } from \"./menu\";\nimport { LayoutTabbar } from \"./tabbar\";\n\ndefineOptions({ name: \"BasicLayout\" });\n\nconst emit = defineEmits<{ clearPreferencesAndLogout: [] }>();\n\nconst { isDark, isHeaderNav, isMixedNav, isMobile, isSideMixedNav, isHeaderMixedNav, isHeaderSidebarNav, layout, preferencesButtonPosition, sidebarCollapsed, theme } = usePreferences();\nconst lockStore = useLockStore();\nconst { refresh } = useRefresh();\n\nconst sidebarTheme = computed(() => {\n  const dark = isDark.value || preferences.theme.semiDarkSidebar;\n  return dark ? \"dark\" : \"light\";\n});\n\nconst headerTheme = computed(() => {\n  const dark = isDark.value || preferences.theme.semiDarkHeader;\n  return dark ? \"dark\" : \"light\";\n});\n\nconst logoClass = computed(() => {\n  const { collapsedShowTitle } = preferences.sidebar;\n  const classes: string[] = [];\n\n  if (collapsedShowTitle && sidebarCollapsed.value && !isMixedNav.value) {\n    classes.push(\"mx-auto\");\n  }\n\n  if (isSideMixedNav.value) {\n    classes.push(\"flex-center\");\n  }\n\n  return classes.join(\" \");\n});\n\nconst isMenuRounded = computed(() => {\n  return preferences.navigation.styleType === \"rounded\";\n});\n\nconst logoCollapsed = computed(() => {\n  if (isMobile.value && sidebarCollapsed.value) {\n    return true;\n  }\n  if (isHeaderNav.value || isMixedNav.value || isHeaderSidebarNav.value) {\n    return false;\n  }\n  return sidebarCollapsed.value || isSideMixedNav.value || isHeaderMixedNav.value;\n});\n\nconst showHeaderNav = computed(() => {\n  return !isMobile.value && (isHeaderNav.value || isMixedNav.value || isHeaderMixedNav.value);\n});\n\nconst { handleMenuSelect, handleMenuOpen, headerActive, headerMenus, sidebarActive, sidebarMenus, mixHeaderMenus, sidebarVisible } = useMixedMenu();\n\n// 侧边多列菜单\nconst { extraActiveMenu, extraMenus, handleDefaultSelect, handleMenuMouseEnter, handleMixedMenuSelect, handleSideMouseLeave, sidebarExtraVisible } = useExtraMenu(mixHeaderMenus);\n\n/**\n * 包装菜单，翻译菜单名称\n * @param menus 原始菜单数据\n * @param deep 是否深度包装。对于双列布局，只需要包装第一层，因为更深层的数据会在扩展菜单中重新包装\n */\nfunction wrapperMenus(menus: MenuRecordRaw[], deep: boolean = true) {\n  return deep\n    ? mapTree(menus, (item: any) => {\n        return { ...cloneDeep(item), name: $t(item.name) };\n      })\n    : menus.map(item => {\n        return { ...cloneDeep(item), name: $t(item.name) };\n      });\n}\n\nfunction toggleSidebar() {\n  updatePreferences({\n    sidebar: {\n      hidden: !preferences.sidebar.hidden,\n    },\n  });\n}\n\nfunction clearPreferencesAndLogout() {\n  emit(\"clearPreferencesAndLogout\");\n}\n\nwatch(\n  () => preferences.app.layout,\n  async val => {\n    if (val === \"sidebar-mixed-nav\" && preferences.sidebar.hidden) {\n      updatePreferences({\n        sidebar: {\n          hidden: false,\n        },\n      });\n    }\n  }\n);\n\n// 语言更新后，刷新页面\n// i18n.global.locale会在preference.app.locale变更之后才会更新，因此watchpreference.app.locale是不合适的，刷新页面时可能语言配置尚未完全加载完成\nwatch(i18n.global.locale, refresh, { flush: \"post\" });\n\nconst slots: SetupContext[\"slots\"] = useSlots();\nconst headerSlots = computed(() => {\n  return Object.keys(slots).filter(key => key.startsWith(\"header-\"));\n});\n</script>\n\n<template>\n  <VbenAdminLayout\n    v-model:sidebar-extra-visible=\"sidebarExtraVisible\"\n    :content-compact=\"preferences.app.contentCompact\"\n    :footer-enable=\"preferences.footer.enable\"\n    :footer-fixed=\"preferences.footer.fixed\"\n    :header-hidden=\"preferences.header.hidden\"\n    :header-mode=\"preferences.header.mode\"\n    :header-theme=\"headerTheme\"\n    :header-toggle-sidebar-button=\"preferences.widget.sidebarToggle\"\n    :header-visible=\"preferences.header.enable\"\n    :is-mobile=\"preferences.app.isMobile\"\n    :layout=\"layout\"\n    :sidebar-collapse=\"preferences.sidebar.collapsed\"\n    :sidebar-collapse-show-title=\"preferences.sidebar.collapsedShowTitle\"\n    :sidebar-enable=\"sidebarVisible\"\n    :sidebar-expand-on-hover=\"preferences.sidebar.expandOnHover\"\n    :sidebar-extra-collapse=\"preferences.sidebar.extraCollapse\"\n    :sidebar-hidden=\"preferences.sidebar.hidden\"\n    :sidebar-theme=\"sidebarTheme\"\n    :sidebar-width=\"preferences.sidebar.width\"\n    :tabbar-enable=\"preferences.tabbar.enable\"\n    :tabbar-height=\"preferences.tabbar.height\"\n    @side-mouse-leave=\"handleSideMouseLeave\"\n    @toggle-sidebar=\"toggleSidebar\"\n    @update:sidebar-collapse=\"(value: boolean) => updatePreferences({ sidebar: { collapsed: value } })\"\n    @update:sidebar-enable=\"(value: boolean) => updatePreferences({ sidebar: { enable: value } })\"\n    @update:sidebar-expand-on-hover=\"(value: boolean) => updatePreferences({ sidebar: { expandOnHover: value } })\"\n    @update:sidebar-extra-collapse=\"(value: boolean) => updatePreferences({ sidebar: { extraCollapse: value } })\"\n  >\n    <!-- logo -->\n    <template #logo>\n      <VbenLogo v-if=\"preferences.logo.enable\" :class=\"logoClass\" :collapsed=\"logoCollapsed\" :src=\"preferences.logo.source\" :text=\"preferences.app.name\" :theme=\"showHeaderNav ? headerTheme : theme\" />\n    </template>\n    <!-- 头部区域 -->\n    <template #header>\n      <LayoutHeader :theme=\"theme\" @clear-preferences-and-logout=\"clearPreferencesAndLogout\">\n        <template v-if=\"!showHeaderNav && preferences.breadcrumb.enable\" #breadcrumb>\n          <Breadcrumb :hide-when-only-one=\"preferences.breadcrumb.hideOnlyOne\" :show-home=\"preferences.breadcrumb.showHome\" :show-icon=\"preferences.breadcrumb.showIcon\" :type=\"preferences.breadcrumb.styleType\" />\n        </template>\n        <template v-if=\"showHeaderNav\" #menu>\n          <LayoutMenu :default-active=\"headerActive\" :menus=\"wrapperMenus(headerMenus)\" :rounded=\"isMenuRounded\" :theme=\"headerTheme\" class=\"w-full\" mode=\"horizontal\" @select=\"handleMenuSelect\" />\n        </template>\n        <template #user-dropdown>\n          <slot name=\"user-dropdown\"></slot>\n        </template>\n        <template #notification>\n          <slot name=\"notification\"></slot>\n        </template>\n        <template v-for=\"item in headerSlots\" #[item]>\n          <slot :name=\"item\"></slot>\n        </template>\n      </LayoutHeader>\n    </template>\n    <!-- 侧边菜单区域 -->\n    <template #menu>\n      <LayoutMenu\n        :accordion=\"preferences.navigation.accordion\"\n        :collapse=\"preferences.sidebar.collapsed\"\n        :collapse-show-title=\"preferences.sidebar.collapsedShowTitle\"\n        :default-active=\"sidebarActive\"\n        :menus=\"wrapperMenus(sidebarMenus)\"\n        :rounded=\"isMenuRounded\"\n        :theme=\"sidebarTheme\"\n        mode=\"vertical\"\n        @open=\"handleMenuOpen\"\n        @select=\"handleMenuSelect\"\n      />\n    </template>\n    <template #mixed-menu>\n      <LayoutMixedMenu\n        :active-path=\"extraActiveMenu\"\n        :menus=\"wrapperMenus(mixHeaderMenus, false)\"\n        :rounded=\"isMenuRounded\"\n        :theme=\"sidebarTheme\"\n        @default-select=\"handleDefaultSelect\"\n        @enter=\"handleMenuMouseEnter\"\n        @select=\"handleMixedMenuSelect\"\n      />\n    </template>\n    <!-- 侧边额外区域 -->\n    <template #side-extra>\n      <LayoutExtraMenu :accordion=\"preferences.navigation.accordion\" :collapse=\"preferences.sidebar.extraCollapse\" :menus=\"wrapperMenus(extraMenus)\" :rounded=\"isMenuRounded\" :theme=\"sidebarTheme\" />\n    </template>\n    <template #side-extra-title>\n      <VbenLogo v-if=\"preferences.logo.enable\" :text=\"preferences.app.name\" :theme=\"theme\" />\n    </template>\n\n    <template #tabbar>\n      <LayoutTabbar v-if=\"preferences.tabbar.enable\" :show-icon=\"preferences.tabbar.showIcon\" :theme=\"theme\" />\n    </template>\n\n    <!-- 主体内容 -->\n    <template #content>\n      <LayoutContent />\n    </template>\n\n    <template v-if=\"preferences.transition.loading\" #content-overlay>\n      <LayoutContentSpinner />\n    </template>\n\n    <!-- 页脚 -->\n    <template v-if=\"preferences.footer.enable\" #footer>\n      <LayoutFooter>\n        <Copyright v-if=\"preferences.copyright.enable\" v-bind=\"preferences.copyright\" />\n        <slot name=\"footer\"></slot>\n      </LayoutFooter>\n    </template>\n\n    <template #extra>\n      <slot name=\"extra\"></slot>\n      <CheckUpdates v-if=\"preferences.app.enableCheckUpdates\" :check-updates-interval=\"preferences.app.checkUpdatesInterval\" />\n\n      <Transition v-if=\"preferences.widget.lockScreen\" name=\"slide-up\">\n        <slot v-if=\"lockStore.isLockScreen\" name=\"lock-screen\"></slot>\n      </Transition>\n\n      <template v-if=\"preferencesButtonPosition.fixed\">\n        <Preferences class=\"z-100 fixed bottom-20 right-0\" @clear-preferences-and-logout=\"clearPreferencesAndLogout\" />\n      </template>\n      <VbenBackTop />\n    </template>\n  </VbenAdminLayout>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/menu/extra-menu.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { MenuRecordRaw } from \"../../../types\";\n\nimport type { MenuProps } from \"../../../menu-ui\";\n\nimport { useRoute } from \"vue-router\";\n\nimport { Menu } from \"../../../menu-ui\";\n\nimport { useNavigation } from \"./use-navigation\";\n\ninterface Props extends MenuProps {\n  collapse?: boolean;\n  menus: MenuRecordRaw[];\n}\n\nwithDefaults(defineProps<Props>(), {\n  accordion: true,\n  menus: () => [],\n});\n\nconst route = useRoute();\nconst { navigation } = useNavigation();\n\nasync function handleSelect(key: string) {\n  await navigation(key);\n}\n</script>\n\n<template>\n  <Menu :accordion=\"accordion\" :collapse=\"collapse\" :default-active=\"route.meta?.activePath || route.path\" :menus=\"menus\" :rounded=\"rounded\" :theme=\"theme\" mode=\"vertical\" @select=\"handleSelect\" />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/menu/index.ts",
    "content": "export { default as LayoutExtraMenu } from \"./extra-menu.vue\";\nexport { default as LayoutMenu } from \"./menu.vue\";\nexport { default as LayoutMixedMenu } from \"./mixed-menu.vue\";\nexport * from \"./use-extra-menu\";\nexport * from \"./use-mixed-menu\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/menu/menu.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { MenuRecordRaw } from \"../../../types\";\n\nimport type { MenuProps } from \"../../../menu-ui\";\n\nimport { Menu } from \"../../../menu-ui\";\n\ninterface Props extends MenuProps {\n  menus: MenuRecordRaw[];\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  accordion: true,\n  menus: () => [],\n});\n\nconst emit = defineEmits<{\n  open: [string, string[]];\n  select: [string, string?];\n}>();\n\nfunction handleMenuSelect(key: string) {\n  emit(\"select\", key, props.mode);\n}\n\nfunction handleMenuOpen(key: string, path: string[]) {\n  emit(\"open\", key, path);\n}\n</script>\n\n<template>\n  <Menu\n    :accordion=\"accordion\"\n    :collapse=\"collapse\"\n    :collapse-show-title=\"collapseShowTitle\"\n    :default-active=\"defaultActive\"\n    :menus=\"menus\"\n    :mode=\"mode\"\n    :rounded=\"rounded\"\n    :theme=\"theme\"\n    @open=\"handleMenuOpen\"\n    @select=\"handleMenuSelect\"\n  />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/menu/mixed-menu.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { MenuRecordRaw } from \"../../../types\";\n\nimport type { NormalMenuProps } from \"../../../menu-ui\";\n\nimport { onBeforeMount } from \"vue\";\nimport { useRoute } from \"vue-router\";\n\nimport { findMenuByPath } from \"../../../utils\";\n\nimport { NormalMenu } from \"../../../menu-ui\";\n\ninterface Props extends NormalMenuProps {}\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n  defaultSelect: [MenuRecordRaw, MenuRecordRaw?];\n  enter: [MenuRecordRaw];\n  select: [MenuRecordRaw];\n}>();\n\nconst route = useRoute();\n\nonBeforeMount(() => {\n  const menu = findMenuByPath(props.menus || [], route.path);\n  if (menu) {\n    const rootMenu = (props.menus || []).find(item => item.path === menu.parents?.[0]);\n    emit(\"defaultSelect\", menu, rootMenu);\n  }\n});\n</script>\n\n<template>\n  <NormalMenu :active-path=\"activePath\" :collapse=\"collapse\" :menus=\"menus\" :rounded=\"rounded\" :theme=\"theme\" @enter=\"menu => emit('enter', menu)\" @select=\"menu => emit('select', menu)\" />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/menu/use-extra-menu.ts",
    "content": "import type { ComputedRef } from \"vue\";\n\nimport type { MenuRecordRaw } from \"../../../types\";\n\nimport { computed, ref, watch } from \"vue\";\nimport { useRoute } from \"vue-router\";\n\nimport { preferences } from \"../../../preferences\";\nimport { useAccessStore } from \"../../../stores\";\nimport { findRootMenuByPath } from \"../../../utils\";\n\nimport { useNavigation } from \"./use-navigation\";\n\nfunction useExtraMenu(useRootMenus?: ComputedRef<MenuRecordRaw[]>) {\n  const accessStore = useAccessStore();\n  const { navigation } = useNavigation();\n\n  const menus = computed(() => useRootMenus?.value ?? accessStore.accessMenus);\n\n  /** 记录当前顶级菜单下哪个子菜单最后激活 */\n  const defaultSubMap = new Map<string, string>();\n  const extraRootMenus = ref<MenuRecordRaw[]>([]);\n  const route = useRoute();\n  const extraMenus = ref<MenuRecordRaw[]>([]);\n  const sidebarExtraVisible = ref<boolean>(false);\n  const extraActiveMenu = ref(\"\");\n  const parentLevel = computed(() => (preferences.app.layout === \"header-mixed-nav\" ? 1 : 0));\n\n  /**\n   * 选择混合菜单事件\n   * @param menu\n   */\n  const handleMixedMenuSelect = async (menu: MenuRecordRaw) => {\n    extraMenus.value = menu?.children ?? [];\n    extraActiveMenu.value = menu.parents?.[parentLevel.value] ?? menu.path;\n    const hasChildren = extraMenus.value.length > 0;\n\n    sidebarExtraVisible.value = hasChildren;\n    if (!hasChildren) {\n      await navigation(menu.path);\n    } else if (preferences.sidebar.autoActivateChild) {\n      await navigation(defaultSubMap.has(menu.path) ? (defaultSubMap.get(menu.path) as string) : menu.path);\n    }\n  };\n\n  /**\n   * 选择默认菜单事件\n   * @param menu\n   * @param rootMenu\n   */\n  const handleDefaultSelect = async (menu: MenuRecordRaw, rootMenu?: MenuRecordRaw) => {\n    extraMenus.value = rootMenu?.children ?? extraRootMenus.value ?? [];\n    extraActiveMenu.value = menu.parents?.[parentLevel.value] ?? menu.path;\n\n    if (preferences.sidebar.expandOnHover) {\n      sidebarExtraVisible.value = extraMenus.value.length > 0;\n    }\n  };\n\n  /**\n   * 侧边菜单鼠标移出事件\n   */\n  const handleSideMouseLeave = () => {\n    if (preferences.sidebar.expandOnHover) {\n      return;\n    }\n\n    const { findMenu, rootMenu, rootMenuPath } = findRootMenuByPath(menus.value, route.path);\n    extraActiveMenu.value = rootMenuPath ?? findMenu?.path ?? \"\";\n    extraMenus.value = rootMenu?.children ?? [];\n  };\n\n  const handleMenuMouseEnter = (menu: MenuRecordRaw) => {\n    if (!preferences.sidebar.expandOnHover) {\n      const { findMenu } = findRootMenuByPath(menus.value, menu.path);\n      extraMenus.value = findMenu?.children ?? [];\n      extraActiveMenu.value = menu.parents?.[parentLevel.value] ?? menu.path;\n      sidebarExtraVisible.value = extraMenus.value.length > 0;\n    }\n  };\n\n  function calcExtraMenus(path: string) {\n    const currentPath = route.meta?.activePath || path;\n    const { findMenu, rootMenu, rootMenuPath } = findRootMenuByPath(menus.value, currentPath, parentLevel.value);\n    extraRootMenus.value = rootMenu?.children ?? [];\n    if (rootMenuPath) defaultSubMap.set(rootMenuPath, currentPath);\n    extraActiveMenu.value = rootMenuPath ?? findMenu?.path ?? \"\";\n    extraMenus.value = rootMenu?.children ?? [];\n    if (preferences.sidebar.expandOnHover) {\n      sidebarExtraVisible.value = extraMenus.value.length > 0;\n    }\n  }\n\n  watch(\n    () => [route.path, preferences.app.layout],\n    ([path]) => {\n      calcExtraMenus(path || \"\");\n    },\n    { immediate: true }\n  );\n\n  return {\n    extraActiveMenu,\n    extraMenus,\n    handleDefaultSelect,\n    handleMenuMouseEnter,\n    handleMixedMenuSelect,\n    handleSideMouseLeave,\n    sidebarExtraVisible,\n  };\n}\n\nexport { useExtraMenu };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/menu/use-mixed-menu.ts",
    "content": "import type { MenuRecordRaw } from \"../../../types\";\n\nimport { computed, onBeforeMount, ref, watch } from \"vue\";\nimport { useRoute } from \"vue-router\";\n\nimport { preferences, usePreferences } from \"../../../preferences\";\nimport { useAccessStore } from \"../../../stores\";\nimport { findRootMenuByPath } from \"../../../utils\";\n\nimport { useNavigation } from \"./use-navigation\";\n\nfunction useMixedMenu() {\n  const { navigation } = useNavigation();\n  const accessStore = useAccessStore();\n  const route = useRoute();\n  const lastSideMenus = ref<MenuRecordRaw[]>([]);\n  const splitSideMenus = ref<MenuRecordRaw[]>([]);\n  const rootMenuPath = ref<string>(\"\");\n  const mixedRootMenuPath = ref<string>(\"\");\n  const mixExtraMenus = ref<MenuRecordRaw[]>([]);\n  /** 记录当前顶级菜单下哪个子菜单最后激活 */\n  const defaultSubMap = new Map<string, string>();\n  const { isMixedNav, isHeaderMixedNav } = usePreferences();\n\n  const needSplit = computed(() => (preferences.navigation.split && isMixedNav.value) || isHeaderMixedNav.value);\n\n  const sidebarVisible = computed(() => {\n    const enableSidebar = preferences.sidebar.enable;\n    if (needSplit.value) {\n      return enableSidebar && splitSideMenus.value.length > 0;\n    }\n    return enableSidebar;\n  });\n\n  function buildItemMenus(menus: any) {\n    if (menus == null) {\n      return;\n    }\n    const list: any = [];\n    for (const sub of menus) {\n      if (sub.meta?.show != null) {\n        if (sub.meta.show === false || (typeof sub.meta.show === \"function\" && !sub.meta.show())) {\n          continue;\n        }\n      }\n      const item: any = {\n        ...sub,\n      };\n\n      list.push(item);\n      if (sub.children && sub.children.length > 0) {\n        item.children = buildItemMenus(sub.children);\n      }\n    }\n    return list;\n  }\n\n  const allMenus = computed(() => {\n    const menus = accessStore.accessMenus;\n    return buildItemMenus(menus);\n  });\n\n  const menus = computed(() => {\n    return allMenus.value.filter((item: any) => item?.meta?.isMenu !== false && item?.meta?.hideInMenu !== true && !item?.meta?.fixedAside);\n  });\n  const holdMenus = computed(() => {\n    return allMenus.value.filter((item: any) => item?.meta?.fixedAside);\n  });\n  /**\n   * 头部菜单\n   */\n  const headerMenus = computed(() => {\n    if (!needSplit.value) {\n      return menus.value;\n    }\n    return menus.value.map((item: any) => {\n      return {\n        ...item,\n        children: [],\n      };\n    });\n  });\n\n  /**\n   * 侧边菜单\n   */\n  const sidebarMenus = computed(() => {\n    if (preferences.app.isMobile) {\n      return [...holdMenus.value, ...menus.value];\n    }\n\n    const sideMenus = needSplit.value ? splitSideMenus.value : menus.value;\n    return [...holdMenus.value, ...sideMenus];\n  });\n\n  const mixHeaderMenus = computed(() => {\n    return isHeaderMixedNav.value ? sidebarMenus.value : headerMenus.value;\n  });\n\n  /**\n   * 侧边菜单激活路径\n   */\n  const sidebarActive = computed(() => {\n    return (route?.meta?.activePath as string) ?? route.path;\n  });\n\n  /**\n   * 头部菜单激活路径\n   */\n  const headerActive = computed(() => {\n    if (!needSplit.value) {\n      return route.path;\n    }\n    return rootMenuPath.value;\n  });\n\n  function saveLastSplitSideMenus() {\n    if (splitSideMenus.value.length == 0 && lastSideMenus.value?.length > 0) {\n      splitSideMenus.value = lastSideMenus.value;\n    }\n    if (!splitSideMenus.value || splitSideMenus.value.length === 0) {\n      //仍然为空，从所有菜单中查找\n      const hasChildren = allMenus.value.find((item: any) => {\n        return item.children && item.children.length > 0;\n      });\n      if (hasChildren) {\n        splitSideMenus.value = hasChildren.children;\n      }\n    }\n    lastSideMenus.value = splitSideMenus.value;\n  }\n  /**\n   * 菜单点击事件处理\n   * @param key 菜单路径\n   * @param mode 菜单模式\n   */\n  const handleMenuSelect = (key: string, mode?: string) => {\n    if (!needSplit.value || mode === \"vertical\") {\n      navigation(key);\n      return;\n    }\n\n    const rootMenu = menus.value.find((item: any) => item.path === key);\n    rootMenuPath.value = rootMenu?.path ?? \"\";\n    splitSideMenus.value = rootMenu?.children ?? [];\n    saveLastSplitSideMenus();\n    if (splitSideMenus.value.length === 0) {\n      navigation(key);\n    } else if (rootMenu && preferences.sidebar.autoActivateChild) {\n      navigation(defaultSubMap.has(rootMenu.path) ? (defaultSubMap.get(rootMenu.path) as string) : rootMenu.path);\n    }\n  };\n\n  /**\n   * 侧边菜单展开事件\n   * @param key 路由路径\n   * @param parentsPath 父级路径\n   */\n  const handleMenuOpen = (key: string, parentsPath: string[]) => {\n    if (parentsPath.length <= 1 && preferences.sidebar.autoActivateChild) {\n      navigation(defaultSubMap.has(key) ? (defaultSubMap.get(key) as string) : key);\n    }\n  };\n\n  /**\n   * 计算侧边菜单\n   * @param path 路由路径\n   */\n  function calcSideMenus(path: string = route.path) {\n    let { rootMenu } = findRootMenuByPath(menus.value, path);\n    if (!rootMenu) {\n      rootMenu = menus.value.find((item: any) => item.path === path);\n    }\n    const result = findRootMenuByPath(rootMenu?.children || [], path, 1);\n    mixedRootMenuPath.value = result.rootMenuPath ?? \"\";\n    mixExtraMenus.value = result.rootMenu?.children ?? [];\n    rootMenuPath.value = rootMenu?.path ?? \"\";\n    splitSideMenus.value = rootMenu?.children ?? lastSideMenus.value ?? [];\n    saveLastSplitSideMenus();\n  }\n\n  watch(\n    () => route.path,\n    path => {\n      const currentPath = (route?.meta?.activePath as string) ?? path;\n      calcSideMenus(currentPath);\n      if (rootMenuPath.value) defaultSubMap.set(rootMenuPath.value, currentPath);\n    },\n    { immediate: true }\n  );\n\n  // 初始化计算侧边菜单\n  onBeforeMount(() => {\n    calcSideMenus((route.meta?.activePath || route.path) as string);\n  });\n\n  return {\n    handleMenuSelect,\n    handleMenuOpen,\n    headerActive,\n    headerMenus,\n    sidebarActive,\n    sidebarMenus,\n    mixHeaderMenus,\n    mixExtraMenus,\n    sidebarVisible,\n  };\n}\n\nexport { useMixedMenu };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/menu/use-navigation.ts",
    "content": "import type { RouteRecordNormalized } from \"vue-router\";\n\nimport { useRouter } from \"vue-router\";\n\nimport { isHttpUrl, openRouteInNewWindow, openWindow } from \"../../../utils\";\n\nfunction useNavigation() {\n  const router = useRouter();\n  const routes = router.getRoutes();\n\n  const routeMetaMap = new Map<string, RouteRecordNormalized>();\n\n  routes.forEach(route => {\n    routeMetaMap.set(route.path, route);\n  });\n\n  const navigation = async (path: string) => {\n    const route = routeMetaMap.get(path);\n    const { openInNewWindow = false, query = {} as any } = route?.meta ?? {};\n    if (isHttpUrl(path)) {\n      openWindow(path, { target: \"_blank\" });\n    } else if (openInNewWindow) {\n      openRouteInNewWindow(path);\n    } else {\n      await router.push({\n        path,\n        query,\n      });\n    }\n  };\n\n  return { navigation };\n}\n\nexport { useNavigation };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/tabbar/index.ts",
    "content": "export { default as LayoutTabbar } from \"./tabbar.vue\";\nexport * from \"./use-tabbar\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/tabbar/tabbar.vue",
    "content": "<script lang=\"ts\" setup>\nimport { computed } from \"vue\";\nimport { useRoute } from \"vue-router\";\n\nimport { useContentMaximize, useTabs } from \"../../../hooks\";\nimport { preferences } from \"../../../preferences\";\nimport { useTabbarStore } from \"../../../stores\";\n\nimport { TabsToolMore, TabsToolScreen, TabsView } from \"../../../tabs-ui\";\n\nimport { useTabbar } from \"./use-tabbar\";\n\ndefineOptions({\n  name: \"LayoutTabbar\",\n});\n\ndefineProps<{ showIcon?: boolean; theme?: string }>();\n\nconst route = useRoute();\nconst tabbarStore = useTabbarStore();\nconst { contentIsMaximize, toggleMaximize } = useContentMaximize();\nconst { unpinTab } = useTabs();\n\nconst { createContextMenus, currentActive, currentTabs, handleClick, handleClose } = useTabbar();\n\nconst menus = computed(() => {\n  const tab = tabbarStore.getTabByPath(currentActive.value);\n  const menus = createContextMenus(tab);\n  return menus.map(item => {\n    return {\n      ...item,\n      label: item.text,\n      value: item.key,\n    };\n  });\n});\n\n// 刷新后如果不保持tab状态，关闭其他tab\nif (!preferences.tabbar.persist) {\n  tabbarStore.closeOtherTabs(route);\n}\n</script>\n\n<template>\n  <TabsView\n    :active=\"currentActive\"\n    :class=\"theme\"\n    :context-menus=\"createContextMenus\"\n    :draggable=\"preferences.tabbar.draggable\"\n    :show-icon=\"showIcon\"\n    :style-type=\"preferences.tabbar.styleType\"\n    :tabs=\"currentTabs\"\n    :wheelable=\"preferences.tabbar.wheelable\"\n    :middle-click-to-close=\"preferences.tabbar.middleClickToClose\"\n    @close=\"handleClose\"\n    @sort-tabs=\"tabbarStore.sortTabs\"\n    @unpin=\"unpinTab\"\n    @update:active=\"handleClick\"\n  />\n  <div class=\"flex-center h-full\">\n    <TabsToolMore v-if=\"preferences.tabbar.showMore\" :menus=\"menus\" />\n    <TabsToolScreen v-if=\"preferences.tabbar.showMaximize\" :screen=\"contentIsMaximize\" @change=\"toggleMaximize\" @update:screen=\"toggleMaximize\" />\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/basic/tabbar/use-tabbar.ts",
    "content": "import type { RouteLocationNormalizedGeneric } from \"vue-router\";\n\nimport type { TabDefinition } from \"../../../types\";\n\nimport type { IContextMenuItem } from \"../../../tabs-ui\";\n\nimport { computed, ref, watch } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\n\nimport { useContentMaximize, useTabs } from \"../../../hooks\";\nimport { ArrowLeftToLine, ArrowRightLeft, ArrowRightToLine, ExternalLink, FoldHorizontal, Fullscreen, Minimize2, Pin, PinOff, RotateCw, X } from \"../../../icons\";\nimport { $t, useI18n } from \"/@/locales\";\nimport { useAccessStore, useTabbarStore } from \"../../../stores\";\nimport { filterTree } from \"../../../utils\";\n\nexport function useTabbar() {\n  const router = useRouter();\n  const route = useRoute();\n  const accessStore = useAccessStore();\n  const tabbarStore = useTabbarStore();\n  const { contentIsMaximize, toggleMaximize } = useContentMaximize();\n  const { closeAllTabs, closeCurrentTab, closeLeftTabs, closeOtherTabs, closeRightTabs, closeTabByKey, getTabDisableState, openTabInNewWindow, refreshTab, toggleTabPin } = useTabs();\n\n  const currentActive = computed(() => {\n    return route.fullPath;\n  });\n\n  const { locale } = useI18n();\n  const currentTabs = ref<RouteLocationNormalizedGeneric[]>();\n  watch([() => tabbarStore.getTabs, () => tabbarStore.updateTime, () => locale.value], ([tabs]) => {\n    currentTabs.value = tabs.map((item: any) => wrapperTabLocale(item));\n  });\n\n  /**\n   * 初始化固定标签页\n   */\n  const initAffixTabs = () => {\n    const affixTabs = filterTree(router.getRoutes(), (route: any) => {\n      return !!route.meta?.affixTab;\n    });\n    tabbarStore.setAffixTabs(affixTabs);\n  };\n\n  // 点击tab,跳转路由\n  const handleClick = (key: string) => {\n    router.push(key);\n  };\n\n  // 关闭tab\n  const handleClose = async (key: string) => {\n    await closeTabByKey(key);\n  };\n\n  function wrapperTabLocale(tab: RouteLocationNormalizedGeneric) {\n    return {\n      ...tab,\n      meta: {\n        ...tab?.meta,\n        title: $t(tab?.meta?.title as string),\n      },\n    };\n  }\n\n  watch(\n    () => accessStore.accessMenus,\n    () => {\n      initAffixTabs();\n    },\n    { immediate: true }\n  );\n\n  watch(\n    () => route.path,\n    () => {\n      const meta = route.matched?.[route.matched.length - 1]?.meta;\n      tabbarStore.addTab({\n        ...route,\n        meta: meta || route.meta,\n      });\n    },\n    { immediate: true }\n  );\n\n  const createContextMenus = (tab: TabDefinition) => {\n    const { disabledCloseAll, disabledCloseCurrent, disabledCloseLeft, disabledCloseOther, disabledCloseRight, disabledRefresh } = getTabDisableState(tab);\n\n    const affixTab = tab?.meta?.affixTab ?? false;\n\n    const menus: IContextMenuItem[] = [\n      {\n        disabled: disabledCloseCurrent,\n        handler: async () => {\n          await closeCurrentTab(tab);\n        },\n        icon: X,\n        key: \"close\",\n        text: $t(\"preferences.tabbar.contextMenu.close\"),\n      },\n      {\n        handler: async () => {\n          await toggleTabPin(tab);\n        },\n        icon: affixTab ? PinOff : Pin,\n        key: \"affix\",\n        text: affixTab ? $t(\"preferences.tabbar.contextMenu.unpin\") : $t(\"preferences.tabbar.contextMenu.pin\"),\n      },\n      {\n        handler: async () => {\n          if (!contentIsMaximize.value) {\n            await router.push(tab.fullPath);\n          }\n          toggleMaximize();\n        },\n        icon: contentIsMaximize.value ? Minimize2 : Fullscreen,\n        key: contentIsMaximize.value ? \"restore-maximize\" : \"maximize\",\n        text: contentIsMaximize.value ? $t(\"preferences.tabbar.contextMenu.restoreMaximize\") : $t(\"preferences.tabbar.contextMenu.maximize\"),\n      },\n      {\n        disabled: disabledRefresh,\n        handler: refreshTab,\n        icon: RotateCw,\n        key: \"reload\",\n        text: $t(\"preferences.tabbar.contextMenu.reload\"),\n      },\n      {\n        handler: async () => {\n          await openTabInNewWindow(tab);\n        },\n        icon: ExternalLink,\n        key: \"open-in-new-window\",\n        separator: true,\n        text: $t(\"preferences.tabbar.contextMenu.openInNewWindow\"),\n      },\n\n      {\n        disabled: disabledCloseLeft,\n        handler: async () => {\n          await closeLeftTabs(tab);\n        },\n        icon: ArrowLeftToLine,\n        key: \"close-left\",\n        text: $t(\"preferences.tabbar.contextMenu.closeLeft\"),\n      },\n      {\n        disabled: disabledCloseRight,\n        handler: async () => {\n          await closeRightTabs(tab);\n        },\n        icon: ArrowRightToLine,\n        key: \"close-right\",\n        separator: true,\n        text: $t(\"preferences.tabbar.contextMenu.closeRight\"),\n      },\n      {\n        disabled: disabledCloseOther,\n        handler: async () => {\n          await closeOtherTabs(tab);\n        },\n        icon: FoldHorizontal,\n        key: \"close-other\",\n        text: $t(\"preferences.tabbar.contextMenu.closeOther\"),\n      },\n      {\n        disabled: disabledCloseAll,\n        handler: closeAllTabs,\n        icon: ArrowRightLeft,\n        key: \"close-all\",\n        text: $t(\"preferences.tabbar.contextMenu.closeAll\"),\n      },\n    ];\n    return menus;\n  };\n\n  return {\n    createContextMenus,\n    currentActive,\n    currentTabs,\n    handleClick,\n    handleClose,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/iframe/iframe-router-view.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { RouteLocationNormalized } from \"vue-router\";\n\nimport { computed, ref } from \"vue\";\nimport { useRoute } from \"vue-router\";\n\nimport { preferences } from \"../../preferences\";\nimport { useTabbarStore } from \"../../stores\";\n\nimport { VbenSpinner } from \"../../shadcn-ui\";\n\ndefineOptions({ name: \"IFrameRouterView\" });\n\nconst spinningList = ref<boolean[]>([]);\nconst tabbarStore = useTabbarStore();\nconst route = useRoute();\n\nconst enableTabbar = computed(() => preferences.tabbar.enable);\n\nconst iframeRoutes = computed(() => {\n  if (!enableTabbar.value) {\n    return route.meta.iframeSrc ? [route] : [];\n  }\n  return tabbarStore.getTabs.filter((tab: any) => !!tab.meta?.iframeSrc);\n});\n\nconst tabNames = computed(() => new Set(iframeRoutes.value.map((item: any) => item.name as string)));\n\nconst showIframe = computed(() => iframeRoutes.value.length > 0);\n\nfunction routeShow(tabItem: RouteLocationNormalized) {\n  return tabItem.name === route.name;\n}\n\nfunction canRender(tabItem: RouteLocationNormalized) {\n  const { meta, name } = tabItem;\n\n  if (!name || !tabbarStore.renderRouteView) {\n    return false;\n  }\n\n  if (!enableTabbar.value) {\n    return routeShow(tabItem);\n  }\n\n  // 跟随 keepAlive 状态,与其他tab页保持一致\n  if (!meta?.keepAlive && tabNames.value.has(name as string) && name !== route.name) {\n    return false;\n  }\n  return tabbarStore.getTabs.some((tab: any) => tab.name === name);\n}\n\nfunction hideLoading(index: number) {\n  spinningList.value[index] = false;\n}\n\nfunction showSpinning(index: number) {\n  const curSpinning = spinningList.value[index];\n  // 首次加载时显示loading\n  return curSpinning === undefined ? true : curSpinning;\n}\n</script>\n<template>\n  <template v-if=\"showIframe\">\n    <template v-for=\"(item, index) in iframeRoutes\" :key=\"item.fullPath\">\n      <div v-if=\"canRender(item)\" v-show=\"routeShow(item)\" class=\"relative size-full\">\n        <VbenSpinner :spinning=\"showSpinning(index)\" />\n        <iframe :src=\"item.meta.iframeSrc as string\" class=\"size-full\" @load=\"hideLoading(index)\"></iframe>\n      </div>\n    </template>\n  </template>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/iframe/iframe-view.vue",
    "content": "<template>\n  <div></div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/iframe/index.ts",
    "content": "export { default as IFrameRouterView } from \"./iframe-router-view.vue\";\nexport { default as IFrameView } from \"./iframe-view.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/index.ts",
    "content": "export * from \"./basic\";\nexport * from \"./iframe\";\nexport * from \"./widgets\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/breadcrumb.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { BreadcrumbStyleType } from \"/@/vben/types\";\n\nimport type { IBreadcrumb } from \"/@/vben//shadcn-ui\";\n\nimport { computed } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\n\nimport { $t } from \"/@/locales\";\n\nimport { VbenBreadcrumbView } from \"/@/vben//shadcn-ui\";\n\ninterface Props {\n  hideWhenOnlyOne?: boolean;\n  showHome?: boolean;\n  showIcon?: boolean;\n  type?: BreadcrumbStyleType;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  showHome: false,\n  showIcon: false,\n  type: \"normal\",\n});\n\nconst route = useRoute();\nconst router = useRouter();\n\nconst breadcrumbs = computed((): IBreadcrumb[] => {\n  const matched = route.matched;\n\n  const resultBreadcrumb: IBreadcrumb[] = [];\n\n  for (const match of matched) {\n    const { meta, path } = match;\n    const { hideChildrenInMenu, hideInBreadcrumb, icon, name, title } = meta || {};\n    if (hideInBreadcrumb || hideChildrenInMenu || !path) {\n      continue;\n    }\n\n    resultBreadcrumb.push({\n      icon,\n      path: path || route.path,\n      title: title ? $t((title || name) as string) : \"\",\n    });\n  }\n  if (props.showHome) {\n    resultBreadcrumb.unshift({\n      icon: \"mdi:home-outline\",\n      isHome: true,\n      path: \"/\",\n    });\n  }\n  if (props.hideWhenOnlyOne && resultBreadcrumb.length === 1) {\n    return [];\n  }\n\n  return resultBreadcrumb;\n});\n\nfunction handleSelect(path: string) {\n  router.push(path);\n}\n</script>\n<template>\n  <VbenBreadcrumbView :breadcrumbs=\"breadcrumbs\" :show-icon=\"showIcon\" :style-type=\"type\" class=\"ml-2\" @select=\"handleSelect\" />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/check-updates/check-updates.vue",
    "content": "<script setup lang=\"ts\">\nimport { onMounted, onUnmounted, ref } from \"vue\";\n\nimport { $t } from \"/@/locales\";\n\nimport { useVbenModal } from \"../../../popup-ui\";\n\ninterface Props {\n  // 轮训时间，分钟\n  checkUpdatesInterval?: number;\n  // 检查更新的地址\n  checkUpdateUrl?: string;\n}\n\ndefineOptions({ name: \"CheckUpdates\" });\n\nconst props = withDefaults(defineProps<Props>(), {\n  checkUpdatesInterval: 1,\n  checkUpdateUrl: import.meta.env.BASE_URL || \"/\",\n});\n\nlet isCheckingUpdates = false;\nconst currentVersionTag = ref(\"\");\nconst lastVersionTag = ref(\"\");\nconst timer = ref<ReturnType<typeof setInterval>>();\n\nconst [UpdateNoticeModal, modalApi] = useVbenModal({\n  closable: false,\n  closeOnPressEscape: false,\n  closeOnClickModal: false,\n  onConfirm() {\n    lastVersionTag.value = currentVersionTag.value;\n    window.location.reload();\n    // handleSubmitLogout();\n  },\n});\n\nasync function getVersionTag() {\n  try {\n    if (location.hostname === \"localhost\" || location.hostname === \"127.0.0.1\") {\n      return null;\n    }\n    const response = await fetch(props.checkUpdateUrl, {\n      cache: \"no-cache\",\n      method: \"HEAD\",\n    });\n\n    return response.headers.get(\"etag\") || response.headers.get(\"last-modified\");\n  } catch {\n    console.error(\"Failed to fetch version tag\");\n    return null;\n  }\n}\n\nasync function checkForUpdates() {\n  const versionTag = await getVersionTag();\n  if (!versionTag) {\n    return;\n  }\n\n  // 首次运行时不提示更新\n  if (!lastVersionTag.value) {\n    lastVersionTag.value = versionTag;\n    return;\n  }\n\n  if (lastVersionTag.value !== versionTag && versionTag) {\n    clearInterval(timer.value);\n    handleNotice(versionTag);\n  }\n}\nfunction handleNotice(versionTag: string) {\n  currentVersionTag.value = versionTag;\n  modalApi.open();\n}\n\nfunction start() {\n  if (props.checkUpdatesInterval <= 0) {\n    return;\n  }\n\n  // 每 checkUpdatesInterval(默认值为1) 分钟检查一次\n  timer.value = setInterval(checkForUpdates, props.checkUpdatesInterval * 60 * 1000);\n}\n\nfunction handleVisibilitychange() {\n  if (document.hidden) {\n    stop();\n  } else {\n    if (!isCheckingUpdates) {\n      isCheckingUpdates = true;\n      checkForUpdates().finally(() => {\n        isCheckingUpdates = false;\n        start();\n      });\n    }\n  }\n}\n\nfunction stop() {\n  clearInterval(timer.value);\n}\n\nonMounted(() => {\n  start();\n  document.addEventListener(\"visibilitychange\", handleVisibilitychange);\n});\n\nonUnmounted(() => {\n  stop();\n  document.removeEventListener(\"visibilitychange\", handleVisibilitychange);\n});\n</script>\n<template>\n  <UpdateNoticeModal\n    :cancel-text=\"$t('common.cancel')\"\n    :confirm-text=\"$t('common.refresh')\"\n    :fullscreen-button=\"false\"\n    :title=\"$t('ui.widgets.checkUpdatesTitle')\"\n    centered\n    content-class=\"px-8 min-h-10\"\n    footer-class=\"border-none mb-3 mr-3\"\n    header-class=\"border-none\"\n  >\n    {{ $t(\"ui.widgets.checkUpdatesDescription\") }}\n  </UpdateNoticeModal>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/check-updates/index.ts",
    "content": "export { default as CheckUpdates } from \"./check-updates.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/color-toggle.vue",
    "content": "<script setup lang=\"ts\">\nimport type { BuiltinThemeType } from \"/@/vben/types\";\n\nimport { Palette } from \"/@/vben/icons\";\nimport { COLOR_PRESETS, preferences, updatePreferences } from \"/@/vben/preferences\";\n\nimport { VbenIconButton } from \"/@/vben//shadcn-ui\";\n\ndefineOptions({\n  name: \"AuthenticationColorToggle\",\n});\n\nfunction handleUpdate(colorPrimary: string, type: BuiltinThemeType) {\n  updatePreferences({\n    theme: {\n      colorPrimary,\n      builtinType: type,\n    },\n  });\n}\n</script>\n\n<template>\n  <div class=\"group relative flex items-center overflow-hidden\">\n    <div class=\"flex w-0 overflow-hidden transition-all duration-500 ease-out group-hover:w-60\">\n      <template v-for=\"preset in COLOR_PRESETS\" :key=\"preset.color\">\n        <VbenIconButton class=\"flex-center flex-shrink-0\" @click=\"handleUpdate(preset.color, preset.type)\">\n          <div :style=\"{ backgroundColor: preset.color }\" class=\"flex-center relative size-5 rounded-full hover:scale-110\">\n            <svg v-if=\"preferences.theme.builtinType === preset.type\" class=\"h-3.5 w-3.5 text-white\" height=\"1em\" viewBox=\"0 0 15 15\" width=\"1em\">\n              <path\n                clip-rule=\"evenodd\"\n                d=\"M11.467 3.727c.289.189.37.576.181.865l-4.25 6.5a.625.625 0 0 1-.944.12l-2.75-2.5a.625.625 0 0 1 .841-.925l2.208 2.007l3.849-5.886a.625.625 0 0 1 .865-.181\"\n                fill=\"currentColor\"\n                fill-rule=\"evenodd\"\n              />\n            </svg>\n          </div>\n        </VbenIconButton>\n      </template>\n    </div>\n\n    <VbenIconButton>\n      <Palette class=\"text-primary size-4\" />\n    </VbenIconButton>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/global-search/global-search.vue",
    "content": "<script setup lang=\"ts\">\nimport type { MenuRecordRaw } from \"../../../types\";\n\nimport { nextTick, onMounted, onUnmounted, ref, watch } from \"vue\";\n\nimport { ArrowDown, ArrowUp, CornerDownLeft, MdiKeyboardEsc, Search } from \"../../../icons\";\nimport { $t } from \"/@/locales\";\nimport { isWindowsOs } from \"../../../utils\";\n\nimport { useVbenModal } from \"../../../popup-ui\";\n\nimport { useMagicKeys, whenever } from \"@vueuse/core\";\n\nimport SearchPanel from \"./search-panel.vue\";\n\ndefineOptions({\n  name: \"GlobalSearch\",\n});\n\nconst props = withDefaults(defineProps<{ enableShortcutKey?: boolean; menus: MenuRecordRaw[] }>(), {\n  enableShortcutKey: true,\n  menus: () => [],\n});\n\nconst keyword = ref(\"\");\nconst searchInputRef = ref<HTMLInputElement>();\n\nconst [Modal, modalApi] = useVbenModal({\n  onCancel() {\n    modalApi.close();\n  },\n  onOpenChange(isOpen: boolean) {\n    if (!isOpen) {\n      keyword.value = \"\";\n    }\n  },\n});\nconst open = modalApi.useStore(state => state.isOpen);\n\nfunction handleClose() {\n  modalApi.close();\n  keyword.value = \"\";\n}\n\nconst keys = useMagicKeys();\nconst cmd = isWindowsOs() ? keys[\"ctrl+k\"] : keys[\"cmd+k\"];\nwhenever(cmd!, () => {\n  if (props.enableShortcutKey) {\n    modalApi.open();\n  }\n});\n\nwhenever(open, () => {\n  nextTick(() => {\n    searchInputRef.value?.focus();\n  });\n});\n\nconst preventDefaultBrowserSearchHotKey = (event: KeyboardEvent) => {\n  if (event.key?.toLowerCase() === \"k\" && (event.metaKey || event.ctrlKey)) {\n    event.preventDefault();\n  }\n};\n\nconst toggleKeydownListener = () => {\n  if (props.enableShortcutKey) {\n    window.addEventListener(\"keydown\", preventDefaultBrowserSearchHotKey);\n  } else {\n    window.removeEventListener(\"keydown\", preventDefaultBrowserSearchHotKey);\n  }\n};\n\nconst toggleOpen = () => {\n  open.value ? modalApi.close() : modalApi.open();\n};\n\nwatch(() => props.enableShortcutKey, toggleKeydownListener);\n\nonMounted(() => {\n  toggleKeydownListener();\n\n  onUnmounted(() => {\n    window.removeEventListener(\"keydown\", preventDefaultBrowserSearchHotKey);\n  });\n});\n</script>\n\n<template>\n  <div>\n    <Modal :fullscreen-button=\"false\" class=\"w-[600px]\" header-class=\"py-2 border-b\">\n      <template #title>\n        <div class=\"flex items-center\">\n          <Search class=\"text-muted-foreground mr-2 size-4\" />\n          <input\n            ref=\"searchInputRef\"\n            v-model=\"keyword\"\n            :placeholder=\"$t('ui.widgets.search.searchNavigate')\"\n            class=\"ring-none placeholder:text-muted-foreground w-[80%] rounded-md border border-none bg-transparent p-2 pl-0 text-sm font-normal outline-none ring-0 ring-offset-transparent focus-visible:ring-transparent\"\n          />\n        </div>\n      </template>\n\n      <SearchPanel :keyword=\"keyword\" :menus=\"menus\" @close=\"handleClose\" />\n      <template #footer>\n        <div class=\"flex w-full justify-start text-xs\">\n          <div class=\"mr-2 flex items-center\">\n            <CornerDownLeft class=\"mr-1 size-3\" />\n            {{ $t(\"ui.widgets.search.select\") }}\n          </div>\n          <div class=\"mr-2 flex items-center\">\n            <ArrowUp class=\"mr-1 size-3\" />\n            <ArrowDown class=\"mr-1 size-3\" />\n            {{ $t(\"ui.widgets.search.navigate\") }}\n          </div>\n          <div class=\"flex items-center\">\n            <MdiKeyboardEsc class=\"mr-1 size-3\" />\n            {{ $t(\"ui.widgets.search.close\") }}\n          </div>\n        </div>\n      </template>\n    </Modal>\n    <div class=\"md:bg-accent group flex h-8 cursor-pointer items-center gap-3 rounded-2xl border-none bg-none px-2 py-0.5 outline-none\" @click=\"toggleOpen()\">\n      <Search class=\"text-muted-foreground group-hover:text-foreground size-4 group-hover:opacity-100\" />\n      <span class=\"text-muted-foreground group-hover:text-foreground hidden text-xs duration-300 md:block\">\n        {{ $t(\"ui.widgets.search.title\") }}\n      </span>\n      <span\n        v-if=\"enableShortcutKey\"\n        class=\"bg-background border-foreground/60 text-muted-foreground group-hover:text-foreground relative hidden rounded-sm rounded-r-xl px-1.5 py-1 text-xs leading-none group-hover:opacity-100 md:block\"\n      >\n        {{ isWindowsOs() ? \"Ctrl\" : \"⌘\" }}\n        <kbd>K</kbd>\n      </span>\n      <span v-else></span>\n    </div>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/global-search/index.ts",
    "content": "export { default as GlobalSearch } from \"./global-search.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/global-search/search-panel.vue",
    "content": "<script setup lang=\"ts\">\nimport type { MenuRecordRaw } from \"../../../types\";\n\nimport { nextTick, onMounted, ref, shallowRef, watch } from \"vue\";\nimport { useRouter } from \"vue-router\";\n\nimport { SearchX, X } from \"../../../icons\";\nimport { $t } from \"/@/locales\";\nimport { mapTree, traverseTreeValues, uniqueByField } from \"../../../utils\";\n\nimport { VbenIcon, VbenScrollbar } from \"../../../shadcn-ui\";\nimport { isHttpUrl } from \"../../../shared/utils\";\n\nimport { onKeyStroke, useLocalStorage, useThrottleFn } from \"@vueuse/core\";\n\ndefineOptions({\n  name: \"SearchPanel\",\n});\n\nconst props = withDefaults(defineProps<{ keyword: string; menus: MenuRecordRaw[] }>(), {\n  keyword: \"\",\n  menus: () => [],\n});\nconst emit = defineEmits<{ close: [] }>();\n\nconst router = useRouter();\nconst searchHistory = useLocalStorage<MenuRecordRaw[]>(`__search-history-${location.hostname}__`, []);\nconst activeIndex = ref(-1);\nconst searchItems = shallowRef<MenuRecordRaw[]>([]);\nconst searchResults = ref<MenuRecordRaw[]>([]);\n\nconst handleSearch = useThrottleFn(search, 200);\n\n// 搜索函数，用于根据搜索关键词查找匹配的菜单项\nfunction search(searchKey: string) {\n  // 去除搜索关键词的前后空格\n  searchKey = searchKey.trim();\n\n  // 如果搜索关键词为空，清空搜索结果并返回\n  if (!searchKey) {\n    searchResults.value = [];\n    return;\n  }\n\n  // 使用搜索关键词创建正则表达式\n  const reg = createSearchReg(searchKey);\n\n  // 初始化结果数组\n  const results: MenuRecordRaw[] = [];\n\n  // 遍历搜索项\n  traverseTreeValues(searchItems.value, (item: any) => {\n    // 如果菜单项的名称匹配正则表达式，将其添加到结果数组中\n    if (reg.test(item.name?.toLowerCase())) {\n      results.push(item);\n    }\n  });\n\n  // 更新搜索结果\n  searchResults.value = results;\n\n  // 如果有搜索结果，设置索引为 0\n  if (results.length > 0) {\n    activeIndex.value = 0;\n  }\n\n  // 赋值索引为 0\n  activeIndex.value = 0;\n}\n\n// When the keyboard up and down keys move to an invisible place\n// the scroll bar needs to scroll automatically\nfunction scrollIntoView() {\n  const element = document.querySelector(`[data-search-item=\"${activeIndex.value}\"]`);\n\n  if (element) {\n    element.scrollIntoView({ block: \"nearest\" });\n  }\n}\n\n// enter keyboard event\nasync function handleEnter() {\n  if (searchResults.value.length === 0) {\n    return;\n  }\n  const result = searchResults.value;\n  const index = activeIndex.value;\n  if (result.length === 0 || index < 0) {\n    return;\n  }\n  const to = result[index];\n  if (to) {\n    searchHistory.value.push(to);\n    handleClose();\n    await nextTick();\n    if (isHttpUrl(to.path)) {\n      window.open(to.path, \"_blank\");\n    } else {\n      router.push({ path: to.path, replace: true });\n    }\n  }\n}\n\n// Arrow key up\nfunction handleUp() {\n  if (searchResults.value.length === 0) {\n    return;\n  }\n  activeIndex.value--;\n  if (activeIndex.value < 0) {\n    activeIndex.value = searchResults.value.length - 1;\n  }\n  scrollIntoView();\n}\n\n// Arrow key down\nfunction handleDown() {\n  if (searchResults.value.length === 0) {\n    return;\n  }\n  activeIndex.value++;\n  if (activeIndex.value > searchResults.value.length - 1) {\n    activeIndex.value = 0;\n  }\n  scrollIntoView();\n}\n\n// close search modal\nfunction handleClose() {\n  searchResults.value = [];\n  emit(\"close\");\n}\n\n// Activate when the mouse moves to a certain line\nfunction handleMouseenter(e: MouseEvent) {\n  const index = (e.target as HTMLElement)?.dataset.index;\n  activeIndex.value = Number(index);\n}\n\nfunction removeItem(index: number) {\n  if (props.keyword) {\n    searchResults.value.splice(index, 1);\n  } else {\n    searchHistory.value.splice(index, 1);\n  }\n  activeIndex.value = Math.max(activeIndex.value - 1, 0);\n  scrollIntoView();\n}\n\n// 存储所有需要转义的特殊字符\nconst code = new Set([\"$\", \"(\", \")\", \"*\", \"+\", \".\", \"?\", \"[\", \"\\\\\", \"]\", \"^\", \"{\", \"|\", \"}\"]);\n\n// 转换函数，用于转义特殊字符\nfunction transform(c: string) {\n  // 如果字符在特殊字符列表中，返回转义后的字符\n  // 如果不在，返回字符本身\n  return code.has(c) ? `\\\\${c}` : c;\n}\n\n// 创建搜索正则表达式\nfunction createSearchReg(key: string) {\n  // 将输入的字符串拆分为单个字符\n  // 对每个字符进行转义\n  // 然后用'.*'连接所有字符，创建正则表达式\n  const keys = [...key].map(item => transform(item)).join(\".*\");\n  // 返回创建的正则表达式\n  return new RegExp(`.*${keys}.*`);\n}\n\nwatch(\n  () => props.keyword,\n  val => {\n    if (val) {\n      handleSearch(val);\n    } else {\n      searchResults.value = [...searchHistory.value];\n    }\n  }\n);\n\nonMounted(() => {\n  searchItems.value = mapTree(props.menus, (item: any) => {\n    return {\n      ...item,\n      name: $t(item?.name),\n    };\n  });\n  if (searchHistory.value.length > 0) {\n    searchResults.value = searchHistory.value;\n  }\n  // enter search\n  onKeyStroke(\"Enter\", handleEnter);\n  // Monitor keyboard arrow keys\n  onKeyStroke(\"ArrowUp\", handleUp);\n  onKeyStroke(\"ArrowDown\", handleDown);\n  // esc close\n  onKeyStroke(\"Escape\", handleClose);\n});\n</script>\n\n<template>\n  <VbenScrollbar>\n    <div class=\"!flex h-full justify-center px-2 sm:max-h-[450px]\">\n      <!-- 无搜索结果 -->\n      <div v-if=\"keyword && searchResults.length === 0\" class=\"text-muted-foreground text-center\">\n        <SearchX class=\"mx-auto mt-4 size-12\" />\n        <p class=\"mb-10 mt-6 text-xs\">\n          {{ $t(\"ui.widgets.search.noResults\") }}\n          <span class=\"text-foreground text-sm font-medium\"> \"{{ keyword }}\" </span>\n        </p>\n      </div>\n      <!-- 历史搜索记录 & 没有搜索结果 -->\n      <div v-if=\"!keyword && searchResults.length === 0\" class=\"text-muted-foreground text-center\">\n        <p class=\"my-10 text-xs\">\n          {{ $t(\"ui.widgets.search.noRecent\") }}\n        </p>\n      </div>\n\n      <ul v-show=\"searchResults.length > 0\" class=\"w-full\">\n        <li v-if=\"searchHistory.length > 0 && !keyword\" class=\"text-muted-foreground mb-2 text-xs\">\n          {{ $t(\"ui.widgets.search.recent\") }}\n        </li>\n        <li\n          v-for=\"(item, index) in uniqueByField(searchResults, 'path')\"\n          :key=\"item.path\"\n          :class=\"activeIndex === index ? 'active bg-primary text-primary-foreground' : ''\"\n          :data-index=\"index\"\n          :data-search-item=\"index\"\n          class=\"bg-accent flex-center group mb-3 w-full cursor-pointer rounded-lg px-4 py-4\"\n          @click=\"handleEnter\"\n          @mouseenter=\"handleMouseenter\"\n        >\n          <VbenIcon :icon=\"item.icon\" class=\"mr-2 size-5 flex-shrink-0\" fallback />\n\n          <span class=\"flex-1\">{{ item.name }}</span>\n          <div class=\"flex-center dark:hover:bg-accent hover:text-primary-foreground rounded-full p-1 hover:scale-110\" @click.stop=\"removeItem(index)\">\n            <X class=\"size-4\" />\n          </div>\n        </li>\n      </ul>\n    </div>\n  </VbenScrollbar>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/index.ts",
    "content": "export { default as Breadcrumb } from \"./breadcrumb.vue\";\nexport * from \"./check-updates\";\nexport { default as AuthenticationColorToggle } from \"./color-toggle.vue\";\nexport * from \"./global-search\";\nexport { default as LanguageToggle } from \"./language-toggle.vue\";\nexport { default as AuthenticationLayoutToggle } from \"./layout-toggle.vue\";\nexport * from \"./lock-screen\";\nexport * from \"./notification\";\nexport * from \"./preferences\";\nexport * from \"./theme-toggle\";\nexport * from \"./user-dropdown\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/language-toggle.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SupportedLanguagesType } from \"/@/locales\";\n\nimport { SUPPORT_LANGUAGES } from \"/@/vben/constants\";\nimport { Languages } from \"/@/vben/icons\";\nimport { loadLocaleMessages } from \"/@/locales\";\nimport { preferences, updatePreferences } from \"/@/vben/preferences\";\n\nimport { VbenDropdownRadioMenu, VbenIconButton } from \"/@/vben//shadcn-ui\";\n\ndefineOptions({\n  name: \"LanguageToggle\",\n});\n\nasync function handleUpdate(value: string) {\n  const locale = value as SupportedLanguagesType;\n  updatePreferences({\n    app: {\n      locale,\n    },\n  });\n  await loadLocaleMessages(locale);\n}\n</script>\n\n<template>\n  <div>\n    <VbenDropdownRadioMenu :menus=\"SUPPORT_LANGUAGES\" :model-value=\"preferences.app.locale\" @update:model-value=\"handleUpdate\">\n      <VbenIconButton>\n        <Languages class=\"text-foreground size-4\" />\n      </VbenIconButton>\n    </VbenDropdownRadioMenu>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/layout-toggle.vue",
    "content": "<script setup lang=\"ts\">\nimport type { AuthPageLayoutType } from \"/@/vben/types\";\n\nimport type { VbenDropdownMenuItem } from \"/@/vben//shadcn-ui\";\n\nimport { computed } from \"vue\";\n\nimport { InspectionPanel, PanelLeft, PanelRight } from \"/@/vben/icons\";\nimport { $t } from \"/@/locales\";\nimport { preferences, updatePreferences, usePreferences } from \"/@/vben/preferences\";\n\nimport { VbenDropdownRadioMenu, VbenIconButton } from \"/@/vben//shadcn-ui\";\n\ndefineOptions({\n  name: \"AuthenticationLayoutToggle\",\n});\n\nconst menus = computed((): VbenDropdownMenuItem[] => [\n  {\n    icon: PanelLeft,\n    label: $t(\"authentication.layout.alignLeft\"),\n    value: \"panel-left\",\n  },\n  {\n    icon: InspectionPanel,\n    label: $t(\"authentication.layout.center\"),\n    value: \"panel-center\",\n  },\n  {\n    icon: PanelRight,\n    label: $t(\"authentication.layout.alignRight\"),\n    value: \"panel-right\",\n  },\n]);\n\nconst { authPanelCenter, authPanelLeft, authPanelRight } = usePreferences();\n\nfunction handleUpdate(value: string) {\n  updatePreferences({\n    app: {\n      authPageLayout: value as AuthPageLayoutType,\n    },\n  });\n}\n</script>\n\n<template>\n  <VbenDropdownRadioMenu :menus=\"menus\" :model-value=\"preferences.app.authPageLayout\" @update:model-value=\"handleUpdate\">\n    <VbenIconButton>\n      <PanelRight v-if=\"authPanelRight\" class=\"size-4\" />\n      <PanelLeft v-if=\"authPanelLeft\" class=\"size-4\" />\n      <InspectionPanel v-if=\"authPanelCenter\" class=\"size-4\" />\n    </VbenIconButton>\n  </VbenDropdownRadioMenu>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/lock-screen/index.ts",
    "content": "export { default as LockScreenModal } from \"./lock-screen-modal.vue\";\nexport { default as LockScreen } from \"./lock-screen.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/lock-screen/lock-screen-modal.vue",
    "content": "<script setup lang=\"ts\">\nimport type { Recordable } from \"../../../types\";\n\nimport { computed, reactive } from \"vue\";\n\nimport { $t } from \"/@/locales\";\n\nimport { useVbenForm, z } from \"../../../form-ui\";\nimport { useVbenModal } from \"../../../popup-ui\";\nimport { VbenAvatar, VbenButton } from \"../../../shadcn-ui\";\n\ninterface Props {\n  avatar?: string;\n  text?: string;\n}\n\ndefineOptions({\n  name: \"LockScreenModal\",\n});\n\nwithDefaults(defineProps<Props>(), {\n  avatar: \"\",\n  text: \"\",\n});\n\nconst emit = defineEmits<{\n  submit: [Recordable<any>];\n}>();\n\nconst [Form, { resetForm, validate, getValues }] = useVbenForm(\n  reactive({\n    commonConfig: {\n      hideLabel: true,\n      hideRequiredMark: true,\n    },\n    schema: computed(() => [\n      {\n        component: \"VbenInputPassword\" as const,\n        componentProps: {\n          placeholder: $t(\"ui.widgets.lockScreen.placeholder\"),\n        },\n        fieldName: \"lockScreenPassword\",\n        formFieldProps: { validateOnBlur: false },\n        label: $t(\"authentication.password\"),\n        rules: z.string().min(1, { message: $t(\"ui.widgets.lockScreen.placeholder\") }),\n      },\n    ]),\n    showDefaultActions: false,\n  })\n);\n\nconst [Modal] = useVbenModal({\n  onConfirm() {\n    handleSubmit();\n  },\n  onOpenChange(isOpen) {\n    if (isOpen) {\n      resetForm();\n    }\n  },\n});\n\nasync function handleSubmit() {\n  const { valid } = await validate();\n  const values = await getValues();\n  if (valid) {\n    emit(\"submit\", values?.lockScreenPassword);\n  }\n}\n</script>\n\n<template>\n  <Modal :footer=\"false\" :fullscreen-button=\"false\" :title=\"$t('ui.widgets.lockScreen.title')\">\n    <div class=\"mb-10 flex w-full flex-col items-center px-10\" @keydown.enter.prevent=\"handleSubmit\">\n      <div class=\"w-full\">\n        <div class=\"ml-2 flex w-full flex-col items-center\">\n          <VbenAvatar :src=\"avatar\" class=\"size-20\" dot-class=\"bottom-0 right-1 border-2 size-4 bg-green-500\" />\n          <div class=\"text-foreground my-6 flex items-center font-medium\">\n            {{ text }}\n          </div>\n        </div>\n        <Form />\n        <VbenButton class=\"mt-1 w-full\" @click=\"handleSubmit\">\n          {{ $t(\"ui.widgets.lockScreen.screenButton\") }}\n        </VbenButton>\n      </div>\n    </div>\n  </Modal>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/lock-screen/lock-screen.vue",
    "content": "<script setup lang=\"ts\">\nimport { computed, reactive, ref } from \"vue\";\n\nimport { LockKeyhole } from \"../../../icons\";\nimport { $t, useI18n } from \"/@/locales\";\nimport { storeToRefs, useLockStore } from \"../../../stores\";\n\nimport { useScrollLock } from \"../../../composables\";\nimport { useVbenForm, z } from \"../../../form-ui\";\nimport { VbenAvatar, VbenButton } from \"../../../shadcn-ui\";\n\nimport { useDateFormat, useNow } from \"@vueuse/core\";\n\ninterface Props {\n  avatar?: string;\n}\n\ndefineOptions({\n  name: \"LockScreen\",\n});\n\nwithDefaults(defineProps<Props>(), {\n  avatar: \"\",\n});\n\ndefineEmits<{ toLogin: [] }>();\n\nconst { locale } = useI18n();\nconst lockStore = useLockStore();\n\nconst now = useNow();\nconst meridiem = useDateFormat(now, \"A\");\nconst hour = useDateFormat(now, \"HH\");\nconst minute = useDateFormat(now, \"mm\");\nconst date = useDateFormat(now, \"YYYY-MM-DD dddd\", { locales: locale.value });\n\nconst showUnlockForm = ref(false);\nconst { lockScreenPassword } = storeToRefs(lockStore);\n\nconst [Form, { form, validate }] = useVbenForm(\n  reactive({\n    commonConfig: {\n      hideLabel: true,\n      hideRequiredMark: true,\n    },\n    schema: computed(() => [\n      {\n        component: \"VbenInputPassword\" as const,\n        componentProps: {\n          placeholder: $t(\"ui.widgets.lockScreen.placeholder\"),\n        },\n        fieldName: \"password\",\n        label: $t(\"authentication.password\"),\n        rules: z.string().min(1, { message: $t(\"authentication.passwordTip\") }),\n      },\n    ]),\n    showDefaultActions: false,\n  })\n);\n\nconst validPass = computed(() => lockScreenPassword?.value === form?.values?.password);\n\nasync function handleSubmit() {\n  const { valid } = await validate();\n  if (valid) {\n    if (validPass.value) {\n      lockStore.unlockScreen();\n    } else {\n      form.setFieldError(\"password\", $t(\"authentication.passwordErrorTip\"));\n    }\n  }\n}\n\nfunction toggleUnlockForm() {\n  showUnlockForm.value = !showUnlockForm.value;\n}\n\nuseScrollLock();\n</script>\n\n<template>\n  <div class=\"bg-background fixed z-[2000] size-full\">\n    <transition name=\"slide-left\">\n      <div v-show=\"!showUnlockForm\" class=\"size-full\">\n        <div class=\"flex-col-center text-foreground/80 hover:text-foreground group my-4 cursor-pointer text-xl font-semibold\" @click=\"toggleUnlockForm\">\n          <LockKeyhole class=\"size-5 transition-all duration-300 group-hover:scale-125\" />\n          <span>{{ $t(\"ui.widgets.lockScreen.unlock\") }}</span>\n        </div>\n        <div class=\"flex h-full justify-center px-[10%]\">\n          <div class=\"bg-accent flex-center relative mb-14 mr-20 h-4/5 w-2/5 flex-auto rounded-3xl text-center text-[260px]\">\n            <span class=\"absolute left-4 top-4 text-xl font-semibold\">\n              {{ meridiem }}\n            </span>\n            {{ hour }}\n          </div>\n          <div class=\"bg-accent flex-center mb-14 h-4/5 w-2/5 flex-auto rounded-3xl text-center text-[260px]\">\n            {{ minute }}\n          </div>\n        </div>\n      </div>\n    </transition>\n\n    <transition name=\"slide-right\">\n      <div v-if=\"showUnlockForm\" class=\"flex-center size-full\" @keydown.enter.prevent=\"handleSubmit\">\n        <div class=\"flex-col-center mb-10 w-[300px]\">\n          <VbenAvatar :src=\"avatar\" class=\"enter-x mb-6 size-20\" />\n\n          <div class=\"enter-x mb-2 w-full items-center\">\n            <Form />\n          </div>\n          <VbenButton class=\"enter-x w-full\" @click=\"handleSubmit\">\n            {{ $t(\"ui.widgets.lockScreen.entry\") }}\n          </VbenButton>\n          <VbenButton class=\"enter-x my-2 w-full\" variant=\"ghost\" @click=\"$emit('toLogin')\">\n            {{ $t(\"ui.widgets.lockScreen.backToLogin\") }}\n          </VbenButton>\n          <VbenButton class=\"enter-x mr-2 w-full\" variant=\"ghost\" @click=\"toggleUnlockForm\">\n            {{ $t(\"common.back\") }}\n          </VbenButton>\n        </div>\n      </div>\n    </transition>\n\n    <div class=\"enter-y absolute bottom-5 w-full text-center xl:text-xl 2xl:text-3xl\">\n      <div v-if=\"showUnlockForm\" class=\"enter-x mb-2 text-3xl\">\n        {{ hour }}:{{ minute }} <span class=\"text-lg\">{{ meridiem }}</span>\n      </div>\n      <div class=\"text-3xl\">{{ date }}</div>\n    </div>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/notification/index.ts",
    "content": "export { default as Notification } from \"./notification.vue\";\n\nexport type * from \"./types\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/notification/notification.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { NotificationItem } from \"./types\";\n\nimport { Bell, MailCheck } from \"/@/vben/icons\";\nimport { $t } from \"/@/locales\";\n\nimport { VbenButton, VbenIconButton, VbenPopover, VbenScrollbar } from \"/@/vben//shadcn-ui\";\n\nimport { useToggle } from \"@vueuse/core\";\n\ninterface Props {\n  /**\n   * 显示圆点\n   */\n  dot?: boolean;\n  /**\n   * 消息列表\n   */\n  notifications?: NotificationItem[];\n}\n\ndefineOptions({ name: \"NotificationPopup\" });\n\nwithDefaults(defineProps<Props>(), {\n  dot: false,\n  notifications: () => [],\n});\n\nconst emit = defineEmits<{\n  clear: [];\n  makeAll: [];\n  read: [NotificationItem];\n  viewAll: [];\n}>();\n\nconst [open, toggle] = useToggle();\n\nfunction close() {\n  open.value = false;\n}\n\nfunction handleViewAll() {\n  emit(\"viewAll\");\n  close();\n}\n\nfunction handleMakeAll() {\n  emit(\"makeAll\");\n}\n\nfunction handleClear() {\n  emit(\"clear\");\n}\n\nfunction handleClick(item: NotificationItem) {\n  emit(\"read\", item);\n}\n</script>\n<template>\n  <VbenPopover v-model:open=\"open\" content-class=\"relative right-2 w-[360px] p-0\">\n    <template #trigger>\n      <div class=\"flex-center mr-2 h-full\" @click.stop=\"toggle()\">\n        <VbenIconButton class=\"bell-button text-foreground relative\">\n          <span v-if=\"dot\" class=\"bg-primary absolute right-0.5 top-0.5 h-2 w-2 rounded\"></span>\n          <Bell class=\"size-4\" />\n        </VbenIconButton>\n      </div>\n    </template>\n\n    <div class=\"relative\">\n      <div class=\"flex items-center justify-between p-4 py-3\">\n        <div class=\"text-foreground\">{{ $t(\"ui.widgets.notifications\") }}</div>\n        <VbenIconButton :disabled=\"notifications.length <= 0\" :tooltip=\"$t('ui.widgets.markAllAsRead')\" @click=\"handleMakeAll\">\n          <MailCheck class=\"size-4\" />\n        </VbenIconButton>\n      </div>\n      <VbenScrollbar v-if=\"notifications.length > 0\">\n        <ul class=\"!flex max-h-[360px] w-full flex-col\">\n          <template v-for=\"item in notifications\" :key=\"item.title\">\n            <li class=\"hover:bg-accent border-border relative flex w-full cursor-pointer items-start gap-5 border-t px-3 py-3\" @click=\"handleClick(item)\">\n              <span v-if=\"!item.isRead\" class=\"bg-primary absolute right-2 top-2 h-2 w-2 rounded\"></span>\n\n              <span class=\"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\">\n                <img :src=\"item.avatar\" class=\"aspect-square h-full w-full object-cover\" role=\"img\" />\n              </span>\n              <div class=\"flex flex-col gap-1 leading-none\">\n                <p class=\"font-semibold\">{{ item.title }}</p>\n                <p class=\"text-muted-foreground my-1 line-clamp-2 text-xs\">\n                  {{ item.message }}\n                </p>\n                <p class=\"text-muted-foreground line-clamp-2 text-xs\">\n                  {{ item.date }}\n                </p>\n              </div>\n            </li>\n          </template>\n        </ul>\n      </VbenScrollbar>\n\n      <template v-else>\n        <div class=\"flex-center text-muted-foreground min-h-[150px] w-full\">\n          {{ $t(\"common.noData\") }}\n        </div>\n      </template>\n\n      <div class=\"border-border flex items-center justify-between border-t px-4 py-3\">\n        <VbenButton :disabled=\"notifications.length <= 0\" size=\"sm\" variant=\"ghost\" @click=\"handleClear\">\n          {{ $t(\"ui.widgets.clearNotifications\") }}\n        </VbenButton>\n        <VbenButton size=\"sm\" @click=\"handleViewAll\">\n          {{ $t(\"ui.widgets.viewAll\") }}\n        </VbenButton>\n      </div>\n    </div>\n  </VbenPopover>\n</template>\n\n<style scoped>\n:deep(.bell-button) {\n  &:hover {\n    svg {\n      animation: bell-ring 1s both;\n    }\n  }\n}\n\n@keyframes bell-ring {\n  0%,\n  100% {\n    transform-origin: top;\n  }\n\n  15% {\n    transform: rotateZ(10deg);\n  }\n\n  30% {\n    transform: rotateZ(-10deg);\n  }\n\n  45% {\n    transform: rotateZ(5deg);\n  }\n\n  60% {\n    transform: rotateZ(-5deg);\n  }\n\n  75% {\n    transform: rotateZ(2deg);\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/notification/types.ts",
    "content": "interface NotificationItem {\n  avatar: string;\n  date: string;\n  isRead?: boolean;\n  message: string;\n  title: string;\n}\n\nexport type { NotificationItem };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/block.vue",
    "content": "<script setup lang=\"ts\">\ninterface Props {\n  title?: string;\n}\n\ndefineOptions({\n  name: \"PreferenceBlock\",\n});\n\nwithDefaults(defineProps<Props>(), {\n  title: \"\",\n});\n</script>\n\n<template>\n  <div class=\"flex flex-col py-4\">\n    <h3 class=\"mb-3 font-semibold leading-none tracking-tight\">\n      {{ title }}\n    </h3>\n    <slot></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/general/animation.vue",
    "content": "<script setup lang=\"ts\">\nimport { $t } from \"/@/locales\";\n\nimport SwitchItem from \"../switch-item.vue\";\n\ndefineOptions({\n  name: \"PreferenceAnimation\",\n});\n\nconst transitionProgress = defineModel<boolean>(\"transitionProgress\", {\n  // 默认值\n  default: false,\n});\nconst transitionName = defineModel<string>(\"transitionName\");\nconst transitionEnable = defineModel<boolean>(\"transitionEnable\");\nconst transitionLoading = defineModel<boolean>(\"transitionLoading\");\n\nconst transitionPreset = [\"fade\", \"fade-slide\", \"fade-up\", \"fade-down\"];\n\nfunction handleClick(value: string) {\n  transitionName.value = value;\n}\n</script>\n\n<template>\n  <SwitchItem v-model=\"transitionProgress\">\n    {{ $t(\"preferences.animation.progress\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"transitionLoading\">\n    {{ $t(\"preferences.animation.loading\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"transitionEnable\">\n    {{ $t(\"preferences.animation.transition\") }}\n  </SwitchItem>\n  <div v-if=\"transitionEnable\" class=\"mb-2 mt-3 flex justify-between gap-3 px-2\">\n    <div\n      v-for=\"item in transitionPreset\"\n      :key=\"item\"\n      :class=\"{\n        'outline-box-active': transitionName === item,\n      }\"\n      class=\"outline-box p-2\"\n      @click=\"handleClick(item)\"\n    >\n      <div :class=\"`${item}-slow`\" class=\"bg-accent h-10 w-12 rounded-md\"></div>\n    </div>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/general/general.vue",
    "content": "<script setup lang=\"ts\">\nimport { SUPPORT_LANGUAGES } from \"/@/vben/constants\";\nimport { $t } from \"/@/locales\";\n\nimport SelectItem from \"../select-item.vue\";\nimport SwitchItem from \"../switch-item.vue\";\n\ndefineOptions({\n  name: \"PreferenceGeneralConfig\",\n});\n\nconst appLocale = defineModel<string>(\"appLocale\");\nconst appDynamicTitle = defineModel<boolean>(\"appDynamicTitle\");\nconst appWatermark = defineModel<boolean>(\"appWatermark\");\nconst appEnableCheckUpdates = defineModel<boolean>(\"appEnableCheckUpdates\");\n</script>\n\n<template>\n  <SelectItem v-model=\"appLocale\" :items=\"SUPPORT_LANGUAGES\">\n    {{ $t(\"preferences.language\") }}\n  </SelectItem>\n  <SwitchItem v-model=\"appDynamicTitle\">\n    {{ $t(\"preferences.dynamicTitle\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"appWatermark\">\n    {{ $t(\"preferences.watermark\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"appEnableCheckUpdates\">\n    {{ $t(\"preferences.checkUpdates\") }}\n  </SwitchItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/index.ts",
    "content": "export { default as Block } from \"./block.vue\";\nexport { default as Animation } from \"./general/animation.vue\";\nexport { default as General } from \"./general/general.vue\";\nexport { default as Breadcrumb } from \"./layout/breadcrumb.vue\";\nexport { default as Content } from \"./layout/content.vue\";\nexport { default as Copyright } from \"./layout/copyright.vue\";\nexport { default as Footer } from \"./layout/footer.vue\";\nexport { default as Header } from \"./layout/header.vue\";\nexport { default as Layout } from \"./layout/layout.vue\";\nexport { default as Navigation } from \"./layout/navigation.vue\";\nexport { default as Sidebar } from \"./layout/sidebar.vue\";\nexport { default as Tabbar } from \"./layout/tabbar.vue\";\nexport { default as Widget } from \"./layout/widget.vue\";\nexport { default as GlobalShortcutKeys } from \"./shortcut-keys/global.vue\";\nexport { default as SwitchItem } from \"./switch-item.vue\";\nexport { default as BuiltinTheme } from \"./theme/builtin.vue\";\nexport { default as ColorMode } from \"./theme/color-mode.vue\";\nexport { default as Radius } from \"./theme/radius.vue\";\nexport { default as Theme } from \"./theme/theme.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/input-item.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectOption } from \"/@/vben/types\";\n\nimport { useSlots } from \"vue\";\n\nimport { CircleHelp } from \"/@/vben/icons\";\n\nimport { Input, VbenTooltip } from \"/@/vben//shadcn-ui\";\n\ndefineOptions({\n  name: \"PreferenceSelectItem\",\n});\n\nwithDefaults(\n  defineProps<{\n    disabled?: boolean;\n    items?: SelectOption[];\n    placeholder?: string;\n  }>(),\n  {\n    disabled: false,\n    placeholder: \"\",\n    items: () => [],\n  }\n);\n\nconst inputValue = defineModel<string>();\n\nconst slots = useSlots();\n</script>\n\n<template>\n  <div\n    :class=\"{\n      'hover:bg-accent': !slots.tip,\n      'pointer-events-none opacity-50': disabled,\n    }\"\n    class=\"my-1 flex w-full items-center justify-between rounded-md px-2 py-1\"\n  >\n    <span class=\"flex items-center text-sm\">\n      <slot></slot>\n\n      <VbenTooltip v-if=\"slots.tip\" side=\"bottom\">\n        <template #trigger>\n          <CircleHelp class=\"ml-1 size-3 cursor-help\" />\n        </template>\n        <slot name=\"tip\"></slot>\n      </VbenTooltip>\n    </span>\n    <Input v-model=\"inputValue\" class=\"h-8 w-[165px]\" />\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/layout/breadcrumb.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectOption } from \"/@/vben/types\";\n\nimport { computed } from \"vue\";\n\nimport { $t } from \"/@/locales\";\n\nimport SwitchItem from \"../switch-item.vue\";\nimport ToggleItem from \"../toggle-item.vue\";\n\ndefineOptions({\n  name: \"PreferenceBreadcrumbConfig\",\n});\n\nconst props = defineProps<{ disabled?: boolean }>();\n\nconst breadcrumbEnable = defineModel<boolean>(\"breadcrumbEnable\");\nconst breadcrumbShowIcon = defineModel<boolean>(\"breadcrumbShowIcon\");\nconst breadcrumbStyleType = defineModel<string>(\"breadcrumbStyleType\");\nconst breadcrumbShowHome = defineModel<boolean>(\"breadcrumbShowHome\");\nconst breadcrumbHideOnlyOne = defineModel<boolean>(\"breadcrumbHideOnlyOne\");\n\nconst typeItems: SelectOption[] = [\n  { label: $t(\"preferences.normal\"), value: \"normal\" },\n  { label: $t(\"preferences.breadcrumb.background\"), value: \"background\" },\n];\n\nconst disableItem = computed(() => {\n  return !breadcrumbEnable.value || props.disabled;\n});\n</script>\n\n<template>\n  <SwitchItem v-model=\"breadcrumbEnable\" :disabled=\"disabled\">\n    {{ $t(\"preferences.breadcrumb.enable\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"breadcrumbHideOnlyOne\" :disabled=\"disableItem\">\n    {{ $t(\"preferences.breadcrumb.hideOnlyOne\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"breadcrumbShowIcon\" :disabled=\"disableItem\">\n    {{ $t(\"preferences.breadcrumb.icon\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"breadcrumbShowHome\" :disabled=\"disableItem || !breadcrumbShowIcon\">\n    {{ $t(\"preferences.breadcrumb.home\") }}\n  </SwitchItem>\n  <ToggleItem v-model=\"breadcrumbStyleType\" :disabled=\"disableItem\" :items=\"typeItems\">\n    {{ $t(\"preferences.breadcrumb.style\") }}\n  </ToggleItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/layout/content.vue",
    "content": "<script setup lang=\"ts\">\nimport type { Component } from \"vue\";\n\nimport { computed } from \"vue\";\n\nimport { $t } from \"/@/locales\";\n\nimport { ContentCompact, ContentWide } from \"../../icons\";\n\ndefineOptions({\n  name: \"PreferenceLayoutContent\",\n});\n\nconst modelValue = defineModel<string>({ default: \"wide\" });\n\nconst components: Record<string, Component> = {\n  compact: ContentCompact,\n  wide: ContentWide,\n};\n\nconst PRESET = computed(() => [\n  {\n    name: $t(\"preferences.wide\"),\n    type: \"wide\",\n  },\n  {\n    name: $t(\"preferences.compact\"),\n    type: \"compact\",\n  },\n]);\n\nfunction activeClass(theme: string): string[] {\n  return theme === modelValue.value ? [\"outline-box-active\"] : [];\n}\n</script>\n\n<template>\n  <div class=\"flex w-full gap-5\">\n    <template v-for=\"theme in PRESET\" :key=\"theme.name\">\n      <div class=\"flex w-[100px] cursor-pointer flex-col\" @click=\"modelValue = theme.type\">\n        <div :class=\"activeClass(theme.type)\" class=\"outline-box flex-center\">\n          <component :is=\"components[theme.type]\" />\n        </div>\n        <div class=\"text-muted-foreground mt-2 text-center text-xs\">\n          {{ theme.name }}\n        </div>\n      </div>\n    </template>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/layout/copyright.vue",
    "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { $t } from \"/@/locales\";\n\nimport InputItem from \"../input-item.vue\";\nimport SwitchItem from \"../switch-item.vue\";\n\nconst props = defineProps<{ disabled: boolean }>();\n\nconst copyrightEnable = defineModel<boolean>(\"copyrightEnable\");\nconst copyrightDate = defineModel<string>(\"copyrightDate\");\nconst copyrightIcp = defineModel<string>(\"copyrightIcp\");\nconst copyrightIcpLink = defineModel<string>(\"copyrightIcpLink\");\nconst copyrightCompanyName = defineModel<string>(\"copyrightCompanyName\");\nconst copyrightCompanySiteLink = defineModel<string>(\"copyrightCompanySiteLink\");\n\nconst itemDisabled = computed(() => props.disabled || !copyrightEnable.value);\n</script>\n\n<template>\n  <SwitchItem v-model=\"copyrightEnable\" :disabled=\"disabled\">\n    {{ $t(\"preferences.copyright.enable\") }}\n  </SwitchItem>\n\n  <InputItem v-model=\"copyrightCompanyName\" :disabled=\"itemDisabled\">\n    {{ $t(\"preferences.copyright.companyName\") }}\n  </InputItem>\n  <InputItem v-model=\"copyrightCompanySiteLink\" :disabled=\"itemDisabled\">\n    {{ $t(\"preferences.copyright.companySiteLink\") }}\n  </InputItem>\n  <InputItem v-model=\"copyrightDate\" :disabled=\"itemDisabled\">\n    {{ $t(\"preferences.copyright.date\") }}\n  </InputItem>\n\n  <InputItem v-model=\"copyrightIcp\" :disabled=\"itemDisabled\">\n    {{ $t(\"preferences.copyright.icp\") }}\n  </InputItem>\n  <InputItem v-model=\"copyrightIcpLink\" :disabled=\"itemDisabled\">\n    {{ $t(\"preferences.copyright.icpLink\") }}\n  </InputItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/layout/footer.vue",
    "content": "<script setup lang=\"ts\">\nimport { $t } from \"/@/locales\";\n\nimport SwitchItem from \"../switch-item.vue\";\n\nconst footerEnable = defineModel<boolean>(\"footerEnable\");\nconst footerFixed = defineModel<boolean>(\"footerFixed\");\n</script>\n\n<template>\n  <SwitchItem v-model=\"footerEnable\">\n    {{ $t(\"preferences.footer.visible\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"footerFixed\" :disabled=\"!footerEnable\">\n    {{ $t(\"preferences.footer.fixed\") }}\n  </SwitchItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/layout/header.vue",
    "content": "<script setup lang=\"ts\">\nimport type { LayoutHeaderMenuAlignType, LayoutHeaderModeType, SelectOption } from \"/@/vben/types\";\n\nimport { $t } from \"/@/locales\";\n\nimport SelectItem from \"../select-item.vue\";\nimport SwitchItem from \"../switch-item.vue\";\nimport ToggleItem from \"../toggle-item.vue\";\n\ndefineProps<{ disabled: boolean }>();\n\nconst headerEnable = defineModel<boolean>(\"headerEnable\");\nconst headerMode = defineModel<LayoutHeaderModeType>(\"headerMode\");\nconst headerMenuAlign = defineModel<LayoutHeaderMenuAlignType>(\"headerMenuAlign\");\n\nconst localeItems: SelectOption[] = [\n  {\n    label: $t(\"preferences.header.modeStatic\"),\n    value: \"static\",\n  },\n  {\n    label: $t(\"preferences.header.modeFixed\"),\n    value: \"fixed\",\n  },\n  {\n    label: $t(\"preferences.header.modeAuto\"),\n    value: \"auto\",\n  },\n  {\n    label: $t(\"preferences.header.modeAutoScroll\"),\n    value: \"auto-scroll\",\n  },\n];\n\nconst headerMenuAlignItems: SelectOption[] = [\n  {\n    label: $t(\"preferences.header.menuAlignStart\"),\n    value: \"start\",\n  },\n  {\n    label: $t(\"preferences.header.menuAlignCenter\"),\n    value: \"center\",\n  },\n  {\n    label: $t(\"preferences.header.menuAlignEnd\"),\n    value: \"end\",\n  },\n];\n</script>\n\n<template>\n  <SwitchItem v-model=\"headerEnable\" :disabled=\"disabled\">\n    {{ $t(\"preferences.header.visible\") }}\n  </SwitchItem>\n  <SelectItem v-model=\"headerMode\" :disabled=\"!headerEnable\" :items=\"localeItems\">\n    {{ $t(\"preferences.mode\") }}\n  </SelectItem>\n  <ToggleItem v-model=\"headerMenuAlign\" :disabled=\"!headerEnable\" :items=\"headerMenuAlignItems\">\n    {{ $t(\"preferences.header.menuAlign\") }}\n  </ToggleItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/layout/layout.vue",
    "content": "<script setup lang=\"ts\">\nimport type { Component } from \"vue\";\n\nimport type { LayoutType } from \"/@/vben/types\";\n\nimport { computed } from \"vue\";\n\nimport { CircleHelp } from \"/@/vben/icons\";\nimport { $t } from \"/@/locales\";\n\nimport { VbenTooltip } from \"/@/vben//shadcn-ui\";\n\nimport { FullContent, HeaderMixedNav, HeaderNav, HeaderSidebarNav, MixedNav, SidebarMixedNav, SidebarNav } from \"../../icons\";\n\ninterface PresetItem {\n  name: string;\n  tip: string;\n  type: LayoutType;\n}\n\ndefineOptions({\n  name: \"PreferenceLayout\",\n});\n\nconst modelValue = defineModel<LayoutType>({ default: \"sidebar-nav\" });\n\nconst components: Record<LayoutType, Component> = {\n  \"full-content\": FullContent,\n  \"header-nav\": HeaderNav,\n  \"mixed-nav\": MixedNav,\n  \"sidebar-mixed-nav\": SidebarMixedNav,\n  \"sidebar-nav\": SidebarNav,\n  \"header-mixed-nav\": HeaderMixedNav,\n  \"header-sidebar-nav\": HeaderSidebarNav,\n};\n\nconst PRESET = computed((): PresetItem[] => [\n  {\n    name: $t(\"preferences.vertical\"),\n    tip: $t(\"preferences.verticalTip\"),\n    type: \"sidebar-nav\",\n  },\n  {\n    name: $t(\"preferences.twoColumn\"),\n    tip: $t(\"preferences.twoColumnTip\"),\n    type: \"sidebar-mixed-nav\",\n  },\n  {\n    name: $t(\"preferences.horizontal\"),\n    tip: $t(\"preferences.horizontalTip\"),\n    type: \"header-nav\",\n  },\n  {\n    name: $t(\"preferences.headerSidebarNav\"),\n    tip: $t(\"preferences.headerSidebarNavTip\"),\n    type: \"header-sidebar-nav\",\n  },\n  {\n    name: $t(\"preferences.mixedMenu\"),\n    tip: $t(\"preferences.mixedMenuTip\"),\n    type: \"mixed-nav\",\n  },\n  {\n    name: $t(\"preferences.headerTwoColumn\"),\n    tip: $t(\"preferences.headerTwoColumnTip\"),\n    type: \"header-mixed-nav\",\n  },\n  {\n    name: $t(\"preferences.fullContent\"),\n    tip: $t(\"preferences.fullContentTip\"),\n    type: \"full-content\",\n  },\n]);\n\nfunction activeClass(theme: string): string[] {\n  return theme === modelValue.value ? [\"outline-box-active\"] : [];\n}\n</script>\n\n<template>\n  <div class=\"flex w-full flex-wrap gap-5\">\n    <template v-for=\"theme in PRESET\" :key=\"theme.name\">\n      <div class=\"flex w-[100px] cursor-pointer flex-col\" @click=\"modelValue = theme.type\">\n        <div :class=\"activeClass(theme.type)\" class=\"outline-box flex-center\">\n          <component :is=\"components[theme.type]\" />\n        </div>\n        <div class=\"text-muted-foreground flex-center hover:text-foreground mt-2 text-center text-xs\">\n          {{ theme.name }}\n          <VbenTooltip v-if=\"theme.tip\" side=\"bottom\">\n            <template #trigger>\n              <CircleHelp class=\"ml-1 size-3 cursor-help\" />\n            </template>\n            {{ theme.tip }}\n          </VbenTooltip>\n        </div>\n      </div>\n    </template>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/layout/navigation.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectOption } from \"/@/vben/types\";\n\nimport { $t } from \"/@/locales\";\n\nimport SwitchItem from \"../switch-item.vue\";\nimport ToggleItem from \"../toggle-item.vue\";\n\ndefineOptions({\n  name: \"PreferenceNavigationConfig\",\n});\n\ndefineProps<{ disabled?: boolean; disabledNavigationSplit?: boolean }>();\n\nconst navigationStyleType = defineModel<string>(\"navigationStyleType\");\nconst navigationSplit = defineModel<boolean>(\"navigationSplit\");\nconst navigationAccordion = defineModel<boolean>(\"navigationAccordion\");\n\nconst stylesItems: SelectOption[] = [\n  { label: $t(\"preferences.rounded\"), value: \"rounded\" },\n  { label: $t(\"preferences.plain\"), value: \"plain\" },\n];\n</script>\n\n<template>\n  <ToggleItem v-model=\"navigationStyleType\" :disabled=\"disabled\" :items=\"stylesItems\">\n    {{ $t(\"preferences.navigationMenu.style\") }}\n  </ToggleItem>\n  <SwitchItem v-model=\"navigationSplit\" :disabled=\"disabledNavigationSplit || disabled\">\n    {{ $t(\"preferences.navigationMenu.split\") }}\n    <template #tip>\n      {{ $t(\"preferences.navigationMenu.splitTip\") }}\n    </template>\n  </SwitchItem>\n  <SwitchItem v-model=\"navigationAccordion\" :disabled=\"disabled\">\n    {{ $t(\"preferences.navigationMenu.accordion\") }}\n  </SwitchItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/layout/sidebar.vue",
    "content": "<script setup lang=\"ts\">\nimport type { LayoutType } from \"/@/vben/types\";\n\nimport { $t } from \"/@/locales\";\n\nimport NumberFieldItem from \"../number-field-item.vue\";\nimport SwitchItem from \"../switch-item.vue\";\n\ndefineProps<{ currentLayout?: LayoutType; disabled: boolean }>();\n\nconst sidebarEnable = defineModel<boolean>(\"sidebarEnable\");\nconst sidebarWidth = defineModel<number>(\"sidebarWidth\");\nconst sidebarCollapsedShowTitle = defineModel<boolean>(\"sidebarCollapsedShowTitle\");\nconst sidebarAutoActivateChild = defineModel<boolean>(\"sidebarAutoActivateChild\");\nconst sidebarCollapsed = defineModel<boolean>(\"sidebarCollapsed\");\nconst sidebarExpandOnHover = defineModel<boolean>(\"sidebarExpandOnHover\");\n</script>\n\n<template>\n  <SwitchItem v-model=\"sidebarEnable\" :disabled=\"disabled\">\n    {{ $t(\"preferences.sidebar.visible\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"sidebarCollapsed\" :disabled=\"!sidebarEnable || disabled\">\n    {{ $t(\"preferences.sidebar.collapsed\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"sidebarExpandOnHover\" :disabled=\"!sidebarEnable || disabled || !sidebarCollapsed\" :tip=\"$t('preferences.sidebar.expandOnHoverTip')\">\n    {{ $t(\"preferences.sidebar.expandOnHover\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"sidebarCollapsedShowTitle\" :disabled=\"!sidebarEnable || disabled || !sidebarCollapsed\">\n    {{ $t(\"preferences.sidebar.collapsedShowTitle\") }}\n  </SwitchItem>\n  <SwitchItem\n    v-model=\"sidebarAutoActivateChild\"\n    :disabled=\"!sidebarEnable || !['sidebar-mixed-nav', 'mixed-nav', 'header-mixed-nav'].includes(currentLayout as string) || disabled\"\n    :tip=\"$t('preferences.sidebar.autoActivateChildTip')\"\n  >\n    {{ $t(\"preferences.sidebar.autoActivateChild\") }}\n  </SwitchItem>\n  <NumberFieldItem v-model=\"sidebarWidth\" :disabled=\"!sidebarEnable || disabled\" :max=\"320\" :min=\"160\" :step=\"10\">\n    {{ $t(\"preferences.sidebar.width\") }}\n  </NumberFieldItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/layout/tabbar.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectOption } from \"/@/vben/types\";\n\nimport { computed } from \"vue\";\n\nimport { $t } from \"/@/locales\";\n\nimport NumberFieldItem from \"../number-field-item.vue\";\nimport SelectItem from \"../select-item.vue\";\nimport SwitchItem from \"../switch-item.vue\";\n\ndefineOptions({\n  name: \"PreferenceTabsConfig\",\n});\n\ndefineProps<{ disabled?: boolean }>();\n\nconst tabbarEnable = defineModel<boolean>(\"tabbarEnable\");\nconst tabbarShowIcon = defineModel<boolean>(\"tabbarShowIcon\");\nconst tabbarPersist = defineModel<boolean>(\"tabbarPersist\");\nconst tabbarDraggable = defineModel<boolean>(\"tabbarDraggable\");\nconst tabbarWheelable = defineModel<boolean>(\"tabbarWheelable\");\nconst tabbarStyleType = defineModel<string>(\"tabbarStyleType\");\nconst tabbarShowMore = defineModel<boolean>(\"tabbarShowMore\");\nconst tabbarShowMaximize = defineModel<boolean>(\"tabbarShowMaximize\");\nconst tabbarMaxCount = defineModel<number>(\"tabbarMaxCount\");\nconst tabbarMiddleClickToClose = defineModel<boolean>(\"tabbarMiddleClickToClose\");\n\nconst styleItems = computed((): SelectOption[] => [\n  {\n    label: $t(\"preferences.tabbar.styleType.chrome\"),\n    value: \"chrome\",\n  },\n  {\n    label: $t(\"preferences.tabbar.styleType.plain\"),\n    value: \"plain\",\n  },\n  {\n    label: $t(\"preferences.tabbar.styleType.card\"),\n    value: \"card\",\n  },\n\n  {\n    label: $t(\"preferences.tabbar.styleType.brisk\"),\n    value: \"brisk\",\n  },\n]);\n</script>\n\n<template>\n  <SwitchItem v-model=\"tabbarEnable\" :disabled=\"disabled\">\n    {{ $t(\"preferences.tabbar.enable\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"tabbarPersist\" :disabled=\"!tabbarEnable\">\n    {{ $t(\"preferences.tabbar.persist\") }}\n  </SwitchItem>\n  <NumberFieldItem v-model=\"tabbarMaxCount\" :disabled=\"!tabbarEnable\" :max=\"30\" :min=\"0\" :step=\"5\" :tip=\"$t('preferences.tabbar.maxCountTip')\">\n    {{ $t(\"preferences.tabbar.maxCount\") }}\n  </NumberFieldItem>\n  <SwitchItem v-model=\"tabbarDraggable\" :disabled=\"!tabbarEnable\">\n    {{ $t(\"preferences.tabbar.draggable\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"tabbarWheelable\" :disabled=\"!tabbarEnable\" :tip=\"$t('preferences.tabbar.wheelableTip')\">\n    {{ $t(\"preferences.tabbar.wheelable\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"tabbarMiddleClickToClose\" :disabled=\"!tabbarEnable\">\n    {{ $t(\"preferences.tabbar.middleClickClose\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"tabbarShowIcon\" :disabled=\"!tabbarEnable\">\n    {{ $t(\"preferences.tabbar.icon\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"tabbarShowMore\" :disabled=\"!tabbarEnable\">\n    {{ $t(\"preferences.tabbar.showMore\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"tabbarShowMaximize\" :disabled=\"!tabbarEnable\">\n    {{ $t(\"preferences.tabbar.showMaximize\") }}\n  </SwitchItem>\n  <SelectItem v-model=\"tabbarStyleType\" :items=\"styleItems\">\n    {{ $t(\"preferences.tabbar.styleType.title\") }}\n  </SelectItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/layout/widget.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectOption } from \"/@/vben/types\";\n\nimport { computed } from \"vue\";\n\nimport { $t } from \"/@/locales\";\n\nimport SelectItem from \"../select-item.vue\";\nimport SwitchItem from \"../switch-item.vue\";\n\ndefineOptions({\n  name: \"PreferenceInterfaceControl\",\n});\n\nconst widgetGlobalSearch = defineModel<boolean>(\"widgetGlobalSearch\");\nconst widgetFullscreen = defineModel<boolean>(\"widgetFullscreen\");\nconst widgetLanguageToggle = defineModel<boolean>(\"widgetLanguageToggle\");\nconst widgetNotification = defineModel<boolean>(\"widgetNotification\");\nconst widgetThemeToggle = defineModel<boolean>(\"widgetThemeToggle\");\nconst widgetSidebarToggle = defineModel<boolean>(\"widgetSidebarToggle\");\nconst widgetLockScreen = defineModel<boolean>(\"widgetLockScreen\");\nconst appPreferencesButtonPosition = defineModel<string>(\"appPreferencesButtonPosition\");\nconst widgetRefresh = defineModel<boolean>(\"widgetRefresh\");\n\nconst positionItems = computed((): SelectOption[] => [\n  {\n    label: $t(\"preferences.position.auto\"),\n    value: \"auto\",\n  },\n  {\n    label: $t(\"preferences.position.header\"),\n    value: \"header\",\n  },\n  {\n    label: $t(\"preferences.position.fixed\"),\n    value: \"fixed\",\n  },\n]);\n</script>\n\n<template>\n  <SwitchItem v-model=\"widgetGlobalSearch\">\n    {{ $t(\"preferences.widget.globalSearch\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"widgetThemeToggle\">\n    {{ $t(\"preferences.widget.themeToggle\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"widgetLanguageToggle\">\n    {{ $t(\"preferences.widget.languageToggle\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"widgetFullscreen\">\n    {{ $t(\"preferences.widget.fullscreen\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"widgetNotification\">\n    {{ $t(\"preferences.widget.notification\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"widgetLockScreen\">\n    {{ $t(\"preferences.widget.lockScreen\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"widgetSidebarToggle\">\n    {{ $t(\"preferences.widget.sidebarToggle\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"widgetRefresh\">\n    {{ $t(\"preferences.widget.refresh\") }}\n  </SwitchItem>\n  <SelectItem v-model=\"appPreferencesButtonPosition\" :items=\"positionItems\">\n    {{ $t(\"preferences.position.title\") }}\n  </SelectItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/number-field-item.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectOption } from \"/@/vben/types\";\n\nimport { useSlots } from \"vue\";\n\nimport { CircleHelp } from \"/@/vben/icons\";\n\nimport { NumberField, NumberFieldContent, NumberFieldDecrement, NumberFieldIncrement, NumberFieldInput, VbenTooltip } from \"/@/vben//shadcn-ui\";\n\ndefineOptions({\n  name: \"PreferenceSelectItem\",\n});\n\nwithDefaults(\n  defineProps<{\n    disabled?: boolean;\n    items?: SelectOption[];\n    placeholder?: string;\n    tip?: string;\n  }>(),\n  {\n    disabled: false,\n    placeholder: \"\",\n    tip: \"\",\n    items: () => [],\n  }\n);\n\nconst inputValue = defineModel<number>();\n\nconst slots = useSlots();\n</script>\n\n<template>\n  <div\n    :class=\"{\n      'hover:bg-accent': !slots.tip,\n      'pointer-events-none opacity-50': disabled,\n    }\"\n    class=\"my-1 flex w-full items-center justify-between rounded-md px-2 py-1\"\n  >\n    <span class=\"flex items-center text-sm\">\n      <slot></slot>\n\n      <VbenTooltip v-if=\"slots.tip || tip\" side=\"bottom\">\n        <template #trigger>\n          <CircleHelp class=\"ml-1 size-3 cursor-help\" />\n        </template>\n        <slot name=\"tip\">\n          <template v-if=\"tip\">\n            <p v-for=\"(line, index) in tip.split('\\n')\" :key=\"index\">\n              {{ line }}\n            </p>\n          </template>\n        </slot>\n      </VbenTooltip>\n    </span>\n\n    <NumberField v-model=\"inputValue\" v-bind=\"$attrs\" class=\"w-[165px]\">\n      <NumberFieldContent>\n        <NumberFieldDecrement />\n        <NumberFieldInput />\n        <NumberFieldIncrement />\n      </NumberFieldContent>\n    </NumberField>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/select-item.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectOption } from \"/@/vben/types\";\n\nimport { useSlots } from \"vue\";\n\nimport { CircleHelp } from \"/@/vben/icons\";\n\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, VbenTooltip } from \"/@/vben//shadcn-ui\";\n\ndefineOptions({\n  name: \"PreferenceSelectItem\",\n});\n\nwithDefaults(\n  defineProps<{\n    disabled?: boolean;\n    items?: SelectOption[];\n    placeholder?: string;\n  }>(),\n  {\n    disabled: false,\n    placeholder: \"\",\n    items: () => [],\n  }\n);\n\nconst selectValue = defineModel<string>();\n\nconst slots = useSlots();\n</script>\n\n<template>\n  <div\n    :class=\"{\n      'hover:bg-accent': !slots.tip,\n      'pointer-events-none opacity-50': disabled,\n    }\"\n    class=\"my-1 flex w-full items-center justify-between rounded-md px-2 py-1\"\n  >\n    <span class=\"flex items-center text-sm\">\n      <slot></slot>\n\n      <VbenTooltip v-if=\"slots.tip\" side=\"bottom\">\n        <template #trigger>\n          <CircleHelp class=\"ml-1 size-3 cursor-help\" />\n        </template>\n        <slot name=\"tip\"></slot>\n      </VbenTooltip>\n    </span>\n    <Select v-model=\"selectValue\">\n      <SelectTrigger class=\"h-8 w-[165px]\">\n        <SelectValue :placeholder=\"placeholder\" />\n      </SelectTrigger>\n      <SelectContent>\n        <template v-for=\"item in items\" :key=\"item.value\">\n          <SelectItem :value=\"item.value\"> {{ item.label }} </SelectItem>\n        </template>\n      </SelectContent>\n    </Select>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/shortcut-keys/global.vue",
    "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { $t } from \"/@/locales\";\nimport { isWindowsOs } from \"/@/vben/utils\";\n\nimport SwitchItem from \"../switch-item.vue\";\n\ndefineOptions({\n  name: \"PreferenceGeneralConfig\",\n});\n\nconst shortcutKeysEnable = defineModel<boolean>(\"shortcutKeysEnable\");\nconst shortcutKeysGlobalSearch = defineModel<boolean>(\"shortcutKeysGlobalSearch\");\nconst shortcutKeysLogout = defineModel<boolean>(\"shortcutKeysLogout\");\n// const shortcutKeysPreferences = defineModel<boolean>('shortcutKeysPreferences');\nconst shortcutKeysLockScreen = defineModel<boolean>(\"shortcutKeysLockScreen\");\n\nconst altView = computed(() => (isWindowsOs() ? \"Alt\" : \"⌥\"));\n</script>\n\n<template>\n  <SwitchItem v-model=\"shortcutKeysEnable\">\n    {{ $t(\"preferences.shortcutKeys.title\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"shortcutKeysGlobalSearch\" :disabled=\"!shortcutKeysEnable\">\n    {{ $t(\"preferences.shortcutKeys.search\") }}\n    <template #shortcut>\n      {{ isWindowsOs() ? \"Ctrl\" : \"⌘\" }}\n      <kbd> K </kbd>\n    </template>\n  </SwitchItem>\n  <SwitchItem v-model=\"shortcutKeysLogout\" :disabled=\"!shortcutKeysEnable\">\n    {{ $t(\"preferences.shortcutKeys.logout\") }}\n    <template #shortcut> {{ altView }} Q </template>\n  </SwitchItem>\n  <!-- <SwitchItem v-model=\"shortcutKeysPreferences\" :disabled=\"!shortcutKeysEnable\">\n    {{ $t('preferences.shortcutKeys.preferences') }}\n    <template #shortcut> {{ altView }} , </template>\n  </SwitchItem> -->\n  <SwitchItem v-model=\"shortcutKeysLockScreen\" :disabled=\"!shortcutKeysEnable\">\n    {{ $t(\"ui.widgets.lockScreen.title\") }}\n    <template #shortcut> {{ altView }} L </template>\n  </SwitchItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/switch-item.vue",
    "content": "<script setup lang=\"ts\">\nimport { useSlots } from \"vue\";\n\nimport { CircleHelp } from \"/@/vben/icons\";\n\nimport { Switch, VbenTooltip } from \"/@/vben//shadcn-ui\";\n\ndefineOptions({\n  name: \"PreferenceSwitchItem\",\n});\n\nwithDefaults(defineProps<{ disabled?: boolean; tip?: string }>(), {\n  disabled: false,\n  tip: \"\",\n});\n\nconst checked = defineModel<boolean>();\n\nconst slots = useSlots();\n\nfunction handleClick() {\n  checked.value = !checked.value;\n}\n</script>\n\n<template>\n  <div\n    :class=\"{\n      'pointer-events-none opacity-50': disabled,\n    }\"\n    class=\"hover:bg-accent my-1 flex w-full items-center justify-between rounded-md px-2 py-2.5\"\n    @click=\"handleClick\"\n  >\n    <span class=\"flex items-center text-sm\">\n      <slot></slot>\n\n      <VbenTooltip v-if=\"slots.tip || tip\" side=\"bottom\">\n        <template #trigger>\n          <CircleHelp class=\"ml-1 size-3 cursor-help\" />\n        </template>\n        <slot name=\"tip\">\n          <template v-if=\"tip\">\n            <p v-for=\"(line, index) in tip.split('\\n')\" :key=\"index\">\n              {{ line }}\n            </p>\n          </template>\n        </slot>\n      </VbenTooltip>\n    </span>\n    <span v-if=\"$slots.shortcut\" class=\"ml-auto mr-2 text-xs opacity-60\">\n      <slot name=\"shortcut\"></slot>\n    </span>\n    <Switch v-model:checked=\"checked\" @click.stop />\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/theme/builtin.vue",
    "content": "<script setup lang=\"ts\">\nimport type { BuiltinThemePreset } from \"/@/vben/preferences\";\nimport type { BuiltinThemeType } from \"/@/vben/types\";\n\nimport { computed, ref, watch } from \"vue\";\n\nimport { UserRoundPen } from \"/@/vben/icons\";\nimport { $t } from \"/@/locales\";\nimport { BUILT_IN_THEME_PRESETS } from \"/@/vben/preferences\";\nimport { convertToHsl, TinyColor } from \"/@/vben/utils\";\n\ndefineOptions({\n  name: \"PreferenceBuiltinTheme\",\n});\n\nconst props = defineProps<{ isDark: boolean }>();\n\nconst colorInput = ref();\nconst modelValue = defineModel<BuiltinThemeType>({ default: \"default\" });\nconst themeColorPrimary = defineModel<string>(\"themeColorPrimary\");\n\nconst inputValue = computed(() => {\n  return new TinyColor(themeColorPrimary.value || \"\").toHexString();\n});\n\nconst builtinThemePresets = computed(() => {\n  return [...BUILT_IN_THEME_PRESETS];\n});\n\nfunction typeView(name: BuiltinThemeType) {\n  switch (name) {\n    case \"custom\": {\n      return $t(\"preferences.theme.builtin.custom\");\n    }\n    case \"deep-blue\": {\n      return $t(\"preferences.theme.builtin.deepBlue\");\n    }\n    case \"deep-green\": {\n      return $t(\"preferences.theme.builtin.deepGreen\");\n    }\n    case \"default\": {\n      return $t(\"preferences.theme.builtin.default\");\n    }\n    case \"gray\": {\n      return $t(\"preferences.theme.builtin.gray\");\n    }\n    case \"green\": {\n      return $t(\"preferences.theme.builtin.green\");\n    }\n\n    case \"neutral\": {\n      return $t(\"preferences.theme.builtin.neutral\");\n    }\n    case \"orange\": {\n      return $t(\"preferences.theme.builtin.orange\");\n    }\n    case \"pink\": {\n      return $t(\"preferences.theme.builtin.pink\");\n    }\n    case \"rose\": {\n      return $t(\"preferences.theme.builtin.rose\");\n    }\n    case \"sky-blue\": {\n      return $t(\"preferences.theme.builtin.skyBlue\");\n    }\n    case \"slate\": {\n      return $t(\"preferences.theme.builtin.slate\");\n    }\n    case \"violet\": {\n      return $t(\"preferences.theme.builtin.violet\");\n    }\n    case \"yellow\": {\n      return $t(\"preferences.theme.builtin.yellow\");\n    }\n    case \"zinc\": {\n      return $t(\"preferences.theme.builtin.zinc\");\n    }\n  }\n}\n\nfunction handleSelect(theme: BuiltinThemePreset) {\n  modelValue.value = theme.type;\n}\n\nfunction handleInputChange(e: Event) {\n  const target = e.target as HTMLInputElement;\n  themeColorPrimary.value = convertToHsl(target.value);\n}\n\nfunction selectColor() {\n  colorInput.value?.[0]?.click?.();\n}\n\nwatch(\n  () => [modelValue.value, props.isDark] as [BuiltinThemeType, boolean],\n  ([themeType, isDark]) => {\n    const theme = builtinThemePresets.value.find(item => item.type === themeType);\n    if (theme) {\n      const primaryColor = isDark ? theme.darkPrimaryColor || theme.primaryColor : theme.primaryColor;\n\n      themeColorPrimary.value = primaryColor || theme.color;\n    }\n  }\n);\n</script>\n\n<template>\n  <div class=\"flex w-full flex-wrap justify-between\">\n    <template v-for=\"theme in builtinThemePresets\" :key=\"theme.type\">\n      <div class=\"flex cursor-pointer flex-col\" @click=\"handleSelect(theme)\">\n        <div\n          :class=\"{\n            'outline-box-active': theme.type === modelValue,\n          }\"\n          class=\"outline-box flex-center group cursor-pointer\"\n        >\n          <template v-if=\"theme.type !== 'custom'\">\n            <div :style=\"{ backgroundColor: theme.color }\" class=\"mx-10 my-2 size-5 rounded-md\"></div>\n          </template>\n          <template v-else>\n            <div class=\"size-full px-10 py-2\" @click.stop=\"selectColor\">\n              <div class=\"flex-center relative size-5 rounded-sm\">\n                <UserRoundPen class=\"absolute z-10 size-5 opacity-60 group-hover:opacity-100\" />\n                <input ref=\"colorInput\" :value=\"inputValue\" class=\"absolute inset-0 opacity-0\" type=\"color\" @input=\"handleInputChange\" />\n              </div>\n            </div>\n          </template>\n        </div>\n        <div class=\"text-muted-foreground my-2 text-center text-xs\">\n          {{ typeView(theme.type) }}\n        </div>\n      </div>\n    </template>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/theme/color-mode.vue",
    "content": "<script setup lang=\"ts\">\nimport { $t } from \"/@/locales\";\n\nimport SwitchItem from \"../switch-item.vue\";\n\ndefineOptions({\n  name: \"PreferenceColorMode\",\n});\n\nconst appColorWeakMode = defineModel<boolean>(\"appColorWeakMode\", {\n  default: false,\n});\n\nconst appColorGrayMode = defineModel<boolean>(\"appColorGrayMode\", {\n  default: false,\n});\n</script>\n\n<template>\n  <SwitchItem v-model=\"appColorWeakMode\">\n    {{ $t(\"preferences.theme.weakMode\") }}\n  </SwitchItem>\n  <SwitchItem v-model=\"appColorGrayMode\">\n    {{ $t(\"preferences.theme.grayMode\") }}\n  </SwitchItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/theme/radius.vue",
    "content": "<script setup lang=\"ts\">\nimport { ToggleGroup, ToggleGroupItem } from \"/@/vben//shadcn-ui\";\n\ndefineOptions({\n  name: \"PreferenceColorMode\",\n});\n\nconst modelValue = defineModel<string | undefined>(\"themeRadius\", {\n  default: \"0.5\",\n});\n\nconst items = [\n  { label: \"0\", value: \"0\" },\n  { label: \"0.25\", value: \"0.25\" },\n  { label: \"0.5\", value: \"0.5\" },\n  { label: \"0.75\", value: \"0.75\" },\n  { label: \"1\", value: \"1\" },\n];\n</script>\n\n<template>\n  <ToggleGroup v-model=\"modelValue\" class=\"gap-2\" size=\"sm\" type=\"single\" variant=\"outline\">\n    <template v-for=\"item in items\" :key=\"item.value\">\n      <ToggleGroupItem :value=\"item.value\" class=\"data-[state=on]:bg-primary data-[state=on]:text-primary-foreground h-7 w-16 rounded-sm\">\n        {{ item.label }}\n      </ToggleGroupItem>\n    </template>\n  </ToggleGroup>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/theme/theme.vue",
    "content": "<script setup lang=\"ts\">\nimport type { Component } from \"vue\";\n\nimport type { ThemeModeType } from \"/@/vben/types\";\n\nimport { MoonStar, Sun, SunMoon } from \"/@/vben/icons\";\nimport { $t } from \"/@/locales\";\n\nimport SwitchItem from \"../switch-item.vue\";\n\ndefineOptions({\n  name: \"PreferenceTheme\",\n});\n\nconst modelValue = defineModel<string>({ default: \"auto\" });\nconst themeSemiDarkSidebar = defineModel<boolean>(\"themeSemiDarkSidebar\");\nconst themeSemiDarkHeader = defineModel<boolean>(\"themeSemiDarkHeader\");\n\nconst THEME_PRESET: Array<{ icon: Component; name: ThemeModeType }> = [\n  {\n    icon: Sun,\n    name: \"light\",\n  },\n  {\n    icon: MoonStar,\n    name: \"dark\",\n  },\n  {\n    icon: SunMoon,\n    name: \"auto\",\n  },\n];\n\nfunction activeClass(theme: string): string[] {\n  return theme === modelValue.value ? [\"outline-box-active\"] : [];\n}\n\nfunction nameView(name: string) {\n  switch (name) {\n    case \"auto\": {\n      return $t(\"preferences.followSystem\");\n    }\n    case \"dark\": {\n      return $t(\"preferences.theme.dark\");\n    }\n    case \"light\": {\n      return $t(\"preferences.theme.light\");\n    }\n  }\n}\n</script>\n\n<template>\n  <div class=\"flex w-full flex-wrap justify-between\">\n    <template v-for=\"theme in THEME_PRESET\" :key=\"theme.name\">\n      <div class=\"flex cursor-pointer flex-col\" @click=\"modelValue = theme.name\">\n        <div :class=\"activeClass(theme.name)\" class=\"outline-box flex-center py-4\">\n          <component :is=\"theme.icon\" class=\"mx-9 size-5\" />\n        </div>\n        <div class=\"text-muted-foreground mt-2 text-center text-xs\">\n          {{ nameView(theme.name) }}\n        </div>\n      </div>\n    </template>\n\n    <SwitchItem v-model=\"themeSemiDarkSidebar\" :disabled=\"modelValue === 'dark'\" class=\"mt-6\">\n      {{ $t(\"preferences.theme.darkSidebar\") }}\n    </SwitchItem>\n    <SwitchItem v-model=\"themeSemiDarkHeader\" :disabled=\"modelValue === 'dark'\">\n      {{ $t(\"preferences.theme.darkHeader\") }}\n    </SwitchItem>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/blocks/toggle-item.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectOption } from \"/@/vben/types\";\n\nimport { ToggleGroup, ToggleGroupItem } from \"/@/vben//shadcn-ui\";\n\ndefineOptions({\n  name: \"PreferenceToggleItem\",\n});\n\nwithDefaults(defineProps<{ disabled?: boolean; items: SelectOption[] }>(), {\n  disabled: false,\n  items: () => [],\n});\n\nconst modelValue = defineModel<string>();\n</script>\n\n<template>\n  <div\n    :class=\"{\n      'pointer-events-none opacity-50': disabled,\n    }\"\n    class=\"hover:bg-accent flex w-full items-center justify-between rounded-md px-2 py-2\"\n    disabled\n  >\n    <span class=\"text-sm\">\n      <slot></slot>\n    </span>\n    <ToggleGroup v-model=\"modelValue\" class=\"gap-2\" size=\"sm\" type=\"single\" variant=\"outline\">\n      <template v-for=\"item in items\" :key=\"item.value\">\n        <ToggleGroupItem :value=\"item.value\" class=\"data-[state=on]:bg-primary data-[state=on]:text-primary-foreground h-7 rounded-sm\">\n          {{ item.label }}\n        </ToggleGroupItem>\n      </template>\n    </ToggleGroup>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/icons/content-compact.vue",
    "content": "<template>\n  <svg class=\"custom-radio-image\" fill=\"none\" height=\"66\" width=\"104\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g>\n      <rect id=\"svg_1\" fill=\"currentColor\" fill-opacity=\"0.02\" height=\"66\" rx=\"4\" stroke=\"null\" width=\"104\" x=\"0.13514\" y=\"0.13514\" />\n      <rect id=\"svg_8\" fill=\"hsl(var(--primary))\" height=\"9.07027\" stroke=\"null\" width=\"104.07934\" x=\"-0.07419\" y=\"-0.05773\" />\n      <rect id=\"svg_3\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"15.58168\" y=\"3.20832\" />\n      <path\n        id=\"svg_12\"\n        d=\"m98.19822,2.872c0,-0.54338 0.45662,-1 1,-1l1.925,0c0.54338,0 1,0.45662 1,1l0,2.4c0,0.54338 -0.45662,1 -1,1l-1.925,0c-0.54338,0 -1,-0.45662 -1,-1l0,-2.4z\"\n        fill=\"#ffffff\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <rect id=\"svg_13\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.51892\" rx=\"2\" stroke=\"null\" width=\"41.98275\" x=\"45.37589\" y=\"13.53192\" />\n      <path\n        id=\"svg_14\"\n        d=\"m16.4123,15.53192c0,-1.08676 0.74096,-2 1.62271,-2l21.74653,0c0.88175,0 1.62271,0.91324 1.62271,2l0,17.24865c0,1.08676 -0.74096,2 -1.62271,2l-21.74653,0c-0.88175,0 -1.62271,-0.91324 -1.62271,-2l0,-17.24865z\"\n        fill=\"currentColor\"\n        fill-opacity=\"0.08\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <rect id=\"svg_15\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.65405\" rx=\"2\" stroke=\"null\" width=\"71.10636\" x=\"16.54743\" y=\"39.34689\" />\n      <rect id=\"svg_21\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"28.14924\" y=\"3.07319\" />\n      <rect id=\"svg_22\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"41.25735\" y=\"3.20832\" />\n      <rect id=\"svg_23\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"54.23033\" y=\"3.07319\" />\n      <rect id=\"svg_4\" fill=\"#ffffff\" height=\"7.13843\" rx=\"2\" stroke=\"null\" width=\"7.78397\" x=\"1.5327\" y=\"0.881\" />\n    </g>\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/icons/full-content.vue",
    "content": "<template>\n  <svg class=\"custom-radio-image\" fill=\"none\" height=\"66\" width=\"104\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g>\n      <path\n        id=\"svg_1\"\n        d=\"m0.13514,4.13514c0,-2.17352 1.82648,-4 4,-4l96,0c2.17352,0 4,1.82648 4,4l0,58c0,2.17352 -1.82648,4 -4,4l-96,0c-2.17352,0 -4,-1.82648 -4,-4l0,-58z\"\n        fill=\"currentColor\"\n        fill-opacity=\"0.02\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <rect id=\"svg_13\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"26.57155\" rx=\"2\" stroke=\"null\" width=\"53.18333\" x=\"45.79979\" y=\"3.77232\" />\n      <path\n        id=\"svg_14\"\n        d=\"m4.28142,5.96169c0,-1.37748 1.06465,-2.53502 2.33158,-2.53502l31.2463,0c1.26693,0 2.33158,1.15754 2.33158,2.53502l0,21.86282c0,1.37748 -1.06465,2.53502 -2.33158,2.53502l-31.2463,0c-1.26693,0 -2.33158,-1.15754 -2.33158,-2.53502l0,-21.86282z\"\n        fill=\"currentColor\"\n        fill-opacity=\"0.08\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <rect id=\"svg_15\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"25.02247\" rx=\"2\" stroke=\"null\" width=\"94.39371\" x=\"4.56735\" y=\"34.92584\" />\n    </g>\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/icons/header-mixed-nav.vue",
    "content": "<template>\n  <svg class=\"custom-radio-image\" fill=\"none\" height=\"66\" width=\"104\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g>\n      <rect id=\"svg_1\" fill=\"currentColor\" fill-opacity=\"0.02\" height=\"66\" rx=\"4\" stroke=\"null\" width=\"104\" x=\"0.13514\" y=\"0.13514\" />\n      <path id=\"svg_2\" d=\"m-3.37838,3.7543a1.93401,4.02457 0 0 1 1.93401,-4.02457l11.3488,0l0,66.40541l-11.3488,0a1.93401,4.02457 0 0 1 -1.93401,-4.02457l0,-58.35627z\" fill=\"hsl(var(--primary))\" stroke=\"null\" />\n      <rect id=\"svg_3\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"5.47439\" x=\"1.64059\" y=\"15.46086\" />\n      <rect id=\"svg_4\" fill=\"#ffffff\" height=\"7.67897\" rx=\"2\" stroke=\"null\" width=\"8.18938\" x=\"0.58676\" y=\"1.42154\" />\n      <rect id=\"svg_8\" fill=\"hsl(var(--primary))\" height=\"9.07027\" rx=\"2\" stroke=\"null\" width=\"75.91967\" x=\"25.38277\" y=\"1.42876\" />\n      <rect id=\"svg_9\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"27.91529\" y=\"3.69284\" />\n      <rect id=\"svg_10\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"80.75054\" y=\"3.62876\" />\n      <rect id=\"svg_11\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"87.78868\" y=\"3.69981\" />\n      <rect id=\"svg_12\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"94.6847\" y=\"3.62876\" />\n      <rect id=\"svg_13\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.51892\" rx=\"2\" stroke=\"null\" width=\"42.9287\" x=\"58.75427\" y=\"14.613\" />\n      <rect id=\"svg_14\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"20.97838\" rx=\"2\" stroke=\"null\" width=\"28.36894\" x=\"26.14342\" y=\"14.613\" />\n      <rect id=\"svg_15\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.65405\" rx=\"2\" stroke=\"null\" width=\"75.09493\" x=\"26.34264\" y=\"39.68822\" />\n      <rect id=\"svg_5\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"5.47439\" x=\"1.79832\" y=\"28.39462\" />\n      <rect id=\"svg_6\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"5.47439\" x=\"1.64059\" y=\"41.80156\" />\n      <rect id=\"svg_7\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"5.47439\" x=\"1.64059\" y=\"55.36623\" />\n      <rect id=\"svg_16\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"65.72065\" stroke=\"null\" width=\"12.49265\" x=\"9.85477\" y=\"-0.02618\" />\n      <rect id=\"svg_21\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"35.14924\" y=\"4.07319\" />\n      <rect id=\"svg_22\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"47.25735\" y=\"4.20832\" />\n      <rect id=\"svg_23\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"59.23033\" y=\"4.07319\" />\n    </g>\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/icons/header-nav.vue",
    "content": "<template>\n  <svg class=\"custom-radio-image\" fill=\"none\" height=\"66\" width=\"104\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g>\n      <rect id=\"svg_1\" fill=\"currentColor\" fill-opacity=\"0.02\" height=\"66\" rx=\"4\" stroke=\"null\" width=\"104\" x=\"0.13514\" y=\"0.13514\" />\n      <rect id=\"svg_8\" fill=\"hsl(var(--primary))\" height=\"9.07027\" stroke=\"null\" width=\"104.07934\" x=\"-0.07419\" y=\"-0.05773\" />\n      <rect id=\"svg_3\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"15.58168\" y=\"3.20832\" />\n      <path\n        id=\"svg_12\"\n        d=\"m98.19822,2.872c0,-0.54338 0.45662,-1 1,-1l1.925,0c0.54338,0 1,0.45662 1,1l0,2.4c0,0.54338 -0.45662,1 -1,1l-1.925,0c-0.54338,0 -1,-0.45662 -1,-1l0,-2.4z\"\n        fill=\"#ffffff\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <rect id=\"svg_13\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.51892\" rx=\"2\" stroke=\"null\" width=\"53.60438\" x=\"43.484\" y=\"13.66705\" />\n      <path\n        id=\"svg_14\"\n        d=\"m3.43932,15.53192c0,-1.08676 1.03344,-2 2.26323,-2l30.33036,0c1.22979,0 2.26323,0.91324 2.26323,2l0,17.24865c0,1.08676 -1.03344,2 -2.26323,2l-30.33036,0c-1.22979,0 -2.26323,-0.91324 -2.26323,-2l0,-17.24865z\"\n        fill=\"currentColor\"\n        fill-opacity=\"0.08\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <rect id=\"svg_15\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.65405\" rx=\"2\" stroke=\"null\" width=\"95.02528\" x=\"3.30419\" y=\"39.34689\" />\n      <rect id=\"svg_21\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"28.14924\" y=\"3.07319\" />\n      <rect id=\"svg_22\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"41.25735\" y=\"3.20832\" />\n      <rect id=\"svg_23\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"54.23033\" y=\"3.07319\" />\n      <rect id=\"svg_4\" fill=\"#ffffff\" height=\"7.13843\" rx=\"2\" stroke=\"null\" width=\"7.78397\" x=\"1.5327\" y=\"0.881\" />\n    </g>\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/icons/header-sidebar-nav.vue",
    "content": "<template>\n  <svg class=\"custom-radio-image\" fill=\"none\" height=\"66\" width=\"104\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g>\n      <rect id=\"svg_1\" fill=\"currentColor\" fill-opacity=\"0.02\" height=\"66\" rx=\"4\" stroke=\"null\" width=\"104\" x=\"0.13514\" y=\"0.13514\" />\n      <rect id=\"svg_8\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"9.07027\" stroke=\"null\" width=\"104.07934\" x=\"-0.07419\" y=\"-0.05773\" />\n      <rect id=\"svg_3\" fill=\"#b2b2b2\" height=\"1.689\" rx=\"1.395\" stroke=\"null\" width=\"6.52486\" x=\"10.08168\" y=\"3.50832\" />\n      <rect id=\"svg_10\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"80.75054\" y=\"2.89362\" />\n      <rect id=\"svg_11\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"87.58249\" y=\"2.89362\" />\n      <path\n        id=\"svg_12\"\n        d=\"m98.19822,2.872c0,-0.54338 0.45662,-1 1,-1l1.925,0c0.54338,0 1,0.45662 1,1l0,2.4c0,0.54338 -0.45662,1 -1,1l-1.925,0c-0.54338,0 -1,-0.45662 -1,-1l0,-2.4z\"\n        fill=\"#ffffff\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <rect id=\"svg_13\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.51892\" rx=\"2\" stroke=\"null\" width=\"44.13071\" x=\"53.37873\" y=\"13.45652\" />\n      <path\n        id=\"svg_14\"\n        d=\"m19.4393,15.74245c0,-1.08676 0.79001,-2 1.73013,-2l23.18605,0c0.94011,0 1.73013,0.91324 1.73013,2l0,17.24865c0,1.08676 -0.79001,2 -1.73013,2l-23.18605,0c-0.94011,0 -1.73013,-0.91324 -1.73013,-2l0,-17.24865z\"\n        fill=\"currentColor\"\n        fill-opacity=\"0.08\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <rect id=\"svg_15\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.65405\" rx=\"2\" stroke=\"null\" width=\"78.39372\" x=\"19.93575\" y=\"39.34689\" />\n      <rect id=\"svg_21\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"28.14924\" y=\"3.07319\" />\n      <rect id=\"svg_22\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"41.25735\" y=\"3.20832\" />\n      <rect id=\"svg_23\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"54.23033\" y=\"3.07319\" />\n      <rect id=\"svg_4\" fill=\"#ffffff\" height=\"5.13843\" rx=\"2\" stroke=\"null\" width=\"5.78397\" x=\"1.5327\" y=\"1.081\" />\n      <rect id=\"svg_5\" fill=\"hsl(var(--primary))\" height=\"56.81191\" stroke=\"null\" width=\"15.44642\" x=\"-0.06423\" y=\"9.03113\" />\n      <path\n        id=\"svg_2\"\n        d=\"m2.38669,15.38074c0,-0.20384 0.27195,-0.37513 0.59557,-0.37513l7.98149,0c0.32362,0 0.59557,0.17129 0.59557,0.37513l0,3.23525c0,0.20384 -0.27195,0.37513 -0.59557,0.37513l-7.98149,0c-0.32362,0 -0.59557,-0.17129 -0.59557,-0.37513l0,-3.23525z\"\n        fill=\"#fff\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <path\n        id=\"svg_6\"\n        d=\"m2.38669,28.43336c0,-0.20384 0.27195,-0.37513 0.59557,-0.37513l7.98149,0c0.32362,0 0.59557,0.17129 0.59557,0.37513l0,3.23525c0,0.20384 -0.27195,0.37513 -0.59557,0.37513l-7.98149,0c-0.32362,0 -0.59557,-0.17129 -0.59557,-0.37513l0,-3.23525z\"\n        fill=\"#fff\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <path\n        id=\"svg_7\"\n        d=\"m2.17616,41.27545c0,-0.20384 0.27195,-0.37513 0.59557,-0.37513l7.98149,0c0.32362,0 0.59557,0.17129 0.59557,0.37513l0,3.23525c0,0.20384 -0.27195,0.37513 -0.59557,0.37513l-7.98149,0c-0.32362,0 -0.59557,-0.17129 -0.59557,-0.37513l0,-3.23525z\"\n        fill=\"#fff\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <path\n        id=\"svg_9\"\n        d=\"m2.17616,54.32806c0,-0.20384 0.27195,-0.37513 0.59557,-0.37513l7.98149,0c0.32362,0 0.59557,0.17129 0.59557,0.37513l0,3.23525c0,0.20384 -0.27195,0.37513 -0.59557,0.37513l-7.98149,0c-0.32362,0 -0.59557,-0.17129 -0.59557,-0.37513l0,-3.23525z\"\n        fill=\"#fff\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n    </g>\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/icons/index.ts",
    "content": "import HeaderNav from \"./header-nav.vue\";\n\nexport { default as ContentCompact } from \"./content-compact.vue\";\nexport { default as FullContent } from \"./full-content.vue\";\nexport { default as HeaderMixedNav } from \"./header-mixed-nav.vue\";\nexport { default as HeaderSidebarNav } from \"./header-sidebar-nav.vue\";\nexport { default as MixedNav } from \"./mixed-nav.vue\";\nexport { default as SidebarMixedNav } from \"./sidebar-mixed-nav.vue\";\nexport { default as SidebarNav } from \"./sidebar-nav.vue\";\n\nconst ContentWide = HeaderNav;\nexport { ContentWide, HeaderNav };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/icons/mixed-nav.vue",
    "content": "<template>\n  <svg class=\"custom-radio-image\" fill=\"none\" height=\"66\" width=\"104\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g>\n      <rect id=\"svg_1\" fill=\"currentColor\" fill-opacity=\"0.02\" height=\"66\" rx=\"4\" stroke=\"null\" width=\"104\" x=\"0.13514\" y=\"0.13514\" />\n      <rect id=\"svg_8\" fill=\"hsl(var(--primary))\" height=\"9.07027\" stroke=\"null\" width=\"104.07934\" x=\"-0.07419\" y=\"-0.05773\" />\n      <rect id=\"svg_3\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"15.58168\" y=\"3.20832\" />\n      <path\n        id=\"svg_12\"\n        d=\"m98.19822,2.872c0,-0.54338 0.45662,-1 1,-1l1.925,0c0.54338,0 1,0.45662 1,1l0,2.4c0,0.54338 -0.45662,1 -1,1l-1.925,0c-0.54338,0 -1,-0.45662 -1,-1l0,-2.4z\"\n        fill=\"#ffffff\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <rect id=\"svg_13\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.51892\" rx=\"2\" stroke=\"null\" width=\"44.13071\" x=\"53.37873\" y=\"13.45652\" />\n      <path\n        id=\"svg_14\"\n        d=\"m19.4393,15.74245c0,-1.08676 0.79001,-2 1.73013,-2l23.18605,0c0.94011,0 1.73013,0.91324 1.73013,2l0,17.24865c0,1.08676 -0.79001,2 -1.73013,2l-23.18605,0c-0.94011,0 -1.73013,-0.91324 -1.73013,-2l0,-17.24865z\"\n        fill=\"currentColor\"\n        fill-opacity=\"0.08\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <rect id=\"svg_15\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.65405\" rx=\"2\" stroke=\"null\" width=\"78.39372\" x=\"19.93575\" y=\"39.34689\" />\n      <rect id=\"svg_21\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"28.14924\" y=\"3.07319\" />\n      <rect id=\"svg_22\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"41.25735\" y=\"3.20832\" />\n      <rect id=\"svg_23\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"7.52486\" x=\"54.23033\" y=\"3.07319\" />\n      <rect id=\"svg_4\" fill=\"#ffffff\" height=\"7.13843\" rx=\"2\" stroke=\"null\" width=\"7.78397\" x=\"1.5327\" y=\"0.881\" />\n      <rect id=\"svg_5\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"56.81191\" stroke=\"null\" width=\"15.44642\" x=\"-0.06423\" y=\"9.03113\" />\n      <path\n        id=\"svg_2\"\n        d=\"m2.38669,15.38074c0,-0.20384 0.27195,-0.37513 0.59557,-0.37513l7.98149,0c0.32362,0 0.59557,0.17129 0.59557,0.37513l0,3.23525c0,0.20384 -0.27195,0.37513 -0.59557,0.37513l-7.98149,0c-0.32362,0 -0.59557,-0.17129 -0.59557,-0.37513l0,-3.23525z\"\n        fill=\"currentColor\"\n        fill-opacity=\"0.08\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <path\n        id=\"svg_6\"\n        d=\"m2.38669,28.43336c0,-0.20384 0.27195,-0.37513 0.59557,-0.37513l7.98149,0c0.32362,0 0.59557,0.17129 0.59557,0.37513l0,3.23525c0,0.20384 -0.27195,0.37513 -0.59557,0.37513l-7.98149,0c-0.32362,0 -0.59557,-0.17129 -0.59557,-0.37513l0,-3.23525z\"\n        fill=\"currentColor\"\n        fill-opacity=\"0.08\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <path\n        id=\"svg_7\"\n        d=\"m2.17616,41.27545c0,-0.20384 0.27195,-0.37513 0.59557,-0.37513l7.98149,0c0.32362,0 0.59557,0.17129 0.59557,0.37513l0,3.23525c0,0.20384 -0.27195,0.37513 -0.59557,0.37513l-7.98149,0c-0.32362,0 -0.59557,-0.17129 -0.59557,-0.37513l0,-3.23525z\"\n        fill=\"currentColor\"\n        fill-opacity=\"0.08\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n      <path\n        id=\"svg_9\"\n        d=\"m2.17616,54.32806c0,-0.20384 0.27195,-0.37513 0.59557,-0.37513l7.98149,0c0.32362,0 0.59557,0.17129 0.59557,0.37513l0,3.23525c0,0.20384 -0.27195,0.37513 -0.59557,0.37513l-7.98149,0c-0.32362,0 -0.59557,-0.17129 -0.59557,-0.37513l0,-3.23525z\"\n        fill=\"currentColor\"\n        fill-opacity=\"0.08\"\n        opacity=\"undefined\"\n        stroke=\"null\"\n      />\n    </g>\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/icons/setting.vue",
    "content": "<template>\n  <svg height=\"1em\" viewBox=\"0 0 24 24\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\">\n    <path\n      d=\"M19.9 12.66a1 1 0 0 1 0-1.32l1.28-1.44a1 1 0 0 0 .12-1.17l-2-3.46a1 1 0 0 0-1.07-.48l-1.88.38a1 1 0 0 1-1.15-.66l-.61-1.83a1 1 0 0 0-.95-.68h-4a1 1 0 0 0-1 .68l-.56 1.83a1 1 0 0 1-1.15.66L5 4.79a1 1 0 0 0-1 .48L2 8.73a1 1 0 0 0 .1 1.17l1.27 1.44a1 1 0 0 1 0 1.32L2.1 14.1a1 1 0 0 0-.1 1.17l2 3.46a1 1 0 0 0 1.07.48l1.88-.38a1 1 0 0 1 1.15.66l.61 1.83a1 1 0 0 0 1 .68h4a1 1 0 0 0 .95-.68l.61-1.83a1 1 0 0 1 1.15-.66l1.88.38a1 1 0 0 0 1.07-.48l2-3.46a1 1 0 0 0-.12-1.17ZM18.41 14l.8.9l-1.28 2.22l-1.18-.24a3 3 0 0 0-3.45 2L12.92 20h-2.56L10 18.86a3 3 0 0 0-3.45-2l-1.18.24l-1.3-2.21l.8-.9a3 3 0 0 0 0-4l-.8-.9l1.28-2.2l1.18.24a3 3 0 0 0 3.45-2L10.36 4h2.56l.38 1.14a3 3 0 0 0 3.45 2l1.18-.24l1.28 2.22l-.8.9a3 3 0 0 0 0 3.98m-6.77-6a4 4 0 1 0 4 4a4 4 0 0 0-4-4m0 6a2 2 0 1 1 2-2a2 2 0 0 1-2 2\"\n    />\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/icons/sidebar-mixed-nav.vue",
    "content": "<template>\n  <svg class=\"custom-radio-image\" fill=\"none\" height=\"66\" width=\"104\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g>\n      <rect id=\"svg_1\" fill=\"currentColor\" fill-opacity=\"0.02\" height=\"66\" rx=\"4\" stroke=\"null\" width=\"104\" x=\"0.13514\" y=\"0.13514\" />\n      <path id=\"svg_2\" d=\"m-3.37838,3.7543a1.93401,4.02457 0 0 1 1.93401,-4.02457l11.3488,0l0,66.40541l-11.3488,0a1.93401,4.02457 0 0 1 -1.93401,-4.02457l0,-58.35627z\" fill=\"hsl(var(--primary))\" stroke=\"null\" />\n      <rect id=\"svg_3\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"5.47439\" x=\"1.64059\" y=\"15.46086\" />\n      <rect id=\"svg_4\" fill=\"#ffffff\" height=\"7.67897\" rx=\"2\" stroke=\"null\" width=\"8.18938\" x=\"0.58676\" y=\"1.42154\" />\n      <rect id=\"svg_8\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"9.07027\" rx=\"2\" stroke=\"null\" width=\"75.91967\" x=\"25.38277\" y=\"1.42876\" />\n      <rect id=\"svg_9\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"27.91529\" y=\"3.69284\" />\n      <rect id=\"svg_10\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"80.75054\" y=\"3.62876\" />\n      <rect id=\"svg_11\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"87.78868\" y=\"3.69981\" />\n      <rect id=\"svg_12\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"94.6847\" y=\"3.62876\" />\n      <rect id=\"svg_13\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.51892\" rx=\"2\" stroke=\"null\" width=\"42.9287\" x=\"58.75427\" y=\"14.613\" />\n      <rect id=\"svg_14\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"20.97838\" rx=\"2\" stroke=\"null\" width=\"28.36894\" x=\"26.14342\" y=\"14.613\" />\n      <rect id=\"svg_15\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.65405\" rx=\"2\" stroke=\"null\" width=\"75.09493\" x=\"26.34264\" y=\"39.68822\" />\n      <rect id=\"svg_5\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"5.47439\" x=\"1.79832\" y=\"28.39462\" />\n      <rect id=\"svg_6\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"5.47439\" x=\"1.64059\" y=\"41.80156\" />\n      <rect id=\"svg_7\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" stroke=\"null\" width=\"5.47439\" x=\"1.64059\" y=\"55.36623\" />\n      <rect id=\"svg_16\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"65.72065\" stroke=\"null\" width=\"12.49265\" x=\"9.85477\" y=\"-0.02618\" />\n    </g>\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/icons/sidebar-nav.vue",
    "content": "<template>\n  <svg class=\"custom-radio-image\" fill=\"none\" height=\"66\" width=\"104\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g>\n      <rect id=\"svg_1\" fill=\"currentColor\" fill-opacity=\"0.02\" height=\"66\" rx=\"4\" stroke=\"null\" width=\"104\" />\n      <path id=\"svg_2\" d=\"m-3.37838,3.61916a4.4919,4.02457 0 0 1 4.4919,-4.02457l26.35848,0l0,66.40541l-26.35848,0a4.4919,4.02457 0 0 1 -4.4919,-4.02457l0,-58.35627z\" fill=\"hsl(var(--primary))\" stroke=\"null\" />\n      <rect id=\"svg_3\" fill=\"#e5e5e5\" height=\"2.789\" rx=\"1.395\" width=\"17.66\" x=\"4.906\" y=\"23.884\" />\n      <rect id=\"svg_4\" fill=\"#ffffff\" height=\"9.706\" rx=\"2\" width=\"9.811\" x=\"8.83\" y=\"5.881\" />\n      <path\n        id=\"svg_5\"\n        d=\"m4.906,35.833c0,-0.75801 0.63699,-1.395 1.395,-1.395l14.87,0c0.75801,0 1.395,0.63699 1.395,1.395l0,-0.001c0,0.75801 -0.63699,1.395 -1.395,1.395l-14.87,0c-0.75801,0 -1.395,-0.63699 -1.395,-1.395l0,0.001z\"\n        fill=\"#ffffff\"\n        opacity=\"undefined\"\n      />\n      <rect id=\"svg_6\" fill=\"#ffffff\" height=\"2.789\" rx=\"1.395\" width=\"17.66\" x=\"4.906\" y=\"44.992\" />\n      <rect id=\"svg_7\" fill=\"#ffffff\" height=\"2.789\" rx=\"1.395\" width=\"17.66\" x=\"4.906\" y=\"55.546\" />\n      <rect id=\"svg_8\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"9.07027\" rx=\"2\" stroke=\"null\" width=\"73.53879\" x=\"28.97986\" y=\"1.42876\" />\n      <rect id=\"svg_9\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"32.039\" y=\"3.89903\" />\n      <rect id=\"svg_10\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"80.75054\" y=\"3.62876\" />\n      <rect id=\"svg_11\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"87.58249\" y=\"3.49362\" />\n      <rect id=\"svg_12\" fill=\"#b2b2b2\" height=\"4.4\" rx=\"1\" stroke=\"null\" width=\"3.925\" x=\"94.6847\" y=\"3.62876\" />\n      <rect id=\"svg_13\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.51892\" rx=\"2\" stroke=\"null\" width=\"45.63141\" x=\"56.05157\" y=\"14.613\" />\n      <rect id=\"svg_14\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"20.97838\" rx=\"2\" stroke=\"null\" width=\"22.82978\" x=\"29.38527\" y=\"14.613\" />\n      <rect id=\"svg_15\" fill=\"currentColor\" fill-opacity=\"0.08\" height=\"21.65405\" rx=\"2\" stroke=\"null\" width=\"72.45771\" x=\"28.97986\" y=\"39.48203\" />\n    </g>\n  </svg>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/index.ts",
    "content": "export { default as PreferencesButton } from \"./preferences-button.vue\";\nexport { default as Preferences } from \"./preferences.vue\";\nexport * from \"./use-open-preferences\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/preferences-button.vue",
    "content": "<script lang=\"ts\" setup>\nimport { Settings } from \"/@/vben/icons\";\n\nimport { VbenIconButton } from \"/@/vben//shadcn-ui\";\n\nimport Preferences from \"./preferences.vue\";\n\nconst emit = defineEmits<{ clearPreferencesAndLogout: [] }>();\n\nfunction clearPreferencesAndLogout() {\n  emit(\"clearPreferencesAndLogout\");\n}\n</script>\n<template>\n  <Preferences @clear-preferences-and-logout=\"clearPreferencesAndLogout\">\n    <VbenIconButton>\n      <Settings class=\"text-foreground size-4\" />\n    </VbenIconButton>\n  </Preferences>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/preferences-drawer.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SupportedLanguagesType } from \"/@/locales\";\nimport type {\n  BreadcrumbStyleType,\n  BuiltinThemeType,\n  ContentCompactType,\n  LayoutHeaderMenuAlignType,\n  LayoutHeaderModeType,\n  LayoutType,\n  NavigationStyleType,\n  PreferencesButtonPositionType,\n  ThemeModeType,\n} from \"/@/vben/types\";\n\nimport type { SegmentedItem } from \"/@/vben//shadcn-ui\";\n\nimport { computed, ref } from \"vue\";\n\nimport { Copy, RotateCw, X } from \"/@/vben/icons\";\nimport { $t, loadLocaleMessages } from \"/@/locales\";\nimport { clearPreferencesCache, preferences, resetPreferences, usePreferences } from \"/@/vben/preferences\";\n\nimport { useVbenDrawer } from \"/@/vben//popup-ui\";\nimport { VbenButton, VbenIconButton, VbenSegmented } from \"/@/vben//shadcn-ui\";\nimport { globalShareState } from \"/@/vben//shared/global-state\";\n\nimport { useClipboard } from \"@vueuse/core\";\n\nimport { Animation, Block, Breadcrumb, BuiltinTheme, ColorMode, Content, Copyright, Footer, General, GlobalShortcutKeys, Header, Layout, Navigation, Radius, Sidebar, Tabbar, Theme, Widget } from \"./blocks\";\n\nconst emit = defineEmits<{ clearPreferencesAndLogout: [] }>();\n\nconst message = globalShareState.getMessage();\n\nconst appLocale = defineModel<SupportedLanguagesType>(\"appLocale\");\nconst appDynamicTitle = defineModel<boolean>(\"appDynamicTitle\");\nconst appLayout = defineModel<LayoutType>(\"appLayout\");\nconst appColorGrayMode = defineModel<boolean>(\"appColorGrayMode\");\nconst appColorWeakMode = defineModel<boolean>(\"appColorWeakMode\");\nconst appContentCompact = defineModel<ContentCompactType>(\"appContentCompact\");\nconst appWatermark = defineModel<boolean>(\"appWatermark\");\nconst appEnableCheckUpdates = defineModel<boolean>(\"appEnableCheckUpdates\");\nconst appPreferencesButtonPosition = defineModel<PreferencesButtonPositionType>(\"appPreferencesButtonPosition\");\n\nconst transitionProgress = defineModel<boolean>(\"transitionProgress\");\nconst transitionName = defineModel<string>(\"transitionName\");\nconst transitionLoading = defineModel<boolean>(\"transitionLoading\");\nconst transitionEnable = defineModel<boolean>(\"transitionEnable\");\n\nconst themeColorPrimary = defineModel<string>(\"themeColorPrimary\");\nconst themeBuiltinType = defineModel<BuiltinThemeType>(\"themeBuiltinType\");\nconst themeMode = defineModel<ThemeModeType>(\"themeMode\");\nconst themeRadius = defineModel<string>(\"themeRadius\");\nconst themeSemiDarkSidebar = defineModel<boolean>(\"themeSemiDarkSidebar\");\nconst themeSemiDarkHeader = defineModel<boolean>(\"themeSemiDarkHeader\");\n\nconst sidebarEnable = defineModel<boolean>(\"sidebarEnable\");\nconst sidebarWidth = defineModel<number>(\"sidebarWidth\");\nconst sidebarCollapsed = defineModel<boolean>(\"sidebarCollapsed\");\nconst sidebarCollapsedShowTitle = defineModel<boolean>(\"sidebarCollapsedShowTitle\");\nconst sidebarAutoActivateChild = defineModel<boolean>(\"sidebarAutoActivateChild\");\nconst SidebarExpandOnHover = defineModel<boolean>(\"sidebarExpandOnHover\");\n\nconst headerEnable = defineModel<boolean>(\"headerEnable\");\nconst headerMode = defineModel<LayoutHeaderModeType>(\"headerMode\");\nconst headerMenuAlign = defineModel<LayoutHeaderMenuAlignType>(\"headerMenuAlign\");\n\nconst breadcrumbEnable = defineModel<boolean>(\"breadcrumbEnable\");\nconst breadcrumbShowIcon = defineModel<boolean>(\"breadcrumbShowIcon\");\nconst breadcrumbShowHome = defineModel<boolean>(\"breadcrumbShowHome\");\nconst breadcrumbStyleType = defineModel<BreadcrumbStyleType>(\"breadcrumbStyleType\");\nconst breadcrumbHideOnlyOne = defineModel<boolean>(\"breadcrumbHideOnlyOne\");\n\nconst tabbarEnable = defineModel<boolean>(\"tabbarEnable\");\nconst tabbarShowIcon = defineModel<boolean>(\"tabbarShowIcon\");\nconst tabbarShowMore = defineModel<boolean>(\"tabbarShowMore\");\nconst tabbarShowMaximize = defineModel<boolean>(\"tabbarShowMaximize\");\nconst tabbarPersist = defineModel<boolean>(\"tabbarPersist\");\nconst tabbarDraggable = defineModel<boolean>(\"tabbarDraggable\");\nconst tabbarWheelable = defineModel<boolean>(\"tabbarWheelable\");\nconst tabbarStyleType = defineModel<string>(\"tabbarStyleType\");\nconst tabbarMaxCount = defineModel<number>(\"tabbarMaxCount\");\nconst tabbarMiddleClickToClose = defineModel<boolean>(\"tabbarMiddleClickToClose\");\n\nconst navigationStyleType = defineModel<NavigationStyleType>(\"navigationStyleType\");\nconst navigationSplit = defineModel<boolean>(\"navigationSplit\");\nconst navigationAccordion = defineModel<boolean>(\"navigationAccordion\");\n\n// const logoVisible = defineModel<boolean>('logoVisible');\n\nconst footerEnable = defineModel<boolean>(\"footerEnable\");\nconst footerFixed = defineModel<boolean>(\"footerFixed\");\n\nconst copyrightSettingShow = defineModel<boolean>(\"copyrightSettingShow\");\nconst copyrightEnable = defineModel<boolean>(\"copyrightEnable\");\nconst copyrightCompanyName = defineModel<string>(\"copyrightCompanyName\");\nconst copyrightCompanySiteLink = defineModel<string>(\"copyrightCompanySiteLink\");\nconst copyrightDate = defineModel<string>(\"copyrightDate\");\nconst copyrightIcp = defineModel<string>(\"copyrightIcp\");\nconst copyrightIcpLink = defineModel<string>(\"copyrightIcpLink\");\n\nconst shortcutKeysEnable = defineModel<boolean>(\"shortcutKeysEnable\");\nconst shortcutKeysGlobalSearch = defineModel<boolean>(\"shortcutKeysGlobalSearch\");\nconst shortcutKeysGlobalLogout = defineModel<boolean>(\"shortcutKeysGlobalLogout\");\n\nconst shortcutKeysGlobalLockScreen = defineModel<boolean>(\"shortcutKeysGlobalLockScreen\");\n\nconst widgetGlobalSearch = defineModel<boolean>(\"widgetGlobalSearch\");\nconst widgetFullscreen = defineModel<boolean>(\"widgetFullscreen\");\nconst widgetLanguageToggle = defineModel<boolean>(\"widgetLanguageToggle\");\nconst widgetNotification = defineModel<boolean>(\"widgetNotification\");\nconst widgetThemeToggle = defineModel<boolean>(\"widgetThemeToggle\");\nconst widgetSidebarToggle = defineModel<boolean>(\"widgetSidebarToggle\");\nconst widgetLockScreen = defineModel<boolean>(\"widgetLockScreen\");\nconst widgetRefresh = defineModel<boolean>(\"widgetRefresh\");\n\nconst { diffPreference, isDark, isFullContent, isHeaderNav, isHeaderSidebarNav, isMixedNav, isSideMixedNav, isSideMode, isSideNav } = usePreferences();\nconst { copy } = useClipboard({ legacy: true });\n\nconst [Drawer, drawerApi] = useVbenDrawer();\n\nconst activeTab = ref(\"appearance\");\n\nconst tabs = computed((): SegmentedItem[] => {\n  return [\n    {\n      label: $t(\"preferences.appearance\"),\n      value: \"appearance\",\n    },\n    {\n      label: $t(\"preferences.layout\"),\n      value: \"layout\",\n    },\n    {\n      label: $t(\"preferences.shortcutKeys.title\"),\n      value: \"shortcutKey\",\n    },\n    {\n      label: $t(\"preferences.general\"),\n      value: \"general\",\n    },\n  ];\n});\n\nconst showBreadcrumbConfig = computed(() => {\n  return !isFullContent.value && !isMixedNav.value && !isHeaderNav.value && preferences.header.enable;\n});\n\nasync function handleCopy() {\n  await copy(JSON.stringify(diffPreference.value, null, 2));\n\n  message.copyPreferencesSuccess?.($t(\"preferences.copyPreferencesSuccessTitle\"), $t(\"preferences.copyPreferencesSuccess\"));\n}\n\nasync function handleClearCache() {\n  resetPreferences();\n  clearPreferencesCache();\n  emit(\"clearPreferencesAndLogout\");\n}\n\nasync function handleReset() {\n  if (!diffPreference.value) {\n    return;\n  }\n  resetPreferences();\n  await loadLocaleMessages(preferences.app.locale);\n}\n</script>\n\n<template>\n  <div>\n    <Drawer :description=\"$t('preferences.subtitle')\" :title=\"$t('preferences.title')\" class=\"sm:max-w-sm\">\n      <template #extra>\n        <div class=\"flex items-center\">\n          <VbenIconButton :disabled=\"!diffPreference\" :tooltip=\"$t('preferences.resetTip')\" class=\"relative\">\n            <span v-if=\"diffPreference\" class=\"bg-primary absolute right-0.5 top-0.5 h-2 w-2 rounded\"></span>\n            <RotateCw class=\"size-4\" @click=\"handleReset\" />\n          </VbenIconButton>\n\n          <VbenIconButton class=\"relative\" @click=\"drawerApi.close()\">\n            <X class=\"size-4\" />\n          </VbenIconButton>\n        </div>\n      </template>\n\n      <div class=\"p-1\">\n        <VbenSegmented v-model=\"activeTab\" :tabs=\"tabs\">\n          <template #general>\n            <Block :title=\"$t('preferences.general')\">\n              <General v-model:app-dynamic-title=\"appDynamicTitle\" v-model:app-enable-check-updates=\"appEnableCheckUpdates\" v-model:app-locale=\"appLocale\" v-model:app-watermark=\"appWatermark\" />\n            </Block>\n\n            <Block :title=\"$t('preferences.animation.title')\">\n              <Animation v-model:transition-enable=\"transitionEnable\" v-model:transition-loading=\"transitionLoading\" v-model:transition-name=\"transitionName\" v-model:transition-progress=\"transitionProgress\" />\n            </Block>\n          </template>\n          <template #appearance>\n            <Block :title=\"$t('preferences.theme.title')\">\n              <Theme v-model=\"themeMode\" v-model:theme-semi-dark-header=\"themeSemiDarkHeader\" v-model:theme-semi-dark-sidebar=\"themeSemiDarkSidebar\" />\n            </Block>\n            <Block :title=\"$t('preferences.theme.builtin.title')\">\n              <BuiltinTheme v-model=\"themeBuiltinType\" v-model:theme-color-primary=\"themeColorPrimary\" :is-dark=\"isDark\" />\n            </Block>\n            <Block :title=\"$t('preferences.theme.radius')\">\n              <Radius v-model=\"themeRadius\" />\n            </Block>\n            <Block :title=\"$t('preferences.other')\">\n              <ColorMode v-model:app-color-gray-mode=\"appColorGrayMode\" v-model:app-color-weak-mode=\"appColorWeakMode\" />\n            </Block>\n          </template>\n          <template #layout>\n            <Block :title=\"$t('preferences.layout')\">\n              <Layout v-model=\"appLayout\" />\n            </Block>\n            <Block :title=\"$t('preferences.content')\">\n              <Content v-model=\"appContentCompact\" />\n            </Block>\n\n            <Block :title=\"$t('preferences.sidebar.title')\">\n              <Sidebar\n                v-model:sidebar-auto-activate-child=\"sidebarAutoActivateChild\"\n                v-model:sidebar-collapsed=\"sidebarCollapsed\"\n                v-model:sidebar-collapsed-show-title=\"sidebarCollapsedShowTitle\"\n                v-model:sidebar-enable=\"sidebarEnable\"\n                v-model:sidebar-expand-on-hover=\"SidebarExpandOnHover\"\n                v-model:sidebar-width=\"sidebarWidth\"\n                :current-layout=\"appLayout\"\n                :disabled=\"!isSideMode\"\n              />\n            </Block>\n\n            <Block :title=\"$t('preferences.header.title')\">\n              <Header v-model:header-enable=\"headerEnable\" v-model:header-menu-align=\"headerMenuAlign\" v-model:header-mode=\"headerMode\" :disabled=\"isFullContent\" />\n            </Block>\n\n            <Block :title=\"$t('preferences.navigationMenu.title')\">\n              <Navigation\n                v-model:navigation-accordion=\"navigationAccordion\"\n                v-model:navigation-split=\"navigationSplit\"\n                v-model:navigation-style-type=\"navigationStyleType\"\n                :disabled=\"isFullContent\"\n                :disabled-navigation-split=\"!isMixedNav\"\n              />\n            </Block>\n\n            <Block :title=\"$t('preferences.breadcrumb.title')\">\n              <Breadcrumb\n                v-model:breadcrumb-enable=\"breadcrumbEnable\"\n                v-model:breadcrumb-hide-only-one=\"breadcrumbHideOnlyOne\"\n                v-model:breadcrumb-show-home=\"breadcrumbShowHome\"\n                v-model:breadcrumb-show-icon=\"breadcrumbShowIcon\"\n                v-model:breadcrumb-style-type=\"breadcrumbStyleType\"\n                :disabled=\"!showBreadcrumbConfig || !(isSideNav || isSideMixedNav || isHeaderSidebarNav)\"\n              />\n            </Block>\n            <Block :title=\"$t('preferences.tabbar.title')\">\n              <Tabbar\n                v-model:tabbar-draggable=\"tabbarDraggable\"\n                v-model:tabbar-enable=\"tabbarEnable\"\n                v-model:tabbar-persist=\"tabbarPersist\"\n                v-model:tabbar-show-icon=\"tabbarShowIcon\"\n                v-model:tabbar-show-maximize=\"tabbarShowMaximize\"\n                v-model:tabbar-show-more=\"tabbarShowMore\"\n                v-model:tabbar-style-type=\"tabbarStyleType\"\n                v-model:tabbar-wheelable=\"tabbarWheelable\"\n                v-model:tabbar-max-count=\"tabbarMaxCount\"\n                v-model:tabbar-middle-click-to-close=\"tabbarMiddleClickToClose\"\n              />\n            </Block>\n            <Block :title=\"$t('preferences.widget.title')\">\n              <Widget\n                v-model:app-preferences-button-position=\"appPreferencesButtonPosition\"\n                v-model:widget-fullscreen=\"widgetFullscreen\"\n                v-model:widget-global-search=\"widgetGlobalSearch\"\n                v-model:widget-language-toggle=\"widgetLanguageToggle\"\n                v-model:widget-lock-screen=\"widgetLockScreen\"\n                v-model:widget-notification=\"widgetNotification\"\n                v-model:widget-refresh=\"widgetRefresh\"\n                v-model:widget-sidebar-toggle=\"widgetSidebarToggle\"\n                v-model:widget-theme-toggle=\"widgetThemeToggle\"\n              />\n            </Block>\n            <Block :title=\"$t('preferences.footer.title')\">\n              <Footer v-model:footer-enable=\"footerEnable\" v-model:footer-fixed=\"footerFixed\" />\n            </Block>\n            <Block v-if=\"copyrightSettingShow\" :title=\"$t('preferences.copyright.title')\">\n              <Copyright\n                v-model:copyright-company-name=\"copyrightCompanyName\"\n                v-model:copyright-company-site-link=\"copyrightCompanySiteLink\"\n                v-model:copyright-date=\"copyrightDate\"\n                v-model:copyright-enable=\"copyrightEnable\"\n                v-model:copyright-icp=\"copyrightIcp\"\n                v-model:copyright-icp-link=\"copyrightIcpLink\"\n                :disabled=\"!footerEnable\"\n              />\n            </Block>\n          </template>\n\n          <template #shortcutKey>\n            <Block :title=\"$t('preferences.shortcutKeys.global')\">\n              <GlobalShortcutKeys\n                v-model:shortcut-keys-enable=\"shortcutKeysEnable\"\n                v-model:shortcut-keys-global-search=\"shortcutKeysGlobalSearch\"\n                v-model:shortcut-keys-lock-screen=\"shortcutKeysGlobalLockScreen\"\n                v-model:shortcut-keys-logout=\"shortcutKeysGlobalLogout\"\n              />\n            </Block>\n          </template>\n        </VbenSegmented>\n      </div>\n\n      <template #footer>\n        <VbenButton :disabled=\"!diffPreference\" class=\"mx-4 w-full\" size=\"sm\" variant=\"default\" @click=\"handleCopy\">\n          <Copy class=\"mr-2 size-3\" />\n          {{ $t(\"preferences.copyPreferences\") }}\n        </VbenButton>\n        <VbenButton :disabled=\"!diffPreference\" class=\"mr-4 w-full\" size=\"sm\" variant=\"ghost\" @click=\"handleClearCache\">\n          {{ $t(\"preferences.clearAndLogout\") }}\n        </VbenButton>\n      </template>\n    </Drawer>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/preferences.vue",
    "content": "<script lang=\"ts\" setup>\nimport { computed } from \"vue\";\n\nimport { Settings } from \"/@/vben/icons\";\nimport { $t, loadLocaleMessages } from \"/@/locales\";\nimport { preferences, updatePreferences } from \"/@/vben/preferences\";\nimport { capitalizeFirstLetter } from \"/@/vben/utils\";\n\nimport { useVbenDrawer } from \"/@/vben//popup-ui\";\nimport { VbenButton } from \"/@/vben//shadcn-ui\";\n\nimport PreferencesDrawer from \"./preferences-drawer.vue\";\n\nconst [Drawer, drawerApi] = useVbenDrawer({\n  connectedComponent: PreferencesDrawer,\n});\n\n/**\n * preferences 转成 vue props\n * preferences.widget.fullscreen=>widgetFullscreen\n */\nconst attrs = computed(() => {\n  const result: Record<string, any> = {};\n  for (const [key, value] of Object.entries(preferences)) {\n    for (const [subKey, subValue] of Object.entries(value)) {\n      result[`${key}${capitalizeFirstLetter(subKey)}`] = subValue;\n    }\n  }\n  return result;\n});\n\n/**\n * preferences 转成 vue listener\n * preferences.widget.fullscreen=>@update:widgetFullscreen\n */\nconst listen = computed(() => {\n  const result: Record<string, any> = {};\n  for (const [key, value] of Object.entries(preferences)) {\n    if (typeof value === \"object\") {\n      for (const subKey of Object.keys(value)) {\n        result[`update:${key}${capitalizeFirstLetter(subKey)}`] = (val: any) => {\n          updatePreferences({ [key]: { [subKey]: val } });\n          if (key === \"app\" && subKey === \"locale\") {\n            loadLocaleMessages(val);\n          }\n        };\n      }\n    } else {\n      result[key] = value;\n    }\n  }\n  return result;\n});\n</script>\n<template>\n  <div>\n    <Drawer v-bind=\"{ ...$attrs, ...attrs }\" v-on=\"listen\" />\n\n    <div @click=\"() => drawerApi.open()\">\n      <slot>\n        <VbenButton :title=\"$t('preferences.title')\" class=\"bg-primary flex-col-center size-10 cursor-pointer rounded-l-lg rounded-r-none border-none\">\n          <Settings class=\"size-5\" />\n        </VbenButton>\n      </slot>\n    </div>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/preferences/use-open-preferences.ts",
    "content": "import { ref } from \"vue\";\n\nconst openPreferences = ref(false);\n\nfunction useOpenPreferences() {\n  function handleOpenPreference() {\n    openPreferences.value = true;\n  }\n\n  return {\n    handleOpenPreference,\n    openPreferences,\n  };\n}\n\nexport { useOpenPreferences };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/theme-toggle/index.ts",
    "content": "export { default as ThemeToggle } from \"./theme-toggle.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/theme-toggle/theme-button.vue",
    "content": "<script lang=\"ts\" setup>\nimport { computed, nextTick } from \"vue\";\n\nimport { VbenButton } from \"/@/vben//shadcn-ui\";\n\ninterface Props {\n  /**\n   * 类型\n   */\n  type?: \"icon\" | \"normal\";\n}\n\ndefineOptions({\n  name: \"ThemeToggleButton\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  type: \"normal\",\n});\n\nconst isDark = defineModel<boolean>();\n\nconst theme = computed(() => {\n  return isDark.value ? \"light\" : \"dark\";\n});\n\nconst bindProps = computed(() => {\n  const type = props.type;\n\n  return type === \"normal\"\n    ? {\n        variant: \"heavy\" as const,\n      }\n    : {\n        class: \"rounded-full\",\n        size: \"icon\" as const,\n        style: { padding: \"7px\" },\n        variant: \"icon\" as const,\n      };\n});\n\nfunction toggleTheme(event: MouseEvent) {\n  const isAppearanceTransition =\n    // @ts-expect-error\n    document.startViewTransition && !window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n  if (!isAppearanceTransition || !event) {\n    isDark.value = !isDark.value;\n    return;\n  }\n  const x = event.clientX;\n  const y = event.clientY;\n  const endRadius = Math.hypot(Math.max(x, innerWidth - x), Math.max(y, innerHeight - y));\n  // @ts-ignore startViewTransition\n  const transition = document.startViewTransition(async () => {\n    isDark.value = !isDark.value;\n    await nextTick();\n  });\n  transition.ready.then(() => {\n    const clipPath = [`circle(0px at ${x}px ${y}px)`, `circle(${endRadius}px at ${x}px ${y}px)`];\n    document.documentElement.animate(\n      {\n        clipPath: isDark.value ? [...clipPath].reverse() : clipPath,\n      },\n      {\n        duration: 450,\n        easing: \"ease-in\",\n        pseudoElement: isDark.value ? \"::view-transition-old(root)\" : \"::view-transition-new(root)\",\n      }\n    );\n  });\n}\n</script>\n\n<template>\n  <VbenButton :aria-label=\"theme\" :class=\"[`is-${theme}`]\" aria-live=\"polite\" class=\"theme-toggle cursor-pointer border-none bg-none\" v-bind=\"bindProps\" @click.stop=\"toggleTheme\">\n    <svg aria-hidden=\"true\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\">\n      <mask id=\"theme-toggle-moon\" class=\"theme-toggle__moon\" fill=\"hsl(var(--foreground)/80%)\" stroke=\"none\">\n        <rect fill=\"white\" height=\"100%\" width=\"100%\" x=\"0\" y=\"0\" />\n        <circle cx=\"40\" cy=\"8\" fill=\"black\" r=\"11\" />\n      </mask>\n      <circle id=\"sun\" class=\"theme-toggle__sun\" cx=\"12\" cy=\"12\" mask=\"url(#theme-toggle-moon)\" r=\"11\" />\n      <g class=\"theme-toggle__sun-beams\">\n        <line x1=\"12\" x2=\"12\" y1=\"1\" y2=\"3\" />\n        <line x1=\"12\" x2=\"12\" y1=\"21\" y2=\"23\" />\n        <line x1=\"4.22\" x2=\"5.64\" y1=\"4.22\" y2=\"5.64\" />\n        <line x1=\"18.36\" x2=\"19.78\" y1=\"18.36\" y2=\"19.78\" />\n        <line x1=\"1\" x2=\"3\" y1=\"12\" y2=\"12\" />\n        <line x1=\"21\" x2=\"23\" y1=\"12\" y2=\"12\" />\n        <line x1=\"4.22\" x2=\"5.64\" y1=\"19.78\" y2=\"18.36\" />\n        <line x1=\"18.36\" x2=\"19.78\" y1=\"5.64\" y2=\"4.22\" />\n      </g>\n    </svg>\n  </VbenButton>\n</template>\n\n<style scoped>\n.theme-toggle {\n  &__moon {\n    & > circle {\n      transition: transform 0.5s cubic-bezier(0, 0, 0.3, 1);\n    }\n  }\n\n  &__sun {\n    @apply fill-foreground/90 stroke-none;\n\n    transition: transform 1.6s cubic-bezier(0.25, 0, 0.2, 1);\n    transform-origin: center center;\n\n    &:hover > svg > & {\n      @apply fill-foreground/90;\n    }\n  }\n\n  &__sun-beams {\n    @apply stroke-foreground/90 stroke-[2px];\n\n    transition:\n      transform 1.6s cubic-bezier(0.5, 1.5, 0.75, 1.25),\n      opacity 0.6s cubic-bezier(0.25, 0, 0.3, 1);\n    transform-origin: center center;\n\n    &:hover > svg > & {\n      @apply stroke-foreground;\n    }\n  }\n\n  &.is-light {\n    .theme-toggle__sun {\n      @apply scale-50;\n    }\n\n    .theme-toggle__sun-beams {\n      transform: rotateZ(0.25turn);\n    }\n  }\n\n  &.is-dark {\n    .theme-toggle__moon {\n      & > circle {\n        transform: translateX(-20px);\n      }\n    }\n\n    .theme-toggle__sun-beams {\n      @apply opacity-0;\n    }\n  }\n\n  &:hover > svg {\n    .theme-toggle__sun,\n    .theme-toggle__moon {\n      @apply fill-foreground;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/theme-toggle/theme-toggle.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { ThemeModeType } from \"/@/vben/types\";\n\nimport { MoonStar, Sun, SunMoon } from \"/@/vben/icons\";\nimport { $t } from \"/@/locales\";\nimport { preferences, updatePreferences, usePreferences } from \"/@/vben/preferences\";\n\nimport { ToggleGroup, ToggleGroupItem, VbenTooltip } from \"/@/vben//shadcn-ui\";\n\nimport ThemeButton from \"./theme-button.vue\";\n\ndefineOptions({\n  name: \"ThemeToggle\",\n});\n\nwithDefaults(defineProps<{ shouldOnHover?: boolean }>(), {\n  shouldOnHover: false,\n});\n\nfunction handleChange(isDark: boolean) {\n  updatePreferences({\n    theme: { mode: isDark ? \"dark\" : \"light\" },\n  });\n}\n\nconst { isDark } = usePreferences();\n\nconst PRESETS = [\n  {\n    icon: Sun,\n    name: \"light\",\n    title: $t(\"preferences.theme.light\"),\n  },\n  {\n    icon: MoonStar,\n    name: \"dark\",\n    title: $t(\"preferences.theme.dark\"),\n  },\n  {\n    icon: SunMoon,\n    name: \"auto\",\n    title: $t(\"preferences.followSystem\"),\n  },\n];\n</script>\n<template>\n  <div>\n    <VbenTooltip :disabled=\"!shouldOnHover\" side=\"bottom\">\n      <template #trigger>\n        <ThemeButton :model-value=\"isDark\" type=\"icon\" @update:model-value=\"handleChange\" />\n      </template>\n      <ToggleGroup :model-value=\"preferences.theme.mode\" class=\"gap-2\" type=\"single\" variant=\"outline\" @update:model-value=\"val => updatePreferences({ theme: { mode: val as ThemeModeType } })\">\n        <ToggleGroupItem v-for=\"item in PRESETS\" :key=\"item.name\" :value=\"item.name\">\n          <component :is=\"item.icon\" class=\"size-5\" />\n        </ToggleGroupItem>\n      </ToggleGroup>\n    </VbenTooltip>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/user-dropdown/index.ts",
    "content": "export { default as UserDropdown } from \"./user-dropdown.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/layouts/widgets/user-dropdown/user-dropdown.vue",
    "content": "<script setup lang=\"ts\">\nimport type { Component } from \"vue\";\n\nimport type { AnyFunction } from \"/@/vben/types\";\n\nimport { computed, useTemplateRef, watch } from \"vue\";\n\nimport { useHoverToggle } from \"/@/vben/hooks\";\nimport { LockKeyhole, LogOut } from \"/@/vben/icons\";\nimport { $t } from \"/@/locales\";\nimport { preferences, usePreferences } from \"/@/vben/preferences\";\nimport { useLockStore } from \"/@/vben/stores\";\nimport { isWindowsOs } from \"/@/vben/utils\";\n\nimport { useVbenModal } from \"/@/vben//popup-ui\";\nimport { Badge, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger, VbenAvatar, VbenIcon } from \"/@/vben//shadcn-ui\";\n\nimport { useMagicKeys, whenever } from \"@vueuse/core\";\n\nimport { LockScreenModal } from \"../lock-screen\";\n\ninterface Props {\n  /**\n   * 头像\n   */\n  avatar?: string;\n  /**\n   * @zh_CN 描述\n   */\n  description?: string;\n  /**\n   * 是否启用快捷键\n   */\n  enableShortcutKey?: boolean;\n  /**\n   * 菜单数组\n   */\n  menus?: Array<{ handler: AnyFunction; icon?: Component | string; text: string }>;\n\n  /**\n   * 标签文本\n   */\n  tagText?: string;\n  /**\n   * 文本\n   */\n  text?: string;\n  /** 触发方式 */\n  trigger?: \"both\" | \"click\" | \"hover\";\n  /** hover触发时，延迟响应的时间 */\n  hoverDelay?: number;\n}\n\ndefineOptions({\n  name: \"UserDropdown\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  avatar: \"\",\n  description: \"\",\n  enableShortcutKey: true,\n  menus: () => [],\n  showShortcutKey: true,\n  tagText: \"\",\n  text: \"\",\n  trigger: \"click\",\n  hoverDelay: 500,\n});\n\nconst emit = defineEmits<{ logout: [] }>();\n\nconst { globalLockScreenShortcutKey, globalLogoutShortcutKey } = usePreferences();\nconst lockStore = useLockStore();\nconst [LockModal, lockModalApi] = useVbenModal({\n  connectedComponent: LockScreenModal,\n});\nconst [LogoutModal, logoutModalApi] = useVbenModal({\n  onConfirm() {\n    handleSubmitLogout();\n  },\n});\n\nconst refTrigger = useTemplateRef(\"refTrigger\");\nconst refContent = useTemplateRef(\"refContent\");\nconst [openPopover, hoverWatcher] = useHoverToggle([refTrigger, refContent], () => props.hoverDelay);\n\nwatch(\n  () => props.trigger === \"hover\" || props.trigger === \"both\",\n  val => {\n    if (val) {\n      hoverWatcher.enable();\n    } else {\n      hoverWatcher.disable();\n    }\n  },\n  {\n    immediate: true,\n  }\n);\n\nconst altView = computed(() => (isWindowsOs() ? \"Alt\" : \"⌥\"));\n\nconst enableLogoutShortcutKey = computed(() => {\n  return props.enableShortcutKey && globalLogoutShortcutKey.value;\n});\n\nconst enableLockScreenShortcutKey = computed(() => {\n  return props.enableShortcutKey && globalLockScreenShortcutKey.value;\n});\n\nconst enableShortcutKey = computed(() => {\n  return props.enableShortcutKey && preferences.shortcutKeys.enable;\n});\n\nfunction handleOpenLock() {\n  lockModalApi.open();\n}\n\nfunction handleSubmitLock(lockScreenPassword: string) {\n  lockModalApi.close();\n  lockStore.lockScreen(lockScreenPassword);\n}\n\nfunction handleLogout() {\n  // emit\n  logoutModalApi.open();\n  openPopover.value = false;\n}\n\nfunction handleSubmitLogout() {\n  emit(\"logout\");\n  logoutModalApi.close();\n}\n\nif (enableShortcutKey.value) {\n  const keys = useMagicKeys();\n  whenever(keys[\"Alt+KeyQ\"]!, () => {\n    if (enableLogoutShortcutKey.value) {\n      handleLogout();\n    }\n  });\n\n  whenever(keys[\"Alt+KeyL\"]!, () => {\n    if (enableLockScreenShortcutKey.value) {\n      handleOpenLock();\n    }\n  });\n}\n</script>\n\n<template>\n  <LockModal v-if=\"preferences.widget.lockScreen\" :avatar=\"avatar\" :text=\"text\" @submit=\"handleSubmitLock\" />\n\n  <LogoutModal\n    :cancel-text=\"$t('common.cancel')\"\n    :confirm-text=\"$t('common.confirm')\"\n    :fullscreen-button=\"false\"\n    :title=\"$t('common.prompt')\"\n    centered\n    content-class=\"px-8 min-h-10\"\n    footer-class=\"border-none mb-3 mr-3\"\n    header-class=\"border-none\"\n  >\n    {{ $t(\"ui.widgets.logoutTip\") }}\n  </LogoutModal>\n\n  <DropdownMenu v-model:open=\"openPopover\">\n    <DropdownMenuTrigger ref=\"refTrigger\" :disabled=\"props.trigger === 'hover'\">\n      <div class=\"hover:bg-accent ml-1 mr-2 cursor-pointer rounded-full p-1.5\">\n        <div class=\"hover:text-accent-foreground flex-center\">\n          <VbenAvatar :alt=\"text\" :src=\"avatar\" class=\"size-8\" dot />\n        </div>\n      </div>\n    </DropdownMenuTrigger>\n    <DropdownMenuContent class=\"mr-2 min-w-[240px] p-0 pb-1\">\n      <div ref=\"refContent\">\n        <DropdownMenuLabel class=\"flex items-center p-3\">\n          <VbenAvatar :alt=\"text\" :src=\"avatar\" class=\"size-12\" dot dot-class=\"bottom-0 right-1 border-2 size-4 bg-green-500\" />\n          <div class=\"ml-2 w-full\">\n            <div v-if=\"tagText || text || $slots.tagText\" class=\"text-foreground mb-1 flex items-center text-sm font-medium\">\n              {{ text }}\n              <slot name=\"tagText\">\n                <Badge v-if=\"tagText\" class=\"ml-2 text-green-400\">\n                  {{ tagText }}\n                </Badge>\n              </slot>\n            </div>\n            <div class=\"text-muted-foreground text-xs font-normal\">\n              {{ description }}\n            </div>\n          </div>\n        </DropdownMenuLabel>\n        <DropdownMenuSeparator v-if=\"menus?.length\" />\n        <DropdownMenuItem v-for=\"menu in menus\" :key=\"menu.text\" class=\"mx-1 flex cursor-pointer items-center rounded-sm py-1 leading-8\" @click=\"menu.handler\">\n          <VbenIcon :icon=\"menu.icon\" class=\"mr-2 size-4\" />\n          {{ menu.text }}\n        </DropdownMenuItem>\n        <DropdownMenuSeparator />\n        <DropdownMenuItem v-if=\"preferences.widget.lockScreen\" class=\"mx-1 flex cursor-pointer items-center rounded-sm py-1 leading-8\" @click=\"handleOpenLock\">\n          <LockKeyhole class=\"mr-2 size-4\" />\n          {{ $t(\"ui.widgets.lockScreen.title\") }}\n          <DropdownMenuShortcut v-if=\"enableLockScreenShortcutKey\"> {{ altView }} L </DropdownMenuShortcut>\n        </DropdownMenuItem>\n        <DropdownMenuSeparator v-if=\"preferences.widget.lockScreen\" />\n        <DropdownMenuItem class=\"mx-1 flex cursor-pointer items-center rounded-sm py-1 leading-8\" @click=\"handleLogout\">\n          <LogOut class=\"mr-2 size-4\" />\n          {{ $t(\"common.logout\") }}\n          <DropdownMenuShortcut v-if=\"enableLogoutShortcutKey\"> {{ altView }} Q </DropdownMenuShortcut>\n        </DropdownMenuItem>\n      </div>\n    </DropdownMenuContent>\n  </DropdownMenu>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/components/collapse-transition.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { RendererElement } from \"vue\";\n\ndefineOptions({\n  name: \"CollapseTransition\",\n});\n\nconst reset = (el: RendererElement) => {\n  el.style.maxHeight = \"\";\n  el.style.overflow = el.dataset.oldOverflow;\n  el.style.paddingTop = el.dataset.oldPaddingTop;\n  el.style.paddingBottom = el.dataset.oldPaddingBottom;\n};\n\nconst on = {\n  afterEnter(el: RendererElement) {\n    el.style.maxHeight = \"\";\n    el.style.overflow = el.dataset.oldOverflow;\n  },\n\n  afterLeave(el: RendererElement) {\n    reset(el);\n  },\n\n  beforeEnter(el: RendererElement) {\n    if (!el.dataset) el.dataset = {};\n\n    el.dataset.oldPaddingTop = el.style.paddingTop;\n    el.dataset.oldMarginTop = el.style.marginTop;\n\n    el.dataset.oldPaddingBottom = el.style.paddingBottom;\n    el.dataset.oldMarginBottom = el.style.marginBottom;\n    if (el.style.height) el.dataset.elExistsHeight = el.style.height;\n\n    el.style.maxHeight = 0;\n    el.style.paddingTop = 0;\n    el.style.marginTop = 0;\n    el.style.paddingBottom = 0;\n    el.style.marginBottom = 0;\n  },\n\n  beforeLeave(el: RendererElement) {\n    if (!el.dataset) el.dataset = {};\n    el.dataset.oldPaddingTop = el.style.paddingTop;\n    el.dataset.oldMarginTop = el.style.marginTop;\n    el.dataset.oldPaddingBottom = el.style.paddingBottom;\n    el.dataset.oldMarginBottom = el.style.marginBottom;\n    el.dataset.oldOverflow = el.style.overflow;\n    el.style.maxHeight = `${el.scrollHeight}px`;\n    el.style.overflow = \"hidden\";\n  },\n\n  enter(el: RendererElement) {\n    requestAnimationFrame(() => {\n      el.dataset.oldOverflow = el.style.overflow;\n      if (el.dataset.elExistsHeight) {\n        el.style.maxHeight = el.dataset.elExistsHeight;\n      } else if (el.scrollHeight === 0) {\n        el.style.maxHeight = 0;\n      } else {\n        el.style.maxHeight = `${el.scrollHeight}px`;\n      }\n\n      el.style.paddingTop = el.dataset.oldPaddingTop;\n      el.style.paddingBottom = el.dataset.oldPaddingBottom;\n      el.style.marginTop = el.dataset.oldMarginTop;\n      el.style.marginBottom = el.dataset.oldMarginBottom;\n      el.style.overflow = \"hidden\";\n    });\n  },\n\n  enterCancelled(el: RendererElement) {\n    reset(el);\n  },\n\n  leave(el: RendererElement) {\n    if (el.scrollHeight !== 0) {\n      el.style.maxHeight = 0;\n      el.style.paddingTop = 0;\n      el.style.paddingBottom = 0;\n      el.style.marginTop = 0;\n      el.style.marginBottom = 0;\n    }\n  },\n\n  leaveCancelled(el: RendererElement) {\n    reset(el);\n  },\n};\n</script>\n\n<template>\n  <transition name=\"collapse-transition\" v-on=\"on\">\n    <slot></slot>\n  </transition>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/components/index.ts",
    "content": "export { default as MenuBadge } from \"./menu-badge.vue\";\nexport { default as MenuItem } from \"./menu-item.vue\";\nexport { default as Menu } from \"./menu.vue\";\nexport { default as SubMenu } from \"./sub-menu.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/components/menu-badge-dot.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CSSProperties } from \"vue\";\n\ninterface Props {\n  dotClass?: string;\n  dotStyle?: CSSProperties;\n}\n\nwithDefaults(defineProps<Props>(), {\n  dotClass: \"\",\n  dotStyle: () => ({}),\n});\n</script>\n<template>\n  <span class=\"relative mr-1 flex size-1.5\">\n    <span :class=\"dotClass\" :style=\"dotStyle\" class=\"absolute inline-flex h-full w-full animate-ping rounded-full opacity-75\"> </span>\n    <span :class=\"dotClass\" :style=\"dotStyle\" class=\"relative inline-flex size-1.5 rounded-full\"></span>\n  </span>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/components/menu-badge.vue",
    "content": "<script setup lang=\"ts\">\nimport type { MenuRecordBadgeRaw } from \"../../typings\";\n\nimport { computed } from \"vue\";\n\nimport { isValidColor } from \"../../shared/color\";\n\nimport BadgeDot from \"./menu-badge-dot.vue\";\n\ninterface Props extends MenuRecordBadgeRaw {\n  hasChildren?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {});\n\nconst variantsMap: Record<string, string> = {\n  default: \"bg-green-500\",\n  destructive: \"bg-destructive\",\n  primary: \"bg-primary\",\n  success: \"bg-green-500\",\n  warning: \"bg-yellow-500\",\n};\n\nconst isDot = computed(() => props.badgeType === \"dot\");\n\nconst badgeClass = computed(() => {\n  const { badgeVariants } = props;\n\n  if (!badgeVariants) {\n    return variantsMap.default;\n  }\n\n  return variantsMap[badgeVariants] || badgeVariants;\n});\n\nconst badgeStyle = computed(() => {\n  if (badgeClass.value && isValidColor(badgeClass.value)) {\n    return {\n      backgroundColor: badgeClass.value,\n    };\n  }\n  return {};\n});\n</script>\n<template>\n  <span v-if=\"isDot || badge\" :class=\"$attrs.class\" class=\"absolute\">\n    <BadgeDot v-if=\"isDot\" :dot-class=\"badgeClass\" :dot-style=\"badgeStyle\" />\n    <div v-else :class=\"badgeClass\" :style=\"badgeStyle\" class=\"text-primary-foreground flex-center rounded-xl px-1.5 py-0.5 text-[10px]\">\n      {{ badge }}\n    </div>\n  </span>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/components/menu-item.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { MenuItemProps, MenuItemRegistered } from \"../types\";\n\nimport { computed, onBeforeUnmount, onMounted, reactive, useSlots } from \"vue\";\n\nimport { useNamespace } from \"../../composables\";\nimport { VbenIcon, VbenTooltip } from \"../../shadcn-ui\";\n\nimport { MenuBadge } from \"../components\";\nimport { useMenu, useMenuContext, useSubMenuContext } from \"../hooks\";\n\ninterface Props extends MenuItemProps {}\n\ndefineOptions({ name: \"MenuItem\" });\n\nconst props = withDefaults(defineProps<Props>(), {\n  disabled: false,\n});\n\nconst emit = defineEmits<{ click: [MenuItemRegistered] }>();\n\nconst slots = useSlots();\nconst { b, e, is } = useNamespace(\"menu-item\");\nconst nsMenu = useNamespace(\"menu\");\nconst rootMenu = useMenuContext();\nconst subMenu = useSubMenuContext();\nconst { parentMenu, parentPaths } = useMenu();\n\nconst active = computed(() => props.path === rootMenu?.activePath);\nconst menuIcon = computed(() => (active.value ? props.activeIcon || props.icon : props.icon));\n\nconst isTopLevelMenuItem = computed(() => parentMenu.value?.type.name === \"Menu\");\n\nconst collapseShowTitle = computed(() => rootMenu.props?.collapseShowTitle && isTopLevelMenuItem.value && rootMenu.props.collapse);\n\nconst showTooltip = computed(() => rootMenu.props.mode === \"vertical\" && isTopLevelMenuItem.value && rootMenu.props?.collapse && slots.title);\n\nconst item: MenuItemRegistered = reactive({\n  active,\n  parentPaths: parentPaths.value,\n  path: props.path || \"\",\n});\n\n/**\n * 菜单项点击事件\n */\nfunction handleClick() {\n  if (props.disabled) {\n    return;\n  }\n  if (props.click) {\n    props.click();\n    return;\n  }\n  rootMenu?.handleMenuItemClick?.({\n    parentPaths: parentPaths.value,\n    path: props.path,\n  });\n  emit(\"click\", item);\n}\n\nonMounted(() => {\n  subMenu?.addSubMenu?.(item);\n  rootMenu?.addMenuItem?.(item);\n});\n\nonBeforeUnmount(() => {\n  subMenu?.removeSubMenu?.(item);\n  rootMenu?.removeMenuItem?.(item);\n});\n</script>\n<template>\n  <li :class=\"[rootMenu.theme, b(), is('active', active), is('disabled', disabled), is('collapse-show-title', collapseShowTitle)]\" role=\"menuitem\" @click.stop=\"handleClick\">\n    <VbenTooltip v-if=\"showTooltip\" :content-class=\"[rootMenu.theme]\" side=\"right\">\n      <template #trigger>\n        <div :class=\"[nsMenu.be('tooltip', 'trigger')]\">\n          <VbenIcon :class=\"nsMenu.e('icon')\" :icon=\"menuIcon\" fallback />\n          <slot></slot>\n          <span v-if=\"collapseShowTitle\" :class=\"nsMenu.e('name')\">\n            <slot name=\"title\"></slot>\n          </span>\n        </div>\n      </template>\n      <slot name=\"title\"></slot>\n    </VbenTooltip>\n    <div v-show=\"!showTooltip\" :class=\"[e('content')]\">\n      <MenuBadge v-if=\"rootMenu.props.mode !== 'horizontal'\" class=\"right-2\" v-bind=\"props\" />\n      <VbenIcon :class=\"nsMenu.e('icon')\" :icon=\"menuIcon\" />\n      <slot></slot>\n      <slot name=\"title\"></slot>\n    </div>\n  </li>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/components/menu.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { UseResizeObserverReturn } from \"@vueuse/core\";\n\nimport type { SetupContext, VNodeArrayChildren } from \"vue\";\n\nimport type { MenuItemClicked, MenuItemRegistered, MenuProps, MenuProvider } from \"../types\";\n\nimport { computed, nextTick, reactive, ref, toRef, useSlots, watch, watchEffect } from \"vue\";\n\nimport { useNamespace } from \"../../composables\";\nimport { Ellipsis } from \"../../icons\";\nimport { isHttpUrl } from \"../../shared/utils\";\n\nimport { useResizeObserver } from \"@vueuse/core\";\n\nimport { createMenuContext, createSubMenuContext, useMenuStyle } from \"../hooks\";\nimport { flattedChildren } from \"../utils\";\nimport SubMenu from \"./sub-menu.vue\";\n\ninterface Props extends MenuProps {}\n\n// @ts-ignore\n// eslint-disable-next-line vue/multi-word-component-names,vue/no-reserved-component-names\ndefineOptions({ name: \"Menu\" });\n\nconst props = withDefaults(defineProps<Props>(), {\n  accordion: true,\n  collapse: false,\n  mode: \"vertical\",\n  rounded: true,\n  theme: \"dark\",\n});\n\nconst emit = defineEmits<{\n  close: [string, string[]];\n  open: [string, string[]];\n  select: [string, string[]];\n}>();\n\nconst { b, is } = useNamespace(\"menu\");\nconst menuStyle = useMenuStyle();\nconst slots: SetupContext[\"slots\"] = useSlots();\nconst menu = ref<HTMLUListElement>();\nconst sliceIndex = ref(-1);\nconst openedMenus = ref<MenuProvider[\"openedMenus\"]>(props.defaultOpeneds && !props.collapse ? [...props.defaultOpeneds] : []);\nconst activePath = ref<MenuProvider[\"activePath\"]>(props.defaultActive);\nconst items = ref<MenuProvider[\"items\"]>({});\nconst subMenus = ref<MenuProvider[\"subMenus\"]>({});\nconst mouseInChild = ref(false);\n\nconst isMenuPopup = computed<MenuProvider[\"isMenuPopup\"]>(() => {\n  return props.mode === \"horizontal\" || (props.mode === \"vertical\" && props.collapse);\n});\n\nconst getSlot = computed(() => {\n  // 更新插槽内容\n  const defaultSlots: VNodeArrayChildren = slots.default?.() ?? [];\n\n  const originalSlot = flattedChildren(defaultSlots) as VNodeArrayChildren;\n  const slotDefault = sliceIndex.value === -1 ? originalSlot : originalSlot.slice(0, sliceIndex.value);\n\n  const slotMore = sliceIndex.value === -1 ? [] : originalSlot.slice(sliceIndex.value);\n\n  return { showSlotMore: slotMore.length > 0, slotDefault, slotMore };\n});\n\nwatch(\n  () => props.collapse,\n  value => {\n    if (value) openedMenus.value = [];\n  }\n);\n\nwatch(items.value, initMenu);\n\nwatch(\n  () => props.defaultActive,\n  (currentActive = \"\") => {\n    if (!items.value[currentActive]) {\n      activePath.value = \"\";\n    }\n    updateActiveName(currentActive);\n  }\n);\n\nlet resizeStopper: UseResizeObserverReturn[\"stop\"];\nwatchEffect(() => {\n  if (props.mode === \"horizontal\") {\n    resizeStopper = useResizeObserver(menu, handleResize).stop;\n  } else {\n    resizeStopper?.();\n  }\n});\n\n// 注入上下文\ncreateMenuContext(\n  reactive({\n    activePath,\n    addMenuItem,\n    addSubMenu,\n    closeMenu,\n    handleMenuItemClick,\n    handleSubMenuClick,\n    isMenuPopup,\n    openedMenus,\n    openMenu,\n    props,\n    removeMenuItem,\n    removeSubMenu,\n    subMenus,\n    theme: toRef(props, \"theme\"),\n    items,\n  })\n);\n\ncreateSubMenuContext({\n  addSubMenu,\n  level: 1,\n  mouseInChild,\n  removeSubMenu,\n});\n\nfunction calcMenuItemWidth(menuItem: HTMLElement) {\n  const computedStyle = getComputedStyle(menuItem);\n  const marginLeft = Number.parseInt(computedStyle.marginLeft, 10);\n  const marginRight = Number.parseInt(computedStyle.marginRight, 10);\n  return menuItem.offsetWidth + marginLeft + marginRight || 0;\n}\n\nfunction calcSliceIndex() {\n  if (!menu.value) {\n    return -1;\n  }\n  const items = [...(menu.value?.childNodes ?? [])].filter(\n    item =>\n      // remove comment type node #12634\n      item.nodeName !== \"#comment\" && (item.nodeName !== \"#text\" || item.nodeValue)\n  ) as HTMLElement[];\n\n  const moreItemWidth = 46;\n  const computedMenuStyle = getComputedStyle(menu?.value);\n\n  const paddingLeft = Number.parseInt(computedMenuStyle.paddingLeft, 10);\n  const paddingRight = Number.parseInt(computedMenuStyle.paddingRight, 10);\n  const menuWidth = menu.value?.clientWidth - paddingLeft - paddingRight;\n\n  let calcWidth = 0;\n  let sliceIndex = 0;\n  items.forEach((item, index) => {\n    calcWidth += calcMenuItemWidth(item);\n    if (calcWidth <= menuWidth - moreItemWidth) {\n      sliceIndex = index + 1;\n    }\n  });\n  return sliceIndex === items.length ? -1 : sliceIndex;\n}\n\nfunction debounce(fn: () => void, wait = 33.34) {\n  let timer: null | ReturnType<typeof setTimeout>;\n  return () => {\n    timer && clearTimeout(timer);\n    timer = setTimeout(() => {\n      fn();\n    }, wait);\n  };\n}\n\nlet isFirstTimeRender = true;\nfunction handleResize() {\n  if (sliceIndex.value === calcSliceIndex()) {\n    return;\n  }\n  const callback = () => {\n    sliceIndex.value = -1;\n    nextTick(() => {\n      sliceIndex.value = calcSliceIndex();\n    });\n  };\n  callback();\n  // // execute callback directly when first time resize to avoid shaking\n  isFirstTimeRender ? callback() : debounce(callback)();\n  isFirstTimeRender = false;\n}\n\nfunction getActivePaths() {\n  const activeItem = activePath.value && items.value[activePath.value];\n\n  if (!activeItem || props.mode === \"horizontal\" || props.collapse) {\n    return [];\n  }\n\n  return activeItem.parentPaths;\n}\n\n// 默认展开菜单\nfunction initMenu() {\n  const parentPaths = getActivePaths();\n\n  // 展开该菜单项的路径上所有子菜单\n  // expand all subMenus of the menu item\n  parentPaths.forEach(path => {\n    const subMenu = subMenus.value[path];\n    subMenu && openMenu(path, subMenu.parentPaths);\n  });\n}\n\nfunction updateActiveName(val: string) {\n  const itemsInData = items.value;\n  const item = itemsInData[val] || (activePath.value && itemsInData[activePath.value]) || itemsInData[props.defaultActive || \"\"];\n\n  activePath.value = item ? item.path : val;\n}\n\nfunction handleMenuItemClick(data: MenuItemClicked) {\n  const { collapse, mode } = props;\n  if (mode === \"horizontal\" || collapse) {\n    openedMenus.value = [];\n  }\n  const { parentPaths, path } = data;\n  if (!path || !parentPaths) {\n    return;\n  }\n  if (!isHttpUrl(path)) {\n    activePath.value = path;\n  }\n\n  emit(\"select\", path, parentPaths);\n}\n\nfunction handleSubMenuClick({ parentPaths, path }: MenuItemRegistered) {\n  const isOpened = openedMenus.value.includes(path);\n\n  if (isOpened) {\n    closeMenu(path, parentPaths);\n  } else {\n    openMenu(path, parentPaths);\n  }\n}\n\nfunction close(path: string) {\n  const i = openedMenus.value.indexOf(path);\n\n  if (i !== -1) {\n    openedMenus.value.splice(i, 1);\n  }\n}\n\n/**\n * 关闭、折叠菜单\n */\nfunction closeMenu(path: string, parentPaths: string[]) {\n  if (props.accordion) {\n    openedMenus.value = subMenus.value[path]?.parentPaths ?? [];\n  }\n\n  close(path);\n\n  emit(\"close\", path, parentPaths);\n}\n\n/**\n * 点击展开菜单\n */\nfunction openMenu(path: string, parentPaths: string[]) {\n  if (openedMenus.value.includes(path)) {\n    return;\n  }\n  // 手风琴模式菜单\n  if (props.accordion) {\n    const activeParentPaths = getActivePaths();\n    if (activeParentPaths.includes(path)) {\n      parentPaths = activeParentPaths;\n    }\n    openedMenus.value = openedMenus.value.filter((path: string) => parentPaths.includes(path));\n  }\n  openedMenus.value.push(path);\n  emit(\"open\", path, parentPaths);\n}\n\nfunction addMenuItem(item: MenuItemRegistered) {\n  items.value[item.path] = item;\n}\n\nfunction addSubMenu(subMenu: MenuItemRegistered) {\n  subMenus.value[subMenu.path] = subMenu;\n}\n\nfunction removeSubMenu(subMenu: MenuItemRegistered) {\n  Reflect.deleteProperty(subMenus.value, subMenu.path);\n}\n\nfunction removeMenuItem(item: MenuItemRegistered) {\n  Reflect.deleteProperty(items.value, item.path);\n}\n</script>\n<template>\n  <ul ref=\"menu\" :class=\"[theme, b(), is(mode, true), is(theme, true), is('rounded', rounded), is('collapse', collapse), is('menu-align', mode === 'horizontal')]\" :style=\"menuStyle\" role=\"menu\">\n    <template v-if=\"mode === 'horizontal' && getSlot.showSlotMore\">\n      <template v-for=\"item in getSlot.slotDefault\" :key=\"item.key\">\n        <component :is=\"item\" />\n      </template>\n      <SubMenu is-sub-menu-more path=\"sub-menu-more\">\n        <template #title>\n          <Ellipsis class=\"size-4\" />\n        </template>\n        <template v-for=\"item in getSlot.slotMore\" :key=\"item.key\">\n          <component :is=\"item\" />\n        </template>\n      </SubMenu>\n    </template>\n    <template v-else>\n      <slot></slot>\n    </template>\n  </ul>\n</template>\n\n<style lang=\"less\">\n.menu-item-active() {\n  color: var(--menu-item-active-color);\n  text-decoration: none;\n  cursor: pointer;\n  background: var(--menu-item-active-background-color);\n}\n\n.menu-item() {\n  position: relative;\n  display: flex;\n  // gap: 12px;\n  align-items: center;\n  height: var(--menu-item-height);\n  padding: var(--menu-item-padding-y) var(--menu-item-padding-x);\n  margin: 0 var(--menu-item-margin-x) var(--menu-item-margin-y) var(--menu-item-margin-x);\n  font-size: var(--menu-font-size);\n  color: var(--menu-item-color);\n  text-decoration: none;\n  white-space: nowrap;\n  list-style: none;\n  cursor: pointer;\n  background: var(--menu-item-background-color);\n  border: none;\n  border-radius: var(--menu-item-radius);\n  transition:\n    background 0.15s ease,\n    color 0.15s ease,\n    padding 0.15s ease,\n    border-color 0.15s ease;\n\n  &.is-disabled {\n    cursor: not-allowed;\n    background: none !important;\n    opacity: 0.25;\n  }\n\n  .vben-menu__icon {\n    transition: transform 0.25s;\n  }\n\n  &:hover {\n    .vben-menu__icon {\n      transform: scale(1.2);\n    }\n  }\n\n  &:hover,\n  &:focus {\n    outline: none;\n  }\n\n  * {\n    vertical-align: bottom;\n  }\n}\n\n.menu-title() {\n  max-width: var(--menu-title-width);\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  opacity: 1;\n}\n\n.is-menu-align {\n  justify-content: var(--menu-align, start);\n}\n.vben-menu__popup-container {\n  padding: 0px !important;\n}\n\n.vben-menu__popup-container,\n.vben-menu {\n  --menu-title-width: 140px;\n  --menu-item-icon-size: 16px;\n  --menu-item-height: 38px;\n  --menu-item-padding-y: 21px;\n  --menu-item-padding-x: 12px;\n  --menu-item-popup-padding-y: 20px;\n  --menu-item-popup-padding-x: 12px;\n  --menu-item-margin-y: 2px;\n  --menu-item-margin-x: 0px;\n  --menu-item-collapse-padding-y: 23.5px;\n  --menu-item-collapse-padding-x: 0px;\n  --menu-item-collapse-margin-y: 4px;\n  --menu-item-collapse-margin-x: 0px;\n  --menu-item-radius: 0px;\n  --menu-item-indent: 16px;\n  --menu-font-size: 14px;\n\n  &.is-dark {\n    --menu-background-color: hsl(var(--menu));\n    // --menu-submenu-opened-background-color: hsl(var(--menu-opened-dark));\n    --menu-item-background-color: var(--menu-background-color);\n    --menu-item-color: hsl(var(--foreground) / 80%);\n    --menu-item-hover-color: hsl(var(--accent-foreground));\n    --menu-item-hover-background-color: hsl(var(--accent));\n    --menu-item-active-color: hsl(var(--accent-foreground));\n    --menu-item-active-background-color: hsl(var(--accent));\n    --menu-submenu-hover-color: hsl(var(--foreground));\n    --menu-submenu-hover-background-color: hsl(var(--accent));\n    --menu-submenu-active-color: hsl(var(--foreground));\n    --menu-submenu-active-background-color: transparent;\n    --menu-submenu-background-color: var(--menu-background-color);\n  }\n\n  &.is-light {\n    --menu-background-color: hsl(var(--menu));\n    // --menu-submenu-opened-background-color: hsl(var(--menu-opened));\n    --menu-item-background-color: var(--menu-background-color);\n    --menu-item-color: hsl(var(--foreground));\n    --menu-item-hover-color: var(--menu-item-color);\n    --menu-item-hover-background-color: hsl(var(--accent));\n    --menu-item-active-color: hsl(var(--primary));\n    --menu-item-active-background-color: hsl(var(--primary) / 15%);\n    --menu-submenu-hover-color: hsl(var(--primary));\n    --menu-submenu-hover-background-color: hsl(var(--accent));\n    --menu-submenu-active-color: hsl(var(--primary));\n    --menu-submenu-active-background-color: transparent;\n    --menu-submenu-background-color: var(--menu-background-color);\n  }\n\n  &.is-rounded {\n    --menu-item-margin-x: 8px;\n    --menu-item-collapse-margin-x: 6px;\n    --menu-item-radius: 8px;\n  }\n\n  &.is-horizontal:not(.is-rounded) {\n    --menu-item-height: 40px;\n    --menu-item-radius: 6px;\n  }\n\n  &.is-horizontal.is-rounded {\n    --menu-item-height: 40px;\n    --menu-item-radius: 6px;\n    --menu-item-padding-x: 12px;\n  }\n\n  // .vben-menu__popup,\n  &.is-horizontal {\n    --menu-item-padding-y: 0px;\n    --menu-item-padding-x: 10px;\n    --menu-item-margin-y: 0px;\n    --menu-item-margin-x: 1px;\n    --menu-background-color: transparent;\n\n    &.is-dark {\n      --menu-item-hover-color: hsl(var(--accent-foreground));\n      --menu-item-hover-background-color: hsl(var(--accent));\n      --menu-item-active-color: hsl(var(--accent-foreground));\n      --menu-item-active-background-color: hsl(var(--accent));\n      --menu-submenu-active-color: hsl(var(--foreground));\n      --menu-submenu-active-background-color: hsl(var(--accent));\n      --menu-submenu-hover-color: hsl(var(--accent-foreground));\n      --menu-submenu-hover-background-color: hsl(var(--accent));\n    }\n\n    &.is-light {\n      --menu-item-active-color: hsl(var(--primary));\n      --menu-item-active-background-color: hsl(var(--primary) / 15%);\n      --menu-item-hover-background-color: hsl(var(--accent));\n      --menu-item-hover-color: hsl(var(--primary));\n      --menu-submenu-active-color: hsl(var(--primary));\n      --menu-submenu-active-background-color: hsl(var(--primary) / 15%);\n      --menu-submenu-hover-color: hsl(var(--primary));\n      --menu-submenu-hover-background-color: hsl(var(--accent));\n    }\n  }\n}\n\n.vben-menu {\n  position: relative;\n  box-sizing: border-box;\n  padding-left: 0;\n  margin: 0;\n  list-style: none;\n  background: hsl(var(--menu-background-color));\n\n  // 垂直菜单\n  &.is-vertical {\n    &:not(.vben-menu.is-collapse) {\n      & .vben-menu-item,\n      & .vben-sub-menu-content,\n      & .vben-menu-item-group__title {\n        padding-left: calc(var(--menu-item-indent) + var(--menu-level) * var(--menu-item-indent));\n        white-space: nowrap;\n      }\n\n      & > .vben-sub-menu {\n        & > .vben-menu {\n          & > .vben-menu-item {\n            padding-left: calc(0px + var(--menu-item-indent) + var(--menu-level) * var(--menu-item-indent));\n          }\n        }\n\n        & > .vben-sub-menu-content {\n          padding-left: calc(var(--menu-item-indent) - 8px);\n        }\n      }\n      & > .vben-menu-item {\n        padding-left: calc(var(--menu-item-indent) - 8px);\n      }\n    }\n  }\n\n  &.is-horizontal {\n    display: flex;\n    flex-wrap: nowrap;\n    max-width: 100%;\n    height: var(--height-horizontal-height);\n    border-right: none;\n\n    .vben-menu-item {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      height: var(--menu-item-height);\n      padding-right: calc(var(--menu-item-padding-x) + 6px);\n      margin: 0;\n      margin-right: 2px;\n      // border-bottom: 2px solid transparent;\n      border-radius: var(--menu-item-radius);\n    }\n\n    & > .vben-sub-menu {\n      height: var(--menu-item-height);\n      margin-right: 2px;\n\n      &:focus,\n      &:hover {\n        outline: none;\n      }\n\n      & .vben-sub-menu-content {\n        height: 100%;\n        padding-right: 40px;\n        // border-bottom: 2px solid transparent;\n        border-radius: var(--menu-item-radius);\n      }\n    }\n\n    & .vben-menu-item:not(.is-disabled):hover,\n    & .vben-menu-item:not(.is-disabled):focus {\n      outline: none;\n    }\n\n    & > .vben-menu-item.is-active {\n      color: var(--menu-item-active-color);\n    }\n\n    // &.is-light {\n    //   & > .vben-sub-menu {\n    //     &.is-active {\n    //       border-bottom: 2px solid var(--menu-item-active-color);\n    //     }\n    //     &:not(.is-active) .vben-sub-menu-content {\n    //       &:hover {\n    //         border-bottom: 2px solid var(--menu-item-active-color);\n    //       }\n    //     }\n    //   }\n    //   & > .vben-menu-item.is-active {\n    //     border-bottom: 2px solid var(--menu-item-active-color);\n    //   }\n\n    //   & .vben-menu-item:not(.is-disabled):hover,\n    //   & .vben-menu-item:not(.is-disabled):focus {\n    //     border-bottom: 2px solid var(--menu-item-active-color);\n    //   }\n    // }\n  }\n  // 折叠菜单\n\n  &.is-collapse {\n    .vben-menu__icon {\n      margin-right: 0;\n    }\n    .vben-sub-menu__icon-arrow {\n      display: none;\n    }\n\n    .vben-sub-menu-content,\n    .vben-menu-item {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      padding: var(--menu-item-collapse-padding-y) var(--menu-item-collapse-padding-x);\n      margin: var(--menu-item-collapse-margin-y) var(--menu-item-collapse-margin-x);\n      transition: all 0.3s;\n\n      &.is-active {\n        background: var(--menu-item-active-background-color) !important;\n        border-radius: var(--menu-item-radius);\n      }\n    }\n\n    &.is-light {\n      .vben-sub-menu-content,\n      .vben-menu-item {\n        &.is-active {\n          // color: hsl(var(--primary-foreground)) !important;\n          background: var(--menu-item-active-background-color) !important;\n        }\n      }\n    }\n\n    &.is-rounded {\n      .vben-sub-menu-content,\n      .vben-menu-item {\n        &.is-collapse-show-title {\n          // padding: 32px 0 !important;\n          margin: 4px 8px !important;\n        }\n      }\n    }\n  }\n\n  &__popup-container {\n    max-width: 240px;\n    height: unset;\n    padding: 0;\n    background: var(--menu-background-color);\n  }\n\n  &__popup {\n    padding: 10px 0;\n    border-radius: var(--menu-item-radius);\n\n    .vben-sub-menu-content,\n    .vben-menu-item {\n      padding: var(--menu-item-popup-padding-y) var(--menu-item-popup-padding-x);\n    }\n  }\n\n  &__icon {\n    flex-shrink: 0;\n    width: var(--menu-item-icon-size);\n    height: var(--menu-item-icon-size);\n    margin-right: 8px;\n    text-align: center;\n    vertical-align: middle;\n  }\n}\n\n.vben-menu-item {\n  fill: var(--menu-item-color);\n\n  .menu-item();\n\n  &.is-active {\n    fill: var(--menu-item-active-color);\n\n    .menu-item-active();\n  }\n\n  &__content {\n    display: inline-flex;\n    align-items: center;\n    width: 100%;\n    height: var(--menu-item-height);\n\n    span {\n      .menu-title();\n    }\n  }\n\n  &.is-collapse-show-title {\n    padding: 32px 0 !important;\n    // margin: 4px 8px !important;\n    .vben-menu-tooltip__trigger {\n      flex-direction: column;\n    }\n    .vben-menu__icon {\n      display: block;\n      font-size: 20px !important;\n      transition: all 0.25s ease;\n    }\n\n    .vben-menu__name {\n      display: inline-flex;\n      margin-top: 8px;\n      margin-bottom: 0;\n      font-size: 12px;\n      font-weight: 400;\n      line-height: normal;\n      transition: all 0.25s ease;\n    }\n  }\n\n  &:not(.is-active):hover {\n    color: var(--menu-item-hover-color);\n    text-decoration: none;\n    cursor: pointer;\n    background: var(--menu-item-hover-background-color) !important;\n  }\n\n  .vben-menu-tooltip__trigger {\n    position: absolute;\n    top: 0;\n    left: 0;\n    box-sizing: border-box;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    width: 100%;\n    height: 100%;\n    padding: 0 var(--menu-item-padding-x);\n    font-size: var(--menu-font-size);\n    line-height: var(--menu-item-height);\n  }\n}\n\n.vben-sub-menu {\n  padding-left: 0;\n  margin: 0;\n  list-style: none;\n  background: var(--menu-submenu-background-color);\n  fill: var(--menu-item-color);\n\n  &.is-active {\n    div[data-state=\"open\"] > .vben-sub-menu-content,\n    > .vben-sub-menu-content {\n      // font-weight: 500;\n      color: var(--menu-submenu-active-color);\n      text-decoration: none;\n      cursor: pointer;\n      background: var(--menu-submenu-active-background-color);\n      fill: var(--menu-submenu-active-color);\n    }\n  }\n}\n\n.vben-sub-menu-content {\n  height: var(--menu-item-height);\n\n  .menu-item();\n\n  &__icon-arrow {\n    position: absolute;\n    top: 50%;\n    right: 10px;\n    width: inherit;\n    margin-top: -8px;\n    margin-right: 0;\n    // font-size: 16px;\n    font-weight: normal;\n    opacity: 1;\n    transition: transform 0.25s ease;\n  }\n\n  &__title {\n    .menu-title();\n  }\n\n  &.is-collapse-show-title {\n    flex-direction: column;\n    padding: 32px 0 !important;\n    // margin: 4px 8px !important;\n    .vben-menu__icon {\n      display: block;\n      font-size: 20px !important;\n      transition: all 0.25s ease;\n    }\n    .vben-sub-menu-content__title {\n      display: inline-flex;\n      flex-shrink: 0;\n      margin-top: 8px;\n      margin-bottom: 0;\n      font-size: 12px;\n      font-weight: 400;\n      line-height: normal;\n      transition: all 0.25s ease;\n    }\n  }\n\n  &.is-more {\n    padding-right: 12px !important;\n  }\n\n  // &:not(.is-active):hover {\n  &:hover {\n    color: var(--menu-submenu-hover-color);\n    text-decoration: none;\n    cursor: pointer;\n    background: var(--menu-submenu-hover-background-color) !important;\n\n    // svg {\n    //   fill: var(--menu-submenu-hover-color);\n    // }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/components/normal-menu/index.ts",
    "content": "export type * from \"./normal-menu\";\nexport { default as NormalMenu } from \"./normal-menu.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/components/normal-menu/normal-menu.ts",
    "content": "import type { MenuRecordRaw } from \"../../../typings\";\n\ninterface NormalMenuProps {\n  /**\n   * 菜单数据\n   */\n  activePath?: string;\n  /**\n   * 是否折叠\n   */\n  collapse?: boolean;\n  /**\n   * 菜单项\n   */\n  menus?: MenuRecordRaw[];\n  /**\n   * @zh_CN 是否圆润风格\n   * @default true\n   */\n  rounded?: boolean;\n  /**\n   * 主题\n   */\n  theme?: \"dark\" | \"light\";\n}\n\nexport type { NormalMenuProps };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/components/normal-menu/normal-menu.vue",
    "content": "<script setup lang=\"ts\">\nimport type { MenuRecordRaw } from \"../../../typings\";\n\nimport type { NormalMenuProps } from \"./normal-menu\";\n\nimport { useNamespace } from \"../../../composables\";\nimport { VbenIcon } from \"../../../shadcn-ui\";\n\ninterface Props extends NormalMenuProps {}\n\ndefineOptions({\n  name: \"NormalMenu\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  activePath: \"\",\n  collapse: false,\n  menus: () => [],\n  theme: \"dark\",\n});\n\nconst emit = defineEmits<{\n  enter: [MenuRecordRaw];\n  select: [MenuRecordRaw];\n}>();\n\nconst { b, e, is } = useNamespace(\"normal-menu\");\n\nfunction menuIcon(menu: MenuRecordRaw) {\n  return props.activePath === menu.path ? menu.activeIcon || menu.icon : menu.icon;\n}\n</script>\n\n<template>\n  <ul :class=\"[theme, b(), is('collapse', collapse), is(theme, true), is('rounded', rounded)]\" class=\"relative\">\n    <template v-for=\"menu in menus\" :key=\"menu.path\">\n      <li :class=\"[e('item'), is('active', activePath === menu.path)]\" @click=\"() => emit('select', menu)\" @mouseenter=\"() => emit('enter', menu)\">\n        <VbenIcon :class=\"e('icon')\" :icon=\"menuIcon(menu)\" fallback />\n\n        <span :class=\"e('name')\" class=\"truncate\"> {{ menu.name }}</span>\n      </li>\n    </template>\n  </ul>\n</template>\n<style lang=\"less\" scoped>\n.vben-normal-menu {\n  --menu-item-margin-y: 4px;\n  --menu-item-margin-x: 0px;\n  --menu-item-padding-y: 9px;\n  --menu-item-padding-x: 0px;\n  --menu-item-radius: 0px;\n\n  height: calc(100% - 4px);\n\n  &.is-rounded {\n    --menu-item-radius: 6px;\n    --menu-item-margin-x: 8px;\n  }\n\n  &.is-dark {\n    .vben-normal-menu__item {\n      @apply text-foreground/80;\n      // color: hsl(var(--foreground) / 80%);\n\n      &:not(.is-active):hover {\n        @apply text-foreground;\n      }\n\n      &.is-active {\n        .vben-normal-menu__name,\n        .vben-normal-menu__icon {\n          @apply text-foreground;\n        }\n      }\n    }\n  }\n\n  &.is-collapse {\n    .vben-normal-menu__name {\n      width: 0;\n      height: 0;\n      margin-top: 0;\n      overflow: hidden;\n      opacity: 0;\n    }\n\n    .vben-normal-menu__icon {\n      font-size: 20px;\n    }\n  }\n\n  &__item {\n    position: relative;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    // max-width: 64px;\n    // max-height: 64px;\n    padding: var(--menu-item-padding-y) var(--menu-item-padding-x);\n    margin: var(--menu-item-margin-y) var(--menu-item-margin-x);\n    color: hsl(var(--foreground) / 90%);\n    cursor: pointer;\n    border-radius: var(--menu-item-radius);\n    transition:\n      background 0.15s ease,\n      padding 0.15s ease,\n      border-color 0.15s ease;\n\n    &.is-active {\n      @apply text-primary bg-primary dark:bg-accent;\n\n      .vben-normal-menu__name,\n      .vben-normal-menu__icon {\n        @apply text-primary-foreground font-semibold;\n      }\n    }\n\n    &:not(.is-active):hover {\n      @apply dark:bg-accent text-primary bg-heavy dark:text-foreground;\n    }\n\n    &:hover {\n      .vben-normal-menu__icon {\n        transform: scale(1.2);\n      }\n    }\n  }\n\n  &__icon {\n    max-height: 20px;\n    font-size: 20px;\n    transition: all 0.25s ease;\n  }\n\n  &__name {\n    margin-top: 8px;\n    margin-bottom: 0;\n    font-size: 12px;\n    font-weight: 400;\n    transition: all 0.25s ease;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/components/sub-menu-content.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { MenuItemProps } from \"../types\";\n\nimport { computed } from \"vue\";\n\nimport { useNamespace } from \"../../composables\";\nimport { ChevronDown, ChevronRight } from \"../../icons\";\nimport { VbenIcon } from \"../../shadcn-ui\";\n\nimport { useMenuContext } from \"../hooks\";\n\ninterface Props extends MenuItemProps {\n  isMenuMore: boolean;\n  isTopLevelMenuSubmenu: boolean;\n  level?: number;\n}\n\ndefineOptions({ name: \"SubMenuContent\" });\n\nconst props = withDefaults(defineProps<Props>(), {\n  isMenuMore: false,\n  level: 0,\n});\n\nconst rootMenu = useMenuContext();\nconst { b, e, is } = useNamespace(\"sub-menu-content\");\nconst nsMenu = useNamespace(\"menu\");\n\nconst opened = computed(() => {\n  return rootMenu?.openedMenus.includes(props.path);\n});\n\nconst collapse = computed(() => {\n  return rootMenu.props.collapse;\n});\n\nconst isFirstLevel = computed(() => {\n  return props.level === 1;\n});\n\nconst getCollapseShowTitle = computed(() => {\n  return rootMenu.props.collapseShowTitle && isFirstLevel.value && collapse.value;\n});\n\nconst mode = computed(() => {\n  return rootMenu?.props.mode;\n});\n\nconst showArrowIcon = computed(() => {\n  return mode.value === \"horizontal\" || !(isFirstLevel.value && collapse.value);\n});\n\nconst hiddenTitle = computed(() => {\n  return mode.value === \"vertical\" && isFirstLevel.value && collapse.value && !getCollapseShowTitle.value;\n});\n\nconst iconComp = computed(() => {\n  return (mode.value === \"horizontal\" && !isFirstLevel.value) || (mode.value === \"vertical\" && collapse.value) ? ChevronRight : ChevronDown;\n});\n\nconst iconArrowStyle = computed(() => {\n  return opened.value ? { transform: `rotate(180deg)` } : {};\n});\n</script>\n<template>\n  <div :class=\"[b(), is('collapse-show-title', getCollapseShowTitle), is('more', isMenuMore)]\">\n    <slot></slot>\n\n    <VbenIcon v-if=\"!isMenuMore\" :class=\"nsMenu.e('icon')\" :icon=\"icon\" fallback />\n\n    <div v-if=\"!hiddenTitle\" :class=\"[e('title')]\">\n      <slot name=\"title\"></slot>\n    </div>\n\n    <component :is=\"iconComp\" v-if=\"!isMenuMore\" v-show=\"showArrowIcon\" :class=\"[e('icon-arrow')]\" :style=\"iconArrowStyle\" class=\"size-4\" />\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/components/sub-menu.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { HoverCardContentProps } from \"../../shadcn-ui\";\n\nimport type { MenuItemRegistered, MenuProvider, SubMenuProps } from \"../types\";\n\nimport { computed, onBeforeUnmount, onMounted, reactive, ref } from \"vue\";\n\nimport { useNamespace } from \"../../composables\";\nimport { VbenHoverCard } from \"../../shadcn-ui\";\n\nimport { createSubMenuContext, useMenu, useMenuContext, useMenuStyle, useSubMenuContext } from \"../hooks\";\nimport CollapseTransition from \"./collapse-transition.vue\";\nimport SubMenuContent from \"./sub-menu-content.vue\";\n\ninterface Props extends SubMenuProps {\n  isSubMenuMore?: boolean;\n}\n\ndefineOptions({ name: \"SubMenu\" });\n\nconst props = withDefaults(defineProps<Props>(), {\n  disabled: false,\n  isSubMenuMore: false,\n});\n\nconst { parentMenu, parentPaths } = useMenu();\nconst { b, is } = useNamespace(\"sub-menu\");\nconst nsMenu = useNamespace(\"menu\");\nconst rootMenu = useMenuContext();\nconst subMenu = useSubMenuContext();\nconst subMenuStyle = useMenuStyle(subMenu);\n\nconst mouseInChild = ref(false);\n\nconst items = ref<MenuProvider[\"items\"]>({});\nconst subMenus = ref<MenuProvider[\"subMenus\"]>({});\nconst timer = ref<null | ReturnType<typeof setTimeout>>(null);\n\ncreateSubMenuContext({\n  addSubMenu,\n  handleMouseleave,\n  level: (subMenu?.level ?? 0) + 1,\n  mouseInChild,\n  removeSubMenu,\n});\n\nconst opened = computed(() => {\n  return rootMenu?.openedMenus.includes(props.path);\n});\nconst isTopLevelMenuSubmenu = computed(() => parentMenu.value?.type.name === \"Menu\");\nconst mode = computed(() => rootMenu?.props.mode ?? \"vertical\");\nconst rounded = computed(() => rootMenu?.props.rounded);\nconst currentLevel = computed(() => subMenu?.level ?? 0);\nconst isFirstLevel = computed(() => {\n  return currentLevel.value === 1;\n});\n\nconst contentProps = computed((): HoverCardContentProps => {\n  const isHorizontal = mode.value === \"horizontal\";\n  const side = isHorizontal && isFirstLevel.value ? \"bottom\" : \"right\";\n  return {\n    collisionPadding: { top: 20 },\n    side,\n    sideOffset: isHorizontal ? 5 : 10,\n  };\n});\n\nconst active = computed(() => {\n  let isActive = false;\n\n  Object.values(items.value).forEach(item => {\n    if (item.active) {\n      isActive = true;\n    }\n  });\n\n  Object.values(subMenus.value).forEach(subItem => {\n    if (subItem.active) {\n      isActive = true;\n    }\n  });\n  return isActive;\n});\n\nfunction addSubMenu(subMenu: MenuItemRegistered) {\n  subMenus.value[subMenu.path] = subMenu;\n}\n\nfunction removeSubMenu(subMenu: MenuItemRegistered) {\n  Reflect.deleteProperty(subMenus.value, subMenu.path);\n}\n\n/**\n * 点击submenu展开/关闭\n */\nfunction handleClick() {\n  const mode = rootMenu?.props.mode;\n  if (\n    // 当前菜单禁用时，不展开\n    props.disabled ||\n    (rootMenu?.props.collapse && mode === \"vertical\") ||\n    // 水平模式下不展开\n    mode === \"horizontal\"\n  ) {\n    return;\n  }\n\n  rootMenu?.handleSubMenuClick({\n    active: active.value,\n    parentPaths: parentPaths.value,\n    path: props.path,\n  });\n}\n\nfunction handleMouseenter(event: FocusEvent | MouseEvent, showTimeout = 300) {\n  if (event.type === \"focus\") {\n    return;\n  }\n\n  if ((!rootMenu?.props.collapse && rootMenu?.props.mode === \"vertical\") || props.disabled) {\n    if (subMenu) {\n      subMenu.mouseInChild.value = true;\n    }\n    return;\n  }\n  if (subMenu) {\n    subMenu.mouseInChild.value = true;\n  }\n\n  timer.value && window.clearTimeout(timer.value);\n  timer.value = setTimeout(() => {\n    rootMenu?.openMenu(props.path, parentPaths.value);\n  }, showTimeout);\n  parentMenu.value?.vnode.el?.dispatchEvent(new MouseEvent(\"mouseenter\"));\n}\n\nfunction handleMouseleave(deepDispatch = false) {\n  if (!rootMenu?.props.collapse && rootMenu?.props.mode === \"vertical\" && subMenu) {\n    subMenu.mouseInChild.value = false;\n    return;\n  }\n\n  timer.value && window.clearTimeout(timer.value);\n\n  if (subMenu) {\n    subMenu.mouseInChild.value = false;\n  }\n  timer.value = setTimeout(() => {\n    !mouseInChild.value && rootMenu?.closeMenu(props.path, parentPaths.value);\n  }, 300);\n\n  if (deepDispatch) {\n    subMenu?.handleMouseleave?.(true);\n  }\n}\n\nconst menuIcon = computed(() => (active.value ? props.activeIcon || props.icon : props.icon));\n\nconst item = reactive({\n  active,\n  parentPaths,\n  path: props.path,\n});\n\nonMounted(() => {\n  subMenu?.addSubMenu?.(item);\n  rootMenu?.addSubMenu?.(item);\n});\n\nonBeforeUnmount(() => {\n  subMenu?.removeSubMenu?.(item);\n  rootMenu?.removeSubMenu?.(item);\n});\n</script>\n<template>\n  <li :class=\"[b(), is('opened', opened), is('active', active), is('disabled', disabled)]\" @focus=\"handleMouseenter\" @mouseenter=\"handleMouseenter\" @mouseleave=\"() => handleMouseleave()\">\n    <template v-if=\"rootMenu.isMenuPopup\">\n      <VbenHoverCard :content-class=\"[rootMenu.theme, nsMenu.e('popup-container'), is(rootMenu.theme, true), opened ? '' : 'hidden']\" :content-props=\"contentProps\" :open=\"true\" :open-delay=\"0\">\n        <template #trigger>\n          <SubMenuContent :class=\"is('active', active)\" :icon=\"menuIcon\" :is-menu-more=\"isSubMenuMore\" :is-top-level-menu-submenu=\"isTopLevelMenuSubmenu\" :level=\"currentLevel\" :path=\"path\" @click.stop=\"handleClick\">\n            <template #title>\n              <slot name=\"title\"></slot>\n            </template>\n          </SubMenuContent>\n        </template>\n        <div :class=\"[nsMenu.is(mode, true), nsMenu.e('popup')]\" @focus=\"e => handleMouseenter(e, 100)\" @mouseenter=\"e => handleMouseenter(e, 100)\" @mouseleave=\"() => handleMouseleave(true)\">\n          <ul :class=\"[nsMenu.b(), is('rounded', rounded)]\" :style=\"subMenuStyle\">\n            <slot></slot>\n          </ul>\n        </div>\n      </VbenHoverCard>\n    </template>\n\n    <template v-else>\n      <SubMenuContent :class=\"is('active', active)\" :icon=\"menuIcon\" :is-menu-more=\"isSubMenuMore\" :is-top-level-menu-submenu=\"isTopLevelMenuSubmenu\" :level=\"currentLevel\" :path=\"path\" @click.stop=\"handleClick\">\n        <slot name=\"content\"></slot>\n        <template #title>\n          <slot name=\"title\"></slot>\n        </template>\n      </SubMenuContent>\n      <CollapseTransition>\n        <ul v-show=\"opened\" :class=\"[nsMenu.b(), is('rounded', rounded)]\" :style=\"subMenuStyle\">\n          <slot></slot>\n        </ul>\n      </CollapseTransition>\n    </template>\n  </li>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/hooks/index.ts",
    "content": "export * from \"./use-menu\";\nexport * from \"./use-menu-context\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/hooks/use-menu-context.ts",
    "content": "import type { MenuProvider, SubMenuProvider } from \"../types\";\n\nimport { getCurrentInstance, inject, provide } from \"vue\";\n\nimport { findComponentUpward } from \"../utils\";\n\nconst menuContextKey = Symbol(\"menuContext\");\n\n/**\n * @zh_CN Provide menu context\n */\nfunction createMenuContext(injectMenuData: MenuProvider) {\n  provide(menuContextKey, injectMenuData);\n}\n\n/**\n * @zh_CN Provide menu context\n */\nfunction createSubMenuContext(injectSubMenuData: SubMenuProvider) {\n  const instance = getCurrentInstance();\n\n  provide(`subMenu:${instance?.uid}`, injectSubMenuData);\n}\n\n/**\n * @zh_CN Inject menu context\n */\nfunction useMenuContext() {\n  const instance = getCurrentInstance();\n  if (!instance) {\n    throw new Error(\"instance is required\");\n  }\n  const rootMenu = inject(menuContextKey) as MenuProvider;\n  return rootMenu;\n}\n\n/**\n * @zh_CN Inject menu context\n */\nfunction useSubMenuContext() {\n  const instance = getCurrentInstance();\n  if (!instance) {\n    throw new Error(\"instance is required\");\n  }\n  const parentMenu = findComponentUpward(instance, [\"Menu\", \"SubMenu\"]);\n  const subMenu = inject(`subMenu:${parentMenu?.uid}`) as SubMenuProvider;\n  return subMenu;\n}\n\nexport { createMenuContext, createSubMenuContext, useMenuContext, useSubMenuContext };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/hooks/use-menu.ts",
    "content": "import type { SubMenuProvider } from \"../types\";\n\nimport { computed, getCurrentInstance } from \"vue\";\n\nimport { findComponentUpward } from \"../utils\";\n\nfunction useMenu() {\n  const instance = getCurrentInstance();\n  if (!instance) {\n    throw new Error(\"instance is required\");\n  }\n\n  /**\n   * @zh_CN 获取所有父级菜单链路\n   */\n  const parentPaths = computed(() => {\n    let parent = instance.parent;\n    const paths: string[] = [instance.props.path as string];\n    while (parent?.type.name !== \"Menu\") {\n      if (parent?.props.path) {\n        paths.unshift(parent.props.path as string);\n      }\n      parent = parent?.parent ?? null;\n    }\n\n    return paths;\n  });\n\n  const parentMenu = computed(() => {\n    return findComponentUpward(instance, [\"Menu\", \"SubMenu\"]);\n  });\n\n  return {\n    parentMenu,\n    parentPaths,\n  };\n}\n\nfunction useMenuStyle(menu?: SubMenuProvider) {\n  const subMenuStyle = computed(() => {\n    return {\n      \"--menu-level\": menu ? (menu?.level ?? 0 + 1) : 0,\n    };\n  });\n  return subMenuStyle;\n}\n\nexport { useMenu, useMenuStyle };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/index.ts",
    "content": "export { default as MenuBadge } from \"./components/menu-badge.vue\";\nexport * from \"./components/normal-menu\";\nexport { default as Menu } from \"./menu.vue\";\nexport type * from \"./types\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/menu.vue",
    "content": "<script setup lang=\"ts\">\nimport type { MenuRecordRaw } from \"/@/vben/typings\";\n\nimport type { MenuProps } from \"./types\";\n\nimport { useForwardProps } from \"/@/vben/composables\";\n\nimport { Menu } from \"./components\";\nimport SubMenu from \"./sub-menu.vue\";\n\ninterface Props extends MenuProps {\n  menus: MenuRecordRaw[];\n}\n\ndefineOptions({\n  name: \"MenuView\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  collapse: false,\n  // theme: 'dark',\n});\n\nconst forward = useForwardProps(props);\n\n// const emit = defineEmits<{\n//   'update:openKeys': [key: Key[]];\n//   'update:selectedKeys': [key: Key[]];\n// }>();\n</script>\n\n<template>\n  <Menu v-bind=\"forward\">\n    <template v-for=\"menu in menus\" :key=\"menu.path\">\n      <SubMenu :menu=\"menu\" />\n    </template>\n  </Menu>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/sub-menu.vue",
    "content": "<script setup lang=\"ts\">\nimport type { MenuRecordRaw } from \"/@/vben/typings\";\n\nimport { computed } from \"vue\";\n\nimport { MenuBadge, MenuItem, SubMenu as SubMenuComp } from \"./components\";\n// eslint-disable-next-line import/no-self-import\nimport SubMenu from \"./sub-menu.vue\";\nimport { FsSlotRender } from \"@fast-crud/fast-crud\";\n\ninterface Props {\n  /**\n   * 菜单项\n   */\n  menu: MenuRecordRaw;\n}\n\ndefineOptions({\n  name: \"SubMenuUi\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {});\n\n/**\n * 判断是否有子节点，动态渲染 menu-item/sub-menu-item\n */\nconst hasChildren = computed(() => {\n  const { menu } = props;\n  return Reflect.has(menu, \"children\") && !!menu.children && menu.children.length > 0;\n});\n</script>\n\n<template>\n  <MenuItem\n    v-if=\"!hasChildren\"\n    :key=\"menu.path\"\n    :active-icon=\"menu.activeIcon\"\n    :badge=\"menu.badge\"\n    :badge-type=\"menu.badgeType\"\n    :badge-variants=\"menu.badgeVariants\"\n    :icon=\"menu.icon\"\n    :path=\"menu.path\"\n    :click=\"menu.meta?.click\"\n  >\n    <template v-if=\"menu.meta?.slot\" #default>\n      <fs-render :render-func=\"menu.meta.slot\" />\n    </template>\n    <template v-else #title>\n      <span>{{ menu.name }}</span>\n    </template>\n  </MenuItem>\n  <SubMenuComp v-else :key=\"`${menu.path}_sub`\" :active-icon=\"menu.activeIcon\" :icon=\"menu.icon\" :path=\"menu.path\">\n    <template #content>\n      <MenuBadge :badge=\"menu.badge\" :badge-type=\"menu.badgeType\" :badge-variants=\"menu.badgeVariants\" class=\"right-6\" />\n    </template>\n    <template #title>\n      <span>{{ menu.name }}</span>\n    </template>\n    <template v-for=\"childItem in menu.children || []\" :key=\"childItem.path\">\n      <SubMenu :menu=\"childItem\" />\n    </template>\n  </SubMenuComp>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/types.ts",
    "content": "import type { Component, Ref } from \"vue\";\n\nimport type { MenuRecordBadgeRaw, ThemeModeType } from \"/@/vben/typings\";\n\ninterface MenuProps {\n  /**\n   * @zh_CN 是否开启手风琴模式\n   * @default true\n   */\n  accordion?: boolean;\n  /**\n   * @zh_CN 菜单是否折叠\n   * @default false\n   */\n  collapse?: boolean;\n\n  /**\n   * @zh_CN 菜单折叠时是否显示菜单名称\n   * @default false\n   */\n  collapseShowTitle?: boolean;\n\n  /**\n   * @zh_CN 默认激活的菜单\n   */\n  defaultActive?: string;\n\n  /**\n   * @zh_CN 默认展开的菜单\n   */\n  defaultOpeneds?: string[];\n\n  /**\n   * @zh_CN 菜单模式\n   * @default vertical\n   */\n  mode?: \"horizontal\" | \"vertical\";\n\n  /**\n   * @zh_CN 是否圆润风格\n   * @default true\n   */\n  rounded?: boolean;\n\n  /**\n   * @zh_CN 菜单主题\n   * @default dark\n   */\n  theme?: ThemeModeType;\n}\n\ninterface SubMenuProps extends MenuRecordBadgeRaw {\n  /**\n   * @zh_CN 激活图标\n   */\n  activeIcon?: string;\n  /**\n   * @zh_CN 是否禁用\n   */\n  disabled?: boolean;\n  /**\n   * @zh_CN 图标\n   */\n  icon?: Component | string;\n  /**\n   * @zh_CN submenu 名称\n   */\n  path: string;\n}\n\ninterface MenuItemProps extends MenuRecordBadgeRaw {\n  /**\n   * @zh_CN 图标\n   */\n  activeIcon?: string;\n  /**\n   * @zh_CN 是否禁用\n   */\n  disabled?: boolean;\n  /**\n   * @zh_CN 图标\n   */\n  icon?: Component | string;\n  /**\n   * @zh_CN menuitem 名称\n   */\n  path: string;\n  click?: any;\n}\n\ninterface MenuItemRegistered {\n  active: boolean;\n  parentPaths: string[];\n  path: string;\n}\n\ninterface MenuItemClicked {\n  parentPaths: string[];\n  path: string;\n}\n\ninterface MenuProvider {\n  activePath?: string;\n  addMenuItem: (item: MenuItemRegistered) => void;\n\n  addSubMenu: (item: MenuItemRegistered) => void;\n  closeMenu: (path: string, parentLinks: string[]) => void;\n  handleMenuItemClick: (item: MenuItemClicked) => void;\n  handleSubMenuClick: (subMenu: MenuItemRegistered) => void;\n  isMenuPopup: boolean;\n  items: Record<string, MenuItemRegistered>;\n\n  openedMenus: string[];\n  openMenu: (path: string, parentLinks: string[]) => void;\n  props: MenuProps;\n  removeMenuItem: (item: MenuItemRegistered) => void;\n\n  removeSubMenu: (item: MenuItemRegistered) => void;\n\n  subMenus: Record<string, MenuItemRegistered>;\n  theme: string;\n}\n\ninterface SubMenuProvider {\n  addSubMenu: (item: MenuItemRegistered) => void;\n  handleMouseleave?: (deepDispatch: boolean) => void;\n  level: number;\n  mouseInChild: Ref<boolean>;\n  removeSubMenu: (item: MenuItemRegistered) => void;\n}\n\nexport type { MenuItemClicked, MenuItemProps, MenuItemRegistered, MenuProps, MenuProvider, SubMenuProps, SubMenuProvider };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/menu-ui/utils/index.ts",
    "content": "import type { ComponentInternalInstance, VNode, VNodeChild, VNodeNormalizedChildren } from \"vue\";\n\nimport { isVNode } from \"vue\";\n\ntype VNodeChildAtom = Exclude<VNodeChild, Array<any>>;\ntype RawSlots = Exclude<VNodeNormalizedChildren, Array<any> | null | string>;\n\ntype FlattenVNodes = Array<RawSlots | VNodeChildAtom>;\n\n/**\n * @zh_CN Find the parent component upward\n * @param instance\n * @param parentNames\n */\nfunction findComponentUpward(instance: ComponentInternalInstance, parentNames: string[]) {\n  let parent = instance.parent;\n  while (parent && !parentNames.includes(parent?.type?.name ?? \"\")) {\n    parent = parent.parent;\n  }\n  return parent;\n}\n\nconst flattedChildren = (children: FlattenVNodes | VNode | VNodeNormalizedChildren): FlattenVNodes => {\n  const vNodes = Array.isArray(children) ? children : [children];\n  const result: FlattenVNodes = [];\n\n  vNodes.forEach(child => {\n    if (Array.isArray(child)) {\n      result.push(...flattedChildren(child));\n    } else if (isVNode(child) && Array.isArray(child.children)) {\n      result.push(...flattedChildren(child.children));\n    } else {\n      result.push(child);\n      if (isVNode(child) && child.component?.subTree) {\n        result.push(...flattedChildren(child.component.subTree));\n      }\n    }\n  });\n  return result;\n};\n\nexport { findComponentUpward, flattedChildren };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/drawer/__tests__/drawer-api.test.ts",
    "content": "import type { DrawerState } from \"../drawer\";\n\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { DrawerApi } from \"../drawer-api\";\n\n// 模拟 Store 类\nvi.mock(\"/@/vben/shared/store\", () => {\n  return {\n    isFunction: (fn: any) => typeof fn === \"function\",\n    Store: class {\n      get state() {\n        return this._state;\n      }\n      private _state: DrawerState;\n\n      private options: any;\n\n      constructor(initialState: DrawerState, options: any) {\n        this._state = initialState;\n        this.options = options;\n      }\n\n      batch(cb: () => void) {\n        cb();\n      }\n\n      setState(fn: (prev: DrawerState) => DrawerState) {\n        this._state = fn(this._state);\n        this.options.onUpdate();\n      }\n    },\n  };\n});\n\ndescribe(\"drawerApi\", () => {\n  let drawerApi: DrawerApi;\n  let drawerState: DrawerState;\n\n  beforeEach(() => {\n    drawerApi = new DrawerApi();\n    drawerState = drawerApi.store.state;\n  });\n\n  it(\"should initialize with default state\", () => {\n    expect(drawerState.isOpen).toBe(false);\n    expect(drawerState.cancelText).toBe(undefined);\n    expect(drawerState.confirmText).toBe(undefined);\n  });\n\n  it(\"should open the drawer\", () => {\n    drawerApi.open();\n    expect(drawerApi.store.state.isOpen).toBe(true);\n  });\n\n  it(\"should close the drawer if onBeforeClose allows it\", () => {\n    drawerApi.open();\n    drawerApi.close();\n    expect(drawerApi.store.state.isOpen).toBe(false);\n  });\n\n  it(\"should not close the drawer if onBeforeClose returns false\", () => {\n    const onBeforeClose = vi.fn(() => false);\n    const drawerApiWithHook = new DrawerApi({ onBeforeClose });\n    drawerApiWithHook.open();\n    drawerApiWithHook.close();\n    expect(drawerApiWithHook.store.state.isOpen).toBe(true);\n    expect(onBeforeClose).toHaveBeenCalled();\n  });\n\n  it(\"should trigger onCancel and keep drawer open if onCancel is provided\", () => {\n    const onCancel = vi.fn();\n    const drawerApiWithHook = new DrawerApi({ onCancel });\n    drawerApiWithHook.open();\n    drawerApiWithHook.onCancel();\n    expect(onCancel).toHaveBeenCalled();\n    expect(drawerApiWithHook.store.state.isOpen).toBe(true); // 关闭逻辑不在 onCancel 内\n  });\n\n  it(\"should update shared data correctly\", () => {\n    const testData = { key: \"value\" };\n    drawerApi.setData(testData);\n    expect(drawerApi.getData()).toEqual(testData);\n  });\n\n  it(\"should set state correctly using an object\", () => {\n    drawerApi.setState({ title: \"New Title\" });\n    expect(drawerApi.store.state.title).toBe(\"New Title\");\n  });\n\n  it(\"should set state correctly using a function\", () => {\n    drawerApi.setState(prev => ({ ...prev, confirmText: \"Yes\" }));\n    expect(drawerApi.store.state.confirmText).toBe(\"Yes\");\n  });\n\n  it(\"should call onOpenChange when state changes\", () => {\n    const onOpenChange = vi.fn();\n    const drawerApiWithHook = new DrawerApi({ onOpenChange });\n    drawerApiWithHook.open();\n    expect(onOpenChange).toHaveBeenCalledWith(true);\n  });\n\n  it(\"should call onClosed callback when provided\", () => {\n    const onClosed = vi.fn();\n    const drawerApiWithHook = new DrawerApi({ onClosed });\n    drawerApiWithHook.onClosed();\n    expect(onClosed).toHaveBeenCalled();\n  });\n\n  it(\"should call onOpened callback when provided\", () => {\n    const onOpened = vi.fn();\n    const drawerApiWithHook = new DrawerApi({ onOpened });\n    drawerApiWithHook.open();\n    drawerApiWithHook.onOpened();\n    expect(onOpened).toHaveBeenCalled();\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/drawer/drawer-api.ts",
    "content": "import type { DrawerApiOptions, DrawerState } from \"./drawer\";\n\nimport { Store } from \"/@/vben/shared/store\";\nimport { bindMethods, isFunction } from \"/@/vben/shared/utils\";\n\nexport class DrawerApi {\n  // 共享数据\n  public sharedData: Record<\"payload\", any> = {\n    payload: {},\n  };\n  public store: Store<DrawerState>;\n\n  private api: Pick<DrawerApiOptions, \"onBeforeClose\" | \"onCancel\" | \"onClosed\" | \"onConfirm\" | \"onOpenChange\" | \"onOpened\">;\n\n  // private prevState!: DrawerState;\n  private state!: DrawerState;\n\n  constructor(options: DrawerApiOptions = {}) {\n    const { connectedComponent: _, onBeforeClose, onCancel, onClosed, onConfirm, onOpenChange, onOpened, ...storeState } = options;\n\n    const defaultState: DrawerState = {\n      class: \"\",\n      closable: true,\n      closeOnClickModal: true,\n      closeOnPressEscape: true,\n      confirmLoading: false,\n      contentClass: \"\",\n      footer: true,\n      header: true,\n      isOpen: false,\n      loading: false,\n      modal: true,\n      openAutoFocus: false,\n      placement: \"right\",\n      showCancelButton: true,\n      showConfirmButton: true,\n      title: \"\",\n    };\n\n    this.store = new Store<DrawerState>(\n      {\n        ...defaultState,\n        ...storeState,\n      },\n      {\n        onUpdate: () => {\n          const state = this.store.state;\n          if (state?.isOpen === this.state?.isOpen) {\n            this.state = state;\n          } else {\n            this.state = state;\n            this.api.onOpenChange?.(!!state?.isOpen);\n          }\n        },\n      }\n    );\n    this.state = this.store.state;\n    this.api = {\n      onBeforeClose,\n      onCancel,\n      onClosed,\n      onConfirm,\n      onOpenChange,\n      onOpened,\n    };\n    bindMethods(this);\n  }\n\n  /**\n   * 关闭弹窗\n   */\n  close() {\n    // 通过 onBeforeClose 钩子函数来判断是否允许关闭弹窗\n    // 如果 onBeforeClose 返回 false，则不关闭弹窗\n    const allowClose = this.api.onBeforeClose?.() ?? true;\n    if (allowClose) {\n      this.store.setState(prev => ({ ...prev, isOpen: false }));\n    }\n  }\n\n  getData<T extends object = Record<string, any>>() {\n    return (this.sharedData?.payload ?? {}) as T;\n  }\n\n  /**\n   * 取消操作\n   */\n  onCancel() {\n    if (this.api.onCancel) {\n      this.api.onCancel?.();\n    } else {\n      this.close();\n    }\n  }\n\n  /**\n   * 弹窗关闭动画播放完毕后的回调\n   */\n  onClosed() {\n    if (!this.state.isOpen) {\n      this.api.onClosed?.();\n    }\n  }\n\n  /**\n   * 确认操作\n   */\n  onConfirm() {\n    this.api.onConfirm?.();\n  }\n\n  /**\n   * 弹窗打开动画播放完毕后的回调\n   */\n  onOpened() {\n    if (this.state.isOpen) {\n      this.api.onOpened?.();\n    }\n  }\n\n  open() {\n    this.store.setState(prev => ({ ...prev, isOpen: true }));\n  }\n\n  setData<T>(payload: T) {\n    this.sharedData.payload = payload;\n    return this;\n  }\n\n  setState(stateOrFn: ((prev: DrawerState) => Partial<DrawerState>) | Partial<DrawerState>) {\n    if (isFunction(stateOrFn)) {\n      this.store.setState(stateOrFn);\n    } else {\n      this.store.setState(prev => ({ ...prev, ...stateOrFn }));\n    }\n    return this;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/drawer/drawer.ts",
    "content": "import type { Component, Ref } from \"vue\";\n\nimport type { ClassType } from \"/@/vben/typings\";\n\nimport type { DrawerApi } from \"./drawer-api\";\n\nexport type DrawerPlacement = \"bottom\" | \"left\" | \"right\" | \"top\";\n\nexport type CloseIconPlacement = \"left\" | \"right\";\n\nexport interface DrawerProps {\n  /**\n   * 是否挂载到内容区域\n   * @default false\n   */\n  appendToMain?: boolean;\n  /**\n   * 取消按钮文字\n   */\n  cancelText?: string;\n  class?: ClassType;\n  /**\n   * 是否显示关闭按钮\n   * @default true\n   */\n  closable?: boolean;\n  /**\n   * 关闭按钮的位置\n   */\n  closeIconPlacement?: CloseIconPlacement;\n  /**\n   * 点击弹窗遮罩是否关闭弹窗\n   * @default true\n   */\n  closeOnClickModal?: boolean;\n  /**\n   * 按下 ESC 键是否关闭弹窗\n   * @default true\n   */\n  closeOnPressEscape?: boolean;\n  /**\n   * 确定按钮 loading\n   * @default false\n   */\n  confirmLoading?: boolean;\n  /**\n   * 确定按钮文字\n   */\n  confirmText?: string;\n  contentClass?: string;\n  /**\n   * 弹窗描述\n   */\n  description?: string;\n  /**\n   * 是否显示底部\n   * @default true\n   */\n  footer?: boolean;\n  /**\n   * 弹窗底部样式\n   */\n  footerClass?: ClassType;\n  /**\n   * 是否显示顶栏\n   * @default true\n   */\n  header?: boolean;\n  /**\n   * 弹窗头部样式\n   */\n  headerClass?: ClassType;\n  /**\n   * 弹窗是否显示\n   * @default false\n   */\n  loading?: boolean;\n\n  /**\n   * 是否显示遮罩\n   * @default true\n   */\n  modal?: boolean;\n  /**\n   * 是否自动聚焦\n   */\n  openAutoFocus?: boolean;\n  /**\n   * 弹窗遮罩模糊效果\n   */\n  overlayBlur?: number;\n\n  /**\n   * 抽屉位置\n   * @default right\n   */\n  placement?: DrawerPlacement;\n  /**\n   * 是否显示取消按钮\n   * @default true\n   */\n  showCancelButton?: boolean;\n  /**\n   * 是否显示确认按钮\n   * @default true\n   */\n  showConfirmButton?: boolean;\n  /**\n   * 弹窗标题\n   */\n  title?: string;\n  /**\n   * 弹窗标题提示\n   */\n  titleTooltip?: string;\n  /**\n   * 抽屉层级\n   */\n  zIndex?: number;\n}\n\nexport interface DrawerState extends DrawerProps {\n  /** 弹窗打开状态 */\n  isOpen?: boolean;\n  /**\n   * 共享数据\n   */\n  sharedData?: Record<string, any>;\n}\n\nexport type ExtendedDrawerApi = DrawerApi & {\n  useStore: <T = NoInfer<DrawerState>>(selector?: (state: NoInfer<DrawerState>) => T) => Readonly<Ref<T>>;\n};\n\nexport interface DrawerApiOptions extends DrawerState {\n  /**\n   * 独立的抽屉组件\n   */\n  connectedComponent?: Component;\n  /**\n   * 在关闭时销毁抽屉。仅在使用 connectedComponent 时有效\n   */\n  destroyOnClose?: boolean;\n  /**\n   * 关闭前的回调，返回 false 可以阻止关闭\n   * @returns\n   */\n  onBeforeClose?: () => void;\n  /**\n   * 点击取消按钮的回调\n   */\n  onCancel?: () => void;\n  /**\n   * 弹窗关闭动画结束的回调\n   * @returns\n   */\n  onClosed?: () => void;\n  /**\n   * 点击确定按钮的回调\n   */\n  onConfirm?: () => void;\n  /**\n   * 弹窗状态变化回调\n   * @param isOpen\n   * @returns\n   */\n  onOpenChange?: (isOpen: boolean) => void;\n  /**\n   * 弹窗打开动画结束的回调\n   * @returns\n   */\n  onOpened?: () => void;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/drawer/drawer.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { DrawerProps, ExtendedDrawerApi } from \"./drawer\";\n\nimport { computed, provide, ref, useId, watch } from \"vue\";\n\nimport { useIsMobile, usePriorityValues, useSimpleLocale } from \"../../composables\";\nimport { X } from \"../../icons\";\nimport { Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, VbenButton, VbenHelpTooltip, VbenIconButton, VbenLoading, VisuallyHidden } from \"/@/vben/shadcn-ui\";\nimport { ELEMENT_ID_MAIN_CONTENT } from \"../../shared/constants\";\nimport { globalShareState } from \"../../shared/global-state\";\nimport { cn } from \"../../shared/utils\";\n\ninterface Props extends DrawerProps {\n  drawerApi?: ExtendedDrawerApi;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  appendToMain: false,\n  closeIconPlacement: \"right\",\n  drawerApi: undefined,\n  zIndex: 1000,\n});\n\nconst components = globalShareState.getComponents();\n\nconst id = useId();\nprovide(\"DISMISSABLE_DRAWER_ID\", id);\n\nconst wrapperRef = ref<HTMLElement>();\nconst { $t } = useSimpleLocale();\nconst { isMobile } = useIsMobile();\n\nconst state = props.drawerApi?.useStore?.();\n\nconst {\n  appendToMain,\n  cancelText,\n  class: drawerClass,\n  closable,\n  closeIconPlacement,\n  closeOnClickModal,\n  closeOnPressEscape,\n  confirmLoading,\n  confirmText,\n  contentClass,\n  description,\n  footer: showFooter,\n  footerClass,\n  header: showHeader,\n  headerClass,\n  loading: showLoading,\n  modal,\n  openAutoFocus,\n  overlayBlur,\n  placement,\n  showCancelButton,\n  showConfirmButton,\n  title,\n  titleTooltip,\n  zIndex,\n} = usePriorityValues(props, state);\n\nwatch(\n  () => showLoading.value,\n  v => {\n    if (v && wrapperRef.value) {\n      wrapperRef.value.scrollTo({\n        // behavior: 'smooth',\n        top: 0,\n      });\n    }\n  }\n);\n\nfunction interactOutside(e: Event) {\n  if (!closeOnClickModal.value) {\n    e.preventDefault();\n  }\n}\nfunction escapeKeyDown(e: KeyboardEvent) {\n  if (!closeOnPressEscape.value) {\n    e.preventDefault();\n  }\n}\n// pointer-down-outside\nfunction pointerDownOutside(e: Event) {\n  const target = e.target as HTMLElement;\n  const dismissableDrawer = target?.dataset.dismissableDrawer;\n  if (!closeOnClickModal.value || dismissableDrawer !== id) {\n    e.preventDefault();\n  }\n}\n\nfunction handerOpenAutoFocus(e: Event) {\n  if (!openAutoFocus.value) {\n    e?.preventDefault();\n  }\n}\n\nfunction handleFocusOutside(e: Event) {\n  e.preventDefault();\n  e.stopPropagation();\n}\n\nconst getAppendTo = computed(() => {\n  return appendToMain.value ? `#${ELEMENT_ID_MAIN_CONTENT}` : undefined;\n});\n</script>\n<template>\n  <Sheet :modal=\"false\" :open=\"state?.isOpen\" @update:open=\"() => drawerApi?.close()\">\n    <SheetContent\n      :append-to=\"getAppendTo\"\n      :class=\"\n        cn('flex w-[520px] flex-col', drawerClass, {\n          '!w-full': isMobile || placement === 'bottom' || placement === 'top',\n          'max-h-[100vh]': placement === 'bottom' || placement === 'top',\n        })\n      \"\n      :modal=\"modal\"\n      :open=\"state?.isOpen\"\n      :side=\"placement\"\n      :z-index=\"zIndex\"\n      :overlay-blur=\"overlayBlur\"\n      @close-auto-focus=\"handleFocusOutside\"\n      @closed=\"() => drawerApi?.onClosed()\"\n      @escape-key-down=\"escapeKeyDown\"\n      @focus-outside=\"handleFocusOutside\"\n      @interact-outside=\"interactOutside\"\n      @open-auto-focus=\"handerOpenAutoFocus\"\n      @opened=\"() => drawerApi?.onOpened()\"\n      @pointer-down-outside=\"pointerDownOutside\"\n    >\n      <SheetHeader\n        v-if=\"showHeader\"\n        :class=\"\n          cn('!flex flex-row items-center justify-between border-b px-6 py-5', headerClass, {\n            'px-4 py-3': closable,\n            'pl-2': closable && closeIconPlacement === 'left',\n          })\n        \"\n      >\n        <div class=\"flex items-center\">\n          <SheetClose\n            v-if=\"closable && closeIconPlacement === 'left'\"\n            as-child\n            class=\"data-[state=open]:bg-secondary ml-[2px] cursor-pointer rounded-full opacity-80 transition-opacity hover:opacity-100 focus:outline-none disabled:pointer-events-none\"\n          >\n            <slot name=\"close-icon\">\n              <VbenIconButton>\n                <X class=\"size-4\" />\n              </VbenIconButton>\n            </slot>\n          </SheetClose>\n          <Separator v-if=\"closable && closeIconPlacement === 'left'\" class=\"ml-1 mr-2 h-8\" decorative orientation=\"vertical\" />\n          <SheetTitle v-if=\"title\" class=\"text-left\">\n            <slot name=\"title\">\n              {{ title }}\n\n              <VbenHelpTooltip v-if=\"titleTooltip\" trigger-class=\"pb-1\">\n                {{ titleTooltip }}\n              </VbenHelpTooltip>\n            </slot>\n          </SheetTitle>\n          <SheetDescription v-if=\"description\" class=\"mt-1 text-xs\">\n            <slot name=\"description\">\n              {{ description }}\n            </slot>\n          </SheetDescription>\n        </div>\n\n        <VisuallyHidden v-if=\"!title || !description\">\n          <SheetTitle v-if=\"!title\" />\n          <SheetDescription v-if=\"!description\" />\n        </VisuallyHidden>\n\n        <div class=\"flex-center\">\n          <slot name=\"extra\"></slot>\n          <SheetClose\n            v-if=\"closable && closeIconPlacement === 'right'\"\n            as-child\n            class=\"data-[state=open]:bg-secondary ml-[2px] cursor-pointer rounded-full opacity-80 transition-opacity hover:opacity-100 focus:outline-none disabled:pointer-events-none\"\n          >\n            <slot name=\"close-icon\">\n              <VbenIconButton>\n                <X class=\"size-4\" />\n              </VbenIconButton>\n            </slot>\n          </SheetClose>\n        </div>\n      </SheetHeader>\n      <template v-else>\n        <VisuallyHidden>\n          <SheetTitle />\n          <SheetDescription />\n        </VisuallyHidden>\n      </template>\n      <div\n        ref=\"wrapperRef\"\n        :class=\"\n          cn('relative flex-1 overflow-y-auto p-3', contentClass, {\n            'overflow-hidden': showLoading,\n          })\n        \"\n      >\n        <VbenLoading v-if=\"showLoading\" class=\"size-full\" spinning />\n\n        <slot></slot>\n      </div>\n\n      <SheetFooter v-if=\"showFooter\" :class=\"cn('w-full flex-row items-center justify-end border-t p-2 px-3', footerClass)\">\n        <slot name=\"prepend-footer\"></slot>\n        <slot name=\"footer\">\n          <component :is=\"components.DefaultButton || VbenButton\" v-if=\"showCancelButton\" variant=\"ghost\" @click=\"() => drawerApi?.onCancel()\">\n            <slot name=\"cancelText\">\n              {{ cancelText || $t(\"cancel\") }}\n            </slot>\n          </component>\n\n          <component :is=\"components.PrimaryButton || VbenButton\" v-if=\"showConfirmButton\" :loading=\"confirmLoading\" @click=\"() => drawerApi?.onConfirm()\">\n            <slot name=\"confirmText\">\n              {{ confirmText || $t(\"confirm\") }}\n            </slot>\n          </component>\n        </slot>\n        <slot name=\"append-footer\"></slot>\n      </SheetFooter>\n    </SheetContent>\n  </Sheet>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/drawer/index.ts",
    "content": "export type * from \"./drawer\";\nexport { default as VbenDrawer } from \"./drawer.vue\";\nexport { setDefaultDrawerProps, useVbenDrawer } from \"./use-drawer\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/drawer/use-drawer.ts",
    "content": "import type { DrawerApiOptions, DrawerProps, ExtendedDrawerApi } from \"./drawer\";\n\nimport { defineComponent, h, inject, nextTick, provide, reactive, ref } from \"vue\";\n\nimport { useStore } from \"/@/vben/shared/store\";\n\nimport { DrawerApi } from \"./drawer-api\";\nimport VbenDrawer from \"./drawer.vue\";\n\nconst USER_DRAWER_INJECT_KEY = Symbol(\"VBEN_DRAWER_INJECT\");\n\nconst DEFAULT_DRAWER_PROPS: Partial<DrawerProps> = {};\n\nexport function setDefaultDrawerProps(props: Partial<DrawerProps>) {\n  Object.assign(DEFAULT_DRAWER_PROPS, props);\n}\n\nexport function useVbenDrawer<TParentDrawerProps extends DrawerProps = DrawerProps>(options: DrawerApiOptions = {}) {\n  // Drawer一般会抽离出来，所以如果有传入 connectedComponent，则表示为外部调用，与内部组件进行连接\n  // 外部的Drawer通过provide/inject传递api\n\n  const { connectedComponent } = options;\n  if (connectedComponent) {\n    const extendedApi = reactive({});\n    const isDrawerReady = ref(true);\n    const Drawer = defineComponent(\n      (props: TParentDrawerProps, { attrs, slots }) => {\n        provide(USER_DRAWER_INJECT_KEY, {\n          extendApi(api: ExtendedDrawerApi) {\n            // 不能直接给 reactive 赋值，会丢失响应\n            // 不能用 Object.assign,会丢失 api 的原型函数\n            Object.setPrototypeOf(extendedApi, api);\n          },\n          options,\n          async reCreateDrawer() {\n            isDrawerReady.value = false;\n            await nextTick();\n            isDrawerReady.value = true;\n          },\n        });\n        checkProps(extendedApi as ExtendedDrawerApi, {\n          ...props,\n          ...attrs,\n          ...slots,\n        });\n        return () => h(isDrawerReady.value ? connectedComponent : \"div\", { ...props, ...attrs }, slots);\n      },\n      {\n        name: \"VbenParentDrawer\",\n        inheritAttrs: false,\n      }\n    );\n    return [Drawer, extendedApi as ExtendedDrawerApi] as const;\n  }\n\n  const injectData = inject<any>(USER_DRAWER_INJECT_KEY, {});\n\n  const mergedOptions = {\n    ...DEFAULT_DRAWER_PROPS,\n    ...injectData.options,\n    ...options,\n  } as DrawerApiOptions;\n\n  mergedOptions.onOpenChange = (isOpen: boolean) => {\n    options.onOpenChange?.(isOpen);\n    injectData.options?.onOpenChange?.(isOpen);\n  };\n\n  const onClosed = mergedOptions.onClosed;\n  mergedOptions.onClosed = () => {\n    onClosed?.();\n    if (mergedOptions.destroyOnClose) {\n      injectData.reCreateDrawer?.();\n    }\n  };\n  const api = new DrawerApi(mergedOptions);\n\n  const extendedApi: ExtendedDrawerApi = api as never;\n\n  extendedApi.useStore = selector => {\n    return useStore(api.store, selector);\n  };\n\n  const Drawer = defineComponent(\n    (props: DrawerProps, { attrs, slots }) => {\n      return () => h(VbenDrawer, { ...props, ...attrs, drawerApi: extendedApi }, slots);\n    },\n    {\n      name: \"VbenDrawer\",\n      inheritAttrs: false,\n    }\n  );\n  injectData.extendApi?.(extendedApi);\n  return [Drawer, extendedApi] as const;\n}\n\nasync function checkProps(api: ExtendedDrawerApi, attrs: Record<string, any>) {\n  if (!attrs || Object.keys(attrs).length === 0) {\n    return;\n  }\n  await nextTick();\n\n  const state = api?.store?.state;\n\n  if (!state) {\n    return;\n  }\n\n  const stateKeys = new Set(Object.keys(state));\n\n  for (const attr of Object.keys(attrs)) {\n    if (stateKeys.has(attr) && ![\"class\"].includes(attr)) {\n      // connectedComponent存在时，不要传入Drawer的props，会造成复杂度提升，如果你需要修改Drawer的props，请使用 useVbenDrawer 或者api\n      console.warn(`[Vben Drawer]: When 'connectedComponent' exists, do not set props or slots '${attr}', which will increase complexity. If you need to modify the props of Drawer, please use useVbenDrawer or api.`);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/index.ts",
    "content": "export * from \"./drawer\";\nexport * from \"./modal\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/modal/__tests__/modal-api.test.ts",
    "content": "import type { ModalState } from \"../modal\";\n\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { ModalApi } from \"../modal-api\";\n\nvi.mock(\"/@/vben/shared/store\", () => {\n  return {\n    isFunction: (fn: any) => typeof fn === \"function\",\n    Store: class {\n      get state() {\n        return this._state;\n      }\n      private _state: ModalState;\n\n      private options: any;\n\n      constructor(initialState: ModalState, options: any) {\n        this._state = initialState;\n        this.options = options;\n      }\n\n      batch(cb: () => void) {\n        cb();\n      }\n\n      setState(fn: (prev: ModalState) => ModalState) {\n        this._state = fn(this._state);\n        this.options.onUpdate();\n      }\n    },\n  };\n});\n\ndescribe(\"modalApi\", () => {\n  let modalApi: ModalApi;\n  // 使用 modalState 而不是 state\n  let modalState: ModalState;\n\n  beforeEach(() => {\n    modalApi = new ModalApi();\n    // 获取 modalApi 内的 state\n    modalState = modalApi.store.state;\n  });\n\n  it(\"should initialize with default state\", () => {\n    expect(modalState.isOpen).toBe(false);\n    expect(modalState.cancelText).toBe(undefined);\n    expect(modalState.confirmText).toBe(undefined);\n  });\n\n  it(\"should open the modal\", () => {\n    modalApi.open();\n    expect(modalApi.store.state.isOpen).toBe(true);\n  });\n\n  it(\"should close the modal if onBeforeClose allows it\", () => {\n    modalApi.close();\n    expect(modalApi.store.state.isOpen).toBe(false);\n  });\n\n  it(\"should not close the modal if onBeforeClose returns false\", () => {\n    const onBeforeClose = vi.fn(() => false);\n    const modalApiWithHook = new ModalApi({ onBeforeClose });\n    modalApiWithHook.open();\n    modalApiWithHook.close();\n    expect(modalApiWithHook.store.state.isOpen).toBe(true);\n    expect(onBeforeClose).toHaveBeenCalled();\n  });\n\n  it(\"should trigger onCancel and close the modal if no onCancel hook is provided\", () => {\n    const onCancel = vi.fn();\n    const modalApiWithHook = new ModalApi({ onCancel });\n    modalApiWithHook.open();\n    modalApiWithHook.onCancel();\n    expect(onCancel).toHaveBeenCalled();\n    expect(modalApiWithHook.store.state.isOpen).toBe(true);\n  });\n\n  it(\"should update shared data correctly\", () => {\n    const testData = { key: \"value\" };\n    modalApi.setData(testData);\n    expect(modalApi.getData()).toEqual(testData);\n  });\n\n  it(\"should set state correctly using an object\", () => {\n    modalApi.setState({ title: \"New Title\" });\n    expect(modalApi.store.state.title).toBe(\"New Title\");\n  });\n\n  it(\"should set state correctly using a function\", () => {\n    modalApi.setState(prev => ({ ...prev, confirmText: \"Yes\" }));\n    expect(modalApi.store.state.confirmText).toBe(\"Yes\");\n  });\n\n  it(\"should call onOpenChange when state changes\", () => {\n    const onOpenChange = vi.fn();\n    const modalApiWithHook = new ModalApi({ onOpenChange });\n    modalApiWithHook.open();\n    expect(onOpenChange).toHaveBeenCalledWith(true);\n  });\n\n  it(\"should call onClosed callback when provided\", () => {\n    const onClosed = vi.fn();\n    const modalApiWithHook = new ModalApi({ onClosed });\n    modalApiWithHook.onClosed();\n    expect(onClosed).toHaveBeenCalled();\n  });\n\n  it(\"should call onOpened callback when provided\", () => {\n    const onOpened = vi.fn();\n    const modalApiWithHook = new ModalApi({ onOpened });\n    modalApiWithHook.open();\n    modalApiWithHook.onOpened();\n    expect(onOpened).toHaveBeenCalled();\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/modal/index.ts",
    "content": "export type * from \"./modal\";\nexport { default as VbenModal } from \"./modal.vue\";\nexport { setDefaultModalProps, useVbenModal } from \"./use-modal\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/modal/modal-api.ts",
    "content": "import type { ModalApiOptions, ModalState } from \"./modal\";\n\nimport { Store } from \"/@/vben/shared/store\";\nimport { bindMethods, isFunction } from \"/@/vben/shared/utils\";\n\nexport class ModalApi {\n  // 共享数据\n  public sharedData: Record<\"payload\", any> = {\n    payload: {},\n  };\n  public store: Store<ModalState>;\n\n  private api: Pick<ModalApiOptions, \"onBeforeClose\" | \"onCancel\" | \"onClosed\" | \"onConfirm\" | \"onOpenChange\" | \"onOpened\">;\n\n  // private prevState!: ModalState;\n  private state!: ModalState;\n\n  constructor(options: ModalApiOptions = {}) {\n    const { connectedComponent: _, onBeforeClose, onCancel, onClosed, onConfirm, onOpenChange, onOpened, ...storeState } = options;\n\n    const defaultState: ModalState = {\n      bordered: true,\n      centered: false,\n      class: \"\",\n      closeOnClickModal: true,\n      closeOnPressEscape: true,\n      confirmDisabled: false,\n      confirmLoading: false,\n      contentClass: \"\",\n      draggable: false,\n      footer: true,\n      footerClass: \"\",\n      fullscreen: false,\n      fullscreenButton: true,\n      header: true,\n      headerClass: \"\",\n      isOpen: false,\n      loading: false,\n      modal: true,\n      openAutoFocus: false,\n      showCancelButton: true,\n      showConfirmButton: true,\n      title: \"\",\n    };\n\n    this.store = new Store<ModalState>(\n      {\n        ...defaultState,\n        ...storeState,\n      },\n      {\n        onUpdate: () => {\n          const state = this.store.state;\n\n          // 每次更新状态时，都会调用 onOpenChange 回调函数\n          if (state?.isOpen === this.state?.isOpen) {\n            this.state = state;\n          } else {\n            this.state = state;\n            this.api.onOpenChange?.(!!state?.isOpen);\n          }\n        },\n      }\n    );\n\n    this.state = this.store.state;\n\n    this.api = {\n      onBeforeClose,\n      onCancel,\n      onClosed,\n      onConfirm,\n      onOpenChange,\n      onOpened,\n    };\n    bindMethods(this);\n  }\n\n  /**\n   * 关闭弹窗\n   * @description 关闭弹窗时会调用 onBeforeClose 钩子函数，如果 onBeforeClose 返回 false，则不关闭弹窗\n   */\n  async close() {\n    // 通过 onBeforeClose 钩子函数来判断是否允许关闭弹窗\n    // 如果 onBeforeClose 返回 false，则不关闭弹窗\n    const allowClose = (await this.api.onBeforeClose?.()) ?? true;\n    if (allowClose) {\n      this.store.setState(prev => ({\n        ...prev,\n        isOpen: false,\n        submitting: false,\n      }));\n    }\n  }\n\n  getData<T extends object = Record<string, any>>() {\n    return (this.sharedData?.payload ?? {}) as T;\n  }\n\n  /**\n   * 锁定弹窗状态（用于提交过程中的等待状态）\n   * @description 锁定状态将禁用默认的取消按钮，使用spinner覆盖弹窗内容，隐藏关闭按钮，阻止手动关闭弹窗，将默认的提交按钮标记为loading状态\n   * @param isLocked 是否锁定\n   */\n  lock(isLocked = true) {\n    return this.setState({ submitting: isLocked });\n  }\n\n  /**\n   * 取消操作\n   */\n  onCancel() {\n    if (this.api.onCancel) {\n      this.api.onCancel?.();\n    } else {\n      this.close();\n    }\n  }\n\n  /**\n   * 弹窗关闭动画播放完毕后的回调\n   */\n  onClosed() {\n    if (!this.state.isOpen) {\n      this.api.onClosed?.();\n    }\n  }\n\n  /**\n   * 确认操作\n   */\n  onConfirm() {\n    this.api.onConfirm?.();\n  }\n\n  /**\n   * 弹窗打开动画播放完毕后的回调\n   */\n  onOpened() {\n    if (this.state.isOpen) {\n      this.api.onOpened?.();\n    }\n  }\n\n  open() {\n    this.store.setState(prev => ({ ...prev, isOpen: true }));\n  }\n\n  setData<T>(payload: T) {\n    this.sharedData.payload = payload;\n    return this;\n  }\n\n  setState(stateOrFn: ((prev: ModalState) => Partial<ModalState>) | Partial<ModalState>) {\n    if (isFunction(stateOrFn)) {\n      this.store.setState(stateOrFn);\n    } else {\n      this.store.setState(prev => ({ ...prev, ...stateOrFn }));\n    }\n    return this;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/modal/modal.ts",
    "content": "import type { Component, Ref } from \"vue\";\n\nimport type { MaybePromise } from \"/@/vben/typings\";\n\nimport type { ModalApi } from \"./modal-api\";\n\nexport interface ModalProps {\n  /**\n   * 是否要挂载到内容区域\n   * @default false\n   */\n  appendToMain?: boolean;\n  /**\n   * 是否显示边框\n   * @default false\n   */\n  bordered?: boolean;\n  /**\n   * 取消按钮文字\n   */\n  cancelText?: string;\n  /**\n   * 是否居中\n   * @default false\n   */\n  centered?: boolean;\n\n  class?: string;\n\n  /**\n   * 是否显示右上角的关闭按钮\n   * @default true\n   */\n  closable?: boolean;\n  /**\n   * 点击弹窗遮罩是否关闭弹窗\n   * @default true\n   */\n  closeOnClickModal?: boolean;\n  /**\n   * 按下 ESC 键是否关闭弹窗\n   * @default true\n   */\n  closeOnPressEscape?: boolean;\n  /**\n   * 禁用确认按钮\n   */\n  confirmDisabled?: boolean;\n  /**\n   * 确定按钮 loading\n   * @default false\n   */\n  confirmLoading?: boolean;\n  /**\n   * 确定按钮文字\n   */\n  confirmText?: string;\n  contentClass?: string;\n  /**\n   * 弹窗描述\n   */\n  description?: string;\n  /**\n   * 是否可拖拽\n   * @default false\n   */\n  draggable?: boolean;\n  /**\n   * 是否显示底部\n   * @default true\n   */\n  footer?: boolean;\n  footerClass?: string;\n  /**\n   * 是否全屏\n   * @default false\n   */\n  fullscreen?: boolean;\n  /**\n   * 是否显示全屏按钮\n   * @default true\n   */\n  fullscreenButton?: boolean;\n  /**\n   * 是否显示顶栏\n   * @default true\n   */\n  header?: boolean;\n  headerClass?: string;\n  /**\n   * 弹窗是否显示\n   * @default false\n   */\n  loading?: boolean;\n  /**\n   * 是否显示遮罩\n   * @default true\n   */\n  modal?: boolean;\n  /**\n   * 是否自动聚焦\n   */\n  openAutoFocus?: boolean;\n  /**\n   * 弹窗遮罩模糊效果\n   */\n  overlayBlur?: number;\n  /**\n   * 是否显示取消按钮\n   * @default true\n   */\n  showCancelButton?: boolean;\n  /**\n   * 是否显示确认按钮\n   * @default true\n   */\n  showConfirmButton?: boolean;\n  /**\n   * 提交中（锁定弹窗状态）\n   */\n  submitting?: boolean;\n  /**\n   * 弹窗标题\n   */\n  title?: string;\n  /**\n   * 弹窗标题提示\n   */\n  titleTooltip?: string;\n  /**\n   * 弹窗层级\n   */\n  zIndex?: number;\n}\n\nexport interface ModalState extends ModalProps {\n  /** 弹窗打开状态 */\n  isOpen?: boolean;\n  /**\n   * 共享数据\n   */\n  sharedData?: Record<string, any>;\n}\n\nexport type ExtendedModalApi = ModalApi & {\n  useStore: <T = NoInfer<ModalState>>(selector?: (state: NoInfer<ModalState>) => T) => Readonly<Ref<T>>;\n};\n\nexport interface ModalApiOptions extends ModalState {\n  /**\n   * 独立的弹窗组件\n   */\n  connectedComponent?: Component;\n  /**\n   * 在关闭时销毁弹窗。仅在使用 connectedComponent 时有效\n   */\n  destroyOnClose?: boolean;\n  /**\n   * 关闭前的回调，返回 false 可以阻止关闭\n   * @returns\n   */\n  onBeforeClose?: () => MaybePromise<boolean | undefined>;\n  /**\n   * 点击取消按钮的回调\n   */\n  onCancel?: () => void;\n  /**\n   * 弹窗关闭动画结束的回调\n   * @returns\n   */\n  onClosed?: () => void;\n  /**\n   * 点击确定按钮的回调\n   */\n  onConfirm?: () => void;\n  /**\n   * 弹窗状态变化回调\n   * @param isOpen\n   * @returns\n   */\n  onOpenChange?: (isOpen: boolean) => void;\n  /**\n   * 弹窗打开动画结束的回调\n   * @returns\n   */\n  onOpened?: () => void;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/modal/modal.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { ExtendedModalApi, ModalProps } from \"./modal\";\n\nimport { computed, nextTick, provide, ref, useId, watch } from \"vue\";\n\nimport { useIsMobile, usePriorityValues, useSimpleLocale } from \"/@/vben/composables\";\nimport { Expand, Shrink } from \"/@/vben/icons\";\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, VbenButton, VbenHelpTooltip, VbenIconButton, VbenLoading, VisuallyHidden } from \"/@/vben/shadcn-ui\";\nimport { ELEMENT_ID_MAIN_CONTENT } from \"/@/vben/shared/constants\";\nimport { globalShareState } from \"/@/vben/shared/global-state\";\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { useModalDraggable } from \"./use-modal-draggable\";\n\ninterface Props extends ModalProps {\n  modalApi?: ExtendedModalApi;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  appendToMain: false,\n  modalApi: undefined,\n});\n\nconst components = globalShareState.getComponents();\n\nconst contentRef = ref();\nconst wrapperRef = ref<HTMLElement>();\nconst dialogRef = ref();\nconst headerRef = ref();\nconst footerRef = ref();\n\nconst id = useId();\n\nprovide(\"DISMISSABLE_MODAL_ID\", id);\n\nconst { $t } = useSimpleLocale();\nconst { isMobile } = useIsMobile();\nconst state = props.modalApi?.useStore?.();\n\nconst {\n  appendToMain,\n  bordered,\n  cancelText,\n  centered,\n  class: modalClass,\n  closable,\n  closeOnClickModal,\n  closeOnPressEscape,\n  confirmDisabled,\n  confirmLoading,\n  confirmText,\n  contentClass,\n  description,\n  draggable,\n  footer: showFooter,\n  footerClass,\n  fullscreen,\n  fullscreenButton,\n  header,\n  headerClass,\n  loading: showLoading,\n  modal,\n  openAutoFocus,\n  overlayBlur,\n  showCancelButton,\n  showConfirmButton,\n  submitting,\n  title,\n  titleTooltip,\n  zIndex,\n} = usePriorityValues(props, state);\n\nconst shouldFullscreen = computed(() => (fullscreen.value && header.value) || isMobile.value);\n\nconst shouldDraggable = computed(() => draggable.value && !shouldFullscreen.value && header.value);\n\nconst { dragging, transform } = useModalDraggable(dialogRef, headerRef, shouldDraggable);\n\nwatch(\n  () => state?.value?.isOpen,\n  async v => {\n    if (v) {\n      await nextTick();\n      if (!contentRef.value) return;\n      const innerContentRef = contentRef.value.getContentRef();\n      dialogRef.value = innerContentRef.$el;\n      // reopen modal reassign value\n      const { offsetX, offsetY } = transform;\n      dialogRef.value.style.transform = `translate(${offsetX}px, ${offsetY}px)`;\n    }\n  }\n);\n\nwatch(\n  () => [showLoading.value, submitting.value],\n  ([l, s]) => {\n    if ((s || l) && wrapperRef.value) {\n      wrapperRef.value.scrollTo({\n        // behavior: 'smooth',\n        top: 0,\n      });\n    }\n  }\n);\n\nfunction handleFullscreen() {\n  props.modalApi?.setState(prev => {\n    // if (prev.fullscreen) {\n    //   resetPosition();\n    // }\n    return { ...prev, fullscreen: !fullscreen.value };\n  });\n}\nfunction interactOutside(e: Event) {\n  if (!closeOnClickModal.value || submitting.value) {\n    e.preventDefault();\n    e.stopPropagation();\n  }\n}\nfunction escapeKeyDown(e: KeyboardEvent) {\n  if (!closeOnPressEscape.value || submitting.value) {\n    e.preventDefault();\n  }\n}\n\nfunction handerOpenAutoFocus(e: Event) {\n  if (!openAutoFocus.value) {\n    e?.preventDefault();\n  }\n}\n\n// pointer-down-outside\nfunction pointerDownOutside(e: Event) {\n  const target = e.target as HTMLElement;\n  const isDismissableModal = target?.dataset.dismissableModal;\n  if (!closeOnClickModal.value || isDismissableModal !== id || submitting.value) {\n    e.preventDefault();\n    e.stopPropagation();\n  }\n}\n\nfunction handleFocusOutside(e: Event) {\n  e.preventDefault();\n  e.stopPropagation();\n}\nconst getAppendTo = computed(() => {\n  return appendToMain.value ? `#${ELEMENT_ID_MAIN_CONTENT}` : undefined;\n});\n</script>\n<template>\n  <Dialog :modal=\"false\" :open=\"state?.isOpen\" @update:open=\"() => (!submitting ? modalApi?.close() : undefined)\">\n    <DialogContent\n      ref=\"contentRef\"\n      :append-to=\"getAppendTo\"\n      :class=\"\n        cn('left-0 right-0 top-[10vh] mx-auto flex max-h-[80%] w-[520px] flex-col p-0 sm:rounded-[var(--radius)]', modalClass, {\n          'border-border border': bordered,\n          'shadow-3xl': !bordered,\n          'left-0 top-0 size-full max-h-full !translate-x-0 !translate-y-0': shouldFullscreen,\n          'top-1/2 !-translate-y-1/2': centered && !shouldFullscreen,\n          'duration-300': !dragging,\n        })\n      \"\n      :modal=\"modal\"\n      :open=\"state?.isOpen\"\n      :show-close=\"submitting ? false : closable\"\n      :z-index=\"zIndex\"\n      :overlay-blur=\"overlayBlur\"\n      close-class=\"top-3\"\n      @close-auto-focus=\"handleFocusOutside\"\n      @closed=\"() => modalApi?.onClosed()\"\n      @escape-key-down=\"escapeKeyDown\"\n      @focus-outside=\"handleFocusOutside\"\n      @interact-outside=\"interactOutside\"\n      @open-auto-focus=\"handerOpenAutoFocus\"\n      @opened=\"() => modalApi?.onOpened()\"\n      @pointer-down-outside=\"pointerDownOutside\"\n    >\n      <DialogHeader\n        ref=\"headerRef\"\n        :class=\"\n          cn(\n            'px-5 py-4',\n            {\n              'border-b': bordered,\n              hidden: !header,\n              'cursor-move select-none': shouldDraggable,\n            },\n            headerClass\n          )\n        \"\n      >\n        <DialogTitle v-if=\"title\" class=\"text-left\">\n          <slot name=\"title\">\n            {{ title }}\n\n            <slot v-if=\"titleTooltip\" name=\"titleTooltip\">\n              <VbenHelpTooltip trigger-class=\"pb-1\">\n                {{ titleTooltip }}\n              </VbenHelpTooltip>\n            </slot>\n          </slot>\n        </DialogTitle>\n        <DialogDescription v-if=\"description\">\n          <slot name=\"description\">\n            {{ description }}\n          </slot>\n        </DialogDescription>\n        <VisuallyHidden v-if=\"!title || !description\">\n          <DialogTitle v-if=\"!title\" />\n          <DialogDescription v-if=\"!description\" />\n        </VisuallyHidden>\n      </DialogHeader>\n      <div\n        ref=\"wrapperRef\"\n        :class=\"\n          cn('relative min-h-40 flex-1 overflow-y-auto p-3', contentClass, {\n            'overflow-hidden': showLoading || submitting,\n          })\n        \"\n      >\n        <VbenLoading v-if=\"showLoading || submitting\" class=\"size-full h-auto min-h-full\" spinning />\n        <slot></slot>\n      </div>\n\n      <VbenIconButton\n        v-if=\"fullscreenButton\"\n        class=\"hover:bg-accent hover:text-accent-foreground text-foreground/80 flex-center absolute right-10 top-3 hidden size-6 rounded-full px-1 text-lg opacity-70 transition-opacity hover:opacity-100 focus:outline-none disabled:pointer-events-none sm:block\"\n        @click=\"handleFullscreen\"\n      >\n        <Shrink v-if=\"fullscreen\" class=\"size-3.5\" />\n        <Expand v-else class=\"size-3.5\" />\n      </VbenIconButton>\n\n      <DialogFooter\n        v-if=\"showFooter\"\n        ref=\"footerRef\"\n        :class=\"\n          cn(\n            'flex-row items-center justify-end p-2',\n            {\n              'border-t': bordered,\n            },\n            footerClass\n          )\n        \"\n      >\n        <slot name=\"prepend-footer\"></slot>\n        <slot name=\"footer\">\n          <component :is=\"components.DefaultButton || VbenButton\" v-if=\"showCancelButton\" variant=\"ghost\" :disabled=\"submitting\" @click=\"() => modalApi?.onCancel()\">\n            <slot name=\"cancelText\">\n              {{ cancelText || $t(\"cancel\") }}\n            </slot>\n          </component>\n\n          <component :is=\"components.PrimaryButton || VbenButton\" v-if=\"showConfirmButton\" :disabled=\"confirmDisabled\" :loading=\"confirmLoading || submitting\" @click=\"() => modalApi?.onConfirm()\">\n            <slot name=\"confirmText\">\n              {{ confirmText || $t(\"confirm\") }}\n            </slot>\n          </component>\n        </slot>\n        <slot name=\"append-footer\"></slot>\n      </DialogFooter>\n    </DialogContent>\n  </Dialog>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/modal/use-modal-draggable.ts",
    "content": "/**\n * @copy https://github.com/element-plus/element-plus/blob/dev/packages/hooks/use-draggable/index.ts\n * 调整部分细节\n */\n\nimport type { ComputedRef, Ref } from \"vue\";\n\nimport { onBeforeUnmount, onMounted, reactive, ref, watchEffect } from \"vue\";\n\nimport { unrefElement } from \"@vueuse/core\";\n\nexport function useModalDraggable(targetRef: Ref<HTMLElement | undefined>, dragRef: Ref<HTMLElement | undefined>, draggable: ComputedRef<boolean>) {\n  const transform = reactive({\n    offsetX: 0,\n    offsetY: 0,\n  });\n\n  const dragging = ref(false);\n\n  const onMousedown = (e: MouseEvent) => {\n    const downX = e.clientX;\n    const downY = e.clientY;\n\n    if (!targetRef.value) {\n      return;\n    }\n\n    const targetRect = targetRef.value.getBoundingClientRect();\n\n    const { offsetX, offsetY } = transform;\n    const targetLeft = targetRect.left;\n    const targetTop = targetRect.top;\n    const targetWidth = targetRect.width;\n    const targetHeight = targetRect.height;\n    const docElement = document.documentElement;\n    const clientWidth = docElement.clientWidth;\n    const clientHeight = docElement.clientHeight;\n\n    const minLeft = -targetLeft + offsetX;\n    const minTop = -targetTop + offsetY;\n    const maxLeft = clientWidth - targetLeft - targetWidth + offsetX;\n    const maxTop = clientHeight - targetTop - targetHeight + offsetY;\n\n    const onMousemove = (e: MouseEvent) => {\n      let moveX = offsetX + e.clientX - downX;\n      let moveY = offsetY + e.clientY - downY;\n\n      moveX = Math.min(Math.max(moveX, minLeft), maxLeft);\n      moveY = Math.min(Math.max(moveY, minTop), maxTop);\n\n      transform.offsetX = moveX;\n      transform.offsetY = moveY;\n\n      if (targetRef.value) {\n        targetRef.value.style.transform = `translate(${moveX}px, ${moveY}px)`;\n        dragging.value = true;\n      }\n    };\n\n    const onMouseup = () => {\n      dragging.value = false;\n      document.removeEventListener(\"mousemove\", onMousemove);\n      document.removeEventListener(\"mouseup\", onMouseup);\n    };\n\n    document.addEventListener(\"mousemove\", onMousemove);\n    document.addEventListener(\"mouseup\", onMouseup);\n  };\n\n  const onDraggable = () => {\n    const dragDom = unrefElement(dragRef);\n    if (dragDom && targetRef.value) {\n      dragDom.addEventListener(\"mousedown\", onMousedown);\n    }\n  };\n\n  const offDraggable = () => {\n    const dragDom = unrefElement(dragRef);\n    if (dragDom && targetRef.value) {\n      dragDom.removeEventListener(\"mousedown\", onMousedown);\n    }\n  };\n\n  const resetPosition = () => {\n    transform.offsetX = 0;\n    transform.offsetY = 0;\n\n    const target = unrefElement(targetRef);\n    if (target) {\n      target.style.transform = \"none\";\n    }\n  };\n\n  onMounted(() => {\n    watchEffect(() => {\n      if (draggable.value) {\n        onDraggable();\n      } else {\n        offDraggable();\n      }\n    });\n  });\n\n  onBeforeUnmount(() => {\n    offDraggable();\n  });\n\n  return {\n    dragging,\n    resetPosition,\n    transform,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/popup-ui/modal/use-modal.ts",
    "content": "import type { ExtendedModalApi, ModalApiOptions, ModalProps } from \"./modal\";\n\nimport { defineComponent, h, inject, nextTick, provide, reactive, ref } from \"vue\";\n\nimport { useStore } from \"/@/vben/shared/store\";\n\nimport { ModalApi } from \"./modal-api\";\nimport VbenModal from \"./modal.vue\";\n\nconst USER_MODAL_INJECT_KEY = Symbol(\"VBEN_MODAL_INJECT\");\n\nconst DEFAULT_MODAL_PROPS: Partial<ModalProps> = {};\n\nexport function setDefaultModalProps(props: Partial<ModalProps>) {\n  Object.assign(DEFAULT_MODAL_PROPS, props);\n}\n\nexport function useVbenModal<TParentModalProps extends ModalProps = ModalProps>(options: ModalApiOptions = {}) {\n  // Modal一般会抽离出来，所以如果有传入 connectedComponent，则表示为外部调用，与内部组件进行连接\n  // 外部的Modal通过provide/inject传递api\n\n  const { connectedComponent } = options;\n  if (connectedComponent) {\n    const extendedApi = reactive({});\n    const isModalReady = ref(true);\n    const Modal = defineComponent(\n      (props: TParentModalProps, { attrs, slots }) => {\n        provide(USER_MODAL_INJECT_KEY, {\n          extendApi(api: ExtendedModalApi) {\n            // 不能直接给 reactive 赋值，会丢失响应\n            // 不能用 Object.assign,会丢失 api 的原型函数\n            Object.setPrototypeOf(extendedApi, api);\n          },\n          options,\n          async reCreateModal() {\n            isModalReady.value = false;\n            await nextTick();\n            isModalReady.value = true;\n          },\n        });\n        checkProps(extendedApi as ExtendedModalApi, {\n          ...props,\n          ...attrs,\n          ...slots,\n        });\n        return () =>\n          h(\n            isModalReady.value ? connectedComponent : \"div\",\n            {\n              ...props,\n              ...attrs,\n            },\n            slots\n          );\n      },\n      {\n        inheritAttrs: false,\n        name: \"VbenParentModal\",\n      }\n    );\n    return [Modal, extendedApi as ExtendedModalApi] as const;\n  }\n\n  const injectData = inject<any>(USER_MODAL_INJECT_KEY, {});\n\n  const mergedOptions = {\n    ...DEFAULT_MODAL_PROPS,\n    ...injectData.options,\n    ...options,\n  } as ModalApiOptions;\n\n  mergedOptions.onOpenChange = (isOpen: boolean) => {\n    options.onOpenChange?.(isOpen);\n    injectData.options?.onOpenChange?.(isOpen);\n  };\n\n  const onClosed = mergedOptions.onClosed;\n\n  mergedOptions.onClosed = () => {\n    onClosed?.();\n    if (mergedOptions.destroyOnClose) {\n      injectData.reCreateModal?.();\n    }\n  };\n  const api = new ModalApi(mergedOptions);\n\n  const extendedApi: ExtendedModalApi = api as never;\n\n  extendedApi.useStore = selector => {\n    return useStore(api.store, selector);\n  };\n\n  const Modal = defineComponent(\n    (props: ModalProps, { attrs, slots }) => {\n      return () =>\n        h(\n          VbenModal,\n          {\n            ...props,\n            ...attrs,\n            modalApi: extendedApi,\n          },\n          slots\n        );\n    },\n    {\n      inheritAttrs: false,\n      name: \"VbenModal\",\n    }\n  );\n  injectData.extendApi?.(extendedApi);\n  return [Modal, extendedApi] as const;\n}\n\nasync function checkProps(api: ExtendedModalApi, attrs: Record<string, any>) {\n  if (!attrs || Object.keys(attrs).length === 0) {\n    return;\n  }\n  await nextTick();\n\n  const state = api?.store?.state;\n\n  if (!state) {\n    return;\n  }\n\n  const stateKeys = new Set(Object.keys(state));\n\n  for (const attr of Object.keys(attrs)) {\n    if (stateKeys.has(attr) && ![\"class\"].includes(attr)) {\n      // connectedComponent存在时，不要传入Modal的props，会造成复杂度提升，如果你需要修改Modal的props，请使用 useModal 或者api\n      console.warn(`[Vben Modal]: When 'connectedComponent' exists, do not set props or slots '${attr}', which will increase complexity. If you need to modify the props of Modal, please use useVbenModal or api.`);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/preferences/config.ts",
    "content": "import type { Preferences } from \"./types\";\n\nconst defaultPreferences: Preferences = {\n  app: {\n    accessMode: \"frontend\",\n    authPageLayout: \"panel-right\",\n    checkUpdatesInterval: 1,\n    colorGrayMode: false,\n    colorWeakMode: false,\n    compact: false,\n    contentCompact: \"wide\",\n    defaultAvatar: \"./static/images/logo/logo.svg\",\n    dynamicTitle: true,\n    enableCheckUpdates: false,\n    enablePreferences: true,\n    enableRefreshToken: false,\n    isMobile: false,\n    layout: \"mixed-nav\",\n    locale: \"zh-CN\",\n    loginExpiredMode: \"page\",\n    name: \"\",\n    preferencesButtonPosition: \"auto\",\n    watermark: false,\n  },\n  breadcrumb: {\n    enable: true,\n    hideOnlyOne: false,\n    showHome: false,\n    showIcon: true,\n    styleType: \"normal\",\n  },\n  copyright: {\n    companyName: \"greper\",\n    companySiteLink: \"https://github.com/fast-crud/fast-crud\",\n    date: \"2024\",\n    enable: false,\n    icp: \"\",\n    icpLink: \"\",\n    settingShow: false,\n  },\n  footer: {\n    enable: true,\n    fixed: false,\n  },\n  header: {\n    enable: true,\n    hidden: false,\n    menuAlign: \"start\",\n    mode: \"fixed\",\n  },\n  logo: {\n    enable: true,\n    source: \"./static/images/logo/logo.svg\",\n  },\n  navigation: {\n    accordion: true,\n    split: true,\n    styleType: \"rounded\",\n  },\n  shortcutKeys: {\n    enable: true,\n    globalLockScreen: true,\n    globalLogout: true,\n    globalPreferences: true,\n    globalSearch: true,\n  },\n  sidebar: {\n    autoActivateChild: true,\n    collapsed: false,\n    collapsedShowTitle: false,\n    enable: true,\n    expandOnHover: true,\n    extraCollapse: false,\n    hidden: false,\n    width: 224,\n  },\n  tabbar: {\n    draggable: true,\n    enable: true,\n    height: 38,\n    keepAlive: true,\n    maxCount: 0,\n    middleClickToClose: false,\n    persist: true,\n    showIcon: true,\n    showMaximize: true,\n    showMore: true,\n    styleType: \"chrome\",\n    wheelable: true,\n  },\n  theme: {\n    builtinType: \"default\",\n    colorDestructive: \"hsl(348 100% 61%)\",\n    colorPrimary: \"hsl(212 100% 45%)\",\n    colorSuccess: \"hsl(144 57% 58%)\",\n    colorWarning: \"hsl(42 84% 61%)\",\n    mode: \"light\",\n    radius: \"0.5\",\n    semiDarkHeader: false,\n    semiDarkSidebar: false,\n  },\n  transition: {\n    enable: true,\n    loading: false,\n    name: \"fade-slide\",\n    progress: true,\n  },\n  widget: {\n    fullscreen: true,\n    globalSearch: true,\n    languageToggle: true,\n    lockScreen: true,\n    notification: false,\n    refresh: true,\n    sidebarToggle: true,\n    themeToggle: true,\n  },\n};\n\nexport { defaultPreferences };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/preferences/constants.ts",
    "content": "import type { BuiltinThemeType } from \"/@/vben/typings\";\n\ninterface BuiltinThemePreset {\n  color: string;\n  darkPrimaryColor?: string;\n  primaryColor?: string;\n  type: BuiltinThemeType;\n}\n\nconst BUILT_IN_THEME_PRESETS: BuiltinThemePreset[] = [\n  {\n    color: \"hsl(212 100% 45%)\",\n    type: \"default\",\n  },\n  {\n    color: \"hsl(245 82% 67%)\",\n    type: \"violet\",\n  },\n  {\n    color: \"hsl(347 77% 60%)\",\n    type: \"pink\",\n  },\n  {\n    color: \"hsl(42 84% 61%)\",\n    type: \"yellow\",\n  },\n  {\n    color: \"hsl(231 98% 65%)\",\n    type: \"sky-blue\",\n  },\n  {\n    color: \"hsl(161 90% 43%)\",\n    type: \"green\",\n  },\n  {\n    color: \"hsl(240 5% 26%)\",\n    darkPrimaryColor: \"hsl(0 0% 98%)\",\n    primaryColor: \"hsl(240 5.9% 10%)\",\n    type: \"zinc\",\n  },\n\n  {\n    color: \"hsl(181 84% 32%)\",\n    type: \"deep-green\",\n  },\n\n  {\n    color: \"hsl(211 91% 39%)\",\n    type: \"deep-blue\",\n  },\n  {\n    color: \"hsl(18 89% 40%)\",\n    type: \"orange\",\n  },\n  {\n    color: \"hsl(0 75% 42%)\",\n    type: \"rose\",\n  },\n\n  {\n    color: \"hsl(0 0% 25%)\",\n    darkPrimaryColor: \"hsl(0 0% 98%)\",\n    primaryColor: \"hsl(240 5.9% 10%)\",\n    type: \"neutral\",\n  },\n  {\n    color: \"hsl(215 25% 27%)\",\n    darkPrimaryColor: \"hsl(0 0% 98%)\",\n    primaryColor: \"hsl(240 5.9% 10%)\",\n    type: \"slate\",\n  },\n  {\n    color: \"hsl(217 19% 27%)\",\n    darkPrimaryColor: \"hsl(0 0% 98%)\",\n    primaryColor: \"hsl(240 5.9% 10%)\",\n    type: \"gray\",\n  },\n  {\n    color: \"\",\n    type: \"custom\",\n  },\n];\n\nexport const COLOR_PRESETS = [...BUILT_IN_THEME_PRESETS].slice(0, 7);\n\nexport { BUILT_IN_THEME_PRESETS };\n\nexport type { BuiltinThemePreset };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/preferences/index.ts",
    "content": "import type { Preferences } from \"./types\";\n\nimport { preferencesManager } from \"./preferences\";\n\n// 偏好设置（带有层级关系）\nconst preferences: Preferences = preferencesManager.getPreferences.apply(preferencesManager);\n\n// 更新偏好设置\nconst updatePreferences = preferencesManager.updatePreferences.bind(preferencesManager);\n\n// 重置偏好设置\nconst resetPreferences = preferencesManager.resetPreferences.bind(preferencesManager);\n\nconst clearPreferencesCache = preferencesManager.clearCache.bind(preferencesManager);\n\n// 初始化偏好设置\nconst initPreferences = preferencesManager.initPreferences.bind(preferencesManager);\n\nexport { clearPreferencesCache, initPreferences, preferences, preferencesManager, resetPreferences, updatePreferences };\n\nexport * from \"./constants\";\nexport type * from \"./types\";\nexport * from \"./use-preferences\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/preferences/preferences.ts",
    "content": "import type { DeepPartial } from \"/@/vben/typings\";\n\nimport type { InitialOptions, Preferences } from \"./types\";\n\nimport { markRaw, reactive, readonly, watch } from \"vue\";\n\nimport { StorageManager } from \"/@/vben/shared/cache\";\nimport { isMacOs, merge } from \"/@/vben/shared/utils\";\n\nimport { breakpointsTailwind, useBreakpoints, useDebounceFn } from \"@vueuse/core\";\n\nimport { defaultPreferences } from \"./config\";\nimport { updateCSSVariables } from \"./update-css-variables\";\n\nconst STORAGE_KEY = \"preferences\";\nconst STORAGE_KEY_LOCALE = `${STORAGE_KEY}-locale`;\nconst STORAGE_KEY_THEME = `${STORAGE_KEY}-theme`;\n\nclass PreferenceManager {\n  private cache: null | StorageManager = null;\n  // private flattenedState: Flatten<Preferences>;\n  private initialPreferences: Preferences = defaultPreferences;\n  private isInitialized: boolean = false;\n  private savePreferences: (preference: Preferences) => void;\n  private state: Preferences = reactive<Preferences>({\n    ...this.loadPreferences(),\n  });\n  constructor() {\n    this.cache = new StorageManager();\n\n    // 避免频繁的操作缓存\n    this.savePreferences = useDebounceFn((preference: Preferences) => this._savePreferences(preference), 150);\n  }\n\n  clearCache() {\n    [STORAGE_KEY, STORAGE_KEY_LOCALE, STORAGE_KEY_THEME].forEach(key => {\n      this.cache?.removeItem(key);\n    });\n  }\n\n  public getInitialPreferences() {\n    return this.initialPreferences;\n  }\n\n  public getPreferences() {\n    return readonly(this.state);\n  }\n\n  /**\n   * 覆盖偏好设置\n   * overrides  要覆盖的偏好设置\n   * namespace  命名空间\n   */\n  public async initPreferences({ namespace, overrides }: InitialOptions) {\n    // 是否初始化过\n    if (this.isInitialized) {\n      return;\n    }\n    // 初始化存储管理器\n    this.cache = new StorageManager({ prefix: namespace });\n    // 合并初始偏好设置\n    this.initialPreferences = merge({}, overrides, defaultPreferences);\n\n    // 加载并合并当前存储的偏好设置\n    const mergedPreference = merge(\n      {},\n      // overrides,\n      this.loadCachedPreferences() || {},\n      this.initialPreferences\n    );\n\n    // 更新偏好设置\n    this.updatePreferences(mergedPreference);\n\n    this.setupWatcher();\n\n    this.initPlatform();\n    // 标记为已初始化\n    this.isInitialized = true;\n  }\n\n  /**\n   * 重置偏好设置\n   * 偏好设置将被重置为初始值，并从 localStorage 中移除。\n   *\n   * @example\n   * 假设 initialPreferences 为 { theme: 'light', language: 'en' }\n   * 当前 state 为 { theme: 'dark', language: 'fr' }\n   * this.resetPreferences();\n   * 调用后，state 将被重置为 { theme: 'light', language: 'en' }\n   * 并且 localStorage 中的对应项将被移除\n   */\n  resetPreferences() {\n    // 将状态重置为初始偏好设置\n    Object.assign(this.state, this.initialPreferences);\n    // 保存重置后的偏好设置\n    this.savePreferences(this.state);\n    // 从存储中移除偏好设置项\n    [STORAGE_KEY, STORAGE_KEY_THEME, STORAGE_KEY_LOCALE].forEach(key => {\n      this.cache?.removeItem(key);\n    });\n    this.updatePreferences(this.state);\n  }\n\n  /**\n   * 更新偏好设置\n   * @param updates - 要更新的偏好设置\n   */\n  public updatePreferences(updates: DeepPartial<Preferences>) {\n    const mergedState = merge({}, updates, markRaw(this.state));\n\n    Object.assign(this.state, mergedState);\n\n    // 根据更新的键值执行相应的操作\n    this.handleUpdates(updates);\n    this.savePreferences(this.state);\n  }\n\n  /**\n   * 保存偏好设置\n   * @param {Preferences} preference - 需要保存的偏好设置\n   */\n  private _savePreferences(preference: Preferences) {\n    this.cache?.setItem(STORAGE_KEY, preference);\n    this.cache?.setItem(STORAGE_KEY_LOCALE, preference.app.locale);\n    this.cache?.setItem(STORAGE_KEY_THEME, preference.theme.mode);\n  }\n\n  /**\n   * 处理更新的键值\n   * 根据更新的键值执行相应的操作。\n   * @param {DeepPartial<Preferences>} updates - 部分更新的偏好设置\n   */\n  private handleUpdates(updates: DeepPartial<Preferences>) {\n    const themeUpdates = updates.theme || {};\n    const appUpdates = updates.app || {};\n    if (themeUpdates && Object.keys(themeUpdates).length > 0) {\n      updateCSSVariables(this.state);\n    }\n\n    if (Reflect.has(appUpdates, \"colorGrayMode\") || Reflect.has(appUpdates, \"colorWeakMode\")) {\n      this.updateColorMode(this.state);\n    }\n  }\n\n  private initPlatform() {\n    const dom = document.documentElement;\n    dom.dataset.platform = isMacOs() ? \"macOs\" : \"window\";\n  }\n\n  /**\n   *  从缓存中加载偏好设置。如果缓存中没有找到对应的偏好设置，则返回默认偏好设置。\n   */\n  private loadCachedPreferences() {\n    return this.cache?.getItem<Preferences>(STORAGE_KEY);\n  }\n\n  /**\n   * 加载偏好设置\n   * @returns {Preferences} 加载的偏好设置\n   */\n  private loadPreferences(): Preferences {\n    return this.loadCachedPreferences() || { ...defaultPreferences };\n  }\n\n  /**\n   * 监听状态和系统偏好设置的变化。\n   */\n  private setupWatcher() {\n    if (this.isInitialized) {\n      return;\n    }\n\n    // 监听断点，判断是否移动端\n    const breakpoints = useBreakpoints(breakpointsTailwind);\n    const isMobile = breakpoints.smaller(\"md\");\n    watch(\n      () => isMobile.value,\n      val => {\n        this.updatePreferences({\n          app: { isMobile: val },\n        });\n      },\n      { immediate: true }\n    );\n\n    // 监听系统主题偏好设置变化\n    window.matchMedia(\"(prefers-color-scheme: dark)\").addEventListener(\"change\", ({ matches: isDark }) => {\n      this.updatePreferences({\n        theme: { mode: isDark ? \"dark\" : \"light\" },\n      });\n    });\n  }\n\n  /**\n   * 更新页面颜色模式（灰色、色弱）\n   * @param preference\n   */\n  private updateColorMode(preference: Preferences) {\n    if (preference.app) {\n      const { colorGrayMode, colorWeakMode } = preference.app;\n      const dom = document.documentElement;\n      const COLOR_WEAK = \"invert-mode\";\n      const COLOR_GRAY = \"grayscale-mode\";\n      colorWeakMode ? dom.classList.add(COLOR_WEAK) : dom.classList.remove(COLOR_WEAK);\n      colorGrayMode ? dom.classList.add(COLOR_GRAY) : dom.classList.remove(COLOR_GRAY);\n    }\n  }\n}\n\nconst preferencesManager = new PreferenceManager();\nexport { PreferenceManager, preferencesManager };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/preferences/types.ts",
    "content": "import type {\n  AccessModeType,\n  AuthPageLayoutType,\n  BreadcrumbStyleType,\n  BuiltinThemeType,\n  ContentCompactType,\n  DeepPartial,\n  LayoutHeaderMenuAlignType,\n  LayoutHeaderModeType,\n  LayoutType,\n  LoginExpiredModeType,\n  NavigationStyleType,\n  PageTransitionType,\n  PreferencesButtonPositionType,\n  TabsStyleType,\n  ThemeModeType,\n} from \"/@/vben/typings\";\n\ntype SupportedLanguagesType = \"en-US\" | \"zh-CN\";\n\ninterface AppPreferences {\n  /** 权限模式 */\n  accessMode: AccessModeType;\n  /** 登录注册页面布局 */\n  authPageLayout: AuthPageLayoutType;\n  /** 检查更新轮询时间 */\n  checkUpdatesInterval: number;\n  /** 是否开启灰色模式 */\n  colorGrayMode: boolean;\n  /** 是否开启色弱模式 */\n  colorWeakMode: boolean;\n  /** 是否开启紧凑模式 */\n  compact: boolean;\n  /** 是否开启内容紧凑模式 */\n  contentCompact: ContentCompactType;\n  // /** 应用默认头像 */\n  defaultAvatar: string;\n  // /** 开启动态标题 */\n  dynamicTitle: boolean;\n  /** 是否开启检查更新 */\n  enableCheckUpdates: boolean;\n  /** 是否显示偏好设置 */\n  enablePreferences: boolean;\n  /**\n   * @zh_CN 是否开启refreshToken\n   */\n  enableRefreshToken: boolean;\n  /** 是否移动端 */\n  isMobile: boolean;\n  /** 布局方式 */\n  layout: LayoutType;\n  /** 支持的语言 */\n  locale: SupportedLanguagesType;\n  /** 登录过期模式 */\n  loginExpiredMode: LoginExpiredModeType;\n  /** 应用名 */\n  name: string;\n  /** 偏好设置按钮位置 */\n  preferencesButtonPosition: PreferencesButtonPositionType;\n  /**\n   * @zh_CN 是否开启水印\n   */\n  watermark: boolean;\n}\n\ninterface BreadcrumbPreferences {\n  /** 面包屑是否启用 */\n  enable: boolean;\n  /** 面包屑是否只有一个时隐藏 */\n  hideOnlyOne: boolean;\n  /** 面包屑首页图标是否可见 */\n  showHome: boolean;\n  /** 面包屑图标是否可见 */\n  showIcon: boolean;\n  /** 面包屑风格 */\n  styleType: BreadcrumbStyleType;\n}\n\ninterface CopyrightPreferences {\n  /** 版权公司名 */\n  companyName: string;\n  /** 版权公司名链接 */\n  companySiteLink: string;\n  /** 版权日期 */\n  date: string;\n  /** 版权是否可见 */\n  enable: boolean;\n  /** 备案号 */\n  icp: string;\n  /** 备案号链接 */\n  icpLink: string;\n  /** 设置面板是否显示*/\n  settingShow?: boolean;\n}\n\ninterface FooterPreferences {\n  /** 底栏是否可见 */\n  enable: boolean;\n  /** 底栏是否固定 */\n  fixed: boolean;\n}\n\ninterface HeaderPreferences {\n  /** 顶栏是否启用 */\n  enable: boolean;\n  /** 顶栏是否隐藏,css-隐藏 */\n  hidden: boolean;\n  /** 顶栏菜单位置 */\n  menuAlign: LayoutHeaderMenuAlignType;\n  /** header显示模式 */\n  mode: LayoutHeaderModeType;\n}\n\ninterface LogoPreferences {\n  /** logo是否可见 */\n  enable: boolean;\n  /** logo地址 */\n  source: string;\n}\n\ninterface NavigationPreferences {\n  /** 导航菜单手风琴模式 */\n  accordion: boolean;\n  /** 导航菜单是否切割，只在 layout=mixed-nav 生效 */\n  split: boolean;\n  /** 导航菜单风格 */\n  styleType: NavigationStyleType;\n}\n\ninterface SidebarPreferences {\n  /** 点击目录时自动激活子菜单   */\n  autoActivateChild: boolean;\n  /** 侧边栏是否折叠 */\n  collapsed: boolean;\n  /** 侧边栏折叠时，是否显示title */\n  collapsedShowTitle: boolean;\n  /** 侧边栏是否可见 */\n  enable: boolean;\n  /** 菜单自动展开状态 */\n  expandOnHover: boolean;\n  /** 侧边栏扩展区域是否折叠 */\n  extraCollapse: boolean;\n  /** 侧边栏是否隐藏 - css */\n  hidden: boolean;\n  /** 侧边栏宽度 */\n  width: number;\n}\n\ninterface ShortcutKeyPreferences {\n  /** 是否启用快捷键-全局 */\n  enable: boolean;\n  /** 是否启用全局锁屏快捷键 */\n  globalLockScreen: boolean;\n  /** 是否启用全局注销快捷键 */\n  globalLogout: boolean;\n  /** 是否启用全局偏好设置快捷键 */\n  globalPreferences: boolean;\n  /** 是否启用全局搜索快捷键 */\n  globalSearch: boolean;\n}\n\ninterface TabbarPreferences {\n  /** 是否开启多标签页拖拽 */\n  draggable: boolean;\n  /** 是否开启多标签页 */\n  enable: boolean;\n  /** 标签页高度 */\n  height: number;\n  /** 开启标签页缓存功能 */\n  keepAlive: boolean;\n  /** 限制最大数量 */\n  maxCount: number;\n  /** 是否点击中键时关闭标签 */\n  middleClickToClose: boolean;\n  /** 是否持久化标签 */\n  persist: boolean;\n  /** 是否开启多标签页图标 */\n  showIcon: boolean;\n  /** 显示最大化按钮 */\n  showMaximize: boolean;\n  /** 显示更多按钮 */\n  showMore: boolean;\n  /** 标签页风格 */\n  styleType: TabsStyleType;\n  /** 是否开启鼠标滚轮响应 */\n  wheelable: boolean;\n}\n\ninterface ThemePreferences {\n  /** 内置主题名 */\n  builtinType: BuiltinThemeType;\n  /** 错误色 */\n  colorDestructive: string;\n  /** 主题色 */\n  colorPrimary: string;\n  /** 成功色 */\n  colorSuccess: string;\n  /** 警告色 */\n  colorWarning: string;\n  /** 当前主题 */\n  mode: ThemeModeType;\n  /** 圆角 */\n  radius: string;\n  /** 是否开启半深色header（只在theme='light'时生效） */\n  semiDarkHeader: boolean;\n  /** 是否开启半深色菜单（只在theme='light'时生效） */\n  semiDarkSidebar: boolean;\n}\n\ninterface TransitionPreferences {\n  /** 页面切换动画是否启用 */\n  enable: boolean;\n  // /** 是否开启页面加载loading */\n  loading: boolean;\n  /** 页面切换动画 */\n  name: PageTransitionType | string;\n  /** 是否开启页面加载进度动画 */\n  progress: boolean;\n}\n\ninterface WidgetPreferences {\n  /** 是否启用全屏部件 */\n  fullscreen: boolean;\n  /** 是否启用全局搜索部件 */\n  globalSearch: boolean;\n  /** 是否启用语言切换部件 */\n  languageToggle: boolean;\n  /** 是否开启锁屏功能 */\n  lockScreen: boolean;\n  /** 是否显示通知部件 */\n  notification: boolean;\n  /** 显示刷新按钮 */\n  refresh: boolean;\n  /** 是否显示侧边栏显示/隐藏部件 */\n  sidebarToggle: boolean;\n  /** 是否显示主题切换部件 */\n  themeToggle: boolean;\n}\n\ninterface Preferences {\n  /** 全局配置 */\n  app: AppPreferences;\n  /** 顶栏配置 */\n  breadcrumb: BreadcrumbPreferences;\n  /** 版权配置 */\n  copyright: CopyrightPreferences;\n  /** 底栏配置 */\n  footer: FooterPreferences;\n  /** 面包屑配置 */\n  header: HeaderPreferences;\n  /** logo配置 */\n  logo: LogoPreferences;\n  /** 导航配置 */\n  navigation: NavigationPreferences;\n  /** 快捷键配置 */\n  shortcutKeys: ShortcutKeyPreferences;\n  /** 侧边栏配置 */\n  sidebar: SidebarPreferences;\n  /** 标签页配置 */\n  tabbar: TabbarPreferences;\n  /** 主题配置 */\n  theme: ThemePreferences;\n  /** 动画配置 */\n  transition: TransitionPreferences;\n  /** 功能配置 */\n  widget: WidgetPreferences;\n}\n\ntype PreferencesKeys = keyof Preferences;\n\ninterface InitialOptions {\n  namespace: string;\n  overrides?: DeepPartial<Preferences>;\n}\nexport type {\n  AppPreferences,\n  BreadcrumbPreferences,\n  FooterPreferences,\n  HeaderPreferences,\n  InitialOptions,\n  LogoPreferences,\n  NavigationPreferences,\n  Preferences,\n  PreferencesKeys,\n  ShortcutKeyPreferences,\n  SidebarPreferences,\n  SupportedLanguagesType,\n  TabbarPreferences,\n  ThemePreferences,\n  TransitionPreferences,\n  WidgetPreferences,\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/preferences/update-css-variables.ts",
    "content": "import type { Preferences } from \"./types\";\n\nimport { generatorColorVariables } from \"/@/vben/shared/color\";\nimport { updateCSSVariables as executeUpdateCSSVariables } from \"/@/vben/shared/utils\";\n\nimport { BUILT_IN_THEME_PRESETS } from \"./constants\";\n\n/**\n * 更新主题的 CSS 变量以及其他 CSS 变量\n * @param preferences - 当前偏好设置对象，它的主题值将被用来设置文档的主题。\n */\nfunction updateCSSVariables(preferences: Preferences) {\n  // 当修改到颜色变量时，更新 css 变量\n  const root = document.documentElement;\n  if (!root) {\n    return;\n  }\n\n  const theme = preferences?.theme ?? {};\n\n  const { builtinType, mode, radius } = theme;\n\n  // html 设置 dark 类\n  if (Reflect.has(theme, \"mode\")) {\n    const dark = isDarkTheme(mode);\n    root.classList.toggle(\"dark\", dark);\n  }\n\n  // html 设置 data-theme=[builtinType]\n  if (Reflect.has(theme, \"builtinType\")) {\n    const rootTheme = root.dataset.theme;\n    if (rootTheme !== builtinType) {\n      root.dataset.theme = builtinType;\n    }\n  }\n\n  // 获取当前的内置主题\n  const currentBuiltType = [...BUILT_IN_THEME_PRESETS].find(item => item.type === builtinType);\n\n  let builtinTypeColorPrimary: string | undefined = \"\";\n\n  if (currentBuiltType) {\n    const isDark = isDarkTheme(preferences.theme.mode);\n    // 设置不同主题的主要颜色\n    const color = isDark ? currentBuiltType.darkPrimaryColor || currentBuiltType.primaryColor : currentBuiltType.primaryColor;\n    builtinTypeColorPrimary = color || currentBuiltType.color;\n  }\n\n  // 如果内置主题颜色和自定义颜色都不存在，则不更新主题颜色\n  if (builtinTypeColorPrimary || Reflect.has(theme, \"colorPrimary\") || Reflect.has(theme, \"colorDestructive\") || Reflect.has(theme, \"colorSuccess\") || Reflect.has(theme, \"colorWarning\")) {\n    // preferences.theme.colorPrimary = builtinTypeColorPrimary || colorPrimary;\n    updateMainColorVariables(preferences);\n  }\n\n  // 更新圆角\n  if (Reflect.has(theme, \"radius\")) {\n    document.documentElement.style.setProperty(\"--radius\", `${radius}rem`);\n  }\n}\n\n/**\n * 更新主要的 CSS 变量\n * @param  preference - 当前偏好设置对象，它的颜色值将被转换成 HSL 格式并设置为 CSS 变量。\n */\nfunction updateMainColorVariables(preference: Preferences) {\n  if (!preference.theme) {\n    return;\n  }\n  const { colorDestructive, colorPrimary, colorSuccess, colorWarning } = preference.theme;\n\n  const colorVariables = generatorColorVariables([\n    { color: colorPrimary, name: \"primary\" },\n    { alias: \"warning\", color: colorWarning, name: \"yellow\" },\n    { alias: \"success\", color: colorSuccess, name: \"green\" },\n    { alias: \"destructive\", color: colorDestructive, name: \"red\" },\n  ]);\n\n  // 要设置的 CSS 变量映射\n  const colorMappings = {\n    \"--green-500\": \"--success\",\n    \"--primary-500\": \"--primary\",\n    \"--red-500\": \"--destructive\",\n    \"--yellow-500\": \"--warning\",\n  };\n\n  // 统一处理颜色变量的更新\n  Object.entries(colorMappings).forEach(([sourceVar, targetVar]) => {\n    const colorValue = colorVariables[sourceVar];\n    if (colorValue) {\n      document.documentElement.style.setProperty(targetVar, colorValue);\n    }\n  });\n\n  executeUpdateCSSVariables(colorVariables);\n}\n\nfunction isDarkTheme(theme: string) {\n  let dark = theme === \"dark\";\n  if (theme === \"auto\") {\n    dark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n  }\n  return dark;\n}\n\nexport { isDarkTheme, updateCSSVariables };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/preferences/use-preferences.ts",
    "content": "import { computed } from \"vue\";\n\nimport { diff } from \"/@/vben/shared/utils\";\n\nimport { preferencesManager } from \"./preferences\";\nimport { isDarkTheme } from \"./update-css-variables\";\n\nfunction usePreferences() {\n  const preferences = preferencesManager.getPreferences();\n  const initialPreferences = preferencesManager.getInitialPreferences();\n  /**\n   * @zh_CN 计算偏好设置的变化\n   */\n  const diffPreference = computed(() => {\n    return diff(initialPreferences, preferences);\n  });\n\n  const appPreferences = computed(() => preferences.app);\n\n  const shortcutKeysPreferences = computed(() => preferences.shortcutKeys);\n\n  /**\n   * @zh_CN 判断是否为暗黑模式\n   * @param  preferences - 当前偏好设置对象，它的主题值将被用来判断是否为暗黑模式。\n   * @returns 如果主题为暗黑模式，返回 true，否则返回 false。\n   */\n  const isDark = computed(() => {\n    return isDarkTheme(preferences.theme.mode);\n  });\n\n  const locale = computed(() => {\n    return preferences.app.locale;\n  });\n\n  const isMobile = computed(() => {\n    return appPreferences.value.isMobile;\n  });\n\n  const theme = computed(() => {\n    return isDark.value ? \"dark\" : \"light\";\n  });\n\n  /**\n   * @zh_CN 布局方式\n   */\n  const layout = computed(() => (isMobile.value ? \"sidebar-nav\" : appPreferences.value.layout));\n\n  /**\n   * @zh_CN 是否显示顶栏\n   */\n  const isShowHeaderNav = computed(() => {\n    return preferences.header.enable;\n  });\n\n  /**\n   * @zh_CN 是否全屏显示content，不需要侧边、底部、顶部、tab区域\n   */\n  const isFullContent = computed(() => appPreferences.value.layout === \"full-content\");\n\n  /**\n   * @zh_CN 是否侧边导航模式\n   */\n  const isSideNav = computed(() => appPreferences.value.layout === \"sidebar-nav\");\n\n  /**\n   * @zh_CN 是否侧边混合模式\n   */\n  const isSideMixedNav = computed(() => appPreferences.value.layout === \"sidebar-mixed-nav\");\n\n  /**\n   * @zh_CN 是否为头部导航模式\n   */\n  const isHeaderNav = computed(() => appPreferences.value.layout === \"header-nav\");\n\n  /**\n   * @zh_CN 是否为头部混合导航模式\n   */\n  const isHeaderMixedNav = computed(() => appPreferences.value.layout === \"header-mixed-nav\");\n\n  /**\n   * @zh_CN 是否为顶部通栏+侧边导航模式\n   */\n  const isHeaderSidebarNav = computed(() => appPreferences.value.layout === \"header-sidebar-nav\");\n\n  /**\n   * @zh_CN 是否为混合导航模式\n   */\n  const isMixedNav = computed(() => appPreferences.value.layout === \"mixed-nav\");\n\n  /**\n   * @zh_CN 是否包含侧边导航模式\n   */\n  const isSideMode = computed(() => {\n    return isMixedNav.value || isSideMixedNav.value || isSideNav.value || isHeaderMixedNav.value || isHeaderSidebarNav.value;\n  });\n\n  const sidebarCollapsed = computed(() => {\n    return preferences.sidebar.collapsed;\n  });\n\n  /**\n   * @zh_CN 是否开启keep-alive\n   * 在tabs可见以及开启keep-alive的情况下才开启\n   */\n  const keepAlive = computed(() => preferences.tabbar.enable && preferences.tabbar.keepAlive);\n\n  /**\n   * @zh_CN 登录注册页面布局是否为左侧\n   */\n  const authPanelLeft = computed(() => {\n    return appPreferences.value.authPageLayout === \"panel-left\";\n  });\n\n  /**\n   * @zh_CN 登录注册页面布局是否为左侧\n   */\n  const authPanelRight = computed(() => {\n    return appPreferences.value.authPageLayout === \"panel-right\";\n  });\n\n  /**\n   * @zh_CN 登录注册页面布局是否为中间\n   */\n  const authPanelCenter = computed(() => {\n    return appPreferences.value.authPageLayout === \"panel-center\";\n  });\n\n  /**\n   * @zh_CN 内容是否已经最大化\n   * 排除 full-content模式\n   */\n  const contentIsMaximize = computed(() => {\n    const headerIsHidden = preferences.header.hidden;\n    const sidebarIsHidden = preferences.sidebar.hidden;\n    return headerIsHidden && sidebarIsHidden && !isFullContent.value;\n  });\n\n  /**\n   * @zh_CN 是否启用全局搜索快捷键\n   */\n  const globalSearchShortcutKey = computed(() => {\n    const { enable, globalSearch } = shortcutKeysPreferences.value;\n    return enable && globalSearch;\n  });\n\n  /**\n   * @zh_CN 是否启用全局注销快捷键\n   */\n  const globalLogoutShortcutKey = computed(() => {\n    const { enable, globalLogout } = shortcutKeysPreferences.value;\n    return enable && globalLogout;\n  });\n\n  const globalLockScreenShortcutKey = computed(() => {\n    const { enable, globalLockScreen } = shortcutKeysPreferences.value;\n    return enable && globalLockScreen;\n  });\n\n  /**\n   * @zh_CN 偏好设置按钮位置\n   */\n  const preferencesButtonPosition = computed(() => {\n    const { enablePreferences, preferencesButtonPosition } = preferences.app;\n\n    // 如果没有启用偏好设置按钮\n    if (!enablePreferences) {\n      return {\n        fixed: false,\n        header: false,\n      };\n    }\n\n    const { header, sidebar } = preferences;\n    const headerHidden = header.hidden;\n    const sidebarHidden = sidebar.hidden;\n\n    const contentIsMaximize = headerHidden && sidebarHidden;\n\n    const isHeaderPosition = preferencesButtonPosition === \"header\";\n\n    // 如果设置了固定位置\n    if (preferencesButtonPosition !== \"auto\") {\n      return {\n        fixed: preferencesButtonPosition === \"fixed\",\n        header: isHeaderPosition,\n      };\n    }\n\n    // 如果是全屏模式或者没有固定在顶部，\n    const fixed = contentIsMaximize || isFullContent.value || isMobile.value || !isShowHeaderNav.value;\n\n    return {\n      fixed,\n      header: !fixed,\n    };\n  });\n\n  return {\n    authPanelCenter,\n    authPanelLeft,\n    authPanelRight,\n    contentIsMaximize,\n    diffPreference,\n    globalLockScreenShortcutKey,\n    globalLogoutShortcutKey,\n    globalSearchShortcutKey,\n    isDark,\n    isFullContent,\n    isHeaderMixedNav,\n    isHeaderNav,\n    isHeaderSidebarNav,\n    isMixedNav,\n    isMobile,\n    isSideMixedNav,\n    isSideMode,\n    isSideNav,\n    keepAlive,\n    layout,\n    locale,\n    preferencesButtonPosition,\n    sidebarCollapsed,\n    theme,\n  };\n}\n\nexport { usePreferences };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/avatar/avatar.vue",
    "content": "<script setup lang=\"ts\">\nimport type { AvatarFallbackProps, AvatarImageProps, AvatarRootProps } from \"radix-vue\";\n\nimport type { ClassType } from \"/@/vben/typings\";\n\nimport { computed } from \"vue\";\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../ui\";\n\ninterface Props extends AvatarFallbackProps, AvatarImageProps, AvatarRootProps {\n  alt?: string;\n  class?: ClassType;\n  dot?: boolean;\n  dotClass?: ClassType;\n}\n\ndefineOptions({\n  inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  alt: \"avatar\",\n  as: \"button\",\n  dot: false,\n  dotClass: \"bg-green-500\",\n});\n\nconst text = computed(() => {\n  return props.alt.slice(-2).toUpperCase();\n});\n</script>\n\n<template>\n  <div :class=\"props.class\" class=\"relative flex flex-shrink-0 items-center\">\n    <Avatar :class=\"props.class\" class=\"size-full\">\n      <AvatarImage :alt=\"alt\" :src=\"src\" />\n      <AvatarFallback>{{ text }}</AvatarFallback>\n    </Avatar>\n    <span v-if=\"dot\" :class=\"dotClass\" class=\"border-background absolute bottom-0 right-0 size-3 rounded-full border-2\"> </span>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/avatar/index.ts",
    "content": "export { default as VbenAvatar } from \"./avatar.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/back-top/back-top.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { BacktopProps } from \"./backtop\";\n\nimport { computed } from \"vue\";\n\nimport { ArrowUpToLine } from \"/@/vben/icons\";\n\nimport { VbenButton } from \"../button\";\nimport { useBackTop } from \"./use-backtop\";\n\ninterface Props extends BacktopProps {}\n\ndefineOptions({ name: \"BackTop\" });\n\nconst props = withDefaults(defineProps<Props>(), {\n  bottom: 20,\n  isGroup: false,\n  right: 24,\n  target: \"\",\n  visibilityHeight: 200,\n});\n\nconst backTopStyle = computed(() => ({\n  bottom: `${props.bottom}px`,\n  right: `${props.right}px`,\n}));\n\nconst { handleClick, visible } = useBackTop(props);\n</script>\n<template>\n  <transition name=\"fade-down\">\n    <VbenButton\n      v-if=\"visible\"\n      :style=\"backTopStyle\"\n      class=\"dark:bg-accent dark:hover:bg-heavy bg-background hover:bg-heavy data shadow-float z-popup fixed bottom-10 size-10 rounded-full duration-500\"\n      size=\"icon\"\n      variant=\"icon\"\n      @click=\"handleClick\"\n    >\n      <ArrowUpToLine class=\"size-4\" />\n    </VbenButton>\n  </transition>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/back-top/backtop.ts",
    "content": "export const backtopProps = {\n  /**\n   * @zh_CN bottom distance.\n   */\n  bottom: {\n    default: 40,\n    type: Number,\n  },\n  /**\n   * @zh_CN right distance.\n   */\n  right: {\n    default: 40,\n    type: Number,\n  },\n  /**\n   * @zh_CN the target to trigger scroll.\n   */\n  target: {\n    default: \"\",\n    type: String,\n  },\n  /**\n   * @zh_CN the button will not show until the scroll height reaches this value.\n   */\n  visibilityHeight: {\n    default: 200,\n    type: Number,\n  },\n} as const;\n\nexport interface BacktopProps {\n  bottom?: number;\n  isGroup?: boolean;\n  right?: number;\n  target?: string;\n  visibilityHeight?: number;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/back-top/index.ts",
    "content": "export { default as VbenBackTop } from \"./back-top.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/back-top/use-backtop.ts",
    "content": "import type { BacktopProps } from \"./backtop\";\n\nimport { onMounted, ref, shallowRef } from \"vue\";\n\nimport { useEventListener, useThrottleFn } from \"@vueuse/core\";\n\nexport const useBackTop = (props: BacktopProps) => {\n  const el = shallowRef<HTMLElement>();\n  const container = shallowRef<Document | HTMLElement>();\n  const visible = ref(false);\n\n  const handleScroll = () => {\n    if (el.value) {\n      visible.value = el.value.scrollTop >= (props?.visibilityHeight ?? 0);\n    }\n  };\n\n  const handleClick = () => {\n    el.value?.scrollTo({ behavior: \"smooth\", top: 0 });\n  };\n\n  const handleScrollThrottled = useThrottleFn(handleScroll, 300, true);\n\n  useEventListener(container, \"scroll\", handleScrollThrottled);\n  onMounted(() => {\n    container.value = document;\n    el.value = document.documentElement;\n\n    if (props.target) {\n      el.value = document.querySelector<HTMLElement>(props.target) ?? undefined;\n\n      if (!el.value) {\n        throw new Error(`target does not exist: ${props.target}`);\n      }\n      container.value = el.value;\n    }\n    // Give visible an initial value, fix #13066\n    handleScroll();\n  });\n\n  return {\n    handleClick,\n    visible,\n  };\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/breadcrumb/breadcrumb-background.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { BreadcrumbProps } from \"./types\";\n\nimport { VbenIcon } from \"../icon\";\n\ninterface Props extends BreadcrumbProps {}\n\ndefineOptions({ name: \"Breadcrumb\" });\nconst { breadcrumbs, showIcon } = defineProps<Props>();\n\nconst emit = defineEmits<{ select: [string] }>();\n\nfunction handleClick(index: number, path?: string) {\n  if (!path || index === breadcrumbs.length - 1) {\n    return;\n  }\n  emit(\"select\", path);\n}\n</script>\n<template>\n  <ul class=\"flex\">\n    <TransitionGroup name=\"breadcrumb-transition\">\n      <template v-for=\"(item, index) in breadcrumbs\" :key=\"`${item.path}-${item.title}-${index}`\">\n        <li>\n          <a href=\"javascript:void 0\" @click.stop=\"handleClick(index, item.path)\">\n            <span class=\"flex-center z-10 h-full\">\n              <VbenIcon v-if=\"showIcon\" :icon=\"item.icon\" class=\"mr-1 size-4 flex-shrink-0\" />\n              <span\n                :class=\"{\n                  'text-foreground font-normal': index === breadcrumbs.length - 1,\n                }\"\n                >{{ item.title }}\n              </span>\n            </span>\n          </a>\n        </li>\n      </template>\n    </TransitionGroup>\n  </ul>\n</template>\n<style scoped>\nli {\n  @apply h-7;\n}\n\nli a {\n  @apply text-muted-foreground bg-accent relative mr-9 flex h-7 items-center py-0 pl-[5px] pr-2 text-[13px];\n}\n\nli a > span {\n  @apply -ml-3;\n}\n\nli:first-child a > span {\n  @apply -ml-1;\n}\n\nli:first-child a {\n  @apply rounded-[4px_0_0_4px] pl-[15px];\n}\n\nli:first-child a::before {\n  @apply border-none;\n}\n\nli:last-child a {\n  @apply rounded-[0_4px_4px_0] pr-[15px];\n}\n\nli:last-child a::after {\n  @apply border-none;\n}\n\nli a::before,\nli a::after {\n  @apply border-accent absolute top-0 h-0 w-0 border-[.875rem] border-solid content-[''];\n}\n\nli a::before {\n  @apply -left-7 z-10 border-l-transparent;\n}\n\nli a::after {\n  @apply border-l-accent left-full border-transparent;\n}\n\nli:not(:last-child) a:hover {\n  @apply bg-accent-hover;\n}\n\nli:not(:last-child) a:hover::before {\n  @apply border-accent-hover border-l-transparent;\n}\n\nli:not(:last-child) a:hover::after {\n  @apply border-l-accent-hover;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/breadcrumb/breadcrumb-view.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { BreadcrumbProps } from \"./types\";\n\nimport { useForwardPropsEmits } from \"radix-vue\";\n\nimport BreadcrumbBackground from \"./breadcrumb-background.vue\";\nimport Breadcrumb from \"./breadcrumb.vue\";\n\ninterface Props extends BreadcrumbProps {\n  class?: any;\n}\n\nconst props = withDefaults(defineProps<Props>(), {});\n\nconst emit = defineEmits<{ select: [string] }>();\n\nconst forward = useForwardPropsEmits(props, emit);\n</script>\n<template>\n  <Breadcrumb v-if=\"styleType === 'normal'\" v-bind=\"forward\" class=\"vben-breadcrumb\" />\n  <BreadcrumbBackground v-if=\"styleType === 'background'\" v-bind=\"forward\" class=\"vben-breadcrumb\" />\n</template>\n<style lang=\"less\" scoped>\n/** 修复全局引入Antd时，ol和ul的默认样式会被修改的问题 */\n.vben-breadcrumb {\n  :deep(ol),\n  :deep(ul) {\n    margin-bottom: 0;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/breadcrumb/breadcrumb.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { BreadcrumbProps } from \"./types\";\n\nimport { ChevronDown } from \"/@/vben/icons\";\n\nimport { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from \"../../ui\";\nimport { VbenIcon } from \"../icon\";\n\ninterface Props extends BreadcrumbProps {}\n\ndefineOptions({ name: \"Breadcrumb\" });\nwithDefaults(defineProps<Props>(), {\n  showIcon: false,\n});\n\nconst emit = defineEmits<{ select: [string] }>();\n\nfunction handleClick(path?: string) {\n  if (!path) {\n    return;\n  }\n  emit(\"select\", path);\n}\n</script>\n<template>\n  <Breadcrumb>\n    <BreadcrumbList>\n      <TransitionGroup name=\"breadcrumb-transition\">\n        <template v-for=\"(item, index) in breadcrumbs\" :key=\"`${item.path}-${item.title}-${index}`\">\n          <BreadcrumbItem>\n            <div v-if=\"item.items?.length ?? 0 > 0\">\n              <DropdownMenu>\n                <DropdownMenuTrigger class=\"flex items-center gap-1\">\n                  <VbenIcon v-if=\"showIcon\" :icon=\"item.icon\" class=\"size-5\" />\n                  {{ item.title }}\n                  <ChevronDown class=\"size-4\" />\n                </DropdownMenuTrigger>\n                <DropdownMenuContent align=\"start\">\n                  <template v-for=\"menuItem in item.items\" :key=\"`sub-${menuItem.path}`\">\n                    <DropdownMenuItem @click.stop=\"handleClick(menuItem.path)\">\n                      {{ menuItem.title }}\n                    </DropdownMenuItem>\n                  </template>\n                </DropdownMenuContent>\n              </DropdownMenu>\n            </div>\n            <BreadcrumbLink v-else-if=\"index !== breadcrumbs.length - 1\" href=\"javascript:void 0\" @click.stop=\"handleClick(item.path)\">\n              <div class=\"flex-center\">\n                <VbenIcon v-if=\"showIcon\" :class=\"{ 'size-5': item.isHome }\" :icon=\"item.icon\" class=\"mr-1 size-4\" />\n                {{ item.title }}\n              </div>\n            </BreadcrumbLink>\n            <BreadcrumbPage v-else>\n              <div class=\"flex-center\">\n                <VbenIcon v-if=\"showIcon\" :class=\"{ 'size-5': item.isHome }\" :icon=\"item.icon\" class=\"mr-1 size-4\" />\n                {{ item.title }}\n              </div>\n            </BreadcrumbPage>\n            <BreadcrumbSeparator v-if=\"index < breadcrumbs.length - 1 && !item.isHome\" />\n          </BreadcrumbItem>\n        </template>\n      </TransitionGroup>\n    </BreadcrumbList>\n  </Breadcrumb>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/breadcrumb/index.ts",
    "content": "export { default as VbenBreadcrumbView } from \"./breadcrumb-view.vue\";\n\nexport type * from \"./types\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/breadcrumb/types.ts",
    "content": "import type { Component } from \"vue\";\n\nimport type { BreadcrumbStyleType } from \"/@/vben/typings\";\n\nexport interface IBreadcrumb {\n  icon?: Component | string;\n  isHome?: boolean;\n  items?: IBreadcrumb[];\n  path?: string;\n  title?: string;\n}\n\nexport interface BreadcrumbProps {\n  breadcrumbs: IBreadcrumb[];\n  showIcon?: boolean;\n  styleType?: BreadcrumbStyleType;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/button/button-group.vue",
    "content": "<script lang=\"ts\" setup>\nimport { cn } from \"/@/vben/shared/utils\";\n\ndefineOptions({ name: \"VbenButtonGroup\" });\n\nwithDefaults(\n  defineProps<{\n    border?: boolean;\n    gap?: number;\n    size?: \"large\" | \"middle\" | \"small\";\n  }>(),\n  { border: false, gap: 0, size: \"middle\" }\n);\n</script>\n<template>\n  <div :class=\"cn('vben-button-group rounded-md', `size-${size}`, gap ? 'with-gap' : 'no-gap', $attrs.class as string)\" :style=\"{ gap: gap ? `${gap}px` : '0px' }\">\n    <slot></slot>\n  </div>\n</template>\n\n<style lang=\"less\" scoped>\n.vben-button-group {\n  display: inline-flex;\n\n  &.size-large :deep(button) {\n    height: 2.25rem;\n    padding: 0.5rem 0.75rem;\n    font-size: 0.875rem;\n    line-height: 1.25rem;\n\n    .icon-wrapper {\n      margin-right: 0.4rem;\n\n      svg {\n        width: 1rem;\n        height: 1rem;\n      }\n    }\n  }\n\n  &.size-middle :deep(button) {\n    height: 2rem;\n    padding: 0.25rem 0.5rem;\n    font-size: 0.75rem;\n    line-height: 1rem;\n\n    .icon-wrapper {\n      margin-right: 0.2rem;\n\n      svg {\n        width: 0.75rem;\n        height: 0.75rem;\n      }\n    }\n  }\n\n  &.size-small :deep(button) {\n    height: 1.75rem;\n    padding: 0.2rem 0.4rem;\n    font-size: 0.65rem;\n    line-height: 0.75rem;\n\n    .icon-wrapper {\n      margin-right: 0.1rem;\n\n      svg {\n        width: 0.65rem;\n        height: 0.65rem;\n      }\n    }\n  }\n\n  &.no-gap > :deep(button):nth-of-type(1) {\n    border-radius: calc(var(--radius) - 2px) 0 0 calc(var(--radius) - 2px);\n  }\n\n  &.no-gap > :deep(button):last-of-type {\n    border-radius: 0 calc(var(--radius) - 2px) calc(var(--radius) - 2px) 0;\n  }\n\n  &.no-gap {\n    :deep(button + button) {\n      border-left-width: 0;\n      border-radius: 0;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/button/button.ts",
    "content": "import type { AsTag } from \"radix-vue\";\n\nimport type { Component } from \"vue\";\n\nimport type { ButtonVariants, ButtonVariantSize } from \"../../ui\";\n\nexport interface VbenButtonProps {\n  /**\n   * The element or component this component should render as. Can be overwrite by `asChild`\n   * @defaultValue \"div\"\n   */\n  as?: AsTag | Component;\n  /**\n   * Change the default rendered element for the one passed as a child, merging their props and behavior.\n   *\n   * Read our [Composition](https://www.radix-vue.com/guides/composition.html) guide for more details.\n   */\n  asChild?: boolean;\n  class?: any;\n  disabled?: boolean;\n  loading?: boolean;\n  size?: ButtonVariantSize;\n  variant?: ButtonVariants;\n}\n\nexport type CustomRenderType = (() => Component | string) | string;\n\nexport type ValueType = boolean | number | string;\n\nexport interface VbenButtonGroupProps extends Pick<VbenButtonProps, \"disabled\"> {\n  beforeChange?: (value: ValueType, isChecked: boolean) => boolean | PromiseLike<boolean | undefined> | undefined;\n  btnClass?: any;\n  gap?: number;\n  multiple?: boolean;\n  options?: { label: CustomRenderType; value: ValueType }[];\n  showIcon?: boolean;\n  size?: \"large\" | \"middle\" | \"small\";\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/button/button.vue",
    "content": "<script setup lang=\"ts\">\nimport type { VbenButtonProps } from \"./button\";\n\nimport { computed } from \"vue\";\n\nimport { LoaderCircle } from \"/@/vben/icons\";\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Primitive } from \"radix-vue\";\n\nimport { buttonVariants } from \"../../ui\";\n\ninterface Props extends VbenButtonProps {}\n\nconst props = withDefaults(defineProps<Props>(), {\n  as: \"button\",\n  class: \"\",\n  disabled: false,\n  loading: false,\n  size: \"default\",\n  variant: \"default\",\n});\n\nconst isDisabled = computed(() => {\n  return props.disabled || props.loading;\n});\n</script>\n\n<template>\n  <Primitive :as=\"as\" :as-child=\"asChild\" :class=\"cn(buttonVariants({ variant, size }), props.class)\" :disabled=\"isDisabled\">\n    <LoaderCircle v-if=\"loading\" class=\"text-md mr-2 size-4 flex-shrink-0 animate-spin\" />\n    <slot></slot>\n  </Primitive>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/button/check-button-group.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { Arrayable } from \"@vueuse/core\";\n\nimport type { ValueType, VbenButtonGroupProps } from \"./button\";\n\nimport { computed, ref, watch } from \"vue\";\n\nimport { Circle, CircleCheckBig, LoaderCircle } from \"/@/vben/icons\";\nimport { VbenRenderContent } from \"/@/vben/shadcn-ui\";\nimport { cn, isFunction } from \"/@/vben/shared/utils\";\n\nimport { objectOmit } from \"@vueuse/core\";\n\nimport VbenButtonGroup from \"./button-group.vue\";\nimport Button from \"./button.vue\";\n\nconst props = withDefaults(defineProps<VbenButtonGroupProps>(), {\n  gap: 0,\n  multiple: false,\n  showIcon: true,\n  size: \"middle\",\n});\n\nconst btnDefaultProps = computed(() => {\n  return {\n    ...objectOmit(props, [\"options\", \"btnClass\", \"size\", \"disabled\"]),\n    class: cn(props.btnClass),\n  };\n});\nconst modelValue = defineModel<Arrayable<ValueType> | undefined>();\n\nconst innerValue = ref<Array<ValueType>>([]);\nconst loadingValues = ref<Array<ValueType>>([]);\nwatch(\n  () => props.multiple,\n  val => {\n    if (val) {\n      modelValue.value = innerValue.value;\n    } else {\n      modelValue.value = innerValue.value.length > 0 ? innerValue.value[0] : undefined;\n    }\n  },\n  { immediate: true }\n);\n\nwatch(\n  () => modelValue.value,\n  val => {\n    if (Array.isArray(val)) {\n      const arrVal = val.filter(v => v !== undefined);\n      if (arrVal.length > 0) {\n        innerValue.value = props.multiple ? [...arrVal] : [arrVal[0] as ValueType];\n      } else {\n        innerValue.value = [];\n      }\n    } else {\n      innerValue.value = val === undefined ? [] : [val as ValueType];\n    }\n  },\n  { deep: true }\n);\n\nasync function onBtnClick(value: ValueType) {\n  if (props.beforeChange && isFunction(props.beforeChange)) {\n    try {\n      loadingValues.value.push(value);\n      const canChange = await props.beforeChange(value, !innerValue.value.includes(value));\n      if (canChange === false) {\n        return;\n      }\n    } finally {\n      loadingValues.value.splice(loadingValues.value.indexOf(value), 1);\n    }\n  }\n\n  if (props.multiple) {\n    if (innerValue.value.includes(value)) {\n      innerValue.value = innerValue.value.filter(item => item !== value);\n    } else {\n      innerValue.value.push(value);\n    }\n    modelValue.value = innerValue.value;\n  } else {\n    innerValue.value = [value];\n    modelValue.value = value;\n  }\n}\n</script>\n<template>\n  <VbenButtonGroup :size=\"props.size\" :gap=\"props.gap\" class=\"vben-check-button-group\">\n    <Button\n      v-for=\"(btn, index) in props.options\"\n      :key=\"index\"\n      :class=\"cn('border', props.btnClass)\"\n      :disabled=\"props.disabled || loadingValues.includes(btn.value) || (!props.multiple && loadingValues.length > 0)\"\n      v-bind=\"btnDefaultProps\"\n      :variant=\"innerValue.includes(btn.value) ? 'default' : 'outline'\"\n      @click=\"onBtnClick(btn.value)\"\n    >\n      <div v-if=\"props.showIcon\" class=\"icon-wrapper\">\n        <LoaderCircle v-if=\"loadingValues.includes(btn.value)\" class=\"animate-spin\" />\n        <CircleCheckBig v-else-if=\"innerValue.includes(btn.value)\" />\n        <Circle v-else />\n      </div>\n      <slot name=\"option\" :label=\"btn.label\" :value=\"btn.value\">\n        <VbenRenderContent :content=\"btn.label\" />\n      </slot>\n    </Button>\n  </VbenButtonGroup>\n</template>\n<style lang=\"less\" scoped>\n.vben-check-button-group {\n  &:deep(.size-large) button {\n    .icon-wrapper {\n      margin-right: 0.3rem;\n\n      svg {\n        width: 1rem;\n        height: 1rem;\n      }\n    }\n  }\n\n  &:deep(.size-middle) button {\n    .icon-wrapper {\n      margin-right: 0.2rem;\n\n      svg {\n        width: 0.75rem;\n        height: 0.75rem;\n      }\n    }\n  }\n\n  &:deep(.size-small) button {\n    .icon-wrapper {\n      margin-right: 0.1rem;\n\n      svg {\n        width: 0.65rem;\n        height: 0.65rem;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/button/icon-button.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ButtonVariants } from \"../../ui\";\nimport type { VbenButtonProps } from \"./button\";\n\nimport { computed, useSlots } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { VbenTooltip } from \"../tooltip\";\nimport VbenButton from \"./button.vue\";\n\ninterface Props extends VbenButtonProps {\n  class?: any;\n  disabled?: boolean;\n  onClick?: () => void;\n  tooltip?: string;\n  tooltipDelayDuration?: number;\n  tooltipSide?: \"bottom\" | \"left\" | \"right\" | \"top\";\n  variant?: ButtonVariants;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  disabled: false,\n  onClick: () => {},\n  tooltipDelayDuration: 200,\n  tooltipSide: \"bottom\",\n  variant: \"icon\",\n});\n\nconst slots = useSlots();\n\nconst showTooltip = computed(() => !!slots.tooltip || !!props.tooltip);\n</script>\n\n<template>\n  <VbenButton v-if=\"!showTooltip\" :class=\"cn('rounded-full', props.class)\" :disabled=\"disabled\" :variant=\"variant\" size=\"icon\" @click=\"onClick\">\n    <slot></slot>\n  </VbenButton>\n\n  <VbenTooltip v-else :delay-duration=\"tooltipDelayDuration\" :side=\"tooltipSide\">\n    <template #trigger>\n      <VbenButton :class=\"cn('rounded-full', props.class)\" :disabled=\"disabled\" :variant=\"variant\" size=\"icon\" @click=\"onClick\">\n        <slot></slot>\n      </VbenButton>\n    </template>\n    <slot v-if=\"slots.tooltip\" name=\"tooltip\"> </slot>\n    <template v-else>\n      {{ tooltip }}\n    </template>\n  </VbenTooltip>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/button/index.ts",
    "content": "export type * from \"./button\";\nexport { default as VbenButtonGroup } from \"./button-group.vue\";\nexport { default as VbenButton } from \"./button.vue\";\nexport { default as VbenCheckButtonGroup } from \"./check-button-group.vue\";\nexport { default as VbenIconButton } from \"./icon-button.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/checkbox/checkbox.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CheckboxRootEmits, CheckboxRootProps } from \"radix-vue\";\n\nimport { useId } from \"vue\";\n\nimport { useForwardPropsEmits } from \"radix-vue\";\n\nimport { Checkbox } from \"../../ui/checkbox\";\n\nconst props = defineProps<CheckboxRootProps>();\n\nconst emits = defineEmits<CheckboxRootEmits>();\n\nconst checked = defineModel<boolean>(\"checked\");\n\nconst forwarded = useForwardPropsEmits(props, emits);\n\nconst id = useId();\n</script>\n\n<template>\n  <div class=\"flex items-center\">\n    <Checkbox v-bind=\"forwarded\" :id=\"id\" v-model:checked=\"checked\" />\n    <label :for=\"id\" class=\"ml-2 cursor-pointer text-sm\"> <slot></slot> </label>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/checkbox/index.ts",
    "content": "export { default as VbenCheckbox } from \"./checkbox.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/context-menu/context-menu.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuContentProps, ContextMenuRootEmits, ContextMenuRootProps } from \"radix-vue\";\n\nimport type { ClassType } from \"/@/vben/typings\";\n\nimport type { IContextMenuItem } from \"./interface\";\n\nimport { computed } from \"vue\";\n\nimport { useForwardPropsEmits } from \"radix-vue\";\n\nimport { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuTrigger } from \"../../ui/context-menu\";\n\nconst props = defineProps<\n  ContextMenuRootProps & {\n    class?: ClassType;\n    contentClass?: ClassType;\n    contentProps?: ContextMenuContentProps;\n    handlerData?: Record<string, any>;\n    itemClass?: ClassType;\n    menus: (data: any) => IContextMenuItem[];\n  }\n>();\n\nconst emits = defineEmits<ContextMenuRootEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _cls, contentClass: _, contentProps: _cProps, itemClass: _iCls, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n\nconst menusView = computed(() => {\n  return props.menus?.(props.handlerData);\n});\n\nfunction handleClick(menu: IContextMenuItem) {\n  if (menu.disabled) {\n    return;\n  }\n  menu?.handler?.(props.handlerData);\n}\n</script>\n\n<template>\n  <ContextMenu v-bind=\"forwarded\">\n    <ContextMenuTrigger as-child>\n      <slot></slot>\n    </ContextMenuTrigger>\n    <ContextMenuContent :class=\"contentClass\" v-bind=\"contentProps\" class=\"side-content z-popup\">\n      <template v-for=\"menu in menusView\" :key=\"menu.key\">\n        <ContextMenuItem :class=\"itemClass\" :disabled=\"menu.disabled\" :inset=\"menu.inset || !menu.icon\" class=\"cursor-pointer\" @click=\"handleClick(menu)\">\n          <component :is=\"menu.icon\" v-if=\"menu.icon\" class=\"mr-2 size-4 text-lg\" />\n\n          {{ menu.text }}\n          <ContextMenuShortcut v-if=\"menu.shortcut\">\n            {{ menu.shortcut }}\n          </ContextMenuShortcut>\n        </ContextMenuItem>\n        <ContextMenuSeparator v-if=\"menu.separator\" />\n      </template>\n    </ContextMenuContent>\n  </ContextMenu>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/context-menu/index.ts",
    "content": "export { default as VbenContextMenu } from \"./context-menu.vue\";\n\nexport type * from \"./interface\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/context-menu/interface.ts",
    "content": "import type { Component } from \"vue\";\n\ninterface IContextMenuItem {\n  /**\n   * @zh_CN 是否禁用\n   */\n  disabled?: boolean;\n  /**\n   * @zh_CN 点击事件处理\n   * @param data\n   */\n  handler?: (data: any) => void;\n  /**\n   * @zh_CN 图标\n   */\n  icon?: Component;\n  /**\n   * @zh_CN 是否显示图标\n   */\n  inset?: boolean;\n  /**\n   * @zh_CN 唯一标识\n   */\n  key: string;\n  /**\n   * @zh_CN 是否是分割线\n   */\n  separator?: boolean;\n  /**\n   * @zh_CN 快捷键\n   */\n  shortcut?: string;\n  /**\n   * @zh_CN 标题\n   */\n  text: string;\n}\nexport type { IContextMenuItem };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/count-to-animator/count-to-animator.vue",
    "content": "<script lang=\"ts\" setup>\nimport { computed, onMounted, ref, unref, watch, watchEffect } from \"vue\";\n\nimport { isNumber } from \"/@/vben/shared/utils\";\n\nimport { TransitionPresets, useTransition } from \"@vueuse/core\";\n\ninterface Props {\n  autoplay?: boolean;\n  color?: string;\n  decimal?: string;\n  decimals?: number;\n  duration?: number;\n  endVal?: number;\n  prefix?: string;\n  separator?: string;\n  startVal?: number;\n  suffix?: string;\n  transition?: keyof typeof TransitionPresets;\n  useEasing?: boolean;\n}\n\ndefineOptions({ name: \"CountToAnimator\" });\n\nconst props = withDefaults(defineProps<Props>(), {\n  autoplay: true,\n  color: \"\",\n  decimal: \".\",\n  decimals: 0,\n  duration: 1500,\n  endVal: 2021,\n  prefix: \"\",\n  separator: \",\",\n  startVal: 0,\n  suffix: \"\",\n  transition: \"linear\",\n  useEasing: true,\n});\n\nconst emit = defineEmits<{\n  finished: [];\n  /**\n   * @deprecated 请使用{@link finished}事件\n   */\n  onFinished: [];\n  /**\n   * @deprecated 请使用{@link started}事件\n   */\n  onStarted: [];\n  started: [];\n}>();\n\nconst source = ref(props.startVal);\nconst disabled = ref(false);\nlet outputValue = useTransition(source);\n\nconst value = computed(() => formatNumber(unref(outputValue)));\n\nwatchEffect(() => {\n  source.value = props.startVal;\n});\n\nwatch([() => props.startVal, () => props.endVal], () => {\n  if (props.autoplay) {\n    start();\n  }\n});\n\nonMounted(() => {\n  props.autoplay && start();\n});\n\nfunction start() {\n  run();\n  source.value = props.endVal;\n}\n\nfunction reset() {\n  source.value = props.startVal;\n  run();\n}\n\nfunction run() {\n  outputValue = useTransition(source, {\n    disabled,\n    duration: props.duration,\n    onFinished: () => {\n      emit(\"finished\");\n      emit(\"onFinished\");\n    },\n    onStarted: () => {\n      emit(\"started\");\n      emit(\"onStarted\");\n    },\n    ...(props.useEasing ? { transition: TransitionPresets[props.transition] } : {}),\n  });\n}\n\nfunction formatNumber(num: number | string) {\n  if (!num && num !== 0) {\n    return \"\";\n  }\n  const { decimal, decimals, prefix, separator, suffix } = props;\n  num = Number(num).toFixed(decimals);\n  num += \"\";\n\n  const x = num.split(\".\");\n  let x1 = x[0];\n  const x2 = x.length > 1 ? decimal + x[1] : \"\";\n\n  const rgx = /(\\d+)(\\d{3})/;\n  if (separator && !isNumber(separator) && x1) {\n    while (rgx.test(x1)) {\n      x1 = x1.replace(rgx, `$1${separator}$2`);\n    }\n  }\n  return prefix + x1 + x2 + suffix;\n}\n\ndefineExpose({ reset });\n</script>\n<template>\n  <span :style=\"{ color }\">\n    {{ value }}\n  </span>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/count-to-animator/index.ts",
    "content": "export { default as VbenCountToAnimator } from \"./count-to-animator.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/dropdown-menu/dropdown-menu.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { DropdownMenuProps, VbenDropdownMenuItem as IDropdownMenuItem } from \"./interface\";\n\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from \"../../ui\";\n\ninterface Props extends DropdownMenuProps {}\n\ndefineOptions({ name: \"DropdownMenu\" });\nconst props = withDefaults(defineProps<Props>(), {});\n\nfunction handleItemClick(menu: IDropdownMenuItem) {\n  if (menu.disabled) {\n    return;\n  }\n  menu?.handler?.(props);\n}\n</script>\n<template>\n  <DropdownMenu>\n    <DropdownMenuTrigger class=\"flex h-full items-center gap-1\">\n      <slot></slot>\n    </DropdownMenuTrigger>\n    <DropdownMenuContent align=\"start\">\n      <DropdownMenuGroup>\n        <template v-for=\"menu in menus\" :key=\"menu.value\">\n          <DropdownMenuItem :disabled=\"menu.disabled\" class=\"data-[state=checked]:bg-accent data-[state=checked]:text-accent-foreground text-foreground/80 mb-1 cursor-pointer\" @click=\"handleItemClick(menu)\">\n            <component :is=\"menu.icon\" v-if=\"menu.icon\" class=\"mr-2 size-4\" />\n            {{ menu.label }}\n          </DropdownMenuItem>\n          <DropdownMenuSeparator v-if=\"menu.separator\" class=\"bg-border\" />\n        </template>\n      </DropdownMenuGroup>\n    </DropdownMenuContent>\n  </DropdownMenu>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/dropdown-menu/dropdown-radio-menu.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { DropdownMenuProps } from \"./interface\";\n\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from \"../../ui\";\n\ninterface Props extends DropdownMenuProps {}\n\ndefineOptions({ name: \"DropdownRadioMenu\" });\nwithDefaults(defineProps<Props>(), {});\n\nconst modelValue = defineModel<string>();\n\nfunction handleItemClick(value: string) {\n  modelValue.value = value;\n}\n</script>\n<template>\n  <DropdownMenu>\n    <DropdownMenuTrigger as-child class=\"flex items-center gap-1\">\n      <slot></slot>\n    </DropdownMenuTrigger>\n    <DropdownMenuContent align=\"start\">\n      <DropdownMenuGroup>\n        <template v-for=\"menu in menus\" :key=\"menu.key\">\n          <DropdownMenuItem\n            :class=\"menu.value === modelValue ? 'bg-accent text-accent-foreground' : ''\"\n            class=\"data-[state=checked]:bg-accent data-[state=checked]:text-accent-foreground text-foreground/80 mb-1 cursor-pointer\"\n            @click=\"handleItemClick(menu.value)\"\n          >\n            <component :is=\"menu.icon\" v-if=\"menu.icon\" class=\"mr-2 size-4\" />\n            <span v-if=\"!menu.icon\" :class=\"menu.value === modelValue ? 'bg-foreground' : ''\" class=\"mr-2 size-1.5 rounded-full\"></span>\n            {{ menu.label }}\n          </DropdownMenuItem>\n        </template>\n      </DropdownMenuGroup>\n    </DropdownMenuContent>\n  </DropdownMenu>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/dropdown-menu/index.ts",
    "content": "export { default as VbenDropdownMenu } from \"./dropdown-menu.vue\";\nexport { default as VbenDropdownRadioMenu } from \"./dropdown-radio-menu.vue\";\n\nexport type * from \"./interface\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/dropdown-menu/interface.ts",
    "content": "import type { Component } from \"vue\";\n\ninterface VbenDropdownMenuItem {\n  disabled?: boolean;\n  /**\n   * @zh_CN 点击事件处理\n   * @param data\n   */\n  handler?: (data: any) => void;\n  /**\n   * @zh_CN 图标\n   */\n  icon?: Component;\n  /**\n   * @zh_CN 标题\n   */\n  label: string;\n  /**\n   * @zh_CN 是否是分割线\n   */\n  separator?: boolean;\n  /**\n   * @zh_CN 唯一标识\n   */\n  value: string;\n}\n\ninterface DropdownMenuProps {\n  menus: VbenDropdownMenuItem[];\n}\n\nexport type { DropdownMenuProps, VbenDropdownMenuItem };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/expandable-arrow/expandable-arrow.vue",
    "content": "<script lang=\"ts\" setup>\nimport { ChevronDown } from \"/@/vben/icons\";\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: string;\n}>();\n\n// 控制箭头展开/收起状态\nconst collapsed = defineModel({ default: false });\n</script>\n\n<template>\n  <div :class=\"cn('vben-link inline-flex items-center', props.class)\" @click=\"collapsed = !collapsed\">\n    <slot :is-expanded=\"collapsed\">\n      {{ collapsed }}\n      <!-- <span>{{ isExpanded ? '收起' : '展开' }}</span> -->\n    </slot>\n    <div :class=\"{ 'rotate-180': !collapsed }\" class=\"transition-transform duration-300\">\n      <slot name=\"icon\">\n        <ChevronDown class=\"size-4\" />\n      </slot>\n    </div>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/expandable-arrow/index.ts",
    "content": "export { default as VbenExpandableArrow } from \"./expandable-arrow.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/full-screen/full-screen.vue",
    "content": "<script lang=\"ts\" setup>\nimport { Maximize, Minimize } from \"/@/vben/icons\";\n\nimport { useFullscreen } from \"@vueuse/core\";\n\nimport { VbenIconButton } from \"../button\";\n\ndefineOptions({ name: \"FullScreen\" });\n\nconst { isFullscreen, toggle } = useFullscreen();\n\n// 重新检查全屏状态\nisFullscreen.value = !!(\n  document.fullscreenElement ||\n  // @ts-ignore\n  document.webkitFullscreenElement ||\n  // @ts-ignore\n  document.mozFullScreenElement ||\n  // @ts-ignore\n  document.msFullscreenElement\n);\n</script>\n<template>\n  <VbenIconButton @click=\"toggle\">\n    <Minimize v-if=\"isFullscreen\" class=\"text-foreground size-4\" />\n    <Maximize v-else class=\"text-foreground size-4\" />\n  </VbenIconButton>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/full-screen/index.ts",
    "content": "export { default as VbenFullScreen } from \"./full-screen.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/hover-card/hover-card.vue",
    "content": "<script setup lang=\"ts\">\nimport type { HoverCardContentProps, HoverCardRootEmits, HoverCardRootProps } from \"radix-vue\";\n\nimport type { ClassType } from \"/@/vben/typings\";\n\nimport { computed } from \"vue\";\n\nimport { useForwardPropsEmits } from \"radix-vue\";\n\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from \"../../ui\";\n\ninterface Props extends HoverCardRootProps {\n  class?: ClassType;\n  contentClass?: ClassType;\n  contentProps?: HoverCardContentProps;\n}\n\nconst props = defineProps<Props>();\n\nconst emits = defineEmits<HoverCardRootEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _cls, contentClass: _, contentProps: _cProps, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <HoverCard v-bind=\"forwarded\">\n    <HoverCardTrigger as-child class=\"h-full\">\n      <div class=\"h-full cursor-pointer\">\n        <slot name=\"trigger\"></slot>\n      </div>\n    </HoverCardTrigger>\n    <HoverCardContent :class=\"contentClass\" v-bind=\"contentProps\" class=\"side-content z-popup\">\n      <slot></slot>\n    </HoverCardContent>\n  </HoverCard>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/hover-card/index.ts",
    "content": "export { default as VbenHoverCard } from \"./hover-card.vue\";\nexport type { HoverCardContentProps } from \"radix-vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/icon/icon.vue",
    "content": "<script setup lang=\"ts\">\nimport type { Component } from \"vue\";\n\nimport { computed } from \"vue\";\n\nimport { IconDefault, IconifyIcon } from \"/@/vben/icons\";\nimport { isFunction, isHttpUrl, isObject, isString } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  // 没有是否显示默认图标\n  fallback?: boolean;\n  icon?: Component | Function | string;\n}>();\n\nconst isRemoteIcon = computed(() => {\n  return isString(props.icon) && isHttpUrl(props.icon);\n});\n\nconst isComponent = computed(() => {\n  const { icon } = props;\n  return !isString(icon) && (isObject(icon) || isFunction(icon));\n});\n</script>\n\n<template>\n  <component :is=\"icon as Component\" v-if=\"isComponent\" v-bind=\"$attrs\" />\n  <img v-else-if=\"isRemoteIcon\" :src=\"icon as string\" v-bind=\"$attrs\" />\n  <IconifyIcon v-else-if=\"icon\" v-bind=\"$attrs\" :icon=\"icon as string\" />\n  <IconDefault v-else-if=\"fallback\" v-bind=\"$attrs\" />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/icon/index.ts",
    "content": "export { default as VbenIcon } from \"./icon.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/index.ts",
    "content": "export * from \"./avatar\";\nexport * from \"./back-top\";\nexport * from \"./breadcrumb\";\nexport * from \"./button\";\nexport * from \"./checkbox\";\nexport * from \"./context-menu\";\nexport * from \"./count-to-animator\";\nexport * from \"./dropdown-menu\";\nexport * from \"./expandable-arrow\";\nexport * from \"./full-screen\";\nexport * from \"./hover-card\";\nexport * from \"./icon\";\nexport * from \"./input-password\";\nexport * from \"./logo\";\nexport * from \"./pin-input\";\nexport * from \"./popover\";\nexport * from \"./render-content\";\nexport * from \"./scrollbar\";\nexport * from \"./segmented\";\nexport * from \"./select\";\nexport * from \"./spine-text\";\nexport * from \"./spinner\";\nexport * from \"./tooltip\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/input-password/index.ts",
    "content": "export { default as VbenInputPassword } from \"./input-password.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/input-password/input-password.vue",
    "content": "<script setup lang=\"ts\">\nimport { ref, useSlots } from \"vue\";\n\nimport { Eye, EyeOff } from \"/@/vben/icons\";\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Input } from \"../../ui\";\nimport PasswordStrength from \"./password-strength.vue\";\n\ninterface Props {\n  class?: any;\n  /**\n   * 是否显示密码强度\n   */\n  passwordStrength?: boolean;\n}\n\ndefineOptions({\n  inheritAttrs: false,\n});\n\nconst props = defineProps<Props>();\n\nconst modelValue = defineModel<string>();\n\nconst slots = useSlots();\n\nconst show = ref(false);\n</script>\n\n<template>\n  <div class=\"relative w-full\">\n    <Input v-bind=\"$attrs\" v-model=\"modelValue\" :class=\"cn(props.class)\" :type=\"show ? 'text' : 'password'\" />\n    <template v-if=\"passwordStrength\">\n      <PasswordStrength :password=\"modelValue\" />\n      <p v-if=\"slots.strengthText\" class=\"text-muted-foreground mt-1.5 text-xs\">\n        <slot name=\"strengthText\"> </slot>\n      </p>\n    </template>\n    <div\n      :class=\"{\n        'top-3': !!passwordStrength,\n        'top-1/2 -translate-y-1/2 items-center': !passwordStrength,\n      }\"\n      class=\"hover:text-foreground text-foreground/60 absolute inset-y-0 right-0 flex cursor-pointer pr-3 text-lg leading-5\"\n      @click=\"show = !show\"\n    >\n      <Eye v-if=\"show\" class=\"size-4\" />\n      <EyeOff v-else class=\"size-4\" />\n    </div>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/input-password/password-strength.vue",
    "content": "<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(defineProps<{ password?: string }>(), {\n  password: \"\",\n});\n\nconst strengthList: string[] = [\"\", \"#e74242\", \"#ED6F6F\", \"#EFBD47\", \"#55D18780\", \"#55D187\"];\n\nconst currentStrength = computed(() => {\n  return checkPasswordStrength(props.password);\n});\n\nconst currentColor = computed(() => {\n  return strengthList[currentStrength.value];\n});\n\n/**\n * Check the strength of a password\n */\nfunction checkPasswordStrength(password: string) {\n  let strength = 0;\n\n  // Check length\n  if (password.length >= 8) strength++;\n\n  // Check for lowercase letters\n  if (/[a-z]/.test(password)) strength++;\n\n  // Check for uppercase letters\n  if (/[A-Z]/.test(password)) strength++;\n\n  // Check for numbers\n  if (/\\d/.test(password)) strength++;\n\n  // Check for special characters\n  if (/[^\\da-z]/i.test(password)) strength++;\n\n  return strength;\n}\n</script>\n\n<template>\n  <div class=\"relative mt-2 flex items-center justify-between\">\n    <template v-for=\"index in 5\" :key=\"index\">\n      <div class=\"dark:bg-input-background bg-heavy relative mr-1 h-1.5 w-1/5 rounded-sm last:mr-0\">\n        <span\n          :style=\"{\n            backgroundColor: currentColor,\n            width: currentStrength >= index ? '100%' : '',\n          }\"\n          class=\"absolute left-0 h-full w-0 rounded-sm transition-all duration-500\"\n        ></span>\n      </div>\n    </template>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/logo/index.ts",
    "content": "export { default as VbenLogo } from \"./logo.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/logo/logo.vue",
    "content": "<script setup lang=\"ts\">\nimport { VbenAvatar } from \"../avatar\";\n\ninterface Props {\n  /**\n   * @zh_CN 是否收起文本\n   */\n  collapsed?: boolean;\n  /**\n   * @zh_CN Logo 跳转地址\n   */\n  href?: string;\n  /**\n   * @zh_CN Logo 图片大小\n   */\n  logoSize?: number;\n  /**\n   * @zh_CN Logo 图标\n   */\n  src?: string;\n  /**\n   * @zh_CN Logo 文本\n   */\n  text: string;\n  /**\n   * @zh_CN Logo 主题\n   */\n  theme?: string;\n}\n\ndefineOptions({\n  name: \"VbenLogo\",\n});\n\nwithDefaults(defineProps<Props>(), {\n  collapsed: false,\n  href: \"javascript:void 0\",\n  logoSize: 32,\n  src: \"\",\n  theme: \"light\",\n});\n</script>\n\n<template>\n  <div :class=\"theme\" class=\"flex h-full items-center text-lg\">\n    <a :class=\"$attrs.class\" :href=\"href\" class=\"flex h-full items-center gap-2 overflow-hidden px-3 text-lg leading-normal transition-all duration-500\">\n      <VbenAvatar v-if=\"src\" :alt=\"text\" :src=\"src\" class=\"relative w-8 rounded-none bg-transparent\" />\n      <span v-if=\"!collapsed\" class=\"text-foreground truncate text-nowrap font-semibold\">\n        {{ text }}\n      </span>\n    </a>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/pin-input/index.ts",
    "content": "export { default as VbenPinInput } from \"./input.vue\";\n\nexport type * from \"./types\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/pin-input/input.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PinInputProps } from \"./types\";\n\nimport { computed, onBeforeUnmount, ref, useId, watch } from \"vue\";\n\nimport { PinInput, PinInputGroup, PinInputInput } from \"../../ui\";\nimport { VbenButton } from \"../button\";\n\ndefineOptions({\n  inheritAttrs: false,\n});\n\nconst { codeLength = 6, createText = async () => {}, disabled = false, handleSendCode = async () => {}, loading = false, maxTime = 60 } = defineProps<PinInputProps>();\n\nconst emit = defineEmits<{\n  complete: [];\n  sendError: [error: any];\n}>();\n\nconst timer = ref<ReturnType<typeof setTimeout>>();\n\nconst modelValue = defineModel<string>();\n\nconst inputValue = ref<string[]>([]);\nconst countdown = ref(0);\n\nconst btnText = computed(() => {\n  const countdownValue = countdown.value;\n  return createText?.(countdownValue);\n});\n\nconst btnLoading = computed(() => {\n  return loading || countdown.value > 0;\n});\n\nwatch(\n  () => modelValue.value,\n  () => {\n    inputValue.value = modelValue.value?.split(\"\") ?? [];\n  }\n);\n\nwatch(inputValue, val => {\n  modelValue.value = val.join(\"\");\n});\n\nfunction handleComplete(e: string[]) {\n  modelValue.value = e.join(\"\");\n  emit(\"complete\");\n}\n\nasync function handleSend(e: Event) {\n  try {\n    e?.preventDefault();\n    await handleSendCode();\n    countdown.value = maxTime;\n    startCountdown();\n  } catch (error) {\n    console.error(\"Failed to send code:\", error);\n    // Consider emitting an error event or showing a notification\n    emit(\"sendError\", error);\n  }\n}\n\nfunction startCountdown() {\n  if (countdown.value > 0) {\n    timer.value = setTimeout(() => {\n      countdown.value--;\n      startCountdown();\n    }, 1000);\n  }\n}\n\nonBeforeUnmount(() => {\n  countdown.value = 0;\n  clearTimeout(timer.value);\n});\n\nconst id = useId();\n</script>\n\n<template>\n  <PinInput :id=\"id\" v-model=\"inputValue\" :disabled=\"disabled\" class=\"flex w-full justify-between\" otp placeholder=\"○\" type=\"number\" @complete=\"handleComplete\">\n    <div class=\"relative flex w-full\">\n      <PinInputGroup class=\"mr-2\">\n        <PinInputInput v-for=\"(item, index) in codeLength\" :key=\"item\" :index=\"index\" />\n      </PinInputGroup>\n      <VbenButton :disabled=\"disabled\" :loading=\"btnLoading\" class=\"flex-grow\" size=\"lg\" variant=\"outline\" @click=\"handleSend\">\n        {{ btnText }}\n      </VbenButton>\n    </div>\n  </PinInput>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/pin-input/types.ts",
    "content": "interface PinInputProps {\n  class?: any;\n  /**\n   * 验证码长度\n   */\n  codeLength?: number;\n  /**\n   * 发送验证码按钮文本\n   */\n  createText?: (countdown: number) => string;\n  /**\n   * 是否禁用\n   */\n  disabled?: boolean;\n  /**\n   * 自定义验证码发送逻辑\n   * @returns\n   */\n  handleSendCode?: () => Promise<void>;\n  /**\n   * 发送验证码按钮loading\n   */\n  loading?: boolean;\n  /**\n   * 最大重试时间\n   */\n  maxTime?: number;\n}\n\nexport type { PinInputProps };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/popover/index.ts",
    "content": "export { default as VbenPopover } from \"./popover.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/popover/popover.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PopoverContentProps, PopoverRootEmits, PopoverRootProps } from \"radix-vue\";\n\nimport type { ClassType } from \"/@/vben/typings\";\n\nimport { computed } from \"vue\";\n\nimport { useForwardPropsEmits } from \"radix-vue\";\n\nimport { PopoverContent, Popover as PopoverRoot, PopoverTrigger } from \"../../ui\";\n\ninterface Props extends PopoverRootProps {\n  class?: ClassType;\n  contentClass?: ClassType;\n  contentProps?: PopoverContentProps;\n}\n\nconst props = withDefaults(defineProps<Props>(), {});\n\nconst emits = defineEmits<PopoverRootEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _cls, contentClass: _, contentProps: _cProps, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <PopoverRoot v-bind=\"forwarded\">\n    <PopoverTrigger>\n      <slot name=\"trigger\"></slot>\n\n      <PopoverContent :class=\"contentClass\" class=\"side-content z-popup\" v-bind=\"contentProps\">\n        <slot></slot>\n      </PopoverContent>\n    </PopoverTrigger>\n  </PopoverRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/render-content/index.ts",
    "content": "export { default as VbenRenderContent } from \"./render-content.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/render-content/render-content.vue",
    "content": "<script lang=\"ts\">\nimport type { Component, PropType } from \"vue\";\n\nimport { defineComponent, h } from \"vue\";\n\nimport { isFunction, isObject } from \"/@/vben/shared/utils\";\n\nexport default defineComponent({\n  name: \"RenderContent\",\n  props: {\n    content: {\n      default: undefined as PropType<(() => any) | Component | string> | undefined,\n      type: [Object, String, Function],\n    },\n  },\n  setup(props, { attrs, slots }) {\n    return () => {\n      if (!props.content) {\n        return null;\n      }\n      const isComponent = (isObject(props.content) || isFunction(props.content)) && props.content !== null;\n      if (!isComponent) {\n        return props.content;\n      }\n      return h(props.content as never, {\n        ...attrs,\n        props: {\n          ...props,\n          ...attrs,\n        },\n        slots,\n      });\n    };\n  },\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/scrollbar/index.ts",
    "content": "export { default as VbenScrollbar } from \"./scrollbar.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/scrollbar/scrollbar.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ClassType } from \"/@/vben/typings\";\n\nimport { computed, ref } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ScrollArea, ScrollBar } from \"../../ui\";\n\ninterface Props {\n  class?: ClassType;\n  horizontal?: boolean;\n  scrollBarClass?: ClassType;\n  shadow?: boolean;\n  shadowBorder?: boolean;\n  shadowBottom?: boolean;\n  shadowLeft?: boolean;\n  shadowRight?: boolean;\n  shadowTop?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  class: \"\",\n  horizontal: false,\n  shadow: false,\n  shadowBorder: false,\n  shadowBottom: true,\n  shadowLeft: false,\n  shadowRight: false,\n  shadowTop: true,\n});\n\nconst emit = defineEmits<{\n  scrollAt: [{ bottom: boolean; left: boolean; right: boolean; top: boolean }];\n}>();\n\nconst isAtTop = ref(true);\nconst isAtRight = ref(false);\nconst isAtBottom = ref(false);\nconst isAtLeft = ref(true);\n\nconst showShadowTop = computed(() => props.shadow && props.shadowTop);\nconst showShadowBottom = computed(() => props.shadow && props.shadowBottom);\nconst showShadowLeft = computed(() => props.shadow && props.shadowLeft);\nconst showShadowRight = computed(() => props.shadow && props.shadowRight);\n\nconst computedShadowClasses = computed(() => {\n  return {\n    \"both-shadow\": !isAtLeft.value && !isAtRight.value && showShadowLeft.value && showShadowRight.value,\n    \"left-shadow\": !isAtLeft.value && showShadowLeft.value,\n    \"right-shadow\": !isAtRight.value && showShadowRight.value,\n  };\n});\n\nfunction handleScroll(event: Event) {\n  const target = event.target as HTMLElement;\n  const scrollTop = target?.scrollTop ?? 0;\n  const scrollLeft = target?.scrollLeft ?? 0;\n  const offsetHeight = target?.offsetHeight ?? 0;\n  const offsetWidth = target?.offsetWidth ?? 0;\n  const scrollHeight = target?.scrollHeight ?? 0;\n  const scrollWidth = target?.scrollWidth ?? 0;\n  isAtTop.value = scrollTop <= 0;\n  isAtLeft.value = scrollLeft <= 0;\n  isAtBottom.value = scrollTop + offsetHeight >= scrollHeight;\n  isAtRight.value = scrollLeft + offsetWidth >= scrollWidth;\n\n  emit(\"scrollAt\", {\n    bottom: isAtBottom.value,\n    left: isAtLeft.value,\n    right: isAtRight.value,\n    top: isAtTop.value,\n  });\n}\n</script>\n\n<template>\n  <ScrollArea :class=\"[cn(props.class), computedShadowClasses]\" :on-scroll=\"handleScroll\" class=\"vben-scrollbar relative\">\n    <div\n      v-if=\"showShadowTop\"\n      :class=\"{\n        'opacity-100': !isAtTop,\n        'border-border border-t': shadowBorder && !isAtTop,\n      }\"\n      class=\"scrollbar-top-shadow pointer-events-none absolute top-0 z-10 h-12 w-full opacity-0 transition-opacity duration-300 ease-in-out will-change-[opacity]\"\n    ></div>\n    <slot></slot>\n    <div\n      v-if=\"showShadowBottom\"\n      :class=\"{\n        'opacity-100': !isAtTop && !isAtBottom,\n        'border-border border-b': shadowBorder && !isAtTop && !isAtBottom,\n      }\"\n      class=\"scrollbar-bottom-shadow pointer-events-none absolute bottom-0 z-10 h-12 w-full opacity-0 transition-opacity duration-300 ease-in-out will-change-[opacity]\"\n    ></div>\n    <ScrollBar v-if=\"horizontal\" :class=\"scrollBarClass\" orientation=\"horizontal\" />\n  </ScrollArea>\n</template>\n\n<style scoped>\n.vben-scrollbar {\n  &:not(.both-shadow).left-shadow {\n    mask-image: linear-gradient(90deg, transparent, #000 16px);\n  }\n\n  &:not(.both-shadow).right-shadow {\n    mask-image: linear-gradient(90deg, #000 0%, #000 calc(100% - 16px), transparent);\n  }\n\n  &.both-shadow {\n    mask-image: linear-gradient(90deg, transparent, #000 16px, #000 calc(100% - 16px), transparent 100%);\n  }\n}\n\n.scrollbar-top-shadow {\n  background: linear-gradient(to bottom, hsl(var(--scroll-shadow, var(--background))), transparent);\n}\n\n.scrollbar-bottom-shadow {\n  background: linear-gradient(to top, hsl(var(--scroll-shadow, var(--background))), transparent);\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/segmented/index.ts",
    "content": "export { default as VbenSegmented } from \"./segmented.vue\";\n\nexport type * from \"./types\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/segmented/segmented.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SegmentedItem } from \"./types\";\n\nimport { computed } from \"vue\";\n\nimport { TabsTrigger } from \"radix-vue\";\n\nimport { Tabs, TabsContent, TabsList } from \"../../ui\";\nimport TabsIndicator from \"./tabs-indicator.vue\";\n\ninterface Props {\n  defaultValue?: string;\n  tabs: SegmentedItem[];\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  defaultValue: \"\",\n  tabs: () => [],\n});\n\nconst activeTab = defineModel<string>();\n\nconst getDefaultValue = computed(() => {\n  return props.defaultValue || props.tabs[0]?.value;\n});\n\nconst tabsStyle = computed(() => {\n  return {\n    \"grid-template-columns\": `repeat(${props.tabs.length}, minmax(0, 1fr))`,\n  };\n});\n\nconst tabsIndicatorStyle = computed(() => {\n  return {\n    width: `${(100 / props.tabs.length).toFixed(0)}%`,\n  };\n});\n</script>\n\n<template>\n  <Tabs v-model=\"activeTab\" :default-value=\"getDefaultValue\">\n    <TabsList :style=\"tabsStyle\" class=\"bg-accent relative grid w-full\">\n      <TabsIndicator :style=\"tabsIndicatorStyle\" />\n      <template v-for=\"tab in tabs\" :key=\"tab.value\">\n        <TabsTrigger :value=\"tab.value\" class=\"z-20 inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium disabled:pointer-events-none disabled:opacity-50\">\n          {{ tab.label }}\n        </TabsTrigger>\n      </template>\n    </TabsList>\n    <template v-for=\"tab in tabs\" :key=\"tab.value\">\n      <TabsContent :value=\"tab.value\">\n        <slot :name=\"tab.value\"></slot>\n      </TabsContent>\n    </template>\n  </Tabs>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/segmented/tabs-indicator.vue",
    "content": "<script setup lang=\"ts\">\nimport type { TabsIndicatorProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { TabsIndicator, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<TabsIndicatorProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <TabsIndicator\n    v-bind=\"forwardedProps\"\n    :class=\"cn('absolute bottom-0 left-0 z-10 h-full w-1/2 translate-x-[--radix-tabs-indicator-position] rounded-full px-0 py-1 pr-1 transition-[width,transform] duration-300', props.class)\"\n  >\n    <div\n      class=\"bg-background text-foreground inline-flex h-full w-full items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n    >\n      <slot></slot>\n    </div>\n  </TabsIndicator>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/segmented/types.ts",
    "content": "interface SegmentedItem {\n  label: string;\n  value: string;\n}\n\nexport type { SegmentedItem };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/select/index.ts",
    "content": "export { default as VbenSelect } from \"./select.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/select/select.vue",
    "content": "<script lang=\"ts\" setup>\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../../ui\";\n\ninterface Props {\n  class?: any;\n  options?: Array<{ label: string; value: string }>;\n  placeholder?: string;\n}\n\nconst props = defineProps<Props>();\n</script>\n<template>\n  <Select>\n    <SelectTrigger :class=\"props.class\">\n      <SelectValue :placeholder=\"placeholder\" />\n    </SelectTrigger>\n    <SelectContent>\n      <template v-for=\"item in options\" :key=\"item.value\">\n        <SelectItem :value=\"item.value\"> {{ item.label }} </SelectItem>\n      </template>\n    </SelectContent>\n  </Select>\n</template>\n\n<style lang=\"less\" scoped>\nbutton[role=\"combobox\"][data-placeholder] {\n  color: hsl(var(--muted-foreground));\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/spine-text/index.ts",
    "content": "export { default as VbenSpineText } from \"./spine-text.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/spine-text/spine-text.vue",
    "content": "<script lang=\"ts\" setup>\nimport { computed } from \"vue\";\n\nconst { animationDuration = 2, animationIterationCount = \"infinite\" } = defineProps<{\n  // 动画持续时间，单位秒\n  animationDuration?: number;\n  // 动画是否只执行一次\n  animationIterationCount?: \"infinite\" | number;\n}>();\n\nconst style = computed(() => {\n  return {\n    animation: `shine ${animationDuration}s linear ${animationIterationCount}`,\n  };\n});\n</script>\n<template>\n  <div :style=\"style\" class=\"vben-spine-text !bg-clip-text text-transparent\">\n    <slot></slot>\n  </div>\n</template>\n<style>\n.vben-spine-text {\n  background:\n    radial-gradient(circle at center, rgb(255 255 255 / 80%), #f000) -200% 50% / 200% 100% no-repeat,\n    #000;\n\n  /* animation: shine 3s linear infinite; */\n}\n\n.dark .vben-spine-text {\n  background:\n    radial-gradient(circle at center, rgb(24 24 26 / 80%), transparent) -200% 50% / 200% 100% no-repeat,\n    #f4f4f4;\n}\n\n@keyframes shine {\n  0% {\n    background-position: 200% 0%;\n  }\n\n  100% {\n    background-position: -200% 0%;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/spinner/index.ts",
    "content": "export { default as VbenLoading } from \"./loading.vue\";\nexport { default as VbenSpinner } from \"./spinner.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/spinner/loading.vue",
    "content": "<script lang=\"ts\" setup>\nimport { ref, watch } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\ninterface Props {\n  class?: string;\n  /**\n   * @zh_CN 最小加载时间\n   * @en_US Minimum loading time\n   */\n  minLoadingTime?: number;\n\n  /**\n   * @zh_CN loading状态开启\n   */\n  spinning?: boolean;\n  /**\n   * @zh_CN 文字\n   */\n  text?: string;\n}\n\ndefineOptions({\n  name: \"VbenLoading\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  minLoadingTime: 50,\n  text: \"\",\n});\n// const startTime = ref(0);\nconst showSpinner = ref(false);\nconst renderSpinner = ref(false);\nconst timer = ref<ReturnType<typeof setTimeout>>();\n\nwatch(\n  () => props.spinning,\n  show => {\n    if (!show) {\n      showSpinner.value = false;\n      clearTimeout(timer.value);\n      return;\n    }\n\n    // startTime.value = performance.now();\n    timer.value = setTimeout(() => {\n      // const loadingTime = performance.now() - startTime.value;\n\n      showSpinner.value = true;\n      if (showSpinner.value) {\n        renderSpinner.value = true;\n      }\n    }, props.minLoadingTime);\n  },\n  {\n    immediate: true,\n  }\n);\n\nfunction onTransitionEnd() {\n  if (!showSpinner.value) {\n    renderSpinner.value = false;\n  }\n}\n</script>\n\n<template>\n  <div\n    :class=\"\n      cn(\n        'z-100 dark:bg-overlay bg-overlay-content absolute left-0 top-0 flex size-full flex-col items-center justify-center transition-all duration-500',\n        {\n          'invisible opacity-0': !showSpinner,\n        },\n        props.class\n      )\n    \"\n    @transitionend=\"onTransitionEnd\"\n  >\n    <slot v-if=\"renderSpinner\" name=\"icon\">\n      <span class=\"dot relative inline-block size-9 text-3xl\">\n        <i v-for=\"index in 4\" :key=\"index\" class=\"bg-primary absolute block size-4 origin-[50%_50%] scale-75 rounded-full opacity-30\"></i>\n      </span>\n    </slot>\n\n    <div v-if=\"text\" class=\"text-primary mt-4 text-xs\">{{ text }}</div>\n    <slot></slot>\n  </div>\n</template>\n\n<style scoped>\n.dot {\n  transform: rotate(45deg);\n  animation: rotate-ani 1.2s infinite linear;\n}\n\n.dot i {\n  animation: spin-move-ani 1s infinite linear alternate;\n}\n\n.dot i:nth-child(1) {\n  top: 0;\n  left: 0;\n}\n\n.dot i:nth-child(2) {\n  top: 0;\n  right: 0;\n  animation-delay: 0.4s;\n}\n\n.dot i:nth-child(3) {\n  right: 0;\n  bottom: 0;\n  animation-delay: 0.8s;\n}\n\n.dot i:nth-child(4) {\n  bottom: 0;\n  left: 0;\n  animation-delay: 1.2s;\n}\n\n@keyframes rotate-ani {\n  to {\n    transform: rotate(405deg);\n  }\n}\n\n@keyframes spin-move-ani {\n  to {\n    opacity: 1;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/spinner/spinner.vue",
    "content": "<script lang=\"ts\" setup>\nimport { ref, watch } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\ninterface Props {\n  class?: string;\n  /**\n   * @zh_CN 最小加载时间\n   * @en_US Minimum loading time\n   */\n  minLoadingTime?: number;\n  /**\n   * @zh_CN loading状态开启\n   */\n  spinning?: boolean;\n}\n\ndefineOptions({\n  name: \"VbenSpinner\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  minLoadingTime: 50,\n});\n// const startTime = ref(0);\nconst showSpinner = ref(false);\nconst renderSpinner = ref(false);\nconst timer = ref<ReturnType<typeof setTimeout>>();\n\nwatch(\n  () => props.spinning,\n  show => {\n    if (!show) {\n      showSpinner.value = false;\n      clearTimeout(timer.value);\n      return;\n    }\n\n    // startTime.value = performance.now();\n    timer.value = setTimeout(() => {\n      // const loadingTime = performance.now() - startTime.value;\n\n      showSpinner.value = true;\n      if (showSpinner.value) {\n        renderSpinner.value = true;\n      }\n    }, props.minLoadingTime);\n  },\n  {\n    immediate: true,\n  }\n);\n\nfunction onTransitionEnd() {\n  if (!showSpinner.value) {\n    renderSpinner.value = false;\n  }\n}\n</script>\n\n<template>\n  <div\n    :class=\"\n      cn(\n        'flex-center z-100 bg-overlay-content absolute left-0 top-0 size-full backdrop-blur-sm transition-all duration-500',\n        {\n          'invisible opacity-0': !showSpinner,\n        },\n        props.class\n      )\n    \"\n    @transitionend=\"onTransitionEnd\"\n  >\n    <div\n      v-if=\"renderSpinner\"\n      :class=\"{ paused: !renderSpinner }\"\n      class=\"loader before:bg-primary/50 after:bg-primary relative size-12 before:absolute before:left-0 before:top-[60px] before:h-[5px] before:w-12 before:rounded-[50%] before:content-[''] after:absolute after:left-0 after:top-0 after:h-full after:w-full after:rounded after:content-['']\"\n    ></div>\n  </div>\n</template>\n\n<style scoped>\n.paused {\n  &::before {\n    animation-play-state: paused !important;\n  }\n\n  &::after {\n    animation-play-state: paused !important;\n  }\n}\n\n.loader {\n  &::before {\n    animation: loader-shadow-ani 0.5s linear infinite;\n  }\n\n  &::after {\n    animation: loader-jump-ani 0.5s linear infinite;\n  }\n}\n\n@keyframes loader-jump-ani {\n  15% {\n    border-bottom-right-radius: 3px;\n  }\n\n  25% {\n    transform: translateY(9px) rotate(22.5deg);\n  }\n\n  50% {\n    border-bottom-right-radius: 40px;\n    transform: translateY(18px) scale(1, 0.9) rotate(45deg);\n  }\n\n  75% {\n    transform: translateY(9px) rotate(67.5deg);\n  }\n\n  100% {\n    transform: translateY(0) rotate(90deg);\n  }\n}\n\n@keyframes loader-shadow-ani {\n  0%,\n  100% {\n    transform: scale(1, 1);\n  }\n\n  50% {\n    transform: scale(1.2, 1);\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/tooltip/help-tooltip.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { CircleHelp } from \"lucide-vue-next\";\n\nimport Tooltip from \"./tooltip.vue\";\n\ndefineOptions({\n  inheritAttrs: false,\n});\n\ndefineProps<{ triggerClass?: string }>();\n</script>\n\n<template>\n  <Tooltip :delay-duration=\"300\" side=\"right\">\n    <template #trigger>\n      <slot name=\"trigger\">\n        <CircleHelp :class=\"cn('text-foreground/80 hover:text-foreground inline-flex size-5 cursor-pointer', triggerClass)\" />\n      </slot>\n    </template>\n    <slot></slot>\n  </Tooltip>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/tooltip/index.ts",
    "content": "export { default as VbenHelpTooltip } from \"./help-tooltip.vue\";\nexport { default as VbenTooltip } from \"./tooltip.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/components/tooltip/tooltip.vue",
    "content": "<script setup lang=\"ts\">\nimport type { TooltipContentProps } from \"radix-vue\";\n\nimport type { StyleValue } from \"vue\";\n\nimport type { ClassType } from \"/@/vben/typings\";\n\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../../ui\";\n\ninterface Props {\n  contentClass?: ClassType;\n  contentStyle?: StyleValue;\n  delayDuration?: number;\n  side?: TooltipContentProps[\"side\"];\n}\n\nwithDefaults(defineProps<Props>(), {\n  delayDuration: 0,\n  side: \"right\",\n});\n</script>\n\n<template>\n  <TooltipProvider :delay-duration=\"delayDuration\">\n    <Tooltip>\n      <TooltipTrigger as-child tabindex=\"-1\">\n        <slot name=\"trigger\"></slot>\n      </TooltipTrigger>\n      <TooltipContent :class=\"contentClass\" :side=\"side\" :style=\"contentStyle\" class=\"side-content text-popover-foreground bg-accent rounded-md\">\n        <slot></slot>\n      </TooltipContent>\n    </Tooltip>\n  </TooltipProvider>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/index.ts",
    "content": "export * from \"./components\";\nexport * from \"./ui\";\nexport { createContext, Slot, VisuallyHidden } from \"radix-vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/accordion/Accordion.vue",
    "content": "<script setup lang=\"ts\">\nimport type { AccordionRootEmits, AccordionRootProps } from \"radix-vue\";\n\nimport { AccordionRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<AccordionRootProps>();\nconst emits = defineEmits<AccordionRootEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <AccordionRoot v-bind=\"forwarded\">\n    <slot></slot>\n  </AccordionRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/accordion/AccordionContent.vue",
    "content": "<script setup lang=\"ts\">\nimport type { AccordionContentProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { AccordionContent } from \"radix-vue\";\n\nconst props = defineProps<AccordionContentProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <AccordionContent v-bind=\"delegatedProps\" class=\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm\">\n    <div :class=\"cn('pb-4 pt-0', props.class)\">\n      <slot></slot>\n    </div>\n  </AccordionContent>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/accordion/AccordionItem.vue",
    "content": "<script setup lang=\"ts\">\nimport type { AccordionItemProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { AccordionItem, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<AccordionItemProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <AccordionItem v-bind=\"forwardedProps\" :class=\"cn('border-b', props.class)\">\n    <slot></slot>\n  </AccordionItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/accordion/AccordionTrigger.vue",
    "content": "<script setup lang=\"ts\">\nimport type { AccordionTriggerProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ChevronDown } from \"lucide-vue-next\";\nimport { AccordionHeader, AccordionTrigger } from \"radix-vue\";\n\nconst props = defineProps<AccordionTriggerProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <AccordionHeader class=\"flex\">\n    <AccordionTrigger v-bind=\"delegatedProps\" :class=\"cn('flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180', props.class)\">\n      <slot></slot>\n      <slot name=\"icon\">\n        <ChevronDown class=\"text-muted-foreground h-4 w-4 shrink-0 transition-transform duration-200\" />\n      </slot>\n    </AccordionTrigger>\n  </AccordionHeader>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/accordion/index.ts",
    "content": "export { default as Accordion } from \"./Accordion.vue\";\nexport { default as AccordionContent } from \"./AccordionContent.vue\";\nexport { default as AccordionItem } from \"./AccordionItem.vue\";\nexport { default as AccordionTrigger } from \"./AccordionTrigger.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/avatar/Avatar.vue",
    "content": "<script setup lang=\"ts\">\nimport type { AvatarVariants } from \"./avatar\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { AvatarRoot } from \"radix-vue\";\n\nimport { avatarVariant } from \"./avatar\";\n\nconst props = withDefaults(\n  defineProps<{\n    class?: any;\n    shape?: AvatarVariants[\"shape\"];\n    size?: AvatarVariants[\"size\"];\n  }>(),\n  {\n    shape: \"circle\",\n    size: \"sm\",\n  }\n);\n</script>\n\n<template>\n  <AvatarRoot :class=\"cn(avatarVariant({ size, shape }), props.class)\">\n    <slot></slot>\n  </AvatarRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/avatar/AvatarFallback.vue",
    "content": "<script setup lang=\"ts\">\nimport type { AvatarFallbackProps } from \"radix-vue\";\n\nimport { AvatarFallback } from \"radix-vue\";\n\nconst props = defineProps<AvatarFallbackProps>();\n</script>\n\n<template>\n  <AvatarFallback v-bind=\"props\">\n    <slot></slot>\n  </AvatarFallback>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/avatar/AvatarImage.vue",
    "content": "<script setup lang=\"ts\">\nimport type { AvatarImageProps } from \"radix-vue\";\n\nimport { AvatarImage } from \"radix-vue\";\n\nconst props = defineProps<AvatarImageProps>();\n</script>\n\n<template>\n  <AvatarImage v-bind=\"props\" class=\"h-full w-full object-cover\" />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/avatar/avatar.ts",
    "content": "import type { VariantProps } from \"class-variance-authority\";\n\nimport { cva } from \"class-variance-authority\";\n\nexport const avatarVariant = cva(\"inline-flex items-center justify-center font-normal text-foreground select-none shrink-0 bg-secondary overflow-hidden\", {\n  variants: {\n    shape: {\n      circle: \"rounded-full\",\n      square: \"rounded-md\",\n    },\n    size: {\n      base: \"h-16 w-16 text-2xl\",\n      lg: \"h-32 w-32 text-5xl\",\n      sm: \"h-10 w-10 text-xs\",\n    },\n  },\n});\n\nexport type AvatarVariants = VariantProps<typeof avatarVariant>;\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/avatar/index.ts",
    "content": "export * from \"./avatar\";\nexport { default as Avatar } from \"./Avatar.vue\";\nexport { default as AvatarFallback } from \"./AvatarFallback.vue\";\nexport { default as AvatarImage } from \"./AvatarImage.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/badge/Badge.vue",
    "content": "<script setup lang=\"ts\">\nimport type { BadgeVariants } from \"./badge\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { badgeVariants } from \"./badge\";\n\nconst props = defineProps<{\n  class?: any;\n  variant?: BadgeVariants[\"variant\"];\n}>();\n</script>\n\n<template>\n  <div :class=\"cn(badgeVariants({ variant }), props.class)\">\n    <slot></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/badge/badge.ts",
    "content": "import type { VariantProps } from \"class-variance-authority\";\n\nimport { cva } from \"class-variance-authority\";\n\nexport const badgeVariants = cva(\"inline-flex items-center rounded-md border border-border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\", {\n  defaultVariants: {\n    variant: \"default\",\n  },\n  variants: {\n    variant: {\n      default: \"border-transparent bg-accent hover:bg-accent text-primary-foreground shadow\",\n      destructive: \"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive-hover\",\n      outline: \"text-foreground\",\n      secondary: \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n    },\n  },\n});\n\nexport type BadgeVariants = VariantProps<typeof badgeVariants>;\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/badge/index.ts",
    "content": "export * from \"./badge\";\n\nexport { default as Badge } from \"./Badge.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/breadcrumb/Breadcrumb.vue",
    "content": "<script lang=\"ts\" setup>\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <nav :class=\"props.class\" aria-label=\"breadcrumb\" role=\"navigation\">\n    <slot></slot>\n  </nav>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/breadcrumb/BreadcrumbEllipsis.vue",
    "content": "<script lang=\"ts\" setup>\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { MoreHorizontal } from \"lucide-vue-next\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <span :class=\"cn('flex h-9 w-9 items-center justify-center', props.class)\" aria-hidden=\"true\" role=\"presentation\">\n    <slot>\n      <MoreHorizontal class=\"h-4 w-4\" />\n    </slot>\n    <span class=\"sr-only\">More</span>\n  </span>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/breadcrumb/BreadcrumbItem.vue",
    "content": "<script lang=\"ts\" setup>\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <li :class=\"cn('hover:text-foreground inline-flex items-center gap-1.5', props.class)\">\n    <slot></slot>\n  </li>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/breadcrumb/BreadcrumbLink.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { PrimitiveProps } from \"radix-vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Primitive } from \"radix-vue\";\n\nconst props = withDefaults(defineProps<PrimitiveProps & { class?: any }>(), {\n  as: \"a\",\n});\n</script>\n\n<template>\n  <Primitive :as=\"as\" :as-child=\"asChild\" :class=\"cn('hover:text-foreground transition-colors', props.class)\">\n    <slot></slot>\n  </Primitive>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/breadcrumb/BreadcrumbList.vue",
    "content": "<script lang=\"ts\" setup>\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <ol :class=\"cn('text-muted-foreground flex flex-wrap items-center gap-1.5 break-words text-sm sm:gap-2.5', props.class)\">\n    <slot></slot>\n  </ol>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/breadcrumb/BreadcrumbPage.vue",
    "content": "<script lang=\"ts\" setup>\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <span :class=\"cn('text-foreground font-normal', props.class)\" aria-current=\"page\" aria-disabled=\"true\" role=\"link\">\n    <slot></slot>\n  </span>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/breadcrumb/BreadcrumbSeparator.vue",
    "content": "<script lang=\"ts\" setup>\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ChevronRight } from \"lucide-vue-next\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <li :class=\"cn('[&>svg]:size-3.5', props.class)\" aria-hidden=\"true\" role=\"presentation\">\n    <slot>\n      <ChevronRight />\n    </slot>\n  </li>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/breadcrumb/index.ts",
    "content": "export { default as Breadcrumb } from \"./Breadcrumb.vue\";\nexport { default as BreadcrumbEllipsis } from \"./BreadcrumbEllipsis.vue\";\nexport { default as BreadcrumbItem } from \"./BreadcrumbItem.vue\";\nexport { default as BreadcrumbLink } from \"./BreadcrumbLink.vue\";\nexport { default as BreadcrumbList } from \"./BreadcrumbList.vue\";\nexport { default as BreadcrumbPage } from \"./BreadcrumbPage.vue\";\nexport { default as BreadcrumbSeparator } from \"./BreadcrumbSeparator.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/button/Button.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PrimitiveProps } from \"radix-vue\";\n\nimport type { ButtonVariants, ButtonVariantSize } from \"./types\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Primitive } from \"radix-vue\";\n\nimport { buttonVariants } from \"./button\";\n\ninterface Props extends PrimitiveProps {\n  class?: any;\n  size?: ButtonVariantSize;\n  variant?: ButtonVariants;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  as: \"button\",\n  class: \"\",\n});\n</script>\n\n<template>\n  <Primitive :as=\"as\" :as-child=\"asChild\" :class=\"cn(buttonVariants({ variant, size }), props.class)\">\n    <slot></slot>\n  </Primitive>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/button/button.ts",
    "content": "import { cva } from \"class-variance-authority\";\n\nexport const buttonVariants = cva(\n  \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:cursor-not-allowed  disabled:opacity-50\",\n  {\n    defaultVariants: {\n      size: \"default\",\n      variant: \"default\",\n    },\n    variants: {\n      size: {\n        default: \"h-9 px-4 py-2\",\n        icon: \"h-8 w-8 rounded-sm px-1 text-lg\",\n        lg: \"h-10 rounded-md px-4\",\n        sm: \"h-8 rounded-md px-2 text-xs\",\n        xs: \"h-8 w-8 rounded-sm px-1 text-xs\",\n      },\n      variant: {\n        default: \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n        destructive: \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive-hover\",\n        ghost: \"hover:bg-accent hover:text-accent-foreground\",\n        heavy: \"hover:bg-heavy hover:text-heavy-foreground\",\n        icon: \"hover:bg-accent hover:text-accent-foreground text-foreground/80\",\n        link: \"text-primary underline-offset-4 hover:underline\",\n        outline: \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n        secondary: \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n      },\n    },\n  }\n);\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/button/index.ts",
    "content": "export * from \"./button\";\n\nexport { default as Button } from \"./Button.vue\";\n\nexport type * from \"./types\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/button/types.ts",
    "content": "export type ButtonVariantSize = \"default\" | \"icon\" | \"lg\" | \"sm\" | \"xs\" | null | undefined;\n\nexport type ButtonVariants = \"default\" | \"destructive\" | \"ghost\" | \"heavy\" | \"icon\" | \"link\" | \"outline\" | \"secondary\" | null | undefined;\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/card/Card.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <div :class=\"cn('bg-card text-card-foreground border-border rounded-xl border', props.class)\">\n    <slot></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/card/CardContent.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <div :class=\"cn('p-6 pt-0', props.class)\">\n    <slot></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/card/CardDescription.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <p :class=\"cn('text-muted-foreground text-sm', props.class)\">\n    <slot></slot>\n  </p>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/card/CardFooter.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <div :class=\"cn('flex items-center p-6 pt-0', props.class)\">\n    <slot></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/card/CardHeader.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <div :class=\"cn('flex flex-col gap-y-1.5 p-5', props.class)\">\n    <slot></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/card/CardTitle.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <h3 :class=\"cn('font-semibold leading-none tracking-tight', props.class)\">\n    <slot></slot>\n  </h3>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/card/index.ts",
    "content": "export { default as Card } from \"./Card.vue\";\nexport { default as CardContent } from \"./CardContent.vue\";\nexport { default as CardDescription } from \"./CardDescription.vue\";\nexport { default as CardFooter } from \"./CardFooter.vue\";\nexport { default as CardHeader } from \"./CardHeader.vue\";\nexport { default as CardTitle } from \"./CardTitle.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/checkbox/Checkbox.vue",
    "content": "<script setup lang=\"ts\">\nimport type { CheckboxRootEmits, CheckboxRootProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Check } from \"lucide-vue-next\";\nimport { CheckboxIndicator, CheckboxRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<CheckboxRootProps & { class?: any }>();\nconst emits = defineEmits<CheckboxRootEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <CheckboxRoot\n    v-bind=\"forwarded\"\n    :class=\"\n      cn(\n        'focus-visible:ring-ring data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground border-border peer h-4 w-4 shrink-0 rounded-sm border focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50',\n        props.class\n      )\n    \"\n  >\n    <CheckboxIndicator class=\"flex h-full w-full items-center justify-center text-current\">\n      <slot>\n        <Check class=\"h-4 w-4\" />\n      </slot>\n    </CheckboxIndicator>\n  </CheckboxRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/checkbox/index.ts",
    "content": "export { default as Checkbox } from \"./Checkbox.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenu.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuRootEmits, ContextMenuRootProps } from \"radix-vue\";\n\nimport { ContextMenuRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = withDefaults(defineProps<ContextMenuRootProps>(), {\n  modal: false,\n});\nconst emits = defineEmits<ContextMenuRootEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <ContextMenuRoot v-bind=\"forwarded\">\n    <slot></slot>\n  </ContextMenuRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuCheckboxItem.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuCheckboxItemEmits, ContextMenuCheckboxItemProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Check } from \"lucide-vue-next\";\nimport { ContextMenuCheckboxItem, ContextMenuItemIndicator, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<ContextMenuCheckboxItemProps & { class?: any }>();\nconst emits = defineEmits<ContextMenuCheckboxItemEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <ContextMenuCheckboxItem\n    v-bind=\"forwarded\"\n    :class=\"\n      cn(\n        'focus:bg-accent focus:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n        props.class\n      )\n    \"\n  >\n    <span class=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <ContextMenuItemIndicator>\n        <Check class=\"h-4 w-4\" />\n      </ContextMenuItemIndicator>\n    </span>\n    <slot></slot>\n  </ContextMenuCheckboxItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuContent.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuContentEmits, ContextMenuContentProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ContextMenuContent, ContextMenuPortal, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<ContextMenuContentProps & { class?: any }>();\nconst emits = defineEmits<ContextMenuContentEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <ContextMenuPortal>\n    <ContextMenuContent\n      v-bind=\"forwarded\"\n      :class=\"\n        cn(\n          'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 border-border z-popup min-w-32 overflow-hidden rounded-md border p-1 shadow-md',\n          props.class\n        )\n      \"\n    >\n      <slot></slot>\n    </ContextMenuContent>\n  </ContextMenuPortal>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuGroup.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuGroupProps } from \"radix-vue\";\n\nimport { ContextMenuGroup } from \"radix-vue\";\n\nconst props = defineProps<ContextMenuGroupProps>();\n</script>\n\n<template>\n  <ContextMenuGroup v-bind=\"props\">\n    <slot></slot>\n  </ContextMenuGroup>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuItem.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuItemEmits, ContextMenuItemProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ContextMenuItem, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<ContextMenuItemProps & { class?: any; inset?: boolean }>();\nconst emits = defineEmits<ContextMenuItemEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <ContextMenuItem\n    v-bind=\"forwarded\"\n    :class=\"\n      cn(\n        'focus:bg-accent focus:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n        inset && 'pl-8',\n        props.class\n      )\n    \"\n  >\n    <slot></slot>\n  </ContextMenuItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuLabel.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuLabelProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ContextMenuLabel } from \"radix-vue\";\n\nconst props = defineProps<ContextMenuLabelProps & { class?: any; inset?: boolean }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <ContextMenuLabel v-bind=\"delegatedProps\" :class=\"cn('text-foreground px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', props.class)\">\n    <slot></slot>\n  </ContextMenuLabel>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuPortal.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuPortalProps } from \"radix-vue\";\n\nimport { ContextMenuPortal } from \"radix-vue\";\n\nconst props = defineProps<ContextMenuPortalProps>();\n</script>\n\n<template>\n  <ContextMenuPortal v-bind=\"props\">\n    <slot></slot>\n  </ContextMenuPortal>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuRadioGroup.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuRadioGroupEmits, ContextMenuRadioGroupProps } from \"radix-vue\";\n\nimport { ContextMenuRadioGroup, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<ContextMenuRadioGroupProps>();\nconst emits = defineEmits<ContextMenuRadioGroupEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <ContextMenuRadioGroup v-bind=\"forwarded\">\n    <slot></slot>\n  </ContextMenuRadioGroup>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuRadioItem.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuRadioItemEmits, ContextMenuRadioItemProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Circle } from \"lucide-vue-next\";\nimport { ContextMenuItemIndicator, ContextMenuRadioItem, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<ContextMenuRadioItemProps & { class?: any }>();\nconst emits = defineEmits<ContextMenuRadioItemEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <ContextMenuRadioItem\n    v-bind=\"forwarded\"\n    :class=\"\n      cn(\n        'focus:bg-accent focus:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n        props.class\n      )\n    \"\n  >\n    <span class=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <ContextMenuItemIndicator>\n        <Circle class=\"h-2 w-2 fill-current\" />\n      </ContextMenuItemIndicator>\n    </span>\n    <slot></slot>\n  </ContextMenuRadioItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuSeparator.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuSeparatorProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ContextMenuSeparator } from \"radix-vue\";\n\nconst props = defineProps<ContextMenuSeparatorProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <ContextMenuSeparator v-bind=\"delegatedProps\" :class=\"cn('bg-border -mx-1 my-1 h-px', props.class)\" />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuShortcut.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <span :class=\"cn('text-muted-foreground ml-auto text-xs tracking-widest', props.class)\">\n    <slot></slot>\n  </span>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuSub.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuSubEmits, ContextMenuSubProps } from \"radix-vue\";\n\nimport { ContextMenuSub, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<ContextMenuSubProps>();\nconst emits = defineEmits<ContextMenuSubEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <ContextMenuSub v-bind=\"forwarded\">\n    <slot></slot>\n  </ContextMenuSub>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuSubContent.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuSubContentEmits, DropdownMenuSubContentProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ContextMenuSubContent, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<DropdownMenuSubContentProps & { class?: any }>();\nconst emits = defineEmits<DropdownMenuSubContentEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <ContextMenuSubContent\n    v-bind=\"forwarded\"\n    :class=\"\n      cn(\n        'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 border-border z-50 min-w-32 overflow-hidden rounded-md border p-1 shadow-lg',\n        props.class\n      )\n    \"\n  >\n    <slot></slot>\n  </ContextMenuSubContent>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuSubTrigger.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuSubTriggerProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ChevronRight } from \"lucide-vue-next\";\nimport { ContextMenuSubTrigger, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<\n  ContextMenuSubTriggerProps & {\n    class?: any;\n    inset?: boolean;\n  }\n>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <ContextMenuSubTrigger\n    v-bind=\"forwardedProps\"\n    :class=\"\n      cn(\n        'focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none',\n        inset && 'pl-8',\n        props.class\n      )\n    \"\n  >\n    <slot></slot>\n    <ChevronRight class=\"ml-auto h-4 w-4\" />\n  </ContextMenuSubTrigger>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/ContextMenuTrigger.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ContextMenuTriggerProps } from \"radix-vue\";\n\nimport { ContextMenuTrigger, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<ContextMenuTriggerProps>();\n\nconst forwardedProps = useForwardProps(props);\n</script>\n\n<template>\n  <ContextMenuTrigger v-bind=\"forwardedProps\">\n    <slot></slot>\n  </ContextMenuTrigger>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/context-menu/index.ts",
    "content": "export { default as ContextMenu } from \"./ContextMenu.vue\";\nexport { default as ContextMenuCheckboxItem } from \"./ContextMenuCheckboxItem.vue\";\nexport { default as ContextMenuContent } from \"./ContextMenuContent.vue\";\nexport { default as ContextMenuGroup } from \"./ContextMenuGroup.vue\";\nexport { default as ContextMenuItem } from \"./ContextMenuItem.vue\";\nexport { default as ContextMenuLabel } from \"./ContextMenuLabel.vue\";\nexport { default as ContextMenuRadioGroup } from \"./ContextMenuRadioGroup.vue\";\nexport { default as ContextMenuRadioItem } from \"./ContextMenuRadioItem.vue\";\nexport { default as ContextMenuSeparator } from \"./ContextMenuSeparator.vue\";\nexport { default as ContextMenuShortcut } from \"./ContextMenuShortcut.vue\";\nexport { default as ContextMenuSub } from \"./ContextMenuSub.vue\";\nexport { default as ContextMenuSubContent } from \"./ContextMenuSubContent.vue\";\nexport { default as ContextMenuSubTrigger } from \"./ContextMenuSubTrigger.vue\";\nexport { default as ContextMenuTrigger } from \"./ContextMenuTrigger.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dialog/Dialog.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DialogRootEmits, DialogRootProps } from \"radix-vue\";\n\nimport { DialogRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<DialogRootProps>();\nconst emits = defineEmits<DialogRootEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <DialogRoot v-bind=\"forwarded\">\n    <slot></slot>\n  </DialogRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dialog/DialogClose.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DialogCloseProps } from \"radix-vue\";\n\nimport { DialogClose } from \"radix-vue\";\n\nconst props = defineProps<DialogCloseProps>();\n</script>\n\n<template>\n  <DialogClose v-bind=\"props\">\n    <slot></slot>\n  </DialogClose>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dialog/DialogContent.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DialogContentEmits, DialogContentProps } from \"radix-vue\";\n\nimport type { ClassType } from \"/@/vben/typings\";\n\nimport { computed, ref } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { X } from \"lucide-vue-next\";\nimport { DialogClose, DialogContent, DialogPortal, useForwardPropsEmits } from \"radix-vue\";\n\nimport DialogOverlay from \"./DialogOverlay.vue\";\n\nconst props = withDefaults(\n  defineProps<\n    DialogContentProps & {\n      appendTo?: HTMLElement | string;\n      class?: ClassType;\n      closeClass?: ClassType;\n      modal?: boolean;\n      open?: boolean;\n      overlayBlur?: number;\n      showClose?: boolean;\n      zIndex?: number;\n    }\n  >(),\n  { appendTo: \"body\", showClose: true }\n);\nconst emits = defineEmits<DialogContentEmits & { close: []; closed: []; opened: [] }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, modal: _modal, open: _open, showClose: __, ...delegated } = props;\n\n  return delegated;\n});\n\nfunction isAppendToBody() {\n  return props.appendTo === \"body\" || props.appendTo === document.body || !props.appendTo;\n}\n\nconst position = computed(() => {\n  return isAppendToBody() ? \"fixed\" : \"absolute\";\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n\nconst contentRef = ref<InstanceType<typeof DialogContent> | null>(null);\nfunction onAnimationEnd(event: AnimationEvent) {\n  // 只有在 contentRef 的动画结束时才触发 opened/closed 事件\n  if (event.target === contentRef.value?.$el) {\n    if (props.open) {\n      emits(\"opened\");\n    } else {\n      emits(\"closed\");\n    }\n  }\n}\ndefineExpose({\n  getContentRef: () => contentRef.value,\n});\n</script>\n\n<template>\n  <DialogPortal :to=\"appendTo\">\n    <Transition name=\"fade\">\n      <DialogOverlay\n        v-if=\"open && modal\"\n        :style=\"{\n          ...(zIndex ? { zIndex } : {}),\n          position,\n          backdropFilter: overlayBlur && overlayBlur > 0 ? `blur(${overlayBlur}px)` : 'none',\n        }\"\n        @click=\"() => emits('close')\"\n      />\n    </Transition>\n    <DialogContent\n      ref=\"contentRef\"\n      :style=\"{ ...(zIndex ? { zIndex } : {}), position }\"\n      v-bind=\"forwarded\"\n      :class=\"\n        cn(\n          'z-popup bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-top-[48%] w-full p-6 shadow-lg outline-none sm:rounded-xl',\n          props.class\n        )\n      \"\n      @animationend=\"onAnimationEnd\"\n    >\n      <slot></slot>\n\n      <DialogClose\n        v-if=\"showClose\"\n        :class=\"\n          cn(\n            'data-[state=open]:bg-accent data-[state=open]:text-muted-foreground hover:bg-accent hover:text-accent-foreground text-foreground/80 flex-center absolute right-3 top-3 h-6 w-6 rounded-full px-1 text-lg opacity-70 transition-opacity hover:opacity-100 focus:outline-none disabled:pointer-events-none',\n            props.closeClass\n          )\n        \"\n        @click=\"() => emits('close')\"\n      >\n        <X class=\"h-4 w-4\" />\n      </DialogClose>\n    </DialogContent>\n  </DialogPortal>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dialog/DialogDescription.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DialogDescriptionProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { DialogDescription, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<DialogDescriptionProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <DialogDescription v-bind=\"forwardedProps\" :class=\"cn('text-muted-foreground text-sm', props.class)\">\n    <slot></slot>\n  </DialogDescription>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dialog/DialogFooter.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{ class?: any }>();\n</script>\n\n<template>\n  <div :class=\"cn('flex flex-row flex-col-reverse justify-end gap-x-2', props.class)\">\n    <slot></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dialog/DialogHeader.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <div :class=\"cn('flex flex-col gap-y-1.5 text-center sm:text-left', props.class)\">\n    <slot></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dialog/DialogOverlay.vue",
    "content": "<script setup lang=\"ts\">\nimport { inject } from \"vue\";\n\nimport { useScrollLock } from \"/@/vben/composables\";\n\nuseScrollLock();\nconst id = inject(\"DISMISSABLE_MODAL_ID\");\n</script>\n<template>\n  <div :data-dismissable-modal=\"id\" class=\"bg-overlay z-popup inset-0\"></div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dialog/DialogScrollContent.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DialogContentEmits, DialogContentProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { X } from \"lucide-vue-next\";\nimport { DialogClose, DialogContent, DialogOverlay, DialogPortal, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = withDefaults(defineProps<DialogContentProps & { class?: any; zIndex?: number }>(), { zIndex: 1000 });\nconst emits = defineEmits<DialogContentEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <DialogPortal>\n    <DialogOverlay\n      :style=\"{ zIndex }\"\n      class=\"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 border-border absolute inset-0 grid place-items-center overflow-y-auto border bg-black/80\"\n    >\n      <DialogContent\n        :class=\"cn('border-border bg-background relative z-50 my-8 grid w-full max-w-lg gap-4 border p-6 shadow-lg duration-200 sm:rounded-lg md:w-full', props.class)\"\n        :style=\"{ zIndex }\"\n        v-bind=\"forwarded\"\n        @pointer-down-outside=\"\n          event => {\n            const originalEvent = event.detail.originalEvent;\n            const target = originalEvent.target as HTMLElement;\n            if (originalEvent.offsetX > target.clientWidth || originalEvent.offsetY > target.clientHeight) {\n              event.preventDefault();\n            }\n          }\n        \"\n      >\n        <slot></slot>\n\n        <DialogClose class=\"hover:bg-secondary absolute right-4 top-4 rounded-md p-0.5 transition-colors\">\n          <X class=\"h-4 w-4\" />\n          <span class=\"sr-only\">Close</span>\n        </DialogClose>\n      </DialogContent>\n    </DialogOverlay>\n  </DialogPortal>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dialog/DialogTitle.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DialogTitleProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { DialogTitle, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<DialogTitleProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <DialogTitle v-bind=\"forwardedProps\" :class=\"cn('text-lg font-semibold leading-none tracking-tight', props.class)\">\n    <slot></slot>\n  </DialogTitle>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dialog/DialogTrigger.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DialogTriggerProps } from \"radix-vue\";\n\nimport { DialogTrigger } from \"radix-vue\";\n\nconst props = defineProps<DialogTriggerProps>();\n</script>\n\n<template>\n  <DialogTrigger v-bind=\"props\">\n    <slot></slot>\n  </DialogTrigger>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dialog/index.ts",
    "content": "export { default as Dialog } from \"./Dialog.vue\";\nexport { default as DialogClose } from \"./DialogClose.vue\";\nexport { default as DialogContent } from \"./DialogContent.vue\";\nexport { default as DialogDescription } from \"./DialogDescription.vue\";\nexport { default as DialogFooter } from \"./DialogFooter.vue\";\nexport { default as DialogHeader } from \"./DialogHeader.vue\";\nexport { default as DialogScrollContent } from \"./DialogScrollContent.vue\";\nexport { default as DialogTitle } from \"./DialogTitle.vue\";\nexport { default as DialogTrigger } from \"./DialogTrigger.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenu.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuRootEmits, DropdownMenuRootProps } from \"radix-vue\";\n\nimport { DropdownMenuRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = withDefaults(defineProps<DropdownMenuRootProps>(), {\n  modal: false,\n});\nconst emits = defineEmits<DropdownMenuRootEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <DropdownMenuRoot v-bind=\"forwarded\">\n    <slot></slot>\n  </DropdownMenuRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenuCheckboxItem.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuCheckboxItemEmits, DropdownMenuCheckboxItemProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Check } from \"lucide-vue-next\";\nimport { DropdownMenuCheckboxItem, DropdownMenuItemIndicator, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<DropdownMenuCheckboxItemProps & { class?: any }>();\nconst emits = defineEmits<DropdownMenuCheckboxItemEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <DropdownMenuCheckboxItem\n    v-bind=\"forwarded\"\n    :class=\"\n      cn(\n        'focus:bg-accent focus:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n        props.class\n      )\n    \"\n  >\n    <span class=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <DropdownMenuItemIndicator>\n        <Check class=\"h-4 w-4\" />\n      </DropdownMenuItemIndicator>\n    </span>\n    <slot></slot>\n  </DropdownMenuCheckboxItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenuContent.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuContentEmits, DropdownMenuContentProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { DropdownMenuContent, DropdownMenuPortal, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = withDefaults(defineProps<DropdownMenuContentProps & { class?: any }>(), {\n  sideOffset: 4,\n});\nconst emits = defineEmits<DropdownMenuContentEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <DropdownMenuPortal>\n    <DropdownMenuContent\n      v-bind=\"forwarded\"\n      :class=\"\n        cn(\n          'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 border-border z-popup min-w-32 overflow-hidden rounded-md border p-1 shadow-md',\n          props.class\n        )\n      \"\n    >\n      <slot></slot>\n    </DropdownMenuContent>\n  </DropdownMenuPortal>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenuGroup.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuGroupProps } from \"radix-vue\";\n\nimport { DropdownMenuGroup } from \"radix-vue\";\n\nconst props = defineProps<DropdownMenuGroupProps>();\n</script>\n\n<template>\n  <DropdownMenuGroup v-bind=\"props\">\n    <slot></slot>\n  </DropdownMenuGroup>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenuItem.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuItemProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { DropdownMenuItem, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<DropdownMenuItemProps & { class?: any; inset?: boolean }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <DropdownMenuItem\n    v-bind=\"forwardedProps\"\n    :class=\"\n      cn(\n        'focus:bg-accent focus:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n        inset && 'pl-8',\n        props.class\n      )\n    \"\n  >\n    <slot></slot>\n  </DropdownMenuItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenuLabel.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuLabelProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { DropdownMenuLabel, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<DropdownMenuLabelProps & { class?: any; inset?: boolean }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <DropdownMenuLabel v-bind=\"forwardedProps\" :class=\"cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', props.class)\">\n    <slot></slot>\n  </DropdownMenuLabel>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenuRadioGroup.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuRadioGroupEmits, DropdownMenuRadioGroupProps } from \"radix-vue\";\n\nimport { DropdownMenuRadioGroup, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<DropdownMenuRadioGroupProps>();\nconst emits = defineEmits<DropdownMenuRadioGroupEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <DropdownMenuRadioGroup v-bind=\"forwarded\">\n    <slot></slot>\n  </DropdownMenuRadioGroup>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenuRadioItem.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuRadioItemEmits, DropdownMenuRadioItemProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Circle } from \"lucide-vue-next\";\nimport { DropdownMenuItemIndicator, DropdownMenuRadioItem, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<DropdownMenuRadioItemProps & { class?: any }>();\n\nconst emits = defineEmits<DropdownMenuRadioItemEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <DropdownMenuRadioItem\n    v-bind=\"forwarded\"\n    :class=\"\n      cn(\n        'focus:bg-accent focus:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n        props.class\n      )\n    \"\n  >\n    <span class=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <DropdownMenuItemIndicator>\n        <Circle class=\"h-2 w-2 fill-current\" />\n      </DropdownMenuItemIndicator>\n    </span>\n    <slot></slot>\n  </DropdownMenuRadioItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenuSeparator.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuSeparatorProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { DropdownMenuSeparator } from \"radix-vue\";\n\nconst props = defineProps<\n  DropdownMenuSeparatorProps & {\n    class?: any;\n  }\n>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <DropdownMenuSeparator v-bind=\"delegatedProps\" :class=\"cn('bg-border -mx-1 my-1 h-px', props.class)\" />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenuShortcut.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <span :class=\"cn('ml-auto text-xs tracking-widest opacity-60', props.class)\">\n    <slot></slot>\n  </span>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenuSub.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuSubEmits, DropdownMenuSubProps } from \"radix-vue\";\n\nimport { DropdownMenuSub, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<DropdownMenuSubProps>();\nconst emits = defineEmits<DropdownMenuSubEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <DropdownMenuSub v-bind=\"forwarded\">\n    <slot></slot>\n  </DropdownMenuSub>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenuSubContent.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuSubContentEmits, DropdownMenuSubContentProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { DropdownMenuSubContent, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<DropdownMenuSubContentProps & { class?: any }>();\nconst emits = defineEmits<DropdownMenuSubContentEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <DropdownMenuSubContent\n    v-bind=\"forwarded\"\n    :class=\"\n      cn(\n        'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 border-border z-50 min-w-32 overflow-hidden rounded-md border p-1 shadow-lg',\n        props.class\n      )\n    \"\n  >\n    <slot></slot>\n  </DropdownMenuSubContent>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenuSubTrigger.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuSubTriggerProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ChevronRight } from \"lucide-vue-next\";\nimport { DropdownMenuSubTrigger, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<DropdownMenuSubTriggerProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <DropdownMenuSubTrigger v-bind=\"forwardedProps\" :class=\"cn('focus:bg-accent data-[state=open]:bg-accent flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none', props.class)\">\n    <slot></slot>\n    <ChevronRight class=\"ml-auto h-4 w-4\" />\n  </DropdownMenuSubTrigger>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/DropdownMenuTrigger.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DropdownMenuTriggerProps } from \"radix-vue\";\n\nimport { DropdownMenuTrigger, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<DropdownMenuTriggerProps>();\n\nconst forwardedProps = useForwardProps(props);\n</script>\n\n<template>\n  <DropdownMenuTrigger class=\"outline-none\" v-bind=\"forwardedProps\">\n    <slot></slot>\n  </DropdownMenuTrigger>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/dropdown-menu/index.ts",
    "content": "export { default as DropdownMenu } from \"./DropdownMenu.vue\";\n\nexport { default as DropdownMenuCheckboxItem } from \"./DropdownMenuCheckboxItem.vue\";\nexport { default as DropdownMenuContent } from \"./DropdownMenuContent.vue\";\nexport { default as DropdownMenuGroup } from \"./DropdownMenuGroup.vue\";\nexport { default as DropdownMenuItem } from \"./DropdownMenuItem.vue\";\nexport { default as DropdownMenuLabel } from \"./DropdownMenuLabel.vue\";\nexport { default as DropdownMenuRadioGroup } from \"./DropdownMenuRadioGroup.vue\";\nexport { default as DropdownMenuRadioItem } from \"./DropdownMenuRadioItem.vue\";\nexport { default as DropdownMenuSeparator } from \"./DropdownMenuSeparator.vue\";\nexport { default as DropdownMenuShortcut } from \"./DropdownMenuShortcut.vue\";\nexport { default as DropdownMenuSub } from \"./DropdownMenuSub.vue\";\nexport { default as DropdownMenuSubContent } from \"./DropdownMenuSubContent.vue\";\nexport { default as DropdownMenuSubTrigger } from \"./DropdownMenuSubTrigger.vue\";\nexport { default as DropdownMenuTrigger } from \"./DropdownMenuTrigger.vue\";\nexport { DropdownMenuPortal } from \"radix-vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/form/FormControl.vue",
    "content": "<script lang=\"ts\" setup>\nimport { Slot } from \"radix-vue\";\n\nimport { useFormField } from \"./useFormField\";\n\nconst { error, formDescriptionId, formItemId, formMessageId } = useFormField();\n</script>\n\n<template>\n  <Slot :id=\"formItemId\" :aria-describedby=\"!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`\" :aria-invalid=\"!!error\">\n    <slot></slot>\n  </Slot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/form/FormDescription.vue",
    "content": "<script lang=\"ts\" setup>\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { useFormField } from \"./useFormField\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n\nconst { formDescriptionId } = useFormField();\n</script>\n\n<template>\n  <p :id=\"formDescriptionId\" :class=\"cn('text-muted-foreground text-sm', props.class)\">\n    <slot></slot>\n  </p>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/form/FormItem.vue",
    "content": "<script lang=\"ts\" setup>\nimport { provide, useId } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { FORM_ITEM_INJECTION_KEY } from \"./injectionKeys\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n\nconst id = useId() as string;\nprovide(FORM_ITEM_INJECTION_KEY, id);\n</script>\n\n<template>\n  <div :class=\"cn(props.class)\">\n    <slot></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/form/FormLabel.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { LabelProps } from \"radix-vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Label } from \"../label\";\nimport { useFormField } from \"./useFormField\";\n\nconst props = defineProps<LabelProps & { class?: any }>();\n\nconst { formItemId } = useFormField();\n</script>\n\n<template>\n  <Label :class=\"cn(props.class)\" :for=\"formItemId\">\n    <slot></slot>\n  </Label>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/form/FormMessage.vue",
    "content": "<script lang=\"ts\" setup>\nimport { toValue } from \"vue\";\n\nimport { ErrorMessage } from \"vee-validate\";\n\nimport { useFormField } from \"./useFormField\";\n\nconst { formMessageId, name } = useFormField();\n</script>\n\n<template>\n  <ErrorMessage :id=\"formMessageId\" :name=\"toValue(name)\" as=\"p\" class=\"text-destructive text-[0.8rem]\" />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/form/index.ts",
    "content": "export { default as FormControl } from \"./FormControl.vue\";\nexport { default as FormDescription } from \"./FormDescription.vue\";\nexport { default as FormItem } from \"./FormItem.vue\";\nexport { default as FormLabel } from \"./FormLabel.vue\";\nexport { default as FormMessage } from \"./FormMessage.vue\";\nexport { FORM_ITEM_INJECTION_KEY } from \"./injectionKeys\";\nexport { Form, Field as FormField, FieldArray as FormFieldArray } from \"vee-validate\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/form/injectionKeys.ts",
    "content": "import type { InjectionKey } from \"vue\";\n\n// eslint-disable-next-line symbol-description\nexport const FORM_ITEM_INJECTION_KEY = Symbol() as InjectionKey<string>;\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/form/useFormField.ts",
    "content": "import { inject } from \"vue\";\n\nimport { FieldContextKey, useFieldError, useIsFieldDirty, useIsFieldTouched, useIsFieldValid } from \"vee-validate\";\n\nimport { FORM_ITEM_INJECTION_KEY } from \"./injectionKeys\";\n\nexport function useFormField() {\n  const fieldContext = inject(FieldContextKey);\n  const fieldItemContext = inject(FORM_ITEM_INJECTION_KEY);\n\n  if (!fieldContext) throw new Error(\"useFormField should be used within <FormField>\");\n\n  const { name } = fieldContext;\n  const id = fieldItemContext;\n\n  const fieldState = {\n    error: useFieldError(name),\n    isDirty: useIsFieldDirty(name),\n    isTouched: useIsFieldTouched(name),\n    valid: useIsFieldValid(name),\n  };\n\n  return {\n    formDescriptionId: `${id}-form-item-description`,\n    formItemId: `${id}-form-item`,\n    formMessageId: `${id}-form-item-message`,\n    id,\n    name,\n    ...fieldState,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/hover-card/HoverCard.vue",
    "content": "<script setup lang=\"ts\">\nimport type { HoverCardRootEmits, HoverCardRootProps } from \"radix-vue\";\n\nimport { HoverCardRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<HoverCardRootProps>();\nconst emits = defineEmits<HoverCardRootEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <HoverCardRoot v-bind=\"forwarded\">\n    <slot></slot>\n  </HoverCardRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/hover-card/HoverCardContent.vue",
    "content": "<script setup lang=\"ts\">\nimport type { HoverCardContentProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { HoverCardContent, HoverCardPortal, useForwardProps } from \"radix-vue\";\n\nconst props = withDefaults(defineProps<HoverCardContentProps & { class?: any }>(), {\n  sideOffset: 4,\n});\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <HoverCardPortal>\n    <HoverCardContent\n      v-bind=\"forwardedProps\"\n      :class=\"\n        cn(\n          'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 border-border z-popup w-64 rounded-md border p-4 shadow-md outline-none',\n          props.class\n        )\n      \"\n    >\n      <slot></slot>\n    </HoverCardContent>\n  </HoverCardPortal>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/hover-card/HoverCardTrigger.vue",
    "content": "<script setup lang=\"ts\">\nimport type { HoverCardTriggerProps } from \"radix-vue\";\n\nimport { HoverCardTrigger } from \"radix-vue\";\n\nconst props = defineProps<HoverCardTriggerProps>();\n</script>\n\n<template>\n  <HoverCardTrigger v-bind=\"props\">\n    <slot></slot>\n  </HoverCardTrigger>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/hover-card/index.ts",
    "content": "export { default as HoverCard } from \"./HoverCard.vue\";\nexport { default as HoverCardContent } from \"./HoverCardContent.vue\";\nexport { default as HoverCardTrigger } from \"./HoverCardTrigger.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/index.ts",
    "content": "export * from \"./accordion\";\nexport * from \"./avatar\";\nexport * from \"./badge\";\nexport * from \"./breadcrumb\";\nexport * from \"./button\";\nexport * from \"./card\";\nexport * from \"./checkbox\";\nexport * from \"./dialog\";\nexport * from \"./dropdown-menu\";\nexport * from \"./form\";\nexport * from \"./hover-card\";\nexport * from \"./input\";\nexport * from \"./label\";\nexport * from \"./number-field\";\nexport * from \"./pagination\";\nexport * from \"./pin-input\";\nexport * from \"./popover\";\nexport * from \"./radio-group\";\nexport * from \"./resizable\";\nexport * from \"./scroll-area\";\nexport * from \"./select\";\nexport * from \"./separator\";\nexport * from \"./sheet\";\nexport * from \"./switch\";\nexport * from \"./tabs\";\nexport * from \"./textarea\";\nexport * from \"./toggle\";\nexport * from \"./toggle-group\";\nexport * from \"./tooltip\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/input/Input.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { useVModel } from \"@vueuse/core\";\n\nconst props = defineProps<{\n  class?: any;\n  defaultValue?: number | string;\n  modelValue?: number | string;\n}>();\n\nconst emits = defineEmits<{\n  (e: \"update:modelValue\", payload: number | string): void;\n}>();\n\nconst modelValue = useVModel(props, \"modelValue\", emits, {\n  defaultValue: props.defaultValue,\n  passive: true,\n});\n</script>\n\n<template>\n  <input\n    v-model=\"modelValue\"\n    :class=\"\n      cn(\n        'border-input bg-background ring-offset-background placeholder:text-muted-foreground focus-visible:ring-ring flex h-10 w-full rounded-md border px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50',\n        props.class\n      )\n    \"\n  />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/input/index.ts",
    "content": "export { default as Input } from \"./Input.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/label/Label.vue",
    "content": "<script setup lang=\"ts\">\nimport type { LabelProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Label } from \"radix-vue\";\n\nconst props = defineProps<LabelProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <Label v-bind=\"delegatedProps\" :class=\"cn('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70', props.class)\">\n    <slot></slot>\n  </Label>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/label/index.ts",
    "content": "export { default as Label } from \"./Label.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/number-field/NumberField.vue",
    "content": "<script setup lang=\"ts\">\nimport type { NumberFieldRootEmits, NumberFieldRootProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { NumberFieldRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<NumberFieldRootProps & { class?: any }>();\nconst emits = defineEmits<NumberFieldRootEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <NumberFieldRoot v-bind=\"forwarded\" :class=\"cn('grid gap-1.5', props.class)\">\n    <slot></slot>\n  </NumberFieldRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/number-field/NumberFieldContent.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{\n  class?: any;\n}>();\n</script>\n\n<template>\n  <div :class=\"cn('relative [&>[data-slot=input]]:has-[[data-slot=decrement]]:pl-5 [&>[data-slot=input]]:has-[[data-slot=increment]]:pr-5', props.class)\">\n    <slot></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/number-field/NumberFieldDecrement.vue",
    "content": "<script setup lang=\"ts\">\nimport type { NumberFieldDecrementProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Minus } from \"lucide-vue-next\";\nimport { NumberFieldDecrement, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<NumberFieldDecrementProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <NumberFieldDecrement data-slot=\"decrement\" v-bind=\"forwarded\" :class=\"cn('absolute left-0 top-1/2 -translate-y-1/2 p-3 disabled:cursor-not-allowed disabled:opacity-20', props.class)\">\n    <slot>\n      <Minus class=\"h-4 w-4\" />\n    </slot>\n  </NumberFieldDecrement>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/number-field/NumberFieldIncrement.vue",
    "content": "<script setup lang=\"ts\">\nimport type { NumberFieldIncrementProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Plus } from \"lucide-vue-next\";\nimport { NumberFieldIncrement, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<NumberFieldIncrementProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <NumberFieldIncrement data-slot=\"increment\" v-bind=\"forwarded\" :class=\"cn('absolute right-0 top-1/2 -translate-y-1/2 p-3 disabled:cursor-not-allowed disabled:opacity-20', props.class)\">\n    <slot>\n      <Plus class=\"h-4 w-4\" />\n    </slot>\n  </NumberFieldIncrement>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/number-field/NumberFieldInput.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { NumberFieldInput } from \"radix-vue\";\n</script>\n\n<template>\n  <NumberFieldInput\n    :class=\"\n      cn(\n        'border-input placeholder:text-muted-foreground focus-visible:ring-ring flex h-9 w-full rounded-md border bg-transparent py-1 text-center text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50'\n      )\n    \"\n    data-slot=\"input\"\n  />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/number-field/index.ts",
    "content": "export { default as NumberField } from \"./NumberField.vue\";\nexport { default as NumberFieldContent } from \"./NumberFieldContent.vue\";\nexport { default as NumberFieldDecrement } from \"./NumberFieldDecrement.vue\";\nexport { default as NumberFieldIncrement } from \"./NumberFieldIncrement.vue\";\nexport { default as NumberFieldInput } from \"./NumberFieldInput.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/pagination/PaginationEllipsis.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PaginationEllipsisProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { MoreHorizontal } from \"lucide-vue-next\";\nimport { PaginationEllipsis } from \"radix-vue\";\n\nconst props = defineProps<PaginationEllipsisProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <PaginationEllipsis v-bind=\"delegatedProps\" :class=\"cn('flex size-8 items-center justify-center', props.class)\">\n    <slot>\n      <MoreHorizontal class=\"size-4\" />\n    </slot>\n  </PaginationEllipsis>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/pagination/PaginationFirst.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PaginationFirstProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ChevronsLeft } from \"lucide-vue-next\";\nimport { PaginationFirst } from \"radix-vue\";\n\nimport { Button } from \"../button\";\n\nconst props = withDefaults(defineProps<PaginationFirstProps & { class?: any }>(), {\n  asChild: true,\n});\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <PaginationFirst v-bind=\"delegatedProps\">\n    <Button :class=\"cn('size-8 p-0', props.class)\" variant=\"outline\">\n      <slot>\n        <ChevronsLeft class=\"size-4\" />\n      </slot>\n    </Button>\n  </PaginationFirst>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/pagination/PaginationLast.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PaginationLastProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ChevronsRight } from \"lucide-vue-next\";\nimport { PaginationLast } from \"radix-vue\";\n\nimport { Button } from \"../button\";\n\nconst props = withDefaults(defineProps<PaginationLastProps & { class?: any }>(), {\n  asChild: true,\n});\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <PaginationLast v-bind=\"delegatedProps\">\n    <Button :class=\"cn('size-8 p-0', props.class)\" variant=\"outline\">\n      <slot>\n        <ChevronsRight class=\"size-4\" />\n      </slot>\n    </Button>\n  </PaginationLast>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/pagination/PaginationNext.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PaginationNextProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ChevronRight } from \"lucide-vue-next\";\nimport { PaginationNext } from \"radix-vue\";\n\nimport { Button } from \"../button\";\n\nconst props = withDefaults(defineProps<PaginationNextProps & { class?: any }>(), {\n  asChild: true,\n});\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <PaginationNext v-bind=\"delegatedProps\">\n    <Button :class=\"cn('size-8 p-0', props.class)\" variant=\"outline\">\n      <slot>\n        <ChevronRight class=\"size-4\" />\n      </slot>\n    </Button>\n  </PaginationNext>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/pagination/PaginationPrev.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PaginationPrevProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ChevronLeft } from \"lucide-vue-next\";\nimport { PaginationPrev } from \"radix-vue\";\n\nimport { Button } from \"../button\";\n\nconst props = withDefaults(defineProps<PaginationPrevProps & { class?: any }>(), {\n  asChild: true,\n});\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <PaginationPrev v-bind=\"delegatedProps\">\n    <Button :class=\"cn('size-8 p-0', props.class)\" variant=\"outline\">\n      <slot>\n        <ChevronLeft class=\"size-4\" />\n      </slot>\n    </Button>\n  </PaginationPrev>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/pagination/index.ts",
    "content": "export { default as PaginationEllipsis } from \"./PaginationEllipsis.vue\";\nexport { default as PaginationFirst } from \"./PaginationFirst.vue\";\nexport { default as PaginationLast } from \"./PaginationLast.vue\";\nexport { default as PaginationNext } from \"./PaginationNext.vue\";\nexport { default as PaginationPrev } from \"./PaginationPrev.vue\";\nexport { PaginationRoot as Pagination, PaginationList, PaginationListItem } from \"radix-vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/pin-input/PinInput.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PinInputRootEmits, PinInputRootProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { PinInputRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<PinInputRootProps & { class?: any }>();\nconst emits = defineEmits<PinInputRootEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <PinInputRoot v-bind=\"forwarded\" :class=\"cn('flex items-center gap-2', props.class)\">\n    <slot></slot>\n  </PinInputRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/pin-input/PinInputGroup.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PrimitiveProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Primitive, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<PrimitiveProps & { class?: any }>();\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n  return delegated;\n});\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <Primitive v-bind=\"forwardedProps\" :class=\"cn('flex items-center', props.class)\">\n    <slot></slot>\n  </Primitive>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/pin-input/PinInputInput.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PinInputInputProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { PinInputInput, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<PinInputInputProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <PinInputInput\n    v-bind=\"forwardedProps\"\n    :class=\"\n      cn(\n        'border-input bg-background relative flex h-10 w-8 items-center justify-center border-y border-r text-center text-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md focus:relative focus:z-10 focus:outline-none focus:ring-2 md:w-10',\n        props.class\n      )\n    \"\n  />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/pin-input/PinInputSeparator.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PrimitiveProps } from \"radix-vue\";\n\nimport { Dot } from \"lucide-vue-next\";\nimport { Primitive, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<PrimitiveProps>();\nconst forwardedProps = useForwardProps(props);\n</script>\n\n<template>\n  <Primitive v-bind=\"forwardedProps\">\n    <slot>\n      <Dot />\n    </slot>\n  </Primitive>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/pin-input/index.ts",
    "content": "export { default as PinInput } from \"./PinInput.vue\";\nexport { default as PinInputGroup } from \"./PinInputGroup.vue\";\nexport { default as PinInputInput } from \"./PinInputInput.vue\";\nexport { default as PinInputSeparator } from \"./PinInputSeparator.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/popover/Popover.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PopoverRootEmits, PopoverRootProps } from \"radix-vue\";\n\nimport { PopoverRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<PopoverRootProps>();\nconst emits = defineEmits<PopoverRootEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <PopoverRoot v-bind=\"forwarded\">\n    <slot></slot>\n  </PopoverRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/popover/PopoverContent.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PopoverContentEmits, PopoverContentProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { PopoverContent, PopoverPortal, useForwardPropsEmits } from \"radix-vue\";\n\ndefineOptions({\n  inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<PopoverContentProps & { class?: any }>(), {\n  align: \"center\",\n  sideOffset: 4,\n});\nconst emits = defineEmits<PopoverContentEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <PopoverPortal>\n    <PopoverContent\n      v-bind=\"{ ...forwarded, ...$attrs }\"\n      :class=\"\n        cn(\n          'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 border-border w-72 rounded-md border p-4 shadow-md outline-none',\n          props.class\n        )\n      \"\n    >\n      <slot></slot>\n    </PopoverContent>\n  </PopoverPortal>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/popover/PopoverTrigger.vue",
    "content": "<script setup lang=\"ts\">\nimport type { PopoverTriggerProps } from \"radix-vue\";\n\nimport { PopoverTrigger } from \"radix-vue\";\n\nconst props = defineProps<PopoverTriggerProps>();\n</script>\n\n<template>\n  <PopoverTrigger v-bind=\"props\">\n    <slot></slot>\n  </PopoverTrigger>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/popover/index.ts",
    "content": "export { default as Popover } from \"./Popover.vue\";\nexport { default as PopoverContent } from \"./PopoverContent.vue\";\nexport { default as PopoverTrigger } from \"./PopoverTrigger.vue\";\nexport { PopoverAnchor } from \"radix-vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/radio-group/RadioGroup.vue",
    "content": "<script setup lang=\"ts\">\nimport type { RadioGroupRootEmits, RadioGroupRootProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { RadioGroupRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<RadioGroupRootProps & { class?: any }>();\nconst emits = defineEmits<RadioGroupRootEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <RadioGroupRoot :class=\"cn('grid gap-2', props.class)\" v-bind=\"forwarded\">\n    <slot></slot>\n  </RadioGroupRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/radio-group/RadioGroupItem.vue",
    "content": "<script setup lang=\"ts\">\nimport type { RadioGroupItemProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Circle } from \"lucide-vue-next\";\nimport { RadioGroupIndicator, RadioGroupItem, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<RadioGroupItemProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <RadioGroupItem\n    v-bind=\"forwardedProps\"\n    :class=\"cn('border-primary text-primary focus-visible:ring-ring aspect-square h-4 w-4 rounded-full border shadow focus:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50', props.class)\"\n  >\n    <RadioGroupIndicator class=\"flex items-center justify-center\">\n      <Circle class=\"h-2.5 w-2.5 fill-current text-current\" />\n    </RadioGroupIndicator>\n  </RadioGroupItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/radio-group/index.ts",
    "content": "export { default as RadioGroup } from \"./RadioGroup.vue\";\nexport { default as RadioGroupItem } from \"./RadioGroupItem.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/resizable/ResizableHandle.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SplitterResizeHandleEmits, SplitterResizeHandleProps } from \"radix-vue\";\n\nimport type { HTMLAttributes } from \"vue\";\n\nimport { computed } from \"vue\";\n\nimport { GripVertical } from \"/@/vben/icons\";\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { SplitterResizeHandle, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<\n  SplitterResizeHandleProps & {\n    class?: HTMLAttributes[\"class\"];\n    withHandle?: boolean;\n  }\n>();\nconst emits = defineEmits<SplitterResizeHandleEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <SplitterResizeHandle\n    v-bind=\"forwarded\"\n    :class=\"\n      cn(\n        'bg-border focus-visible:ring-ring relative flex w-px items-center justify-center after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-1 [&[data-orientation=vertical]>div]:rotate-90 [&[data-orientation=vertical]]:h-px [&[data-orientation=vertical]]:w-full [&[data-orientation=vertical]]:after:left-0 [&[data-orientation=vertical]]:after:h-1 [&[data-orientation=vertical]]:after:w-full [&[data-orientation=vertical]]:after:-translate-y-1/2 [&[data-orientation=vertical]]:after:translate-x-0',\n        props.class\n      )\n    \"\n  >\n    <template v-if=\"props.withHandle\">\n      <div class=\"bg-border z-10 flex h-4 w-3 items-center justify-center rounded-sm border\">\n        <GripVertical class=\"h-2.5 w-2.5\" />\n      </div>\n    </template>\n  </SplitterResizeHandle>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/resizable/ResizablePanelGroup.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SplitterGroupEmits, SplitterGroupProps } from \"radix-vue\";\n\nimport type { HTMLAttributes } from \"vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { SplitterGroup, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<SplitterGroupProps & { class?: HTMLAttributes[\"class\"] }>();\nconst emits = defineEmits<SplitterGroupEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <SplitterGroup v-bind=\"forwarded\" :class=\"cn('flex h-full w-full data-[panel-group-direction=vertical]:flex-col', props.class)\">\n    <slot></slot>\n  </SplitterGroup>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/resizable/index.ts",
    "content": "export { default as ResizableHandle } from \"./ResizableHandle.vue\";\nexport { default as ResizablePanelGroup } from \"./ResizablePanelGroup.vue\";\nexport { SplitterPanel as ResizablePanel } from \"radix-vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/scroll-area/ScrollArea.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ScrollAreaRootProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ScrollAreaCorner, ScrollAreaRoot, ScrollAreaViewport } from \"radix-vue\";\n\nimport ScrollBar from \"./ScrollBar.vue\";\n\nconst props = withDefaults(\n  defineProps<\n    ScrollAreaRootProps & {\n      class?: any;\n      onScroll?: (event: Event) => void;\n      viewportProps?: { onScroll: (event: Event) => void };\n    }\n  >(),\n  {\n    onScroll: () => {},\n  }\n);\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n  return delegated;\n});\n</script>\n\n<template>\n  <ScrollAreaRoot v-bind=\"delegatedProps\" :class=\"cn('relative overflow-hidden', props.class)\">\n    <ScrollAreaViewport as-child class=\"h-full w-full rounded-[inherit] focus:outline-none\" @scroll=\"onScroll\">\n      <slot></slot>\n    </ScrollAreaViewport>\n    <ScrollBar />\n    <ScrollAreaCorner />\n  </ScrollAreaRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/scroll-area/ScrollBar.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ScrollAreaScrollbarProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ScrollAreaScrollbar, ScrollAreaThumb } from \"radix-vue\";\n\nconst props = withDefaults(defineProps<ScrollAreaScrollbarProps & { class?: any }>(), {\n  orientation: \"vertical\",\n});\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <ScrollAreaScrollbar\n    v-bind=\"delegatedProps\"\n    :class=\"\n      cn(\n        'flex touch-none select-none transition-colors',\n        orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent p-px',\n        orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent p-px',\n        props.class\n      )\n    \"\n  >\n    <ScrollAreaThumb class=\"bg-border relative flex-1 rounded-full\" />\n  </ScrollAreaScrollbar>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/scroll-area/index.ts",
    "content": "export { default as ScrollArea } from \"./ScrollArea.vue\";\nexport { default as ScrollBar } from \"./ScrollBar.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/select/Select.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectRootEmits, SelectRootProps } from \"radix-vue\";\n\nimport { SelectRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<SelectRootProps>();\nconst emits = defineEmits<SelectRootEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <SelectRoot v-bind=\"forwarded\">\n    <slot></slot>\n  </SelectRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/select/SelectContent.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectContentEmits, SelectContentProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { SelectContent, SelectPortal, SelectViewport, useForwardPropsEmits } from \"radix-vue\";\n\nimport SelectScrollDownButton from \"./SelectScrollDownButton.vue\";\nimport SelectScrollUpButton from \"./SelectScrollUpButton.vue\";\n\ndefineOptions({\n  inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<SelectContentProps & { class?: any }>(), {\n  position: \"popper\",\n});\nconst emits = defineEmits<SelectContentEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <SelectPortal>\n    <SelectContent\n      v-bind=\"{ ...forwarded, ...$attrs }\"\n      :class=\"\n        cn(\n          'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 border-border z-popup relative max-h-96 min-w-32 overflow-hidden rounded-md border shadow-md',\n          position === 'popper' && 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n          props.class\n        )\n      \"\n    >\n      <SelectScrollUpButton />\n      <SelectViewport :class=\"cn('p-1', position === 'popper' && 'h-[--radix-select-trigger-height] w-full min-w-[--radix-select-trigger-width]')\">\n        <slot></slot>\n      </SelectViewport>\n      <SelectScrollDownButton />\n    </SelectContent>\n  </SelectPortal>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/select/SelectGroup.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectGroupProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { SelectGroup } from \"radix-vue\";\n\nconst props = defineProps<SelectGroupProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <SelectGroup :class=\"cn('w-full p-1', props.class)\" v-bind=\"delegatedProps\">\n    <slot></slot>\n  </SelectGroup>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/select/SelectItem.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectItemProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Check } from \"lucide-vue-next\";\nimport { SelectItem, SelectItemIndicator, SelectItemText, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<SelectItemProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <SelectItem\n    v-bind=\"forwardedProps\"\n    :class=\"\n      cn(\n        'focus:bg-accent focus:text-accent-foreground relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n        props.class\n      )\n    \"\n  >\n    <span class=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <SelectItemIndicator>\n        <Check class=\"h-4 w-4\" />\n      </SelectItemIndicator>\n    </span>\n\n    <SelectItemText>\n      <slot></slot>\n    </SelectItemText>\n  </SelectItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/select/SelectItemText.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectItemTextProps } from \"radix-vue\";\n\nimport { SelectItemText } from \"radix-vue\";\n\nconst props = defineProps<SelectItemTextProps>();\n</script>\n\n<template>\n  <SelectItemText v-bind=\"props\">\n    <slot></slot>\n  </SelectItemText>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/select/SelectLabel.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectLabelProps } from \"radix-vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { SelectLabel } from \"radix-vue\";\n\nconst props = defineProps<SelectLabelProps & { class?: any }>();\n</script>\n\n<template>\n  <SelectLabel :class=\"cn('px-2 py-1.5 text-sm font-semibold', props.class)\">\n    <slot></slot>\n  </SelectLabel>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/select/SelectScrollDownButton.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectScrollDownButtonProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ChevronDown } from \"lucide-vue-next\";\nimport { SelectScrollDownButton, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<SelectScrollDownButtonProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <SelectScrollDownButton v-bind=\"forwardedProps\" :class=\"cn('flex cursor-default items-center justify-center py-1', props.class)\">\n    <slot>\n      <ChevronDown class=\"h-4 w-4\" />\n    </slot>\n  </SelectScrollDownButton>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/select/SelectScrollUpButton.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectScrollUpButtonProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ChevronUp } from \"lucide-vue-next\";\nimport { SelectScrollUpButton, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<SelectScrollUpButtonProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <SelectScrollUpButton v-bind=\"forwardedProps\" :class=\"cn('flex cursor-default items-center justify-center py-1', props.class)\">\n    <slot>\n      <ChevronUp class=\"h-4 w-4\" />\n    </slot>\n  </SelectScrollUpButton>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/select/SelectSeparator.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectSeparatorProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { SelectSeparator } from \"radix-vue\";\n\nconst props = defineProps<SelectSeparatorProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <SelectSeparator v-bind=\"delegatedProps\" :class=\"cn('bg-muted -mx-1 my-1 h-px', props.class)\" />\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/select/SelectTrigger.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectTriggerProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ChevronDown } from \"lucide-vue-next\";\nimport { SelectIcon, SelectTrigger, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<SelectTriggerProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <SelectTrigger\n    v-bind=\"forwardedProps\"\n    :class=\"\n      cn(\n        'border-input ring-offset-background placeholder:text-muted-foreground focus:ring-ring flex h-10 w-full items-center justify-between whitespace-nowrap rounded-md border bg-transparent px-3 py-2 text-sm shadow-sm focus:outline-none focus:ring-1 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n        props.class\n      )\n    \"\n  >\n    <slot></slot>\n    <SelectIcon as-child>\n      <ChevronDown class=\"h-4 w-4 opacity-50\" />\n    </SelectIcon>\n  </SelectTrigger>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/select/SelectValue.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SelectValueProps } from \"radix-vue\";\n\nimport { SelectValue } from \"radix-vue\";\n\nconst props = defineProps<SelectValueProps>();\n</script>\n\n<template>\n  <SelectValue v-bind=\"props\">\n    <slot></slot>\n  </SelectValue>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/select/index.ts",
    "content": "export { default as Select } from \"./Select.vue\";\nexport { default as SelectContent } from \"./SelectContent.vue\";\nexport { default as SelectGroup } from \"./SelectGroup.vue\";\nexport { default as SelectItem } from \"./SelectItem.vue\";\nexport { default as SelectItemText } from \"./SelectItemText.vue\";\nexport { default as SelectLabel } from \"./SelectLabel.vue\";\nexport { default as SelectScrollDownButton } from \"./SelectScrollDownButton.vue\";\nexport { default as SelectScrollUpButton } from \"./SelectScrollUpButton.vue\";\nexport { default as SelectSeparator } from \"./SelectSeparator.vue\";\nexport { default as SelectTrigger } from \"./SelectTrigger.vue\";\nexport { default as SelectValue } from \"./SelectValue.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/separator/Separator.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SeparatorProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Separator } from \"radix-vue\";\n\nconst props = defineProps<SeparatorProps & { class?: any; label?: string }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <Separator v-bind=\"delegatedProps\" :class=\"cn('bg-border relative shrink-0', props.orientation === 'vertical' ? 'h-full w-px' : 'h-px w-full', props.class)\">\n    <span\n      v-if=\"props.label\"\n      :class=\"\n        cn(\n          'text-muted-foreground bg-background absolute left-1/2 top-1/2 flex -translate-x-1/2 -translate-y-1/2 items-center justify-center text-xs',\n          props.orientation === 'vertical' ? 'w-[1px] px-1 py-2' : 'h-[1px] px-2 py-1'\n        )\n      \"\n    >\n      {{ props.label }}\n    </span>\n  </Separator>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/separator/index.ts",
    "content": "export { default as Separator } from \"./Separator.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/sheet/Sheet.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DialogRootEmits, DialogRootProps } from \"radix-vue\";\n\nimport { DialogRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<DialogRootProps>();\nconst emits = defineEmits<DialogRootEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <DialogRoot v-bind=\"forwarded\">\n    <slot></slot>\n  </DialogRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/sheet/SheetClose.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DialogCloseProps } from \"radix-vue\";\n\nimport { DialogClose } from \"radix-vue\";\n\nconst props = defineProps<DialogCloseProps>();\n</script>\n\n<template>\n  <DialogClose v-bind=\"props\">\n    <slot></slot>\n  </DialogClose>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/sheet/SheetContent.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DialogContentEmits, DialogContentProps } from \"radix-vue\";\n\nimport type { SheetVariants } from \"./sheet\";\n\nimport { computed, ref } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { DialogContent, DialogPortal, useForwardPropsEmits } from \"radix-vue\";\n\nimport { sheetVariants } from \"./sheet\";\nimport SheetOverlay from \"./SheetOverlay.vue\";\n\ninterface SheetContentProps extends DialogContentProps {\n  appendTo?: HTMLElement | string;\n  class?: any;\n  modal?: boolean;\n  open?: boolean;\n  overlayBlur?: number;\n  side?: SheetVariants[\"side\"];\n  zIndex?: number;\n}\n\ndefineOptions({\n  inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<SheetContentProps>(), {\n  appendTo: \"body\",\n});\n\nconst emits = defineEmits<DialogContentEmits & { close: []; closed: []; opened: [] }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, modal: _modal, open: _open, side: _side, ...delegated } = props;\n\n  return delegated;\n});\n\nfunction isAppendToBody() {\n  return props.appendTo === \"body\" || props.appendTo === document.body || !props.appendTo;\n}\n\nconst position = computed(() => {\n  return isAppendToBody() ? \"fixed\" : \"absolute\";\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\nconst contentRef = ref<InstanceType<typeof DialogContent> | null>(null);\nfunction onAnimationEnd(event: AnimationEvent) {\n  // 只有在 contentRef 的动画结束时才触发 opened/closed 事件\n  if (event.target === contentRef.value?.$el) {\n    if (props.open) {\n      emits(\"opened\");\n    } else {\n      emits(\"closed\");\n    }\n  }\n}\n</script>\n\n<template>\n  <DialogPortal :to=\"appendTo\">\n    <Transition name=\"fade\">\n      <SheetOverlay\n        v-if=\"open && modal\"\n        :style=\"{\n          ...(zIndex ? { zIndex } : {}),\n          position,\n          backdropFilter: overlayBlur && overlayBlur > 0 ? `blur(${overlayBlur}px)` : 'none',\n        }\"\n      />\n    </Transition>\n    <DialogContent\n      ref=\"contentRef\"\n      :class=\"cn('z-popup', sheetVariants({ side }), props.class)\"\n      :style=\"{\n        ...(zIndex ? { zIndex } : {}),\n        position,\n      }\"\n      v-bind=\"{ ...forwarded, ...$attrs }\"\n      @animationend=\"onAnimationEnd\"\n    >\n      <slot></slot>\n\n      <!-- <DialogClose\n        class=\"data-[state=open]:bg-secondary absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none disabled:pointer-events-none\"\n      >\n        <Cross2Icon class=\"h-5 w-\" />\n      </DialogClose> -->\n    </DialogContent>\n  </DialogPortal>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/sheet/SheetDescription.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DialogDescriptionProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { DialogDescription } from \"radix-vue\";\n\nconst props = defineProps<DialogDescriptionProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <DialogDescription :class=\"cn('text-muted-foreground text-sm', props.class)\" v-bind=\"delegatedProps\">\n    <slot></slot>\n  </DialogDescription>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/sheet/SheetFooter.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{ class?: any }>();\n</script>\n\n<template>\n  <div :class=\"cn('flex flex-row flex-col-reverse justify-end gap-x-2', props.class)\">\n    <slot></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/sheet/SheetHeader.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nconst props = defineProps<{ class?: any }>();\n</script>\n\n<template>\n  <div :class=\"cn('flex flex-col text-center sm:text-left', props.class)\">\n    <slot></slot>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/sheet/SheetOverlay.vue",
    "content": "<script setup lang=\"ts\">\nimport { inject } from \"vue\";\n\nimport { useScrollLock } from \"/@/vben/composables\";\n\nuseScrollLock();\nconst id = inject(\"DISMISSABLE_DRAWER_ID\");\n</script>\n<template>\n  <div :data-dismissable-drawer=\"id\" class=\"bg-overlay z-popup inset-0\"></div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/sheet/SheetTitle.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DialogTitleProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { DialogTitle } from \"radix-vue\";\n\nconst props = defineProps<DialogTitleProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <DialogTitle :class=\"cn('text-foreground font-medium', props.class)\" v-bind=\"delegatedProps\">\n    <slot></slot>\n  </DialogTitle>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/sheet/SheetTrigger.vue",
    "content": "<script setup lang=\"ts\">\nimport type { DialogTriggerProps } from \"radix-vue\";\n\nimport { DialogTrigger } from \"radix-vue\";\n\nconst props = defineProps<DialogTriggerProps>();\n</script>\n\n<template>\n  <DialogTrigger v-bind=\"props\">\n    <slot></slot>\n  </DialogTrigger>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/sheet/index.ts",
    "content": "export * from \"./sheet\";\nexport { default as Sheet } from \"./Sheet.vue\";\nexport { default as SheetClose } from \"./SheetClose.vue\";\nexport { default as SheetContent } from \"./SheetContent.vue\";\nexport { default as SheetDescription } from \"./SheetDescription.vue\";\nexport { default as SheetFooter } from \"./SheetFooter.vue\";\nexport { default as SheetHeader } from \"./SheetHeader.vue\";\nexport { default as SheetTitle } from \"./SheetTitle.vue\";\n\nexport { default as SheetTrigger } from \"./SheetTrigger.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/sheet/sheet.ts",
    "content": "import type { VariantProps } from \"class-variance-authority\";\n\nimport { cva } from \"class-variance-authority\";\n\nexport const sheetVariants = cva(\n  \"bg-background shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500 border-border\",\n  {\n    defaultVariants: {\n      side: \"right\",\n    },\n    variants: {\n      side: {\n        bottom: \"inset-x-0 bottom-0 border-t border-border data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n        left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left \",\n        right: \"inset-y-0 right-0 w-3/4 border-l  data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right\",\n        top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n      },\n    },\n  }\n);\n\nexport type SheetVariants = VariantProps<typeof sheetVariants>;\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/switch/Switch.vue",
    "content": "<script setup lang=\"ts\">\nimport type { SwitchRootEmits, SwitchRootProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"../../../shared/utils\";\n\nimport { SwitchRoot, SwitchThumb, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<SwitchRootProps & { class?: any }>();\n\nconst emits = defineEmits<SwitchRootEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <SwitchRoot\n    v-bind=\"forwarded\"\n    :class=\"\n      cn(\n        'focus-visible:ring-ring focus-visible:ring-offset-background data-[state=checked]:bg-primary data-[state=unchecked]:bg-input peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n        props.class\n      )\n    \"\n  >\n    <SwitchThumb :class=\"cn('bg-background pointer-events-none block h-4 w-4 rounded-full shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0')\" />\n  </SwitchRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/switch/index.ts",
    "content": "export { default as Switch } from \"./Switch.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/tabs/Tabs.vue",
    "content": "<script setup lang=\"ts\">\nimport type { TabsRootEmits, TabsRootProps } from \"radix-vue\";\n\nimport { TabsRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<TabsRootProps>();\nconst emits = defineEmits<TabsRootEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <TabsRoot v-bind=\"forwarded\">\n    <slot></slot>\n  </TabsRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/tabs/TabsContent.vue",
    "content": "<script setup lang=\"ts\">\nimport type { TabsContentProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { TabsContent } from \"radix-vue\";\n\nconst props = defineProps<TabsContentProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <TabsContent :class=\"cn('ring-offset-background focus-visible:ring-ring mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2', props.class)\" v-bind=\"delegatedProps\">\n    <slot></slot>\n  </TabsContent>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/tabs/TabsList.vue",
    "content": "<script setup lang=\"ts\">\nimport type { TabsListProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { TabsList } from \"radix-vue\";\n\nconst props = defineProps<TabsListProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n</script>\n\n<template>\n  <TabsList v-bind=\"delegatedProps\" :class=\"cn('bg-muted text-muted-foreground inline-flex h-9 items-center justify-center rounded-lg p-1', props.class)\">\n    <slot></slot>\n  </TabsList>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/tabs/TabsTrigger.vue",
    "content": "<script setup lang=\"ts\">\nimport type { TabsTriggerProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { TabsTrigger, useForwardProps } from \"radix-vue\";\n\nconst props = defineProps<TabsTriggerProps & { class?: any }>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <TabsTrigger\n    v-bind=\"forwardedProps\"\n    :class=\"\n      cn(\n        'ring-offset-background focus-visible:ring-ring data-[state=active]:bg-background data-[state=active]:text-foreground inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow',\n        props.class\n      )\n    \"\n  >\n    <slot></slot>\n  </TabsTrigger>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/tabs/index.ts",
    "content": "export { default as Tabs } from \"./Tabs.vue\";\nexport { default as TabsContent } from \"./TabsContent.vue\";\nexport { default as TabsList } from \"./TabsList.vue\";\nexport { default as TabsTrigger } from \"./TabsTrigger.vue\";\nexport { TabsIndicator } from \"radix-vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/textarea/Textarea.vue",
    "content": "<script setup lang=\"ts\">\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { useVModel } from \"@vueuse/core\";\n\nconst props = defineProps<{\n  class?: any;\n  defaultValue?: number | string;\n  modelValue?: number | string;\n}>();\n\nconst emits = defineEmits<{\n  (e: \"update:modelValue\", payload: number | string): void;\n}>();\n\nconst modelValue = useVModel(props, \"modelValue\", emits, {\n  defaultValue: props.defaultValue,\n  passive: true,\n});\n</script>\n\n<template>\n  <textarea\n    v-model=\"modelValue\"\n    :class=\"\n      cn(\n        'border-input placeholder:text-muted-foreground focus-visible:ring-ring flex min-h-[60px] w-full rounded-md border bg-transparent px-3 py-2 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50',\n        props.class\n      )\n    \"\n  ></textarea>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/textarea/index.ts",
    "content": "export { default as Textarea } from \"./Textarea.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/toggle/Toggle.vue",
    "content": "<script setup lang=\"ts\">\nimport type { ToggleEmits, ToggleProps } from \"radix-vue\";\n\nimport type { ToggleVariants } from \"./toggle\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { Toggle, useForwardPropsEmits } from \"radix-vue\";\n\nimport { toggleVariants } from \"./toggle\";\n\nconst props = withDefaults(\n  defineProps<\n    ToggleProps & {\n      class?: any;\n      size?: ToggleVariants[\"size\"];\n      variant?: ToggleVariants[\"variant\"];\n    }\n  >(),\n  {\n    disabled: false,\n    size: \"default\",\n    variant: \"default\",\n  }\n);\n\nconst emits = defineEmits<ToggleEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, size: _size, variant: _variant, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <Toggle v-bind=\"forwarded\" :class=\"cn(toggleVariants({ variant, size }), props.class)\">\n    <slot></slot>\n  </Toggle>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/toggle/index.ts",
    "content": "export * from \"./toggle\";\nexport { default as Toggle } from \"./Toggle.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/toggle/toggle.ts",
    "content": "import type { VariantProps } from \"class-variance-authority\";\n\nimport { cva } from \"class-variance-authority\";\n\nexport const toggleVariants = cva(\n  \"inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground\",\n  {\n    defaultVariants: {\n      size: \"default\",\n      variant: \"default\",\n    },\n    variants: {\n      size: {\n        default: \"h-9 px-3\",\n        lg: \"h-10 px-3\",\n        sm: \"h-8 px-2\",\n      },\n      variant: {\n        default: \"bg-transparent\",\n        outline: \"border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground\",\n      },\n    },\n  }\n);\n\nexport type ToggleVariants = VariantProps<typeof toggleVariants>;\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/toggle-group/ToggleGroup.vue",
    "content": "<script setup lang=\"ts\">\nimport type { VariantProps } from \"class-variance-authority\";\nimport type { ToggleGroupRootEmits, ToggleGroupRootProps } from \"radix-vue\";\n\nimport type { toggleVariants } from \"../toggle\";\n\nimport { computed, provide } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ToggleGroupRoot, useForwardPropsEmits } from \"radix-vue\";\n\ntype ToggleGroupVariants = VariantProps<typeof toggleVariants>;\n\nconst props = defineProps<\n  ToggleGroupRootProps & {\n    class?: any;\n    size?: ToggleGroupVariants[\"size\"];\n    variant?: ToggleGroupVariants[\"variant\"];\n  }\n>();\nconst emits = defineEmits<ToggleGroupRootEmits>();\n\nprovide(\"toggleGroup\", {\n  size: props.size,\n  variant: props.variant,\n});\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <ToggleGroupRoot v-bind=\"forwarded\" :class=\"cn('flex items-center justify-center gap-1', props.class)\">\n    <slot></slot>\n  </ToggleGroupRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/toggle-group/ToggleGroupItem.vue",
    "content": "<script setup lang=\"ts\">\nimport type { VariantProps } from \"class-variance-authority\";\nimport type { ToggleGroupItemProps } from \"radix-vue\";\n\nimport { computed, inject } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { ToggleGroupItem, useForwardProps } from \"radix-vue\";\n\nimport { toggleVariants } from \"../toggle\";\n\ntype ToggleGroupVariants = VariantProps<typeof toggleVariants>;\n\nconst props = defineProps<\n  ToggleGroupItemProps & {\n    class?: any;\n    size?: ToggleGroupVariants[\"size\"];\n    variant?: ToggleGroupVariants[\"variant\"];\n  }\n>();\n\nconst context = inject<ToggleGroupVariants>(\"toggleGroup\");\n\nconst delegatedProps = computed(() => {\n  const { class: _, size: _size, variant: _variant, ...delegated } = props;\n  return delegated;\n});\n\nconst forwardedProps = useForwardProps(delegatedProps);\n</script>\n\n<template>\n  <ToggleGroupItem\n    v-bind=\"forwardedProps\"\n    :class=\"\n      cn(\n        toggleVariants({\n          variant: context?.variant || variant,\n          size: context?.size || size,\n        }),\n        props.class\n      )\n    \"\n  >\n    <slot></slot>\n  </ToggleGroupItem>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/toggle-group/index.ts",
    "content": "export { default as ToggleGroup } from \"./ToggleGroup.vue\";\nexport { default as ToggleGroupItem } from \"./ToggleGroupItem.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/tooltip/Tooltip.vue",
    "content": "<script setup lang=\"ts\">\nimport type { TooltipRootEmits, TooltipRootProps } from \"radix-vue\";\n\nimport { TooltipRoot, useForwardPropsEmits } from \"radix-vue\";\n\nconst props = defineProps<TooltipRootProps>();\nconst emits = defineEmits<TooltipRootEmits>();\n\nconst forwarded = useForwardPropsEmits(props, emits);\n</script>\n\n<template>\n  <TooltipRoot v-bind=\"forwarded\">\n    <slot></slot>\n  </TooltipRoot>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/tooltip/TooltipContent.vue",
    "content": "<script setup lang=\"ts\">\nimport type { TooltipContentEmits, TooltipContentProps } from \"radix-vue\";\n\nimport { computed } from \"vue\";\n\nimport { cn } from \"/@/vben/shared/utils\";\n\nimport { TooltipContent, TooltipPortal, useForwardPropsEmits } from \"radix-vue\";\n\ndefineOptions({\n  inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<TooltipContentProps & { class?: any }>(), {\n  class: \"\",\n  side: \"right\",\n  sideOffset: 5,\n});\n\nconst emits = defineEmits<TooltipContentEmits>();\n\nconst delegatedProps = computed(() => {\n  const { class: _, ...delegated } = props;\n\n  return delegated;\n});\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits);\n</script>\n\n<template>\n  <TooltipPortal>\n    <TooltipContent\n      v-bind=\"{ ...forwarded, ...$attrs }\"\n      :class=\"\n        cn(\n          'z-popup bg-accent text-accent-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 border-border shadow-float overflow-hidden rounded-sm border px-4 py-2 text-xs',\n          props.class\n        )\n      \"\n    >\n      <slot></slot>\n    </TooltipContent>\n  </TooltipPortal>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/tooltip/TooltipProvider.vue",
    "content": "<script setup lang=\"ts\">\nimport type { TooltipProviderProps } from \"radix-vue\";\n\nimport { TooltipProvider } from \"radix-vue\";\n\nconst props = defineProps<TooltipProviderProps>();\n</script>\n\n<template>\n  <TooltipProvider v-bind=\"props\">\n    <slot></slot>\n  </TooltipProvider>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/tooltip/TooltipTrigger.vue",
    "content": "<script setup lang=\"ts\">\nimport type { TooltipTriggerProps } from \"radix-vue\";\n\nimport { TooltipTrigger } from \"radix-vue\";\n\nconst props = defineProps<TooltipTriggerProps>();\n</script>\n\n<template>\n  <TooltipTrigger v-bind=\"props\">\n    <slot></slot>\n  </TooltipTrigger>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shadcn-ui/ui/tooltip/index.ts",
    "content": "export { default as Tooltip } from \"./Tooltip.vue\";\nexport { default as TooltipContent } from \"./TooltipContent.vue\";\nexport { default as TooltipProvider } from \"./TooltipProvider.vue\";\nexport { default as TooltipTrigger } from \"./TooltipTrigger.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/cache/__tests__/storage-manager.test.ts",
    "content": "import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { StorageManager } from \"../storage-manager\";\n\ndescribe(\"storageManager\", () => {\n  let storageManager: StorageManager;\n\n  beforeEach(() => {\n    vi.useFakeTimers();\n    localStorage.clear();\n    storageManager = new StorageManager({\n      prefix: \"test_\",\n    });\n  });\n\n  it(\"should set and get an item\", () => {\n    storageManager.setItem(\"user\", { age: 30, name: \"John Doe\" });\n    const user = storageManager.getItem(\"user\");\n    expect(user).toEqual({ age: 30, name: \"John Doe\" });\n  });\n\n  it(\"should return default value if item does not exist\", () => {\n    const user = storageManager.getItem(\"nonexistent\", {\n      age: 0,\n      name: \"Default User\",\n    });\n    expect(user).toEqual({ age: 0, name: \"Default User\" });\n  });\n\n  it(\"should remove an item\", () => {\n    storageManager.setItem(\"user\", { age: 30, name: \"John Doe\" });\n    storageManager.removeItem(\"user\");\n    const user = storageManager.getItem(\"user\");\n    expect(user).toBeNull();\n  });\n\n  it(\"should clear all items with the prefix\", () => {\n    storageManager.setItem(\"user1\", { age: 30, name: \"John Doe\" });\n    storageManager.setItem(\"user2\", { age: 25, name: \"Jane Doe\" });\n    storageManager.clear();\n    expect(storageManager.getItem(\"user1\")).toBeNull();\n    expect(storageManager.getItem(\"user2\")).toBeNull();\n  });\n\n  it(\"should clear expired items\", () => {\n    storageManager.setItem(\"user\", { age: 30, name: \"John Doe\" }, 1000); // 1秒过期\n    vi.advanceTimersByTime(1001); // 快进时间\n    storageManager.clearExpiredItems();\n    const user = storageManager.getItem(\"user\");\n    expect(user).toBeNull();\n  });\n\n  it(\"should not clear non-expired items\", () => {\n    storageManager.setItem(\"user\", { age: 30, name: \"John Doe\" }, 10_000); // 10秒过期\n    vi.advanceTimersByTime(5000); // 快进时间\n    storageManager.clearExpiredItems();\n    const user = storageManager.getItem(\"user\");\n    expect(user).toEqual({ age: 30, name: \"John Doe\" });\n  });\n\n  it(\"should handle JSON parse errors gracefully\", () => {\n    localStorage.setItem(\"test_user\", \"{ invalid JSON }\");\n    const user = storageManager.getItem(\"user\", {\n      age: 0,\n      name: \"Default User\",\n    });\n    expect(user).toEqual({ age: 0, name: \"Default User\" });\n  });\n  it(\"should return null for non-existent items without default value\", () => {\n    const user = storageManager.getItem(\"nonexistent\");\n    expect(user).toBeNull();\n  });\n\n  it(\"should overwrite existing items\", () => {\n    storageManager.setItem(\"user\", { age: 30, name: \"John Doe\" });\n    storageManager.setItem(\"user\", { age: 25, name: \"Jane Doe\" });\n    const user = storageManager.getItem(\"user\");\n    expect(user).toEqual({ age: 25, name: \"Jane Doe\" });\n  });\n\n  it(\"should handle items without expiry correctly\", () => {\n    storageManager.setItem(\"user\", { age: 30, name: \"John Doe\" });\n    vi.advanceTimersByTime(5000);\n    const user = storageManager.getItem(\"user\");\n    expect(user).toEqual({ age: 30, name: \"John Doe\" });\n  });\n\n  it(\"should remove expired items when accessed\", () => {\n    storageManager.setItem(\"user\", { age: 30, name: \"John Doe\" }, 1000); // 1秒过期\n    vi.advanceTimersByTime(1001); // 快进时间\n    const user = storageManager.getItem(\"user\");\n    expect(user).toBeNull();\n  });\n\n  it(\"should not remove non-expired items when accessed\", () => {\n    storageManager.setItem(\"user\", { age: 30, name: \"John Doe\" }, 10_000); // 10秒过期\n    vi.advanceTimersByTime(5000); // 快进时间\n    const user = storageManager.getItem(\"user\");\n    expect(user).toEqual({ age: 30, name: \"John Doe\" });\n  });\n\n  it(\"should handle multiple items with different expiry times\", () => {\n    storageManager.setItem(\"user1\", { age: 30, name: \"John Doe\" }, 1000); // 1秒过期\n    storageManager.setItem(\"user2\", { age: 25, name: \"Jane Doe\" }, 2000); // 2秒过期\n    vi.advanceTimersByTime(1500); // 快进时间\n    storageManager.clearExpiredItems();\n    const user1 = storageManager.getItem(\"user1\");\n    const user2 = storageManager.getItem(\"user2\");\n    expect(user1).toBeNull();\n    expect(user2).toEqual({ age: 25, name: \"Jane Doe\" });\n  });\n\n  it(\"should handle items with no expiry\", () => {\n    storageManager.setItem(\"user\", { age: 30, name: \"John Doe\" });\n    vi.advanceTimersByTime(10_000); // 快进时间\n    storageManager.clearExpiredItems();\n    const user = storageManager.getItem(\"user\");\n    expect(user).toEqual({ age: 30, name: \"John Doe\" });\n  });\n\n  it(\"should clear all items correctly\", () => {\n    storageManager.setItem(\"user1\", { age: 30, name: \"John Doe\" });\n    storageManager.setItem(\"user2\", { age: 25, name: \"Jane Doe\" });\n    storageManager.clear();\n    const user1 = storageManager.getItem(\"user1\");\n    const user2 = storageManager.getItem(\"user2\");\n    expect(user1).toBeNull();\n    expect(user2).toBeNull();\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/cache/index.ts",
    "content": "export * from \"./storage-manager\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/cache/storage-manager.ts",
    "content": "type StorageType = \"localStorage\" | \"sessionStorage\";\n\ninterface StorageManagerOptions {\n  prefix?: string;\n  storageType?: StorageType;\n}\n\ninterface StorageItem<T> {\n  expiry?: number;\n  value: T;\n}\n\nclass StorageManager {\n  private prefix: string;\n  private storage: Storage;\n\n  constructor({ prefix = \"\", storageType = \"localStorage\" }: StorageManagerOptions = {}) {\n    this.prefix = prefix;\n    this.storage = storageType === \"localStorage\" ? window.localStorage : window.sessionStorage;\n  }\n\n  /**\n   * 清除所有带前缀的存储项\n   */\n  clear(): void {\n    const keysToRemove: string[] = [];\n    for (let i = 0; i < this.storage.length; i++) {\n      const key = this.storage.key(i);\n      if (key && key.startsWith(this.prefix)) {\n        keysToRemove.push(key);\n      }\n    }\n    keysToRemove.forEach(key => this.storage.removeItem(key));\n  }\n\n  /**\n   * 清除所有过期的存储项\n   */\n  clearExpiredItems(): void {\n    for (let i = 0; i < this.storage.length; i++) {\n      const key = this.storage.key(i);\n      if (key && key.startsWith(this.prefix)) {\n        const shortKey = key.replace(this.prefix, \"\");\n        this.getItem(shortKey); // 调用 getItem 方法检查并移除过期项\n      }\n    }\n  }\n\n  /**\n   * 获取存储项\n   * @param key 键\n   * @param defaultValue 当项不存在或已过期时返回的默认值\n   * @returns 值，如果项已过期或解析错误则返回默认值\n   */\n  getItem<T>(key: string, defaultValue: null | T = null): null | T {\n    const fullKey = this.getFullKey(key);\n    const itemStr = this.storage.getItem(fullKey);\n    if (!itemStr) {\n      return defaultValue;\n    }\n\n    try {\n      const item: StorageItem<T> = JSON.parse(itemStr);\n      if (item.expiry && Date.now() > item.expiry) {\n        this.storage.removeItem(fullKey);\n        return defaultValue;\n      }\n      return item.value;\n    } catch (error) {\n      console.error(`Error parsing item with key \"${fullKey}\":`, error);\n      this.storage.removeItem(fullKey); // 如果解析失败，删除该项\n      return defaultValue;\n    }\n  }\n\n  /**\n   * 移除存储项\n   * @param key 键\n   */\n  removeItem(key: string): void {\n    const fullKey = this.getFullKey(key);\n    this.storage.removeItem(fullKey);\n  }\n\n  /**\n   * 设置存储项\n   * @param key 键\n   * @param value 值\n   * @param ttl 存活时间（毫秒）\n   */\n  setItem<T>(key: string, value: T, ttl?: number): void {\n    const fullKey = this.getFullKey(key);\n    const expiry = ttl ? Date.now() + ttl : undefined;\n    const item: StorageItem<T> = { expiry, value };\n    try {\n      this.storage.setItem(fullKey, JSON.stringify(item));\n    } catch (error) {\n      console.error(`Error setting item with key \"${fullKey}\":`, error);\n    }\n  }\n\n  /**\n   * 获取完整的存储键\n   * @param key 原始键\n   * @returns 带前缀的完整键\n   */\n  private getFullKey(key: string): string {\n    return `${this.prefix}-${key}`;\n  }\n}\n\nexport { StorageManager };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/cache/types.ts",
    "content": "type StorageType = \"localStorage\" | \"sessionStorage\";\n\ninterface StorageValue<T> {\n  data: T;\n  expiry: null | number;\n}\n\ninterface IStorageCache {\n  clear(): void;\n  getItem<T>(key: string): null | T;\n  key(index: number): null | string;\n  length(): number;\n  removeItem(key: string): void;\n  setItem<T>(key: string, value: T, expiryInMinutes?: number): void;\n}\n\nexport type { IStorageCache, StorageType, StorageValue };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/color/__tests__/convert.test.ts",
    "content": "import { describe, expect, it } from \"vitest\";\n\nimport { convertToHsl, convertToHslCssVar, convertToRgb, isValidColor } from \"../convert\";\n\ndescribe(\"color conversion functions\", () => {\n  it(\"should correctly convert color to HSL format\", () => {\n    const color = \"#ff0000\";\n    const expectedHsl = \"hsl(0 100% 50%)\";\n    expect(convertToHsl(color)).toEqual(expectedHsl);\n  });\n\n  it(\"should correctly convert color with alpha to HSL format\", () => {\n    const color = \"rgba(255, 0, 0, 0.5)\";\n    const expectedHsl = \"hsl(0 100% 50%) 0.5\";\n    expect(convertToHsl(color)).toEqual(expectedHsl);\n  });\n\n  it(\"should correctly convert color to HSL CSS variable format\", () => {\n    const color = \"#ff0000\";\n    const expectedHsl = \"0 100% 50%\";\n    expect(convertToHslCssVar(color)).toEqual(expectedHsl);\n  });\n\n  it(\"should correctly convert color with alpha to HSL CSS variable format\", () => {\n    const color = \"rgba(255, 0, 0, 0.5)\";\n    const expectedHsl = \"0 100% 50% / 0.5\";\n    expect(convertToHslCssVar(color)).toEqual(expectedHsl);\n  });\n\n  it(\"should correctly convert color to RGB CSS variable format\", () => {\n    const color = \"hsl(284, 100%, 50%)\";\n    const expectedRgb = \"rgb(187, 0, 255)\";\n    expect(convertToRgb(color)).toEqual(expectedRgb);\n  });\n\n  it(\"should correctly convert color with alpha to RGBA CSS variable format\", () => {\n    const color = \"hsla(284, 100%, 50%, 0.92)\";\n    const expectedRgba = \"rgba(187, 0, 255, 0.92)\";\n    expect(convertToRgb(color)).toEqual(expectedRgba);\n  });\n});\n\ndescribe(\"isValidColor\", () => {\n  it(\"isValidColor function\", () => {\n    // 测试有效颜色\n    expect(isValidColor(\"blue\")).toBe(true);\n    expect(isValidColor(\"#000000\")).toBe(true);\n\n    // 测试无效颜色\n    expect(isValidColor(\"invalid color\")).toBe(false);\n    expect(isValidColor()).toBe(false);\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/color/color.ts",
    "content": "import { TinyColor } from \"@ctrl/tinycolor\";\n\nexport function isDarkColor(color: string) {\n  return new TinyColor(color).isDark();\n}\n\nexport function isLightColor(color: string) {\n  return new TinyColor(color).isLight();\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/color/convert.ts",
    "content": "import { TinyColor } from \"@ctrl/tinycolor\";\n\n/**\n * 将颜色转换为HSL格式。\n *\n * HSL是一种颜色模型，包括色相(Hue)、饱和度(Saturation)和亮度(Lightness)三个部分。\n *\n * @param {string} color 输入的颜色。\n * @returns {string} HSL格式的颜色字符串。\n */\nfunction convertToHsl(color: string): string {\n  const { a, h, l, s } = new TinyColor(color).toHsl();\n  const hsl = `hsl(${Math.round(h)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%)`;\n  return a < 1 ? `${hsl} ${a}` : hsl;\n}\n\n/**\n * 将颜色转换为HSL CSS变量。\n *\n * 这个函数与convertToHsl函数类似，但是返回的字符串格式稍有不同，\n * 以便可以作为CSS变量使用。\n *\n * @param {string} color 输入的颜色。\n * @returns {string} 可以作为CSS变量使用的HSL格式的颜色字符串。\n */\nfunction convertToHslCssVar(color: string): string {\n  const { a, h, l, s } = new TinyColor(color).toHsl();\n  const hsl = `${Math.round(h)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%`;\n  return a < 1 ? `${hsl} / ${a}` : hsl;\n}\n\n/**\n * 将颜色转换为RGB颜色字符串\n * TinyColor无法处理hsl内包含'deg'、'grad'、'rad'或'turn'的字符串\n * 比如 hsl(231deg 98% 65%)将被解析为rgb(0, 0, 0)\n * 这里在转换之前先将这些单位去掉\n * @param str 表示HLS颜色值的字符串\n * @returns 如果颜色值有效，则返回对应的RGB颜色字符串；如果无效，则返回rgb(0, 0, 0)\n */\nfunction convertToRgb(str: string): string {\n  return new TinyColor(str.replaceAll(/deg|grad|rad|turn/g, \"\")).toRgbString();\n}\n\n/**\n * 检查颜色是否有效\n * @param {string} color - 待检查的颜色\n * 如果颜色有效返回true，否则返回false\n */\nfunction isValidColor(color?: string) {\n  if (!color) {\n    return false;\n  }\n  return new TinyColor(color).isValid;\n}\n\nexport { convertToHsl, convertToHslCssVar, convertToRgb, isValidColor, TinyColor };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/color/generator.ts",
    "content": "import { getColors } from \"theme-colors\";\n\nimport { convertToHslCssVar, TinyColor } from \"./convert\";\n\ninterface ColorItem {\n  alias?: string;\n  color: string;\n  name: string;\n}\n\nfunction generatorColorVariables(colorItems: ColorItem[]) {\n  const colorVariables: Record<string, string> = {};\n\n  colorItems.forEach(({ alias, color, name }) => {\n    if (color) {\n      const colorsMap = getColors(new TinyColor(color).toHexString());\n\n      let mainColor = colorsMap[\"500\"];\n\n      const colorKeys = Object.keys(colorsMap);\n\n      colorKeys.forEach(key => {\n        const colorValue = colorsMap[key];\n\n        if (colorValue) {\n          const hslColor = convertToHslCssVar(colorValue);\n          colorVariables[`--${name}-${key}`] = hslColor;\n          if (alias) {\n            colorVariables[`--${alias}-${key}`] = hslColor;\n          }\n\n          if (key === \"500\") {\n            mainColor = hslColor;\n          }\n        }\n      });\n      if (alias && mainColor) {\n        colorVariables[`--${alias}`] = mainColor;\n      }\n    }\n  });\n  return colorVariables;\n}\n\nexport { generatorColorVariables };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/color/index.ts",
    "content": "export * from \"./color\";\nexport * from \"./convert\";\nexport * from \"./generator\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/constants/globals.ts",
    "content": "/** layout content 组件的高度 */\nexport const CSS_VARIABLE_LAYOUT_CONTENT_HEIGHT = `--vben-content-height`;\n/** layout content 组件的宽度 */\nexport const CSS_VARIABLE_LAYOUT_CONTENT_WIDTH = `--vben-content-width`;\n/** layout header 组件的高度 */\nexport const CSS_VARIABLE_LAYOUT_HEADER_HEIGHT = `--vben-header-height`;\n/** layout footer 组件的高度 */\nexport const CSS_VARIABLE_LAYOUT_FOOTER_HEIGHT = `--vben-footer-height`;\n\n/** 内容区域的组件ID */\nexport const ELEMENT_ID_MAIN_CONTENT = `__vben_main_content`;\n\n/**\n * @zh_CN 默认命名空间\n */\nexport const DEFAULT_NAMESPACE = \"vben\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/constants/index.ts",
    "content": "export * from \"./globals\";\nexport * from \"./vben\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/constants/vben.ts",
    "content": "/**\n * @zh_CN GITHUB 仓库地址\n */\nexport const VBEN_GITHUB_URL = \"https://github.com/vbenjs/vue-vben-admin\";\n\n/**\n * @zh_CN 文档地址\n */\nexport const VBEN_DOC_URL = \"https://doc.vben.pro\";\n\n/**\n * @zh_CN Vben Logo\n */\nexport const VBEN_LOGO_URL = \"https://unpkg.com/@vbenjs/static-source@0.1.7/source/logo-v1.webp\";\n\n/**\n * @zh_CN Vben Admin 首页地址\n */\nexport const VBEN_PREVIEW_URL = \"https://www.vben.pro\";\n\nexport const VBEN_ELE_PREVIEW_URL = \"https://ele.vben.pro\";\n\nexport const VBEN_NAIVE_PREVIEW_URL = \"https://naive.vben.pro\";\n\nexport const VBEN_ANT_PREVIEW_URL = \"https://ant.vben.pro\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/global-state.ts",
    "content": "/**\n * 全局复用的变量、组件、配置，各个模块之间共享\n * 通过单例模式实现,单例必须注意不受请求影响，例如用户信息这些需要根据请求获取的。后续如果有ssr需求，也不会影响\n */\n\ninterface ComponentsState {\n  [key: string]: any;\n}\n\ninterface MessageState {\n  copyPreferencesSuccess?: (title: string, content?: string) => void;\n}\n\nexport interface IGlobalSharedState {\n  components: ComponentsState;\n  message: MessageState;\n}\n\nclass GlobalShareState {\n  #components: ComponentsState = {};\n  #message: MessageState = {};\n\n  /**\n   * 定义框架内部各个场景的消息提示\n   */\n  public defineMessage({ copyPreferencesSuccess }: MessageState) {\n    this.#message = {\n      copyPreferencesSuccess,\n    };\n  }\n\n  public getComponents(): ComponentsState {\n    return this.#components;\n  }\n\n  public getMessage(): MessageState {\n    return this.#message;\n  }\n\n  public setComponents(value: ComponentsState) {\n    this.#components = value;\n  }\n}\n\nexport const globalShareState = new GlobalShareState();\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/store.ts",
    "content": "export * from \"@tanstack/vue-store\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/__tests__/diff.test.ts",
    "content": "import { describe, expect, it } from \"vitest\";\n\nimport { diff } from \"../diff\";\n\ndescribe(\"diff function\", () => {\n  it(\"should return an empty object when comparing identical objects\", () => {\n    const obj1 = { a: 1, b: { c: 2 } };\n    const obj2 = { a: 1, b: { c: 2 } };\n    expect(diff(obj1, obj2)).toEqual(undefined);\n  });\n\n  it(\"should detect simple changes in primitive values\", () => {\n    const obj1 = { a: 1, b: 2 };\n    const obj2 = { a: 1, b: 3 };\n    expect(diff(obj1, obj2)).toEqual({ b: 3 });\n  });\n\n  it(\"should detect nested object changes\", () => {\n    const obj1 = { a: 1, b: { c: 2, d: 4 } };\n    const obj2 = { a: 1, b: { c: 3, d: 4 } };\n    expect(diff(obj1, obj2)).toEqual({ b: { c: 3 } });\n  });\n\n  it(\"should handle array changes\", () => {\n    const obj1 = { a: [1, 2, 3], b: 2 };\n    const obj2 = { a: [1, 2, 4], b: 2 };\n    expect(diff(obj1, obj2)).toEqual({ a: [1, 2, 4] });\n  });\n\n  it(\"should handle added keys\", () => {\n    const obj1 = { a: 1 };\n    const obj2 = { a: 1, b: 2 };\n    expect(diff(obj1, obj2)).toEqual({ b: 2 });\n  });\n\n  it(\"should handle removed keys\", () => {\n    const obj1 = { a: 1, b: 2 };\n    const obj2 = { a: 1 };\n    expect(diff(obj1, obj2)).toEqual(undefined);\n  });\n\n  it(\"should handle boolean value changes\", () => {\n    const obj1 = { a: true, b: false };\n    const obj2 = { a: true, b: true };\n    expect(diff(obj1, obj2)).toEqual({ b: true });\n  });\n\n  it(\"should handle null and undefined values\", () => {\n    const obj1 = { a: null, b: undefined };\n    const obj2: any = { a: 1, b: undefined };\n    expect(diff(obj1, obj2)).toEqual({ a: 1 });\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/__tests__/dom.test.ts",
    "content": "import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { getElementVisibleRect } from \"../dom\";\n\ndescribe(\"getElementVisibleRect\", () => {\n  // 设置浏览器视口尺寸的 mock\n  beforeEach(() => {\n    vi.spyOn(document.documentElement, \"clientHeight\", \"get\").mockReturnValue(800);\n    vi.spyOn(window, \"innerHeight\", \"get\").mockReturnValue(800);\n    vi.spyOn(document.documentElement, \"clientWidth\", \"get\").mockReturnValue(1000);\n    vi.spyOn(window, \"innerWidth\", \"get\").mockReturnValue(1000);\n  });\n\n  it(\"should return default rect if element is undefined\", () => {\n    expect(getElementVisibleRect()).toEqual({\n      bottom: 0,\n      height: 0,\n      left: 0,\n      right: 0,\n      top: 0,\n      width: 0,\n    });\n  });\n\n  it(\"should return default rect if element is null\", () => {\n    expect(getElementVisibleRect(null)).toEqual({\n      bottom: 0,\n      height: 0,\n      left: 0,\n      right: 0,\n      top: 0,\n      width: 0,\n    });\n  });\n\n  it(\"should return correct visible rect when element is fully visible\", () => {\n    const element = {\n      getBoundingClientRect: () => ({\n        bottom: 400,\n        height: 300,\n        left: 200,\n        right: 600,\n        top: 100,\n        width: 400,\n      }),\n    } as HTMLElement;\n\n    expect(getElementVisibleRect(element)).toEqual({\n      bottom: 400,\n      height: 300,\n      left: 200,\n      right: 600,\n      top: 100,\n      width: 400,\n    });\n  });\n\n  it(\"should return correct visible rect when element is partially off-screen at the top\", () => {\n    const element = {\n      getBoundingClientRect: () => ({\n        bottom: 200,\n        height: 250,\n        left: 100,\n        right: 500,\n        top: -50,\n        width: 400,\n      }),\n    } as HTMLElement;\n\n    expect(getElementVisibleRect(element)).toEqual({\n      bottom: 200,\n      height: 200,\n      left: 100,\n      right: 500,\n      top: 0,\n      width: 400,\n    });\n  });\n\n  it(\"should return correct visible rect when element is partially off-screen at the right\", () => {\n    const element = {\n      getBoundingClientRect: () => ({\n        bottom: 400,\n        height: 300,\n        left: 800,\n        right: 1200,\n        top: 100,\n        width: 400,\n      }),\n    } as HTMLElement;\n\n    expect(getElementVisibleRect(element)).toEqual({\n      bottom: 400,\n      height: 300,\n      left: 800,\n      right: 1000,\n      top: 100,\n      width: 200,\n    });\n  });\n\n  it(\"should return all zeros when element is completely off-screen\", () => {\n    const element = {\n      getBoundingClientRect: () => ({\n        bottom: 1200,\n        height: 300,\n        left: 1100,\n        right: 1400,\n        top: 900,\n        width: 300,\n      }),\n    } as HTMLElement;\n\n    expect(getElementVisibleRect(element)).toEqual({\n      bottom: 800,\n      height: 0,\n      left: 1100,\n      right: 1000,\n      top: 900,\n      width: 0,\n    });\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/__tests__/inference.test.ts",
    "content": "import { describe, expect, it } from \"vitest\";\n\nimport { getFirstNonNullOrUndefined, isBoolean, isEmpty, isHttpUrl, isObject, isUndefined, isWindow } from \"../inference\";\n\ndescribe(\"isHttpUrl\", () => {\n  it(\"should return true when given 'http://example.com'\", () => {\n    expect(isHttpUrl(\"http://example.com\")).toBe(true);\n  });\n\n  it(\"should return true when given 'https://example.com'\", () => {\n    expect(isHttpUrl(\"https://example.com\")).toBe(true);\n  });\n\n  it(\"should return false when given 'ftp://example.com'\", () => {\n    expect(isHttpUrl(\"ftp://example.com\")).toBe(false);\n  });\n\n  it(\"should return false when given 'example.com'\", () => {\n    expect(isHttpUrl(\"example.com\")).toBe(false);\n  });\n});\n\ndescribe(\"isUndefined\", () => {\n  it(\"isUndefined should return true for undefined values\", () => {\n    expect(isUndefined()).toBe(true);\n  });\n\n  it(\"isUndefined should return false for null values\", () => {\n    expect(isUndefined(null)).toBe(false);\n  });\n\n  it(\"isUndefined should return false for defined values\", () => {\n    expect(isUndefined(0)).toBe(false);\n    expect(isUndefined(\"\")).toBe(false);\n    expect(isUndefined(false)).toBe(false);\n  });\n\n  it(\"isUndefined should return false for objects and arrays\", () => {\n    expect(isUndefined({})).toBe(false);\n    expect(isUndefined([])).toBe(false);\n  });\n});\n\ndescribe(\"isEmpty\", () => {\n  it(\"should return true for empty string\", () => {\n    expect(isEmpty(\"\")).toBe(true);\n  });\n\n  it(\"should return true for empty array\", () => {\n    expect(isEmpty([])).toBe(true);\n  });\n\n  it(\"should return true for empty object\", () => {\n    expect(isEmpty({})).toBe(true);\n  });\n\n  it(\"should return false for non-empty string\", () => {\n    expect(isEmpty(\"hello\")).toBe(false);\n  });\n\n  it(\"should return false for non-empty array\", () => {\n    expect(isEmpty([1, 2, 3])).toBe(false);\n  });\n\n  it(\"should return false for non-empty object\", () => {\n    expect(isEmpty({ a: 1 })).toBe(false);\n  });\n\n  it(\"should return true for null or undefined\", () => {\n    expect(isEmpty(null)).toBe(true);\n    expect(isEmpty()).toBe(true);\n  });\n\n  it(\"should return false for number or boolean\", () => {\n    expect(isEmpty(0)).toBe(false);\n    expect(isEmpty(true)).toBe(false);\n  });\n});\n\ndescribe(\"isWindow\", () => {\n  it(\"should return true for the window object\", () => {\n    expect(isWindow(window)).toBe(true);\n  });\n\n  it(\"should return false for other objects\", () => {\n    expect(isWindow({})).toBe(false);\n    expect(isWindow([])).toBe(false);\n    expect(isWindow(null)).toBe(false);\n  });\n});\n\ndescribe(\"isBoolean\", () => {\n  it(\"should return true for boolean values\", () => {\n    expect(isBoolean(true)).toBe(true);\n    expect(isBoolean(false)).toBe(true);\n  });\n\n  it(\"should return false for non-boolean values\", () => {\n    expect(isBoolean(null)).toBe(false);\n    expect(isBoolean(42)).toBe(false);\n    expect(isBoolean(\"string\")).toBe(false);\n    expect(isBoolean({})).toBe(false);\n    expect(isBoolean([])).toBe(false);\n  });\n});\n\ndescribe(\"isObject\", () => {\n  it(\"should return true for objects\", () => {\n    expect(isObject({})).toBe(true);\n    expect(isObject({ a: 1 })).toBe(true);\n  });\n\n  it(\"should return false for non-objects\", () => {\n    expect(isObject(null)).toBe(false);\n    expect(isObject(42)).toBe(false);\n    expect(isObject(\"string\")).toBe(false);\n    expect(isObject(true)).toBe(false);\n    expect(isObject([1, 2, 3])).toBe(true);\n    expect(isObject(new Date())).toBe(true);\n    expect(isObject(/regex/)).toBe(true);\n  });\n});\n\ndescribe(\"getFirstNonNullOrUndefined\", () => {\n  describe(\"getFirstNonNullOrUndefined\", () => {\n    it(\"should return the first non-null and non-undefined value for a number array\", () => {\n      expect(getFirstNonNullOrUndefined<number>(undefined, null, 0, 42)).toBe(0);\n      expect(getFirstNonNullOrUndefined<number>(null, undefined, 42, 123)).toBe(42);\n    });\n\n    it(\"should return the first non-null and non-undefined value for a string array\", () => {\n      expect(getFirstNonNullOrUndefined<string>(undefined, null, \"\", \"hello\")).toBe(\"\");\n      expect(getFirstNonNullOrUndefined<string>(null, undefined, \"test\", \"world\")).toBe(\"test\");\n    });\n\n    it(\"should return undefined if all values are null or undefined\", () => {\n      expect(getFirstNonNullOrUndefined(undefined, null)).toBeUndefined();\n      expect(getFirstNonNullOrUndefined(null)).toBeUndefined();\n    });\n\n    it(\"should work with a single value\", () => {\n      expect(getFirstNonNullOrUndefined(42)).toBe(42);\n      expect(getFirstNonNullOrUndefined()).toBeUndefined();\n      expect(getFirstNonNullOrUndefined(null)).toBeUndefined();\n    });\n\n    it(\"should handle mixed types correctly\", () => {\n      expect(getFirstNonNullOrUndefined<number | object | string>(undefined, null, \"test\", 123, { key: \"value\" })).toBe(\"test\");\n      expect(getFirstNonNullOrUndefined<number | object | string>(null, undefined, [1, 2, 3], \"string\")).toEqual([1, 2, 3]);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/__tests__/letter.test.ts",
    "content": "import { describe, expect, it } from \"vitest\";\n\nimport { capitalizeFirstLetter, kebabToCamelCase, toCamelCase, toLowerCaseFirstLetter } from \"../letter\";\n\ndescribe(\"capitalizeFirstLetter\", () => {\n  it(\"should capitalize the first letter of a string\", () => {\n    expect(capitalizeFirstLetter(\"hello\")).toBe(\"Hello\");\n    expect(capitalizeFirstLetter(\"world\")).toBe(\"World\");\n  });\n\n  it(\"should handle empty strings\", () => {\n    expect(capitalizeFirstLetter(\"\")).toBe(\"\");\n  });\n\n  it(\"should handle single character strings\", () => {\n    expect(capitalizeFirstLetter(\"a\")).toBe(\"A\");\n    expect(capitalizeFirstLetter(\"b\")).toBe(\"B\");\n  });\n\n  it(\"should not change the case of other characters\", () => {\n    expect(capitalizeFirstLetter(\"hElLo\")).toBe(\"HElLo\");\n  });\n});\n\ndescribe(\"toLowerCaseFirstLetter\", () => {\n  it(\"should convert the first letter to lowercase\", () => {\n    expect(toLowerCaseFirstLetter(\"CommonAppName\")).toBe(\"commonAppName\");\n    expect(toLowerCaseFirstLetter(\"AnotherKeyExample\")).toBe(\"anotherKeyExample\");\n  });\n\n  it(\"should return the same string if the first letter is already lowercase\", () => {\n    expect(toLowerCaseFirstLetter(\"alreadyLowerCase\")).toBe(\"alreadyLowerCase\");\n  });\n\n  it(\"should handle empty strings\", () => {\n    expect(toLowerCaseFirstLetter(\"\")).toBe(\"\");\n  });\n\n  it(\"should handle single character strings\", () => {\n    expect(toLowerCaseFirstLetter(\"A\")).toBe(\"a\");\n    expect(toLowerCaseFirstLetter(\"a\")).toBe(\"a\");\n  });\n\n  it(\"should handle strings with only one uppercase letter\", () => {\n    expect(toLowerCaseFirstLetter(\"A\")).toBe(\"a\");\n  });\n\n  it(\"should handle strings with special characters\", () => {\n    expect(toLowerCaseFirstLetter(\"!Special\")).toBe(\"!Special\");\n    expect(toLowerCaseFirstLetter(\"123Number\")).toBe(\"123Number\");\n  });\n});\n\ndescribe(\"toCamelCase\", () => {\n  it(\"should return the key if parentKey is empty\", () => {\n    expect(toCamelCase(\"child\", \"\")).toBe(\"child\");\n  });\n\n  it(\"should combine parentKey and key in camel case\", () => {\n    expect(toCamelCase(\"child\", \"parent\")).toBe(\"parentChild\");\n  });\n\n  it(\"should handle empty key and parentKey\", () => {\n    expect(toCamelCase(\"\", \"\")).toBe(\"\");\n  });\n\n  it(\"should handle key with capital letters\", () => {\n    expect(toCamelCase(\"Child\", \"parent\")).toBe(\"parentChild\");\n    expect(toCamelCase(\"Child\", \"Parent\")).toBe(\"ParentChild\");\n  });\n});\n\ndescribe(\"kebabToCamelCase\", () => {\n  it(\"should convert kebab-case to camelCase correctly\", () => {\n    expect(kebabToCamelCase(\"my-component-name\")).toBe(\"myComponentName\");\n  });\n\n  it(\"should handle multiple consecutive hyphens\", () => {\n    expect(kebabToCamelCase(\"my--component--name\")).toBe(\"myComponentName\");\n  });\n\n  it(\"should trim leading and trailing hyphens\", () => {\n    expect(kebabToCamelCase(\"-my-component-name-\")).toBe(\"myComponentName\");\n  });\n\n  it(\"should preserve the case of the first word\", () => {\n    expect(kebabToCamelCase(\"My-component-name\")).toBe(\"MyComponentName\");\n  });\n\n  it(\"should convert a single word correctly\", () => {\n    expect(kebabToCamelCase(\"component\")).toBe(\"component\");\n  });\n\n  it(\"should return an empty string if input is empty\", () => {\n    expect(kebabToCamelCase(\"\")).toBe(\"\");\n  });\n\n  it(\"should handle strings with no hyphens\", () => {\n    expect(kebabToCamelCase(\"mycomponentname\")).toBe(\"mycomponentname\");\n  });\n\n  it(\"should handle strings with only hyphens\", () => {\n    expect(kebabToCamelCase(\"---\")).toBe(\"\");\n  });\n\n  it(\"should handle mixed case inputs\", () => {\n    expect(kebabToCamelCase(\"my-Component-Name\")).toBe(\"myComponentName\");\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/__tests__/state-handler.test.ts",
    "content": "import { describe, expect, it } from \"vitest\";\n\nimport { StateHandler } from \"../state-handler\";\n\ndescribe(\"stateHandler\", () => {\n  it(\"should resolve when condition is set to true\", async () => {\n    const handler = new StateHandler();\n\n    // 模拟异步设置 condition 为 true\n    setTimeout(() => {\n      handler.setConditionTrue(); // 明确触发 condition 为 true\n    }, 10);\n\n    // 等待条件被设置为 true\n    await handler.waitForCondition();\n    expect(handler.isConditionTrue()).toBe(true);\n  });\n\n  it(\"should resolve immediately if condition is already true\", async () => {\n    const handler = new StateHandler();\n    handler.setConditionTrue(); // 提前设置为 true\n\n    // 立即 resolve，因为 condition 已经是 true\n    await handler.waitForCondition();\n    expect(handler.isConditionTrue()).toBe(true);\n  });\n\n  it(\"should reject when condition is set to false after waiting\", async () => {\n    const handler = new StateHandler();\n\n    // 模拟异步设置 condition 为 false\n    setTimeout(() => {\n      handler.setConditionFalse(); // 明确触发 condition 为 false\n    }, 10);\n\n    // 等待过程中，期望 Promise 被 reject\n    await expect(handler.waitForCondition()).rejects.toThrow();\n    expect(handler.isConditionTrue()).toBe(false);\n  });\n\n  it(\"should reset condition to false\", () => {\n    const handler = new StateHandler();\n    handler.setConditionTrue(); // 设置为 true\n    handler.reset(); // 重置为 false\n\n    expect(handler.isConditionTrue()).toBe(false);\n  });\n\n  it(\"should resolve when condition is set to true after reset\", async () => {\n    const handler = new StateHandler();\n    handler.reset(); // 确保初始为 false\n\n    setTimeout(() => {\n      handler.setConditionTrue(); // 重置后设置为 true\n    }, 10);\n\n    await handler.waitForCondition();\n    expect(handler.isConditionTrue()).toBe(true);\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/__tests__/tree.test.ts",
    "content": "import { describe, expect, it } from \"vitest\";\n\nimport { filterTree, mapTree, traverseTreeValues } from \"../tree\";\n\ndescribe(\"traverseTreeValues\", () => {\n  interface Node {\n    children?: Node[];\n    name: string;\n  }\n\n  type NodeValue = string;\n\n  const sampleTree: Node[] = [\n    {\n      name: \"A\",\n      children: [\n        { name: \"B\" },\n        {\n          name: \"C\",\n          children: [{ name: \"D\" }, { name: \"E\" }],\n        },\n      ],\n    },\n    {\n      name: \"F\",\n      children: [\n        { name: \"G\" },\n        {\n          name: \"H\",\n          children: [{ name: \"I\" }],\n        },\n      ],\n    },\n  ];\n\n  it(\"traverses tree and returns all node values\", () => {\n    const values = traverseTreeValues<Node, NodeValue>(sampleTree, node => node.name, {\n      childProps: \"children\",\n    });\n    expect(values).toEqual([\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\"]);\n  });\n\n  it(\"handles empty tree\", () => {\n    const values = traverseTreeValues<Node, NodeValue>([], node => node.name);\n    expect(values).toEqual([]);\n  });\n\n  it(\"handles tree with only root node\", () => {\n    const rootNode = { name: \"A\" };\n    const values = traverseTreeValues<Node, NodeValue>([rootNode], node => node.name);\n    expect(values).toEqual([\"A\"]);\n  });\n\n  it(\"handles tree with only leaf nodes\", () => {\n    const leafNodes = [{ name: \"A\" }, { name: \"B\" }, { name: \"C\" }];\n    const values = traverseTreeValues<Node, NodeValue>(leafNodes, node => node.name);\n    expect(values).toEqual([\"A\", \"B\", \"C\"]);\n  });\n});\n\ndescribe(\"filterTree\", () => {\n  const tree = [\n    {\n      id: 1,\n      children: [{ id: 2 }, { id: 3, children: [{ id: 4 }, { id: 5 }, { id: 6 }] }, { id: 7 }],\n    },\n    { id: 8, children: [{ id: 9 }, { id: 10 }] },\n    { id: 11 },\n  ];\n\n  it(\"should return all nodes when condition is always true\", () => {\n    const result = filterTree(tree, () => true, { childProps: \"children\" });\n    expect(result).toEqual(tree);\n  });\n\n  it(\"should return only root nodes when condition is always false\", () => {\n    const result = filterTree(tree, () => false);\n    expect(result).toEqual([]);\n  });\n\n  it(\"should return nodes with even id values\", () => {\n    const result = filterTree(tree, node => node.id % 2 === 0);\n    expect(result).toEqual([{ id: 8, children: [{ id: 10 }] }]);\n  });\n\n  it(\"should return nodes with odd id values and their ancestors\", () => {\n    const result = filterTree(tree, node => node.id % 2 === 1);\n    expect(result).toEqual([\n      {\n        id: 1,\n        children: [{ id: 3, children: [{ id: 5 }] }, { id: 7 }],\n      },\n      { id: 11 },\n    ]);\n  });\n\n  it('should return nodes with \"leaf\" in their name', () => {\n    const tree = [\n      {\n        name: \"root\",\n        children: [\n          { name: \"leaf 1\" },\n          {\n            name: \"branch\",\n            children: [{ name: \"leaf 2\" }, { name: \"leaf 3\" }],\n          },\n          { name: \"leaf 4\" },\n        ],\n      },\n    ];\n    const result = filterTree(tree, node => node.name.includes(\"leaf\") || node.name === \"root\");\n    expect(result).toEqual([\n      {\n        name: \"root\",\n        children: [{ name: \"leaf 1\" }, { name: \"leaf 4\" }],\n      },\n    ]);\n  });\n});\n\ndescribe(\"mapTree\", () => {\n  it(\"map infinite depth tree using mapTree\", () => {\n    const tree = [\n      {\n        id: 1,\n        name: \"node1\",\n        children: [\n          { id: 2, name: \"node2\" },\n          { id: 3, name: \"node3\" },\n          {\n            id: 4,\n            name: \"node4\",\n            children: [\n              {\n                id: 5,\n                name: \"node5\",\n                children: [\n                  { id: 6, name: \"node6\" },\n                  { id: 7, name: \"node7\" },\n                ],\n              },\n              { id: 8, name: \"node8\" },\n            ],\n          },\n        ],\n      },\n    ];\n    const newTree = mapTree(tree, node => ({\n      ...node,\n      name: `${node.name}-new`,\n    }));\n\n    expect(newTree).toEqual([\n      {\n        id: 1,\n        name: \"node1-new\",\n        children: [\n          { id: 2, name: \"node2-new\" },\n          { id: 3, name: \"node3-new\" },\n          {\n            id: 4,\n            name: \"node4-new\",\n            children: [\n              {\n                id: 5,\n                name: \"node5-new\",\n                children: [\n                  { id: 6, name: \"node6-new\" },\n                  { id: 7, name: \"node7-new\" },\n                ],\n              },\n              { id: 8, name: \"node8-new\" },\n            ],\n          },\n        ],\n      },\n    ]);\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/__tests__/unique.test.ts",
    "content": "import { describe, expect, it } from \"vitest\";\n\nimport { uniqueByField } from \"../unique\";\n\ndescribe(\"uniqueByField\", () => {\n  it(\"should return an array with unique items based on id field\", () => {\n    const items = [\n      { id: 1, name: \"Item 1\" },\n      { id: 2, name: \"Item 2\" },\n      { id: 3, name: \"Item 3\" },\n      { id: 1, name: \"Duplicate Item\" },\n    ];\n\n    const uniqueItems = uniqueByField(items, \"id\");\n\n    expect(uniqueItems).toHaveLength(3);\n    expect(uniqueItems).toEqual([\n      { id: 1, name: \"Item 1\" },\n      { id: 2, name: \"Item 2\" },\n      { id: 3, name: \"Item 3\" },\n    ]);\n  });\n\n  it(\"should return an empty array when input array is empty\", () => {\n    const items: any[] = []; // Empty array\n\n    const uniqueItems = uniqueByField(items, \"id\");\n\n    // Assert expected results\n    expect(uniqueItems).toEqual([]);\n  });\n\n  it(\"should handle arrays with only one item correctly\", () => {\n    const items = [{ id: 1, name: \"Item 1\" }];\n\n    const uniqueItems = uniqueByField(items, \"id\");\n\n    // Assert expected results\n    expect(uniqueItems).toHaveLength(1);\n    expect(uniqueItems).toEqual([{ id: 1, name: \"Item 1\" }]);\n  });\n\n  it(\"should preserve the order of the first occurrence of each item\", () => {\n    const items = [\n      { id: 2, name: \"Item 2\" },\n      { id: 1, name: \"Item 1\" },\n      { id: 3, name: \"Item 3\" },\n      { id: 1, name: \"Duplicate Item\" },\n    ];\n\n    const uniqueItems = uniqueByField(items, \"id\");\n\n    // Assert expected results (order of first occurrences preserved)\n    expect(uniqueItems).toEqual([\n      { id: 2, name: \"Item 2\" },\n      { id: 1, name: \"Item 1\" },\n      { id: 3, name: \"Item 3\" },\n    ]);\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/__tests__/update-css-variables.test.ts",
    "content": "import { expect, it } from \"vitest\";\n\nimport { updateCSSVariables } from \"../update-css-variables\";\n\nit(\"updateCSSVariables should update CSS variables in :root selector\", () => {\n  // 模拟初始的内联样式表内容\n  const initialStyleContent = \":root { --primaryColor: red; }\";\n  document.head.innerHTML = `<style id=\"custom-styles\">${initialStyleContent}</style>`;\n\n  // 要更新的CSS变量和它们的新值\n  const updatedVariables = {\n    fontSize: \"16px\",\n    primaryColor: \"blue\",\n    secondaryColor: \"green\",\n  };\n\n  // 调用函数来更新CSS变量\n  updateCSSVariables(updatedVariables, \"custom-styles\");\n\n  // 获取更新后的样式内容\n  const styleElement = document.querySelector(\"#custom-styles\");\n  const updatedStyleContent = styleElement ? styleElement.textContent : \"\";\n\n  // 检查更新后的样式内容是否包含正确的更新值\n  expect(updatedStyleContent?.includes(\"primaryColor: blue;\") && updatedStyleContent?.includes(\"secondaryColor: green;\") && updatedStyleContent?.includes(\"fontSize: 16px;\")).toBe(true);\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/__tests__/util.test.ts",
    "content": "import { describe, expect, it } from \"vitest\";\n\nimport { bindMethods, getNestedValue } from \"../util\";\n\nclass TestClass {\n  public value: string;\n\n  constructor(value: string) {\n    this.value = value;\n    bindMethods(this); // 调用通用方法\n  }\n\n  getValue() {\n    return this.value;\n  }\n\n  setValue(newValue: string) {\n    this.value = newValue;\n  }\n}\n\ndescribe(\"bindMethods\", () => {\n  it(\"should bind methods to the instance correctly\", () => {\n    const instance = new TestClass(\"initial\");\n\n    // 解构方法\n    const { getValue } = instance;\n\n    // 检查 getValue 是否能正确调用，并且 this 绑定了 instance\n    expect(getValue()).toBe(\"initial\");\n  });\n\n  it(\"should bind multiple methods\", () => {\n    const instance = new TestClass(\"initial\");\n\n    const { getValue, setValue } = instance;\n\n    // 检查 getValue 和 setValue 方法是否正确绑定了 this\n    setValue(\"newValue\");\n    expect(getValue()).toBe(\"newValue\");\n  });\n\n  it(\"should not bind non-function properties\", () => {\n    const instance = new TestClass(\"initial\");\n\n    // 检查普通属性是否保持原样\n    expect(instance.value).toBe(\"initial\");\n  });\n\n  it(\"should not bind constructor method\", () => {\n    const instance = new TestClass(\"test\");\n\n    // 检查 constructor 是否没有被绑定\n    expect(instance.constructor.name).toBe(\"TestClass\");\n  });\n\n  it(\"should not bind getter/setter properties\", () => {\n    class TestWithGetterSetter {\n      get value() {\n        return this._value;\n      }\n\n      set value(newValue: string) {\n        this._value = newValue;\n      }\n\n      private _value: string = \"test\";\n\n      constructor() {\n        bindMethods(this);\n      }\n    }\n\n    const instance = new TestWithGetterSetter();\n    const { value } = instance;\n\n    // Getter 和 setter 不应被绑定\n    expect(value).toBe(\"test\");\n  });\n});\n\ndescribe(\"getNestedValue\", () => {\n  interface UserProfile {\n    age: number;\n    name: string;\n  }\n\n  interface UserSettings {\n    theme: string;\n  }\n\n  interface Data {\n    user: {\n      profile: UserProfile;\n      settings: UserSettings;\n    };\n  }\n\n  const data: Data = {\n    user: {\n      profile: {\n        age: 25,\n        name: \"Alice\",\n      },\n      settings: {\n        theme: \"dark\",\n      },\n    },\n  };\n\n  it(\"should get a nested value when the path is valid\", () => {\n    const result = getNestedValue(data, \"user.profile.name\");\n    expect(result).toBe(\"Alice\");\n  });\n\n  it(\"should return undefined for non-existent property\", () => {\n    const result = getNestedValue(data, \"user.profile.gender\");\n    expect(result).toBeUndefined();\n  });\n\n  it(\"should return undefined when accessing a non-existent deep path\", () => {\n    const result = getNestedValue(data, \"user.nonexistent.field\");\n    expect(result).toBeUndefined();\n  });\n\n  it(\"should return undefined if a middle level is undefined\", () => {\n    const result = getNestedValue({ user: undefined }, \"user.profile.name\");\n    expect(result).toBeUndefined();\n  });\n\n  it(\"should return the correct value for a nested setting\", () => {\n    const result = getNestedValue(data, \"user.settings.theme\");\n    expect(result).toBe(\"dark\");\n  });\n\n  it(\"should work for a single-level path\", () => {\n    const result = getNestedValue({ a: 1, b: 2 }, \"b\");\n    expect(result).toBe(2);\n  });\n\n  it(\"should return the entire object if path is empty\", () => {\n    expect(() => getNestedValue(data, \"\")()).toThrow();\n  });\n\n  it(\"should handle paths with array indexes\", () => {\n    const complexData = { list: [{ name: \"Item1\" }, { name: \"Item2\" }] };\n    const result = getNestedValue(complexData, \"list.1.name\");\n    expect(result).toBe(\"Item2\");\n  });\n\n  it(\"should return undefined when accessing an out-of-bounds array index\", () => {\n    const complexData = { list: [{ name: \"Item1\" }] };\n    const result = getNestedValue(complexData, \"list.2.name\");\n    expect(result).toBeUndefined();\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/__tests__/window.test.ts",
    "content": "import { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { openWindow } from \"../window\";\n\ndescribe(\"openWindow\", () => {\n  // 保存原始的 window.open 函数\n  let originalOpen: typeof window.open;\n\n  beforeEach(() => {\n    originalOpen = window.open;\n  });\n\n  afterEach(() => {\n    window.open = originalOpen;\n  });\n\n  it(\"should call window.open with correct arguments\", () => {\n    const url = \"https://example.com\";\n    const options = { noopener: true, noreferrer: true, target: \"_blank\" };\n\n    window.open = vi.fn();\n\n    // 调用函数\n    openWindow(url, options);\n\n    // 验证 window.open 是否被正确地调用\n    expect(window.open).toHaveBeenCalledWith(url, options.target, \"noopener=yes,noreferrer=yes\");\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/cn.ts",
    "content": "import type { ClassValue } from \"clsx\";\n\nimport { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nfunction cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs));\n}\n\nexport { cn };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/date.ts",
    "content": "import dayjs from \"dayjs\";\n\nexport function formatDate(time: number | string, format = \"YYYY-MM-DD\") {\n  try {\n    const date = dayjs(time);\n    if (!date.isValid()) {\n      throw new Error(\"Invalid date\");\n    }\n    return date.format(format);\n  } catch (error) {\n    console.error(`Error formatting date: ${error}`);\n    return time;\n  }\n}\n\nexport function formatDateTime(time: number | string) {\n  return formatDate(time, \"YYYY-MM-DD HH:mm:ss\");\n}\n\nexport function isDate(value: any): value is Date {\n  return value instanceof Date;\n}\n\nexport function isDayjsObject(value: any): value is dayjs.Dayjs {\n  return dayjs.isDayjs(value);\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/diff.ts",
    "content": "// type Diff<T = any> = T;\n\n// 比较两个数组是否相等\n\nfunction arraysEqual<T>(a: T[], b: T[]): boolean {\n  if (a.length !== b.length) return false;\n  const counter = new Map<T, number>();\n  for (const value of a) {\n    counter.set(value, (counter.get(value) || 0) + 1);\n  }\n  for (const value of b) {\n    const count = counter.get(value);\n    if (count === undefined || count === 0) {\n      return false;\n    }\n    counter.set(value, count - 1);\n  }\n  return true;\n}\n\n// 深度对比两个值\n// function deepEqual<T>(oldVal: T, newVal: T): boolean {\n//   if (\n//     typeof oldVal === 'object' &&\n//     oldVal !== null &&\n//     typeof newVal === 'object' &&\n//     newVal !== null\n//   ) {\n//     return Array.isArray(oldVal) && Array.isArray(newVal)\n//       ? arraysEqual(oldVal, newVal)\n//       : diff(oldVal as any, newVal as any) === null;\n//   } else {\n//     return oldVal === newVal;\n//   }\n// }\n\n// // diff 函数\n// function diff<T extends object>(\n//   oldObj: T,\n//   newObj: T,\n//   ignoreFields: (keyof T)[] = [],\n// ): { [K in keyof T]?: Diff<T[K]> } | null {\n//   const difference: { [K in keyof T]?: Diff<T[K]> } = {};\n\n//   for (const key in oldObj) {\n//     if (ignoreFields.includes(key)) continue;\n//     const oldValue = oldObj[key];\n//     const newValue = newObj[key];\n\n//     if (!deepEqual(oldValue, newValue)) {\n//       difference[key] = newValue;\n//     }\n//   }\n\n//   return Object.keys(difference).length === 0 ? null : difference;\n// }\n\ntype DiffResult<T> = Partial<{\n  [K in keyof T]: T[K] extends object ? DiffResult<T[K]> : T[K];\n}>;\n\nfunction diff<T extends Record<string, any>>(obj1: T, obj2: T): DiffResult<T> {\n  function findDifferences(o1: any, o2: any): any {\n    if (Array.isArray(o1) && Array.isArray(o2)) {\n      if (!arraysEqual(o1, o2)) {\n        return o2;\n      }\n      return undefined;\n    }\n\n    if (typeof o1 === \"object\" && typeof o2 === \"object\" && o1 !== null && o2 !== null) {\n      const diffResult: any = {};\n\n      const keys = new Set([...Object.keys(o1), ...Object.keys(o2)]);\n      keys.forEach(key => {\n        const valueDiff = findDifferences(o1[key], o2[key]);\n        if (valueDiff !== undefined) {\n          diffResult[key] = valueDiff;\n        }\n      });\n\n      return Object.keys(diffResult).length > 0 ? diffResult : undefined;\n    }\n\n    return o1 === o2 ? undefined : o2;\n  }\n\n  return findDifferences(obj1, obj2);\n}\n\nexport { arraysEqual, diff };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/dom.ts",
    "content": "export interface VisibleDomRect {\n  bottom: number;\n  height: number;\n  left: number;\n  right: number;\n  top: number;\n  width: number;\n}\n\n/**\n * 获取元素可见信息\n * @param element\n */\nexport function getElementVisibleRect(element?: HTMLElement | null | undefined): VisibleDomRect {\n  if (!element) {\n    return {\n      bottom: 0,\n      height: 0,\n      left: 0,\n      right: 0,\n      top: 0,\n      width: 0,\n    };\n  }\n  const rect = element.getBoundingClientRect();\n  const viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight);\n\n  const top = Math.max(rect.top, 0);\n  const bottom = Math.min(rect.bottom, viewHeight);\n\n  const viewWidth = Math.max(document.documentElement.clientWidth, window.innerWidth);\n\n  const left = Math.max(rect.left, 0);\n  const right = Math.min(rect.right, viewWidth);\n\n  return {\n    bottom,\n    height: Math.max(0, bottom - top),\n    left,\n    right,\n    top,\n    width: Math.max(0, right - left),\n  };\n}\n\nexport function getScrollbarWidth() {\n  const scrollDiv = document.createElement(\"div\");\n\n  scrollDiv.style.visibility = \"hidden\";\n  scrollDiv.style.overflow = \"scroll\";\n  scrollDiv.style.position = \"absolute\";\n  scrollDiv.style.top = \"-9999px\";\n\n  document.body.append(scrollDiv);\n\n  const innerDiv = document.createElement(\"div\");\n  scrollDiv.append(innerDiv);\n\n  const scrollbarWidth = scrollDiv.offsetWidth - innerDiv.offsetWidth;\n\n  scrollDiv.remove();\n  return scrollbarWidth;\n}\n\nexport function needsScrollbar() {\n  const doc = document.documentElement;\n  const body = document.body;\n\n  // 检查 body 的 overflow-y 样式\n  const overflowY = window.getComputedStyle(body).overflowY;\n\n  // 如果明确设置了需要滚动条的样式\n  if (overflowY === \"scroll\" || overflowY === \"auto\") {\n    return doc.scrollHeight > window.innerHeight;\n  }\n\n  // 在其他情况下，根据 scrollHeight 和 innerHeight 比较判断\n  return doc.scrollHeight > window.innerHeight;\n}\n\nexport function triggerWindowResize(): void {\n  // 创建一个新的 resize 事件\n  const resizeEvent = new Event(\"resize\");\n\n  // 触发 window 的 resize 事件\n  window.dispatchEvent(resizeEvent);\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/download.ts",
    "content": "import { openWindow } from \"./window\";\n\ninterface DownloadOptions<T = string> {\n  fileName?: string;\n  source: T;\n  target?: string;\n}\n\nconst DEFAULT_FILENAME = \"downloaded_file\";\n\n/**\n * 通过 URL 下载文件，支持跨域\n * @throws {Error} - 当下载失败时抛出错误\n */\nexport async function downloadFileFromUrl({ fileName, source, target = \"_blank\" }: DownloadOptions): Promise<void> {\n  if (!source || typeof source !== \"string\") {\n    throw new Error(\"Invalid URL.\");\n  }\n\n  const isChrome = window.navigator.userAgent.toLowerCase().includes(\"chrome\");\n  const isSafari = window.navigator.userAgent.toLowerCase().includes(\"safari\");\n\n  if (/iP/.test(window.navigator.userAgent)) {\n    console.error(\"Your browser does not support download!\");\n    return;\n  }\n\n  if (isChrome || isSafari) {\n    triggerDownload(source, resolveFileName(source, fileName));\n    return;\n  }\n  if (!source.includes(\"?\")) {\n    source += \"?download\";\n  }\n\n  openWindow(source, { target });\n}\n\n/**\n * 通过 Base64 下载文件\n */\nexport function downloadFileFromBase64({ fileName, source }: DownloadOptions) {\n  if (!source || typeof source !== \"string\") {\n    throw new Error(\"Invalid Base64 data.\");\n  }\n\n  const resolvedFileName = fileName || DEFAULT_FILENAME;\n  triggerDownload(source, resolvedFileName);\n}\n\n/**\n * 通过图片 URL 下载图片文件\n */\nexport async function downloadFileFromImageUrl({ fileName, source }: DownloadOptions) {\n  const base64 = await urlToBase64(source);\n  downloadFileFromBase64({ fileName, source: base64 });\n}\n\n/**\n * 通过 Blob 下载文件\n */\nexport function downloadFileFromBlob({ fileName = DEFAULT_FILENAME, source }: DownloadOptions<Blob>): void {\n  if (!(source instanceof Blob)) {\n    throw new TypeError(\"Invalid Blob data.\");\n  }\n\n  const url = URL.createObjectURL(source);\n  triggerDownload(url, fileName);\n}\n\n/**\n * 下载文件，支持 Blob、字符串和其他 BlobPart 类型\n */\nexport function downloadFileFromBlobPart({ fileName = DEFAULT_FILENAME, source }: DownloadOptions<BlobPart>): void {\n  // 如果 data 不是 Blob，则转换为 Blob\n  const blob = source instanceof Blob ? source : new Blob([source], { type: \"application/octet-stream\" });\n\n  // 创建对象 URL 并触发下载\n  const url = URL.createObjectURL(blob);\n  triggerDownload(url, fileName);\n}\n\n/**\n * img url to base64\n * @param url\n */\nexport function urlToBase64(url: string, mineType?: string): Promise<string> {\n  return new Promise((resolve, reject) => {\n    let canvas = document.createElement(\"CANVAS\") as HTMLCanvasElement | null;\n    const ctx = canvas?.getContext(\"2d\");\n    const img = new Image();\n    img.crossOrigin = \"\";\n    img.addEventListener(\"load\", () => {\n      if (!canvas || !ctx) {\n        return reject(new Error(\"Failed to create canvas.\"));\n      }\n      canvas.height = img.height;\n      canvas.width = img.width;\n      ctx.drawImage(img, 0, 0);\n      const dataURL = canvas.toDataURL(mineType || \"image/png\");\n      canvas = null;\n      resolve(dataURL);\n    });\n    img.src = url;\n  });\n}\n\n/**\n * 通用下载触发函数\n * @param href - 文件下载的 URL\n * @param fileName - 下载文件的名称，如果未提供则自动识别\n * @param revokeDelay - 清理 URL 的延迟时间 (毫秒)\n */\nexport function triggerDownload(href: string, fileName: string | undefined, revokeDelay: number = 100): void {\n  const defaultFileName = \"downloaded_file\";\n  const finalFileName = fileName || defaultFileName;\n\n  const link = document.createElement(\"a\");\n  link.href = href;\n  link.download = finalFileName;\n  link.style.display = \"none\";\n\n  if (link.download === undefined) {\n    link.setAttribute(\"target\", \"_blank\");\n  }\n\n  document.body.append(link);\n  link.click();\n  link.remove();\n\n  // 清理临时 URL 以释放内存\n  setTimeout(() => URL.revokeObjectURL(href), revokeDelay);\n}\n\nfunction resolveFileName(url: string, fileName?: string): string {\n  return fileName || url.slice(url.lastIndexOf(\"/\") + 1) || DEFAULT_FILENAME;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/index.ts",
    "content": "export * from \"./cn\";\nexport * from \"./date\";\nexport * from \"./diff\";\nexport * from \"./dom\";\nexport * from \"./download\";\nexport * from \"./inference\";\nexport * from \"./letter\";\nexport * from \"./merge\";\nexport * from \"./nprogress\";\nexport * from \"./state-handler\";\nexport * from \"./to\";\nexport * from \"./tree\";\nexport * from \"./unique\";\nexport * from \"./update-css-variables\";\nexport * from \"./util\";\nexport * from \"./window\";\nexport { cloneDeep } from \"lodash-es\";\nexport { get } from \"lodash-es\";\nexport { isEqual } from \"lodash-es\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/inference.ts",
    "content": "import { isFunction, isObject, isString } from \"@vue/shared\";\n\n/**\n * 检查传入的值是否为undefined。\n *\n * @param {unknown} value 要检查的值。\n * @returns {boolean} 如果值是undefined，返回true，否则返回false。\n */\nfunction isUndefined(value?: unknown): value is undefined {\n  return value === undefined;\n}\n\n/**\n * 检查传入的值是否为boolean\n * @param value\n * @returns 如果值是布尔值，返回true，否则返回false。\n */\nfunction isBoolean(value: unknown): value is boolean {\n  return typeof value === \"boolean\";\n}\n\n/**\n * 检查传入的值是否为空。\n *\n * 以下情况将被认为是空：\n * - 值为null。\n * - 值为undefined。\n * - 值为一个空字符串。\n * - 值为一个长度为0的数组。\n * - 值为一个没有元素的Map或Set。\n * - 值为一个没有属性的对象。\n *\n * @param {T} value 要检查的值。\n * @returns {boolean} 如果值为空，返回true，否则返回false。\n */\nfunction isEmpty<T = unknown>(value?: T): value is T {\n  if (value === null || value === undefined) {\n    return true;\n  }\n\n  if (Array.isArray(value) || isString(value)) {\n    return value.length === 0;\n  }\n\n  if (value instanceof Map || value instanceof Set) {\n    return value.size === 0;\n  }\n\n  if (isObject(value)) {\n    return Object.keys(value).length === 0;\n  }\n\n  return false;\n}\n\n/**\n * 检查传入的字符串是否为有效的HTTP或HTTPS URL。\n *\n * @param {string} url 要检查的字符串。\n * @return {boolean} 如果字符串是有效的HTTP或HTTPS URL，返回true，否则返回false。\n */\nfunction isHttpUrl(url?: string): boolean {\n  if (!url) {\n    return false;\n  }\n  // 使用正则表达式测试URL是否以http:// 或 https:// 开头\n  const httpRegex = /^https?:\\/\\/.*$/;\n  return httpRegex.test(url);\n}\n\n/**\n * 检查传入的值是否为window对象。\n *\n * @param {any} value 要检查的值。\n * @returns {boolean} 如果值是window对象，返回true，否则返回false。\n */\nfunction isWindow(value: any): value is Window {\n  return typeof window !== \"undefined\" && value !== null && value === value.window;\n}\n\n/**\n * 检查当前运行环境是否为Mac OS。\n *\n * 这个函数通过检查navigator.userAgent字符串来判断当前运行环境。\n * 如果userAgent字符串中包含\"macintosh\"或\"mac os x\"（不区分大小写），则认为当前环境是Mac OS。\n *\n * @returns {boolean} 如果当前环境是Mac OS，返回true，否则返回false。\n */\nfunction isMacOs(): boolean {\n  const macRegex = /macintosh|mac os x/i;\n  return macRegex.test(navigator.userAgent);\n}\n\n/**\n * 检查当前运行环境是否为Windows OS。\n *\n * 这个函数通过检查navigator.userAgent字符串来判断当前运行环境。\n * 如果userAgent字符串中包含\"windows\"或\"win32\"（不区分大小写），则认为当前环境是Windows OS。\n *\n * @returns {boolean} 如果当前环境是Windows OS，返回true，否则返回false。\n */\nfunction isWindowsOs(): boolean {\n  const windowsRegex = /windows|win32/i;\n  return windowsRegex.test(navigator.userAgent);\n}\n\n/**\n * 检查传入的值是否为数字\n * @param value\n */\nfunction isNumber(value: any): value is number {\n  return typeof value === \"number\" && Number.isFinite(value);\n}\n\n/**\n * Returns the first value in the provided list that is neither `null` nor `undefined`.\n *\n * This function iterates over the input values and returns the first one that is\n * not strictly equal to `null` or `undefined`. If all values are either `null` or\n * `undefined`, it returns `undefined`.\n *\n * @template T - The type of the input values.\n * @param {...(T | null | undefined)[]} values - A list of values to evaluate.\n * @returns {T | undefined} - The first value that is not `null` or `undefined`, or `undefined` if none are found.\n *\n * @example\n * // Returns 42 because it is the first non-null, non-undefined value.\n * getFirstNonNullOrUndefined(undefined, null, 42, 'hello'); // 42\n *\n * @example\n * // Returns 'hello' because it is the first non-null, non-undefined value.\n * getFirstNonNullOrUndefined(null, undefined, 'hello', 123); // 'hello'\n *\n * @example\n * // Returns undefined because all values are either null or undefined.\n * getFirstNonNullOrUndefined(undefined, null); // undefined\n */\nfunction getFirstNonNullOrUndefined<T>(...values: (null | T | undefined)[]): T | undefined {\n  for (const value of values) {\n    if (value !== undefined && value !== null) {\n      return value;\n    }\n  }\n  return undefined;\n}\n\nexport { getFirstNonNullOrUndefined, isBoolean, isEmpty, isFunction, isHttpUrl, isMacOs, isNumber, isObject, isString, isUndefined, isWindow, isWindowsOs };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/letter.ts",
    "content": "/**\n * 将字符串的首字母大写\n * @param string\n */\nfunction capitalizeFirstLetter(string: string): string {\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n/**\n * 将字符串的首字母转换为小写。\n *\n * @param str 要转换的字符串\n * @returns 首字母小写的字符串\n */\nfunction toLowerCaseFirstLetter(str: string): string {\n  if (!str) return str; // 如果字符串为空，直接返回\n  return str.charAt(0).toLowerCase() + str.slice(1);\n}\n\n/**\n *  生成驼峰命名法的键名\n * @param key\n * @param parentKey\n */\nfunction toCamelCase(key: string, parentKey: string): string {\n  if (!parentKey) {\n    return key;\n  }\n  return parentKey + key.charAt(0).toUpperCase() + key.slice(1);\n}\n\nfunction kebabToCamelCase(str: string): string {\n  return str\n    .split(\"-\")\n    .filter(Boolean)\n    .map((word, index) => (index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)))\n    .join(\"\");\n}\n\nexport { capitalizeFirstLetter, kebabToCamelCase, toCamelCase, toLowerCaseFirstLetter };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/merge.ts",
    "content": "import { createDefu } from \"defu\";\n\nexport { createDefu as createMerge, defu as merge } from \"defu\";\n\nexport const mergeWithArrayOverride = createDefu((originObj, key, updates) => {\n  if (Array.isArray(originObj[key]) && Array.isArray(updates)) {\n    originObj[key] = updates;\n    return true;\n  }\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/nprogress.ts",
    "content": "import type NProgress from \"nprogress\";\n\n// 创建一个NProgress实例的变量，初始值为null\nlet nProgressInstance: null | typeof NProgress = null;\n\n/**\n * 动态加载NProgress库，并进行配置。\n * 此函数首先检查是否已经加载过NProgress库，如果已经加载过，则直接返回NProgress实例。\n * 否则，动态导入NProgress库，进行配置，然后返回NProgress实例。\n *\n * @returns  NProgress实例的Promise对象。\n */\nasync function loadNprogress() {\n  if (nProgressInstance) {\n    return nProgressInstance;\n  }\n  nProgressInstance = await import(\"nprogress\");\n  nProgressInstance.configure({\n    showSpinner: true,\n    speed: 300,\n  });\n  return nProgressInstance;\n}\n\n/**\n * 开始显示进度条。\n * 此函数首先加载NProgress库，然后调用NProgress的start方法开始显示进度条。\n */\nasync function startProgress() {\n  const nprogress = await loadNprogress();\n  nprogress?.start();\n}\n\n/**\n * 停止显示进度条，并隐藏进度条。\n * 此函数首先加载NProgress库，然后调用NProgress的done方法停止并隐藏进度条。\n */\nasync function stopProgress() {\n  const nprogress = await loadNprogress();\n  nprogress?.done();\n}\n\nexport { startProgress, stopProgress };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/state-handler.ts",
    "content": "export class StateHandler {\n  private condition: boolean = false;\n  private rejectCondition: (() => void) | null = null;\n  private resolveCondition: (() => void) | null = null;\n\n  isConditionTrue(): boolean {\n    return this.condition;\n  }\n\n  reset() {\n    this.condition = false;\n    this.clearPromises();\n  }\n\n  // 触发状态为 false 时，reject\n  setConditionFalse() {\n    this.condition = false;\n    if (this.rejectCondition) {\n      this.rejectCondition();\n      this.clearPromises();\n    }\n  }\n\n  // 触发状态为 true 时，resolve\n  setConditionTrue() {\n    this.condition = true;\n    if (this.resolveCondition) {\n      this.resolveCondition();\n      this.clearPromises();\n    }\n  }\n\n  // 返回一个 Promise，等待 condition 变为 true\n  waitForCondition(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (this.condition) {\n        resolve(); // 如果 condition 已经为 true，立即 resolve\n      } else {\n        this.resolveCondition = resolve;\n        this.rejectCondition = reject;\n      }\n    });\n  }\n\n  // 清理 resolve/reject 函数\n  private clearPromises() {\n    this.resolveCondition = null;\n    this.rejectCondition = null;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/to.ts",
    "content": "/**\n * @param { Readonly<Promise> } promise\n * @param {object=} errorExt - Additional Information you can pass to the err object\n * @return { Promise }\n */\nexport async function to<T, U = Error>(promise: Readonly<Promise<T>>, errorExt?: object): Promise<[null, T] | [U, undefined]> {\n  try {\n    const data = await promise;\n    const result: [null, T] = [null, data];\n    return result;\n  } catch (error) {\n    if (errorExt) {\n      const parsedError = Object.assign({}, error, errorExt);\n      return [parsedError as U, undefined];\n    }\n    return [error as U, undefined];\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/tree.ts",
    "content": "interface TreeConfigOptions {\n  // 子属性的名称，默认为'children'\n  childProps: string;\n}\n\n/**\n * @zh_CN 遍历树形结构，并返回所有节点中指定的值。\n * @param tree 树形结构数组\n * @param getValue 获取节点值的函数\n * @param options 作为子节点数组的可选属性名称。\n * @returns 所有节点中指定的值的数组\n */\nfunction traverseTreeValues<T, V>(tree: T[], getValue: (node: T) => V, options?: TreeConfigOptions): V[] {\n  const result: V[] = [];\n  const { childProps } = options || {\n    childProps: \"children\",\n  };\n\n  const dfs = (treeNode: T) => {\n    const value = getValue(treeNode);\n    result.push(value);\n    const children = (treeNode as Record<string, any>)?.[childProps];\n    if (!children) {\n      return;\n    }\n    if (children.length > 0) {\n      for (const child of children) {\n        dfs(child);\n      }\n    }\n  };\n\n  for (const treeNode of tree) {\n    dfs(treeNode);\n  }\n  return result.filter(Boolean);\n}\n\n/**\n * 根据条件过滤给定树结构的节点，并以原有顺序返回所有匹配节点的数组。\n * @param tree 要过滤的树结构的根节点数组。\n * @param filter 用于匹配每个节点的条件。\n * @param options 作为子节点数组的可选属性名称。\n * @returns 包含所有匹配节点的数组。\n */\nfunction filterTree<T extends Record<string, any>>(tree: T[], filter: (node: T) => boolean, options?: TreeConfigOptions): T[] {\n  const { childProps } = options || {\n    childProps: \"children\",\n  };\n\n  const _filterTree = (nodes: T[]): T[] => {\n    return nodes.filter((node: Record<string, any>) => {\n      if (filter(node as T)) {\n        if (node[childProps]) {\n          node[childProps] = _filterTree(node[childProps]);\n        }\n        return true;\n      }\n      return false;\n    });\n  };\n\n  return _filterTree(tree);\n}\n\n/**\n * 根据条件重新映射给定树结构的节\n * @param tree 要过滤的树结构的根节点数组。\n * @param mapper 用于map每个节点的条件。\n * @param options 作为子节点数组的可选属性名称。\n */\nfunction mapTree<T, V extends Record<string, any>>(tree: T[], mapper: (node: T) => V, options?: TreeConfigOptions): V[] {\n  const { childProps } = options || {\n    childProps: \"children\",\n  };\n  return tree.map(node => {\n    const mapperNode: Record<string, any> = mapper(node);\n    if (mapperNode[childProps]) {\n      mapperNode[childProps] = mapTree(mapperNode[childProps], mapper, options);\n    }\n    return mapperNode as V;\n  });\n}\n\nexport { filterTree, mapTree, traverseTreeValues };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/unique.ts",
    "content": "/**\n * 根据指定字段对对象数组进行去重\n * @param arr 要去重的对象数组\n * @param key 去重依据的字段名\n * @returns 去重后的对象数组\n */\nfunction uniqueByField<T>(arr: T[], key: keyof T): T[] {\n  const seen = new Map<any, T>();\n  return arr.filter(item => {\n    const value = item[key];\n    return seen.has(value) ? false : (seen.set(value, item), true);\n  });\n}\n\nexport { uniqueByField };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/update-css-variables.ts",
    "content": "/**\n * 更新 CSS 变量的函数\n * @param variables 要更新的 CSS 变量与其新值的映射\n */\nfunction updateCSSVariables(variables: { [key: string]: string }, id = \"__vben-styles__\"): void {\n  // 获取或创建内联样式表元素\n  const styleElement = document.querySelector(`#${id}`) || document.createElement(\"style\");\n\n  styleElement.id = id;\n\n  // 构建要更新的 CSS 变量的样式文本\n  let cssText = \":root {\";\n  for (const key in variables) {\n    if (Object.prototype.hasOwnProperty.call(variables, key)) {\n      cssText += `${key}: ${variables[key]};`;\n    }\n  }\n  cssText += \"}\";\n\n  // 将样式文本赋值给内联样式表\n  styleElement.textContent = cssText;\n\n  // 将内联样式表添加到文档头部\n  if (!document.querySelector(`#${id}`)) {\n    setTimeout(() => {\n      document.head.append(styleElement);\n    });\n  }\n}\n\nexport { updateCSSVariables };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/util.ts",
    "content": "export function bindMethods<T extends object>(instance: T): void {\n  const prototype = Object.getPrototypeOf(instance);\n  const propertyNames = Object.getOwnPropertyNames(prototype);\n\n  propertyNames.forEach(propertyName => {\n    const descriptor = Object.getOwnPropertyDescriptor(prototype, propertyName);\n    const propertyValue = instance[propertyName as keyof T];\n\n    if (typeof propertyValue === \"function\" && propertyName !== \"constructor\" && descriptor && !descriptor.get && !descriptor.set) {\n      instance[propertyName as keyof T] = propertyValue.bind(instance);\n    }\n  });\n}\n\n/**\n * 获取嵌套对象的字段值\n * @param obj - 要查找的对象\n * @param path - 用于查找字段的路径，使用小数点分隔\n * @returns 字段值，或者未找到时返回 undefined\n */\nexport function getNestedValue<T>(obj: T, path: string): any {\n  if (typeof path !== \"string\" || path.length === 0) {\n    throw new Error(\"Path must be a non-empty string\");\n  }\n  // 把路径字符串按 \".\" 分割成数组\n  const keys = path.split(\".\") as (number | string)[];\n\n  let current: any = obj;\n\n  for (const key of keys) {\n    if (current === null || current === undefined) {\n      return undefined;\n    }\n    current = current[key as keyof typeof current];\n  }\n\n  return current;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/shared/utils/window.ts",
    "content": "interface OpenWindowOptions {\n  noopener?: boolean;\n  noreferrer?: boolean;\n  target?: \"_blank\" | \"_parent\" | \"_self\" | \"_top\" | string;\n}\n\n/**\n * 新窗口打开URL。\n *\n * @param url - 需要打开的网址。\n * @param options - 打开窗口的选项。\n */\nfunction openWindow(url: string, options: OpenWindowOptions = {}): void {\n  // 解构并设置默认值\n  const { noopener = true, noreferrer = true, target = \"_blank\" } = options;\n\n  // 基于选项创建特性字符串\n  const features = [noopener && \"noopener=yes\", noreferrer && \"noreferrer=yes\"].filter(Boolean).join(\",\");\n\n  // 打开窗口\n  window.open(url, target, features);\n}\n\n/**\n * 在新窗口中打开路由。\n * @param path\n */\nfunction openRouteInNewWindow(path: string) {\n  const { hash, origin } = location;\n  const fullPath = path.startsWith(\"/\") ? path : `/${path}`;\n  const url = `${origin}${hash ? \"/#\" : \"\"}${fullPath}`;\n  openWindow(url, { target: \"_blank\" });\n}\n\nexport { openRouteInNewWindow, openWindow };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/stores/index.ts",
    "content": "export * from \"./modules\";\nexport * from \"./setup\";\nexport { defineStore, storeToRefs } from \"pinia\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/stores/modules/access.test.ts",
    "content": "import { createPinia, setActivePinia } from \"pinia\";\nimport { beforeEach, describe, expect, it } from \"vitest\";\n\nimport { useAccessStore } from \"./access\";\n\ndescribe(\"useAccessStore\", () => {\n  beforeEach(() => {\n    setActivePinia(createPinia());\n  });\n\n  it(\"updates accessMenus state\", () => {\n    const store = useAccessStore();\n    expect(store.accessMenus).toEqual([]);\n    store.setAccessMenus([{ name: \"Dashboard\", path: \"/dashboard\" }]);\n    expect(store.accessMenus).toEqual([{ name: \"Dashboard\", path: \"/dashboard\" }]);\n  });\n\n  it(\"updates accessToken state correctly\", () => {\n    const store = useAccessStore();\n    expect(store.accessToken).toBeNull(); // 初始状态\n    store.setAccessToken(\"abc123\");\n    expect(store.accessToken).toBe(\"abc123\");\n  });\n\n  it(\"returns the correct accessToken\", () => {\n    const store = useAccessStore();\n    store.setAccessToken(\"xyz789\");\n    expect(store.accessToken).toBe(\"xyz789\");\n  });\n\n  // 测试设置空的访问菜单列表\n  it(\"handles empty accessMenus correctly\", () => {\n    const store = useAccessStore();\n    store.setAccessMenus([]);\n    expect(store.accessMenus).toEqual([]);\n  });\n\n  // 测试设置空的访问路由列表\n  it(\"handles empty accessRoutes correctly\", () => {\n    const store = useAccessStore();\n    store.setAccessRoutes([]);\n    expect(store.accessRoutes).toEqual([]);\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/stores/modules/access.ts",
    "content": "import type { RouteRecordRaw } from \"vue-router\";\n\nimport type { MenuRecordRaw } from \"../../typings\";\n\nimport { acceptHMRUpdate, defineStore } from \"pinia\";\n\ntype AccessToken = null | string;\n\ninterface AccessState {\n  /**\n   * 权限码\n   */\n  accessCodes: string[];\n  /**\n   * 可访问的菜单列表\n   */\n  accessMenus: MenuRecordRaw[];\n  /**\n   * 可访问的路由列表\n   */\n  accessRoutes: RouteRecordRaw[];\n  /**\n   * 登录 accessToken\n   */\n  accessToken: AccessToken;\n  /**\n   * 是否已经检查过权限\n   */\n  isAccessChecked: boolean;\n  /**\n   * 登录是否过期\n   */\n  loginExpired: boolean;\n  /**\n   * 登录 accessToken\n   */\n  refreshToken: AccessToken;\n}\n\n/**\n * @zh_CN 访问权限相关\n */\nexport const useAccessStore = defineStore(\"core-access\", {\n  actions: {\n    getMenuByPath(path: string) {\n      function findMenu(menus: MenuRecordRaw[], path: string): MenuRecordRaw | undefined {\n        for (const menu of menus) {\n          if (menu.path === path) {\n            return menu;\n          }\n          if (menu.children) {\n            const matched = findMenu(menu.children, path);\n            if (matched) {\n              return matched;\n            }\n          }\n        }\n      }\n      return findMenu(this.accessMenus, path);\n    },\n    setAccessCodes(codes: string[]) {\n      this.accessCodes = codes;\n    },\n    setAccessMenus(menus: MenuRecordRaw[]) {\n      this.accessMenus = menus;\n    },\n    setAccessRoutes(routes: RouteRecordRaw[]) {\n      this.accessRoutes = routes;\n    },\n    setAccessToken(token: AccessToken) {\n      this.accessToken = token;\n    },\n    setIsAccessChecked(isAccessChecked: boolean) {\n      this.isAccessChecked = isAccessChecked;\n    },\n    setLoginExpired(loginExpired: boolean) {\n      this.loginExpired = loginExpired;\n    },\n    setRefreshToken(token: AccessToken) {\n      this.refreshToken = token;\n    },\n  },\n  persist: {\n    // 持久化\n    pick: [\"accessToken\", \"refreshToken\", \"accessCodes\"],\n  },\n  state: (): AccessState => ({\n    accessCodes: [],\n    accessMenus: [],\n    accessRoutes: [],\n    accessToken: null,\n    isAccessChecked: false,\n    loginExpired: false,\n    refreshToken: null,\n  }),\n});\n\n// 解决热更新问题\nconst hot = import.meta.hot;\nif (hot) {\n  hot.accept(acceptHMRUpdate(useAccessStore, hot));\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/stores/modules/index.ts",
    "content": "export * from \"./access\";\nexport * from \"./lock\";\nexport * from \"./tabbar\";\nexport * from \"./user\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/stores/modules/lock.test.ts",
    "content": "import { createPinia, setActivePinia } from \"pinia\";\nimport { beforeEach, describe, expect, it } from \"vitest\";\n\nimport { useLockStore } from \"./lock\";\n\ndescribe(\"useLockStore\", () => {\n  beforeEach(() => {\n    setActivePinia(createPinia());\n  });\n\n  it(\"should initialize with correct default state\", () => {\n    const store = useLockStore();\n    expect(store.isLockScreen).toBe(false);\n    expect(store.lockScreenPassword).toBeUndefined();\n  });\n\n  it(\"should lock screen with a password\", () => {\n    const store = useLockStore();\n    store.lockScreen(\"1234\");\n    expect(store.isLockScreen).toBe(true);\n    expect(store.lockScreenPassword).toBe(\"1234\");\n  });\n\n  it(\"should unlock screen and clear password\", () => {\n    const store = useLockStore();\n    store.lockScreen(\"1234\");\n    store.unlockScreen();\n    expect(store.isLockScreen).toBe(false);\n    expect(store.lockScreenPassword).toBeUndefined();\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/stores/modules/lock.ts",
    "content": "import { defineStore } from \"pinia\";\n\ninterface AppState {\n  /**\n   * 是否锁屏状态\n   */\n  isLockScreen: boolean;\n  /**\n   * 锁屏密码\n   */\n  lockScreenPassword?: string;\n}\n\nexport const useLockStore = defineStore(\"core-lock\", {\n  actions: {\n    lockScreen(password: string) {\n      this.isLockScreen = true;\n      this.lockScreenPassword = password;\n    },\n\n    unlockScreen() {\n      this.isLockScreen = false;\n      this.lockScreenPassword = undefined;\n    },\n  },\n  persist: {\n    pick: [\"isLockScreen\", \"lockScreenPassword\"],\n  },\n  state: (): AppState => ({\n    isLockScreen: false,\n    lockScreenPassword: undefined,\n  }),\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/stores/modules/tabbar.test.ts",
    "content": "import { createRouter, createWebHistory } from \"vue-router\";\n\nimport { createPinia, setActivePinia } from \"pinia\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { useTabbarStore } from \"./tabbar\";\n\ndescribe(\"useAccessStore\", () => {\n  const router = createRouter({\n    history: createWebHistory(),\n    routes: [],\n  });\n  router.push = vi.fn();\n  router.replace = vi.fn();\n  beforeEach(() => {\n    setActivePinia(createPinia());\n    vi.clearAllMocks();\n  });\n\n  it(\"adds a new tab\", () => {\n    const store = useTabbarStore();\n    const tab: any = {\n      fullPath: \"/home\",\n      meta: {},\n      name: \"Home\",\n      path: \"/home\",\n    };\n    store.addTab(tab);\n    expect(store.tabs.length).toBe(1);\n    expect(store.tabs[0]).toEqual(tab);\n  });\n\n  it(\"adds a new tab if it does not exist\", () => {\n    const store = useTabbarStore();\n    const newTab: any = {\n      fullPath: \"/new\",\n      meta: {},\n      name: \"New\",\n      path: \"/new\",\n    };\n    store.addTab(newTab);\n    expect(store.tabs).toContainEqual(newTab);\n  });\n\n  it(\"updates an existing tab instead of adding a new one\", () => {\n    const store = useTabbarStore();\n    const initialTab: any = {\n      fullPath: \"/existing\",\n      meta: {},\n      name: \"Existing\",\n      path: \"/existing\",\n      query: {},\n    };\n    store.tabs.push(initialTab);\n    const updatedTab = { ...initialTab, query: { id: \"1\" } };\n    store.addTab(updatedTab);\n    expect(store.tabs.length).toBe(1);\n    expect(store.tabs[0]?.query).toEqual({ id: \"1\" });\n  });\n\n  it(\"closes all tabs\", async () => {\n    const store = useTabbarStore();\n    store.tabs = [{ fullPath: \"/home\", meta: {}, name: \"Home\", path: \"/home\" }] as any;\n    router.replace = vi.fn();\n\n    await store.closeAllTabs(router);\n\n    expect(store.tabs.length).toBe(1);\n  });\n\n  it(\"closes a non-affix tab\", () => {\n    const store = useTabbarStore();\n    const tab: any = {\n      fullPath: \"/closable\",\n      meta: {},\n      name: \"Closable\",\n      path: \"/closable\",\n    };\n    store.tabs.push(tab);\n    store._close(tab);\n    expect(store.tabs.length).toBe(0);\n  });\n\n  it(\"does not close an affix tab\", () => {\n    const store = useTabbarStore();\n    const affixTab: any = {\n      fullPath: \"/affix\",\n      meta: { affixTab: true },\n      name: \"Affix\",\n      path: \"/affix\",\n    };\n    store.tabs.push(affixTab);\n    store._close(affixTab);\n    expect(store.tabs.length).toBe(1); // Affix tab should not be closed\n  });\n\n  it(\"returns all cache tabs\", () => {\n    const store = useTabbarStore();\n    store.cachedTabs.add(\"Home\");\n    store.cachedTabs.add(\"About\");\n    expect(store.getCachedTabs).toEqual([\"Home\", \"About\"]);\n  });\n\n  it(\"returns all tabs, including affix tabs\", () => {\n    const store = useTabbarStore();\n    const normalTab: any = {\n      fullPath: \"/normal\",\n      meta: {},\n      name: \"Normal\",\n      path: \"/normal\",\n    };\n    const affixTab: any = {\n      fullPath: \"/affix\",\n      meta: { affixTab: true },\n      name: \"Affix\",\n      path: \"/affix\",\n    };\n    store.tabs.push(normalTab);\n    store.affixTabs.push(affixTab);\n    expect(store.getTabs).toContainEqual(normalTab);\n    expect(store.affixTabs).toContainEqual(affixTab);\n  });\n\n  it(\"navigates to a specific tab\", async () => {\n    const store = useTabbarStore();\n    const tab: any = { meta: {}, name: \"Dashboard\", path: \"/dashboard\" };\n\n    await store._goToTab(tab, router);\n\n    expect(router.replace).toHaveBeenCalledWith({\n      params: {},\n      path: \"/dashboard\",\n      query: {},\n    });\n  });\n\n  it(\"closes multiple tabs by paths\", async () => {\n    const store = useTabbarStore();\n    store.addTab({\n      fullPath: \"/home\",\n      meta: {},\n      name: \"Home\",\n      path: \"/home\",\n    } as any);\n    store.addTab({\n      fullPath: \"/about\",\n      meta: {},\n      name: \"About\",\n      path: \"/about\",\n    } as any);\n    store.addTab({\n      fullPath: \"/contact\",\n      meta: {},\n      name: \"Contact\",\n      path: \"/contact\",\n    } as any);\n\n    await store._bulkCloseByPaths([\"/home\", \"/contact\"]);\n\n    expect(store.tabs).toHaveLength(1);\n    expect(store.tabs[0]?.name).toBe(\"About\");\n  });\n\n  it(\"closes all tabs to the left of the specified tab\", async () => {\n    const store = useTabbarStore();\n    store.addTab({\n      fullPath: \"/home\",\n      meta: {},\n      name: \"Home\",\n      path: \"/home\",\n    } as any);\n    store.addTab({\n      fullPath: \"/about\",\n      meta: {},\n      name: \"About\",\n      path: \"/about\",\n    } as any);\n    const targetTab: any = {\n      fullPath: \"/contact\",\n      meta: {},\n      name: \"Contact\",\n      path: \"/contact\",\n    };\n    store.addTab(targetTab);\n\n    await store.closeLeftTabs(targetTab);\n\n    expect(store.tabs).toHaveLength(1);\n    expect(store.tabs[0]?.name).toBe(\"Contact\");\n  });\n\n  it(\"closes all tabs except the specified tab\", async () => {\n    const store = useTabbarStore();\n    store.addTab({\n      fullPath: \"/home\",\n      meta: {},\n      name: \"Home\",\n      path: \"/home\",\n    } as any);\n    const targetTab: any = {\n      fullPath: \"/about\",\n      meta: {},\n      name: \"About\",\n      path: \"/about\",\n    };\n    store.addTab(targetTab);\n    store.addTab({\n      fullPath: \"/contact\",\n      meta: {},\n      name: \"Contact\",\n      path: \"/contact\",\n    } as any);\n\n    await store.closeOtherTabs(targetTab);\n\n    expect(store.tabs).toHaveLength(1);\n    expect(store.tabs[0]?.name).toBe(\"About\");\n  });\n\n  it(\"closes all tabs to the right of the specified tab\", async () => {\n    const store = useTabbarStore();\n    const targetTab: any = {\n      fullPath: \"/home\",\n      meta: {},\n      name: \"Home\",\n      path: \"/home\",\n    };\n    store.addTab(targetTab);\n    store.addTab({\n      fullPath: \"/about\",\n      meta: {},\n      name: \"About\",\n      path: \"/about\",\n    } as any);\n    store.addTab({\n      fullPath: \"/contact\",\n      meta: {},\n      name: \"Contact\",\n      path: \"/contact\",\n    } as any);\n\n    await store.closeRightTabs(targetTab);\n\n    expect(store.tabs).toHaveLength(1);\n    expect(store.tabs[0]?.name).toBe(\"Home\");\n  });\n\n  it(\"closes the tab with the specified key\", async () => {\n    const store = useTabbarStore();\n    const keyToClose = \"/about\";\n    store.addTab({\n      fullPath: \"/home\",\n      meta: {},\n      name: \"Home\",\n      path: \"/home\",\n    } as any);\n    store.addTab({\n      fullPath: keyToClose,\n      meta: {},\n      name: \"About\",\n      path: \"/about\",\n    } as any);\n    store.addTab({\n      fullPath: \"/contact\",\n      meta: {},\n      name: \"Contact\",\n      path: \"/contact\",\n    } as any);\n\n    await store.closeTabByKey(keyToClose, router);\n\n    expect(store.tabs).toHaveLength(2);\n    expect(store.tabs.find(tab => tab.fullPath === keyToClose)).toBeUndefined();\n  });\n\n  it(\"refreshes the current tab\", async () => {\n    const store = useTabbarStore();\n    const currentTab: any = {\n      fullPath: \"/dashboard\",\n      meta: { name: \"Dashboard\" },\n      name: \"Dashboard\",\n      path: \"/dashboard\",\n    };\n    router.currentRoute.value = currentTab;\n\n    await store.refresh(router);\n\n    expect(store.excludeCachedTabs.has(\"Dashboard\")).toBe(false);\n    expect(store.renderRouteView).toBe(true);\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/stores/modules/tabbar.ts",
    "content": "import type { Router, RouteRecordNormalized } from \"vue-router\";\n\nimport type { TabDefinition } from \"/@/vben/typings\";\n\nimport { toRaw } from \"vue\";\n\nimport { preferences } from \"/@/vben/preferences\";\nimport { openRouteInNewWindow, startProgress, stopProgress } from \"/@/vben/shared/utils\";\n\nimport { acceptHMRUpdate, defineStore } from \"pinia\";\n\ninterface TabbarState {\n  /**\n   * @zh_CN 当前打开的标签页列表缓存\n   */\n  cachedTabs: Set<string>;\n  /**\n   * @zh_CN 拖拽结束的索引\n   */\n  dragEndIndex: number;\n  /**\n   * @zh_CN 需要排除缓存的标签页\n   */\n  excludeCachedTabs: Set<string>;\n  /**\n   * @zh_CN 是否刷新\n   */\n  renderRouteView?: boolean;\n  /**\n   * @zh_CN 当前打开的标签页列表\n   */\n  tabs: TabDefinition[];\n  /**\n   * @zh_CN 更新时间，用于一些更新场景，使用watch深度监听的话，会损耗性能\n   */\n  updateTime?: number;\n}\n\n/**\n * @zh_CN 访问权限相关\n */\nexport const useTabbarStore = defineStore(\"core-tabbar\", {\n  actions: {\n    /**\n     * Close tabs in bulk\n     */\n    async _bulkCloseByPaths(paths: string[]) {\n      this.tabs = this.tabs.filter(item => {\n        return !paths.includes(getTabPath(item));\n      });\n\n      this.updateCacheTabs();\n    },\n    /**\n     * @zh_CN 关闭标签页\n     * @param tab\n     */\n    _close(tab: TabDefinition) {\n      const { fullPath } = tab;\n      if (isAffixTab(tab)) {\n        return;\n      }\n      const index = this.tabs.findIndex(item => item.fullPath === fullPath);\n      index !== -1 && this.tabs.splice(index, 1);\n    },\n    /**\n     * @zh_CN 跳转到默认标签页\n     */\n    async _goToDefaultTab(router: Router) {\n      if (this.getTabs.length <= 0) {\n        return;\n      }\n      const firstTab = this.getTabs[0];\n      if (firstTab) {\n        await this._goToTab(firstTab, router);\n      }\n    },\n    /**\n     * @zh_CN 跳转到标签页\n     * @param tab\n     * @param router\n     */\n    async _goToTab(tab: TabDefinition, router: Router) {\n      const { params, path, query } = tab;\n      const toParams = {\n        params: params || {},\n        path,\n        query: query || {},\n      };\n      await router.replace(toParams);\n    },\n    /**\n     * @zh_CN 添加标签页\n     * @param routeTab\n     */\n    addTab(routeTab: TabDefinition) {\n      const tab = cloneTab(routeTab);\n      if (!isTabShown(tab)) {\n        return;\n      }\n\n      const tabIndex = this.tabs.findIndex(tab => {\n        return getTabPath(tab) === getTabPath(routeTab);\n      });\n\n      if (tabIndex === -1) {\n        const maxCount = preferences.tabbar.maxCount;\n        // 获取动态路由打开数，超过 0 即代表需要控制打开数\n        const maxNumOfOpenTab = (routeTab?.meta?.maxNumOfOpenTab ?? -1) as number;\n        // 如果动态路由层级大于 0 了，那么就要限制该路由的打开数限制了\n        // 获取到已经打开的动态路由数, 判断是否大于某一个值\n        if (maxNumOfOpenTab > 0 && this.tabs.filter(tab => tab.name === routeTab.name).length >= maxNumOfOpenTab) {\n          // 关闭第一个\n          const index = this.tabs.findIndex(item => item.name === routeTab.name);\n          index !== -1 && this.tabs.splice(index, 1);\n        } else if (maxCount > 0 && this.tabs.length >= maxCount) {\n          // 关闭第一个\n          const index = this.tabs.findIndex(item => !Reflect.has(item.meta, \"affixTab\") || !item.meta.affixTab);\n          index !== -1 && this.tabs.splice(index, 1);\n        }\n        this.tabs.push(tab);\n      } else {\n        // 页面已经存在，不重复添加选项卡，只更新选项卡参数\n        const currentTab = toRaw(this.tabs)[tabIndex];\n        const mergedTab = {\n          ...currentTab,\n          ...tab,\n          meta: { ...currentTab?.meta, ...tab.meta },\n        };\n        if (currentTab) {\n          const curMeta = currentTab.meta;\n          if (Reflect.has(curMeta, \"affixTab\")) {\n            mergedTab.meta.affixTab = curMeta.affixTab;\n          }\n          if (Reflect.has(curMeta, \"newTabTitle\")) {\n            mergedTab.meta.newTabTitle = curMeta.newTabTitle;\n          }\n        }\n\n        this.tabs.splice(tabIndex, 1, mergedTab);\n      }\n      this.updateCacheTabs();\n    },\n    /**\n     * @zh_CN 关闭所有标签页\n     */\n    async closeAllTabs(router: Router) {\n      const newTabs = this.tabs.filter(tab => isAffixTab(tab));\n      this.tabs = newTabs.length > 0 ? newTabs : [...this.tabs].splice(0, 1);\n      await this._goToDefaultTab(router);\n      this.updateCacheTabs();\n    },\n    /**\n     * @zh_CN 关闭左侧标签页\n     * @param tab\n     */\n    async closeLeftTabs(tab: TabDefinition) {\n      const index = this.tabs.findIndex(item => getTabPath(item) === getTabPath(tab));\n\n      if (index < 1) {\n        return;\n      }\n\n      const leftTabs = this.tabs.slice(0, index);\n      const paths: string[] = [];\n\n      for (const item of leftTabs) {\n        if (!isAffixTab(item)) {\n          paths.push(getTabPath(item));\n        }\n      }\n      await this._bulkCloseByPaths(paths);\n    },\n    /**\n     * @zh_CN 关闭其他标签页\n     * @param tab\n     */\n    async closeOtherTabs(tab: TabDefinition) {\n      const closePaths = this.tabs.map(item => getTabPath(item));\n\n      const paths: string[] = [];\n\n      for (const path of closePaths) {\n        if (path !== tab.fullPath) {\n          const closeTab = this.tabs.find(item => getTabPath(item) === path);\n          if (!closeTab) {\n            continue;\n          }\n          if (!isAffixTab(closeTab)) {\n            paths.push(getTabPath(closeTab));\n          }\n        }\n      }\n      await this._bulkCloseByPaths(paths);\n    },\n    /**\n     * @zh_CN 关闭右侧标签页\n     * @param tab\n     */\n    async closeRightTabs(tab: TabDefinition) {\n      const index = this.tabs.findIndex(item => getTabPath(item) === getTabPath(tab));\n\n      if (index !== -1 && index < this.tabs.length - 1) {\n        const rightTabs = this.tabs.slice(index + 1);\n\n        const paths: string[] = [];\n        for (const item of rightTabs) {\n          if (!isAffixTab(item)) {\n            paths.push(getTabPath(item));\n          }\n        }\n        await this._bulkCloseByPaths(paths);\n      }\n    },\n\n    /**\n     * @zh_CN 关闭标签页\n     * @param tab\n     * @param router\n     */\n    async closeTab(tab: TabDefinition, router: Router) {\n      const { currentRoute } = router;\n\n      // 关闭不是激活选项卡\n      if (getTabPath(currentRoute.value) !== getTabPath(tab)) {\n        this._close(tab);\n        this.updateCacheTabs();\n        return;\n      }\n      const index = this.getTabs.findIndex(item => getTabPath(item) === getTabPath(currentRoute.value));\n\n      const before = this.getTabs[index - 1];\n      const after = this.getTabs[index + 1];\n\n      // 下一个tab存在，跳转到下一个\n      if (after) {\n        this._close(tab);\n        await this._goToTab(after, router);\n        // 上一个tab存在，跳转到上一个\n      } else if (before) {\n        this._close(tab);\n        await this._goToTab(before, router);\n      } else {\n        console.error(\"Failed to close the tab; only one tab remains open.\");\n      }\n    },\n\n    /**\n     * @zh_CN 通过key关闭标签页\n     * @param key\n     * @param router\n     */\n    async closeTabByKey(key: string, router: Router) {\n      const originKey = decodeURIComponent(key);\n      const index = this.tabs.findIndex(item => getTabPath(item) === originKey);\n      if (index === -1) {\n        return;\n      }\n\n      const tab = this.tabs[index];\n      if (tab) {\n        await this.closeTab(tab, router);\n      }\n    },\n\n    /**\n     * 根据路径获取标签页\n     * @param path\n     */\n    getTabByPath(path: string) {\n      return this.getTabs.find(item => getTabPath(item) === path) as TabDefinition;\n    },\n    /**\n     * @zh_CN 新窗口打开标签页\n     * @param tab\n     */\n    async openTabInNewWindow(tab: TabDefinition) {\n      openRouteInNewWindow(tab.fullPath || tab.path);\n    },\n\n    /**\n     * @zh_CN 固定标签页\n     * @param tab\n     */\n    async pinTab(tab: TabDefinition) {\n      const index = this.tabs.findIndex(item => getTabPath(item) === getTabPath(tab));\n      if (index !== -1) {\n        const oldTab = this.tabs[index];\n        tab.meta.affixTab = true;\n        tab.meta.title = oldTab?.meta?.title as string;\n        // this.addTab(tab);\n        this.tabs.splice(index, 1, tab);\n      }\n      // 过滤固定tabs，后面更改affixTabOrder的值的话可能会有问题，目前行464排序affixTabs没有设置值\n      const affixTabs = this.tabs.filter(tab => isAffixTab(tab));\n      // 获得固定tabs的index\n      const newIndex = affixTabs.findIndex(item => getTabPath(item) === getTabPath(tab));\n      // 交换位置重新排序\n      await this.sortTabs(index, newIndex);\n    },\n\n    /**\n     * 刷新标签页\n     */\n    async refresh(router: Router) {\n      const { currentRoute } = router;\n      const { name } = currentRoute.value;\n\n      this.excludeCachedTabs.add(name as string);\n      this.renderRouteView = false;\n      startProgress();\n\n      await new Promise(resolve => setTimeout(resolve, 200));\n\n      this.excludeCachedTabs.delete(name as string);\n      this.renderRouteView = true;\n      stopProgress();\n    },\n\n    /**\n     * @zh_CN 重置标签页标题\n     */\n    async resetTabTitle(tab: TabDefinition) {\n      if (tab?.meta?.newTabTitle) {\n        return;\n      }\n      const findTab = this.tabs.find(item => getTabPath(item) === getTabPath(tab));\n      if (findTab) {\n        findTab.meta.newTabTitle = undefined;\n        await this.updateCacheTabs();\n      }\n    },\n\n    /**\n     * 设置固定标签页\n     * @param tabs\n     */\n    setAffixTabs(tabs: RouteRecordNormalized[]) {\n      for (const tab of tabs) {\n        tab.meta.affixTab = true;\n        this.addTab(routeToTab(tab));\n      }\n    },\n\n    /**\n     * @zh_CN 设置标签页标题\n     * @param tab\n     * @param title\n     */\n    async setTabTitle(tab: TabDefinition, title: string) {\n      const findTab = this.tabs.find(item => getTabPath(item) === getTabPath(tab));\n\n      if (findTab) {\n        findTab.meta.newTabTitle = title;\n\n        await this.updateCacheTabs();\n      }\n    },\n\n    setUpdateTime() {\n      this.updateTime = Date.now();\n    },\n    /**\n     * @zh_CN 设置标签页顺序\n     * @param oldIndex\n     * @param newIndex\n     */\n    async sortTabs(oldIndex: number, newIndex: number) {\n      const currentTab = this.tabs[oldIndex];\n      if (!currentTab) {\n        return;\n      }\n      this.tabs.splice(oldIndex, 1);\n      this.tabs.splice(newIndex, 0, currentTab);\n      this.dragEndIndex = this.dragEndIndex + 1;\n    },\n    /**\n     * @zh_CN 切换固定标签页\n     * @param tab\n     */\n    async toggleTabPin(tab: TabDefinition) {\n      const affixTab = tab?.meta?.affixTab ?? false;\n\n      await (affixTab ? this.unpinTab(tab) : this.pinTab(tab));\n    },\n\n    /**\n     * @zh_CN 取消固定标签页\n     * @param tab\n     */\n    async unpinTab(tab: TabDefinition) {\n      const index = this.tabs.findIndex(item => getTabPath(item) === getTabPath(tab));\n\n      if (index !== -1) {\n        const oldTab = this.tabs[index];\n        tab.meta.affixTab = false;\n        tab.meta.title = oldTab?.meta?.title as string;\n        // this.addTab(tab);\n        this.tabs.splice(index, 1, tab);\n      }\n      // 过滤固定tabs，后面更改affixTabOrder的值的话可能会有问题，目前行464排序affixTabs没有设置值\n      const affixTabs = this.tabs.filter(tab => isAffixTab(tab));\n      // 获得固定tabs的index,使用固定tabs的下一个位置也就是活动tabs的第一个位置\n      const newIndex = affixTabs.length;\n      // 交换位置重新排序\n      await this.sortTabs(index, newIndex);\n    },\n\n    /**\n     * 根据当前打开的选项卡更新缓存\n     */\n    async updateCacheTabs() {\n      const cacheMap = new Set<string>();\n\n      for (const tab of this.tabs) {\n        // 跳过不需要持久化的标签页\n        const keepAlive = tab.meta?.keepAlive;\n        if (!keepAlive) {\n          continue;\n        }\n        (tab.matched || []).forEach((t, i) => {\n          if (i > 0) {\n            cacheMap.add(t.name as string);\n          }\n        });\n\n        const name = tab.name as string;\n        cacheMap.add(name);\n      }\n      this.cachedTabs = cacheMap;\n    },\n  },\n  getters: {\n    affixTabs(): TabDefinition[] {\n      const affixTabs = this.tabs.filter(tab => isAffixTab(tab));\n\n      return affixTabs.sort((a, b) => {\n        const orderA = (a.meta?.affixTabOrder ?? 0) as number;\n        const orderB = (b.meta?.affixTabOrder ?? 0) as number;\n        return orderA - orderB;\n      });\n    },\n    getCachedTabs(): string[] {\n      return [...this.cachedTabs];\n    },\n    getExcludeCachedTabs(): string[] {\n      return [...this.excludeCachedTabs];\n    },\n    getTabs(): TabDefinition[] {\n      const normalTabs = this.tabs.filter(tab => !isAffixTab(tab));\n      return [...this.affixTabs, ...normalTabs].filter(Boolean);\n    },\n  },\n  persist: [\n    // tabs不需要保存在localStorage\n    {\n      pick: [\"tabs\"],\n      storage: sessionStorage,\n    },\n  ],\n  state: (): TabbarState => ({\n    cachedTabs: new Set(),\n    dragEndIndex: 0,\n    excludeCachedTabs: new Set(),\n    renderRouteView: true,\n    tabs: [],\n    updateTime: Date.now(),\n  }),\n});\n\n// 解决热更新问题\nconst hot = import.meta.hot;\nif (hot) {\n  hot.accept(acceptHMRUpdate(useTabbarStore, hot));\n}\n\n/**\n * @zh_CN 克隆路由,防止路由被修改\n * @param route\n */\nfunction cloneTab(route: TabDefinition): TabDefinition {\n  if (!route) {\n    return route;\n  }\n  const { matched, meta, ...opt } = route;\n  return {\n    ...opt,\n    matched: (matched\n      ? matched.map(item => ({\n          meta: item.meta,\n          name: item.name,\n          path: item.path,\n        }))\n      : undefined) as RouteRecordNormalized[],\n    meta: {\n      ...meta,\n      newTabTitle: meta.newTabTitle,\n    },\n  };\n}\n\n/**\n * @zh_CN 是否是固定标签页\n * @param tab\n */\nfunction isAffixTab(tab: TabDefinition) {\n  return tab?.meta?.affixTab ?? false;\n}\n\n/**\n * @zh_CN 是否显示标签\n * @param tab\n */\nfunction isTabShown(tab: TabDefinition) {\n  const matched = tab?.matched ?? [];\n  return !tab.meta.hideInTab && matched.every(item => !item.meta.hideInTab);\n}\n\n/**\n * @zh_CN 获取标签页路径\n * @param tab\n */\nfunction getTabPath(tab: RouteRecordNormalized | TabDefinition) {\n  return decodeURIComponent((tab as TabDefinition).fullPath || tab.path);\n}\n\nfunction routeToTab(route: RouteRecordNormalized) {\n  return {\n    meta: route.meta,\n    name: route.name,\n    path: route.path,\n  } as TabDefinition;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/stores/modules/user.test.ts",
    "content": "import { createPinia, setActivePinia } from \"pinia\";\nimport { beforeEach, describe, expect, it } from \"vitest\";\n\nimport { useUserStore } from \"./user\";\n\ndescribe(\"useUserStore\", () => {\n  beforeEach(() => {\n    setActivePinia(createPinia());\n  });\n\n  it(\"returns correct userInfo\", () => {\n    const store = useUserStore();\n    const userInfo: any = { name: \"Jane Doe\", roles: [{ value: \"user\" }] };\n    store.setUserInfo(userInfo);\n    expect(store.userInfo).toEqual(userInfo);\n  });\n\n  // 测试重置用户信息时的行为\n  it(\"clears userInfo and userRoles when setting null userInfo\", () => {\n    const store = useUserStore();\n    store.setUserInfo({\n      roles: [{ roleName: \"User\", value: \"user\" }],\n    } as any);\n    expect(store.userInfo).not.toBeNull();\n    expect(store.userRoles.length).toBeGreaterThan(0);\n\n    store.setUserInfo(null as any);\n    expect(store.userInfo).toBeNull();\n    expect(store.userRoles).toEqual([]);\n  });\n\n  // 测试在没有用户角色时返回空数组\n  it(\"returns an empty array for userRoles if not set\", () => {\n    const store = useUserStore();\n    expect(store.userRoles).toEqual([]);\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/stores/modules/user.ts",
    "content": "import { acceptHMRUpdate, defineStore } from \"pinia\";\n\ninterface BasicUserInfo {\n  [key: string]: any;\n  /**\n   * 头像\n   */\n  avatar: string;\n  /**\n   * 用户昵称\n   */\n  nickName: string;\n  /**\n   * 用户角色\n   */\n  roles?: string[];\n  /**\n   * 用户id\n   */\n  userId: string;\n  /**\n   * 用户名\n   */\n  username: string;\n}\n\ninterface AccessState {\n  /**\n   * 用户信息\n   */\n  userInfo: BasicUserInfo | null;\n  /**\n   * 用户角色\n   */\n  userRoles: string[];\n}\n\n/**\n * @zh_CN 用户信息相关\n */\nexport const useUserStore = defineStore(\"core-user\", {\n  actions: {\n    setUserInfo(userInfo: BasicUserInfo | null) {\n      // 设置用户信息\n      this.userInfo = userInfo;\n      // 设置角色信息\n      const roles = userInfo?.roles ?? [];\n      this.setUserRoles(roles);\n    },\n    setUserRoles(roles: string[]) {\n      this.userRoles = roles;\n    },\n  },\n  state: (): AccessState => ({\n    userInfo: null,\n    userRoles: [],\n  }),\n});\n\n// 解决热更新问题\nconst hot = import.meta.hot;\nif (hot) {\n  hot.accept(acceptHMRUpdate(useUserStore, hot));\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/stores/setup.ts",
    "content": "import type { Pinia } from \"pinia\";\n\nimport type { App } from \"vue\";\n\nimport { createPinia } from \"pinia\";\n\nlet pinia: Pinia;\n\nexport interface InitStoreOptions {\n  /**\n   * @zh_CN 应用名,由于 /@/vben/stores 是公用的，后续可能有多个app，为了防止多个app缓存冲突，可在这里配置应用名,应用名将被用于持久化的前缀\n   */\n  namespace: string;\n}\n\n/**\n * @zh_CN 初始化pinia\n */\nexport async function initStores(app: App, options: InitStoreOptions) {\n  const { createPersistedState } = await import(\"pinia-plugin-persistedstate\");\n  pinia = createPinia();\n  const { namespace } = options;\n  pinia.use(\n    createPersistedState({\n      // key $appName-$store.id\n      key: storeKey => `${namespace}-${storeKey}`,\n      storage: localStorage,\n    })\n  );\n  app.use(pinia);\n  return pinia;\n}\n\nexport function resetAllStores() {\n  if (!pinia) {\n    console.error(\"Pinia is not installed\");\n    return;\n  }\n  const allStores = (pinia as any)._s;\n  for (const [_key, store] of allStores) {\n    store.$reset();\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/styles/antd/index.css",
    "content": "/* ant-design-vue 组件库的一些样式重置 */\n\n.ant-app {\n  width: 100%;\n  height: 100%;\n  overscroll-behavior: none;\n  color: inherit;\n}\n\n.ant-btn {\n  .anticon {\n    display: inline-flex;\n  }\n\n  /* * 修复按钮添加图标时的位置问题 */\n  > svg {\n    display: inline-block;\n  }\n\n  > svg + span {\n    margin-inline-start: 6px;\n  }\n}\n\n.ant-tag {\n  > svg {\n    display: inline-block;\n  }\n\n  > svg + span {\n    margin-inline-start: 4px;\n  }\n}\n\n.ant-message-notice-content,\n.ant-notification-notice {\n  @apply dark:border-border/60 dark:border;\n}\n\n.form-valid-error {\n  /** select 选择器的样式 */\n\n  .ant-select:not(.valid-success) .ant-select-selector:not(.valid-success) {\n    border-color: hsl(var(--destructive)) !important;\n  }\n\n  .ant-select-focused .ant-select-selector {\n    box-shadow: 0 0 0 2px rgb(255 38 5 / 6%) !important;\n  }\n\n  /** 数字输入框样式 */\n  .ant-input-number-focused {\n    box-shadow: 0 0 0 2px rgb(255 38 5 / 6%);\n  }\n\n  /** 密码输入框样式 */\n  .ant-input-affix-wrapper:hover {\n    border-color: hsl(var(--destructive));\n    box-shadow: 0 0 0 2px rgb(255 38 5 / 6%);\n  }\n\n  .ant-input:not(.valid-success) {\n    border-color: hsl(var(--destructive)) !important;\n  }\n}\n\n/** 区间选择器下面来回切换时的样式 */\n.ant-app .form-valid-error .ant-picker-active-bar {\n  background-color: hsl(var(--destructive));\n}\n\n/** 时间选择器的样式 */\n.ant-app .form-valid-error .ant-picker-focused {\n  box-shadow: 0 0 0 2px rgb(255 38 5 / 6%);\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/styles/ele/index.css",
    "content": ".el-card {\n  --el-card-border-radius: var(--radius) !important;\n}\n\n.form-valid-error {\n  /** select 选择器的样式 */\n  .el-select .el-select__wrapper {\n    box-shadow: 0 0 0 1px var(--el-color-danger) inset;\n  }\n\n  /** input 选择器的样式 */\n  .el-input .el-input__wrapper {\n    box-shadow: 0 0 0 1px var(--el-color-danger) inset;\n  }\n\n  /** radio和checkbox 选择器的样式 */\n  .el-radio .el-radio__inner,\n  .el-checkbox .el-checkbox__inner {\n    border: 1px solid var(--el-color-danger);\n  }\n\n  .el-checkbox-button .el-checkbox-button__inner,\n  .el-radio-button .el-radio-button__inner {\n    border: 1px solid var(--el-color-danger);\n  }\n\n  .el-checkbox-button:first-child .el-checkbox-button__inner,\n  .el-radio-button:first-child .el-radio-button__inner {\n    border-left: 1px solid var(--el-color-danger);\n  }\n\n  .el-checkbox-button:not(:first-child) .el-checkbox-button__inner,\n  .el-radio-button:not(:first-child) .el-radio-button__inner {\n    border-left: none;\n  }\n\n  .el-textarea .el-textarea__inner {\n    border: 1px solid var(--el-color-danger);\n  }\n}\n\nhtml .el-loading-mask {\n  z-index: 1000;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/styles/global/index.scss",
    "content": "@use \"@vben-core/design/bem\" as *;\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/styles/index.ts",
    "content": "import \"../design\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/styles/naive/index.css",
    "content": ".form-valid-error {\n  .n-base-selection__state-border,\n  .n-input__state-border,\n  .n-radio-group__splitor {\n    border: var(--n-border-error);\n  }\n\n  .n-radio-group .n-radio-button,\n  .n-radio-group .n-radio-group__splitor {\n    --n-button-border-color: rgb(255 56 96);\n  }\n\n  .n-radio__dot {\n    --n-box-shadow: inset 0 0 0 1px rgb(255 56 96);\n  }\n\n  .n-checkbox-box__border {\n    --n-border: 1px solid rgb(255 56 96);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/tabs-ui/components/index.ts",
    "content": "export { default as TabsChrome } from \"./tabs-chrome/tabs.vue\";\nexport { default as Tabs } from \"./tabs/tabs.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/tabs-ui/components/tabs/tabs.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { TabDefinition } from \"../../../typings\";\n\nimport type { TabConfig, TabsProps } from \"../../types\";\n\nimport { computed } from \"vue\";\n\nimport { Pin, X } from \"../../../icons\";\nimport { VbenContextMenu, VbenIcon } from \"../../../shadcn-ui\";\n\ninterface Props extends TabsProps {}\n\ndefineOptions({\n  name: \"VbenTabs\",\n  // @ts-ignore\n  inheritAttrs: false,\n});\nconst props = withDefaults(defineProps<Props>(), {\n  contentClass: \"vben-tabs-content\",\n  contextMenus: () => [],\n  tabs: () => [],\n});\n\nconst emit = defineEmits<{\n  close: [string];\n  unpin: [TabDefinition];\n}>();\nconst active = defineModel<string>(\"active\");\n\nconst typeWithClass = computed(() => {\n  const typeClasses: Record<string, { content: string }> = {\n    brisk: {\n      content: `h-full after:content-['']  after:absolute after:bottom-0 after:left-0 after:w-full after:h-[1.5px] after:bg-primary after:scale-x-0 after:transition-[transform] after:ease-out after:duration-300 hover:after:scale-x-100 after:origin-left [&.is-active]:after:scale-x-100 [&:not(:first-child)]:border-l last:border-r last:border-r border-border`,\n    },\n    card: {\n      content: \"h-[calc(100%-6px)] rounded-md ml-2 border border-border  transition-all\",\n    },\n    plain: {\n      content: \"h-full [&:not(:first-child)]:border-l last:border-r border-border\",\n    },\n  };\n\n  return typeClasses[props.styleType || \"plain\"] || { content: \"\" };\n});\n\nconst tabsView = computed(() => {\n  return props.tabs.map(tab => {\n    const { fullPath, meta, name, path } = tab || {};\n    const { affixTab, icon, newTabTitle, tabClosable, title } = meta || {};\n    return {\n      affixTab: !!affixTab,\n      closable: Reflect.has(meta, \"tabClosable\") ? !!tabClosable : true,\n      fullPath,\n      icon: icon as string,\n      key: fullPath || path,\n      meta,\n      name,\n      path,\n      title: (newTabTitle || title || name) as string,\n    } as TabConfig;\n  });\n});\n\nfunction onMouseDown(e: MouseEvent, tab: TabConfig) {\n  if (e.button === 1 && tab.closable && !tab.affixTab && tabsView.value.length > 1 && props.middleClickToClose) {\n    e.preventDefault();\n    e.stopPropagation();\n    emit(\"close\", tab.key);\n  }\n}\n</script>\n\n<template>\n  <div :class=\"contentClass\" class=\"relative !flex h-full w-max items-center overflow-hidden pr-6\">\n    <TransitionGroup name=\"slide-left\">\n      <div\n        v-for=\"(tab, i) in tabsView\"\n        :key=\"tab.key\"\n        :class=\"[\n          {\n            'is-active dark:bg-accent bg-primary/15': tab.key === active,\n            draggable: !tab.affixTab,\n            'affix-tab': tab.affixTab,\n          },\n          typeWithClass.content,\n        ]\"\n        :data-index=\"i\"\n        class=\"tab-item [&:not(.is-active)]:hover:bg-accent translate-all group relative flex cursor-pointer select-none\"\n        data-tab-item=\"true\"\n        @click=\"active = tab.key\"\n        @mousedown=\"onMouseDown($event, tab)\"\n      >\n        <VbenContextMenu :handler-data=\"tab\" :menus=\"contextMenus\" :modal=\"false\" item-class=\"pr-6\">\n          <div class=\"relative flex size-full items-center\">\n            <!-- extra -->\n            <div class=\"absolute right-1.5 top-1/2 z-[3] translate-y-[-50%] overflow-hidden\">\n              <!-- close-icon -->\n              <X\n                v-show=\"!tab.affixTab && tabsView.length > 1 && tab.closable\"\n                class=\"hover:bg-accent stroke-accent-foreground/80 hover:stroke-accent-foreground dark:group-[.is-active]:text-accent-foreground group-[.is-active]:text-primary size-3 cursor-pointer rounded-full transition-all\"\n                @click.stop=\"() => emit('close', tab.key)\"\n              />\n              <Pin\n                v-show=\"tab.affixTab && tabsView.length > 1 && tab.closable\"\n                class=\"hover:bg-accent hover:stroke-accent-foreground group-[.is-active]:text-primary dark:group-[.is-active]:text-accent-foreground mt-[1px] size-3.5 cursor-pointer rounded-full transition-all\"\n                @click.stop=\"() => emit('unpin', tab)\"\n              />\n            </div>\n\n            <!-- tab-item-main -->\n            <div\n              class=\"text-accent-foreground group-[.is-active]:text-primary dark:group-[.is-active]:text-accent-foreground mx-3 mr-4 flex h-full items-center overflow-hidden rounded-tl-[5px] rounded-tr-[5px] pr-3 transition-all duration-300\"\n            >\n              <VbenIcon v-if=\"showIcon\" :icon=\"tab.icon\" class=\"mr-2 flex size-4 items-center overflow-hidden\" fallback />\n\n              <span class=\"flex-1 overflow-hidden whitespace-nowrap text-sm\">\n                {{ tab.title }}\n              </span>\n            </div>\n          </div>\n        </VbenContextMenu>\n      </div>\n    </TransitionGroup>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/tabs-ui/components/tabs-chrome/tabs.vue",
    "content": "<script setup lang=\"ts\">\nimport type { TabDefinition } from \"../../../typings\";\n\nimport type { TabConfig, TabsProps } from \"../../types\";\n\nimport { computed, ref } from \"vue\";\n\nimport { Pin, X } from \"../../../icons\";\nimport { VbenContextMenu, VbenIcon } from \"../../../shadcn-ui\";\n\ninterface Props extends TabsProps {}\n\ndefineOptions({\n  name: \"VbenTabsChrome\",\n  // eslint-disable-next-line perfectionist/sort-objects\n  inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  contentClass: \"vben-tabs-content\",\n  contextMenus: () => [],\n  gap: 7,\n  tabs: () => [],\n});\n\nconst emit = defineEmits<{\n  close: [string];\n  unpin: [TabDefinition];\n}>();\nconst active = defineModel<string>(\"active\");\n\nconst contentRef = ref();\nconst tabRef = ref();\n\nconst style = computed(() => {\n  const { gap } = props;\n  return {\n    \"--gap\": `${gap}px`,\n  };\n});\n\nconst tabsView = computed(() => {\n  return props.tabs.map(tab => {\n    const { fullPath, meta, name, path } = tab || {};\n    const { affixTab, icon, newTabTitle, tabClosable, title } = meta || {};\n    return {\n      affixTab: !!affixTab,\n      closable: Reflect.has(meta, \"tabClosable\") ? !!tabClosable : true,\n      fullPath,\n      icon: icon as string,\n      key: fullPath || path,\n      meta,\n      name,\n      path,\n      title: (newTabTitle || title || name) as string,\n    } as TabConfig;\n  });\n});\n\nfunction onMouseDown(e: MouseEvent, tab: TabConfig) {\n  if (e.button === 1 && tab.closable && !tab.affixTab && tabsView.value.length > 1 && props.middleClickToClose) {\n    e.preventDefault();\n    e.stopPropagation();\n    emit(\"close\", tab.key);\n  }\n}\n</script>\n\n<template>\n  <div ref=\"contentRef\" :class=\"contentClass\" :style=\"style\" class=\"tabs-chrome !flex h-full w-max overflow-y-hidden pr-6\">\n    <TransitionGroup name=\"slide-left\">\n      <div\n        v-for=\"(tab, i) in tabsView\"\n        :key=\"tab.key\"\n        ref=\"tabRef\"\n        :class=\"[\n          {\n            'is-active': tab.key === active,\n            draggable: !tab.affixTab,\n            'affix-tab': tab.affixTab,\n          },\n        ]\"\n        :data-active-tab=\"active\"\n        :data-index=\"i\"\n        class=\"tabs-chrome__item draggable translate-all group relative -mr-3 flex h-full select-none items-center\"\n        data-tab-item=\"true\"\n        @click=\"active = tab.key\"\n        @mousedown=\"onMouseDown($event, tab)\"\n      >\n        <VbenContextMenu :handler-data=\"tab\" :menus=\"contextMenus\" :modal=\"false\" item-class=\"pr-6\">\n          <div class=\"relative size-full px-1\">\n            <!-- divider -->\n            <div v-if=\"i !== 0 && tab.key !== active\" class=\"tabs-chrome__divider bg-border absolute left-[var(--gap)] top-1/2 z-0 h-4 w-[1px] translate-y-[-50%] transition-all\"></div>\n            <!-- background -->\n            <div class=\"tabs-chrome__background absolute z-[-1] size-full px-[calc(var(--gap)-1px)] py-0 transition-opacity duration-150\">\n              <div class=\"tabs-chrome__background-content group-[.is-active]:bg-primary/15 dark:group-[.is-active]:bg-accent h-full rounded-tl-[var(--gap)] rounded-tr-[var(--gap)] duration-150\"></div>\n              <svg\n                class=\"tabs-chrome__background-before group-[.is-active]:fill-primary/15 dark:group-[.is-active]:fill-accent absolute bottom-0 left-[-1px] fill-transparent transition-all duration-150\"\n                height=\"7\"\n                width=\"7\"\n              >\n                <path d=\"M 0 7 A 7 7 0 0 0 7 0 L 7 7 Z\" />\n              </svg>\n              <svg\n                class=\"tabs-chrome__background-after group-[.is-active]:fill-primary/15 dark:group-[.is-active]:fill-accent absolute bottom-0 right-[-1px] fill-transparent transition-all duration-150\"\n                height=\"7\"\n                width=\"7\"\n              >\n                <path d=\"M 0 0 A 7 7 0 0 0 7 7 L 0 7 Z\" />\n              </svg>\n            </div>\n\n            <!-- extra -->\n            <div class=\"tabs-chrome__extra absolute right-[var(--gap)] top-1/2 z-[3] size-4 translate-y-[-50%]\">\n              <!-- close-icon -->\n              <X\n                v-show=\"!tab.affixTab && tabsView.length > 1 && tab.closable\"\n                class=\"hover:bg-accent stroke-accent-foreground/80 hover:stroke-accent-foreground text-accent-foreground/80 group-[.is-active]:text-accent-foreground mt-[2px] size-3 cursor-pointer rounded-full transition-all\"\n                @click.stop=\"() => emit('close', tab.key)\"\n              />\n              <Pin\n                v-show=\"tab.affixTab && tabsView.length > 1 && tab.closable\"\n                class=\"hover:text-accent-foreground text-accent-foreground/80 group-[.is-active]:text-accent-foreground mt-[1px] size-3.5 cursor-pointer rounded-full transition-all\"\n                @click.stop=\"() => emit('unpin', tab)\"\n              />\n            </div>\n\n            <!-- tab-item-main -->\n            <div\n              class=\"tabs-chrome__item-main group-[.is-active]:text-primary dark:group-[.is-active]:text-accent-foreground text-accent-foreground z-[2] mx-[calc(var(--gap)*2)] my-0 flex h-full items-center overflow-hidden rounded-tl-[5px] rounded-tr-[5px] pl-2 pr-4 duration-150\"\n            >\n              <VbenIcon v-if=\"showIcon\" :icon=\"tab.icon\" class=\"mr-1 flex size-4 items-center overflow-hidden\" />\n\n              <span class=\"flex-1 overflow-hidden whitespace-nowrap text-sm\">\n                {{ tab.title }}\n              </span>\n            </div>\n          </div>\n        </VbenContextMenu>\n      </div>\n    </TransitionGroup>\n  </div>\n</template>\n\n<style scoped>\n.tabs-chrome {\n  &__item:not(.dragging) {\n    @apply cursor-pointer;\n\n    &:hover:not(.is-active) {\n      & + .tabs-chrome__item {\n        .tabs-chrome__divider {\n          @apply opacity-0;\n        }\n      }\n\n      .tabs-chrome__divider {\n        @apply opacity-0;\n      }\n\n      .tabs-chrome__background {\n        @apply pb-[2px];\n\n        &-content {\n          @apply bg-accent mx-[2px] rounded-md;\n        }\n      }\n    }\n\n    &.is-active {\n      @apply z-[2];\n\n      & + .tabs-chrome__item {\n        .tabs-chrome__divider {\n          @apply opacity-0 !important;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/tabs-ui/components/widgets/index.ts",
    "content": "export { default as TabsToolMore } from \"./tool-more.vue\";\nexport { default as TabsToolScreen } from \"./tool-screen.vue\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/tabs-ui/components/widgets/tool-more.vue",
    "content": "<script lang=\"ts\" setup>\nimport type { DropdownMenuProps } from \"../../../shadcn-ui\";\n\nimport { ChevronDown } from \"../../../icons\";\nimport { VbenDropdownMenu } from \"../../../shadcn-ui\";\n\ndefineProps<DropdownMenuProps>();\n</script>\n\n<template>\n  <VbenDropdownMenu :menus=\"menus\" :modal=\"false\">\n    <div class=\"flex-center hover:bg-muted hover:text-foreground text-muted-foreground border-border h-full cursor-pointer border-l px-2 text-lg font-semibold\">\n      <ChevronDown class=\"size-4\" />\n    </div>\n  </VbenDropdownMenu>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/tabs-ui/components/widgets/tool-screen.vue",
    "content": "<script lang=\"ts\" setup>\nimport { Fullscreen, Minimize2 } from \"../../../icons\";\n\nconst screen = defineModel<boolean>(\"screen\");\n\nfunction toggleScreen() {\n  screen.value = !screen.value;\n}\n</script>\n\n<template>\n  <div class=\"flex-center hover:bg-muted hover:text-foreground text-muted-foreground border-border h-full cursor-pointer border-l px-2 text-lg font-semibold\" @click=\"toggleScreen\">\n    <Minimize2 v-if=\"screen\" class=\"size-4\" />\n    <Fullscreen v-else class=\"size-4\" />\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/tabs-ui/index.ts",
    "content": "export * from \"./components/widgets\";\nexport { default as TabsView } from \"./tabs-view.vue\";\nexport type { IContextMenuItem } from \"/@/vben/shadcn-ui\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/tabs-ui/tabs-view.vue",
    "content": "<script setup lang=\"ts\">\nimport type { TabsEmits, TabsProps } from \"./types\";\n\nimport { useForwardPropsEmits } from \"/@/vben/composables\";\nimport { ChevronLeft, ChevronRight } from \"/@/vben/icons\";\nimport { VbenScrollbar } from \"/@/vben/shadcn-ui\";\n\nimport { Tabs, TabsChrome } from \"./components\";\nimport { useTabsDrag } from \"./use-tabs-drag\";\nimport { useTabsViewScroll } from \"./use-tabs-view-scroll\";\n\ninterface Props extends TabsProps {}\n\ndefineOptions({\n  name: \"TabsView\",\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n  contentClass: \"vben-tabs-content\",\n  draggable: true,\n  styleType: \"chrome\",\n  wheelable: true,\n});\n\nconst emit = defineEmits<TabsEmits>();\n\nconst forward = useForwardPropsEmits(props, emit);\n\nconst { handleScrollAt, handleWheel, scrollbarRef, scrollDirection, scrollIsAtLeft, scrollIsAtRight, showScrollButton } = useTabsViewScroll(props);\n\nfunction onWheel(e: WheelEvent) {\n  if (props.wheelable) {\n    handleWheel(e);\n    e.stopPropagation();\n    e.preventDefault();\n  }\n}\n\nuseTabsDrag(props, emit);\n</script>\n\n<template>\n  <div class=\"flex h-full flex-1 overflow-hidden bg-gray-100 dark:bg-black\">\n    <!-- 左侧滚动按钮 -->\n    <span\n      v-show=\"showScrollButton\"\n      :class=\"{\n        'hover:bg-muted text-muted-foreground cursor-pointer': !scrollIsAtLeft,\n        'pointer-events-none opacity-30': scrollIsAtLeft,\n      }\"\n      class=\"border-r px-2\"\n      @click=\"scrollDirection('left')\"\n    >\n      <ChevronLeft class=\"size-4 h-full\" />\n    </span>\n\n    <div\n      :class=\"{\n        'pt-[3px]': styleType === 'chrome',\n      }\"\n      class=\"size-full flex-1 overflow-hidden\"\n    >\n      <VbenScrollbar ref=\"scrollbarRef\" :shadow-bottom=\"false\" :shadow-top=\"false\" class=\"h-full\" horizontal scroll-bar-class=\"z-10 hidden \" shadow shadow-left shadow-right @scroll-at=\"handleScrollAt\" @wheel=\"onWheel\">\n        <TabsChrome v-if=\"styleType === 'chrome'\" v-bind=\"{ ...forward, ...$attrs, ...$props }\" />\n\n        <Tabs v-else v-bind=\"{ ...forward, ...$attrs, ...$props }\" />\n      </VbenScrollbar>\n    </div>\n\n    <!-- 右侧滚动按钮 -->\n    <span\n      v-show=\"showScrollButton\"\n      :class=\"{\n        'hover:bg-muted text-muted-foreground cursor-pointer': !scrollIsAtRight,\n        'pointer-events-none opacity-30': scrollIsAtRight,\n      }\"\n      class=\"hover:bg-muted text-muted-foreground cursor-pointer border-l px-2\"\n      @click=\"scrollDirection('right')\"\n    >\n      <ChevronRight class=\"size-4 h-full\" />\n    </span>\n  </div>\n</template>\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/tabs-ui/types.ts",
    "content": "import type { IContextMenuItem } from \"/@/vben/shadcn-ui\";\nimport type { TabDefinition, TabsStyleType } from \"/@/vben/typings\";\n\nexport type TabsEmits = {\n  close: [string];\n  sortTabs: [number, number];\n  unpin: [TabDefinition];\n};\n\nexport interface TabsProps {\n  active?: string;\n  /**\n   * @zh_CN content class\n   * @default tabs-chrome\n   */\n  contentClass?: string;\n  /**\n   * @zh_CN 右键菜单\n   */\n  contextMenus?: (data: any) => IContextMenuItem[];\n  /**\n   * @zh_CN 是否可以拖拽\n   */\n  draggable?: boolean;\n  /**\n   * @zh_CN 间隙\n   * @default 7\n   * 仅限 tabs-chrome\n   */\n  gap?: number;\n  /**\n   * @zh_CN tab 最大宽度\n   * 仅限 tabs-chrome\n   */\n  maxWidth?: number;\n  /**\n   * @zh_CN 点击中键时关闭Tab\n   */\n  middleClickToClose?: boolean;\n\n  /**\n   * @zh_CN tab最小宽度\n   * 仅限 tabs-chrome\n   */\n  minWidth?: number;\n\n  /**\n   * @zh_CN 是否显示图标\n   */\n  showIcon?: boolean;\n  /**\n   * @zh_CN 标签页风格\n   */\n  styleType?: TabsStyleType;\n\n  /**\n   * @zh_CN 选项卡数据\n   */\n  tabs?: TabDefinition[];\n\n  /**\n   * @zh_CN 是否响应滚轮事件\n   */\n  wheelable?: boolean;\n}\n\nexport interface TabConfig extends TabDefinition {\n  affixTab: boolean;\n  closable: boolean;\n  icon: string;\n  key: string;\n  title: string;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/tabs-ui/use-tabs-drag.ts",
    "content": "import type { Sortable } from \"/@/vben/composables\";\nimport type { EmitType } from \"/@/vben/typings\";\n\nimport type { TabsProps } from \"./types\";\n\nimport { nextTick, onMounted, onUnmounted, ref, watch } from \"vue\";\n\nimport { useIsMobile, useSortable } from \"/@/vben/composables\";\n\n// 可能会找到拖拽的子元素，这里需要确保拖拽的dom时tab元素\nfunction findParentElement(element: HTMLElement) {\n  const parentCls = \"group\";\n  return element.classList.contains(parentCls) ? element : element.closest(`.${parentCls}`);\n}\n\nexport function useTabsDrag(props: TabsProps, emit: EmitType) {\n  const sortableInstance = ref<null | Sortable>(null);\n\n  async function initTabsSortable() {\n    await nextTick();\n\n    const el = document.querySelectorAll(`.${props.contentClass}`)?.[0] as HTMLElement;\n\n    if (!el) {\n      console.warn(\"Element not found for sortable initialization\");\n      return;\n    }\n\n    const resetElState = async () => {\n      el.style.cursor = \"default\";\n      // el.classList.remove('dragging');\n      el.querySelector(\".draggable\")?.classList.remove(\"dragging\");\n    };\n\n    const { initializeSortable } = useSortable(el, {\n      filter: (_evt, target: HTMLElement) => {\n        const parent = findParentElement(target);\n        const draggable = parent?.classList.contains(\"draggable\");\n        return !draggable || !props.draggable;\n      },\n      onEnd(evt) {\n        const { newIndex, oldIndex } = evt;\n        // const fromElement = evt.item;\n        const { srcElement } = (evt as any).originalEvent;\n\n        if (!srcElement) {\n          resetElState();\n          return;\n        }\n\n        const srcParent = findParentElement(srcElement);\n\n        if (!srcParent) {\n          resetElState();\n          return;\n        }\n\n        if (!srcParent.classList.contains(\"draggable\")) {\n          resetElState();\n\n          return;\n        }\n\n        if (oldIndex !== undefined && newIndex !== undefined && !Number.isNaN(oldIndex) && !Number.isNaN(newIndex) && oldIndex !== newIndex) {\n          emit(\"sortTabs\", oldIndex, newIndex);\n        }\n        resetElState();\n      },\n      onMove(evt) {\n        const parent = findParentElement(evt.related);\n        if (parent?.classList.contains(\"draggable\") && props.draggable) {\n          const isCurrentAffix = evt.dragged.classList.contains(\"affix-tab\");\n          const isRelatedAffix = evt.related.classList.contains(\"affix-tab\");\n          // 不允许在固定的tab和非固定的tab之间互相拖拽\n          return isCurrentAffix === isRelatedAffix;\n        } else {\n          return false;\n        }\n      },\n      onStart: () => {\n        el.style.cursor = \"grabbing\";\n        el.querySelector(\".draggable\")?.classList.add(\"dragging\");\n        // el.classList.add('dragging');\n      },\n    });\n\n    sortableInstance.value = await initializeSortable();\n  }\n\n  async function init() {\n    const { isMobile } = useIsMobile();\n\n    // 移动端下tab不需要拖拽\n    if (isMobile.value) {\n      return;\n    }\n    await nextTick();\n    initTabsSortable();\n  }\n\n  onMounted(init);\n\n  watch(\n    () => props.styleType,\n    () => {\n      sortableInstance.value?.destroy();\n      init();\n    }\n  );\n\n  onUnmounted(() => {\n    sortableInstance.value?.destroy();\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/tabs-ui/use-tabs-view-scroll.ts",
    "content": "import type { TabsProps } from \"./types\";\n\nimport { nextTick, onMounted, onUnmounted, ref, watch } from \"vue\";\n\nimport { VbenScrollbar } from \"/@/vben/shadcn-ui\";\n\nimport { useDebounceFn } from \"@vueuse/core\";\n\ntype DomElement = Element | null | undefined;\n\nexport function useTabsViewScroll(props: TabsProps) {\n  let resizeObserver: null | ResizeObserver = null;\n  let mutationObserver: MutationObserver | null = null;\n  let tabItemCount = 0;\n  const scrollbarRef = ref<InstanceType<typeof VbenScrollbar> | null>(null);\n  const scrollViewportEl = ref<DomElement>(null);\n  const showScrollButton = ref(false);\n  const scrollIsAtLeft = ref(true);\n  const scrollIsAtRight = ref(false);\n\n  function getScrollClientWidth() {\n    const scrollbarEl = scrollbarRef.value?.$el;\n    if (!scrollbarEl || !scrollViewportEl.value) return {};\n\n    const scrollbarWidth = scrollbarEl.clientWidth;\n    const scrollViewWidth = scrollViewportEl.value.clientWidth;\n\n    return {\n      scrollbarWidth,\n      scrollViewWidth,\n    };\n  }\n\n  function scrollDirection(direction: \"left\" | \"right\", distance: number = 150) {\n    const { scrollbarWidth, scrollViewWidth } = getScrollClientWidth();\n\n    if (!scrollbarWidth || !scrollViewWidth) return;\n\n    if (scrollbarWidth > scrollViewWidth) return;\n\n    scrollViewportEl.value?.scrollBy({\n      behavior: \"smooth\",\n      left: direction === \"left\" ? -(scrollbarWidth - distance) : +(scrollbarWidth - distance),\n    });\n  }\n\n  async function initScrollbar() {\n    await nextTick();\n\n    const scrollbarEl = scrollbarRef.value?.$el;\n    if (!scrollbarEl) {\n      return;\n    }\n\n    const viewportEl = scrollbarEl?.querySelector(\"div[data-radix-scroll-area-viewport]\");\n\n    scrollViewportEl.value = viewportEl;\n    calcShowScrollbarButton();\n\n    await nextTick();\n    scrollToActiveIntoView();\n\n    // 监听大小变化\n    resizeObserver?.disconnect();\n    resizeObserver = new ResizeObserver(\n      useDebounceFn((_entries: ResizeObserverEntry[]) => {\n        calcShowScrollbarButton();\n        scrollToActiveIntoView();\n      }, 100)\n    );\n    resizeObserver.observe(viewportEl);\n\n    tabItemCount = props.tabs?.length || 0;\n    mutationObserver?.disconnect();\n    // 使用 MutationObserver 仅监听子节点数量变化\n    mutationObserver = new MutationObserver(() => {\n      const count = viewportEl.querySelectorAll(`div[data-tab-item=\"true\"]`).length;\n\n      if (count > tabItemCount) {\n        scrollToActiveIntoView();\n      }\n\n      if (count !== tabItemCount) {\n        calcShowScrollbarButton();\n        tabItemCount = count;\n      }\n    });\n\n    // 配置为仅监听子节点的添加和移除\n    mutationObserver.observe(viewportEl, {\n      attributes: false,\n      childList: true,\n      subtree: true,\n    });\n  }\n\n  async function scrollToActiveIntoView() {\n    if (!scrollViewportEl.value) {\n      return;\n    }\n    await nextTick();\n    const viewportEl = scrollViewportEl.value;\n    const { scrollbarWidth } = getScrollClientWidth();\n    const { scrollWidth } = viewportEl;\n\n    if (scrollbarWidth >= scrollWidth) {\n      return;\n    }\n\n    requestAnimationFrame(() => {\n      const activeItem = viewportEl?.querySelector(\".is-active\");\n      activeItem?.scrollIntoView({ behavior: \"smooth\", inline: \"start\" });\n    });\n  }\n\n  /**\n   * 计算tabs 宽度，用于判断是否显示左右滚动按钮\n   */\n  async function calcShowScrollbarButton() {\n    if (!scrollViewportEl.value) {\n      return;\n    }\n\n    const { scrollbarWidth } = getScrollClientWidth();\n\n    showScrollButton.value = scrollViewportEl.value.scrollWidth > scrollbarWidth;\n  }\n\n  const handleScrollAt = useDebounceFn(({ left, right }) => {\n    scrollIsAtLeft.value = left;\n    scrollIsAtRight.value = right;\n  }, 100);\n\n  function handleWheel({ deltaY }: WheelEvent) {\n    scrollViewportEl.value?.scrollBy({\n      // behavior: 'smooth',\n      left: deltaY * 3,\n    });\n  }\n\n  watch(\n    () => props.active,\n    async () => {\n      // 200为了等待 tab 切换动画完成\n      // setTimeout(() => {\n      scrollToActiveIntoView();\n      // }, 300);\n    },\n    {\n      flush: \"post\",\n    }\n  );\n\n  // watch(\n  //   () => props.tabs?.length,\n  //   async () => {\n  //     await nextTick();\n  //     calcShowScrollbarButton();\n  //   },\n  //   {\n  //     flush: 'post',\n  //   },\n  // );\n\n  watch(\n    () => props.styleType,\n    () => {\n      initScrollbar();\n    }\n  );\n\n  onMounted(initScrollbar);\n\n  onUnmounted(() => {\n    resizeObserver?.disconnect();\n    mutationObserver?.disconnect();\n    resizeObserver = null;\n    mutationObserver = null;\n  });\n\n  return {\n    handleScrollAt,\n    handleWheel,\n    initScrollbar,\n    scrollbarRef,\n    scrollDirection,\n    scrollIsAtLeft,\n    scrollIsAtRight,\n    showScrollButton,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/types/index.ts",
    "content": "export type * from \"./user\";\nexport type * from \"../typings\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/types/user.ts",
    "content": "import type { BasicUserInfo } from \"../typings\";\n\n/** 用户信息 */\ninterface UserInfo extends BasicUserInfo {\n  /**\n   * 用户描述\n   */\n  desc: string;\n  /**\n   * 首页地址\n   */\n  homePath: string;\n\n  /**\n   * accessToken\n   */\n  token: string;\n}\n\nexport type { UserInfo };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/typings/app.d.ts",
    "content": "type LayoutType = \"full-content\" | \"header-mixed-nav\" | \"header-nav\" | \"header-sidebar-nav\" | \"mixed-nav\" | \"sidebar-mixed-nav\" | \"sidebar-nav\";\n\ntype ThemeModeType = \"auto\" | \"dark\" | \"light\";\n\n/**\n * 偏好设置按钮位置\n * fixed 固定在右侧\n * header 顶栏\n * auto 自动\n */\ntype PreferencesButtonPositionType = \"auto\" | \"fixed\" | \"header\";\n\ntype BuiltinThemeType =\n  | \"custom\"\n  | \"deep-blue\"\n  | \"deep-green\"\n  | \"default\"\n  | \"gray\"\n  | \"green\"\n  | \"neutral\"\n  | \"orange\"\n  | \"pink\"\n  | \"red\"\n  | \"rose\"\n  | \"sky-blue\"\n  | \"slate\"\n  | \"stone\"\n  | \"violet\"\n  | \"yellow\"\n  | \"zinc\"\n  | (Record<never, never> & string);\n\ntype ContentCompactType = \"compact\" | \"wide\";\n\ntype LayoutHeaderModeType = \"auto\" | \"auto-scroll\" | \"fixed\" | \"static\";\ntype LayoutHeaderMenuAlignType = \"center\" | \"end\" | \"start\";\n\n/**\n * 登录过期模式\n * modal 弹窗模式\n * page 页面模式\n */\ntype LoginExpiredModeType = \"modal\" | \"page\";\n\n/**\n * 面包屑样式\n * background 背景\n * normal 默认\n */\ntype BreadcrumbStyleType = \"background\" | \"normal\";\n\n/**\n * 权限模式\n * backend 后端权限模式\n * frontend 前端权限模式\n */\ntype AccessModeType = \"backend\" | \"frontend\";\n\n/**\n * 导航风格\n * plain 朴素\n * rounded 圆润\n */\ntype NavigationStyleType = \"plain\" | \"rounded\";\n\n/**\n * 标签栏风格\n * brisk 轻快\n * card 卡片\n * chrome 谷歌\n * plain 朴素\n */\ntype TabsStyleType = \"brisk\" | \"card\" | \"chrome\" | \"plain\";\n\n/**\n * 页面切换动画\n */\ntype PageTransitionType = \"fade\" | \"fade-down\" | \"fade-slide\" | \"fade-up\";\n\n/**\n * 页面切换动画\n * panel-center 居中布局\n * panel-left 居左布局\n * panel-right 居右布局\n */\ntype AuthPageLayoutType = \"panel-center\" | \"panel-left\" | \"panel-right\";\n\nexport type {\n  AccessModeType,\n  AuthPageLayoutType,\n  BreadcrumbStyleType,\n  BuiltinThemeType,\n  ContentCompactType,\n  LayoutHeaderMenuAlignType,\n  LayoutHeaderModeType,\n  LayoutType,\n  LoginExpiredModeType,\n  NavigationStyleType,\n  PageTransitionType,\n  PreferencesButtonPositionType,\n  TabsStyleType,\n  ThemeModeType,\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/typings/basic.d.ts",
    "content": "interface BasicOption {\n  label: string;\n  value: string;\n}\n\ntype SelectOption = BasicOption;\n\ntype TabOption = BasicOption;\n\ninterface BasicUserInfo {\n  /**\n   * 头像\n   */\n  avatar: string;\n  /**\n   * 用户昵称\n   */\n  realName: string;\n  /**\n   * 用户角色\n   */\n  roles?: string[];\n  /**\n   * 用户id\n   */\n  userId: string;\n  /**\n   * 用户名\n   */\n  username: string;\n}\n\ntype ClassType = Array<object | string> | object | string;\n\nexport type { BasicOption, BasicUserInfo, ClassType, SelectOption, TabOption };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/typings/helper.d.ts",
    "content": "import type { ComputedRef, MaybeRef } from \"vue\";\n\n/**\n * 深层递归所有属性为可选\n */\ntype DeepPartial<T> = T extends object\n  ? {\n      [P in keyof T]?: DeepPartial<T[P]>;\n    }\n  : T;\n\n/**\n * 深层递归所有属性为只读\n */\ntype DeepReadonly<T> = {\n  readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];\n};\n\n/**\n * 任意类型的异步函数\n */\n\ntype AnyPromiseFunction<T extends any[] = any[], R = void> = (...arg: T) => PromiseLike<R>;\n\n/**\n * 任意类型的普通函数\n */\ntype AnyNormalFunction<T extends any[] = any[], R = void> = (...arg: T) => R;\n\n/**\n * 任意类型的函数\n */\ntype AnyFunction<T extends any[] = any[], R = void> = AnyNormalFunction<T, R> | AnyPromiseFunction<T, R>;\n\n/**\n *  T | null 包装\n */\ntype Nullable<T> = null | T;\n\n/**\n * T | Not null 包装\n */\ntype NonNullable<T> = T extends null | undefined ? never : T;\n\n/**\n * 字符串类型对象\n */\ntype Recordable<T> = Record<string, T>;\n\n/**\n * 字符串类型对象（只读）\n */\ninterface ReadonlyRecordable<T = any> {\n  readonly [key: string]: T;\n}\n\n/**\n * setTimeout 返回值类型\n */\ntype TimeoutHandle = ReturnType<typeof setTimeout>;\n\n/**\n * setInterval 返回值类型\n */\ntype IntervalHandle = ReturnType<typeof setInterval>;\n\n/**\n * 也许它是一个计算的 ref，或者一个 getter 函数\n *\n */\ntype MaybeReadonlyRef<T> = (() => T) | ComputedRef<T>;\n\n/**\n * 也许它是一个 ref，或者一个普通值，或者一个 getter 函数\n *\n */\ntype MaybeComputedRef<T> = MaybeReadonlyRef<T> | MaybeRef<T>;\n\ntype Merge<O extends object, T extends object> = {\n  [K in keyof O | keyof T]: K extends keyof T ? T[K] : K extends keyof O ? O[K] : never;\n};\n\n/**\n * T = [\n *  { name: string; age: number; },\n *  { sex: 'male' | 'female'; age: string }\n * ]\n * =>\n * MergeAll<T> = {\n *  name: string;\n *  sex: 'male' | 'female';\n *  age: string\n * }\n */\ntype MergeAll<T extends object[], R extends object = Record<string, any>> = T extends [infer F extends object, ...infer Rest extends object[]] ? MergeAll<Rest, Merge<R, F>> : R;\n\ntype EmitType = (name: Name, ...args: any[]) => void;\n\ntype MaybePromise<T> = Promise<T> | T;\n\nexport type {\n  AnyFunction,\n  AnyNormalFunction,\n  AnyPromiseFunction,\n  DeepPartial,\n  DeepReadonly,\n  EmitType,\n  IntervalHandle,\n  MaybeComputedRef,\n  MaybePromise,\n  MaybeReadonlyRef,\n  Merge,\n  MergeAll,\n  NonNullable,\n  Nullable,\n  ReadonlyRecordable,\n  Recordable,\n  TimeoutHandle,\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/typings/index.ts",
    "content": "export type * from \"./app\";\nexport type * from \"./basic\";\nexport type * from \"./helper\";\nexport type * from \"./menu-record\";\nexport type * from \"./tabs\";\nexport type * from \"./vue-router\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/typings/menu-record.ts",
    "content": "import type { Component } from \"vue\";\nimport type { RouteRecordRaw } from \"vue-router\";\n\n/**\n * 扩展路由原始对象\n */\ntype ExRouteRecordRaw = RouteRecordRaw & {\n  parent?: string;\n  parents?: string[];\n  path?: any;\n};\n\ninterface MenuRecordBadgeRaw {\n  /**\n   * 徽标\n   */\n  badge?: string;\n  /**\n   * 徽标类型\n   */\n  badgeType?: \"dot\" | \"normal\";\n  /**\n   * 徽标颜色\n   */\n  badgeVariants?: \"destructive\" | \"primary\" | string;\n}\n\n/**\n * 菜单原始对象\n */\ninterface MenuRecordRaw extends MenuRecordBadgeRaw {\n  /**\n   * 激活时的图标名\n   */\n  activeIcon?: string;\n  /**\n   * 子菜单\n   */\n  children?: MenuRecordRaw[];\n  /**\n   * 是否禁用菜单\n   * @default false\n   */\n  disabled?: boolean;\n  /**\n   * 图标名\n   */\n  icon?: Component | string;\n  /**\n   * 菜单名\n   */\n  name: string;\n  /**\n   * 排序号\n   */\n  order?: number;\n  /**\n   * 父级路径\n   */\n  parent?: string;\n  /**\n   * 所有父级路径\n   */\n  parents?: string[];\n  /**\n   * 菜单路径，唯一，可当作key\n   */\n  path: string;\n  /**\n   * 是否显示菜单\n   * @default true\n   */\n  show?: boolean;\n\n  meta?: any;\n}\n\nexport type { ExRouteRecordRaw, MenuRecordBadgeRaw, MenuRecordRaw };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/typings/tabs.ts",
    "content": "import type { RouteLocationNormalized } from \"vue-router\";\n\nexport type TabDefinition = RouteLocationNormalized;\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/typings/vue-router.d.ts",
    "content": "import type { Component } from \"vue\";\nimport type { Router, RouteRecordRaw } from \"vue-router\";\n\ninterface RouteMeta {\n  /**\n   * 激活图标（菜单/tab）\n   */\n  activeIcon?: string;\n  /**\n   * 当前激活的菜单，有时候不想激活现有菜单，需要激活父级菜单时使用\n   */\n  activePath?: string;\n  /**\n   * 是否固定标签页\n   * @default false\n   */\n  affixTab?: boolean;\n  /**\n   * 固定标签页的顺序\n   * @default 0\n   */\n  affixTabOrder?: number;\n  /**\n   * 需要特定的角色标识才可以访问\n   * @default []\n   */\n  authority?: string[];\n  /**\n   * 徽标\n   */\n  badge?: string;\n  /**\n   * 徽标类型\n   */\n  badgeType?: \"dot\" | \"normal\";\n  /**\n   * 徽标颜色\n   */\n  badgeVariants?: \"default\" | \"destructive\" | \"primary\" | \"success\" | \"warning\" | string;\n  /**\n   * 当前路由的子级在菜单中不展现\n   * @default false\n   */\n  hideChildrenInMenu?: boolean;\n  /**\n   * 当前路由在面包屑中不展现\n   * @default false\n   */\n  hideInBreadcrumb?: boolean;\n  /**\n   * 当前路由在菜单中不展现\n   * @default false\n   */\n  hideInMenu?: boolean;\n  /**\n   * 当前路由在标签页不展现\n   * @default false\n   */\n  hideInTab?: boolean;\n  /**\n   * 图标（菜单/tab）\n   */\n  icon?: Component | string;\n  /**\n   * iframe 地址\n   */\n  iframeSrc?: string;\n  /**\n   * 忽略权限，直接可以访问\n   * @default false\n   */\n  ignoreAccess?: boolean;\n  /**\n   * 开启KeepAlive缓存\n   */\n  keepAlive?: boolean;\n  /**\n   * 外链-跳转路径\n   */\n  link?: string;\n  /**\n   * 路由是否已经加载过\n   */\n  loaded?: boolean;\n  /**\n   * 标签页最大打开数量\n   * @default -1\n   */\n  maxNumOfOpenTab?: number;\n  /**\n   * 菜单可以看到，但是访问会被重定向到403\n   */\n  menuVisibleWithForbidden?: boolean;\n  /**\n   * 不使用基础布局（仅在顶级生效）\n   */\n  noBasicLayout?: boolean;\n  /**\n   * 在新窗口打开\n   */\n  openInNewWindow?: boolean;\n  /**\n   * 用于路由->菜单排序\n   */\n  order?: number;\n  /**\n   * 菜单所携带的参数\n   */\n  query?: Recordable;\n  /**\n   * 标题名称\n   */\n  title: string;\n}\n\n// 定义递归类型以将 RouteRecordRaw 的 component 属性更改为 string\ntype RouteRecordStringComponent<T = string> = Omit<RouteRecordRaw, \"children\" | \"component\"> & {\n  children?: RouteRecordStringComponent<T>[];\n  component: T;\n};\n\ntype ComponentRecordType = Record<string, () => Promise<Component>>;\n\ninterface GenerateMenuAndRoutesOptions {\n  fetchMenuListAsync?: () => Promise<RouteRecordStringComponent[]>;\n  forbiddenComponent?: RouteRecordRaw[\"component\"];\n  layoutMap?: ComponentRecordType;\n  pageMap?: ComponentRecordType;\n  roles?: string[];\n  router: Router;\n  routes: RouteRecordRaw[];\n}\n\nexport type { ComponentRecordType, GenerateMenuAndRoutesOptions, RouteMeta, RouteRecordRaw, RouteRecordStringComponent };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/helpers/__tests__/find-menu-by-path.test.ts",
    "content": "import { describe, expect, it } from \"vitest\";\n\nimport { findMenuByPath, findRootMenuByPath } from \"../find-menu-by-path\";\n\n// 示例菜单数据\nconst menus: any[] = [\n  { path: \"/\", children: [] },\n  { path: \"/about\", children: [] },\n  {\n    path: \"/contact\",\n    children: [\n      { path: \"/contact/email\", children: [] },\n      { path: \"/contact/phone\", children: [] },\n    ],\n  },\n  {\n    path: \"/services\",\n    children: [\n      { path: \"/services/design\", children: [] },\n      {\n        path: \"/services/development\",\n        children: [{ path: \"/services/development/web\", children: [] }],\n      },\n    ],\n  },\n];\n\ndescribe(\"menu Finder Tests\", () => {\n  it(\"finds a top-level menu\", () => {\n    const menu = findMenuByPath(menus, \"/about\");\n    expect(menu).toBeDefined();\n    expect(menu?.path).toBe(\"/about\");\n  });\n\n  it(\"finds a nested menu\", () => {\n    const menu = findMenuByPath(menus, \"/services/development/web\");\n    expect(menu).toBeDefined();\n    expect(menu?.path).toBe(\"/services/development/web\");\n  });\n\n  it(\"returns null for a non-existent path\", () => {\n    const menu = findMenuByPath(menus, \"/non-existent\");\n    expect(menu).toBeNull();\n  });\n\n  it(\"handles empty menus list\", () => {\n    const menu = findMenuByPath([], \"/about\");\n    expect(menu).toBeNull();\n  });\n\n  it(\"handles menu items without children\", () => {\n    const menu = findMenuByPath([{ path: \"/only\", children: undefined }] as any[], \"/only\");\n    expect(menu).toBeDefined();\n    expect(menu?.path).toBe(\"/only\");\n  });\n\n  it(\"finds root menu by path\", () => {\n    const { findMenu, rootMenu, rootMenuPath } = findRootMenuByPath(menus, \"/services/development/web\");\n\n    expect(findMenu).toBeDefined();\n    expect(rootMenu).toBeUndefined();\n    expect(rootMenuPath).toBeUndefined();\n    expect(findMenu?.path).toBe(\"/services/development/web\");\n  });\n\n  it(\"returns null for undefined or empty path\", () => {\n    const menuUndefinedPath = findMenuByPath(menus);\n    const menuEmptyPath = findMenuByPath(menus, \"\");\n    expect(menuUndefinedPath).toBeNull();\n    expect(menuEmptyPath).toBeNull();\n  });\n\n  it(\"checks for root menu when path does not exist\", () => {\n    const { findMenu, rootMenu, rootMenuPath } = findRootMenuByPath(menus, \"/non-existent\");\n    expect(findMenu).toBeNull();\n    expect(rootMenu).toBeUndefined();\n    expect(rootMenuPath).toBeUndefined();\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/helpers/__tests__/generate-menus.test.ts",
    "content": "import type { Router, RouteRecordRaw } from \"vue-router\";\n\nimport { createRouter, createWebHistory } from \"vue-router\";\n\nimport { describe, expect, it, vi } from \"vitest\";\n\nimport { generateMenus } from \"../generate-menus\";\n\n// Nested route setup to test child inclusion and hideChildrenInMenu functionality\n\ndescribe(\"generateMenus\", () => {\n  // 模拟路由数据\n  const mockRoutes = [\n    {\n      meta: { icon: \"home-icon\", title: \"首页\" },\n      name: \"home\",\n      path: \"/home\",\n    },\n    {\n      meta: { hideChildrenInMenu: true, icon: \"about-icon\", title: \"关于\" },\n      name: \"about\",\n      path: \"/about\",\n      children: [\n        {\n          path: \"team\",\n          name: \"team\",\n          meta: { icon: \"team-icon\", title: \"团队\" },\n        },\n      ],\n    },\n  ] as RouteRecordRaw[];\n\n  // 模拟 Vue 路由器实例\n  const mockRouter = {\n    getRoutes: vi.fn(() => [\n      { name: \"home\", path: \"/home\" },\n      { name: \"about\", path: \"/about\" },\n      { name: \"team\", path: \"/about/team\" },\n    ]),\n  };\n\n  it(\"the correct menu list should be generated according to the route\", async () => {\n    const expectedMenus = [\n      {\n        badge: undefined,\n        badgeType: undefined,\n        badgeVariants: undefined,\n        icon: \"home-icon\",\n        name: \"首页\",\n        order: undefined,\n        parent: undefined,\n        parents: undefined,\n        path: \"/home\",\n        show: true,\n        children: [],\n      },\n      {\n        badge: undefined,\n        badgeType: undefined,\n        badgeVariants: undefined,\n        icon: \"about-icon\",\n        name: \"关于\",\n        order: undefined,\n        parent: undefined,\n        parents: undefined,\n        path: \"/about\",\n        show: true,\n        children: [],\n      },\n    ];\n\n    const menus = await generateMenus(mockRoutes, mockRouter as any);\n    expect(menus).toEqual(expectedMenus);\n  });\n\n  it(\"includes additional meta properties in menu items\", async () => {\n    const mockRoutesWithMeta = [\n      {\n        meta: { icon: \"user-icon\", order: 1, title: \"Profile\" },\n        name: \"profile\",\n        path: \"/profile\",\n      },\n    ] as RouteRecordRaw[];\n\n    const menus = await generateMenus(mockRoutesWithMeta, mockRouter as any);\n    expect(menus).toEqual([\n      {\n        badge: undefined,\n        badgeType: undefined,\n        badgeVariants: undefined,\n        icon: \"user-icon\",\n        name: \"Profile\",\n        order: 1,\n        parent: undefined,\n        parents: undefined,\n        path: \"/profile\",\n        show: true,\n        children: [],\n      },\n    ]);\n  });\n\n  it(\"handles dynamic route parameters correctly\", async () => {\n    const mockRoutesWithParams = [\n      {\n        meta: { icon: \"details-icon\", title: \"User Details\" },\n        name: \"userDetails\",\n        path: \"/users/:userId\",\n      },\n    ] as RouteRecordRaw[];\n\n    const menus = await generateMenus(mockRoutesWithParams, mockRouter as any);\n    expect(menus).toEqual([\n      {\n        badge: undefined,\n        badgeType: undefined,\n        badgeVariants: undefined,\n        icon: \"details-icon\",\n        name: \"User Details\",\n        order: undefined,\n        parent: undefined,\n        parents: undefined,\n        path: \"/users/:userId\",\n        show: true,\n        children: [],\n      },\n    ]);\n  });\n\n  it(\"processes routes with redirects correctly\", async () => {\n    const mockRoutesWithRedirect = [\n      {\n        name: \"redirectedRoute\",\n        path: \"/old-path\",\n        redirect: \"/new-path\",\n      },\n      {\n        meta: { icon: \"path-icon\", title: \"New Path\" },\n        name: \"newPath\",\n        path: \"/new-path\",\n      },\n    ] as RouteRecordRaw[];\n\n    const menus = await generateMenus(mockRoutesWithRedirect, mockRouter as any);\n    expect(menus).toEqual([\n      // Assuming your generateMenus function excludes redirect routes from the menu\n      {\n        badge: undefined,\n        badgeType: undefined,\n        badgeVariants: undefined,\n        icon: undefined,\n        name: \"redirectedRoute\",\n        order: undefined,\n        parent: undefined,\n        parents: undefined,\n        path: \"/old-path\",\n        show: true,\n        children: [],\n      },\n      {\n        badge: undefined,\n        badgeType: undefined,\n        badgeVariants: undefined,\n        icon: \"path-icon\",\n        name: \"New Path\",\n        order: undefined,\n        parent: undefined,\n        parents: undefined,\n        path: \"/new-path\",\n        show: true,\n        children: [],\n      },\n    ]);\n  });\n\n  const routes: any = [\n    {\n      meta: { order: 2, title: \"Home\" },\n      name: \"home\",\n      path: \"/\",\n    },\n    {\n      meta: { order: 1, title: \"About\" },\n      name: \"about\",\n      path: \"/about\",\n    },\n  ];\n\n  const router: Router = createRouter({\n    history: createWebHistory(),\n    routes,\n  });\n\n  it(\"should generate menu list with correct order\", async () => {\n    const menus = await generateMenus(routes, router);\n    const expectedMenus = [\n      {\n        badge: undefined,\n        badgeType: undefined,\n        badgeVariants: undefined,\n        icon: undefined,\n        name: \"About\",\n        order: 1,\n        parent: undefined,\n        parents: undefined,\n        path: \"/about\",\n        show: true,\n        children: [],\n      },\n      {\n        badge: undefined,\n        badgeType: undefined,\n        badgeVariants: undefined,\n        icon: undefined,\n        name: \"Home\",\n        order: 2,\n        parent: undefined,\n        parents: undefined,\n        path: \"/\",\n        show: true,\n        children: [],\n      },\n    ];\n\n    expect(menus).toEqual(expectedMenus);\n  });\n\n  it(\"should handle empty routes\", async () => {\n    const emptyRoutes: any[] = [];\n    const menus = await generateMenus(emptyRoutes, router);\n    expect(menus).toEqual([]);\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/helpers/__tests__/generate-routes-frontend.test.ts",
    "content": "import type { RouteRecordRaw } from \"vue-router\";\n\nimport { describe, expect, it } from \"vitest\";\n\nimport { generateRoutesByFrontend, hasAuthority } from \"../generate-routes-frontend\";\n\n// Mock 路由数据\nconst mockRoutes = [\n  {\n    meta: {\n      authority: [\"admin\", \"user\"],\n      hideInMenu: false,\n    },\n    path: \"/dashboard\",\n    children: [\n      {\n        path: \"/dashboard/overview\",\n        meta: { authority: [\"admin\"], hideInMenu: false },\n      },\n      {\n        path: \"/dashboard/stats\",\n        meta: { authority: [\"user\"], hideInMenu: true },\n      },\n    ],\n  },\n  {\n    meta: { authority: [\"admin\"], hideInMenu: false },\n    path: \"/settings\",\n  },\n  {\n    meta: { hideInMenu: false },\n    path: \"/profile\",\n  },\n] as RouteRecordRaw[];\n\ndescribe(\"hasAuthority\", () => {\n  it(\"should return true if there is no authority defined\", () => {\n    expect(hasAuthority(mockRoutes[2], [\"admin\"])).toBe(true);\n  });\n\n  it(\"should return true if the user has the required authority\", () => {\n    expect(hasAuthority(mockRoutes[0], [\"admin\"])).toBe(true);\n  });\n\n  it(\"should return false if the user does not have the required authority\", () => {\n    expect(hasAuthority(mockRoutes[1], [\"user\"])).toBe(false);\n  });\n});\n\ndescribe(\"generateRoutesByFrontend\", () => {\n  it(\"should handle routes without children\", async () => {\n    const generatedRoutes = await generateRoutesByFrontend(mockRoutes, [\"user\"]);\n    expect(generatedRoutes).toEqual(\n      expect.arrayContaining([\n        expect.objectContaining({\n          path: \"/profile\", // This route has no children and should be included\n        }),\n      ])\n    );\n  });\n\n  it(\"should handle empty roles array\", async () => {\n    const generatedRoutes = await generateRoutesByFrontend(mockRoutes, []);\n    expect(generatedRoutes).toEqual(\n      expect.arrayContaining([\n        // Only routes without authority should be included\n        expect.objectContaining({\n          path: \"/profile\",\n        }),\n      ])\n    );\n    expect(generatedRoutes).not.toEqual(\n      expect.arrayContaining([\n        expect.objectContaining({\n          path: \"/dashboard\",\n        }),\n        expect.objectContaining({\n          path: \"/settings\",\n        }),\n      ])\n    );\n  });\n\n  it(\"should handle missing meta fields\", async () => {\n    const routesWithMissingMeta = [\n      { path: \"/path1\" }, // No meta\n      { meta: {}, path: \"/path2\" }, // Empty meta\n      { meta: { authority: [\"admin\"] }, path: \"/path3\" }, // Only authority\n    ];\n    const generatedRoutes = await generateRoutesByFrontend(routesWithMissingMeta as RouteRecordRaw[], [\"admin\"]);\n    expect(generatedRoutes).toEqual([{ path: \"/path1\" }, { meta: {}, path: \"/path2\" }, { meta: { authority: [\"admin\"] }, path: \"/path3\" }]);\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/helpers/__tests__/merge-route-modules.test.ts",
    "content": "import type { RouteRecordRaw } from \"vue-router\";\n\nimport type { RouteModuleType } from \"../merge-route-modules\";\n\nimport { describe, expect, it } from \"vitest\";\n\nimport { mergeRouteModules } from \"../merge-route-modules\";\n\ndescribe(\"mergeRouteModules\", () => {\n  it(\"should merge route modules correctly\", () => {\n    const routeModules: Record<string, RouteModuleType> = {\n      \"./dynamic-routes/about.ts\": {\n        default: [\n          {\n            component: () => Promise.resolve({ template: \"<div>About</div>\" }),\n            name: \"About\",\n            path: \"/about\",\n          },\n        ],\n      },\n      \"./dynamic-routes/home.ts\": {\n        default: [\n          {\n            component: () => Promise.resolve({ template: \"<div>Home</div>\" }),\n            name: \"Home\",\n            path: \"/\",\n          },\n        ],\n      },\n    };\n\n    const expectedRoutes: RouteRecordRaw[] = [\n      {\n        component: expect.any(Function),\n        name: \"About\",\n        path: \"/about\",\n      },\n      {\n        component: expect.any(Function),\n        name: \"Home\",\n        path: \"/\",\n      },\n    ];\n\n    const mergedRoutes = mergeRouteModules(routeModules);\n    expect(mergedRoutes).toEqual(expectedRoutes);\n  });\n\n  it(\"should handle empty modules\", () => {\n    const routeModules: Record<string, RouteModuleType> = {};\n    const expectedRoutes: RouteRecordRaw[] = [];\n\n    const mergedRoutes = mergeRouteModules(routeModules);\n    expect(mergedRoutes).toEqual(expectedRoutes);\n  });\n\n  it(\"should handle modules with no default export\", () => {\n    const routeModules: Record<string, RouteModuleType> = {\n      \"./dynamic-routes/empty.ts\": {\n        default: [],\n      },\n    };\n    const expectedRoutes: RouteRecordRaw[] = [];\n\n    const mergedRoutes = mergeRouteModules(routeModules);\n    expect(mergedRoutes).toEqual(expectedRoutes);\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/helpers/find-menu-by-path.ts",
    "content": "import type { MenuRecordRaw } from \"/@/vben/typings\";\n\nfunction findMenuByPath(list: MenuRecordRaw[], path?: string): MenuRecordRaw | null {\n  for (const menu of list) {\n    if (menu.path === path) {\n      return menu;\n    }\n    const findMenu = menu.children && findMenuByPath(menu.children, path);\n    if (findMenu) {\n      return findMenu;\n    }\n  }\n  return null;\n}\n\n/**\n * 查找根菜单\n * @param menus\n * @param path\n */\nfunction findRootMenuByPath(menus: MenuRecordRaw[], path?: string, level = 0) {\n  const findMenu = findMenuByPath(menus, path);\n  const rootMenuPath = findMenu?.parents?.[level];\n  const rootMenu = rootMenuPath ? menus.find(item => item.path === rootMenuPath) : undefined;\n  return {\n    findMenu,\n    rootMenu,\n    rootMenuPath,\n  };\n}\n\nexport { findMenuByPath, findRootMenuByPath };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/helpers/generate-menus.ts",
    "content": "import type { Router, RouteRecordRaw } from \"vue-router\";\n\nimport type { ExRouteRecordRaw, MenuRecordRaw } from \"/@/vben/typings\";\nimport { sortBy } from \"lodash-es\";\nimport { filterTree, mapTree } from \"/@/vben/shared/utils\";\n\n/**\n * 根据 routes 生成菜单列表\n * @param routes\n */\nasync function generateMenus(routes: RouteRecordRaw[], router: Router): Promise<MenuRecordRaw[]> {\n  // 将路由列表转换为一个以 name 为键的对象映射\n  // 获取所有router最终的path及name\n  const finalRoutesMap: { [key: string]: string } = Object.fromEntries(router.getRoutes().map(({ name, path }) => [name, path]));\n\n  let menus = mapTree<ExRouteRecordRaw, MenuRecordRaw>(routes, (route: any) => {\n    // 路由表的路径写法有多种，这里从router获取到最终的path并赋值\n    const path = finalRoutesMap[route.name as string] ?? route.path;\n\n    // 转换为菜单结构\n    // const path = matchRoute?.path ?? route.path;\n    const { meta, name: routeName, redirect, children } = route;\n    const { activeIcon, badge, badgeType, badgeVariants, hideChildrenInMenu = false, icon, link, order, title = \"\" } = meta || {};\n\n    const name = (title || routeName || \"\") as string;\n\n    // 隐藏子菜单\n    const resultChildren = hideChildrenInMenu ? [] : (children as MenuRecordRaw[]);\n\n    // 将菜单的所有父级和父级菜单记录到菜单项内\n    if (resultChildren && resultChildren.length > 0) {\n      resultChildren.forEach(child => {\n        child.parents = [...(route.parents || []), path];\n        child.parent = path;\n      });\n    }\n    // 隐藏子菜单\n    const resultPath = hideChildrenInMenu ? redirect || path : link || path;\n    return {\n      activeIcon,\n      badge,\n      badgeType,\n      badgeVariants,\n      icon,\n      name,\n      order,\n      parent: route.parent,\n      parents: route.parents,\n      path: resultPath as string,\n      show: !route?.meta?.hideInMenu && route?.meta?.isMenu !== false,\n      children: resultChildren || [],\n      meta: route.meta,\n    };\n  });\n\n  // 对菜单进行排序\n  menus = sortBy(menus, (item: any) => item.order ?? 0);\n\n  const finalMenus = filterTree(menus, menu => {\n    return !!menu.show;\n  });\n  return finalMenus;\n}\n\nexport { generateMenus };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/helpers/generate-routes-backend.ts",
    "content": "import type { RouteRecordRaw } from \"vue-router\";\n\nimport type { ComponentRecordType, GenerateMenuAndRoutesOptions, RouteRecordStringComponent } from \"/@/vben/typings\";\n\nimport { mapTree } from \"/@/vben/shared/utils\";\n\n/**\n * 动态生成路由 - 后端方式\n */\nasync function generateRoutesByBackend(options: GenerateMenuAndRoutesOptions): Promise<RouteRecordRaw[]> {\n  const { fetchMenuListAsync, layoutMap = {}, pageMap = {} } = options;\n\n  try {\n    const menuRoutes = await fetchMenuListAsync?.();\n    if (!menuRoutes) {\n      return [];\n    }\n\n    const normalizePageMap: ComponentRecordType = {};\n\n    for (const [key, value] of Object.entries(pageMap)) {\n      normalizePageMap[normalizeViewPath(key)] = value;\n    }\n\n    const routes = convertRoutes(menuRoutes, layoutMap, normalizePageMap);\n\n    return routes;\n  } catch (error) {\n    console.error(error);\n    return [];\n  }\n}\n\nfunction convertRoutes(routes: RouteRecordStringComponent[], layoutMap: ComponentRecordType, pageMap: ComponentRecordType): RouteRecordRaw[] {\n  return mapTree(routes, node => {\n    const route = node as unknown as RouteRecordRaw;\n    const { component, name } = node;\n\n    if (!name) {\n      console.error(\"route name is required\", route);\n    }\n\n    // layout转换\n    if (component && layoutMap[component]) {\n      route.component = layoutMap[component];\n      // 页面组件转换\n    } else if (component) {\n      const normalizePath = normalizeViewPath(component);\n      const pageKey = normalizePath.endsWith(\".vue\") ? normalizePath : `${normalizePath}.vue`;\n      if (pageMap[pageKey]) {\n        route.component = pageMap[pageKey];\n      } else {\n        console.error(`route component is invalid: ${pageKey}`, route);\n      }\n    }\n\n    return route;\n  });\n}\n\nfunction normalizeViewPath(path: string): string {\n  // 去除相对路径前缀\n  const normalizedPath = path.replace(/^(\\.\\/|\\.\\.\\/)+/, \"\");\n\n  // 确保路径以 '/' 开头\n  const viewPath = normalizedPath.startsWith(\"/\") ? normalizedPath : `/${normalizedPath}`;\n\n  // 这里耦合了vben-admin的目录结构\n  return viewPath.replace(/^\\/views/, \"\");\n}\nexport { generateRoutesByBackend };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/helpers/generate-routes-frontend.ts",
    "content": "import type { RouteRecordRaw } from \"vue-router\";\n\nimport { filterTree, mapTree } from \"/@/vben/shared/utils\";\n\n/**\n * 动态生成路由 - 前端方式\n */\nasync function generateRoutesByFrontend(routes: RouteRecordRaw[], roles: string[], forbiddenComponent?: RouteRecordRaw[\"component\"]): Promise<RouteRecordRaw[]> {\n  // 根据角色标识过滤路由表,判断当前用户是否拥有指定权限\n  const finalRoutes = filterTree(routes, route => {\n    return hasAuthority(route, roles);\n  });\n\n  if (!forbiddenComponent) {\n    return finalRoutes;\n  }\n\n  // 如果有禁止访问的页面，将禁止访问的页面替换为403页面\n  return mapTree(finalRoutes, route => {\n    if (menuHasVisibleWithForbidden(route)) {\n      route.component = forbiddenComponent;\n    }\n    return route;\n  });\n}\n\n/**\n * 判断路由是否有权限访问\n * @param route\n * @param access\n */\nfunction hasAuthority(route: RouteRecordRaw, access: string[]) {\n  const authority = route.meta?.authority;\n  if (!authority) {\n    return true;\n  }\n  const canAccess = access.some(value => authority.includes(value));\n\n  return canAccess || (!canAccess && menuHasVisibleWithForbidden(route));\n}\n\n/**\n * 判断路由是否在菜单中显示，但是访问会被重定向到403\n * @param route\n */\nfunction menuHasVisibleWithForbidden(route: RouteRecordRaw) {\n  return !!route.meta?.authority && Reflect.has(route.meta || {}, \"menuVisibleWithForbidden\") && !!route.meta?.menuVisibleWithForbidden;\n}\n\nexport { generateRoutesByFrontend, hasAuthority };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/helpers/get-popup-container.ts",
    "content": "/**\n * If the node is holding inside a form, return the form element,\n * otherwise return the parent node of the given element or\n * the document body if the element is not provided.\n */\nexport function getPopupContainer(node?: HTMLElement): HTMLElement {\n  return node?.closest(\"form\") ?? (node?.parentNode as HTMLElement) ?? document.body;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/helpers/index.ts",
    "content": "export * from \"./find-menu-by-path\";\nexport * from \"./generate-menus\";\nexport * from \"./generate-routes-backend\";\nexport * from \"./generate-routes-frontend\";\nexport * from \"./get-popup-container\";\nexport * from \"./merge-route-modules\";\nexport * from \"./reset-routes\";\nexport * from \"./unmount-global-loading\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/helpers/merge-route-modules.ts",
    "content": "import type { RouteRecordRaw } from \"vue-router\";\n\n// 定义模块类型\ninterface RouteModuleType {\n  default: RouteRecordRaw[];\n}\n\n/**\n * 合并动态路由模块的默认导出\n * @param routeModules 动态导入的路由模块对象\n * @returns 合并后的路由配置数组\n */\nfunction mergeRouteModules(routeModules: Record<string, unknown>): RouteRecordRaw[] {\n  const mergedRoutes: RouteRecordRaw[] = [];\n\n  for (const routeModule of Object.values(routeModules)) {\n    const moduleRoutes = (routeModule as RouteModuleType)?.default ?? [];\n    mergedRoutes.push(...moduleRoutes);\n  }\n  return mergedRoutes;\n}\n\nexport { mergeRouteModules };\n\nexport type { RouteModuleType };\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/helpers/reset-routes.ts",
    "content": "import type { Router, RouteRecordName, RouteRecordRaw } from \"vue-router\";\n\nimport { traverseTreeValues } from \"/@/vben/shared/utils\";\n\n/**\n * @zh_CN 重置所有路由，如有指定白名单除外\n */\nexport function resetStaticRoutes(router: Router, routes: RouteRecordRaw[]) {\n  // 获取静态路由所有节点包含子节点的 name，并排除不存在 name 字段的路由\n  const staticRouteNames = traverseTreeValues<RouteRecordRaw, RouteRecordName | undefined>(routes, route => {\n    // 这些路由需要指定 name，防止在路由重置时，不能删除没有指定 name 的路由\n    if (!route.name) {\n      console.warn(`The route with the path ${route.path} needs to have the field name specified.`);\n    }\n    return route.name;\n  });\n\n  const { getRoutes, hasRoute, removeRoute } = router;\n  const allRoutes = getRoutes();\n  allRoutes.forEach(({ name }) => {\n    // 存在于路由表且非白名单才需要删除\n    if (name && !staticRouteNames.includes(name) && hasRoute(name)) {\n      removeRoute(name);\n    }\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/helpers/unmount-global-loading.ts",
    "content": "/**\n * 移除并销毁loading\n * 放在这里是而不是放在 index.html 的app标签内，是因为这样比较不会生硬，渲染过快可能会有闪烁\n * 通过先添加css动画隐藏，在动画结束后在移除loading节点来改善体验\n * 不好的地方是会增加一些代码量\n * 自定义loading可以见：https://doc.vben.pro/guide/in-depth/loading.html\n */\nexport function unmountGlobalLoading() {\n  // 查找全局 loading 元素\n  const loadingElement = document.querySelector(\"#__app-loading__\");\n\n  if (loadingElement) {\n    // 添加隐藏类，触发过渡动画\n    loadingElement.classList.add(\"hidden\");\n\n    // 查找所有需要移除的注入 loading 元素\n    const injectLoadingElements = document.querySelectorAll('[data-app-loading^=\"inject\"]');\n\n    // 当过渡动画结束时，移除 loading 元素和所有注入的 loading 元素\n    loadingElement.addEventListener(\n      \"transitionend\",\n      () => {\n        loadingElement.remove(); // 移除 loading 元素\n        injectLoadingElements.forEach(el => el.remove()); // 移除所有注入的 loading 元素\n      },\n      { once: true }\n    ); // 确保事件只触发一次\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/vben/utils/index.ts",
    "content": "export * from \"./helpers\";\nexport * from \"../shared/cache\";\nexport * from \"../shared/color\";\nexport * from \"../shared/utils\";\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/access/access-selector/access/crud.tsx",
    "content": "// @ts-ignore\nimport { ref } from \"vue\";\nimport { getCommonColumnDefine } from \"/@/views/certd/access/common\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { useI18n } from \"/src/locales\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { t } = useI18n();\n  const { crudBinding } = crudExpose;\n  const { props, ctx, api } = context;\n  const lastResRef = ref();\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await context.api.GetList(query);\n  };\n  const editRequest = async (req: EditReq) => {\n    const { form, row } = req;\n    form.id = row.id;\n    form.type = props.type;\n    const res = await context.api.UpdateObj(form);\n    lastResRef.value = res;\n    return res;\n  };\n  const delRequest = async (req: DelReq) => {\n    const { row } = req;\n    return await context.api.DelObj(row.id);\n  };\n\n  const addRequest = async (req: AddReq) => {\n    const { form } = req;\n    form.type = props.type;\n    const res = await context.api.AddObj(form);\n    lastResRef.value = res;\n    return res;\n  };\n\n  const selectedRowKey = ref([props.modelValue]);\n\n  const onSelectChange = (changed: any) => {\n    selectedRowKey.value = changed;\n    ctx.emit(\"update:modelValue\", changed[0]);\n  };\n\n  const typeRef = ref(\"aliyun\");\n  context.typeRef = typeRef;\n  const commonColumnsDefine = getCommonColumnDefine(crudExpose, typeRef, api);\n  commonColumnsDefine.type.form.component.disabled = true;\n  return {\n    typeRef,\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      toolbar: {\n        show: false,\n      },\n      search: {\n        show: false,\n      },\n      form: {\n        wrapper: {\n          width: \"1050px\",\n        },\n      },\n      rowHandle: {\n        width: 200,\n      },\n      table: {\n        scroll: {\n          x: 800,\n        },\n        rowSelection: {\n          type: \"radio\",\n          selectedRowKeys: selectedRowKey,\n          onChange: onSelectChange,\n        },\n        customRow: (record: any) => {\n          return {\n            onClick: () => {\n              onSelectChange([record.id]);\n            }, // 点击行\n          };\n        },\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          column: {\n            width: 50,\n          },\n          form: {\n            show: false,\n          },\n        },\n        name: {\n          title: t(\"certd.name\"),\n          search: {\n            show: true,\n          },\n          type: [\"text\"],\n          form: {\n            rules: [{ required: true, message: t(\"certd.pleaseEnterName\") }],\n            helper: t(\"certd.nameHelper\"),\n          },\n          column: {\n            width: 200,\n          },\n        },\n        from: {\n          title: t(\"certd.level\"),\n          type: \"dict-select\",\n          dict: dict({\n            data: [\n              { label: t(\"certd.system\"), value: \"sys\" },\n              { label: t(\"certd.usera\"), value: \"user\" },\n            ],\n          }),\n          search: {\n            show: false,\n          },\n          form: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            align: \"center\",\n            component: {\n              color: \"auto\",\n            },\n            order: 10,\n          },\n          valueBuilder: ({ row, key, value }) => {\n            row[key] = row.userId > 0 ? \"user\" : \"sys\";\n          },\n        },\n        ...commonColumnsDefine,\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/access/access-selector/access/index.vue",
    "content": "<template>\n  <fs-page class=\"page-cert-access-modal\">\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, watch } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { createAccessApi } from \"/@/views/certd/access/api\";\n\nexport default defineComponent({\n  name: \"CertAccessModal\",\n  props: {\n    type: {\n      type: String,\n      default: \"aliyun\",\n    },\n    from: {\n      type: String, //user | sys\n      default: \"user\",\n    },\n    modelValue: {},\n  },\n  emits: [\"update:modelValue\"],\n  setup(props, ctx) {\n    const api = createAccessApi(props.from);\n    const context: any = { props, ctx, api };\n    const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context });\n\n    // 你可以调用此方法，重新初始化crud配置\n    function onTypeChanged(value: any) {\n      context.typeRef.value = value;\n      crudExpose.setSearchFormData({ form: { type: value }, mergeForm: true });\n      crudExpose.doRefresh();\n    }\n    watch(\n      () => {\n        return props.type;\n      },\n      value => {\n        console.log(\"access type changed:\", value);\n        onTypeChanged(value);\n      }\n    );\n    // 页面打开后获取列表数据\n    onMounted(() => {\n      onTypeChanged(props.type);\n    });\n\n    return {\n      crudBinding,\n      crudRef,\n    };\n  },\n});\n</script>\n<style lang=\"less\">\n.page-cert-access {\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/access/access-selector/access/secret-plain-getter.vue",
    "content": "<template>\n  <a-button class=\"cd-secret-plain-getter ml-5\" @click=\"showPlain\">\n    <fs-icon class=\"pointer\" :icon=\"computedIcon\" />\n  </a-button>\n</template>\n<script lang=\"ts\" setup>\nimport { computed, inject, ref } from \"vue\";\ndefineOptions({\n  name: \"SecretPlainGetter\",\n});\n\nconst props = defineProps<{\n  modelValue?: string;\n  accessId?: number;\n  inputKey: string;\n}>();\n\nconst emit = defineEmits([\"update:modelValue\"]);\nconst showRef = ref(false);\nconst computedIcon = computed(() => {\n  return showRef.value ? \"ion:eye-outline\" : \"ion:eye-off-outline\";\n});\nconst accessApi: any = inject(\"accessApi\");\nasync function showPlain() {\n  showRef.value = true;\n  if (props.accessId) {\n    const plain = await accessApi.GetSecretPlain(props.accessId, props.inputKey);\n    emit(\"update:modelValue\", plain);\n  }\n}\n</script>\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/access/access-selector/index.vue",
    "content": "<template>\n  <div class=\"access-selector\">\n    <span v-if=\"modelValue\" class=\"mr-5 cd-flex-inline\">\n      <a-tag class=\"mr-5\" color=\"green\">{{ target?.name || modelValue }}</a-tag>\n      <fs-icon class=\"cd-icon-button\" icon=\"ion:close-circle-outline\" @click=\"clear\"></fs-icon>\n    </span>\n    <span v-else class=\"mlr-5 text-gray\">{{ placeholder }}</span>\n    <a-button class=\"ml-5\" :disabled=\"disabled\" :size=\"size\" @click=\"chooseForm.open\">选择</a-button>\n    <a-form-item-rest v-if=\"chooseForm.show\">\n      <a-modal v-model:open=\"chooseForm.show\" title=\"选择授权提供者\" width=\"900px\" @ok=\"chooseForm.ok\">\n        <div style=\"height: 400px; position: relative\">\n          <cert-access-modal v-model=\"selectedId\" :type=\"type\" :from=\"from\"></cert-access-modal>\n        </div>\n      </a-modal>\n    </a-form-item-rest>\n  </div>\n</template>\n\n<script>\nimport { defineComponent, reactive, ref, watch, inject } from \"vue\";\nimport CertAccessModal from \"./access/index.vue\";\nimport { createAccessApi } from \"../api\";\nimport { message } from \"ant-design-vue\";\n\nexport default defineComponent({\n  name: \"AccessSelector\",\n  components: { CertAccessModal },\n  props: {\n    modelValue: {\n      type: [Number, String],\n      default: null,\n    },\n    type: {\n      type: String,\n      default: \"aliyun\",\n    },\n    placeholder: {\n      type: String,\n      default: \"请选择\",\n    },\n    size: {\n      type: String,\n      default: \"middle\",\n    },\n    from: {\n      type: String, //user | sys\n      default: \"user\",\n    },\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\"update:modelValue\", \"change\", \"selectedChange\"],\n  setup(props, ctx) {\n    const api = createAccessApi(props.from);\n\n    const target = ref({});\n    const selectedId = ref();\n    async function refreshTarget(value) {\n      selectedId.value = value;\n      if (value > 0) {\n        target.value = await api.GetSimpleInfo(value);\n      }\n    }\n\n    function clear() {\n      if (props.disabled) {\n        return;\n      }\n      emitValue(null);\n    }\n\n    async function emitValue(value) {\n      if (pipeline?.value && target?.value && pipeline.value.userId !== target.value.userId) {\n        message.error(\"对不起，您不能修改他人流水线的授权\");\n        return;\n      }\n      if (value == null) {\n        selectedId.value = \"\";\n        target.value = null;\n      } else {\n        selectedId.value = value;\n        await refreshTarget(selectedId.value);\n      }\n      ctx.emit(\"change\", selectedId.value);\n      ctx.emit(\"update:modelValue\", selectedId.value);\n      ctx.emit(\"selectedChange\", target.value);\n    }\n\n    watch(\n      () => {\n        return props.modelValue;\n      },\n      async value => {\n        selectedId.value = null;\n        target.value = null;\n        if (value == null) {\n          return;\n        }\n        await refreshTarget(value);\n      },\n      {\n        immediate: true,\n      }\n    );\n\n    const providerDefine = ref({});\n\n    async function refreshProviderDefine(type) {\n      providerDefine.value = await api.GetProviderDefine(type);\n    }\n    watch(\n      () => {\n        return props.type;\n      },\n      async value => {\n        await refreshProviderDefine(value);\n      },\n      {\n        immediate: true,\n      }\n    );\n\n    //当不在pipeline中编辑时，可能为空\n    const pipeline = inject(\"pipeline\", null);\n\n    const chooseForm = reactive({\n      show: false,\n      open() {\n        chooseForm.show = true;\n      },\n      ok: () => {\n        console.log(\"choose ok:\", selectedId.value);\n        emitValue(selectedId.value);\n        chooseForm.show = false;\n      },\n    });\n\n    return {\n      clear,\n      target,\n      selectedId,\n      providerDefine,\n      chooseForm,\n    };\n  },\n});\n</script>\n<style lang=\"less\">\n.access-selector {\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/access/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nexport function createAccessApi(from = \"user\") {\n  const apiPrefix = from === \"sys\" ? \"/sys/access\" : \"/pi/access\";\n  return {\n    async GetList(query: any) {\n      if (query?.query) {\n        delete query.query.access;\n      }\n\n      return await request({\n        url: apiPrefix + \"/page\",\n        method: \"post\",\n        data: query,\n      });\n    },\n\n    async AddObj(obj: any) {\n      return await request({\n        url: apiPrefix + \"/add\",\n        method: \"post\",\n        data: obj,\n      });\n    },\n\n    async UpdateObj(obj: any) {\n      return await request({\n        url: apiPrefix + \"/update\",\n        method: \"post\",\n        data: obj,\n      });\n    },\n\n    async DelObj(id: number) {\n      return await request({\n        url: apiPrefix + \"/delete\",\n        method: \"post\",\n        params: { id },\n      });\n    },\n\n    async GetObj(id: number) {\n      return await request({\n        url: apiPrefix + \"/info\",\n        method: \"post\",\n        params: { id },\n      });\n    },\n\n    async GetSimpleInfo(id: number) {\n      return await request({\n        url: apiPrefix + \"/simpleInfo\",\n        method: \"post\",\n        params: { id },\n      });\n    },\n\n    async GetDictByIds(ids: number[]) {\n      return await request({\n        url: apiPrefix + \"/getDictByIds\",\n        method: \"post\",\n        data: { ids },\n      });\n    },\n\n    async GetSecretPlain(id: number, key: string) {\n      return await request({\n        url: apiPrefix + \"/getSecretPlain\",\n        method: \"post\",\n        data: { id, key },\n      });\n    },\n\n    async GetProviderDefine(type: string) {\n      return await request({\n        url: apiPrefix + \"/define\",\n        method: \"post\",\n        params: { type },\n      });\n    },\n\n    async GetProviderDefineByAccessType(type: string) {\n      return await request({\n        url: apiPrefix + \"/defineByAccessType\",\n        method: \"post\",\n        params: { type },\n      });\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/access/common.tsx",
    "content": "import { ColumnCompositionProps, dict } from \"@fast-crud/fast-crud\";\nimport { computed, provide, ref, toRef } from \"vue\";\nimport { useReference } from \"/@/use/use-refrence\";\nimport { forEach, get, merge, set } from \"lodash-es\";\nimport SecretPlainGetter from \"/@/views/certd/access/access-selector/access/secret-plain-getter.vue\";\nimport { utils } from \"/@/utils\";\n\nexport function getCommonColumnDefine(crudExpose: any, typeRef: any, api: any) {\n  provide(\"accessApi\", api);\n  provide(\"get:plugin:type\", () => {\n    return \"access\";\n  });\n  const AccessTypeDictRef = dict({\n    url: \"/pi/access/accessTypeDict\",\n  });\n  const defaultPluginConfig = {\n    component: {\n      name: \"a-input\",\n      vModel: \"value\",\n    },\n  };\n\n  function buildDefineFields(define: any, form: any, mode: string) {\n    const formWrapperRef = crudExpose.getFormWrapperRef();\n    const columnsRef = toRef(formWrapperRef.formOptions, \"columns\");\n\n    for (const key in columnsRef.value) {\n      if (key.indexOf(\".\") >= 0) {\n        delete columnsRef.value[key];\n      }\n    }\n    console.log('crudBinding.value[mode + \"Form\"].columns', columnsRef.value);\n    forEach(define.input, (value: any, mapKey: any) => {\n      const key = \"access.\" + mapKey;\n      const field = {\n        ...value,\n        key,\n      };\n      const column = merge({ title: key }, defaultPluginConfig, field);\n\n      if (value.encrypt === true && mode != \"add\") {\n        column.suffixRender = (scope: { form: any; key: string }) => {\n          const { form, key } = scope;\n          const inputKey = scope.key.replace(\"access.\", \"\");\n          const onChange = (val: any) => {\n            set(form, key, val);\n          };\n          const value = get(form, key);\n          return <SecretPlainGetter accessId={form.id} inputKey={inputKey} modalValue={value} onUpdate:modelValue={onChange} />;\n        };\n      }\n      //eval\n      useReference(column);\n\n      if (column.required) {\n        if (!column.rules) {\n          column.rules = [];\n        }\n        column.rules.push({ required: true, message: \"此项必填\" });\n      }\n\n      //设置默认值\n      if (column.value != null && get(form, key) == null) {\n        set(form, key, column.value);\n      }\n      //字段配置赋值\n      columnsRef.value[key] = column;\n      console.log(\"form\", columnsRef.value);\n    });\n  }\n\n  const currentDefine = ref();\n\n  return {\n    type: {\n      title: \"类型\",\n      type: \"dict-select\",\n      dict: AccessTypeDictRef,\n      search: {\n        show: true,\n      },\n      column: {\n        width: 200,\n        component: {\n          color: \"auto\",\n        },\n      },\n      form: {\n        component: {\n          disabled: false,\n          showSearch: true,\n          filterOption: (input: string, option: any) => {\n            input = input?.toLowerCase();\n            return option.value.toLowerCase().indexOf(input) >= 0 || option.label.toLowerCase().indexOf(input) >= 0;\n          },\n          renderLabel(item: any) {\n            return (\n              <span class={\"flex flex-between items-center\"}>\n                <span class={\"flex items-center\"}>\n                  <fs-icon icon={item.icon} class={\"mr-5 fs-16 color-blue\"} />\n                  {item.label}\n                </span>\n                <span>{item.value}</span>\n              </span>\n            );\n          },\n        },\n        rules: [{ required: true, message: \"请选择类型\" }],\n        valueChange: {\n          immediate: true,\n          async handle({ value, mode, form, immediate }) {\n            if (value == null) {\n              return;\n            }\n            const define = await api.GetProviderDefine(value);\n            currentDefine.value = define;\n            console.log(\"define\", define);\n            if (!immediate) {\n              form.access = {};\n            }\n            buildDefineFields(define, form, mode);\n          },\n        },\n        helper: {\n          render: () => {\n            const define = currentDefine.value;\n            if (define == null) {\n              return \"\";\n            }\n            return <div innerHTML={utils.transformLink(define.desc)}></div>;\n          },\n        },\n      },\n      addForm: {\n        value: typeRef,\n      },\n    } as ColumnCompositionProps,\n    setting: {\n      column: { show: false },\n      form: {\n        show: false,\n        valueBuilder({ value, form }) {\n          form.access = {};\n          if (!value) {\n            return;\n          }\n          const setting = JSON.parse(value);\n          for (const key in setting) {\n            form.access[key] = setting[key];\n          }\n        },\n        valueResolve({ form }) {\n          const setting = form.access;\n          form.setting = JSON.stringify(setting);\n        },\n      },\n    } as ColumnCompositionProps,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/access/crud.tsx",
    "content": "// @ts-ignore\nimport { useI18n } from \"/src/locales\";\nimport { ref } from \"vue\";\nimport { getCommonColumnDefine } from \"/@/views/certd/access/common\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { t } = useI18n();\n  const api = context.api;\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async (req: EditReq) => {\n    const { form, row } = req;\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async (req: DelReq) => {\n    const { row } = req;\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async (req: AddReq) => {\n    const { form } = req;\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  const typeRef = ref();\n  const commonColumnsDefine = getCommonColumnDefine(crudExpose, typeRef, api);\n  return {\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      table: {\n        remove: {\n          confirmMessage: \"授权如果已经被使用，可能会导致流水线无法正常运行，请谨慎操作\",\n        },\n      },\n      rowHandle: {\n        width: 200,\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          column: {\n            width: 100,\n          },\n          form: {\n            show: false,\n          },\n        },\n        name: {\n          title: \"名称\",\n          type: \"text\",\n          search: {\n            show: true,\n          },\n          form: {\n            rules: [{ required: true, message: \"必填项\" }],\n          },\n          column: {\n            width: 300,\n          },\n        },\n        from: {\n          title: \"级别\",\n          type: \"dict-select\",\n          dict: dict({\n            data: [\n              { label: \"系统\", value: \"sys\" },\n              { label: \"用户\", value: \"user\" },\n            ],\n          }),\n          search: {\n            show: false,\n          },\n          form: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            align: \"center\",\n            component: {\n              color: \"auto\",\n            },\n            order: 10,\n          },\n          valueBuilder: ({ row, key, value }) => {\n            row[key] = row.userId > 0 ? \"user\" : \"sys\";\n          },\n        },\n        ...commonColumnsDefine,\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/access/index.vue",
    "content": "<template>\n  <fs-page>\n    <template #header>\n      <div class=\"title\">\n        {{ t(\"certd.authorizationManagement\") }}\n        <span class=\"sub\">{{ t(\"certd.manageThirdPartyAuth\") }}</span>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { createAccessApi } from \"/@/views/certd/access/api\";\nimport { useI18n } from \"/src/locales\";\n\nexport default defineComponent({\n  name: \"AccessManager\",\n  setup() {\n    const { t } = useI18n();\n    const api = createAccessApi(\"user\");\n    const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: { api } });\n\n    // 页面打开后获取列表数据\n    onMounted(() => {\n      crudExpose.doRefresh();\n    });\n    onActivated(() => {\n      crudExpose.doRefresh();\n    });\n\n    return {\n      crudBinding,\n      crudRef,\n      t,\n    };\n  },\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/cert/domain/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/cert/domain\";\n\nexport async function GetList(query: any) {\n  return await request({\n    url: apiPrefix + \"/page\",\n    method: \"post\",\n    data: query,\n  });\n}\n\nexport async function AddObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/add\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function UpdateObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/update\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function DelObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/delete\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/info\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetDetail(id: any) {\n  return await request({\n    url: apiPrefix + \"/detail\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function DeleteBatch(ids: any[]) {\n  return await request({\n    url: apiPrefix + \"/deleteByIds\",\n    method: \"post\",\n    data: { ids },\n  });\n}\n\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/cert/domain/crud.tsx",
    "content": "import * as api from \"./api\";\nimport { useI18n } from \"/src/locales\";\nimport { Ref, ref } from \"vue\";\nimport { useRouter } from \"vue-router\";\nimport { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { useUserStore } from \"/@/store/user\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { Dicts } from \"/@/components/plugins/lib/dicts\";\nimport { createAccessApi } from \"/@/views/certd/access/api\";\nimport { Modal } from \"ant-design-vue\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const router = useRouter();\n  const { t } = useI18n();\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  const userStore = useUserStore();\n  const settingStore = useSettingStore();\n  const selectedRowKeys: Ref<any[]> = ref([]);\n  context.selectedRowKeys = selectedRowKeys;\n\n  const accessApi = createAccessApi();\n  const accessDict = dict({\n    value: \"id\",\n    label: \"name\",\n    url: \"accessDict\",\n    async getNodesByValues(ids: number[]) {\n      return await accessApi.GetDictByIds(ids);\n    },\n  });\n\n  const httpUploaderTypeDict = Dicts.uploaderTypeDict;\n\n  const dnsProviderTypeDict = dict({\n    url: \"pi/dnsProvider/dnsProviderTypeDict\",\n  });\n  return {\n    crudOptions: {\n      settings: {\n        plugins: {\n          //这里使用行选择插件，生成行选择crudOptions配置，最终会与crudOptions合并\n          rowSelection: {\n            enabled: true,\n            order: -2,\n            before: true,\n            // handle: (pluginProps,useCrudProps)=>CrudOptions,\n            props: {\n              multiple: true,\n              crossPage: true,\n              selectedRowKeys,\n            },\n          },\n        },\n      },\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      tabs: {\n        name: \"challengeType\",\n        show: true,\n      },\n      rowHandle: {\n        minWidth: 200,\n        fixed: \"right\",\n      },\n      form: {\n        beforeSubmit({ form }) {\n          if (form.challengeType === \"cname\") {\n            throw new Error(\"CNAME方式请前往CNAME记录页面进行管理\");\n          }\n        },\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          column: {\n            width: 80,\n          },\n          form: {\n            show: false,\n          },\n        },\n        domain: {\n          title: t(\"certd.domain.domain\"),\n          type: \"text\",\n          search: {\n            show: true,\n          },\n          form: {\n            required: true,\n          },\n          editForm: {\n            component: {\n              disabled: false,\n            },\n          },\n          column: {\n            sorter: true,\n          },\n        },\n        challengeType: {\n          title: t(\"certd.domain.challengeType\"),\n          type: \"dict-select\",\n          dict: Dicts.challengeTypeDict,\n          search: {\n            show: true,\n          },\n          form: {\n            required: true,\n            valueChange({ value }) {\n              if (value === \"cname\") {\n                Modal.confirm({\n                  title: t(\"certd.domain.gotoCnameTip\"),\n                  async onOk() {\n                    router.push({\n                      path: \"/certd/cname/record\",\n                    });\n                    crudExpose.getFormWrapperRef().close();\n                  },\n                });\n              }\n            },\n          },\n          column: {\n            sorter: true,\n            show: false,\n          },\n        },\n        /**\n         * challengeType varchar(50),\n         *   dnsProviderType varchar(50),\n         *   dnsProviderAccess bigint,\n         *   httpUploaderType varchar(50),\n         *   httpUploaderAccess bigint,\n         *   httpUploadRootDir varchar(512),\n         */\n        dnsProviderType: {\n          title: t(\"certd.domain.dnsProviderType\"),\n          type: \"dict-select\",\n          dict: dnsProviderTypeDict,\n          form: {\n            component: {\n              name: \"DnsProviderSelector\",\n            },\n            show: compute(({ form }) => {\n              return form.challengeType === \"dns\";\n            }),\n            required: true,\n          },\n          column: {\n            show: false,\n            component: {\n              color: \"auto\",\n            },\n          },\n        },\n        dnsProviderAccess: {\n          title: t(\"certd.domain.dnsProviderAccess\"),\n          type: \"dict-select\",\n          dict: accessDict,\n          form: {\n            component: {\n              name: \"AccessSelector\",\n              vModel: \"modelValue\",\n              type: compute(({ form }) => {\n                return form.dnsProviderType;\n              }),\n            },\n            show: compute(({ form }) => {\n              return form.challengeType === \"dns\";\n            }),\n            required: true,\n          },\n          column: {\n            show: false,\n            component: {\n              color: \"auto\",\n            },\n          },\n        },\n        httpUploaderType: {\n          title: t(\"certd.domain.httpUploaderType\"),\n          type: \"dict-select\",\n          dict: Dicts.uploaderTypeDict,\n          form: {\n            show: compute(({ form }) => {\n              return form.challengeType === \"http\";\n            }),\n            required: true,\n          },\n          column: {\n            show: false,\n            component: {\n              color: \"auto\",\n            },\n          },\n        },\n        httpUploaderAccess: {\n          title: t(\"certd.domain.httpUploaderAccess\"),\n          type: \"text\",\n          form: {\n            component: {\n              name: \"AccessSelector\",\n              vModel: \"modelValue\",\n              type: compute(({ form }) => {\n                return form.httpUploaderType;\n              }),\n            },\n            show: compute(({ form }) => {\n              return form.challengeType === \"http\";\n            }),\n            required: true,\n          },\n          column: {\n            show: false,\n            component: {\n              color: \"auto\",\n            },\n          },\n        },\n        httpUploadRootDir: {\n          title: t(\"certd.domain.httpUploadRootDir\"),\n          type: \"text\",\n          form: {\n            show: compute(({ form }) => {\n              return form.challengeType === \"http\";\n            }),\n            required: true,\n          },\n          column: {\n            show: false,\n            component: {\n              color: \"auto\",\n            },\n          },\n        },\n        challengeSetting: {\n          title: t(\"certd.domain.challengeSetting\"),\n          type: \"text\",\n          form: { show: false },\n          column: {\n            width: 600,\n            conditionalRender: false,\n            cellRender({ row }) {\n              if (row.challengeType === \"dns\") {\n                return (\n                  <div class={\"flex\"}>\n                    <fs-values-format modelValue={row.challengeType} dict={Dicts.challengeTypeDict} color={\"auto\"}></fs-values-format>\n                    <fs-values-format modelValue={row.dnsProviderType} dict={dnsProviderTypeDict} color={\"auto\"}></fs-values-format>\n                    <fs-values-format class={\"ml-5\"} modelValue={row.dnsProviderAccess} dict={accessDict} color={\"auto\"}></fs-values-format>\n                  </div>\n                );\n              } else if (row.challengeType === \"http\") {\n                return (\n                  <div class={\"flex\"}>\n                    <fs-values-format modelValue={row.challengeType} dict={Dicts.challengeTypeDict} color={\"auto\"}></fs-values-format>\n                    <fs-values-format modelValue={row.httpUploaderType} dict={httpUploaderTypeDict} color={\"auto\"}></fs-values-format>\n                    <fs-values-format class={\"ml-5\"} modelValue={row.httpUploaderAccess} dict={accessDict} color={\"auto\"}></fs-values-format>\n                    <a-tag class={\"ml-5 flex items-center\"}>路径：{row.httpUploadRootDir}</a-tag>\n                  </div>\n                );\n              }\n            },\n          },\n        },\n        disabled: {\n          title: t(\"certd.domain.disabled\"),\n          type: \"dict-switch\",\n          search: { show: true },\n          dict: dict({\n            data: [\n              { label: t(\"common.enabled\"), value: false, color: \"green\" },\n              { label: t(\"common.disabled\"), value: true, color: \"red\" },\n            ],\n          }),\n          form: {\n            value: false,\n            required: true,\n          },\n          column: {\n            width: 100,\n            sorter: true,\n          },\n        },\n        createTime: {\n          title: t(\"certd.createTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 160,\n            align: \"center\",\n          },\n        },\n        updateTime: {\n          title: t(\"certd.updateTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            show: true,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/cert/domain/index.vue",
    "content": "<template>\n  <fs-page class=\"page-cert\">\n    <template #header>\n      <div class=\"title\">\n        {{ t(\"certd.domain.domainManager\") }}\n        <span class=\"sub\">\n          {{ t(\"certd.domain.domainDescription\") }}\n        </span>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\">\n      <template #pagination-left>\n        <a-tooltip :title=\"t('certd.batch_delete')\">\n          <fs-button icon=\"DeleteOutlined\" @click=\"handleBatchDelete\"></fs-button>\n        </a-tooltip>\n      </template>\n    </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { message, Modal } from \"ant-design-vue\";\nimport { DeleteBatch } from \"./api\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\ndefineOptions({\n  name: \"DomainManager\",\n});\nconst { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions });\n\nconst selectedRowKeys = context.selectedRowKeys;\nconst handleBatchDelete = () => {\n  if (selectedRowKeys.value?.length > 0) {\n    Modal.confirm({\n      title: t(\"certd.confirm\"),\n      content: t(\"certd.confirm_delete_count\", { count: selectedRowKeys.value.length }),\n      async onOk() {\n        await DeleteBatch(selectedRowKeys.value);\n        message.info(t(\"certd.delete_successful\"));\n        crudExpose.doRefresh();\n        selectedRowKeys.value = [];\n      },\n    });\n  } else {\n    message.error(t(\"certd.please_select_records\"));\n  }\n};\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(async () => {\n  await crudExpose.doRefresh();\n});\n</script>\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/cname/record/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/cname/record\";\n\nexport async function GetList(query: any) {\n  return await request({\n    url: apiPrefix + \"/page\",\n    method: \"post\",\n    data: query,\n  });\n}\n\nexport async function AddObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/add\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function UpdateObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/update\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function DelObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/delete\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/info\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetDetail(id: any) {\n  return await request({\n    url: apiPrefix + \"/detail\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function DeleteBatch(ids: any[]) {\n  return await request({\n    url: apiPrefix + \"/deleteByIds\",\n    method: \"post\",\n    data: { ids },\n  });\n}\n\nexport async function DoVerify(id: number) {\n  return await request({\n    url: apiPrefix + \"/verify\",\n    method: \"post\",\n    data: {\n      id,\n    },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/cname/record/crud.tsx",
    "content": "import * as api from \"./api\";\nimport { useI18n } from \"/src/locales\";\nimport { Ref, ref } from \"vue\";\nimport { useRouter } from \"vue-router\";\nimport { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { useUserStore } from \"/@/store/user\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { message } from \"ant-design-vue\";\nimport CnameTip from \"/@/components/plugins/cert/domains-verify-plan-editor/cname-tip.vue\";\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const router = useRouter();\n  const { t } = useI18n();\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  const userStore = useUserStore();\n  const settingStore = useSettingStore();\n  const selectedRowKeys: Ref<any[]> = ref([]);\n  context.selectedRowKeys = selectedRowKeys;\n  const dictRef = dict({\n    data: [\n      { label: t(\"certd.pending_cname_setup\"), value: \"cname\", color: \"warning\" },\n      { label: t(\"certd.validating\"), value: \"validating\", color: \"blue\" },\n      { label: t(\"certd.validation_successful\"), value: \"valid\", color: \"green\" },\n      { label: t(\"certd.validation_failed\"), value: \"failed\", color: \"red\" },\n      { label: t(\"certd.validation_timed_out\"), value: \"timeout\", color: \"red\" },\n    ],\n  });\n  return {\n    crudOptions: {\n      settings: {\n        plugins: {\n          //这里使用行选择插件，生成行选择crudOptions配置，最终会与crudOptions合并\n          rowSelection: {\n            enabled: true,\n            order: -2,\n            before: true,\n            // handle: (pluginProps,useCrudProps)=>CrudOptions,\n            props: {\n              multiple: true,\n              crossPage: true,\n              selectedRowKeys,\n            },\n          },\n        },\n      },\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      tabs: {\n        name: \"status\",\n        show: true,\n      },\n      rowHandle: {\n        minWidth: 200,\n        fixed: \"right\",\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          column: {\n            width: 80,\n          },\n          form: {\n            show: false,\n          },\n        },\n        domain: {\n          title: t(\"certd.proxied_domain\"),\n          type: \"text\",\n          search: {\n            show: true,\n          },\n          editForm: {\n            component: {\n              disabled: true,\n            },\n          },\n        },\n        hostRecord: {\n          title: t(\"certd.host_record\"),\n          type: \"text\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 250,\n            cellRender: ({ value }) => {\n              return <fs-copyable v-model={value} />;\n            },\n          },\n        },\n        recordValue: {\n          title: t(\"certd.please_set_cname\"),\n          type: \"copyable\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 500,\n          },\n        },\n        cnameProviderId: {\n          title: t(\"certd.cname_service\"),\n          type: \"dict-select\",\n          dict: dict({\n            url: \"/cname/provider/list\",\n            value: \"id\",\n            label: \"domain\",\n          }),\n          form: {\n            component: {\n              onDictChange: ({ form, dict }: any) => {\n                if (!form.cnameProviderId) {\n                  const list = dict.data.filter((item: any) => {\n                    return !item.disabled;\n                  });\n                  let item = list.find((item: any) => item.isDefault);\n                  if (!item && list.length > 0) {\n                    item = list[0];\n                  }\n                  if (item) {\n                    form.cnameProviderId = item.id;\n                  }\n                }\n              },\n              renderLabel(item: any) {\n                if (item.title) {\n                  return `${item.domain}<${item.title}>`;\n                } else {\n                  return item.domain;\n                }\n              },\n            },\n            helper: {\n              render() {\n                const closeForm = () => {\n                  crudExpose.getFormWrapperRef().close();\n                };\n                return (\n                  <div>\n                    {t(\"certd.default_public_cname\")}\n                    <router-link to={\"/sys/cname/provider\"} onClick={closeForm}>\n                      {t(\"certd.customize_cname\")}\n                    </router-link>\n                  </div>\n                );\n              },\n            },\n          },\n          column: {\n            width: 120,\n            align: \"center\",\n            cellRender({ value }) {\n              if (value < 0) {\n                return <a-tag color={\"green\"}>{t(\"certd.public_cname\")}</a-tag>;\n              } else {\n                return <a-tag color={\"blue\"}>{t(\"certd.custom_cname\")}</a-tag>;\n              }\n            },\n          },\n        },\n        status: {\n          title: t(\"certd.fields.status\"),\n          type: \"dict-select\",\n          dict: dictRef,\n          addForm: {\n            show: false,\n          },\n          column: {\n            width: 120,\n            align: \"center\",\n            cellRender({ value, row }) {\n              return (\n                <div class={\"flex flex-center\"}>\n                  <fs-values-format modelValue={value} dict={dictRef}></fs-values-format>\n                  {row.error && (\n                    <a-tooltip title={row.error}>\n                      <fs-icon class={\"ml-5 color-red\"} icon=\"ion:warning-outline\"></fs-icon>\n                    </a-tooltip>\n                  )}\n                </div>\n              );\n            },\n          },\n        },\n        triggerValidate: {\n          title: t(\"certd.validate\"),\n          type: \"text\",\n          form: {\n            show: false,\n          },\n          column: {\n            conditionalRenderDisabled: true,\n            width: 130,\n            align: \"center\",\n            cellRender({ row, value }) {\n              if (row.status === \"valid\") {\n                return \"-\";\n              }\n\n              async function doVerify() {\n                row._validating_ = true;\n                try {\n                  const res = await api.DoVerify(row.id);\n                  if (res === true) {\n                    message.success(t(\"certd.validation_successful\"));\n                    row.status = \"valid\";\n                  } else if (res === false) {\n                    message.success(t(\"certd.validation_timed_out\"));\n                    row.status = \"timeout\";\n                  } else {\n                    message.success(t(\"certd.validation_started\"));\n                  }\n                  await crudExpose.doRefresh();\n                } catch (e: any) {\n                  console.error(e);\n                  message.error(e.message);\n                } finally {\n                  row._validating_ = false;\n                }\n              }\n\n              return (\n                <div>\n                  <a-button onClick={doVerify} loading={row._validating_} size={\"small\"} type={\"primary\"}>\n                    {t(\"certd.click_to_validate\")}\n                  </a-button>\n                  <CnameTip record={row} />\n                </div>\n              );\n            },\n          },\n        },\n        createTime: {\n          title: t(\"certd.create_time\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 160,\n            align: \"center\",\n          },\n        },\n        updateTime: {\n          title: t(\"certd.update_time\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            show: true,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/cname/record/index.vue",
    "content": "<template>\n  <fs-page class=\"page-cert\">\n    <template #header>\n      <div class=\"title\">\n        {{ t(\"certd.cnameRecord\") }}\n        <span class=\"sub\">\n          <a href=\"https://certd.docmirror.cn/guide/feature/cname/\" target=\"_blank\">\n            {{ t(\"certd.cname_feature_guide\") }}\n          </a>\n        </span>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\">\n      <template #pagination-left>\n        <a-tooltip :title=\"t('certd.batch_delete')\">\n          <fs-button icon=\"DeleteOutlined\" @click=\"handleBatchDelete\"></fs-button>\n        </a-tooltip>\n      </template>\n    </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { message, Modal } from \"ant-design-vue\";\nimport { DeleteBatch } from \"./api\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\ndefineOptions({\n  name: \"CnameRecord\",\n});\nconst { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions });\n\nconst selectedRowKeys = context.selectedRowKeys;\nconst handleBatchDelete = () => {\n  if (selectedRowKeys.value?.length > 0) {\n    Modal.confirm({\n      title: t(\"certd.confirm\"),\n      content: t(\"certd.confirm_delete_count\", { count: selectedRowKeys.value.length }),\n      async onOk() {\n        await DeleteBatch(selectedRowKeys.value);\n        message.info(t(\"certd.delete_successful\"));\n        crudExpose.doRefresh();\n        selectedRowKeys.value = [];\n      },\n    });\n  } else {\n    message.error(t(\"certd.please_select_records\"));\n  }\n};\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(async () => {\n  await crudExpose.doRefresh();\n});\n</script>\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/history/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/pi/history\";\n\nexport async function GetList(query: any) {\n  return await request({\n    url: apiPrefix + \"/page\",\n    method: \"post\",\n    data: query,\n  });\n}\n\nexport async function AddObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/add\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function UpdateObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/update\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function DelObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/delete\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/info\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetDetail(id: any) {\n  return await request({\n    url: apiPrefix + \"/detail\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function DeleteBatch(ids: any[]) {\n  return await request({\n    url: apiPrefix + \"/deleteByIds\",\n    method: \"post\",\n    data: { ids },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/history/crud.tsx",
    "content": "import * as api from \"./api\";\nimport { useI18n } from \"/src/locales\";\nimport { computed, Ref, ref } from \"vue\";\nimport { useRouter } from \"vue-router\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes, utils } from \"@fast-crud/fast-crud\";\nimport { useUserStore } from \"/@/store/user\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { statusUtil } from \"/@/views/certd/pipeline/pipeline/utils/util.status\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const router = useRouter();\n  const { t } = useI18n();\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  const userStore = useUserStore();\n  const settingStore = useSettingStore();\n  const selectedRowKeys: Ref<any[]> = ref([]);\n  context.selectedRowKeys = selectedRowKeys;\n\n  return {\n    crudOptions: {\n      settings: {\n        plugins: {\n          //这里使用行选择插件，生成行选择crudOptions配置，最终会与crudOptions合并\n          rowSelection: {\n            enabled: true,\n            order: -2,\n            before: true,\n            // handle: (pluginProps,useCrudProps)=>CrudOptions,\n            props: {\n              multiple: true,\n              crossPage: true,\n              selectedRowKeys,\n            },\n          },\n        },\n      },\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      actionbar: {\n        buttons: {\n          add: {\n            show: false,\n          },\n        },\n      },\n      search: {\n        formItem: {\n          labelCol: {\n            style: {\n              // width: \"100px\"\n            },\n          },\n          wrapperCol: {\n            style: {\n              width: \"50%\",\n            },\n          },\n        },\n      },\n      rowHandle: {\n        minWidth: 200,\n        fixed: \"right\",\n        buttons: {\n          edit: {\n            show: false,\n          },\n        },\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          column: {\n            width: 100,\n          },\n          form: {\n            show: false,\n          },\n        },\n        userId: {\n          title: t(\"certd.fields.userId\"),\n          type: \"number\",\n          search: {\n            show: computed(() => {\n              return userStore.isAdmin && settingStore.sysPublic.managerOtherUserPipeline;\n            }),\n          },\n          form: {\n            show: false,\n          },\n          column: {\n            show: computed(() => {\n              return userStore.isAdmin && settingStore.sysPublic.managerOtherUserPipeline;\n            }),\n            width: 100,\n          },\n        },\n        pipelineId: {\n          title: t(\"certd.fields.pipelineId\"),\n          type: \"number\",\n          search: {\n            show: true,\n          },\n          form: {\n            show: false,\n          },\n          column: {\n            width: 100,\n          },\n        },\n        pipelineTitle: {\n          title: t(\"certd.fields.pipelineName\"),\n          type: \"text\",\n          search: {\n            show: true,\n          },\n          column: {\n            width: 300,\n            tooltip: true,\n            ellipsis: true,\n            cellRender: ({ row, value }) => {\n              return <router-link to={{ path: \"/certd/pipeline/detail\", query: { id: row.pipelineId, editMode: false, historyId: row.id } }}>{value}</router-link>;\n            },\n          },\n        },\n        triggerType: {\n          title: t(\"certd.fields.triggerType\"),\n          type: \"dict-select\",\n          search: {\n            show: true,\n          },\n          dict: dict({\n            data: [\n              { value: \"user\", label: t(\"certd.triggerTypes.manual\") },\n              { value: \"timer\", label: t(\"certd.triggerTypes.timer\") },\n            ],\n          }),\n          form: {\n            show: false,\n            value: \"custom\",\n          },\n          column: {\n            sorter: true,\n            width: 90,\n            align: \"center\",\n            show: true,\n            component: {\n              color: \"auto\",\n            },\n          },\n        },\n        status: {\n          title: t(\"certd.fields.status\"),\n          type: \"dict-select\",\n          search: {\n            show: true,\n          },\n          dict: dict({\n            data: statusUtil.getOptions(),\n          }),\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 120,\n            align: \"center\",\n          },\n        },\n        createTime: {\n          title: t(\"certd.fields.createTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 160,\n            align: \"center\",\n          },\n        },\n        updateTime: {\n          title: t(\"certd.fields.updateTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            show: true,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/history/index.vue",
    "content": "<template>\n  <fs-page class=\"page-cert\">\n    <template #header>\n      <div class=\"title\">{{ t(\"certd.pipelineExecutionRecords\") }}</div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\">\n      <template #pagination-left>\n        <a-tooltip :title=\"t('certd.batchDelete')\">\n          <fs-button icon=\"DeleteOutlined\" @click=\"handleBatchDelete\"></fs-button>\n        </a-tooltip>\n      </template>\n    </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { message, Modal } from \"ant-design-vue\";\nimport { DeleteBatch } from \"./api\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\ndefineOptions({\n  name: \"PipelineHistory\",\n});\nconst { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions });\n\nconst selectedRowKeys = context.selectedRowKeys;\nconst handleBatchDelete = () => {\n  if (selectedRowKeys.value?.length > 0) {\n    Modal.confirm({\n      title: t(\"certd.confirm\"),\n      content: t(\"certd.confirmBatchDeleteContent\", { count: selectedRowKeys.value.length }),\n      async onOk() {\n        await DeleteBatch(selectedRowKeys.value);\n        message.info(t(\"certd.deleteSuccess\"));\n        crudExpose.doRefresh();\n        selectedRowKeys.value = [];\n      },\n    });\n  } else {\n    message.error(t(\"certd.pleaseSelectRecords\"));\n  }\n};\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(() => {\n  crudExpose.doRefresh();\n});\n</script>\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/mine/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nexport async function getMineInfo() {\n  return await request({\n    url: \"/mine/info\",\n    method: \"POST\",\n  });\n}\n\nexport async function changePassword(form: any) {\n  return await request({\n    url: \"/mine/changePassword\",\n    method: \"POST\",\n    data: form,\n  });\n}\n\nexport async function UpdateProfile(form: any) {\n  return await request({\n    url: \"/mine/updateProfile\",\n    method: \"POST\",\n    data: form,\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/mine/change-password-button.vue",
    "content": "<template>\n  <a-button v-if=\"showButton\" type=\"primary\" @click=\"open\">\n    {{ $t(\"authentication.changePasswordButton\") }}\n  </a-button>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from \"vue\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\nimport { CrudOptions, useColumns, useFormWrapper } from \"@fast-crud/fast-crud\";\nimport * as api from \"/@/views/certd/mine/api\";\nimport { notification } from \"ant-design-vue\";\nimport { useUserStore } from \"/@/store/user\";\n\ndefineProps<{\n  showButton: boolean;\n}>();\n\nlet passwordFormRef = ref();\n\nconst validatePass1 = async (rule: any, value: any) => {\n  if (value === \"\") {\n    throw new Error(t(\"authentication.enterPassword\"));\n  }\n  const formData = passwordFormRef.value.getFormData();\n  if (formData.confirmNewPassword !== \"\") {\n    passwordFormRef.value.formRef.formRef.validateFields([\"confirmNewPassword\"]);\n  }\n  if (formData.password === formData.newPassword) {\n    throw new Error(t(\"authentication.newPasswordNotSameOld\"));\n  }\n};\nconst validatePass2 = async (rule: any, value: any) => {\n  if (value === \"\") {\n    throw new Error(t(\"authentication.enterPasswordAgain\"));\n  } else if (value !== passwordFormRef.value.getFormData().newPassword) {\n    throw new Error(t(\"authentication.passwordsNotMatch\"));\n  }\n};\n\nconst userStore = useUserStore();\nconst { openDialog } = useFormWrapper();\nconst { buildFormOptions } = useColumns();\nconst passwordFormOptions: CrudOptions = {\n  form: {\n    col: {\n      span: 24,\n    },\n    wrapper: {\n      title: t(\"authentication.title\"),\n      width: \"500px\",\n    },\n    async doSubmit({ form }) {\n      await api.changePassword(form);\n      //重新加载用户信息\n      await userStore.loadUserInfo();\n    },\n    async afterSubmit() {\n      notification.success({ message: t(\"authentication.successMessage\") });\n    },\n  },\n  columns: {\n    password: {\n      title: t(\"authentication.oldPassword\"),\n      type: \"password\",\n      form: {\n        rules: [{ required: true, message: t(\"authentication.oldPasswordRequired\") }],\n      },\n    },\n    newPassword: {\n      title: t(\"authentication.newPassword\"),\n      type: \"password\",\n      form: {\n        rules: [\n          { required: true, message: t(\"authentication.newPasswordRequired\") },\n          //@ts-ignore\n          { validator: validatePass1, trigger: \"blur\" },\n        ],\n      },\n    },\n    confirmNewPassword: {\n      title: t(\"authentication.confirmNewPassword\"),\n      type: \"password\",\n      form: {\n        rules: [\n          {\n            required: true,\n            message: t(\"authentication.confirmNewPasswordRequired\"),\n          },\n          //@ts-ignore\n          { validator: validatePass2, trigger: \"blur\" },\n        ],\n      },\n    },\n  },\n};\n\nasync function open(opts: { password: \"\" }) {\n  const formOptions = buildFormOptions(passwordFormOptions);\n  formOptions.newInstance = true; //新实例打开\n  passwordFormRef.value = await openDialog(formOptions);\n  passwordFormRef.value.setFormData({\n    password: opts.password,\n  });\n  console.log(passwordFormRef.value);\n}\n\nconst scope = ref({\n  open: open,\n});\n\ndefineExpose(scope.value);\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/mine/security/api.ts",
    "content": "// @ts-ignore\nimport { request } from \"/@/api/service\";\nconst apiPrefix = \"/user/settings\";\nexport type UserTwoFactorSetting = {\n  authenticator: {\n    enabled: boolean;\n    verified: boolean;\n  };\n};\n\nexport type AuthenticatorSaveReq = {\n  verifyCode?: string;\n};\n\nexport async function TwoFactorSettingsGet() {\n  const res = await request({\n    url: apiPrefix + \"/twoFactor/get\",\n    method: \"post\",\n  });\n  if (!res) {\n    return {};\n  }\n  return res as UserTwoFactorSetting;\n}\n\nexport async function TwoFactorAuthenticatorGet() {\n  const res = await request({\n    url: apiPrefix + \"/twoFactor/authenticator/qrcode\",\n    method: \"post\",\n  });\n  return res as string; //base64\n}\n\nexport async function TwoFactorAuthenticatorSave(req: AuthenticatorSaveReq) {\n  return await request({\n    url: apiPrefix + \"/twoFactor/authenticator/save\",\n    method: \"post\",\n    data: req,\n  });\n}\n\nexport async function TwoFactorAuthenticatorOff() {\n  return await request({\n    url: apiPrefix + \"/twoFactor/authenticator/off\",\n    method: \"post\",\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/mine/security/index.vue",
    "content": "<template>\n  <fs-page class=\"page-user-settings page-two-factor\">\n    <template #header>\n      <div class=\"title\">{{ t(\"certd.securitySettings\") }}</div>\n    </template>\n\n    <div class=\"user-settings-form settings-form\">\n      <a-form :model=\"formState\" name=\"basic\" :label-col=\"{ span: 8 }\" :wrapper-col=\"{ span: 16 }\" autocomplete=\"off\">\n        <a-form-item :label=\"t('certd.twoFactorAuth')\" :name=\"['authenticator', 'enabled']\">\n          <div class=\"flex mt-5\">\n            <a-switch v-model:checked=\"formState.authenticator.enabled\" :disabled=\"!settingsStore.isPlus\" @change=\"onAuthenticatorEnabledChanged\" />\n\n            <a-button\n              v-if=\"formState.authenticator.enabled && formState.authenticator.verified\"\n              :disabled=\"authenticatorOpenRef || !settingsStore.isPlus\"\n              size=\"small\"\n              class=\"ml-5\"\n              type=\"primary\"\n              @click=\"authenticatorForm.open = true\"\n            >\n              {{ t(\"certd.rebind\") }}\n            </a-button>\n\n            <vip-button class=\"ml-5\" mode=\"button\"></vip-button>\n          </div>\n\n          <div class=\"helper\">{{ t(\"certd.twoFactorAuthHelper\") }}</div>\n        </a-form-item>\n\n        <a-form-item v-if=\"authenticatorOpenRef\" :label=\"t('certd.bindDevice')\" class=\"authenticator-config\">\n          <h3 class=\"font-bold m-5\">{{ t(\"certd.step1\") }}</h3>\n          <div class=\"ml-20\">\n            <ul>\n              <li>\n                <a-tooltip :title=\"t('certd.tooltipGoogleServiceError')\">\n                  <a href=\"https://appgallery.huawei.com/app/C100262999\" target=\"_blank\">Microsoft Authenticator</a>\n                </a-tooltip>\n              </li>\n              <li>\n                <a href=\"https://sj.qq.com/appdetail/com.tencent.authenticator\" target=\"_blank\">腾讯身份验证器</a>\n              </li>\n              <li>\n                <a href=\"https://www.synology.cn/zh-cn/dsm/feature/authentication\" target=\"_blank\">群晖身份验证器</a>\n              </li>\n              <li>\n                <a-tooltip :title=\"t('certd.tooltipGoogleServiceError')\">\n                  <a href=\"https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\" target=\"_blank\">Google Authenticator</a>\n                </a-tooltip>\n              </li>\n              <li>\n                <a href=\"https://play.google.com/store/apps/details?id=com.authy.authy\" target=\"_blank\">Authy</a>\n              </li>\n            </ul>\n          </div>\n          <h3 class=\"font-bold m-10\">{{ t(\"certd.step2\") }}</h3>\n          <div v-if=\"authenticatorForm.qrcodeSrc\" class=\"qrcode\">\n            <div class=\"ml-20\">\n              <img class=\"full-w\" :src=\"authenticatorForm.qrcodeSrc\" />\n            </div>\n          </div>\n          <h3 class=\"font-bold m-10\">{{ t(\"certd.step3\") }}</h3>\n          <div class=\"ml-20\">\n            <a-input v-model:value=\"authenticatorForm.verifyCode\" :placeholder=\"t('certd.inputVerifyCode')\" />\n          </div>\n          <div class=\"ml-20 flex mt-10\">\n            <loading-button type=\"primary\" html-type=\"button\" :click=\"doAuthenticatorSave\">{{ t(\"certd.confirm\") }}</loading-button>\n            <a-button class=\"ml-1\" @click=\"authenticatorForm.open = false\">{{ t(\"certd.cancel\") }}</a-button>\n          </div>\n        </a-form-item>\n      </a-form>\n    </div>\n  </fs-page>\n</template>\n\n<script setup lang=\"tsx\">\nimport { computed, reactive, watch } from \"vue\";\nimport * as api from \"./api\";\nimport { UserTwoFactorSetting } from \"./api\";\nimport { Modal, notification } from \"ant-design-vue\";\nimport { merge } from \"lodash-es\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\nconst settingsStore = useSettingStore();\ndefineOptions({\n  name: \"UserSecurity\",\n});\n\nconst formState = reactive<Partial<UserTwoFactorSetting>>({\n  authenticator: {\n    enabled: false,\n    verified: false,\n  },\n});\n\nconst authenticatorForm = reactive({\n  qrcodeSrc: \"\",\n  verifyCode: \"\",\n  open: false,\n});\n\nconst authenticatorOpenRef = computed(() => {\n  return formState.authenticator.enabled && (authenticatorForm.open || !formState.authenticator.verified);\n});\nwatch(\n  () => {\n    return authenticatorOpenRef.value;\n  },\n  async open => {\n    if (open) {\n      //base64 转图片\n      authenticatorForm.qrcodeSrc = await api.TwoFactorAuthenticatorGet();\n    } else {\n      authenticatorForm.qrcodeSrc = \"\";\n      authenticatorForm.verifyCode = \"\";\n    }\n  }\n);\n\nasync function loadUserSettings() {\n  const data: any = await api.TwoFactorSettingsGet();\n  merge(formState, data);\n}\n\nloadUserSettings();\nconst doAuthenticatorSave = async (form: any) => {\n  await api.TwoFactorAuthenticatorSave({\n    verifyCode: authenticatorForm.verifyCode,\n  });\n  notification.success({\n    message: t(\"certd.saveSuccess\"),\n  });\n  authenticatorForm.open = false;\n  formState.authenticator.verified = true;\n};\n\nfunction onAuthenticatorEnabledChanged(value: any) {\n  if (!value) {\n    //要关闭\n    if (formState.authenticator.verified) {\n      Modal.confirm({\n        title: t(\"certd.confirm\"),\n        content: t(\"certd.confirmDisable2FA\"),\n        async onOk() {\n          await api.TwoFactorAuthenticatorOff();\n          notification.success({\n            message: t(\"certd.disabledSuccess\"),\n          });\n          loadUserSettings();\n        },\n        onCancel() {\n          formState.authenticator.enabled = true;\n        },\n      });\n    }\n  }\n}\n</script>\n\n<style lang=\"less\">\n.page-user-settings {\n  .user-settings-form {\n    width: 600px;\n    margin: 20px;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/mine/use.tsx",
    "content": "// useUserProfile, 获取 openEditProfileDialog ,参考 useTemplate方法\nimport { useFormWrapper } from \"@fast-crud/fast-crud\";\nimport { ref } from \"vue\";\nimport { cloneDeep, merge } from \"lodash-es\";\n\n// 假设的 API 导入\nimport * as userProfileApi from \"./api\";\nimport { useUserStore } from \"/@/store/user\";\nimport { useI18n } from \"/src/locales\";\n\n/**\n * 获取用户资料编辑相关功能\n * @returns {{openEditProfileDialog: openEditProfileDialog}}\n */\nexport function useUserProfile() {\n  const { openCrudFormDialog } = useFormWrapper();\n  const wrapperRef = ref();\n  async function openEditProfileDialog(req: { onUpdated?: (ctx: any) => void }) {\n    const detail = await userProfileApi.getMineInfo();\n    if (!detail) {\n      throw new Error(\"用户资料不存在\");\n    }\n\n    const { t } = useI18n();\n\n    const userStore = useUserStore();\n    const userProfileFormRef = ref();\n    async function doSubmit(opts: { form: any }) {\n      const form = opts.form;\n      const { id } = await userProfileApi.UpdateProfile(form);\n      if (req.onUpdated) {\n        req.onUpdated({ id });\n      }\n    }\n\n    const crudOptions: any = {\n      form: {\n        doSubmit,\n        wrapper: {\n          title: `编辑用户资料`,\n          width: 1100,\n          onOpened(opts: { form: any }) {\n            merge(opts.form, detail);\n          },\n        },\n      },\n      columns: {\n        nickName: {\n          title: t(\"certd.nickName\"),\n          type: \"text\",\n          form: {\n            component: {\n              placeholder: t(\"certd.nickName\"),\n            },\n            rules: [{ required: true, message: t(\"certd.nickName\") }],\n          },\n        },\n        avatar: {\n          title: t(\"certd.avatar\"),\n          type: \"cropper-uploader\",\n          column: {\n            width: 70,\n            component: {\n              style: {\n                height: \"30px\",\n                width: \"auto\",\n              },\n              buildUrl(key: string) {\n                return `api/basic/file/download?&key=` + key;\n              },\n            },\n          },\n          form: {\n            component: {\n              vModel: \"modelValue\",\n              valueType: \"key\",\n              cropper: {\n                aspectRatio: 1,\n                autoCropArea: 1,\n                viewMode: 0,\n              },\n              onReady: null,\n              uploader: {\n                type: \"form\",\n                action: \"/basic/file/upload\",\n                name: \"file\",\n                headers: {\n                  Authorization: \"Bearer \" + userStore.getToken,\n                },\n                successHandle(res: any) {\n                  return res;\n                },\n              },\n              buildUrl(key: string) {\n                return `api/basic/file/download?&key=` + key;\n              },\n            },\n          },\n        },\n      },\n    };\n\n    const wrapper = await openCrudFormDialog({ crudOptions });\n    wrapperRef.value = wrapper;\n  }\n\n  return {\n    openEditProfileDialog,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/mine/user-profile.vue",
    "content": "<template>\n  <fs-page class=\"page-user-profile\">\n    <template #header>\n      <div class=\"title\">{{ t(\"certd.myInfo\") }}</div>\n    </template>\n    <div class=\"p-10\">\n      <a-descriptions title=\"\" bordered :column=\"2\">\n        <a-descriptions-item :label=\"t('authentication.username')\">{{ userInfo.username }}</a-descriptions-item>\n        <a-descriptions-item :label=\"t('authentication.nickName')\">{{ userInfo.nickName }}</a-descriptions-item>\n        <a-descriptions-item :label=\"t('authentication.avatar')\">\n          <a-avatar v-if=\"userInfo.avatar\" size=\"large\" :src=\"'api/basic/file/download?&key=' + userInfo.avatar\" style=\"background-color: #eee\"> </a-avatar>\n          <a-avatar v-else size=\"large\" style=\"background-color: #00b4f5\">\n            {{ userInfo.username }}\n          </a-avatar>\n        </a-descriptions-item>\n        <a-descriptions-item :label=\"t('authentication.email')\">{{ userInfo.email }}</a-descriptions-item>\n        <a-descriptions-item :label=\"t('authentication.phoneNumber')\">{{ userInfo.phoneCode }}{{ userInfo.mobile }}</a-descriptions-item>\n        <a-descriptions-item></a-descriptions-item>\n        <a-descriptions-item :label=\"t('common.handle')\">\n          <a-button type=\"primary\" @click=\"doUpdate\">{{ t(\"authentication.updateProfile\") }}</a-button>\n          <change-password-button class=\"ml-10\" :show-button=\"true\"> </change-password-button>\n        </a-descriptions-item>\n      </a-descriptions>\n    </div>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport * as api from \"./api\";\nimport { Ref, ref } from \"vue\";\nimport ChangePasswordButton from \"/@/views/certd/mine/change-password-button.vue\";\nimport { useI18n } from \"/src/locales\";\nimport { useUserProfile } from \"./use\";\n\nconst { t } = useI18n();\n\ndefineOptions({\n  name: \"UserProfile\",\n});\n\nconst userInfo: Ref = ref({});\n\nconst getUserInfo = async () => {\n  userInfo.value = await api.getMineInfo();\n};\ngetUserInfo();\n\nconst { openEditProfileDialog } = useUserProfile();\n\nfunction doUpdate() {\n  openEditProfileDialog({\n    onUpdated: async () => {\n      await getUserInfo();\n    },\n  });\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/monitor/cert/api.ts",
    "content": "import { request } from \"/src/api/service\";\nimport { CertInfo } from \"/@/views/certd/pipeline/api\";\n\nconst apiPrefix = \"/monitor/cert\";\nexport const certInfoApi = {\n  async GetList(query: any) {\n    return await request({\n      url: apiPrefix + \"/page\",\n      method: \"post\",\n      data: query,\n    });\n  },\n\n  async AddObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/add\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async UpdateObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/update\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async DelObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/delete\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n\n  async GetObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/info\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n  async ListAll() {\n    return await request({\n      url: apiPrefix + \"/all\",\n      method: \"post\",\n    });\n  },\n  async Upload(body: { id?: number; cert: { crt: string; key: string } }) {\n    return await request({\n      url: apiPrefix + \"/upload\",\n      method: \"post\",\n      data: body,\n    });\n  },\n  async GetCert(id: number): Promise<CertInfo> {\n    return await request({\n      url: apiPrefix + \"/getCert\",\n      method: \"post\",\n      params: { id: id },\n    });\n  },\n\n  async GetOptionsByIds(ids: number[]): Promise<any[]> {\n    return await request({\n      url: apiPrefix + \"/getOptionsByIds\",\n      method: \"post\",\n      data: { ids },\n    });\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/monitor/cert/crud.tsx",
    "content": "// @ts-ignore\nimport { useI18n } from \"/src/locales\";\n//\nimport { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, useFormWrapper, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { certInfoApi } from \"./api\";\nimport dayjs from \"dayjs\";\nimport { useRouter } from \"vue-router\";\nimport { useModal } from \"/@/use/use-modal\";\nimport { notification } from \"ant-design-vue\";\nimport CertView from \"/@/views/certd/pipeline/cert-view.vue\";\nimport { useCertUpload } from \"/@/views/certd/pipeline/cert-upload/use\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { t } = useI18n();\n  const api = certInfoApi;\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async (req: EditReq) => {\n    const { form, row } = req;\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async (req: DelReq) => {\n    const { row } = req;\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async (req: AddReq) => {\n    const { form } = req;\n    const res = await api.AddObj(form);\n    return res;\n  };\n  const { openCrudFormDialog } = useFormWrapper();\n  const router = useRouter();\n\n  const model = useModal();\n  const viewCert = async (row: any) => {\n    const cert = await api.GetCert(row.id);\n    if (!cert) {\n      notification.error({ message: t(\"certd.certificateNotGenerated\") });\n      return;\n    }\n\n    model.success({\n      title: t(\"certd.modal.viewCertificateTitle\"),\n      maskClosable: true,\n      okText: t(\"certd.modal.close\"),\n      width: 800,\n      content: () => {\n        return <CertView cert={cert}></CertView>;\n      },\n    });\n  };\n\n  const { openUploadCreateDialog, openUpdateCertDialog } = useCertUpload();\n  return {\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      form: {\n        labelCol: {\n          //固定label宽度\n          span: null,\n          style: {\n            width: \"100px\",\n          },\n        },\n        col: {\n          span: 22,\n        },\n        wrapper: {\n          width: 600,\n        },\n      },\n      actionbar: {\n        show: true,\n        buttons: {\n          add: {\n            text: t(\"certd.uploadCustomCert\"),\n            type: \"primary\",\n            show: false,\n            async click() {\n              await openUploadCreateDialog({});\n            },\n          },\n        },\n      },\n      tabs: {\n        name: \"fromType\",\n        show: true,\n      },\n      rowHandle: {\n        width: 100,\n        fixed: \"right\",\n        buttons: {\n          view: { show: false },\n          viewCert: {\n            order: 3,\n            title: t(\"certd.viewCert.title\"),\n            type: \"link\",\n            icon: \"ph:certificate\",\n            async click({ row }) {\n              await viewCert(row);\n            },\n          },\n          copy: { show: false },\n          edit: { show: false },\n          remove: {\n            order: 10,\n            show: false,\n          },\n          download: {\n            order: 9,\n            title: t(\"certd.download.title\"),\n            type: \"link\",\n            icon: \"ant-design:download-outlined\",\n            async click({ row }) {\n              if (!row.certFile) {\n                notification.error({ message: t(\"certd.certificateNotGenerated\") });\n                return;\n              }\n              window.open(\"/api/monitor/cert/download?id=\" + row.id);\n            },\n          },\n        },\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          search: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            editable: {\n              disabled: true,\n            },\n          },\n          form: {\n            show: false,\n          },\n        },\n        fromType: {\n          title: t(\"certd.sourcee\"),\n          search: {\n            show: true,\n          },\n          type: \"dict-select\",\n          dict: dict({\n            data: [\n              { label: t(\"certd.sourcePipeline\"), value: \"pipeline\" },\n              { label: t(\"certd.sourceManualUpload\"), value: \"upload\" },\n            ],\n          }),\n          form: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            sorter: true,\n            component: {\n              color: \"auto\",\n            },\n            conditionalRender: false,\n          },\n          valueBuilder({ value, row, key }) {\n            if (!value) {\n              row[key] = \"pipeline\";\n            }\n          },\n        },\n        domains: {\n          title: t(\"certd.domains\"),\n          search: {\n            show: true,\n          },\n          type: \"text\",\n          form: {\n            rules: [{ required: true, message: t(\"certd.enterDomain\") }],\n          },\n          column: {\n            width: 450,\n            sorter: true,\n            component: {\n              name: \"fs-values-format\",\n              color: \"auto\",\n            },\n          },\n        },\n        domainCount: {\n          title: t(\"certd.domainCount\"),\n          type: \"number\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 120,\n            sorter: true,\n            show: false,\n          },\n        },\n        expiresLeft: {\n          title: t(\"certd.validDays\"),\n          search: {\n            show: false,\n          },\n          type: \"date\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            conditionalRender: false,\n            cellRender({ row }) {\n              const value = row.expiresTime;\n              if (!value) {\n                return \"-\";\n              }\n              const expireDate = dayjs(value).format(\"YYYY-MM-DD\");\n              const leftDays = dayjs(value).diff(dayjs(), \"day\");\n              const color = leftDays < 20 ? \"red\" : \"#389e0d\";\n              const percent = (leftDays / 90) * 100;\n              const textColor = leftDays < 20 ? \"red\" : leftDays > 60 ? \"#389e0d\" : \"\";\n              const format = () => {\n                return <span style={{ color: textColor }}>{`${leftDays}${t(\"certd.days\")}`}</span>;\n              };\n              return <a-progress title={expireDate + t(\"certd.expires\")} percent={percent} strokeColor={color} format={format} />;\n            },\n          },\n        },\n        expiresTime: {\n          title: t(\"certd.expireTime\"),\n          search: {\n            show: false,\n          },\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n          },\n        },\n        certProvider: {\n          title: t(\"certd.certIssuer\"),\n          search: {\n            show: false,\n          },\n          type: \"text\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 200,\n          },\n        },\n        applyTime: {\n          title: t(\"certd.applyTime\"),\n          search: {\n            show: false,\n          },\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n          },\n        },\n        \"pipeline.title\": {\n          title: t(\"certd.relatedPipeline\"),\n          search: { show: false },\n          type: \"link\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 350,\n            sorter: true,\n            component: {\n              on: {\n                onClick({ row }) {\n                  router.push({ path: \"/certd/pipeline/detail\", query: { id: row.pipelineId, editMode: \"false\" } });\n                },\n              },\n            },\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/monitor/cert/index.vue",
    "content": "<template>\n  <fs-page>\n    <template #header>\n      <div class=\"title\">\n        {{ t(\"certd.certificateRepo.title\") }}\n        <span class=\"sub\">{{ t(\"certd.certificateRepo.sub\") }}</span>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\ndefineOptions({\n  name: \"CertStore\",\n});\nconst { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: {} });\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(() => {\n  crudExpose.doRefresh();\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/monitor/site/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/monitor/site\";\n\nexport const siteInfoApi = {\n  async GetList(query: any) {\n    return await request({\n      url: apiPrefix + \"/page\",\n      method: \"post\",\n      data: query,\n    });\n  },\n\n  async AddObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/add\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async UpdateObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/update\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async DelObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/delete\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n\n  async GetObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/info\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n  async DoCheck(id: number) {\n    return await request({\n      url: apiPrefix + \"/check\",\n      method: \"post\",\n      data: { id },\n    });\n  },\n  async CheckAll() {\n    return await request({\n      url: apiPrefix + \"/checkAll\",\n      method: \"post\",\n    });\n  },\n\n  async Import(form: any) {\n    return await request({\n      url: apiPrefix + \"/import\",\n      method: \"post\",\n      data: form,\n    });\n  },\n\n  async DisabledChange(id: number, disabled: boolean) {\n    return await request({\n      url: apiPrefix + \"/disabledChange\",\n      method: \"post\",\n      data: {\n        id,\n        disabled,\n      },\n    });\n  },\n  async IpCheckChange(id: number, ipCheck: boolean) {\n    return await request({\n      url: apiPrefix + \"/ipCheckChange\",\n      method: \"post\",\n      data: {\n        id,\n        ipCheck,\n      },\n    });\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/monitor/site/crud.tsx",
    "content": "// @ts-ignore\nimport { useI18n } from \"/src/locales\";\nimport { AddReq, ColumnCompositionProps, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { siteInfoApi } from \"./api\";\nimport dayjs from \"dayjs\";\nimport { Modal, notification } from \"ant-design-vue\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { mySuiteApi } from \"/@/views/certd/suite/mine/api\";\nimport { mitter } from \"/@/utils/util.mitt\";\nimport { useSiteIpMonitor } from \"./ip/use\";\nimport { useSiteImport } from \"/@/views/certd/monitor/site/use\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { t } = useI18n();\n  const api = siteInfoApi;\n  const { crudBinding } = crudExpose;\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async (req: EditReq) => {\n    const { form, row } = req;\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async (req: DelReq) => {\n    const { row } = req;\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async (req: AddReq) => {\n    const { form } = req;\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  const settingsStore = useSettingStore();\n\n  const checkStatusDict = dict({\n    data: [\n      { label: t(\"certd.checkStatus.success\"), value: \"ok\", color: \"green\" },\n      { label: t(\"certd.checkStatus.checking\"), value: \"checking\", color: \"blue\" },\n      { label: t(\"certd.checkStatus.error\"), value: \"error\", color: \"red\" },\n    ],\n  });\n\n  const { openSiteIpMonitorDialog } = useSiteIpMonitor();\n  const { openSiteImportDialog } = useSiteImport();\n\n  function checkAll() {\n    Modal.confirm({\n      title: t(\"certd.monitor.confirmTitle\"), // \"确认\"\n      content: t(\"certd.monitor.confirmContent\"), // \"确认触发检查全部站点证书吗?\"\n      onOk: async () => {\n        await siteInfoApi.CheckAll();\n        notification.success({\n          message: t(\"certd.monitor.checkSubmitted\"), // \"检查任务已提交\"\n          description: t(\"certd.monitor.pleaseRefresh\"), // \"请稍后刷新页面查看结果\"\n        });\n      },\n    });\n  }\n  return {\n    id: \"siteMonitorCrud\",\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      form: {\n        labelCol: {\n          //固定label宽度\n          span: null,\n          style: {\n            width: \"100px\",\n          },\n        },\n        col: {\n          span: 22,\n        },\n        wrapper: {\n          width: 600,\n        },\n      },\n      actionbar: {\n        buttons: {\n          add: {\n            async click() {\n              if (!settingsStore.isPlus) {\n                // 非plus\n                if (crudBinding.value.data.length >= 1) {\n                  notification.error({\n                    message: t(\"certd.monitor.basicLimitError\"),\n                  });\n                  mitter.emit(\"openVipModal\");\n                  return;\n                }\n              }\n\n              //检查是否监控站点数量超出限制\n              if (settingsStore.isComm && settingsStore.suiteSetting.enabled) {\n                // 检查数量是否超限\n                const suiteDetail = await mySuiteApi.SuiteDetailGet();\n                const max = suiteDetail.monitorCount.max;\n                if (max != -1 && max <= suiteDetail.monitorCount.used) {\n                  notification.error({\n                    message: t(\"certd.monitor.limitExceeded\", { max }),\n                  });\n                  return;\n                }\n              }\n\n              await crudExpose.openAdd({});\n            },\n          },\n          //导入按钮\n          import: {\n            show: true,\n            text: t(\"certd.monitor.bulkImport\"),\n            type: \"primary\",\n            async click() {\n              openSiteImportDialog({\n                afterSubmit() {\n                  crudExpose.doRefresh();\n                },\n              });\n            },\n          },\n          checkAll: {\n            show: true,\n            text: t(\"certd.monitor.checkAll\"),\n            type: \"primary\",\n            click() {\n              checkAll();\n            },\n          },\n        },\n      },\n      rowHandle: {\n        fixed: \"right\",\n        width: 280,\n        buttons: {\n          check: {\n            order: 0,\n            type: \"link\",\n            text: null,\n            tooltip: {\n              title: \"立即检查\",\n            },\n            icon: \"ion:play-sharp\",\n            click: async ({ row }) => {\n              await api.DoCheck(row.id);\n              await crudExpose.doRefresh();\n              notification.success({\n                message: t(\"certd.monitor.checkSubmittedRefresh\"),\n              });\n            },\n          },\n          ipCheck: {\n            order: 10,\n            type: \"link\",\n            text: null,\n            show: compute(({ row }) => row.ipCheck === true),\n            tooltip: {\n              title: t(\"certd.monitor.ipManagement\"),\n            },\n            icon: \"entypo:address\",\n            click: async ({ row }) => {\n              openSiteIpMonitorDialog({ siteId: row.id });\n            },\n          },\n        },\n      },\n      tabs: {\n        name: \"disabled\",\n        show: true,\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          search: {\n            show: false,\n          },\n          column: {\n            width: 80,\n            align: \"center\",\n          },\n          form: {\n            show: false,\n          },\n        },\n        name: {\n          title: t(\"certd.monitor.siteName\"),\n          search: {\n            show: true,\n          },\n          type: \"text\",\n          form: {\n            rules: [{ required: true, message: t(\"certd.monitor.enterSiteName\") }],\n          },\n          column: {\n            width: 160,\n          },\n        },\n        domain: {\n          title: t(\"certd.monitor.domain\"),\n          search: {\n            show: true,\n          },\n          type: \"text\",\n          form: {\n            rules: [\n              { required: true, message: t(\"certd.monitor.enterDomain\") },\n              // @ts-ignore\n              { type: \"domains\", message: t(\"certd.monitor.enterValidDomain\") },\n            ],\n          },\n          column: {\n            width: 230,\n            sorter: true,\n            cellRender({ value, row }) {\n              const url = `https://${value}:${row.httpsPort}`;\n              return (\n                <a-tooltip title={value} placement=\"left\">\n                  <fs-copyable modelValue={value}>\n                    <a target=\"_blank\" href={url}>\n                      {value}:{row.httpsPort}\n                    </a>\n                  </fs-copyable>\n                </a-tooltip>\n              );\n            },\n          },\n        },\n        httpsPort: {\n          title: t(\"certd.monitor.httpsPort\"),\n          search: {\n            show: false,\n          },\n          type: \"number\",\n          form: {\n            value: 443,\n            rules: [{ required: true, message: t(\"certd.monitor.enterPort\") }],\n          },\n          column: {\n            width: 100,\n            show: false,\n          },\n        },\n        certInfo: {\n          title: t(\"certd.monitor.certInfo\"),\n          type: \"text\",\n          form: { show: false },\n          column: {\n            width: 200,\n            sorter: false,\n            show: true,\n            conditionalRender: false,\n            cellRender({ value, row }) {\n              const slots = {\n                content() {\n                  return (\n                    <div>\n                      <div>\n                        {t(\"certd.monitor.issuer\")}: {row.certProvider}\n                      </div>\n                      <div>\n                        {t(\"certd.monitor.certDomains\")}: {row.certDomains}\n                      </div>\n                    </div>\n                  );\n                },\n              };\n              return (\n                <a-popover placement={\"left\"} v-slots={slots} overlayStyle={{ maxWidth: \"30%\" }}>\n                  {row.certDomains}\n                </a-popover>\n              );\n            },\n          },\n        },\n        certDomains: {\n          title: t(\"certd.monitor.certDomains\"),\n          search: {\n            show: true,\n          },\n          type: \"text\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 200,\n            sorter: true,\n            show: false,\n            cellRender({ value }) {\n              return (\n                <a-tooltip title={value} placement=\"left\">\n                  {value}\n                </a-tooltip>\n              );\n            },\n          },\n        },\n        certProvider: {\n          title: t(\"certd.monitor.certProvider\"),\n          search: {\n            show: false,\n          },\n          type: \"text\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 200,\n            sorter: true,\n            show: false,\n            cellRender({ value }) {\n              return <a-tooltip title={value}>{value}</a-tooltip>;\n            },\n          },\n        },\n        certStatus: {\n          title: t(\"certd.monitor.certStatus\"),\n          search: {\n            show: true,\n          },\n          type: \"dict-select\",\n          dict: dict({\n            data: [\n              { label: t(\"certd.monitor.status.ok\"), value: \"ok\", color: \"green\" },\n              { label: t(\"certd.monitor.status.expired\"), value: \"expired\", color: \"red\" },\n            ],\n          }),\n          form: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            sorter: true,\n            show: true,\n            align: \"center\",\n          },\n        },\n        certExpiresTime: {\n          title: t(\"certd.monitor.certExpiresTime\"),\n          search: {\n            show: false,\n          },\n          type: \"date\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            cellRender({ value }) {\n              if (!value) {\n                return \"-\";\n              }\n              const expireDate = dayjs(value).format(\"YYYY-MM-DD\");\n              const leftDays = dayjs(value).diff(dayjs(), \"day\");\n              const color = leftDays < 20 ? \"red\" : \"#389e0d\";\n              const percent = (leftDays / 90) * 100;\n              return <a-progress title={expireDate + t(\"certd.monitor.expired\")} percent={percent} strokeColor={color} format={(percent: number) => `${leftDays}${t(\"certd.monitor.days\")}`} />;\n            },\n          },\n        },\n        lastCheckTime: {\n          title: t(\"certd.monitor.lastCheckTime\"),\n          search: {\n            show: false,\n          },\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 155,\n          },\n        },\n        disabled: {\n          title: t(\"certd.monitor.disabled\"),\n          search: {\n            show: false,\n          },\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { label: t(\"common.enabled\"), value: false, color: \"green\" },\n              { label: t(\"common.disabled\"), value: true, color: \"red\" },\n            ],\n          }),\n          form: {\n            value: false,\n          },\n          column: {\n            width: 100,\n            sorter: true,\n            align: \"center\",\n            component: {\n              name: \"fs-dict-switch\",\n              vModel: \"checked\",\n              on: {\n                async change({ row, $event }) {\n                  await api.DisabledChange(row.id, $event);\n                  await crudExpose.doRefresh();\n                },\n              },\n            },\n          },\n        },\n        ipCheck: {\n          title: t(\"certd.monitor.ipCheck\"),\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { label: t(\"common.enabled\"), value: true, color: \"green\" },\n              { label: t(\"common.disabled\"), value: false, color: \"gray\" },\n            ],\n          }),\n          form: {\n            value: false,\n            rules: [{ required: true, message: t(\"certd.monitor.selectRequired\") }],\n          },\n          column: {\n            align: \"center\",\n            width: 100,\n            conditionalRender: false,\n            component: {\n              name: \"fs-dict-switch\",\n              vModel: \"checked\",\n              on: {\n                change({ row, $event }) {\n                  Modal.confirm({\n                    title: t(\"common.confirm\"),\n                    content: t(\"certd.monitor.ipCheckConfirm\", { status: $event ? t(\"common.enabled\") : t(\"common.disabled\") }),\n                    onOk: async () => {\n                      await api.IpCheckChange(row.id, $event);\n                      await crudExpose.doRefresh();\n                      if ($event) {\n                        openSiteIpMonitorDialog({ siteId: row.id });\n                      }\n                    },\n                    onCancel: async () => {\n                      await crudExpose.doRefresh();\n                    },\n                  });\n                },\n              },\n            },\n          },\n        } as ColumnCompositionProps,\n        ipCount: {\n          title: t(\"certd.monitor.ipCount\"),\n          search: {\n            show: false,\n          },\n          type: \"text\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            sorter: true,\n            align: \"center\",\n          },\n        },\n        checkStatus: {\n          title: t(\"certd.monitor.checkStatus\"),\n          search: {\n            show: false,\n          },\n          type: \"dict-select\",\n          dict: checkStatusDict,\n          form: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            align: \"center\",\n            sorter: true,\n            cellRender({ value, row }) {\n              return (\n                <a-tooltip title={row.error}>\n                  <fs-values-format v-model={value} dict={checkStatusDict}></fs-values-format>\n                </a-tooltip>\n              );\n            },\n          },\n        },\n        // error: {\n        //   title: \"错误信息\",\n        //   search: {\n        //     show: false\n        //   },\n        //   type: \"text\",\n        //   form: {\n        //     show: false\n        //   },\n        //   column: {\n        //     width: 200,\n        //     sorter: true,\n        //     cellRender({ value }) {\n        //       return <a-tooltip title={value}>{value}</a-tooltip>;\n        //     }\n        //   }\n        // },\n        pipelineId: {\n          title: t(\"certd.monitor.pipelineId\"),\n          search: {\n            show: false,\n          },\n          form: { show: false },\n          type: \"number\",\n          column: {\n            width: 200,\n            sorter: true,\n            show: false,\n          },\n        },\n        certInfoId: {\n          title: t(\"certd.monitor.certInfoId\"),\n          search: {\n            show: false,\n          },\n          type: \"number\",\n          form: { show: false },\n          column: {\n            width: 100,\n            sorter: true,\n            show: false,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/monitor/site/index.vue",
    "content": "<template>\n  <fs-page>\n    <template #header>\n      <div class=\"title flex items-center\">\n        {{ t(\"certd.monitor.title\") }}\n        <div class=\"sub flex-1\">\n          <div>\n            {{ t(\"certd.monitor.description\") }}\n            <router-link to=\"/certd/monitor/setting\">{{ t(\"certd.monitor.settingLink\") }}</router-link>\n          </div>\n          <div class=\"flex items-center\">\n            {{ t(\"certd.monitor.limitInfo\") }}\n            <vip-button class=\"ml-5\" mode=\"nav\"></vip-button>\n          </div>\n        </div>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { siteInfoApi } from \"./api\";\nimport { Modal, notification } from \"ant-design-vue\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\ndefineOptions({\n  name: \"SiteCertMonitor\",\n});\nconst { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: {} });\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(() => {\n  crudExpose.doRefresh();\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/monitor/site/ip/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/monitor/site/ip\";\n\nexport const siteIpApi = {\n  async GetList(query: any) {\n    return await request({\n      url: apiPrefix + \"/page\",\n      method: \"post\",\n      data: query,\n    });\n  },\n\n  async AddObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/add\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async UpdateObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/update\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async DelObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/delete\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n\n  async GetObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/info\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n  async DoCheck(id: number) {\n    return await request({\n      url: apiPrefix + \"/check\",\n      method: \"post\",\n      data: { id },\n    });\n  },\n  async CheckAll(siteId: number) {\n    return await request({\n      url: apiPrefix + \"/checkAll\",\n      method: \"post\",\n      data: {\n        siteId,\n      },\n    });\n  },\n\n  async DoSync(siteId: number) {\n    return await request({\n      url: apiPrefix + \"/sync\",\n      method: \"post\",\n      data: {\n        siteId,\n      },\n    });\n  },\n  async Import(form: any) {\n    return await request({\n      url: apiPrefix + \"/import\",\n      method: \"post\",\n      data: form,\n    });\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/monitor/site/ip/crud.tsx",
    "content": "// @ts-ignore\nimport { useI18n } from \"/src/locales\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { siteIpApi } from \"./api\";\nimport dayjs from \"dayjs\";\nimport { Modal, notification } from \"ant-design-vue\";\nimport { useSiteIpMonitor } from \"/@/views/certd/monitor/site/ip/use\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { t } = useI18n();\n  const api = siteIpApi;\n\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    if (!query.query) {\n      query.query = {};\n    }\n    query.query.siteId = context.props.siteId;\n    return await api.GetList(query);\n  };\n  const editRequest = async (req: EditReq) => {\n    const { form, row } = req;\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async (req: DelReq) => {\n    const { row } = req;\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async (req: AddReq) => {\n    const { form } = req;\n    form.siteId = context.props.siteId;\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  const checkStatusDict = dict({\n    data: [\n      { label: t(\"certd.statusSuccess\"), value: \"ok\", color: \"green\" },\n      { label: t(\"certd.statusChecking\"), value: \"checking\", color: \"blue\" },\n      { label: t(\"certd.statusError\"), value: \"error\", color: \"red\" },\n    ],\n  });\n  const { openSiteIpImportDialog } = useSiteIpMonitor();\n  return {\n    crudOptions: {\n      id: \"siteIpCrud\",\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      form: {\n        labelCol: {\n          //固定label宽度\n          span: null,\n          style: {\n            width: \"100px\",\n          },\n        },\n        col: {\n          span: 22,\n        },\n        wrapper: {\n          width: 600,\n        },\n      },\n      actionbar: {\n        buttons: {\n          add: {\n            async click() {\n              await crudExpose.openAdd({});\n            },\n          },\n          import: {\n            show: true,\n            text: t(\"certd.actionImportBatch\"),\n            type: \"primary\",\n            async click() {\n              openSiteIpImportDialog({\n                siteId: context.props.siteId,\n                afterSubmit() {\n                  crudExpose.doRefresh();\n                },\n              });\n            },\n          },\n          load: {\n            text: t(\"certd.actionSyncIp\"),\n            type: \"primary\",\n            async click() {\n              Modal.confirm({\n                title: t(\"certd.modalTitleSyncIp\"),\n                content: t(\"certd.modalContentSyncIp\"),\n                onOk: async () => {\n                  await api.DoSync(context.props.siteId);\n                  await crudExpose.doRefresh();\n                  notification.success({\n                    message: t(\"certd.notificationSyncComplete\"),\n                  });\n                },\n              });\n            },\n          },\n          checkAll: {\n            text: t(\"certd.actionCheckAll\"),\n            type: \"primary\",\n            click: () => {\n              Modal.confirm({\n                title: t(\"certd.modalTitleConfirm\"),\n                content: t(\"certd.modalContentCheckAll\"),\n                onOk: async () => {\n                  await siteIpApi.CheckAll(context.props.siteId);\n                  notification.success({\n                    message: t(\"certd.notificationCheckSubmitted\"),\n                    description: t(\"certd.notificationCheckDescription\"),\n                  });\n                },\n              });\n            },\n          },\n        },\n      },\n      rowHandle: {\n        fixed: \"right\",\n        width: 240,\n        buttons: {\n          check: {\n            order: 0,\n            type: \"link\",\n            text: null,\n            tooltip: {\n              title: t(\"certd.tooltipCheckNow\"),\n            },\n            icon: \"ion:play-sharp\",\n            click: async ({ row }) => {\n              await api.DoCheck(row.id);\n              await crudExpose.doRefresh();\n              notification.success({\n                message: t(\"certd.notificationCheckSubmittedPleaseRefresh\"),\n              });\n            },\n          },\n        },\n      },\n      columns: {\n        id: {\n          title: t(\"certd.columnId\"),\n          key: \"id\",\n          type: \"number\",\n          search: {\n            show: false,\n          },\n          column: {\n            width: 80,\n            align: \"center\",\n          },\n          form: {\n            show: false,\n          },\n        },\n        ipAddress: {\n          title: t(\"certd.columnIp\"),\n          search: {\n            show: true,\n          },\n          type: \"text\",\n          helper: t(\"certd.helperIpCname\"),\n          form: {\n            rules: [{ required: true, message: t(\"certd.ruleIpRequired\") }],\n          },\n          column: {\n            width: 160,\n          },\n        },\n        certDomains: {\n          title: t(\"certd.columnCertDomains\"),\n          search: {\n            show: false,\n          },\n          type: \"text\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 200,\n            sorter: true,\n            show: false,\n            cellRender({ value }) {\n              return (\n                <a-tooltip title={value} placement=\"left\">\n                  {value}\n                </a-tooltip>\n              );\n            },\n          },\n        },\n        certProvider: {\n          title: t(\"certd.columnCertProvider\"),\n          search: {\n            show: false,\n          },\n          type: \"text\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 200,\n            show: false,\n            sorter: true,\n            cellRender({ value }) {\n              return <a-tooltip title={value}>{value}</a-tooltip>;\n            },\n          },\n        },\n        certStatus: {\n          title: t(\"certd.columnCertStatus\"),\n          search: {\n            show: true,\n          },\n          type: \"dict-select\",\n          dict: dict({\n            data: [\n              { label: t(\"certd.statusNormal\"), value: \"ok\", color: \"green\" },\n              { label: t(\"certd.statusExpired\"), value: \"expired\", color: \"red\" },\n            ],\n          }),\n          form: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            sorter: true,\n            show: true,\n            align: \"center\",\n          },\n        },\n        certExpiresTime: {\n          title: t(\"certd.columnCertExpiresTime\"),\n          search: {\n            show: false,\n          },\n          type: \"date\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            cellRender({ value }) {\n              if (!value) {\n                return \"-\";\n              }\n              const expireDate = dayjs(value).format(\"YYYY-MM-DD\");\n              const leftDays = dayjs(value).diff(dayjs(), \"day\");\n              const color = leftDays < 20 ? \"red\" : \"#389e0d\";\n              const percent = (leftDays / 90) * 100;\n              return <a-progress title={expireDate + \" \" + t(\"certd.expired\")} percent={percent} strokeColor={color} format={(percent: number) => `${leftDays} ${t(\"certd.days\")}`} />;\n            },\n          },\n        },\n        checkStatus: {\n          title: t(\"certd.columnCheckStatus\"),\n          search: {\n            show: false,\n          },\n          type: \"dict-select\",\n          dict: checkStatusDict,\n          form: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            align: \"center\",\n            sorter: true,\n            cellRender({ value, row, key }) {\n              return (\n                <a-tooltip title={row.error}>\n                  <fs-values-format v-model={value} dict={checkStatusDict}></fs-values-format>\n                </a-tooltip>\n              );\n            },\n          },\n        },\n        lastCheckTime: {\n          title: t(\"certd.columnLastCheckTime\"),\n          search: {\n            show: false,\n          },\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 155,\n          },\n        },\n        from: {\n          title: t(\"certd.columnSource\"),\n          search: {\n            show: false,\n          },\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { label: t(\"certd.sourceSync\"), value: \"sync\", color: \"green\" },\n              { label: t(\"certd.sourceManual\"), value: \"manual\", color: \"blue\" },\n              { label: t(\"certd.sourceImport\"), value: \"import\", color: \"blue\" },\n            ],\n          }),\n          form: {\n            value: false,\n          },\n          column: {\n            width: 100,\n            sorter: true,\n            align: \"center\",\n          },\n        },\n        disabled: {\n          title: t(\"certd.columnDisabled\"),\n          search: {\n            show: false,\n          },\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { label: t(\"certd.enabled\"), value: false, color: \"green\" },\n              { label: t(\"certd.disabled\"), value: true, color: \"red\" },\n            ],\n          }),\n          form: {\n            value: false,\n          },\n          column: {\n            width: 100,\n            sorter: true,\n            align: \"center\",\n          },\n        },\n        remark: {\n          title: t(\"certd.columnRemark\"),\n          search: {\n            show: false,\n          },\n          type: \"text\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 200,\n            sorter: true,\n            tooltip: true,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/monitor/site/ip/index.vue",
    "content": "<template>\n  <div class=\"site-ip-dialog\" style=\"height: 60vh\">\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted, ref, Ref } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { siteIpApi } from \"./api\";\n\ndefineOptions({\n  name: \"SiteIpCertMonitor\",\n});\nconst props = defineProps<{\n  siteId: number;\n}>();\nconst { crudBinding, crudRef, crudExpose } = useFs({\n  createCrudOptions,\n  context: {\n    props,\n  },\n});\n\nconst siteInfoRef: Ref<any> = ref({});\nonMounted(async () => {\n  siteInfoRef.value = await siteIpApi.GetObj(props.siteId);\n});\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(() => {\n  crudExpose.doRefresh();\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/monitor/site/ip/use.tsx",
    "content": "import { useFormWrapper } from \"@fast-crud/fast-crud\";\n\nimport SiteIpCertMonitor from \"./index.vue\";\nimport { siteIpApi } from \"/@/views/certd/monitor/site/ip/api\";\n\nexport function useSiteIpMonitor() {\n  const { openDialog, openCrudFormDialog } = useFormWrapper();\n\n  async function openSiteIpMonitorDialog(opts: { siteId: number }) {\n    await openDialog({\n      wrapper: {\n        title: \"站点IP监控\",\n        width: \"80%\",\n        is: \"a-modal\",\n        footer: false,\n        buttons: {\n          cancel: {\n            show: false,\n          },\n          reset: {\n            show: false,\n          },\n          ok: {\n            show: false,\n          },\n        },\n        slots: {\n          \"form-body-top\": () => {\n            return <SiteIpCertMonitor siteId={opts.siteId} />;\n          },\n        },\n      },\n    });\n  }\n\n  async function openSiteIpImportDialog(opts: { afterSubmit: any; siteId: any }) {\n    const { afterSubmit } = opts;\n    await openCrudFormDialog<any>({\n      crudOptions: {\n        columns: {\n          text: {\n            type: \"textarea\",\n            title: \"IP列表\",\n            form: {\n              helper: \"IP或者CNAME域名，一行一个\",\n              rules: [{ required: true, message: \"请输入要导入的IP或域名\" }],\n              component: {\n                placeholder: \"192.168.1.2\\ncname.foo.com\",\n                rows: 8,\n              },\n              col: {\n                span: 24,\n              },\n            },\n          },\n        },\n        form: {\n          async doSubmit({ form }) {\n            return siteIpApi.Import({\n              ...form,\n              siteId: opts.siteId,\n            });\n          },\n          afterSubmit,\n        },\n      },\n    });\n  }\n\n  return {\n    openSiteIpMonitorDialog,\n    openSiteIpImportDialog,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/monitor/site/setting/api.ts",
    "content": "// @ts-ignore\nimport { request } from \"/src/api/service\";\nconst apiPrefix = \"/monitor/site/setting\";\nexport type UserSiteMonitorSetting = {\n  notificationId?: number;\n  retryTimes?: number;\n  cron?: string;\n  dnsServer?: string[];\n};\n\nexport async function SiteMonitorSettingsGet() {\n  const res = await request({\n    url: apiPrefix + \"/get\",\n    method: \"post\",\n  });\n  if (!res) {\n    return {};\n  }\n  return res as UserSiteMonitorSetting;\n}\nexport async function SiteMonitorSettingsSave(data: UserSiteMonitorSetting) {\n  await request({\n    url: apiPrefix + \"/save\",\n    method: \"post\",\n    data: data,\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/monitor/site/setting/index.vue",
    "content": "<template>\n  <fs-page class=\"page-user-settings page-site-monitor-setting\">\n    <template #header>\n      <div class=\"title\">{{ t(\"certd.monitor.setting.siteMonitorSettings\") }}</div>\n    </template>\n    <div class=\"user-settings-form settings-form\">\n      <a-form :model=\"formState\" name=\"basic\" :label-col=\"{ span: 8 }\" :wrapper-col=\"{ span: 16 }\" autocomplete=\"off\">\n        <a-form-item :label=\"t('certd.monitor.setting.notificationChannel')\" :name=\"['notificationId']\">\n          <div class=\"flex\">\n            <NotificationSelector v-model=\"formState.notificationId\" />\n          </div>\n          <div class=\"helper\">{{ t(\"certd.monitor.setting.setNotificationChannel\") }}</div>\n        </a-form-item>\n        <a-form-item :label=\"t('certd.monitor.setting.retryTimes')\" :name=\"['retryTimes']\">\n          <div class=\"flex\">\n            <a-input-number v-model:value=\"formState.retryTimes\" />\n          </div>\n          <div class=\"helper\">{{ t(\"certd.monitor.setting.monitorRetryTimes\") }}</div>\n        </a-form-item>\n        <a-form-item :label=\"t('certd.monitor.setting.dnsServer')\" :name=\"['dnsServer']\">\n          <div class=\"flex\">\n            <a-select v-model:value=\"formState.dnsServer\" mode=\"tags\" :open=\"false\" />\n          </div>\n          <div class=\"helper\">{{ t(\"certd.monitor.setting.dnsServerHelper\") }}</div>\n        </a-form-item>\n        <a-form-item :label=\"t('certd.monitor.setting.monitorCronSetting')\" :name=\"['cron']\">\n          <div class=\"flex flex-baseline\">\n            <cron-editor v-model=\"formState.cron\" :disabled=\"!settingsStore.isPlus\" :allow-every-min=\"userStore.isAdmin\" />\n            <vip-button class=\"ml-5\" mode=\"button\"></vip-button>\n          </div>\n          <div class=\"helper\">{{ t(\"certd.monitor.setting.cronTrigger\") }}</div>\n        </a-form-item>\n        <a-form-item label=\" \" :colon=\"false\" :wrapper-col=\"{ span: 16 }\">\n          <loading-button type=\"primary\" html-type=\"button\" :click=\"doSave\">{{ t(\"certd.save\") }}</loading-button>\n        </a-form-item>\n      </a-form>\n    </div>\n  </fs-page>\n</template>\n\n<script setup lang=\"tsx\">\nimport { reactive } from \"vue\";\nimport * as api from \"./api\";\nimport { UserSiteMonitorSetting } from \"./api\";\nimport { notification } from \"ant-design-vue\";\nimport { merge } from \"lodash-es\";\nimport { useSettingStore } from \"/src/store/settings\";\nimport NotificationSelector from \"/@/views/certd/notification/notification-selector/index.vue\";\nimport { useUserStore } from \"/@/store/user\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\nconst settingsStore = useSettingStore();\nconst userStore = useUserStore();\ndefineOptions({\n  name: \"UserSecurity\",\n});\n\nconst formState = reactive<Partial<UserSiteMonitorSetting>>({\n  notificationId: 0,\n});\n\nasync function loadUserSettings() {\n  const data: any = await api.SiteMonitorSettingsGet();\n  merge(formState, data);\n}\n\nloadUserSettings();\nconst doSave = async (form: any) => {\n  await api.SiteMonitorSettingsSave({\n    ...formState,\n  });\n  notification.success({\n    message: t(\"certd.saveSuccess\"),\n  });\n};\n</script>\n\n<style lang=\"less\">\n.page-user-settings {\n  .user-settings-form {\n    width: 700px;\n    margin: 20px;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/monitor/site/use.tsx",
    "content": "import { useFormWrapper } from \"@fast-crud/fast-crud\";\nimport { siteInfoApi } from \"./api\";\nimport { useI18n } from \"/src/locales\";\n\nexport function useSiteImport() {\n  const { t } = useI18n();\n  const { openCrudFormDialog } = useFormWrapper();\n\n  async function openSiteImportDialog(opts: { afterSubmit: any }) {\n    const { afterSubmit } = opts;\n    await openCrudFormDialog<any>({\n      crudOptions: {\n        columns: {\n          text: {\n            type: \"textarea\",\n            title: t(\"certd.domainList.title\"), // 域名列表\n            form: {\n              helper: t(\"certd.domainList.helper\"),\n              rules: [{ required: true, message: t(\"certd.domainList.required\") }],\n              component: {\n                placeholder: t(\"certd.domainList.placeholder\"),\n                rows: 8,\n              },\n              col: {\n                span: 24,\n              },\n            },\n          },\n        },\n\n        form: {\n          async doSubmit({ form }) {\n            return siteInfoApi.Import(form);\n          },\n          afterSubmit,\n        },\n      },\n    });\n  }\n\n  return {\n    openSiteImportDialog,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/notification/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nexport function createNotificationApi() {\n  const apiPrefix = \"/pi/notification\";\n  return {\n    async GetList(query: any) {\n      return await request({\n        url: apiPrefix + \"/page\",\n        method: \"post\",\n        data: query,\n      });\n    },\n\n    async AddObj(obj: any) {\n      return await request({\n        url: apiPrefix + \"/add\",\n        method: \"post\",\n        data: obj,\n      });\n    },\n\n    async UpdateObj(obj: any) {\n      return await request({\n        url: apiPrefix + \"/update\",\n        method: \"post\",\n        data: obj,\n      });\n    },\n\n    async DelObj(id: number) {\n      return await request({\n        url: apiPrefix + \"/delete\",\n        method: \"post\",\n        params: { id },\n      });\n    },\n\n    async GetObj(id: number) {\n      return await request({\n        url: apiPrefix + \"/info\",\n        method: \"post\",\n        params: { id },\n      });\n    },\n\n    async GetOptions(id: number) {\n      return await request({\n        url: apiPrefix + \"/options\",\n        method: \"post\",\n      });\n    },\n\n    async SetDefault(id: number) {\n      return await request({\n        url: apiPrefix + \"/setDefault\",\n        method: \"post\",\n        params: { id },\n      });\n    },\n\n    async GetDefaultId() {\n      return await request({\n        url: apiPrefix + \"/getDefaultId\",\n        method: \"post\",\n      });\n    },\n\n    async GetSimpleInfo(id: number) {\n      return await request({\n        url: apiPrefix + \"/simpleInfo\",\n        method: \"post\",\n        params: { id },\n      });\n    },\n\n    async GetDefineTypes() {\n      return await request({\n        url: apiPrefix + \"/getTypeDict\",\n        method: \"post\",\n      });\n    },\n\n    async GetProviderDefine(type: string) {\n      return await request({\n        url: apiPrefix + \"/define\",\n        method: \"post\",\n        params: { type },\n      });\n    },\n\n    async GetProviderDefineByType(type: string) {\n      return await request({\n        url: apiPrefix + \"/defineByType\",\n        method: \"post\",\n        params: { type },\n      });\n    },\n    async GetOrCreateDefault(param: { email: any }) {\n      return await request({\n        url: apiPrefix + \"/getOrCreateDefault\",\n        method: \"post\",\n        data: param,\n      });\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/notification/common.tsx",
    "content": "import { ColumnCompositionProps, compute, dict } from \"@fast-crud/fast-crud\";\nimport { computed, provide, ref, toRef } from \"vue\";\nimport { useReference } from \"/@/use/use-refrence\";\nimport { forEach, get, merge, set } from \"lodash-es\";\nimport { Modal } from \"ant-design-vue\";\nimport { mitter } from \"/@/utils/util.mitt\";\nimport { useI18n } from \"/src/locales\";\n\nexport function notificationProvide(api: any) {\n  provide(\"notificationApi\", api);\n  provide(\"get:plugin:type\", () => {\n    return \"notification\";\n  });\n}\n\nexport function getCommonColumnDefine(crudExpose: any, typeRef: any, api: any) {\n  const { t } = useI18n();\n\n  const notificationTypeDictRef = dict({\n    url: \"/pi/notification/getTypeDict\",\n  });\n  const defaultPluginConfig = {\n    component: {\n      name: \"a-input\",\n      vModel: \"value\",\n    },\n  };\n\n  function buildDefineFields(define: any, form: any, mode: string) {\n    const formWrapperRef = crudExpose.getFormWrapperRef();\n    const columnsRef = toRef(formWrapperRef.formOptions, \"columns\");\n\n    for (const key in columnsRef.value) {\n      if (key.indexOf(\".\") >= 0) {\n        delete columnsRef.value[key];\n      }\n    }\n    console.log('crudBinding.value[mode + \"Form\"].columns', columnsRef.value);\n    forEach(define.input, (value: any, mapKey: any) => {\n      const key = \"body.\" + mapKey;\n      const field = {\n        ...value,\n        key,\n      };\n      const column = merge({ title: key }, defaultPluginConfig, field);\n      //eval\n      useReference(column);\n\n      if (column.required) {\n        if (!column.rules) {\n          column.rules = [];\n        }\n        column.rules.push({ required: true, message: t(\"certd.requiredField\") });\n      }\n\n      //设置默认值\n      if (column.value != null && get(form, key) == null) {\n        set(form, key, column.value);\n      }\n      //字段配置赋值\n      columnsRef.value[key] = column;\n      console.log(\"form\", columnsRef.value, form);\n    });\n  }\n\n  const currentDefine = ref();\n\n  return {\n    id: {\n      title: \"ID\",\n      key: \"id\",\n      type: \"number\",\n      column: {\n        width: 100,\n      },\n      form: {\n        show: false,\n      },\n    },\n    type: {\n      title: t(\"certd.notificationType\"),\n      type: \"dict-select\",\n      dict: notificationTypeDictRef,\n      search: {\n        show: false,\n      },\n      column: {\n        width: 200,\n        component: {\n          color: \"auto\",\n        },\n      },\n      editForm: {\n        component: {\n          disabled: false,\n        },\n      },\n      form: {\n        component: {\n          disabled: false,\n          showSearch: true,\n          filterOption: (input: string, option: any) => {\n            input = input?.toLowerCase();\n            return option.value.toLowerCase().indexOf(input) >= 0 || option.label.toLowerCase().indexOf(input) >= 0;\n          },\n          renderLabel(item: any) {\n            return (\n              <span class={\"flex-o flex-between\"}>\n                {item.label}\n                {item.needPlus && <fs-icon icon={\"mingcute:vip-1-line\"} className={\"color-plus\"}></fs-icon>}\n              </span>\n            );\n          },\n        },\n        rules: [{ required: true, message: t(\"certd.selectNotificationType\") }],\n        valueChange: {\n          immediate: true,\n          async handle({ value, mode, form, immediate }) {\n            if (value == null) {\n              return;\n            }\n            const lastTitle = currentDefine.value?.title;\n            const define = await api.GetProviderDefine(value);\n            currentDefine.value = define;\n            console.log(\"define\", define);\n\n            if (!immediate) {\n              form.body = {};\n              if (define.needPlus) {\n                mitter.emit(\"openVipModal\");\n              }\n            }\n\n            if (!form.name || form.name === lastTitle) {\n              form.name = define.title;\n            }\n            buildDefineFields(define, form, mode);\n          },\n        },\n        helper: computed(() => {\n          const define = currentDefine.value;\n          if (define == null) {\n            return \"\";\n          }\n          return define.desc;\n        }),\n      },\n    } as ColumnCompositionProps,\n    name: {\n      title: t(\"certd.notificationName\"),\n      search: {\n        show: true,\n      },\n      type: [\"text\"],\n      form: {\n        rules: [{ required: true, message: t(\"certd.enterName\") }],\n        helper: t(\"certd.helperNotificationName\"),\n      },\n      column: {\n        width: 200,\n      },\n    },\n    isDefault: {\n      title: t(\"certd.isDefault\"),\n      type: \"dict-switch\",\n      dict: dict({\n        data: [\n          { label: t(\"certd.yes\"), value: true, color: \"success\" },\n          { label: t(\"certd.no\"), value: false, color: \"default\" },\n        ],\n      }),\n      form: {\n        value: false,\n        rules: [{ required: true, message: t(\"certd.selectIsDefault\") }],\n        order: 999,\n      },\n      column: {\n        align: \"center\",\n        width: 100,\n        component: {\n          name: \"a-switch\",\n          vModel: \"checked\",\n          disabled: compute(({ value }) => {\n            return value === true;\n          }),\n          on: {\n            change({ row }) {\n              Modal.confirm({\n                title: t(\"certd.prompt\"),\n                content: t(\"certd.confirmSetDefaultNotification\"),\n                onOk: async () => {\n                  await api.SetDefault(row.id);\n                  await crudExpose.doRefresh();\n                },\n                onCancel: async () => {\n                  await crudExpose.doRefresh();\n                },\n              });\n            },\n          },\n        },\n      },\n    } as ColumnCompositionProps,\n    test: {\n      title: t(\"certd.test\"),\n      form: {\n        show: compute(({ form }) => {\n          return !!form.type;\n        }),\n        component: {\n          name: \"api-test\",\n          action: \"TestRequest\",\n        },\n        order: 990,\n        col: {\n          span: 24,\n        },\n      },\n      column: {\n        show: false,\n      },\n    },\n    setting: {\n      column: { show: false },\n      form: {\n        show: false,\n        valueBuilder({ value, form }) {\n          form.body = {};\n          if (!value) {\n            return;\n          }\n          const setting = JSON.parse(value);\n          for (const key in setting) {\n            form.body[key] = setting[key];\n          }\n        },\n        valueResolve({ form }) {\n          const setting = form.body;\n          form.setting = JSON.stringify(setting);\n        },\n      },\n    } as ColumnCompositionProps,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/notification/crud.tsx",
    "content": "import { ref } from \"vue\";\nimport { getCommonColumnDefine } from \"./common\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { createNotificationApi } from \"/@/views/certd/notification/api\";\nconst api = createNotificationApi();\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async (req: EditReq) => {\n    const { form, row } = req;\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async (req: DelReq) => {\n    const { row } = req;\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async (req: AddReq) => {\n    const { form } = req;\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  const typeRef = ref();\n  const commonColumnsDefine = getCommonColumnDefine(crudExpose, typeRef, api);\n  return {\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      form: {\n        labelCol: {\n          //固定label宽度\n          span: null,\n          style: {\n            width: \"145px\",\n          },\n        },\n      },\n      rowHandle: {\n        width: 200,\n      },\n      columns: {\n        ...commonColumnsDefine,\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/notification/index.vue",
    "content": "<template>\n  <fs-page>\n    <template #header>\n      <div class=\"title\">\n        通知管理\n        <span class=\"sub\">管理通知配置</span>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { createNotificationApi } from \"./api\";\nimport { notificationProvide } from \"/@/views/certd/notification/common\";\n\nexport default defineComponent({\n  name: \"NotificationManager\",\n  setup() {\n    const api = createNotificationApi();\n    notificationProvide(api);\n    const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: { api } });\n\n    // 页面打开后获取列表数据\n    onMounted(() => {\n      crudExpose.doRefresh();\n    });\n    onActivated(() => {\n      crudExpose.doRefresh();\n    });\n\n    return {\n      crudBinding,\n      crudRef,\n    };\n  },\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/notification/notification-selector/index.vue",
    "content": "<template>\n  <div class=\"notification-selector\">\n    <div class=\"flex-o w-100\">\n      <fs-dict-select class=\"flex-1\" :value=\"modelValue\" :dict=\"optionsDictRef\" :disabled=\"disabled\" :render-label=\"renderLabel\" :slots=\"selectSlots\" :allow-clear=\"true\" v-bind=\"select\" @update:value=\"onChange\" />\n      <fs-table-select\n        ref=\"tableSelectRef\"\n        class=\"flex-0\"\n        :model-value=\"modelValue\"\n        :dict=\"optionsDictRef\"\n        :create-crud-options=\"createCrudOptions\"\n        :crud-options-override=\"{\n          search: { show: false },\n          table: {\n            scroll: {\n              x: 540,\n            },\n          },\n        }\"\n        :show-current=\"false\"\n        :show-select=\"false\"\n        :dialog=\"{ width: 960 }\"\n        :destroy-on-close=\"false\"\n        height=\"400px\"\n        v-bind=\"tableSelect\"\n        @update:model-value=\"onChange\"\n        @dialog-closed=\"doRefresh\"\n      >\n        <template #default=\"scope\">\n          <fs-button class=\"ml-5\" :disabled=\"disabled\" :size=\"size\" type=\"primary\" icon=\"ant-design:edit-outlined\" @click=\"scope.open\"></fs-button>\n        </template>\n      </fs-table-select>\n    </div>\n  </div>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { inject, ref, Ref, watch } from \"vue\";\nimport { createNotificationApi } from \"../api\";\nimport { message } from \"ant-design-vue\";\nimport { dict } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"../crud\";\nimport { notificationProvide } from \"/@/views/certd/notification/common\";\nimport { useUserStore } from \"/@/store/user\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\ndefineOptions({\n  name: \"NotificationSelector\",\n});\n\nconst props = defineProps<{\n  modelValue?: number | string | number[] | string[];\n  type?: string;\n  placeholder?: string;\n  size?: string;\n  disabled?: boolean;\n  select?: any;\n  tableSelect?: any;\n}>();\n\nconst onChange = async (value: number) => {\n  await emitValue(value);\n};\n\nconst emit = defineEmits([\"update:modelValue\", \"selectedChange\", \"change\"]);\n\nconst api = createNotificationApi();\nnotificationProvide(api);\n// const types = ref({});\n// async function loadNotificationTypes() {\n//   const types = await api.GetDefineTypes();\n//   const map: any = {};\n//   for (const item of types) {\n//     map[item.type] = item;\n//   }\n//   types.value = map;\n// }\n// loadNotificationTypes();\nconst tableSelectRef = ref();\nconst optionsDictRef = dict({\n  url: \"/pi/notification/options\",\n  value: \"id\",\n  label: \"name\",\n  onReady: ({ dict }) => {\n    const data = [\n      {\n        id: 0,\n        name: t(\"certd.notificationDefault\"),\n        icon: \"ion:notifications\",\n      },\n      ...dict.data,\n    ];\n    dict.setData(data);\n  },\n});\n\nconst renderLabel = (option: any) => {\n  return <span>{option.name}</span>;\n};\n\nasync function openTableSelectDialog() {\n  selectOpened.value = false;\n  await tableSelectRef.value.open({});\n  await tableSelectRef.value.crudExpose.openAdd({});\n}\n\nconst selectOpened = ref(false);\nconst selectSlots = ref({\n  dropdownRender({ menuNode, props }: any) {\n    const res = [];\n    res.push(menuNode);\n    // res.push(<a-divider style=\"margin: 4px 0\" />);\n    // res.push(<a-space style=\"padding: 4px 8px\" />);\n    // res.push(<fs-button class=\"w-100\" type=\"text\" icon=\"plus-outlined\" text=\"新建通知渠道\" onClick={openTableSelectDialog}></fs-button>);\n    return res;\n  },\n});\n\nconst target: Ref<any> = ref({});\n\nfunction clear() {\n  if (props.disabled) {\n    return;\n  }\n  emitValue(null);\n}\n\nconst userStore = useUserStore();\n\nasync function emitValue(value: any) {\n  // target.value = optionsDictRef.dataMap[value];\n  const userId = userStore.userInfo.id;\n  if (pipeline?.value && pipeline.value.userId !== userId) {\n    message.error(\"对不起，您不能修改他人流水线的通知\");\n    return;\n  }\n  emit(\"change\", value);\n  emit(\"update:modelValue\", value);\n}\n\nwatch(\n  () => {\n    return props.modelValue;\n  },\n  async value => {\n    await optionsDictRef.loadDict();\n    //@ts-ignore\n    target.value = optionsDictRef.dataMap[value];\n    emit(\"selectedChange\", target.value);\n  },\n  {\n    immediate: true,\n  }\n);\n\n//当不在pipeline中编辑时，可能为空\nconst pipeline = inject(\"pipeline\", null);\n\nasync function doRefresh() {\n  await optionsDictRef.reloadDict();\n}\n</script>\n<style lang=\"less\">\n.notification-selector {\n  width: 100%;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/notification/notification-selector/modal/crud.tsx",
    "content": "// @ts-ignore\nimport { ref } from \"vue\";\nimport { getCommonColumnDefine } from \"../../common\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { crudBinding } = crudExpose;\n  const { props, ctx, api } = context;\n  const lastResRef = ref();\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await context.api.GetList(query);\n  };\n  const editRequest = async (req: EditReq) => {\n    const { form, row } = req;\n    form.id = row.id;\n    const res = await context.api.UpdateObj(form);\n    lastResRef.value = res;\n    return res;\n  };\n  const delRequest = async (req: DelReq) => {\n    const { row } = req;\n    return await context.api.DelObj(row.id);\n  };\n\n  const addRequest = async (req: AddReq) => {\n    const { form } = req;\n    const res = await context.api.AddObj(form);\n    lastResRef.value = res;\n    return res;\n  };\n\n  const selectedRowKey = ref([props.modelValue]);\n\n  const onSelectChange = (changed: any) => {\n    selectedRowKey.value = changed;\n    ctx.emit(\"update:modelValue\", changed[0]);\n  };\n\n  const typeRef = ref(\"\");\n  context.typeRef = typeRef;\n  const commonColumnsDefine = getCommonColumnDefine(crudExpose, typeRef, api);\n  commonColumnsDefine.type.editForm.component.disabled = true;\n  return {\n    typeRef,\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      toolbar: {\n        show: false,\n      },\n      search: {\n        show: false,\n      },\n      form: {\n        labelCol: {\n          //固定label宽度\n          span: null,\n          style: {\n            width: \"145px\",\n          },\n        },\n      },\n      rowHandle: {\n        width: 200,\n      },\n      table: {\n        scroll: {\n          x: 700,\n        },\n        rowSelection: {\n          type: \"radio\",\n          selectedRowKeys: selectedRowKey,\n          onChange: onSelectChange,\n        },\n        customRow: (record: any) => {\n          return {\n            onClick: () => {\n              onSelectChange([record.id]);\n            }, // 点击行\n          };\n        },\n      },\n      columns: {\n        ...commonColumnsDefine,\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/notification/notification-selector/modal/index.vue",
    "content": "<template>\n  <fs-page class=\"page-cert-notification-modal\">\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, watch } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { createNotificationApi } from \"../../api\";\n\nexport default defineComponent({\n  name: \"CertNotificationModal\",\n  props: {\n    modelValue: {},\n  },\n  emits: [\"update:modelValue\"],\n  setup(props, ctx) {\n    const api = createNotificationApi();\n    const context: any = { props, ctx, api };\n    const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context });\n    onMounted(() => {\n      crudExpose.doRefresh();\n    });\n\n    return {\n      crudBinding,\n      crudRef,\n    };\n  },\n});\n</script>\n<style lang=\"less\">\n.page-cert-notification {\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/open/openkey/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nexport const OPEN_API_DOC = \"https://apifox.com/apidoc/shared-2e76f8c4-7c58-413b-a32d-a1316529af44/254949529e0\";\n\nconst apiPrefix = \"/open/key\";\nexport const openkeyApi = {\n  async GetList(query: any) {\n    return await request({\n      url: apiPrefix + \"/page\",\n      method: \"post\",\n      data: query,\n    });\n  },\n\n  async AddObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/add\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async UpdateObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/update\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async DelObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/delete\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n\n  async GetObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/info\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n  async GetApiToken(id: number) {\n    return await request({\n      url: apiPrefix + \"/getApiToken\",\n      method: \"post\",\n      data: { id },\n    });\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/open/openkey/crud.tsx",
    "content": "// @ts-ignore\nimport { useI18n } from \"/src/locales\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { OPEN_API_DOC, openkeyApi } from \"./api\";\nimport { useModal } from \"/@/use/use-modal\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { t } = useI18n();\n  const api = openkeyApi;\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async (req: EditReq) => {\n    const { form, row } = req;\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async (req: DelReq) => {\n    const { row } = req;\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async (req: AddReq) => {\n    const { form } = req;\n    const res = await api.AddObj(form);\n    return res;\n  };\n  const model = useModal();\n  return {\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      search: {\n        show: false,\n      },\n      form: {\n        labelCol: {\n          //固定label宽度\n          span: null,\n          style: {\n            width: \"100px\",\n          },\n        },\n        col: {\n          span: 22,\n        },\n        wrapper: {\n          width: 600,\n        },\n      },\n      actionbar: {},\n      rowHandle: {\n        width: 300,\n        fixed: \"right\",\n        buttons: {\n          view: { show: true },\n          copy: { show: false },\n          edit: { show: false },\n          remove: { show: true },\n          gen: {\n            text: t(\"certd.gen.text\"),\n            size: \"mini\",\n            icon: \"devicon-plain:vitest\",\n            type: \"primary\",\n            async click({ row }) {\n              const apiToken = await api.GetApiToken(row.id);\n\n              model.success({\n                title: t(\"certd.gen.title\"),\n                maskClosable: true,\n                okText: t(\"certd.gen.okText\"),\n                width: 600,\n                content: () => {\n                  return (\n                    <div>\n                      <div class={\"m-10 p-10\"}>\n                        {t(\"certd.gen.contentPart1\")}\n                        <a href={OPEN_API_DOC} target={\"_blank\"}>\n                          {t(\"certd.gen.openApi\")}\n                        </a>\n                        {t(\"certd.gen.contentPart2\")}\n                      </div>\n                      <div class={\"m-10 p-10\"} style={{ border: \"1px solid #333\" }}>\n                        <fs-copyable model-value={apiToken}></fs-copyable>\n                      </div>\n                    </div>\n                  );\n                },\n              });\n            },\n          },\n        },\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          search: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            editable: {\n              disabled: true,\n            },\n          },\n          form: {\n            show: false,\n          },\n        },\n        keyId: {\n          title: \"KeyId\",\n          type: [\"text\", \"copyable\"],\n          search: {\n            show: true,\n          },\n          form: {\n            show: false,\n          },\n          column: {\n            width: 250,\n            sorter: true,\n          },\n        },\n        keySecret: {\n          title: \"KeySecret\",\n          type: [\"text\", \"copyable\"],\n          form: {\n            show: false,\n          },\n          column: {\n            width: 580,\n            sorter: true,\n          },\n        },\n        scope: {\n          title: t(\"certd.scope\"),\n          type: \"dict-radio\",\n          dict: dict({\n            data: [\n              { label: t(\"certd.scopeOpenApiOnly\"), value: \"open\", color: \"blue\" },\n              { label: t(\"certd.scopeFullAccount\"), value: \"user\", color: \"red\" },\n            ],\n          }),\n          form: {\n            value: \"open\",\n            show: true,\n            rules: [{ required: true, message: t(\"certd.required\") }],\n            helper: t(\"certd.scopeHelper\"),\n            component: {\n              vModel: \"value\",\n            },\n          },\n          column: {\n            width: 120,\n            align: \"center\",\n            sorter: true,\n          },\n        },\n        createTime: {\n          title: t(\"certd.fields.createTime\"),\n          type: \"datetime\",\n          search: {\n            show: false,\n          },\n          form: {\n            show: false,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/open/openkey/index.vue",
    "content": "<template>\n  <fs-page>\n    <template #header>\n      <div class=\"title\">开放接口密钥管理</div>\n      <div class=\"more\">\n        <a :href=\"OPEN_API_DOC\" target=\"_blank\">开放接口文档</a>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { OPEN_API_DOC } from \"/@/views/certd/open/openkey/api\";\n\ndefineOptions({\n  name: \"OpenKey\",\n});\nconst { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: {} });\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(() => {\n  crudExpose.doRefresh();\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/payment/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/payment\";\nexport async function Notify(type: string, query: any) {\n  return await request({\n    url: apiPrefix + `/notify/${type}`,\n    method: \"post\",\n    data: query,\n    unpack: false,\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/payment/return.vue",
    "content": "<template>\n  <div class=\"cd-payment-return w-100\">\n    <div v-if=\"payResult == null\" class=\"flex-o m-20 w-100\">\n      <a-spin />\n    </div>\n    <a-result v-else-if=\"payResult\" status=\"success\" title=\"支付成功\">\n      <template #extra>\n        <a-button key=\"console\" type=\"primary\" @click=\"goHome\">回首页</a-button>\n      </template>\n    </a-result>\n    <a-result v-else status=\"error\" title=\"支付失败\">\n      <template #extra>\n        <a-button key=\"console\" type=\"primary\" @click=\"goHome\">回首页</a-button>\n      </template>\n    </a-result>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { Ref, ref } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport * as api from \"./api\";\nconst route = useRoute();\nconst type = route.params.type as string;\n\nconst query = route.query;\n\nasync function checkNotify() {\n  const res = await api.Notify(type, query);\n  if (res === \"success\") {\n    return true;\n  }\n  return false;\n}\n\nconst payResult: Ref = ref(null);\nasync function check() {\n  const pass = await checkNotify();\n  if (!pass) {\n    payResult.value = false;\n  } else {\n    payResult.value = true;\n  }\n}\ncheck();\n\nconst router = useRouter();\nfunction goHome() {\n  router.push({\n    path: \"/\",\n  });\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/api.history.ts",
    "content": "import { RunHistory } from \"./pipeline/type\";\nimport { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/pi/history\";\n\nexport async function GetList(query: any) {\n  const list = await request({\n    url: apiPrefix + \"/list\",\n    method: \"post\",\n    data: query,\n  });\n  for (const item of list) {\n    if (item.pipeline && typeof item.pipeline === \"string\") {\n      item.pipeline = JSON.parse(item.pipeline);\n    }\n  }\n  return list;\n}\n\nexport async function GetDetail(query: any): Promise<RunHistory> {\n  const detail = await request({\n    url: apiPrefix + \"/detail\",\n    method: \"post\",\n    params: query,\n  });\n\n  const pipeline = JSON.parse(detail.history?.pipeline || \"{}\");\n  const logs = JSON.parse(detail.log?.logs || \"{}\");\n  return {\n    id: detail.history.id,\n    pipeline,\n    logs,\n  } as RunHistory;\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/pi/pipeline\";\nconst historyApiPrefix = \"/pi/history\";\nconst certApiPrefix = \"/pi/cert\";\n\nexport async function GetList(query: any) {\n  return await request({\n    url: apiPrefix + \"/page\",\n    method: \"post\",\n    data: query,\n  });\n}\n\nexport async function GetSimpleByIds(ids: any) {\n  return await request({\n    url: apiPrefix + \"/getSimpleByIds\",\n    method: \"post\",\n    data: {\n      ids,\n    },\n  });\n}\n\nexport async function AddObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/add\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function UpdateObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/update\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function DelObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/delete\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/info\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetDetail(id: any) {\n  return await request({\n    url: apiPrefix + \"/detail\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function Save(pipelineEntity: any) {\n  return await request({\n    url: apiPrefix + \"/save\",\n    method: \"post\",\n    data: pipelineEntity,\n  });\n}\n\nexport async function Trigger(id: any, stepId?: string) {\n  return await request({\n    url: apiPrefix + \"/trigger\",\n    method: \"post\",\n    params: { id, stepId },\n  });\n}\n\nexport async function Cancel(historyId: any) {\n  return await request({\n    url: apiPrefix + \"/cancel\",\n    method: \"post\",\n    params: { historyId },\n  });\n}\n\nexport async function BatchUpdateGroup(pipelineIds: number[], groupId: number): Promise<void> {\n  return await request({\n    url: apiPrefix + \"/batchUpdateGroup\",\n    method: \"post\",\n    data: { ids: pipelineIds, groupId },\n  });\n}\n\nexport async function BatchUpdateTrigger(pipelineIds: number[], trigger: any): Promise<void> {\n  return await request({\n    url: apiPrefix + \"/batchUpdateTrigger\",\n    method: \"post\",\n    data: { ids: pipelineIds, trigger },\n  });\n}\n\nexport async function BatchUpdateNotificaiton(pipelineIds: number[], notification: any): Promise<void> {\n  return await request({\n    url: apiPrefix + \"/batchUpdateNotification\",\n    method: \"post\",\n    data: { ids: pipelineIds, notification },\n  });\n}\n\nexport async function BatchDelete(pipelineIds: number[]): Promise<void> {\n  return await request({\n    url: apiPrefix + \"/batchDelete\",\n    method: \"post\",\n    data: { ids: pipelineIds },\n  });\n}\nexport async function BatchRerun(pipelineIds: number[]): Promise<void> {\n  return await request({\n    url: apiPrefix + \"/batchRerun\",\n    method: \"post\",\n    data: { ids: pipelineIds },\n  });\n}\n\nexport async function GetFiles(pipelineId: number) {\n  return await request({\n    url: historyApiPrefix + \"/files\",\n    method: \"post\",\n    params: { pipelineId },\n  });\n}\n\nexport async function GetCount() {\n  return await request({\n    url: apiPrefix + \"/count\",\n    method: \"post\",\n  });\n}\n\nexport type CertInfo = {\n  crt: string;\n  key: string;\n  ic: string;\n  der: string;\n  pfx: string;\n};\n\nexport async function GetCert(pipelineId: number): Promise<CertInfo> {\n  return await request({\n    url: certApiPrefix + \"/get\",\n    method: \"post\",\n    params: { id: pipelineId },\n  });\n}\n\nexport async function ReadCertDetail(crt: string): Promise<any> {\n  return await request({\n    url: certApiPrefix + \"/readCertDetail\",\n    method: \"post\",\n    data: { crt },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/cert-upload/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/monitor/cert\";\nexport async function UploadCert(body: { id?: number; cert: { crt: string; key: string }; pipeline?: any }) {\n  return await request({\n    url: apiPrefix + \"/upload\",\n    method: \"post\",\n    data: body,\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/cert-upload/index.vue",
    "content": "<template>\n  <div class=\"cert-info-updater w-full flex items-center\">\n    <div class=\"flex-o\">\n      <a-tag>{{ domain }}</a-tag>\n      <fs-button type=\"primary\" size=\"small\" class=\"ml-1\" icon=\"ion:upload\" text=\"更新证书\" @click=\"onUploadClick\" />\n    </div>\n  </div>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { computed, inject, watch, ref } from \"vue\";\nimport { useCertUpload } from \"./use\";\nimport { getAllDomainsFromCrt } from \"/@/views/certd/pipeline/utils\";\n\ndefineOptions({\n  name: \"CertInfoUpdater\",\n});\n\nconst props = defineProps<{\n  modelValue?: { crt: string; key: string };\n  type?: string;\n  placeholder?: string;\n  size?: string;\n  disabled?: boolean;\n}>();\nconst emit = defineEmits([\"updated\", \"update:modelValue\"]);\n\nconst { openUpdateCertDialog } = useCertUpload();\n\nconst domainsRef = ref([]);\n\nwatch(\n  () => {\n    return props.modelValue?.crt;\n  },\n  async crt => {\n    if (crt) {\n      domainsRef.value = await getAllDomainsFromCrt(crt);\n    } else {\n      domainsRef.value = [];\n    }\n\n    emit(\"updated\", { domains: domainsRef.value });\n  },\n  {\n    immediate: true,\n  }\n);\n\nconst domain = computed(() => {\n  if (domainsRef.value && domainsRef.value.length > 0) {\n    return domainsRef.value[0];\n  }\n\n  return \"\";\n});\n\nasync function onUpdated(res: { uploadCert: any }) {\n  emit(\"update:modelValue\", res.uploadCert);\n}\n\nconst pipeline: any = inject(\"pipeline\");\nfunction onUploadClick() {\n  openUpdateCertDialog({\n    onSubmit: onUpdated,\n  });\n}\n</script>\n<style lang=\"less\">\n.cert-info-selector {\n  width: 100%;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/cert-upload/use.tsx",
    "content": "import { compute, dict, useFormWrapper } from \"@fast-crud/fast-crud\";\nimport NotificationSelector from \"/@/views/certd/notification/notification-selector/index.vue\";\nimport { cloneDeep, omit } from \"lodash-es\";\nimport { useReference } from \"/@/use/use-refrence\";\nimport { ref } from \"vue\";\nimport * as api from \"../api\";\nimport { checkPipelineLimit, getAllDomainsFromCrt } from \"/@/views/certd/pipeline/utils\";\nimport { useRouter } from \"vue-router\";\nimport { nanoid } from \"nanoid\";\nimport { usePluginStore } from \"/@/store/plugin\";\nimport GroupSelector from \"/@/views/certd/pipeline/group/group-selector.vue\";\n\nexport function useCertUpload() {\n  const { openCrudFormDialog } = useFormWrapper();\n  const router = useRouter();\n\n  const certInputs = {\n    \"uploadCert.crt\": {\n      title: \"证书\",\n      type: \"text\",\n      form: {\n        component: {\n          name: \"pem-input\",\n          vModel: \"modelValue\",\n          textarea: {\n            rows: 4,\n            placeholder: \"-----BEGIN CERTIFICATE-----\\n...\\n...\\n-----END CERTIFICATE-----\",\n          },\n        },\n        helper: \"选择pem格式证书文件，或者粘贴到此\",\n        rules: [{ required: true, message: \"此项必填\" }],\n        col: { span: 24 },\n        order: -9999,\n      },\n    },\n    \"uploadCert.key\": {\n      title: \"证书私钥\",\n      type: \"text\",\n      form: {\n        component: {\n          name: \"pem-input\",\n          vModel: \"modelValue\",\n          textarea: {\n            rows: 4,\n            placeholder: \"-----BEGIN PRIVATE KEY-----\\n...\\n...\\n-----END PRIVATE KEY----- \",\n          },\n        },\n        helper: \"选择pem格式证书私钥文件，或者粘贴到此\",\n        rules: [{ required: true, message: \"此项必填\" }],\n        col: { span: 24 },\n        order: -9999,\n      },\n    },\n  };\n\n  const pluginStore = usePluginStore();\n\n  async function buildUploadCertPluginInputs(getFormData: any) {\n    const plugin: any = await pluginStore.getPluginDefine(\"CertApplyUpload\");\n    const inputs: any = {};\n    for (const inputKey in plugin.input) {\n      if (inputKey === \"uploadCert\" || inputKey === \"domains\") {\n        continue;\n      }\n      const inputDefine = cloneDeep(plugin.input[inputKey]);\n      useReference(inputDefine);\n      inputs[inputKey] = {\n        title: inputDefine.title,\n        form: {\n          ...inputDefine,\n          show: compute(ctx => {\n            const form = getFormData();\n            if (!form) {\n              return false;\n            }\n\n            let inputDefineShow = true;\n            if (inputDefine.show != null) {\n              const computeShow = inputDefine.show as any;\n              if (computeShow === false) {\n                inputDefineShow = false;\n              } else if (computeShow && computeShow.computeFn) {\n                inputDefineShow = computeShow.computeFn({ form });\n              }\n            }\n            return inputDefineShow;\n          }),\n        },\n      };\n    }\n    return inputs;\n  }\n\n  async function openUploadCreateDialog(req: { defaultGroupId?: number }) {\n    //检查是否流水线数量超出限制\n    await checkPipelineLimit();\n\n    const wrapperRef = ref();\n    function getFormData() {\n      if (!wrapperRef.value) {\n        return null;\n      }\n      return wrapperRef.value.getFormData();\n    }\n    const inputs = await buildUploadCertPluginInputs(getFormData);\n    const groupDictRef = dict({\n      url: \"/pi/pipeline/group/all\",\n      value: \"id\",\n      label: \"name\",\n    });\n    function createCrudOptions() {\n      return {\n        crudOptions: {\n          columns: {\n            ...cloneDeep(certInputs),\n            ...inputs,\n            notification: {\n              title: \"失败通知\",\n              type: \"text\",\n              form: {\n                value: 0,\n                component: {\n                  name: NotificationSelector,\n                  vModel: \"modelValue\",\n                  on: {\n                    selectedChange({ $event, form }: any) {\n                      form.notificationTarget = $event;\n                    },\n                  },\n                },\n                order: 101,\n                helper: \"任务执行失败实时提醒\",\n              },\n            },\n            groupId: {\n              title: \"流水线分组\",\n              type: \"dict-select\",\n              dict: groupDictRef,\n              form: {\n                component: {\n                  name: GroupSelector,\n                  vModel: \"modelValue\",\n                },\n                value: req.defaultGroupId || undefined,\n                order: 9999,\n              },\n            },\n          },\n          form: {\n            wrapper: {\n              title: \"上传证书&创建部署流水线\",\n              saveRemind: false,\n            },\n            async doSubmit({ form }: any) {\n              const cert = form.uploadCert;\n              const domains = await getAllDomainsFromCrt(cert.crt);\n\n              const notifications = [];\n              if (form.notification != null) {\n                notifications.push({\n                  type: \"custom\",\n                  when: [\"error\", \"turnToSuccess\", \"success\"],\n                  notificationId: form.notification,\n                  title: form.notificationTarget?.name || \"自定义通知\",\n                });\n              }\n\n              const pipelineTitle = domains[0] + \"上传证书部署\";\n              const input = omit(form, [\"id\", \"cert\", \"notification\", \"notificationTarget\"]);\n              const pipeline = {\n                title: pipelineTitle,\n                runnableType: \"pipeline\",\n                stages: [\n                  {\n                    id: nanoid(10),\n                    title: \"上传证书解析阶段\",\n                    maxTaskCount: 1,\n                    runnableType: \"stage\",\n                    tasks: [\n                      {\n                        id: nanoid(10),\n                        title: \"上传证书解析转换\",\n                        runnableType: \"task\",\n                        steps: [\n                          {\n                            id: nanoid(10),\n                            title: \"上传证书解析转换\",\n                            runnableType: \"step\",\n                            input: {\n                              cert: cert,\n                              domains: domains,\n                              ...input,\n                            },\n                            strategy: {\n                              runStrategy: 0, // 正常执行\n                            },\n                            type: \"CertApplyUpload\",\n                          },\n                        ],\n                      },\n                    ],\n                  },\n                ],\n                notifications,\n              };\n\n              const id = await api.Save({\n                title: pipeline.title,\n                content: JSON.stringify(pipeline),\n                keepHistoryCount: 30,\n                type: \"cert_upload\",\n                groupId: form.groupId,\n              });\n              router.push({\n                path: \"/certd/pipeline/detail\",\n                query: { id: id, editMode: \"true\" },\n              });\n            },\n          },\n        },\n      };\n    }\n    const { crudOptions } = createCrudOptions();\n    const wrapper = await openCrudFormDialog({ crudOptions });\n    wrapperRef.value = wrapper;\n  }\n\n  async function openUpdateCertDialog(opts: { onSubmit?: any }) {\n    function createCrudOptions() {\n      return {\n        crudOptions: {\n          columns: {\n            ...cloneDeep(certInputs),\n          },\n          form: {\n            wrapper: {\n              title: \"手动上传证书\",\n              saveRemind: false,\n            },\n            async afterSubmit() {},\n            async doSubmit({ form }: any) {\n              if (opts.onSubmit) {\n                await opts.onSubmit(form);\n              }\n            },\n          },\n        },\n      };\n    }\n    const { crudOptions } = createCrudOptions();\n    await openCrudFormDialog({ crudOptions });\n  }\n\n  return {\n    openUploadCreateDialog,\n    openUpdateCertDialog,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/cert-view.vue",
    "content": "<template>\n  <div class=\"cert-view\">\n    <a-list item-layout=\"vertical\" :data-source=\"certFiles\">\n      <template #renderItem=\"{ item }\">\n        <a-list-item key=\"item.key\">\n          <a-list-item-meta>\n            <template #title>\n              <div class=\"title\">\n                <div>{{ item.name }}({{ item.fileName }})</div>\n                <fs-copyable :model-value=\"item.content\" :button=\"{ show: false }\">\n                  <a-tag color=\"success\">复制</a-tag>\n                </fs-copyable>\n              </div>\n            </template>\n          </a-list-item-meta>\n          <div>\n            <a-textarea :value=\"item.content\" :rows=\"5\" />\n          </div>\n        </a-list-item>\n      </template>\n    </a-list>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { CertInfo } from \"/@/views/certd/pipeline/api\";\nimport { ref } from \"vue\";\n\nconst props = defineProps<{\n  cert: CertInfo;\n}>();\n\nconst certFiles = ref([\n  { name: \"证书\", fileName: \"fullchain.pem\", key: \"crt\", content: props.cert.crt },\n  { name: \"私钥\", fileName: \"private.pem\", key: \"key\", content: props.cert.key },\n  { name: \"中间证书\", fileName: \"chain.pem\", key: \"ic\", content: props.cert.ic },\n]);\n</script>\n\n<style lang=\"less\">\n.cert-view {\n  .title {\n    display: flex;\n    justify-content: space-between;\n  }\n  .ant-list-item-meta {\n    margin-block-end: 0px !important;\n    margin-top: 10px;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/certd-form/use.tsx",
    "content": "import { checkPipelineLimit } from \"/@/views/certd/pipeline/utils\";\nimport { cloneDeep, merge, omit } from \"lodash-es\";\nimport { message } from \"ant-design-vue\";\nimport { nanoid } from \"nanoid\";\nimport { useRouter } from \"vue-router\";\nimport { compute, CreateCrudOptionsRet, dict, useFormWrapper } from \"@fast-crud/fast-crud\";\nimport NotificationSelector from \"/@/views/certd/notification/notification-selector/index.vue\";\nimport { useReference } from \"/@/use/use-refrence\";\nimport { ref } from \"vue\";\nimport * as api from \"../api\";\nimport { PluginGroup, usePluginStore } from \"/@/store/plugin\";\nimport { createNotificationApi } from \"/@/views/certd/notification/api\";\nimport GroupSelector from \"../group/group-selector.vue\";\nimport { useI18n } from \"/src/locales\";\n\nexport function fillPipelineByDefaultForm(pipeline: any, form: any) {\n  const triggers = [];\n  if (form.triggerCron) {\n    triggers.push({ title: \"定时触发\", type: \"timer\", props: { cron: form.triggerCron } });\n  }\n  const notifications = [];\n  if (form.notification != null) {\n    notifications.push({\n      type: \"custom\",\n      when: [\"error\", \"turnToSuccess\", \"success\"],\n      notificationId: form.notification,\n      title: form.notificationTarget?.name || \"自定义通知\",\n    });\n  }\n  pipeline.triggers = triggers;\n  pipeline.notifications = notifications;\n  return pipeline;\n}\n\nexport function setRunnableIds(pipeline: any) {\n  const { t } = useI18n();\n  const idMap: any = {};\n  function createId(oldId: any) {\n    if (oldId == null) {\n      return nanoid();\n    }\n    const newId = nanoid();\n    idMap[oldId] = newId;\n    return newId;\n  }\n  if (pipeline.stages) {\n    for (const stage of pipeline.stages) {\n      stage.id = createId(stage.id);\n      if (stage.tasks) {\n        for (const task of stage.tasks) {\n          task.id = createId(task.id);\n          if (task.steps) {\n            for (const step of task.steps) {\n              step.id = createId(step.id);\n            }\n          }\n        }\n      }\n    }\n  }\n\n  for (const trigger of pipeline.triggers) {\n    trigger.id = nanoid();\n  }\n  for (const notification of pipeline.notifications) {\n    notification.id = nanoid();\n  }\n\n  let content = JSON.stringify(pipeline);\n  for (const key in idMap) {\n    content = content.replaceAll(key, idMap[key]);\n  }\n  return JSON.parse(content);\n}\n\nexport function useCertPipelineCreator() {\n  const { t } = useI18n();\n  const { openCrudFormDialog } = useFormWrapper();\n\n  const pluginStore = usePluginStore();\n  const router = useRouter();\n\n  function createCrudOptions(certPlugins: any[], getFormData: any, doSubmit: any): CreateCrudOptionsRet {\n    const inputs: any = {};\n    const moreParams = [];\n    for (const plugin of certPlugins) {\n      for (const inputKey in plugin.input) {\n        if (inputs[inputKey]) {\n          //如果两个插件有的字段，直接显示\n          inputs[inputKey].form.show = true;\n          continue;\n        }\n        const inputDefine = cloneDeep(plugin.input[inputKey]);\n        if (!inputDefine.required && !inputDefine.maybeNeed) {\n          moreParams.push(inputKey);\n          // continue;\n        }\n        useReference(inputDefine);\n        inputs[inputKey] = {\n          title: inputDefine.title,\n          form: {\n            ...inputDefine,\n            show: compute(ctx => {\n              const form = getFormData();\n              if (!form) {\n                return false;\n              }\n\n              let inputDefineShow = true;\n              if (inputDefine.show != null) {\n                const computeShow = inputDefine.show as any;\n                if (computeShow === false) {\n                  inputDefineShow = false;\n                } else if (computeShow && computeShow.computeFn) {\n                  inputDefineShow = computeShow.computeFn({ form });\n                }\n              }\n              return form?.certApplyPlugin === plugin.name && inputDefineShow;\n            }),\n          },\n        };\n      }\n    }\n\n    const pluginStore = usePluginStore();\n    const randomHour = Math.floor(Math.random() * 6);\n    const randomMin = Math.floor(Math.random() * 60);\n    const randomCron = `0 ${randomMin} ${randomHour} * * *`;\n\n    const groupDictRef = dict({\n      url: \"/pi/pipeline/group/all\",\n      value: \"id\",\n      label: \"name\",\n    });\n\n    return {\n      crudOptions: {\n        form: {\n          doSubmit,\n          wrapper: {\n            width: 1350,\n            saveRemind: false,\n            title: t(\"certd.pipelineForm.createTitle\"),\n          },\n          group: {\n            groups: {\n              more: {\n                header: t(\"certd.pipelineForm.moreParams\"),\n                columns: moreParams,\n                collapsed: true,\n              },\n            },\n          },\n        },\n        columns: {\n          certApplyPlugin: {\n            title: t(\"certd.plugin.selectTitle\"),\n            type: \"dict-select\",\n            dict: dict({\n              data: [\n                { value: \"CertApply\", label: \"JS-ACME\" },\n                { value: \"CertApplyLego\", label: \"Lego-ACME\" },\n              ],\n            }),\n            form: {\n              order: 0,\n              value: \"CertApply\",\n              helper: {\n                render: () => {\n                  return (\n                    <ul>\n                      <li>{t(\"certd.plugin.jsAcme\")}</li>\n                      <li>{t(\"certd.plugin.legoAcme\")}</li>\n                    </ul>\n                  );\n                },\n              },\n              valueChange: {\n                handle: async ({ form, value }) => {\n                  const config = await pluginStore.getPluginConfig({\n                    name: value,\n                    type: \"builtIn\",\n                  });\n                  if (config.sysSetting?.input) {\n                    merge(form, config.sysSetting.input);\n                  }\n                },\n                immediate: true,\n              },\n            },\n          },\n          ...inputs,\n          triggerCron: {\n            title: t(\"certd.pipelineForm.triggerCronTitle\"),\n            type: \"text\",\n            form: {\n              value: randomCron,\n              component: {\n                name: \"cron-editor\",\n                vModel: \"modelValue\",\n                placeholder: \"0 0 4 * * *\",\n              },\n              helper: t(\"certd.pipelineForm.triggerCronHelper\"),\n              order: 100,\n            },\n          },\n          notification: {\n            title: t(\"certd.pipelineForm.notificationTitle\"),\n            type: \"text\",\n            form: {\n              value: 0,\n              component: {\n                name: NotificationSelector,\n                vModel: \"modelValue\",\n                on: {\n                  selectedChange({ $event, form }) {\n                    form.notificationTarget = $event;\n                  },\n                },\n              },\n              order: 101,\n              helper: t(\"certd.pipelineForm.notificationHelper\"),\n            },\n          },\n          groupId: {\n            title: t(\"certd.pipelineForm.groupIdTitle\"),\n            type: \"dict-select\",\n            dict: groupDictRef,\n            form: {\n              component: {\n                name: GroupSelector,\n                vModel: \"modelValue\",\n              },\n              order: 9999,\n            },\n          },\n        },\n      },\n    };\n  }\n\n  async function getCertPlugins() {\n    const pluginGroup = await pluginStore.getGroups();\n    const pluginGroups: { [key: string]: PluginGroup } = pluginGroup.groups;\n    const certPluginGroup = pluginGroups.cert;\n\n    const certPlugins = [];\n    for (const plugin of certPluginGroup.plugins) {\n      const detail: any = await pluginStore.getPluginDefine(plugin.name);\n      certPlugins.push(detail);\n    }\n    return certPlugins;\n  }\n\n  async function openAddCertdPipelineDialog(req: { defaultGroupId?: number }) {\n    //检查是否流水线数量超出限制\n    await checkPipelineLimit();\n\n    const wrapperRef = ref();\n    function getFormData() {\n      if (!wrapperRef.value) {\n        return null;\n      }\n      return wrapperRef.value.getFormData();\n    }\n\n    async function doSubmit({ form }: any) {\n      // const certDetail = readCertDetail(form.cert.crt);\n      // 添加certd pipeline\n      const pluginInput = omit(form, [\"triggerCron\", \"notification\", \"notificationTarget\", \"certApplyPlugin\", \"groupId\"]);\n      let pipeline: any = {\n        title: form.domains[0] + \"证书自动化\",\n        runnableType: \"pipeline\",\n        stages: [\n          {\n            title: \"证书申请阶段\",\n            maxTaskCount: 1,\n            runnableType: \"stage\",\n            tasks: [\n              {\n                title: \"证书申请任务\",\n                runnableType: \"task\",\n                steps: [\n                  {\n                    title: \"申请证书\",\n                    runnableType: \"step\",\n                    input: {\n                      renewDays: 35,\n                      ...pluginInput,\n                    },\n                    strategy: {\n                      runStrategy: 0, // 正常执行\n                    },\n                    type: form.certApplyPlugin,\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      };\n\n      pipeline = fillPipelineByDefaultForm(pipeline, form);\n\n      pipeline = setRunnableIds(pipeline);\n      const groupId = form.groupId;\n      const id = await api.Save({\n        title: pipeline.title,\n        content: JSON.stringify(pipeline),\n        keepHistoryCount: 30,\n        type: \"cert\",\n        groupId,\n      });\n      if (form.email) {\n        try {\n          //创建一个默认的邮件通知\n          const notificationApi = createNotificationApi();\n          await notificationApi.GetOrCreateDefault({ email: form.email });\n        } catch (e) {\n          console.error(e);\n        }\n      }\n      message.success(\"创建成功,请添加证书部署任务\");\n      router.push({ path: \"/certd/pipeline/detail\", query: { id, editMode: \"true\" } });\n    }\n    const certPlugins = await getCertPlugins();\n    const { crudOptions } = createCrudOptions(certPlugins, getFormData, doSubmit);\n    //@ts-ignore\n    crudOptions.columns.groupId.form.value = req.defaultGroupId || undefined;\n    const wrapper = await openCrudFormDialog({ crudOptions });\n    wrapperRef.value = wrapper;\n  }\n\n  return {\n    openAddCertdPipelineDialog,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/components/change-group.vue",
    "content": "<template>\n  <fs-button icon=\"mdi:format-list-group\" type=\"link\" text=\"修改分组\" @click=\"openGroupSelectDialog\"></fs-button>\n</template>\n<script setup lang=\"ts\">\nimport * as api from \"../api\";\nimport { notification } from \"ant-design-vue\";\nimport { dict, useFormWrapper } from \"@fast-crud/fast-crud\";\n\nconst props = defineProps<{\n  selectedRowKeys: any[];\n}>();\n\nconst emit = defineEmits<{\n  change: any;\n}>();\nasync function batchUpdateGroupRequest(groupId: number) {\n  await api.BatchUpdateGroup(props.selectedRowKeys, groupId);\n  emit(\"change\");\n}\n\nconst pipelineGroupDictRef = dict({\n  url: \"/pi/pipeline/group/all\",\n  value: \"id\",\n  label: \"name\",\n});\nconst { openCrudFormDialog } = useFormWrapper();\n\nasync function openGroupSelectDialog() {\n  const crudOptions: any = {\n    columns: {\n      groupId: {\n        title: \"分组\",\n        type: \"dict-select\",\n        dict: pipelineGroupDictRef,\n        form: {\n          rules: [{ required: true, message: \"请选择分组\" }],\n        },\n      },\n    },\n    form: {\n      mode: \"edit\",\n      //@ts-ignore\n      async doSubmit({ form }) {\n        await batchUpdateGroupRequest(form.groupId);\n      },\n      col: {\n        span: 22,\n      },\n      labelCol: {\n        style: {\n          width: \"100px\",\n        },\n      },\n      wrapper: {\n        title: \"批量修改分组\",\n        width: 600,\n      },\n    },\n  } as any;\n  await openCrudFormDialog({ crudOptions });\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/components/change-notification.vue",
    "content": "<template>\n  <fs-button icon=\"mdi:format-list-group\" type=\"link\" text=\"修改通知\" @click=\"openFormDialog\"></fs-button>\n</template>\n<script setup lang=\"ts\">\nimport * as api from \"../api\";\nimport { useFormWrapper } from \"@fast-crud/fast-crud\";\nimport NotificationSelector from \"/@/views/certd/notification/notification-selector/index.vue\";\nimport { ref } from \"vue\";\n\nconst props = defineProps<{\n  selectedRowKeys: any[];\n}>();\n\nconst emit = defineEmits<{\n  change: any;\n}>();\nasync function batchUpdateRequest(form: any) {\n  /**\n   * type: NotificationType;\n   *   when: NotificationWhen[];\n   *   options?: EmailOptions;\n   *   notificationId: number;\n   *   title: string;\n   */\n  await api.BatchUpdateNotificaiton(props.selectedRowKeys, {\n    type: \"other\",\n    title: form.title || \"通知\",\n    when: form.when,\n    notificationId: form.notificationId,\n  });\n  emit(\"change\");\n}\n\nconst { openCrudFormDialog } = useFormWrapper();\n\nasync function openFormDialog() {\n  const crudOptions: any = {\n    columns: {\n      when: {\n        title: \"触发时机\",\n        form: {\n          value: [\"error\", \"turnToSuccess\"],\n          component: {\n            name: \"a-select\",\n            vModel: \"value\",\n            mode: \"multiple\",\n            options: [\n              { value: \"start\", label: \"开始时\" },\n              { value: \"success\", label: \"成功时\" },\n              { value: \"turnToSuccess\", label: \"失败转成功时\" },\n              { value: \"error\", label: \"失败时\" },\n            ],\n          },\n          helper: `建议仅选择'失败时'和'失败转成功'两种即可`,\n          rules: [{ required: true, message: \"此项必填\" }],\n        },\n      },\n      notificationId: {\n        title: \"通知配置\",\n        form: {\n          component: {\n            name: NotificationSelector,\n            on: {\n              selectedChange({ form, $event }: any) {\n                form.title = $event?.name || \"通知\";\n              },\n            },\n          },\n          helper: \"请选择通知方式\",\n          rules: [{ required: true, message: \"此项必填\" }],\n        },\n      },\n    },\n    form: {\n      mode: \"edit\",\n      //@ts-ignore\n      async doSubmit({ form }) {\n        await batchUpdateRequest(form);\n      },\n      col: {\n        span: 22,\n      },\n      labelCol: {\n        style: {\n          width: \"100px\",\n        },\n      },\n      wrapper: {\n        title: \"批量修改通知\",\n        width: 600,\n      },\n    },\n  } as any;\n  await openCrudFormDialog({ crudOptions });\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/components/change-trigger.vue",
    "content": "<template>\n  <fs-button icon=\"mdi:format-list-group\" type=\"link\" :text=\"t('certd.editSchedule')\" @click=\"openFormDialog\"></fs-button>\n</template>\n\n<script setup lang=\"ts\">\nimport * as api from \"../api\";\nimport { useFormWrapper } from \"@fast-crud/fast-crud\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\nconst props = defineProps<{\n  selectedRowKeys: any[];\n}>();\n\nconst emit = defineEmits<{\n  change: any;\n}>();\nasync function batchUpdateRequest(form: any) {\n  await api.BatchUpdateTrigger(props.selectedRowKeys, {\n    title: \"定时触发\",\n    type: \"timer\",\n    props: form.props,\n  });\n  emit(\"change\");\n}\n\nconst { openCrudFormDialog } = useFormWrapper();\n\nasync function openFormDialog() {\n  const crudOptions: any = {\n    columns: {\n      \"props.cron\": {\n        title: t(\"certd.schedule\"),\n        form: {\n          component: {\n            name: \"cron-editor\",\n            vModel: \"modelValue\",\n          },\n          rules: [{ required: true, message: t(\"certd.selectCron\") }],\n        },\n      },\n    },\n    form: {\n      mode: \"edit\",\n      //@ts-ignore\n      async doSubmit({ form }) {\n        await batchUpdateRequest(form);\n      },\n      col: {\n        span: 22,\n      },\n      labelCol: {\n        style: {\n          width: \"100px\",\n        },\n      },\n      wrapper: {\n        title: t(\"certd.batchEditSchedule\"),\n        width: 600,\n      },\n    },\n  } as any;\n  await openCrudFormDialog({ crudOptions });\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/crud.tsx",
    "content": "import * as api from \"./api\";\nimport { computed, ref } from \"vue\";\nimport { useRouter } from \"vue-router\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes, useUi } from \"@fast-crud/fast-crud\";\nimport { statusUtil } from \"/@/views/certd/pipeline/pipeline/utils/util.status\";\nimport { Modal, notification } from \"ant-design-vue\";\nimport { useUserStore } from \"/@/store/user\";\nimport dayjs from \"dayjs\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { cloneDeep } from \"lodash-es\";\nimport { eachStages } from \"./utils\";\nimport { setRunnableIds, useCertPipelineCreator } from \"/@/views/certd/pipeline/certd-form/use\";\nimport { useCertUpload } from \"/@/views/certd/pipeline/cert-upload/use\";\nimport GroupSelector from \"/@/views/certd/pipeline/group/group-selector.vue\";\nimport { useCertViewer } from \"/@/views/certd/pipeline/use\";\nimport { useI18n } from \"/src/locales\";\n\nexport default function ({ crudExpose, context: { groupDictRef, selectedRowKeys } }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const router = useRouter();\n  const lastResRef = ref();\n\n  const { t } = useI18n();\n\n  const { openAddCertdPipelineDialog } = useCertPipelineCreator();\n  const { openUploadCreateDialog } = useCertUpload();\n\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    lastResRef.value = res;\n    return res;\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    if (form.content == null) {\n      form.content = JSON.stringify({\n        title: form.title,\n      });\n    } else {\n      //复制的流水线\n      delete form.status;\n      delete form.lastHistoryTime;\n      delete form.lastVars;\n      delete form.createTime;\n      delete form.id;\n      let pipeline = JSON.parse(form.content);\n      pipeline.title = form.title;\n      pipeline = setRunnableIds(pipeline);\n      form.content = JSON.stringify(pipeline);\n    }\n\n    const res = await api.AddObj(form);\n    lastResRef.value = res;\n    return res;\n  };\n\n  const { viewCert, downloadCert } = useCertViewer();\n  const userStore = useUserStore();\n  const settingStore = useSettingStore();\n\n  function onDialogOpen(opt: any) {\n    const searchForm = crudExpose.getSearchValidatedFormData();\n    opt.initialForm = {\n      ...opt.initialForm,\n      groupId: searchForm.groupId,\n    };\n  }\n\n  return {\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      settings: {\n        plugins: {\n          //行选择插件，内置插件\n          rowSelection: {\n            //是否启用本插件\n            enabled: true,\n            order: -2,\n            //合并在用户配置crudOptions之前还是之后\n            before: true,\n            props: {\n              multiple: true,\n              crossPage: false,\n              selectedRowKeys,\n              onSelectedChanged(selected) {\n                console.log(\"已选择变化：\", selected);\n              },\n            },\n          },\n        },\n      },\n      actionbar: {\n        buttons: {\n          add: {\n            order: 5,\n            icon: \"ion:ios-add-circle-outline\",\n            text: t(\"certd.customPipeline\"),\n          },\n          addCertd: {\n            order: 1,\n            text: t(\"certd.createCertdPipeline\"),\n            type: \"primary\",\n            icon: \"ion:ios-add-circle-outline\",\n            click() {\n              const searchForm = crudExpose.getSearchValidatedFormData();\n              const defaultGroupId = searchForm.groupId;\n              openAddCertdPipelineDialog({ defaultGroupId });\n            },\n          },\n          uploadCert: {\n            order: 2,\n            text: t(\"certd.commercialCertHosting\"),\n            type: \"primary\",\n            tooltip: {\n              slots: {\n                title() {\n                  return (\n                    <ul>\n                      <li>{t(\"certd.tooltip.manualUploadOwnCert\")}</li>\n                      <li>{t(\"certd.tooltip.noAutoApplyCommercialCert\")}</li>\n                      <li>{t(\"certd.tooltip.manualUploadOnUpdate\")}</li>\n                    </ul>\n                  );\n                },\n              },\n            },\n            icon: \"ion:cloud-upload-outline\",\n            click() {\n              const searchForm = crudExpose.getSearchValidatedFormData();\n              openUploadCreateDialog({ defaultGroupId: searchForm.groupId });\n            },\n          },\n        },\n      },\n      form: {\n        afterSubmit({ form, res, mode }) {\n          if (mode === \"add\") {\n            router.push({ path: \"/certd/pipeline/detail\", query: { id: res.id, editMode: \"true\" } });\n          }\n        },\n        wrapper: {\n          onOpen: onDialogOpen,\n        },\n      },\n      table: {\n        scroll: { x: 1500 },\n        remove: {\n          confirmTitle: t(\"certd.table.confirmDeleteTitle\"),\n          confirmMessage: t(\"certd.table.confirmDeleteMessage\"),\n        },\n      },\n      tabs: {\n        name: \"groupId\",\n        show: true,\n      },\n      rowHandle: {\n        width: 200,\n        fixed: \"right\",\n        dropdown: {\n          show: true,\n        },\n        buttons: {\n          play: {\n            order: -999,\n            title: t(\"certd.play.runPipeline\"),\n            tooltip: { title: t(\"certd.play.runPipeline\") },\n            type: \"link\",\n            icon: \"ant-design:play-circle-outlined\",\n            click({ row }) {\n              Modal.confirm({\n                title: t(\"certd.play.confirm\"),\n                content: t(\"certd.play.confirmTrigger\"),\n                async onOk() {\n                  await api.Trigger(row.id);\n                  notification.success({ message: t(\"certd.play.pipelineStarted\") });\n                },\n              });\n            },\n          },\n          view: {\n            show: false,\n            click({ row }) {\n              router.push({ path: \"/certd/pipeline/detail\", query: { id: row.id, editMode: \"false\" } });\n            },\n          },\n          copy: {\n            click: async context => {\n              settingStore.checkPlus();\n              const { ui } = useUi();\n              // @ts-ignore\n              let row = context[ui.tableColumn.row];\n              row = cloneDeep(row);\n              row.title = row.title + \"_copy\";\n              await crudExpose.openCopy({\n                row: row,\n                index: context.index,\n              });\n            },\n            class: \"need-plus\",\n          },\n          config: {\n            order: 1,\n            title: t(\"certd.actions.editPipeline\"),\n            type: \"link\",\n            dropdown: true,\n            icon: \"ant-design:edit-outlined\",\n            click({ row }) {\n              router.push({ path: \"/certd/pipeline/detail\", query: { id: row.id, editMode: \"true\" } });\n            },\n          },\n          edit: {\n            order: 2,\n            title: t(\"certd.actions.editConfigGroup\"),\n            icon: \"ant-design:setting-outlined\",\n            dropdown: true,\n          },\n          viewCert: {\n            order: 3,\n            title: t(\"certd.actions.viewCertificate\"),\n            tooltip: { title: t(\"certd.actions.viewCertificate\") },\n            type: \"link\",\n            icon: \"ph:certificate\",\n            async click({ row }) {\n              await viewCert(row.id);\n            },\n          },\n          download: {\n            order: 4,\n            type: \"link\",\n            title: t(\"certd.actions.downloadCertificate\"),\n            tooltip: { title: t(\"certd.actions.downloadCertificate\") },\n            icon: \"ant-design:download-outlined\",\n            async click({ row }) {\n              await downloadCert(row.id);\n            },\n          },\n          remove: {\n            order: 5,\n            dropdown: true,\n          },\n        },\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          search: {\n            show: true,\n          },\n          column: {\n            width: 100,\n          },\n          form: {\n            show: false,\n          },\n        },\n        userId: {\n          title: t(\"certd.fields.userId\"),\n          type: \"number\",\n          search: {\n            show: computed(() => {\n              return userStore.isAdmin && settingStore.sysPublic.managerOtherUserPipeline;\n            }),\n          },\n          form: {\n            show: false,\n          },\n          column: {\n            show: computed(() => {\n              return userStore.isAdmin && settingStore.sysPublic.managerOtherUserPipeline;\n            }),\n            width: 100,\n          },\n        },\n        title: {\n          title: t(\"certd.fields.pipelineName\"),\n          type: \"link\",\n          search: {\n            show: true,\n            title: t(\"certd.fields.keyword\"),\n            component: {\n              name: \"a-input\",\n            },\n          },\n          form: {\n            rules: [{ required: true, message: t(\"certd.fields.required\") }],\n          },\n          column: {\n            width: 350,\n            ellipsis: true,\n            sorter: true,\n            showTitle: true,\n            cellRender: ({ row, value }) => {\n              return <router-link to={{ path: \"/certd/pipeline/detail\", query: { id: row.id, editMode: false } }}>{value}</router-link>;\n            },\n          },\n        },\n        content: {\n          title: t(\"certd.fields.pipelineContent\"),\n          form: { show: false },\n          column: {\n            show: false,\n          },\n          valueBuilder({ row }) {\n            if (row.content) {\n              row.content = JSON.parse(row.content);\n              const pipeline = row.content;\n              let stepCount = 0;\n              eachStages(pipeline.stages, (item, runnableType) => {\n                if (runnableType === \"step\") {\n                  stepCount++;\n                }\n              });\n              row._stepCount = stepCount;\n              if (pipeline.triggers) {\n                row._triggerCount = pipeline.triggers?.length > 0 ? pipeline.triggers.length : \"-\";\n              }\n            }\n          },\n          valueResolve({ row }) {\n            if (row.content) {\n              row.content = JSON.stringify(row.content);\n            }\n          },\n        },\n        triggerCount: {\n          title: t(\"certd.fields.scheduledTaskCount\"),\n          type: \"number\",\n          column: {\n            align: \"center\",\n            width: 100,\n          },\n          form: {\n            show: false,\n          },\n        },\n        stepCount: {\n          title: t(\"certd.fields.deployTaskCount\"),\n          type: \"number\",\n          form: { show: false },\n          column: {\n            align: \"center\",\n            width: 100,\n          },\n        },\n        lastVars: {\n          title: t(\"certd.fields.remainingValidity\"),\n          type: \"number\",\n          form: {\n            show: false,\n          },\n          column: {\n            cellRender({ row }) {\n              const value = row.lastVars?.certExpiresTime;\n              if (!value) {\n                return \"-\";\n              }\n              const expireDate = dayjs(value).format(\"YYYY-MM-DD\");\n              const leftDays = dayjs(value).diff(dayjs(), \"day\");\n              const color = leftDays < 20 ? \"red\" : \"#389e0d\";\n              const percent = (leftDays / 90) * 100;\n              const textColor = leftDays < 20 ? \"red\" : leftDays > 60 ? \"#389e0d\" : \"\";\n              const format = () => {\n                return <span style={{ color: textColor }}>{`${leftDays}${t(\"certd.days\")}`}</span>;\n              };\n              return <a-progress title={expireDate + t(\"certd.expires\")} percent={percent} strokeColor={color} format={format} />;\n            },\n            width: 150,\n          },\n        },\n        \"lastVars.certExpiresTime\": {\n          title: t(\"certd.fields.expiryTime\"),\n          search: {\n            show: false,\n          },\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: false,\n            width: 150,\n            align: \"center\",\n          },\n        },\n        status: {\n          title: t(\"certd.fields.status\"),\n          type: \"dict-select\",\n          search: {\n            show: true,\n          },\n          dict: dict({\n            data: statusUtil.getOptions(),\n          }),\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 120,\n            align: \"center\",\n          },\n        },\n        lastHistoryTime: {\n          title: t(\"certd.fields.lastRun\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 150,\n            align: \"center\",\n          },\n        },\n        disabled: {\n          title: t(\"certd.fields.enabled\"),\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { value: false, label: t(\"certd.fields.enabledLabel\") },\n              { value: true, label: t(\"certd.fields.disabledLabel\") },\n            ],\n          }),\n          form: {\n            value: false,\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 80,\n            align: \"center\",\n            component: {\n              name: \"fs-dict-switch\",\n              vModel: \"checked\",\n            },\n            async valueChange({ row, key, value }) {\n              return await api.UpdateObj({\n                id: row.id,\n                disabled: row[key],\n              });\n            },\n          },\n        },\n        groupId: {\n          title: t(\"certd.fields.group\"),\n          type: \"dict-select\",\n          search: {\n            show: true,\n          },\n          dict: groupDictRef,\n          form: {\n            component: {\n              name: GroupSelector,\n              vModel: \"modelValue\",\n            },\n          },\n          column: {\n            width: 130,\n            align: \"center\",\n            component: {\n              color: \"auto\",\n            },\n            sorter: true,\n          },\n        },\n        type: {\n          title: t(\"certd.fields.type\"),\n          type: \"dict-select\",\n          search: {\n            show: true,\n          },\n          dict: dict({\n            data: [\n              { value: \"cert\", label: t(\"certd.types.certApply\") },\n              { value: \"cert_upload\", label: t(\"certd.types.certUpload\") },\n              { value: \"custom\", label: t(\"certd.types.custom\") },\n              { value: \"template\", label: \"模版\" },\n            ],\n          }),\n          form: {\n            show: false,\n            value: \"custom\",\n          },\n          column: {\n            sorter: true,\n            width: 90,\n            align: \"center\",\n            show: true,\n            component: {\n              color: \"auto\",\n            },\n          },\n        },\n        order: {\n          title: t(\"certd.fields.order\"),\n          type: \"number\",\n          column: {\n            sorter: true,\n            align: \"center\",\n            width: 80,\n          },\n          form: {\n            value: 0,\n          },\n        },\n        keepHistoryCount: {\n          title: t(\"certd.fields.keepHistoryCount\"),\n          type: \"number\",\n          form: {\n            value: 20,\n            helper: t(\"certd.fields.keepHistoryHelper\"),\n          },\n          column: {\n            width: 130,\n            show: false,\n            sorter: true,\n          },\n        },\n        createTime: {\n          title: t(\"certd.fields.createTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 155,\n            align: \"center\",\n          },\n        },\n        updateTime: {\n          title: t(\"certd.fields.updateTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 125,\n            show: false,\n            sorter: true,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/dash-roll.readme",
    "content": "https://stackoverflow.com/questions/28365839/dashed-border-animation-in-css3-animation"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/detail.vue",
    "content": "<template>\n  <fs-page class=\"fs-pipeline-detail\">\n    <pipeline-edit v-model:edit-mode=\"editMode\" :pipeline-id=\"pipelineId\" :history-id=\"historyId\" :options=\"pipelineOptionsRef\"></pipeline-edit>\n    <a-tour v-bind=\"tour\" v-model:current=\"tour.current\" />\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { nextTick, Ref, ref } from \"vue\";\nimport PipelineEdit from \"./pipeline/index.vue\";\nimport * as historyApi from \"./api.history\";\nimport * as api from \"./api\";\nimport { useRoute } from \"vue-router\";\nimport { PipelineDetail, PipelineOptions, RunHistory } from \"./pipeline/type\";\nimport { LocalStorage } from \"/@/utils/util.storage\";\nimport { useUserStore } from \"/@/store/user\";\nimport { usePluginStore, PluginGroups } from \"/@/store/plugin\";\n\ndefineOptions({\n  name: \"PipelineDetail\",\n});\nconst route = useRoute();\nconst pipelineId: Ref = ref(route.query.id);\nconst historyId = ref(route.query.historyId as string);\nconst pluginStore = usePluginStore();\nconst pipelineOptions: PipelineOptions = {\n  async getPipelineDetail({ pipelineId }) {\n    const detail = await api.GetDetail(pipelineId);\n    onLoaded(detail);\n    return {\n      pipeline: {\n        id: detail.pipeline.id,\n        userId: detail.pipeline.userId,\n        stages: [],\n        triggers: [],\n        ...JSON.parse(detail.pipeline.content || \"{}\"),\n        type: detail.pipeline.type,\n        from: detail.pipeline.from,\n      },\n    } as PipelineDetail;\n  },\n\n  async getHistoryList({ pipelineId }) {\n    const list: RunHistory[] = await historyApi.GetList({ pipelineId });\n    return list;\n  },\n\n  async getHistoryDetail({ historyId }): Promise<RunHistory> {\n    const detail = await historyApi.GetDetail({ id: historyId });\n    return detail;\n  },\n\n  async getPluginGroups(): Promise<PluginGroups> {\n    return await pluginStore.getGroups();\n  },\n\n  async doSave(pipelineConfig: any) {\n    await api.Save({\n      id: pipelineConfig.id,\n      content: JSON.stringify(pipelineConfig),\n    });\n  },\n  async doTrigger(options: { pipelineId: number; stepId?: string }) {\n    const { pipelineId, stepId } = options;\n    await api.Trigger(pipelineId, stepId);\n  },\n};\n\nconst pipelineOptionsRef: Ref<PipelineOptions> = ref(pipelineOptions);\n\nconst editMode = ref(false);\nif (route.query.editMode === \"true\") {\n  editMode.value = true;\n}\n\nfunction useTour() {\n  const tour = ref({\n    open: false,\n    current: 0,\n    steps: [],\n    onClose: () => {\n      tour.value.open = false;\n    },\n    onFinish: () => {\n      tour.value.open = false;\n      LocalStorage.set(\"tour-off\", true, 999999999);\n    },\n  });\n\n  const tourHandleOpen = (val: boolean): void => {\n    initSteps();\n    tour.value.open = val;\n  };\n\n  function initSteps() {\n    //@ts-ignore\n    tour.value.steps = [\n      {\n        title: \"恭喜创建证书流水线成功\",\n        description: \"这里就是我们刚创建的证书任务，点击可以修改证书申请参数\",\n        target: () => {\n          return document.querySelector(\".pipeline .stages .stage_0 .task\");\n        },\n      },\n      {\n        title: \"添加部署证书任务\",\n        description: \"证书申请成功之后还需要部署证书，点击这里可以添加证书部署任务\",\n        target: () => {\n          return document.querySelector(\".pipeline .stages .last-stage .tasks .task\");\n        },\n      },\n      {\n        title: \"手动运行流水线\",\n        description: \"点击此处可以手动运行流水线\",\n        target: () => {\n          return document.querySelector(\".pipeline .stages .first-stage .tasks .task\");\n        },\n      },\n    ];\n  }\n\n  return {\n    tour,\n    tourHandleOpen,\n  };\n}\n\nconst { tour, tourHandleOpen } = useTour();\n\nconst userStore = useUserStore();\nasync function onLoaded(pipeline: PipelineDetail) {\n  if (pipeline.pipeline?.userId !== userStore.getUserInfo?.id) {\n    return;\n  }\n  const count = LocalStorage.get(\"pipeline-count\") ?? 0;\n  if (count > 1) {\n    return;\n  }\n  const off = LocalStorage.get(\"tour-off\") ?? false;\n  if (off) {\n    return;\n  }\n  const res = await api.GetCount();\n  LocalStorage.set(\"pipeline-count\", res.count);\n  if (res.count <= 1 && editMode.value === true) {\n    await nextTick();\n    tourHandleOpen(true);\n  }\n}\n</script>\n<style lang=\"less\">\n.page-pipeline-detail {\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/group/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nexport function createApi() {\n  const apiPrefix = \"/pi/pipeline/group\";\n  return {\n    async GetList(query: any) {\n      return await request({\n        url: apiPrefix + \"/page\",\n        method: \"post\",\n        data: query,\n      });\n    },\n\n    async AddObj(obj: any) {\n      return await request({\n        url: apiPrefix + \"/add\",\n        method: \"post\",\n        data: obj,\n      });\n    },\n\n    async UpdateObj(obj: any) {\n      return await request({\n        url: apiPrefix + \"/update\",\n        method: \"post\",\n        data: obj,\n      });\n    },\n\n    async DelObj(id: number) {\n      return await request({\n        url: apiPrefix + \"/delete\",\n        method: \"post\",\n        params: { id },\n      });\n    },\n\n    async GetObj(id: number) {\n      return await request({\n        url: apiPrefix + \"/info\",\n        method: \"post\",\n        params: { id },\n      });\n    },\n    async ListAll() {\n      return await request({\n        url: apiPrefix + \"/all\",\n        method: \"post\",\n      });\n    },\n  };\n}\n\nexport const pipelineGroupApi = createApi();\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/group/crud.tsx",
    "content": "import { useI18n } from \"/src/locales\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { pipelineGroupApi } from \"./api\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { t } = useI18n();\n  const api = pipelineGroupApi;\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async (req: EditReq) => {\n    const { form, row } = req;\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async (req: DelReq) => {\n    const { row } = req;\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async (req: AddReq) => {\n    const { form } = req;\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  return {\n    crudOptions: {\n      settings: {\n        plugins: {\n          mobile: {\n            props: {\n              rowHandle: {\n                width: 160,\n              },\n            },\n          },\n        },\n      },\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      form: {\n        labelCol: {\n          //固定label宽度\n          span: null,\n          style: {\n            width: \"100px\",\n          },\n        },\n        col: {\n          span: 22,\n        },\n        wrapper: {\n          width: 600,\n        },\n      },\n      rowHandle: {\n        width: 200,\n        group: {\n          editable: {\n            edit: {\n              text: t(\"certd.edit\"),\n              order: -1,\n              type: \"primary\",\n              click({ row, index }) {\n                crudExpose.openEdit({\n                  index,\n                  row,\n                });\n              },\n            },\n          },\n        },\n      },\n      table: {\n        editable: {\n          enabled: true,\n          mode: \"cell\",\n          exclusive: true,\n          //排他式激活效果，将其他行的编辑状态触发保存\n          exclusiveEffect: \"save\", //自动保存其他行编辑状态，cancel = 自动关闭其他行编辑状态\n          async updateCell(opts) {\n            const { row, key, value } = opts;\n            //如果是添加，需要返回{[rowKey]:xxx},比如:{id:2}\n            return await api.UpdateObj({ id: row.id, [key]: value });\n          },\n        },\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          search: {\n            show: true,\n          },\n          column: {\n            width: 100,\n            editable: {\n              disabled: true,\n            },\n          },\n          form: {\n            show: false,\n          },\n        },\n        name: {\n          title: t(\"certd.groupName\"),\n          search: {\n            show: true,\n          },\n          type: \"text\",\n          form: {\n            rules: [\n              {\n                required: true,\n                message: t(\"certd.enterGroupName\"),\n              },\n            ],\n          },\n          column: {\n            width: 400,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/group/group-selector.vue",
    "content": "<template>\n  <div class=\"pi-group-selector flex full-w\">\n    <div class=\"flex-1\">\n      <fs-dict-select :value=\"modelValue\" :dict=\"groupDictRef\" :allow-clear=\"true\" @update:value=\"doUpdate\"></fs-dict-select>\n    </div>\n\n    <fs-table-select\n      class=\"flex-0\"\n      :create-crud-options=\"createCrudOptions\"\n      :crud-options-override=\"{\n        search: { show: false },\n        table: {\n          scroll: {\n            x: 540,\n          },\n        },\n      }\"\n      :model-value=\"modelValue\"\n      :dict=\"groupDictRef\"\n      :show-current=\"false\"\n      :show-select=\"false\"\n      :dialog=\"{ width: 960 }\"\n      :destroy-on-close=\"false\"\n      height=\"400px\"\n      @update:model-value=\"doUpdate\"\n      @dialog-closed=\"doRefresh\"\n    >\n      <template #default=\"scope\">\n        <fs-button class=\"ml-5\" type=\"primary\" icon=\"ant-design:edit-outlined\" @click=\"scope.open\"></fs-button>\n      </template>\n    </fs-table-select>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport createCrudOptions from \"./crud\";\nimport { dict, FsDictSelect } from \"@fast-crud/fast-crud\";\n\nconst props = defineProps<{\n  modelValue?: number;\n}>();\n\ndefineOptions({\n  name: \"GroupSelector\",\n});\nconst groupDictRef = dict({\n  url: \"/pi/pipeline/group/all\",\n  value: \"id\",\n  label: \"name\",\n});\nconst emit = defineEmits([\"refresh\", \"update:modelValue\"]);\nfunction doRefresh() {\n  emit(\"refresh\");\n  groupDictRef.reloadDict();\n}\n\nfunction doUpdate(value: any) {\n  emit(\"update:modelValue\", value);\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/group/index.vue",
    "content": "<template>\n  <fs-page>\n    <template #header>\n      <div class=\"title\">\n        流水线分组管理\n        <span class=\"sub\">管理流水线分组</span>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { createApi } from \"./api\";\n\nexport default defineComponent({\n  name: \"PipelineGroupManager\",\n  setup() {\n    const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: {} });\n\n    // 页面打开后获取列表数据\n    onMounted(() => {\n      crudExpose.doRefresh();\n    });\n    onActivated(() => {\n      crudExpose.doRefresh();\n    });\n\n    return {\n      crudBinding,\n      crudRef,\n    };\n  },\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/index.vue",
    "content": "<template>\n  <fs-page class=\"page-cert\">\n    <template #header>\n      <div class=\"title\">{{ t(\"certd.myPipelines\") }}</div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\">\n      <div v-if=\"selectedRowKeys.length > 0\" class=\"batch-actions\">\n        <div class=\"batch-actions-inner\">\n          <span>{{ t(\"certd.selectedCount\", { count: selectedRowKeys.length }) }}</span>\n          <fs-button icon=\"ion:trash-outline\" class=\"color-red\" type=\"link\" :text=\"t('certd.batchDelete')\" @click=\"batchDelete\"></fs-button>\n          <fs-button icon=\"icon-park-outline:replay-music\" class=\"need-plus\" type=\"link\" :text=\"t('certd.batchForceRerun')\" @click=\"batchRerun\"></fs-button>\n          <change-group class=\"color-green\" :selected-row-keys=\"selectedRowKeys\" @change=\"batchFinished\"></change-group>\n          <change-notification class=\"color-green\" :selected-row-keys=\"selectedRowKeys\" @change=\"batchFinished\"></change-notification>\n          <change-trigger class=\"color-green\" :selected-row-keys=\"selectedRowKeys\" @change=\"batchFinished\"></change-trigger>\n        </div>\n      </div>\n      <template #actionbar-right> </template>\n      <template #form-bottom>\n        <div>{{ t(\"certd.applyCertificate\") }}</div>\n      </template>\n    </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted, ref } from \"vue\";\nimport { dict, useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport PiCertdForm from \"./certd-form/index.vue\";\nimport ChangeGroup from \"./components/change-group.vue\";\nimport ChangeTrigger from \"./components/change-trigger.vue\";\nimport { Modal, notification } from \"ant-design-vue\";\nimport * as api from \"./api\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\nimport ChangeNotification from \"/@/views/certd/pipeline/components/change-notification.vue\";\n\ndefineOptions({\n  name: \"PipelineManager\",\n});\n\nconst groupDictRef = dict({\n  url: \"/pi/pipeline/group/all\",\n  value: \"id\",\n  label: \"name\",\n});\nconst selectedRowKeys = ref([]);\nconst context: any = {\n  groupDictRef,\n  selectedRowKeys,\n};\nconst { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context });\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\n\nonActivated(async () => {\n  await groupDictRef.reloadDict();\n  await crudExpose.doRefresh();\n});\n\nfunction batchFinished() {\n  crudExpose.doRefresh();\n  selectedRowKeys.value = [];\n}\nfunction batchDelete() {\n  Modal.confirm({\n    title: \"确认删除\",\n    content: \"确定要删除选中的数据吗？\",\n    async onOk() {\n      await api.BatchDelete(selectedRowKeys.value);\n      notification.success({ message: \"删除成功\" });\n      await crudExpose.doRefresh();\n      selectedRowKeys.value = [];\n    },\n  });\n}\n\nfunction batchRerun() {\n  Modal.confirm({\n    title: \"确认强制重新运行吗\",\n    content: \"确定要强制重新运行选中流水线吗？(20条一批执行)\",\n    async onOk() {\n      await api.BatchRerun(selectedRowKeys.value);\n      notification.success({ message: \"任务已提交\" });\n      await crudExpose.doRefresh();\n      selectedRowKeys.value = [];\n    },\n  });\n}\n</script>\n<style lang=\"less\">\n.batch-actions {\n  position: absolute;\n  z-index: 100;\n  line-height: 40px;\n  display: flex;\n  align-items: center;\n  height: 37.86px;\n  width: 100%;\n  overflow: hidden;\n  margin-top: 1px;\n  padding-left: 48px;\n  pointer-events: none;\n\n  .batch-actions-inner {\n    pointer-events: auto;\n    display: flex;\n    align-items: center;\n    width: 100%;\n    background-color: #fafafa;\n    padding-left: 10px;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/history-timeline-item.vue",
    "content": "<template>\n  <a-timeline-item v-if=\"status && runnable\" class=\"pi-history-timeline-item\" :color=\"status.iconColor || status.color\">\n    <template #dot>\n      <fs-icon v-bind=\"status\" :color=\"status.iconColor || status.color\" />\n    </template>\n    <p>\n      <fs-date-format :model-value=\"runnable.createTime\"></fs-date-format>\n      <a-tag class=\"ml-5\" :color=\"status.color\" :closable=\"status.value === 'start'\" @close=\"cancelTask\">\n        {{ status.label }}\n      </a-tag>\n      <a-tag v-if=\"isCurrent\" class=\"pointer\" color=\"green\" :closable=\"true\" @close=\"cancel\">当前</a-tag>\n      <a-tag v-else-if=\"!editMode\" class=\"pointer\" color=\"blue\" @click=\"view\">查看</a-tag>\n    </p>\n  </a-timeline-item>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, provide, Ref, watch, computed } from \"vue\";\nimport { statusUtil } from \"/@/views/certd/pipeline/pipeline/utils/util.status\";\nimport * as api from \"../../api\";\nimport { Modal, notification } from \"ant-design-vue\";\nexport default defineComponent({\n  name: \"PiHistoryTimelineItem\",\n  props: {\n    runnable: {\n      type: Object,\n      default() {\n        return {};\n      },\n    },\n    historyId: {\n      type: Number,\n    },\n    type: {\n      type: String,\n      default: \"icon\",\n    },\n    isCurrent: {\n      type: Boolean,\n    },\n    editMode: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\"view\", \"cancel\"],\n  setup(props: any, ctx: any) {\n    const status = computed(() => {\n      return statusUtil.get(props.runnable?.status);\n    });\n\n    function view() {\n      ctx.emit(\"view\");\n    }\n    function cancel() {\n      ctx.emit(\"cancel\");\n    }\n    function cancelTask() {\n      Modal.confirm({\n        title: \"确认取消\",\n        content: \"确认取消该任务吗？\",\n        okText: \"确认\",\n        cancelText: \"取消\",\n        onOk: async () => {\n          await api.Cancel(props.historyId);\n          notification.success({\n            message: \"任务取消成功\",\n          });\n        },\n      });\n    }\n    return {\n      status,\n      cancel,\n      view,\n      cancelTask,\n    };\n  },\n});\n</script>\n<style lang=\"less\">\n.pi-history-timeline-item {\n  .ant-tag.pointer {\n    cursor: pointer;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/notification-form/index.vue",
    "content": "<template>\n  <a-drawer v-model:open=\"notificationDrawerVisible\" placement=\"right\" :closable=\"true\" width=\"600px\" class=\"pi-notification-form\" @after-open-change=\"notificationDrawerOnAfterVisibleChange\">\n    <template #title>\n      <div>\n        {{ t(\"certd.edit_notification\") }}\n        <a-button v-if=\"mode === 'edit'\" danger @click=\"notificationDelete()\">\n          <template #icon>\n            <DeleteOutlined />\n          </template>\n        </a-button>\n      </div>\n    </template>\n    <template v-if=\"currentNotification\">\n      <pi-container>\n        <a-form ref=\"notificationFormRef\" class=\"notification-form\" :model=\"currentNotification\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\">\n          <fs-form-item\n            v-if=\"currentNotification.type === 'email'\"\n            v-model=\"currentNotification.type\"\n            :item=\"{\n              title: t('certd.type'),\n              key: 'type',\n              value: 'email',\n              component: {\n                name: 'a-select',\n                vModel: 'value',\n                disabled: !editMode,\n                options: [\n                  { value: 'email', label: t('certd.email') },\n                  { value: 'other', label: t('certd.other_notification_method') },\n                ],\n              },\n              rules: [{ required: true, message: t('certd.required') }],\n            }\"\n          />\n          <fs-form-item\n            v-model=\"currentNotification.when\"\n            :item=\"{\n              title: t('certd.trigger_time'),\n              key: 'when',\n              value: ['error'],\n              component: {\n                name: 'a-select',\n                vModel: 'value',\n                disabled: !editMode,\n                mode: 'multiple',\n                options: [\n                  { value: 'start', label: t('certd.start_time') },\n                  { value: 'success', label: t('certd.success_time') },\n                  { value: 'turnToSuccess', label: t('certd.fail_to_success_time') },\n                  { value: 'error', label: t('certd.fail_time') },\n                ],\n              },\n              helper: t('certd.helper_suggest_fail_only'),\n              rules: [{ required: true, message: t('certd.required') }],\n            }\"\n          />\n          <pi-notification-form-email v-if=\"currentNotification.type === 'email'\" ref=\"optionsRef\" v-model:options=\"currentNotification.options\"></pi-notification-form-email>\n\n          <fs-form-item\n            v-else\n            v-model=\"currentNotification.notificationId\"\n            :item=\"{\n              title: t('certd.notification_config'),\n              key: 'notificationId',\n              component: {\n                disabled: !editMode,\n                name: NotificationSelector,\n                onSelectedChange,\n              },\n              helper: t('certd.please_select_notification'),\n              rules: [{ required: true, message: t('certd.required') }],\n            }\"\n          />\n        </a-form>\n\n        <template #footer>\n          <a-form-item v-if=\"editMode\" :wrapper-col=\"{ span: 14, offset: 4 }\">\n            <a-button type=\"primary\" @click=\"notificationSave\"> {{ t(\"certd.confirm\") }} </a-button>\n          </a-form-item>\n        </template>\n      </pi-container>\n    </template>\n  </a-drawer>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Modal } from \"ant-design-vue\";\nimport { ref, Ref } from \"vue\";\nimport * as _ from \"lodash-es\";\nimport { nanoid } from \"nanoid\";\nimport PiNotificationFormEmail from \"./pi-notification-form-email.vue\";\nimport NotificationSelector from \"/@/views/certd/notification/notification-selector/index.vue\";\nimport { useI18n } from \"/src/locales\";\nimport { cloneDeep } from \"lodash-es\";\n\nconst { t } = useI18n();\n\ndefineOptions({\n  name: \"PiNotificationForm\",\n});\n\nconst props = defineProps<{\n  editMode: boolean;\n}>();\n\nconst emit = defineEmits([\"update\"]);\n\n/**\n *  notification drawer\n * @returns\n */\nconst mode = ref(\"add\");\nconst callback = ref();\nconst currentNotification: Ref<any> = ref({ type: undefined, when: [], options: {}, notificationId: undefined, title: \"\" });\nconst currentPlugin = ref({});\nconst notificationFormRef = ref(null);\nconst notificationDrawerVisible = ref(false);\nconst optionsRef = ref();\nconst rules = ref({\n  type: [\n    {\n      type: \"string\",\n      required: true,\n      message: t(\"certd.please_select_type\"),\n    },\n  ],\n  when: [\n    {\n      type: \"string\",\n      required: true,\n      message: t(\"certd.please_select_trigger_time\"),\n    },\n  ],\n  notificationId: [\n    {\n      type: \"number\",\n      required: true,\n      message: t(\"certd.please_select_notification_config\"),\n    },\n  ],\n});\nconst notificationDrawerShow = () => {\n  notificationDrawerVisible.value = true;\n};\nconst notificationDrawerClose = () => {\n  notificationDrawerVisible.value = false;\n};\n\nconst notificationDrawerOnAfterVisibleChange = (val: any) => {\n  console.log(\"notificationDrawerOnAfterVisibleChange\", val);\n};\n\nconst notificationOpen = (notification: any, emit: any) => {\n  callback.value = emit;\n  currentNotification.value = cloneDeep(notification);\n  console.log(\"currentNotificationOpen\", currentNotification.value);\n  notificationDrawerShow();\n};\n\nconst notificationAdd = (emit: any) => {\n  mode.value = \"add\";\n  const notification = { id: nanoid(), type: \"custom\", when: [\"error\", \"turnToSuccess\"] };\n  notificationOpen(notification, emit);\n};\n\nconst notificationEdit = (notification: any, emit: any) => {\n  mode.value = \"edit\";\n  notificationOpen(notification, emit);\n};\n\nconst notificationView = (notification: any, emit: any) => {\n  mode.value = \"view\";\n  notificationOpen(notification, emit);\n};\n\nconst notificationSave = async (e: any) => {\n  if (optionsRef.value) {\n    currentNotification.value.options = await optionsRef.value.getValue();\n  }\n\n  console.log(\"currentNotificationSave\", currentNotification.value);\n  try {\n    await notificationFormRef.value.validate();\n  } catch (e) {\n    console.error(\"表单验证失败:\", e);\n    return;\n  }\n\n  callback.value(\"save\", currentNotification.value);\n  notificationDrawerClose();\n};\n\nconst notificationDelete = () => {\n  Modal.confirm({\n    title: t(\"certd.confirm\"),\n    content: t(\"certd.confirm_delete_trigger\"),\n    async onOk() {\n      callback.value(\"delete\");\n      notificationDrawerClose();\n    },\n  });\n};\n\nconst blankFn = () => {\n  return {};\n};\n\nfunction onSelectedChange(node: any) {\n  currentNotification.value.title = node?.name || null;\n}\n\nconst labelCol = { span: 6 };\nconst wrapperCol = { span: 16 };\n\ndefineExpose({\n  notificationAdd,\n  notificationEdit,\n  notificationView,\n  notificationDelete,\n  notificationSave,\n  notificationOpen,\n  notificationDrawerShow,\n});\n</script>\n\n<style lang=\"less\">\n.pi-notification-form {\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/notification-form/pi-notification-form-email.vue",
    "content": "<template>\n  <div>\n    <fs-form-item\n      v-model=\"optionsFormState.receivers\"\n      :item=\"{\n        title: t('certd.email.title'),\n        key: 'type',\n        component: {\n          name: 'a-select',\n          vModel: 'value',\n          mode: 'tags',\n          open: false,\n        },\n        helper: t('certd.email.helper'),\n        rules: [{ required: true, message: t('certd.email.required') }],\n      }\"\n    />\n\n    <a-alert v-if=\"!settingStore.isPlus\" class=\"m-1\" type=\"info\">\n      <template #message> 还没有配置邮件服务器？<router-link :to=\"{ path: '/sys/settings/email' }\">现在就去</router-link> </template>\n    </a-alert>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nimport { Ref, ref, watch } from \"vue\";\nimport { useUserStore } from \"/@/store/user\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\nconst props = defineProps({\n  options: {\n    type: Object as PropType<any>,\n    default: () => {},\n  },\n});\n\nconst settingStore = useSettingStore();\n\nconst optionsFormState: Ref<any> = ref({});\n\nwatch(\n  () => {\n    return props.options;\n  },\n  () => {\n    optionsFormState.value = {\n      ...props.options,\n    };\n  },\n  {\n    immediate: true,\n  }\n);\n\nconst emit = defineEmits([\"change\"]);\nfunction doEmit() {\n  emit(\"change\", { ...optionsFormState.value });\n}\n\nfunction getValue() {\n  return { ...optionsFormState.value };\n}\n\ndefineExpose({\n  doEmit,\n  getValue,\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/shortcut/task-shortcut.vue",
    "content": "<template>\n  <a-tooltip :title=\"title\">\n    <div class=\"task-shortcut\" :title=\"title\" @click=\"openDialog\">\n      <fs-icon :icon=\"icon\" v-bind=\"attrs\"></fs-icon>\n    </div>\n  </a-tooltip>\n</template>\n<script setup lang=\"ts\">\nimport { doRequest } from \"/@/components/plugins/lib\";\nimport { ref, useAttrs, inject } from \"vue\";\nimport { useFormWrapper } from \"@fast-crud/fast-crud\";\nimport { notification } from \"ant-design-vue\";\nimport { mergeWith, isArray } from \"lodash-es\";\ndefineOptions({\n  name: \"TaskShortcut\",\n});\nconst { openCrudFormDialog } = useFormWrapper();\nconst props = defineProps<{\n  icon: string;\n  title: string;\n  action: string;\n  form: any;\n  input: any;\n  pluginName: string;\n  stepId: string;\n}>();\n\nconst attrs = useAttrs();\n\nconst loading = ref(false);\n\nasync function openDialog() {\n  function createCrudOptions() {\n    return {\n      crudOptions: {\n        columns: {\n          ...props.form.columns,\n          immediateRun: {\n            title: \"立即运行\",\n            type: \"switch\",\n            span: 24,\n            form: {\n              value: true,\n              component: {\n                name: \"a-switch\",\n                vModel: \"checked\",\n              },\n              helper: \"保存后是否立即触发运行流水线\",\n            },\n          },\n        },\n        form: {\n          wrapper: {\n            title: props.title,\n            saveRemind: false,\n          },\n          afterSubmit() {\n            notification.success({ message: \"操作成功\" });\n          },\n          async doSubmit({ form }: any) {\n            return await doPluginFormSubmit(form);\n          },\n        },\n      },\n    };\n  }\n  const { crudOptions } = createCrudOptions();\n  await openCrudFormDialog({ crudOptions });\n}\n\nconst getPipelineScope: any = inject(\"getPipelineScope\");\nconst doPluginFormSubmit = async (formData: any) => {\n  if (loading.value) {\n    return;\n  }\n\n  loading.value = true;\n  try {\n    const res = await doRequest({\n      type: \"plugin\",\n      typeName: props.pluginName,\n      action: props.action,\n      input: props.input,\n      data: formData,\n    });\n\n    if (res.input) {\n      const { save, findStep } = getPipelineScope();\n      const step = findStep(props.stepId);\n      if (step) {\n        // 数组覆盖合并\n        mergeWith(step.input, res.input, (objValue, srcValue) => {\n          if (isArray(objValue)) {\n            return srcValue;\n          }\n        });\n        //保存，但不改变当前编辑状态\n        save(false);\n      }\n    }\n\n    if (formData.immediateRun) {\n      const { run } = getPipelineScope();\n      run();\n    }\n\n    return res;\n  } finally {\n    loading.value = false;\n  }\n};\n</script>\n<style lang=\"less\">\n.task-shortcut {\n  width: 25px;\n  height: 22px;\n  border: 1px solid #e3e3e3;\n  border-radius: 0 0 5px 5px;\n  background: #fff;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  cursor: pointer;\n  border-top: 0;\n  &:hover {\n    background: #fff;\n    border-color: #38a0fb;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/shortcut/task-shortcuts.vue",
    "content": "<template>\n  <div class=\"task-shortcuts\">\n    <TaskShortcut v-for=\"(item, index) of shortcuts\" :key=\"index\" v-bind=\"item\" />\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { ref, watch } from \"vue\";\nimport TaskShortcut from \"./task-shortcut.vue\";\nimport { usePluginStore } from \"/@/store/plugin\";\n\ndefineOptions({\n  name: \"TaskShortcuts\",\n});\n\nconst props = defineProps<{\n  task: any;\n}>();\nconst shortcuts = ref([]);\nconst pluginStore = usePluginStore();\nwatch(\n  () => props.task,\n  value => {\n    init();\n  },\n  { immediate: true }\n);\n\nasync function init() {\n  const steps = props.task?.steps || [];\n  if (steps.length === 0) {\n    return;\n  }\n  const list = [];\n  for (const step of steps) {\n    const stepType = step.type;\n    const pluginDefine = await pluginStore.getPluginDefine(stepType);\n    if (pluginDefine.shortcut) {\n      for (const key in pluginDefine.shortcut) {\n        const shortcut = pluginDefine.shortcut[key];\n        list.push({\n          ...shortcut,\n          pluginName: stepType,\n          input: step.input,\n          stepId: step.id,\n        });\n      }\n    }\n  }\n  shortcuts.value = list;\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/status-show.vue",
    "content": "<template>\n  <span v-if=\"statusRef\" class=\"pi-status-show flex-o\">\n    <template v-if=\"type === 'icon'\">\n      <fs-icon class=\"status-icon\" v-bind=\"statusRef\" :style=\"{ color: statusRef.iconColor || statusRef.color }\" />\n    </template>\n    <template v-if=\"type === 'tag'\">\n      <a-tag :color=\"statusRef.color\">{{ statusRef.label }}</a-tag>\n    </template>\n  </span>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from \"vue\";\nimport { statusUtil } from \"/@/views/certd/pipeline/pipeline/utils/util.status\";\n\nexport default defineComponent({\n  name: \"PiStatusShow\",\n  props: {\n    status: {\n      type: [String, Number],\n      default: \"\",\n    },\n    type: {\n      type: String,\n      default: \"icon\",\n    },\n  },\n  setup(props, ctx) {\n    const statusRef = computed(() => {\n      return statusUtil.get(props.status as string);\n    });\n\n    return {\n      statusRef,\n    };\n  },\n});\n</script>\n<style lang=\"less\">\n.pi-status-show {\n  .status-icon {\n    font-size: 16px;\n    margin-left: 3px;\n    margin-right: 3px;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/step-form/index.vue",
    "content": "<template>\n  <a-drawer v-model:open=\"stepDrawerVisible\" :wrap-style=\"{ maxWidth: '100vw' }\" placement=\"right\" :closable=\"true\" width=\"760px\" class=\"step-form-drawer\" :class=\"{ fullscreen }\">\n    <template #title>\n      <div>\n        编辑步骤\n        <template v-if=\"editMode\">\n          <a-button @click=\"stepDelete()\">\n            <template #icon>\n              <DeleteOutlined />\n            </template>\n          </a-button>\n        </template>\n      </div>\n      <div class=\"hidden md:block\">\n        <fs-icon class=\"icon-button\" :icon=\"fullscreen ? 'material-symbols:fullscreen-exit' : 'material-symbols:fullscreen'\" @click=\"fullscreen = !fullscreen\"></fs-icon>\n      </div>\n    </template>\n    <template v-if=\"currentStep\">\n      <pi-container v-if=\"currentStep._isAdd\" class=\"pi-step-form\">\n        <template #header>\n          <a-row :gutter=\"10\" class=\"mb-10\">\n            <a-col :span=\"24\" style=\"padding-left: 20px\">\n              <a-input-search v-model:value=\"pluginSearch.keyword\" placeholder=\"搜索插件\" :allow-clear=\"true\" :show-search=\"true\"></a-input-search>\n            </a-col>\n          </a-row>\n        </template>\n        <div class=\"flex-col h-100 w-100 overflow-hidden\">\n          <a-tabs v-model:active-key=\"pluginGroupActive\" tab-position=\"left\" class=\"flex-1 overflow-hidden\">\n            <a-tab-pane v-for=\"group of computedPluginGroups\" :key=\"group.key\" class=\"scroll-y\">\n              <template #tab>\n                <div class=\"cd-step-form-tab-label\">\n                  <fs-icon :icon=\"group.icon\" class=\"mr-2\" />\n                  <div>{{ group.title }}</div>\n                </div>\n              </template>\n              <a-row v-if=\"!group.plugins || group.plugins.length === 0\" :gutter=\"10\">\n                <a-col class=\"flex-o\">\n                  <div class=\"flex-o m-10\">没有找到插件</div>\n                </a-col>\n              </a-row>\n              <a-row v-else :gutter=\"10\">\n                <a-col v-for=\"item of group.plugins\" :key=\"item.key\" class=\"step-plugin w-full md:w-[50%]\">\n                  <a-card\n                    hoverable\n                    :class=\"{ current: item.name === currentStep.type }\"\n                    @click=\"stepTypeSelected(item)\"\n                    @dblclick=\"\n                      stepTypeSelected(item);\n                      stepTypeSave();\n                    \"\n                  >\n                    <a-card-meta>\n                      <template #title>\n                        <fs-icon class=\"plugin-icon\" :icon=\"item.icon || 'clarity:plugin-line'\"></fs-icon>\n                        <span class=\"title\" :title=\"item.title\">{{ item.title }}</span>\n                        <vip-button v-if=\"item.needPlus\" mode=\"icon\" />\n                      </template>\n                      <template #description>\n                        <span :title=\"item.desc\" v-html=\"transformDesc(item.desc)\"></span>\n                      </template>\n                    </a-card-meta>\n                  </a-card>\n                </a-col>\n              </a-row>\n            </a-tab-pane>\n          </a-tabs>\n        </div>\n        <template #footer>\n          <div style=\"padding: 20px; margin-left: 100px\">\n            <a-button v-if=\"editMode\" type=\"primary\" @click=\"stepTypeSave\"> 确定</a-button>\n          </div>\n        </template>\n      </pi-container>\n      <pi-container v-else class=\"pi-step-form\">\n        <template #header>\n          <div class=\"mb-10\">\n            <a-alert type=\"info\" :message=\"currentPlugin.title\">\n              <template #description>\n                <div v-html=\"transformDesc(currentPlugin.desc)\"></div>\n              </template>\n            </a-alert>\n          </div>\n        </template>\n        <div class=\"w-100 h-100\">\n          <a-form ref=\"stepFormRef\" class=\"step-form\" :model=\"currentStep\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\">\n            <fs-form-item\n              v-model=\"currentStep.title\"\n              :item=\"{\n                title: '任务名称',\n                key: 'title',\n                component: {\n                  name: 'a-input',\n                  vModel: 'value',\n                },\n                rules: [{ required: true, message: '此项必填' }],\n              }\"\n              :get-context-fn=\"getScopeFunc\"\n            />\n            <template v-for=\"(item, key) in currentPlugin.input\" :key=\"key\">\n              <fs-form-item v-if=\"item.show !== false\" v-model=\"currentStep.input[key]\" :item=\"item\" :get-context-fn=\"getScopeFunc\" />\n            </template>\n\n            <fs-form-item v-if=\"settingStore.sysPublic.showRunStrategy || currentPlugin.showRunStrategy\" v-model=\"currentStep.strategy.runStrategy\" :item=\"runStrategyProps\" :get-context-fn=\"getScopeFunc\" />\n          </a-form>\n        </div>\n        <template #footer>\n          <div v-if=\"editMode\" class=\"bottom-button\">\n            <a-button type=\"primary\" @click=\"stepSave\"> 确定</a-button>\n          </div>\n        </template>\n      </pi-container>\n    </template>\n  </a-drawer>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { message, Modal } from \"ant-design-vue\";\nimport { computed, provide, ref, Ref, watch } from \"vue\";\nimport { merge, cloneDeep } from \"lodash-es\";\nimport { nanoid } from \"nanoid\";\nimport { usePluginStore, PluginGroups } from \"/@/store/plugin\";\nimport { useCompute } from \"@fast-crud/fast-crud\";\nimport { useReference } from \"/@/use/use-refrence\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { mitter } from \"/@/utils/util.mitt\";\nimport { utils } from \"/@/utils\";\n\ndefineOptions({\n  name: \"PiStepForm\",\n});\nconst props = defineProps({\n  editMode: {\n    type: Boolean,\n    default: true,\n  },\n});\n\nconst emit = defineEmits([\"update\"]);\n\nconst pluginStore = usePluginStore();\n\nfunction transformDesc(desc: string = \"\") {\n  return utils.transformLink(desc);\n}\n\nconst settingStore = useSettingStore();\n\n/**\n *  step drawer\n * @returns\n */\nfunction useStepForm() {\n  const settingStore = useSettingStore();\n  const mode: Ref = ref(\"add\");\n  const callback: Ref = ref();\n  const currentStep: Ref = ref({ title: undefined, input: {} });\n  const stepFormRef: Ref = ref(null);\n  const stepDrawerVisible: Ref = ref(false);\n  const fullscreen: Ref<boolean> = ref(false);\n  const rules: Ref = ref({\n    name: [\n      {\n        type: \"string\",\n        required: true,\n        message: \"请输入名称\",\n      },\n    ],\n  });\n\n  const stepTypeSelected = (item: any) => {\n    if (item.needPlus && !settingStore.isPlus) {\n      message.warn(\"此插件需要开通专业版才能使用\");\n      mitter.emit(\"openVipModal\");\n      throw new Error(\"此插件需要开通专业版才能使用\");\n    }\n    currentStep.value.type = item.name;\n    currentStep.value.title = item.title;\n    console.log(\"currentStepTypeChanged:\", currentStep.value);\n  };\n\n  const stepTypeSave = async () => {\n    currentStep.value._isAdd = false;\n    if (currentStep.value.type == null) {\n      message.warn(\"请先选择类型\");\n      return;\n    }\n\n    // 给step的input设置默认值\n    await changeCurrentPlugin(currentStep.value);\n\n    //合并默认值\n    merge(\n      currentStep.value,\n      {\n        input: {},\n        strategy: { runStrategy: 0 },\n      },\n      currentPlugin.value.default,\n      currentStep.value\n    );\n  };\n\n  const stepDrawerShow = () => {\n    stepDrawerVisible.value = true;\n  };\n  const stepDrawerClose = () => {\n    stepDrawerVisible.value = false;\n  };\n\n  const stepOpen = (step: any, emit: any) => {\n    callback.value = emit;\n    currentStep.value = merge({ input: {}, strategy: {} }, step);\n    if (step.type) {\n      changeCurrentPlugin(currentStep.value);\n    }\n    stepDrawerShow();\n  };\n\n  const stepAdd = (emit: any, stepDef: any) => {\n    mode.value = \"add\";\n    const step: any = {\n      id: nanoid(),\n      title: \"新任务\",\n      type: undefined,\n      _isAdd: true,\n      input: {},\n      status: null,\n    };\n    merge(step, stepDef);\n    stepOpen(step, emit);\n  };\n\n  const stepEdit = (step: any, emit: any) => {\n    mode.value = \"edit\";\n    stepOpen(step, emit);\n  };\n\n  const stepView = (step: any, emit: any) => {\n    mode.value = \"view\";\n    stepOpen(step, emit);\n  };\n\n  const currentPluginDefine = ref();\n  provide(\"getCurrentPluginDefine\", () => {\n    return currentPluginDefine;\n  });\n  provide(\"get:plugin:type\", () => {\n    return \"plugin\";\n  });\n\n  function getContext() {\n    return {\n      form: currentStep.value.input,\n    };\n  }\n\n  const { doComputed } = useCompute();\n  const currentPlugin = doComputed(() => {\n    return currentPluginDefine.value || {};\n  }, getContext);\n  const changeCurrentPlugin = async (step: any) => {\n    const stepType = step.type;\n    step.type = stepType;\n    step._isAdd = false;\n    const pluginDefine = await pluginStore.getPluginDefine(stepType);\n    // let pluginDefine = pluginGroups.get(stepType);\n    if (pluginDefine == null) {\n      console.log(\"插件未找到\", stepType);\n      return;\n    }\n    // pluginDefine = _.cloneDeep(pluginDefine);\n    const columns = pluginDefine.input;\n    for (let key in columns) {\n      const column = columns[key];\n      useReference(column);\n    }\n\n    currentPluginDefine.value = pluginDefine;\n\n    for (let key in pluginDefine.input) {\n      const column = pluginDefine.input[key];\n      //设置初始值\n      if ((column.default != null || column.value != null) && currentStep.value.input[key] == null) {\n        currentStep.value.input[key] = column.default ?? column.value;\n      }\n    }\n    //设置系统初始值\n    const pluginSysConfig = await pluginStore.getPluginConfig({ name: pluginDefine.name, type: \"builtIn\" });\n    if (pluginSysConfig.sysSetting?.input) {\n      for (const key in pluginSysConfig.sysSetting?.input) {\n        currentStep.value.input[key] = pluginSysConfig.sysSetting?.input[key];\n      }\n    }\n\n    console.log(\"currentStepTypeChanged:\", currentStep.value);\n    console.log(\"currentStepPlugin:\", currentPlugin.value);\n  };\n\n  const stepSave = async (e: any) => {\n    console.log(\"currentStepSave\", currentStep.value);\n    try {\n      await stepFormRef.value.validate();\n    } catch (e) {\n      console.error(\"表单验证失败:\", e);\n      return;\n    }\n\n    callback.value(\"save\", currentStep.value);\n    stepDrawerClose();\n  };\n\n  const stepDelete = () => {\n    Modal.confirm({\n      title: \"确认\",\n      content: `确定要删除此步骤吗？`,\n      async onOk() {\n        callback.value(\"delete\");\n        stepDrawerClose();\n      },\n    });\n  };\n\n  const stepCopy = () => {\n    const step = cloneDeep(currentStep.value);\n    step.id = nanoid();\n    step.title = `${step.title}-copy`;\n    callback.value(\"copy\", step);\n    stepDrawerClose();\n  };\n\n  const getScopeFunc = () => {\n    return {\n      form: currentStep.value,\n    };\n  };\n\n  const pluginSearch = ref({\n    keyword: \"\",\n    result: [],\n  });\n  const pluginGroupActive = ref(\"all\");\n  const pluginGroup: Ref = ref();\n  const pluginStore = usePluginStore();\n\n  async function loadPluginGroups() {\n    pluginGroup.value = await pluginStore.getGroups();\n  }\n\n  loadPluginGroups();\n  const computedPluginGroups: any = computed(() => {\n    if (!pluginGroup.value) {\n      return {};\n    }\n    const group = pluginGroup.value as PluginGroups;\n    const groups = group.groups;\n    if (pluginSearch.value.keyword) {\n      const keyword = pluginSearch.value.keyword.toLowerCase();\n      const list = groups.all.plugins.filter((plugin: any) => {\n        return plugin.title?.toLowerCase().includes(keyword) || plugin.desc?.toLowerCase().includes(keyword) || plugin.name?.toLowerCase().includes(keyword);\n      });\n      return {\n        search: { key: \"search\", title: \"搜索结果\", plugins: list },\n      };\n    } else {\n      return groups;\n    }\n  });\n  watch(\n    () => {\n      return pluginSearch.value.keyword;\n    },\n    (val: any) => {\n      if (val) {\n        pluginGroupActive.value = \"search\";\n      } else {\n        pluginGroupActive.value = \"all\";\n      }\n    }\n  );\n\n  return {\n    pluginGroupActive,\n    computedPluginGroups,\n    pluginSearch,\n    stepTypeSelected,\n    stepTypeSave,\n    stepFormRef,\n    mode,\n    stepAdd,\n    stepEdit,\n    stepView,\n    stepDrawerShow,\n    stepDrawerVisible,\n    currentStep,\n    currentPlugin,\n    stepSave,\n    stepDelete,\n    rules,\n    getScopeFunc,\n    stepCopy,\n    fullscreen,\n  };\n}\n\nconst runStrategyProps = ref({\n  title: \"运行策略\",\n  key: \"strategy.runStrategy\",\n  component: {\n    name: \"a-select\",\n    vModel: \"value\",\n    options: [\n      { value: 0, label: \"正常运行（只有证书申请任务需要选择它）\" },\n      { value: 1, label: \"成功后跳过（其他任务请选择它）\" },\n    ],\n  },\n  helper: {\n    render: () => {\n      return (\n        <div>\n          <div class=\"color-green\">一般保持默认即可</div>\n          <div>正常运行：每次都运行，证书任务需要每次都运行</div>\n          <div>成功后跳过：该任务成功一次之后跳过，不重复执行（证书变化之后才会再次运行）</div>\n        </div>\n      );\n    },\n  },\n  rules: [{ required: true, message: \"此项必填\" }],\n});\n\nconst labelCol = ref({ span: 6 });\nconst wrapperCol = ref({ span: 16 });\n\nconst stepFormRes = useStepForm();\nconst { pluginGroupActive, computedPluginGroups, pluginSearch, stepTypeSelected, stepTypeSave, stepFormRef, stepDrawerVisible, currentStep, currentPlugin, stepSave, stepDelete, getScopeFunc, fullscreen } = stepFormRes;\ndefineExpose({\n  ...stepFormRes,\n});\n</script>\n\n<style lang=\"less\">\n.cd-step-form-tab-label {\n  // 包括dropdown\n  display: flex;\n  align-items: center;\n  //width: 120px;\n  .fs-icon {\n    display: flex;\n    align-items: center;\n    color: #00b7ff;\n\n    svg {\n      vertical-align: middle !important;\n      display: flex;\n      align-items: center;\n    }\n  }\n}\n\n.step-form-drawer {\n  max-width: 100%;\n\n  .ant-tabs-right > div > .ant-tabs-nav .ant-tabs-tab {\n    padding: 8px 10px;\n  }\n\n  .ant-tabs-nav .ant-tabs-tab {\n    margin-top: 10px !important;\n  }\n\n  &.fullscreen {\n    .pi-step-form {\n      .body {\n        margin: auto;\n\n        .step-plugin {\n          width: 16.666666%;\n        }\n\n        .step-form {\n          display: flex;\n          flex-wrap: wrap;\n          width: 1500px;\n\n          .fs-form-item {\n            width: 100%;\n          }\n        }\n      }\n\n      .footer {\n        .bottom-button {\n          text-align: center;\n        }\n      }\n    }\n  }\n\n  .ant-drawer-body {\n    padding: 10px;\n  }\n\n  .pi-step-form {\n    .bottom-button {\n      padding: 20px;\n      padding-bottom: 5px;\n      margin-left: 100px;\n    }\n\n    .plugin-icon {\n      font-size: 22px;\n      color: #00b7ff;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    .body {\n      padding: 0px;\n\n      .step-plugin {\n      }\n\n      .ant-tabs-content {\n        height: 100%;\n      }\n\n      .ant-tabs-tabpane {\n        padding-right: 10px;\n        overflow-y: auto;\n        overflow-x: hidden;\n      }\n\n      .ant-card {\n        margin-bottom: 10px;\n\n        &.current {\n          border-color: #00b7ff;\n        }\n\n        .ant-card-meta-title {\n          display: flex;\n          flex-direction: row;\n          justify-content: flex-start;\n        }\n\n        .ant-avatar {\n          width: 24px;\n          height: 24px;\n          flex-shrink: 0;\n        }\n\n        .title {\n          margin-left: 5px;\n          white-space: nowrap;\n          flex: 1;\n          display: block;\n          overflow: hidden;\n          text-overflow: ellipsis;\n        }\n      }\n\n      .ant-card-body {\n        padding: 14px;\n        height: 100px;\n\n        overflow-y: hidden;\n\n        .ant-card-meta-description {\n          font-size: 12px;\n          line-height: 20px;\n          height: 40px;\n          color: #7f7f7f;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/task-form/index.vue",
    "content": "<template>\n  <a-drawer v-model:open=\"taskDrawerVisible\" placement=\"right\" :closable=\"true\" width=\"700px\" class=\"pi-task-form\" @after-open-change=\"taskDrawerOnAfterVisibleChange\">\n    <template #title>\n      <div>\n        编辑任务\n        <a-button v-if=\"editMode\" danger @click=\"taskDelete()\">\n          <template #icon><DeleteOutlined /></template>\n        </a-button>\n      </div>\n    </template>\n    <template v-if=\"currentTask\">\n      <pi-container>\n        <a-form ref=\"taskFormRef\" class=\"task-form\" :model=\"currentTask\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\">\n          <fs-form-item\n            v-model=\"currentTask.title\"\n            :item=\"{\n              title: '任务名称',\n              key: 'title',\n              component: {\n                name: 'a-input',\n                vModel: 'value',\n              },\n              rules: [{ required: true, message: '此项必填' }],\n            }\"\n            :get-context-fn=\"blankFn\"\n          />\n\n          <div class=\"steps\">\n            <a-form-item :value=\"currentTask.steps\" name=\"steps\" label=\"\" :wrapper-col=\"{ span: 24 }\" :rules=\"[{ required: true, message: '至少需要一个步骤，或者你可以点击标题右边删除按钮删除此任务' }]\">\n              <a-descriptions title=\"任务步骤\" size=\"small\">\n                <template #extra>\n                  <a-button type=\"primary\" @click=\"stepAdd(currentTask)\">添加步骤</a-button>\n                </template>\n              </a-descriptions>\n              <v-draggable v-model=\"currentTask.steps\" class=\"step-list\" handle=\".handle\" item-key=\"id\" :disabled=\"!settingStore.isPlus\">\n                <template #item=\"{ element, index }\">\n                  <div class=\"step-row\">\n                    <div class=\"text\">\n                      <fs-icon icon=\"ion:flash\"></fs-icon>\n                      <h4 class=\"title\" :class=\"{ disabled: element.disabled, deleted: element.disabled }\">{{ element.title }}</h4>\n                    </div>\n                    <div class=\"action\">\n                      <a key=\"edit\" @click=\"stepEdit(currentTask, element, index)\">编辑</a>\n                      <a key=\"edit\" @click=\"stepCopy(currentTask, element, index)\">复制</a>\n                      <a key=\"remove\" @click=\"stepDelete(currentTask, index)\">删除</a>\n                      <a key=\"disabled\" @click=\"toggleDisabled(currentTask, element)\">{{ element.disabled ? \"启用\" : \"禁用\" }}</a>\n                      <fs-icon v-plus class=\"icon-button handle cursor-move\" title=\"拖动排序\" icon=\"ion:move-outline\"></fs-icon>\n                    </div>\n                  </div>\n                </template>\n              </v-draggable>\n            </a-form-item>\n          </div>\n        </a-form>\n\n        <pi-step-form ref=\"stepFormRef\" :edit-mode=\"editMode\"></pi-step-form>\n\n        <template #footer>\n          <a-form-item v-if=\"editMode\" :wrapper-col=\"{ span: 14, offset: 4 }\">\n            <a-button type=\"primary\" @click=\"taskSave\"> 确定 </a-button>\n          </a-form-item>\n        </template>\n      </pi-container>\n    </template>\n  </a-drawer>\n</template>\n\n<script lang=\"ts\">\nimport { provide, Ref, ref } from \"vue\";\nimport * as _ from \"lodash-es\";\nimport { nanoid } from \"nanoid\";\nimport PiStepForm from \"../step-form/index.vue\";\nimport { Modal } from \"ant-design-vue\";\nimport { CopyOutlined } from \"@ant-design/icons-vue\";\nimport VDraggable from \"vuedraggable\";\nimport { useUserStore } from \"/@/store/user\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { filter } from \"lodash-es\";\nexport default {\n  name: \"PiTaskForm\",\n  components: { CopyOutlined, PiStepForm, VDraggable },\n  props: {\n    editMode: {\n      type: Boolean,\n      default: true,\n    },\n  },\n  emits: [\"update\"],\n  setup(props: any, ctx: any) {\n    const userStore = useUserStore();\n    const settingStore = useSettingStore();\n    function useStep() {\n      const stepFormRef: Ref<any> = ref(null);\n      const currentStepIndex = ref(0);\n      provide(\"currentStepIndex\", currentStepIndex);\n      const stepAdd = (task: any, stepDef?: any) => {\n        currentStepIndex.value = task.steps.length;\n        stepFormRef.value.stepAdd((type: any, value: any) => {\n          if (type === \"save\") {\n            task.steps.push(value);\n            if (!task.title || task.title === \"新任务\") {\n              task.title = value.title;\n            }\n          }\n        }, stepDef);\n      };\n\n      const stepCopy = (task: any, step: any, stepIndex: any) => {\n        step = _.cloneDeep(step);\n        step.id = nanoid();\n        step.title = step.title + \"_copy\";\n        stepAdd(task, step);\n      };\n      const stepEdit = (task: any, step: any, stepIndex: any) => {\n        currentStepIndex.value = stepIndex;\n        console.log(\"step.edit start\", task, step, props.editMode);\n        if (props.editMode) {\n          console.log(\"step.edit\", task, step);\n          stepFormRef.value.stepEdit(step, (type: any, value: any) => {\n            console.log(\"step.save\", step, type, value);\n            if (type === \"delete\") {\n              task.steps.splice(stepIndex, 1);\n            } else if (type === \"save\") {\n              task.steps[stepIndex] = { ...value };\n            }\n            console.log(\"task.steps\", task.steps);\n          });\n        } else {\n          stepFormRef.value.stepView(step, (type: any, value: any) => {});\n        }\n      };\n\n      const stepDelete = (task: any, stepIndex: any) => {\n        Modal.confirm({\n          title: \"确认\",\n          content: `确定要删除此步骤吗？`,\n          async onOk() {\n            task.steps.splice(stepIndex, 1);\n          },\n        });\n      };\n\n      const toggleDisabled = (task: any, step: any) => {\n        step.disabled = !!!step.disabled;\n      };\n\n      return { stepAdd, stepEdit, stepCopy, stepDelete, toggleDisabled, stepFormRef };\n    }\n\n    /**\n     *  task drawer\n     * @returns\n     */\n    function useTaskForm() {\n      const mode = ref(\"add\");\n      const callback = ref();\n      const currentTask = ref({ title: undefined, steps: [], disabled: false });\n      provide(\"currentTask\", currentTask);\n      const taskFormRef: Ref<any> = ref(null);\n      const taskDrawerVisible = ref(false);\n      const rules = ref({\n        name: [\n          {\n            type: \"string\",\n            required: true,\n            message: \"请输入名称\",\n          },\n        ],\n      });\n\n      const taskDrawerShow = () => {\n        taskDrawerVisible.value = true;\n      };\n      const taskDrawerClose = () => {\n        taskDrawerVisible.value = false;\n      };\n\n      const taskDrawerOnAfterVisibleChange = (val: any) => {\n        console.log(\"taskDrawerOnAfterVisibleChange\", val);\n      };\n\n      const taskOpen = (task: any, emit: any) => {\n        callback.value = emit;\n        currentTask.value = _.merge({ steps: {} }, task);\n        console.log(\"currentTaskOpen\", currentTask.value);\n        taskDrawerShow();\n      };\n\n      const taskAdd = (emit: any, taskMerge: any) => {\n        mode.value = \"add\";\n        const blankTask: any = { id: nanoid(), title: \"新任务\", steps: [], status: null };\n        const task: any = _.merge(blankTask, taskMerge);\n        taskOpen(task, emit);\n      };\n\n      const taskEdit = (task: any, emit: any) => {\n        mode.value = \"edit\";\n        taskOpen(task, emit);\n      };\n\n      const taskView = (task: any, emit: any) => {\n        mode.value = \"view\";\n        taskOpen(task, emit);\n      };\n\n      const taskSave = async (e: any) => {\n        console.log(\"currentTaskSave\", currentTask.value);\n        try {\n          await taskFormRef.value.validate();\n        } catch (e) {\n          console.error(\"表单验证失败:\", e);\n          return;\n        }\n        const task: any = currentTask.value;\n        const allDisabled = filter(task.steps, (item: any) => {\n          return item.disabled;\n        });\n        if (task.steps.length > 0 && task.steps.length === allDisabled.length) {\n          task.disabled = true;\n        } else {\n          task.disabled = false;\n        }\n\n        callback.value(\"save\", currentTask.value);\n        taskDrawerClose();\n      };\n\n      const taskDelete = () => {\n        Modal.confirm({\n          title: \"确认\",\n          content: `确定要删除此任务吗？`,\n          async onOk() {\n            callback.value(\"delete\");\n            taskDrawerClose();\n          },\n        });\n      };\n\n      const blankFn = () => {\n        return {};\n      };\n      return {\n        taskFormRef,\n        mode,\n        taskAdd,\n        taskEdit,\n        taskView,\n        taskDrawerShow,\n        taskDrawerVisible,\n        taskDrawerOnAfterVisibleChange,\n        currentTask,\n        taskSave,\n        taskDelete,\n        rules,\n        blankFn,\n      };\n    }\n    return {\n      userStore,\n      settingStore,\n      labelCol: { span: 6 },\n      wrapperCol: { span: 16 },\n      ...useTaskForm(),\n      ...useStep(),\n    };\n  },\n};\n</script>\n\n<style lang=\"less\">\n.pi-task-form {\n  .steps {\n    margin: 0 50px 0 50px;\n  }\n  .ant-list .ant-list-item .ant-list-item-meta .ant-list-item-meta-title {\n    margin: 0;\n  }\n  .ant-list .ant-list-item .ant-list-item-action {\n    display: flex;\n    > li {\n      display: flex;\n      align-items: center;\n    }\n  }\n  .step-list {\n    padding: 10px;\n    .icon-button {\n      font-size: 18px;\n      color: #1677ff;\n      cursor: pointer;\n    }\n\n    .step-row {\n      padding: 10px;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      .text {\n        display: flex;\n        > * {\n          margin: 0px;\n          margin-right: 15px;\n        }\n      }\n      .action {\n        display: flex;\n        align-items: center;\n        > * {\n          margin-right: 15px;\n          font-size: 14px;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/task-view/index.vue",
    "content": "<template>\n  <a-modal v-model:open=\"taskModal.open\" class=\"pi-task-view\" title=\"任务日志\" style=\"width: 80%\" v-bind=\"taskModal\">\n    <a-tabs v-model:active-key=\"activeKey\" :tab-position=\"tabPosition\" animated>\n      <a-tab-pane v-for=\"item of detail.nodes\" :key=\"item.node.id\">\n        <template #tab>\n          <div class=\"tab-title flex-between\" :title=\"item.node.title\">\n            <span class=\"tab-title-text flex items-center md:w-48\">\n              <pi-status-show class=\"mr-1\" :status=\"item.node.status?.result\" type=\"icon\"></pi-status-show>\n              <!--              <fs-icon icon=\"ion:chevron-forward-circle\" class=\"text-md mr-1\"></fs-icon>-->\n              <span class=\"flex-1 ellipsis\">{{ item.node.title }}</span>\n\n              <a-tooltip title=\"强制重新执行此步骤\">\n                <fs-icon class=\"pointer color-blue ml-1\" style=\"font-size: 16px\" title=\"强制重新执行此步骤\" icon=\"icon-park-outline:replay-music\" @click=\"triggerRun(item.node.id)\"></fs-icon>\n              </a-tooltip>\n            </span>\n          </div>\n        </template>\n        <div class=\"pi-task-view-logs\" :class=\"'id-' + item.node.id\" style=\"overflow: auto\">\n          <template v-for=\"(logItem, index) of item.logs\" :key=\"index\">\n            <span :class=\"logItem.color\"> {{ logItem.time }}</span> <span>{{ logItem.content }}</span>\n          </template>\n        </div>\n      </a-tab-pane>\n    </a-tabs>\n    <template #footer>\n      <fs-button v-if=\"settingsStore.sysPublic.aiChatEnabled !== false\" key=\"aiChat\" :tooltip=\"{ title: 'AI分析异常' }\" type=\"primary\" icon=\"ion:color-wand-outline\" @click=\"taskModal.onAiChat\">AI分析</fs-button>\n      <fs-button key=\"rerun\" type=\"primary\" :tooltip=\"{ title: '强制重新执行此步骤' }\" text=\"重新运行\" icon=\"icon-park-outline:replay-music\" @click=\"triggerRun(activeKey)\"></fs-button>\n      <fs-button key=\"downloadLogs\" type=\"primary\" :tooltip=\"{ title: '当前任务日志下载' }\" icon=\"ion:arrow-down-circle-outline\" @click=\"taskModal.onDownloadLogs\">下载日志</fs-button>\n      <fs-button key=\"cancel\" :tooltip=\"{ title: '关闭窗口' }\" icon=\"ion:close-circle-outline\" @click=\"taskModal.onOk\">关闭</fs-button>\n      <!--      <fs-button key=\"submit\" :tooltip=\"{ title: '关闭窗口' }\" icon=\"ion:checkmark-circle-outline\" type=\"primary\" @click=\"taskModal.onOk\">确定</fs-button>-->\n    </template>\n  </a-modal>\n</template>\n\n<script lang=\"ts\">\nimport { computed, inject, nextTick, Ref, ref, watch } from \"vue\";\nimport { RunHistory } from \"../../type\";\nimport PiStatusShow from \"/@/views/certd/pipeline/pipeline/component/status-show.vue\";\nimport { usePreferences } from \"/@/vben/preferences\";\nimport { useSettingStore } from \"/@/store/settings/index\";\nimport { notification } from \"ant-design-vue\";\nexport default {\n  name: \"PiTaskView\",\n  components: { PiStatusShow },\n  props: {},\n  emits: [\"run\"],\n  setup(props: any, ctx: any) {\n    const openAiChat: any = inject(\"fn:ai.open\", (q: string) => {});\n    const taskModal = ref({\n      open: false,\n      onOk() {\n        taskViewClose();\n      },\n      onAiChat() {\n        onAiChat();\n      },\n      onDownloadLogs() {\n        const logs = currentHistory.value?.logs[activeKey.value];\n        if (!logs || logs.length === 0) {\n          notification.warning({\n            message: \"没有日志\",\n          });\n          return;\n        }\n        const logText = logs.join(\"\");\n        const blob = new Blob([logText], { type: \"text/plain;charset=utf-8\" });\n        const a = document.createElement(\"a\");\n        a.href = URL.createObjectURL(blob);\n        a.download = \"certd-task-log.txt\";\n        a.click();\n        URL.revokeObjectURL(a.href);\n      },\n      cancelText: \"关闭\",\n    });\n    const { isMobile } = usePreferences();\n    const tabPosition = computed(() => {\n      if (isMobile.value) {\n        return \"top\";\n      }\n      return \"left\";\n    });\n\n    function onAiChat() {\n      const logs = currentHistory.value?.logs[activeKey.value];\n      if (!logs || logs.length === 0) {\n        return;\n      }\n      let logText = \"\";\n      for (let log of logs) {\n        logText += log + \"\\n\";\n      }\n      const maxLength = 2500;\n      if (logText.length > maxLength) {\n        logText = logText.substring(logText.length - maxLength);\n      }\n      if (openAiChat) {\n        openAiChat(logText);\n      }\n    }\n\n    const detail = ref({ nodes: [] });\n    const activeKey = ref();\n    const currentHistory: Ref<RunHistory> | undefined = inject(\"currentHistory\");\n    const taskViewOpen = (task: any) => {\n      taskModal.value.open = true;\n      const nodes: any = [];\n      // nodes.push({\n      //   node: task,\n      //   type: \"任务\",\n      //   tab: 0,\n      //   logs: [],\n      //   result: {}\n      // });\n      for (let step of task.steps) {\n        nodes.push({\n          node: step,\n          type: \"步骤\",\n          tab: 2,\n          logs: [],\n        });\n      }\n\n      async function scrollBottom(node: any, force = false) {\n        let el = document.querySelector(`.pi-task-view-logs.id-${node.node.id}`);\n        if (!el) {\n          return;\n        }\n        //判断当前是否在底部\n        let isBottom = true;\n        if (el) {\n          isBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 5;\n        }\n        if (force) {\n          isBottom = true;\n        }\n        await nextTick();\n        el = document.querySelector(`.pi-task-view-logs.id-${node.node.id}`);\n        //如果在底部则滚动到底部\n        if (isBottom && el) {\n          el?.scrollTo({\n            top: el.scrollHeight,\n            behavior: \"smooth\",\n          });\n        }\n      }\n\n      for (let node of nodes) {\n        if (currentHistory?.value?.logs != null) {\n          node.logs = computed(() => {\n            if (currentHistory?.value?.logs && currentHistory.value?.logs[node.node.id] != null) {\n              const logs = currentHistory.value?.logs[node.node.id];\n              const list = [];\n              for (let log of logs) {\n                const index = log.indexOf(\"]\", 27) + 1;\n                const time = log.substring(0, index);\n                const content = log.substring(index);\n                const color = time.includes(\"ERROR\") ? \"red\" : time.includes(\"WARN\") ? \"yellow\" : \"green\";\n                list.push({\n                  time,\n                  content,\n                  color,\n                });\n              }\n              return list;\n            }\n            return [];\n          });\n\n          watch(\n            () => {\n              return node.logs.value.length;\n            },\n            async () => {\n              await scrollBottom(node);\n            }\n          );\n          nextTick(() => {\n            scrollBottom(node, true);\n          });\n        }\n      }\n\n      if (task.steps.length > 0) {\n        activeKey.value = task.steps[0].id;\n      }\n\n      detail.value = { nodes };\n    };\n\n    const taskViewClose = () => {\n      taskModal.value.open = false;\n    };\n\n    function triggerRun(id: string) {\n      ctx.emit(\"run\", id);\n      taskModal.value.open = false;\n    }\n\n    const settingsStore = useSettingStore();\n    return {\n      detail,\n      taskModal,\n      activeKey,\n      taskViewOpen,\n      taskViewClose,\n      tabPosition,\n      triggerRun,\n      settingsStore,\n    };\n  },\n};\n</script>\n\n<style lang=\"less\">\n.pi-task-view {\n  .tab-title {\n    display: flex;\n\n    .tab-title-text {\n      display: flex;\n      //max-width: 180px;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      text-align: left;\n    }\n  }\n\n  .pi-task-view-logs {\n    background-color: #000c17;\n    color: #e9e9e9;\n    font-family: monospace;\n    padding: 5px;\n    min-height: 300px;\n    max-height: 580px;\n    white-space: pre-wrap;\n    word-wrap: break-word;\n    > div {\n      padding: 0;\n      margin: 0;\n    }\n    .green {\n      color: rgba(0, 255, 0, 0.8);\n    }\n    .yellow {\n      color: yellow;\n    }\n    .red {\n      color: red;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/trigger-form/index.vue",
    "content": "<template>\n  <a-drawer v-model:open=\"triggerDrawerVisible\" placement=\"right\" :closable=\"true\" width=\"650px\" class=\"pi-trigger-form\" @after-open-change=\"triggerDrawerOnAfterVisibleChange\">\n    <template #title>\n      <div>\n        {{ t(\"certd.editTrigger\") }}\n        <a-button v-if=\"mode === 'edit'\" danger @click=\"triggerDelete()\">\n          <template #icon>\n            <DeleteOutlined />\n          </template>\n        </a-button>\n      </div>\n    </template>\n    <template v-if=\"currentTrigger\">\n      <pi-container>\n        <a-form ref=\"triggerFormRef\" class=\"trigger-form\" :model=\"currentTrigger\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\">\n          <fs-form-item\n            v-model=\"currentTrigger.title\"\n            :item=\"{\n              title: t('certd.triggerName'),\n              key: 'title',\n              component: {\n                name: 'a-input',\n                vModel: 'value',\n                disabled: !editMode,\n              },\n              rules: [{ required: true, message: t('certd.requiredField') }],\n            }\"\n          />\n\n          <fs-form-item\n            v-model=\"currentTrigger.type\"\n            :item=\"{\n              title: t('certd.type'),\n              key: 'type',\n              value: 'timer',\n              component: {\n                name: 'a-select',\n                vModel: 'value',\n                disabled: !editMode,\n                options: [{ value: 'timer', label: t('certd.schedule') }],\n              },\n              rules: [{ required: true, message: t('certd.requiredField') }],\n            }\"\n          />\n\n          <fs-form-item\n            v-model=\"currentTrigger.props.cron\"\n            :item=\"{\n              title: t('certd.cronForm.title'),\n              key: 'props.cron',\n              component: {\n                disabled: !editMode,\n                name: 'cron-editor',\n                vModel: 'modelValue',\n              },\n              helper: t('certd.cronForm.helper'),\n              rules: [{ required: true, message: t('certd.cronForm.required') }],\n            }\"\n          />\n        </a-form>\n\n        <template #footer>\n          <a-form-item v-if=\"editMode\" :wrapper-col=\"{ span: 14, offset: 4 }\">\n            <a-button type=\"primary\" @click=\"triggerSave\"> 确定 </a-button>\n          </a-form-item>\n        </template>\n      </pi-container>\n    </template>\n  </a-drawer>\n</template>\n\n<script>\nimport { message, Modal } from \"ant-design-vue\";\nimport { inject, ref } from \"vue\";\nimport * as _ from \"lodash-es\";\nimport { useI18n } from \"/src/locales/\";\nimport { nanoid } from \"nanoid\";\nexport default {\n  name: \"PiTriggerForm\",\n  props: {\n    editMode: {\n      type: Boolean,\n      default: true,\n    },\n  },\n  emits: [\"update\"],\n  setup(props, context) {\n    /**\n     *  trigger drawer\n     * @returns\n     */\n    const { t } = useI18n();\n    function useTriggerForm() {\n      const mode = ref(\"add\");\n      const callback = ref();\n      const currentTrigger = ref({ title: undefined, input: {} });\n      const currentPlugin = ref({});\n      const triggerFormRef = ref(null);\n      const triggerDrawerVisible = ref(false);\n      const rules = ref({\n        name: [\n          {\n            type: \"string\",\n            required: true,\n            message: t(\"certd.enterName\"),\n          },\n        ],\n      });\n\n      const triggerDrawerShow = () => {\n        triggerDrawerVisible.value = true;\n      };\n      const triggerDrawerClose = () => {\n        triggerDrawerVisible.value = false;\n      };\n\n      const triggerDrawerOnAfterVisibleChange = val => {\n        console.log(\"triggerDrawerOnAfterVisibleChange\", val);\n      };\n\n      const triggerOpen = (trigger, emit) => {\n        callback.value = emit;\n        currentTrigger.value = _.cloneDeep(trigger);\n        console.log(\"currentTriggerOpen\", currentTrigger.value);\n        triggerDrawerShow();\n      };\n\n      const triggerAdd = emit => {\n        mode.value = \"add\";\n        const trigger = { id: nanoid(), title: t(\"certd.timerTrigger\"), type: \"timer\", props: {} };\n        triggerOpen(trigger, emit);\n      };\n\n      const triggerEdit = (trigger, emit) => {\n        mode.value = \"edit\";\n        triggerOpen(trigger, emit);\n      };\n\n      const triggerView = (trigger, emit) => {\n        mode.value = \"view\";\n        triggerOpen(trigger, emit);\n      };\n\n      const triggerSave = async e => {\n        console.log(\"currentTriggerSave\", currentTrigger.value);\n        try {\n          await triggerFormRef.value.validate();\n        } catch (e) {\n          console.error(\"表单验证失败:\", e);\n          return;\n        }\n\n        callback.value(\"save\", currentTrigger.value);\n        triggerDrawerClose();\n      };\n\n      const triggerDelete = () => {\n        Modal.confirm({\n          title: t(\"certd.confirm\"),\n          content: t(\"certd.confirmDeleteTrigger\"),\n          async onOk() {\n            callback.value(\"delete\");\n            triggerDrawerClose();\n          },\n        });\n      };\n\n      const blankFn = () => {\n        return {};\n      };\n      return {\n        triggerFormRef,\n        mode,\n        triggerAdd,\n        triggerEdit,\n        triggerView,\n        triggerDrawerShow,\n        triggerDrawerVisible,\n        triggerDrawerOnAfterVisibleChange,\n        currentTrigger,\n        currentPlugin,\n        triggerSave,\n        triggerDelete,\n        rules,\n        blankFn,\n      };\n    }\n\n    return {\n      ...useTriggerForm(),\n      labelCol: { span: 6 },\n      wrapperCol: { span: 16 },\n      t,\n    };\n  },\n};\n</script>\n\n<style lang=\"less\">\n.pi-trigger-form {\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/index.vue",
    "content": "<template>\n  <fs-page v-if=\"pipeline\" class=\"page-pipeline-edit\">\n    <template #header>\n      <div class=\"title flex-1\">\n        <fs-button class=\"back\" icon=\"ion:chevron-back-outline\" @click=\"goBack\"></fs-button>\n        <text-editable v-model=\"pipeline.title\" :hover-show=\"false\" :disabled=\"!editMode\"></text-editable>\n      </div>\n      <div class=\"more flex items-center flex-1 justify-end\">\n        <div v-if=\"isCert\" class=\"flex items-center hidden md:block\">\n          <a-tag class=\"mr-5 pointer\" color=\"green\" type=\"primary\" text=\"查看证书\" @click=\"viewCert(pipeline.id)\">\n            <span class=\"flex\"><fs-icon icon=\"ant-design:eye-outlined\"></fs-icon> 查看证书</span>\n          </a-tag>\n          <a-tag class=\"mr-5 pointer\" color=\"green\" type=\"primary\" text=\"下载证书\" @click=\"downloadCert(pipeline.id)\">\n            <span class=\"flex\"> <fs-icon icon=\"ant-design:download-outlined\"></fs-icon> 下载证书 </span>\n          </a-tag>\n        </div>\n\n        <div class=\"flex items-center hidden md:block\">\n          <a-tag v-if=\"nextTriggerTimes\" color=\"blue\">\n            <span class=\"flex\">\n              <fs-icon icon=\"ion:time-outline\"></fs-icon>\n              下次执行时间：{{ nextTriggerTimes }}\n            </span>\n          </a-tag>\n          <a-tag v-else-if=\"nextTriggerTimes === false\" color=\"red\">\n            <span class=\"flex\">\n              <fs-icon icon=\"ion:caret-forward-circle-outline\"></fs-icon>\n              未设置触发源，不会自动执行\n            </span>\n          </a-tag>\n        </div>\n        <div class=\"basis-40 flex justify-end mr-10\">\n          <template v-if=\"editMode\">\n            <fs-button type=\"primary\" :loading=\"saveLoading\" @click=\"save\">保存</fs-button>\n            <fs-button class=\"ml-5\" @click=\"cancel\">取消</fs-button>\n          </template>\n          <template v-else>\n            <fs-button icon=\"ant-design:edit-outlined\" type=\"primary\" @click=\"edit\">编辑</fs-button>\n          </template>\n        </div>\n      </div>\n    </template>\n\n    <div class=\"layout\">\n      <div class=\"layout-left\">\n        <div ref=\"pipelineContainer\" class=\"pipeline-container bg-neutral-100 dark:bg-black\">\n          <div class=\"pipeline\">\n            <v-draggable v-model=\"pipeline.stages\" class=\"stages\" item-key=\"id\" handle=\".stage-move-handle\" :disabled=\"!settingStore.isPlus\">\n              <template #header>\n                <div class=\"stage first-stage\">\n                  <div class=\"title\">\n                    <text-editable model-value=\"触发源\" :disabled=\"true\" />\n                  </div>\n                  <div class=\"tasks\">\n                    <div class=\"task-container first-task\">\n                      <div class=\"line line-right\">\n                        <div class=\"flow-line\"></div>\n                      </div>\n                      <div class=\"task\">\n                        <a-button shape=\"round\" type=\"primary\" @click=\"run()\">\n                          <fs-icon icon=\"ion:play\"></fs-icon>\n                          手动触发\n                        </a-button>\n                      </div>\n                    </div>\n                    <div v-for=\"(trigger, index) of pipeline.triggers\" :key=\"trigger.id\" class=\"task-container\">\n                      <div class=\"line line-right\">\n                        <div class=\"flow-line\"></div>\n                      </div>\n                      <div class=\"task\">\n                        <a-button shape=\"round\" @click=\"triggerEdit(trigger, index)\">\n                          <fs-icon icon=\"ion:time\"></fs-icon>\n                          {{ trigger.title }}\n                        </a-button>\n                      </div>\n                    </div>\n\n                    <div v-if=\"editMode\" class=\"task-container is-add\">\n                      <div class=\"line line-right\">\n                        <div class=\"flow-line\"></div>\n                      </div>\n                      <div class=\"task\">\n                        <a-button shape=\"round\" type=\"dashed\" @click=\"triggerAdd\">\n                          <fs-icon icon=\"ion:add-circle-outline\"></fs-icon>\n                          触发源（定时）\n                        </a-button>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </template>\n\n              <template #item=\"{ element: stage, index }\">\n                <div :key=\"stage.id\" class=\"stage\" :class=\"{ 'last-stage': isLastStage(index), ['stage_' + index]: true }\">\n                  <div class=\"title\" @mousedown.stop>\n                    <text-editable v-model=\"stage.title\" :disabled=\"!editMode\"></text-editable>\n                    <div v-plus class=\"icon-box stage-move-handle\">\n                      <fs-icon v-if=\"editMode\" title=\"拖动排序\" icon=\"ion:move-outline\"></fs-icon>\n                    </div>\n                  </div>\n                  <v-draggable v-model=\"stage.tasks\" item-key=\"id\" class=\"tasks\" group=\"task\" handle=\".task-move-handle\" :disabled=\"!settingStore.isPlus\" @mousedown.stop>\n                    <template #item=\"{ element: task, index: taskIndex }\">\n                      <div\n                        class=\"task-container\"\n                        :class=\"{\n                          'first-task': taskIndex === 0,\n                          'validate-error': hasValidateError(task.id),\n                        }\"\n                      >\n                        <div class=\"line line-left\">\n                          <div class=\"flow-line\"></div>\n                          <fs-icon v-if=\"editMode\" class=\"add-stage-btn\" title=\"添加新阶段\" icon=\"ion:add-circle\" @click=\"stageAdd(index)\"></fs-icon>\n                        </div>\n                        <div class=\"line line-right\">\n                          <div class=\"flow-line\"></div>\n                        </div>\n                        <div class=\"task\">\n                          <a-button shape=\"round\" @click=\"taskEdit(stage, index, task, taskIndex)\">\n                            <a-popover title=\"步骤\" :trigger=\"editMode ? 'none' : 'hover'\">\n                              <!--                          :open=\"true\"-->\n                              <template #content>\n                                <div v-for=\"(item, index) of task.steps\" :key=\"item.id\" class=\"flex-o w-100\">\n                                  <span class=\"ellipsis flex-1 step-title\" :class=\"{ disabled: item.disabled, deleted: item.disabled }\"> {{ index + 1 }}. {{ item.title }} </span>\n                                  <pi-status-show v-if=\"!editMode\" :status=\"item.status?.result\"></pi-status-show>\n                                  <a-tooltip title=\"强制重新执行此步骤\">\n                                    <fs-icon v-if=\"!editMode\" class=\"pointer color-blue ml-2\" style=\"font-size: 16px\" title=\"强制重新执行此步骤\" icon=\"icon-park-outline:replay-music\" @click=\"run(item.id)\"></fs-icon>\n                                  </a-tooltip>\n                                </div>\n                              </template>\n                              <span class=\"flex-o w-100\">\n                                <span class=\"ellipsis flex-1 task-title\" :class=\"{ 'in-edit': editMode, deleted: task.disabled }\">{{ task.title }}</span>\n                                <pi-status-show v-if=\"!editMode\" :status=\"task.status?.result\"></pi-status-show>\n                              </span>\n                            </a-popover>\n                          </a-button>\n                          <div class=\"icon-box action copy\">\n                            <fs-icon v-if=\"editMode\" title=\"复制\" icon=\"ion:copy-outline\" @click=\"taskCopy(stage, index, task)\"></fs-icon>\n                          </div>\n                          <div v-plus class=\"icon-box task-move-handle action drag\">\n                            <fs-icon v-if=\"editMode\" title=\"拖动排序\" icon=\"ion:move-outline\"></fs-icon>\n                          </div>\n                          <div class=\"shortcut\">\n                            <TaskShortcuts :task=\"task\" />\n                          </div>\n                        </div>\n                      </div>\n                    </template>\n                    <template #footer>\n                      <div v-if=\"editMode && !(stage.maxTaskCount > 0 && stage.tasks.length >= stage.maxTaskCount)\" class=\"task-container is-add\">\n                        <div class=\"line line-left\">\n                          <div class=\"flow-line\"></div>\n                        </div>\n                        <div class=\"line line-right\">\n                          <div class=\"flow-line\"></div>\n                        </div>\n                        <div class=\"task\">\n                          <a-tooltip>\n                            <a-button type=\"dashed\" shape=\"round\" @click=\"taskAdd(stage, index)\">\n                              <fs-icon class=\"font-20\" icon=\"ion:add-circle-outline\"></fs-icon>\n                              添加任务\n                            </a-button>\n                          </a-tooltip>\n                        </div>\n                      </div>\n                    </template>\n                  </v-draggable>\n                </div>\n              </template>\n              <template #footer>\n                <div v-if=\"editMode\" class=\"stage last-stage\">\n                  <div class=\"title\">\n                    <text-editable model-value=\"新阶段\" :disabled=\"true\" />\n                  </div>\n                  <div class=\"tasks\">\n                    <div class=\"task-container first-task\">\n                      <div class=\"line line-left\">\n                        <div class=\"flow-line\"></div>\n                        <fs-icon class=\"add-stage-btn\" title=\"添加新阶段\" icon=\"ion:add-circle\" @click=\"stageAdd()\"></fs-icon>\n                      </div>\n                      <div class=\"task\">\n                        <a-button shape=\"round\" type=\"dashed\" @click=\"stageAdd()\">\n                          <fs-icon icon=\"ion:add-circle-outline\"></fs-icon>\n                          添加任务\n                        </a-button>\n                      </div>\n                    </div>\n                    <div class=\"task-container\">\n                      <div class=\"line line-left\">\n                        <div class=\"flow-line\"></div>\n                      </div>\n                      <div class=\"task\">\n                        <a-button shape=\"round\" type=\"dashed\" @click=\"notificationAdd()\">\n                          <fs-icon icon=\"ion:add-circle-outline\"></fs-icon>\n                          添加通知\n                        </a-button>\n                      </div>\n                    </div>\n                    <div v-for=\"(item, ii) of pipeline.notifications\" :key=\"ii\" class=\"task-container\">\n                      <div class=\"line line-left\">\n                        <div class=\"flow-line\"></div>\n                      </div>\n                      <div class=\"task\">\n                        <a-button shape=\"round\" @click=\"notificationEdit(item, ii as number)\">\n                          <div class=\"flex-o w-100\">\n                            <fs-icon icon=\"ion:notifications\"></fs-icon>\n                            <span class=\"ellipsis flex-1 step-title align-left\"> 【通知】 {{ item.title || item.type }} </span>\n                          </div>\n                        </a-button>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div v-else class=\"stage last-stage\">\n                  <div class=\"title\">\n                    <text-editable model-value=\"结束\" :disabled=\"true\" />\n                  </div>\n                  <div v-if=\"pipeline.notifications?.length > 0\" class=\"tasks\">\n                    <div v-for=\"(item, index) of pipeline.notifications\" :key=\"index\" class=\"task-container\" :class=\"{ 'first-task': index == 0 }\">\n                      <div class=\"line line-left\">\n                        <div class=\"flow-line\"></div>\n                      </div>\n                      <div class=\"task\">\n                        <a-button shape=\"round\" @click=\"notificationEdit(item, index)\">\n                          <div class=\"flex-o w-100\">\n                            <fs-icon icon=\"ion:notifications\"></fs-icon>\n                            <span class=\"ellipsis flex-1 step-title align-left\"> 【通知】 {{ item.title || item.type }} </span>\n                          </div>\n                        </a-button>\n                      </div>\n                    </div>\n                  </div>\n                  <div v-else class=\"tasks\">\n                    <div class=\"task-container first-task\">\n                      <div class=\"line line-left\">\n                        <div class=\"flow-line\"></div>\n                      </div>\n                      <div class=\"task\">\n                        <a-button shape=\"round\" type=\"dashed\">\n                          <fs-icon icon=\"ion:notifications\"></fs-icon>\n                          通知未设置\n                        </a-button>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </template>\n            </v-draggable>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"layout-right transition-all duration-300\" :class=\"{ collapsed: logsCollapse }\">\n        <div class=\"collapse-toggle bg-white dark:bg-black\" @click=\"toggleLogsCollapse\">\n          <fs-icon v-if=\"logsCollapse\" icon=\"ion:chevron-back-outline\"></fs-icon>\n          <fs-icon v-else icon=\"ion:chevron-forward-outline\"></fs-icon>\n        </div>\n        <a-page-header title=\"运行历史\" sub-title=\"点任务可查看日志\" class=\"logs-block\" :ghost=\"false\">\n          <a-timeline class=\"mt-10\">\n            <template v-for=\"item of histories\" :key=\"item.id\">\n              <pi-history-timeline-item\n                :runnable=\"item\"\n                :history-id=\"item.id\"\n                :is-current=\"currentHistory?.id === item.id\"\n                :edit-mode=\"editMode\"\n                @view=\"historyView(item)\"\n                @cancel=\"historyCancel()\"\n              ></pi-history-timeline-item>\n            </template>\n            <a-empty v-if=\"histories.length === 0\"></a-empty>\n          </a-timeline>\n        </a-page-header>\n      </div>\n    </div>\n\n    <pi-task-form ref=\"taskFormRef\" :edit-mode=\"editMode\"></pi-task-form>\n    <pi-trigger-form ref=\"triggerFormRef\" :edit-mode=\"editMode\"></pi-trigger-form>\n    <pi-task-view ref=\"taskViewRef\" @run=\"run\"></pi-task-view>\n    <PiNotificationForm ref=\"notificationFormRef\" :edit-mode=\"editMode\"></PiNotificationForm>\n  </fs-page>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, onUnmounted, provide, ref, Ref, watch } from \"vue\";\nimport { useRouter } from \"vue-router\";\nimport PiTaskForm from \"./component/task-form/index.vue\";\nimport PiTriggerForm from \"./component/trigger-form/index.vue\";\nimport PiNotificationForm from \"./component/notification-form/index.vue\";\nimport PiTaskView from \"./component/task-view/index.vue\";\nimport PiStatusShow from \"./component/status-show.vue\";\nimport VDraggable from \"vuedraggable\";\nimport { cloneDeep, merge, remove } from \"lodash-es\";\nimport { message, Modal, notification } from \"ant-design-vue\";\nimport { nanoid } from \"nanoid\";\nimport { PipelineDetail, PipelineOptions, RunHistory } from \"./type\";\nimport type { Runnable, Stage } from \"@certd/pipeline\";\nimport PiHistoryTimelineItem from \"/@/views/certd/pipeline/pipeline/component/history-timeline-item.vue\";\nimport { FsIcon } from \"@fast-crud/fast-crud\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { useUserStore } from \"/@/store/user\";\nimport TaskShortcuts from \"./component/shortcut/task-shortcuts.vue\";\nimport { eachSteps, findStep } from \"../utils\";\nimport { usePluginStore } from \"/@/store/plugin\";\nimport { getCronNextTimes } from \"/@/components/cron-editor/utils\";\nimport { useCertViewer } from \"/@/views/certd/pipeline/use\";\nimport { useI18n } from \"/@/locales\";\n\nexport default defineComponent({\n  name: \"PipelineEdit\",\n  // eslint-disable-next-line vue/no-unused-components\n  components: {\n    FsIcon,\n    PiHistoryTimelineItem,\n    PiTaskForm,\n    PiTriggerForm,\n    PiTaskView,\n    PiStatusShow,\n    PiNotificationForm,\n    VDraggable,\n    TaskShortcuts,\n  },\n  props: {\n    pipelineId: {\n      type: [Number, String],\n      default: 0,\n    },\n    historyId: {\n      type: [Number, String],\n      default: 0,\n    },\n    editMode: {\n      type: Boolean,\n      default: false,\n    },\n    options: {\n      type: Object as PropType<PipelineOptions>,\n      default() {\n        return {};\n      },\n    },\n  },\n  emits: [\"update:modelValue\", \"update:editMode\"],\n  setup(props, ctx) {\n    const { t } = useI18n();\n    const currentPipeline: Ref<any> = ref({});\n    const pipeline: Ref<any> = ref({});\n\n    const histories: Ref<RunHistory[]> = ref([]);\n\n    const currentHistory: Ref<any> = ref({});\n\n    const nextTriggerTimes = computed(() => {\n      const triggers = pipeline.value.triggers;\n      if (!triggers || triggers.length === 0) {\n        return false;\n      }\n      let nextTimes: any = [];\n      for (const item of triggers) {\n        if (!item.props?.cron) {\n          continue;\n        }\n        const ret = getCronNextTimes(item.props?.cron, 1);\n        nextTimes.push(...ret);\n      }\n      return nextTimes.join(\"，\");\n    });\n\n    const router = useRouter();\n\n    function goBack() {\n      router.back();\n    }\n\n    const loadCurrentHistoryDetail = async () => {\n      const detail: RunHistory = await props.options?.getHistoryDetail({ historyId: currentHistory.value.id });\n      currentHistory.value.logs = detail.logs;\n      currentHistory.value.pipeline = detail.pipeline;\n      currentHistory.value.status = detail.pipeline.status.result;\n    };\n    const changeCurrentHistory = async (history?: RunHistory) => {\n      if (!history) {\n        //取消历史记录查看模式\n        currentHistory.value = null;\n        pipeline.value = cloneDeep(currentPipeline.value);\n        return;\n      }\n      currentHistory.value = history;\n      await loadCurrentHistoryDetail();\n      pipeline.value = currentHistory.value.pipeline;\n      currentPipeline.value = currentHistory.value.pipeline;\n    };\n\n    async function loadHistoryList(reload = false) {\n      if (props.editMode) {\n        return;\n      }\n      if (reload) {\n        histories.value = [];\n      }\n      const historyList = await props.options.getHistoryList({ pipelineId: pipeline.value.id });\n      if (!historyList) {\n        return;\n      }\n      if (histories.value.length > 0 && histories.value[0].id === historyList[0].id) {\n        return;\n      }\n      histories.value = historyList;\n\n      if (historyList.length > 0) {\n        //@ts-ignore\n        if (props.historyId > 0) {\n          const found = historyList.find(item => {\n            //字符串==int\n            return item.id == props.historyId;\n          });\n          if (found) {\n            await changeCurrentHistory(found);\n            return true;\n          }\n        }\n        //@ts-ignore\n        if (historyList[0]?.version === pipeline.value.version) {\n          await changeCurrentHistory(historyList[0]);\n        }\n      }\n      return true;\n    }\n\n    const intervalLoadHistoryRef = ref();\n    const isLoadingHistory = ref(false);\n\n    function watchNewHistoryList() {\n      intervalLoadHistoryRef.value = setInterval(async () => {\n        if (isLoadingHistory.value) {\n          return;\n        }\n        try {\n          isLoadingHistory.value = true;\n          if (currentHistory.value == null) {\n            await loadHistoryList();\n          }\n\n          if (currentHistory.value != null) {\n            if (currentHistory.value.status === \"start\") {\n              await loadCurrentHistoryDetail();\n              pipeline.value = currentHistory.value.pipeline;\n              // if (currentHistory.value.pipeline?.status?.status !== \"start\") {\n              // 不传true好像不会刷新\n              //   await loadHistoryList(true);\n              // }\n            }\n          }\n        } catch (e) {\n          console.error(e);\n        } finally {\n          isLoadingHistory.value = false;\n        }\n      }, 3000);\n    }\n\n    onMounted(() => {\n      watchNewHistoryList();\n    });\n    onUnmounted(() => {\n      clearInterval(intervalLoadHistoryRef.value);\n    });\n\n    watch(\n      () => {\n        return props.editMode;\n      },\n      editMode => {\n        if (editMode) {\n          changeCurrentHistory();\n        } else if (histories.value.length > 0) {\n          if (histories.value[0].pipeline.version === pipeline.value.version) {\n            changeCurrentHistory(histories.value[0]);\n          }\n        }\n      }\n    );\n    watch(\n      () => {\n        return props.pipelineId;\n      },\n      async (value: any) => {\n        if (!value) {\n          return;\n        }\n        const detail: PipelineDetail = await props.options.getPipelineDetail({ pipelineId: value });\n        currentPipeline.value = merge(\n          {\n            title: \"新管道流程\",\n            stages: [],\n            triggers: [],\n            notifications: [],\n          },\n          detail.pipeline\n        );\n        pipeline.value = currentPipeline.value;\n        await loadHistoryList(true);\n      },\n      {\n        immediate: true,\n      }\n    );\n\n    const pluginStore = usePluginStore();\n    const fetchPlugins = async () => {\n      await pluginStore.init();\n    };\n    fetchPlugins();\n\n    provide(\"pipeline\", pipeline);\n    provide(\"getPluginGroups\", () => {\n      return pluginStore.group;\n    });\n    provide(\"currentHistory\", currentHistory);\n\n    function useTask() {\n      const taskFormRef: Ref<any> = ref(null);\n      const currentStageIndex = ref(0);\n      const currentTaskIndex = ref(0);\n      provide(\"currentStageIndex\", currentStageIndex);\n      provide(\"currentTaskIndex\", currentTaskIndex);\n\n      function useTaskView() {\n        const taskViewRef: Ref<any> = ref(null);\n        const taskViewOpen = (task: any) => {\n          taskViewRef.value.open(task);\n        };\n        return {\n          taskViewOpen,\n          taskViewRef,\n        };\n      }\n\n      const taskView = useTaskView();\n\n      const taskAdd = (stage: any, stageIndex: number, onSuccess?: any, taskDef?: any) => {\n        currentStageIndex.value = stageIndex;\n        currentTaskIndex.value = stage.tasks.length;\n        taskFormRef.value.taskAdd((type: any, value: any) => {\n          if (type === \"save\") {\n            stage.tasks.push(value);\n            if (onSuccess) {\n              onSuccess();\n            }\n          }\n        }, taskDef);\n      };\n\n      const taskCopy = (stage: any, stageIndex: number, task: any) => {\n        task = cloneDeep(task);\n        task.id = nanoid();\n        task.title = task.title + \"_copy\";\n        for (const step of task.steps) {\n          step.id = nanoid();\n        }\n        taskAdd(stage, stageIndex, null, task);\n      };\n\n      const taskEdit = (stage: any, stageIndex: number, task: any, taskIndex: number, onSuccess?: any) => {\n        currentStageIndex.value = stageIndex;\n        currentTaskIndex.value = taskIndex;\n        if (taskFormRef.value == null) {\n          return;\n        }\n        if (props.editMode) {\n          taskFormRef.value.taskEdit(task, (type: string, value: any) => {\n            if (type === \"delete\") {\n              stage.tasks.splice(taskIndex, 1);\n              if (stage.tasks.length === 0) {\n                remove(pipeline.value.stages, (item: Runnable) => {\n                  return item.id === stage.id;\n                });\n              }\n            } else if (type === \"save\") {\n              stage.tasks[taskIndex] = value;\n            }\n            if (onSuccess) {\n              onSuccess(type);\n            }\n          });\n        } else {\n          taskView.taskViewRef.value.taskViewOpen(task);\n        }\n      };\n\n      return { taskAdd, taskEdit, taskCopy, taskFormRef, ...taskView };\n    }\n\n    function useStage(useTaskRet: any) {\n      const stageAdd = (stageIndex = pipeline.value.stages.length) => {\n        const stage: any = {\n          id: nanoid(),\n          title: \"新阶段\",\n          tasks: [],\n          status: null,\n        };\n        //stage: any, stageIndex: number, onSuccess\n        useTaskRet.taskAdd(stage, stageIndex, () => {\n          let task = stage.tasks[0] as any;\n          stage.title = task.title + \"阶段\";\n          //插入阶段\n          pipeline.value.stages.splice(stageIndex, 0, stage);\n        });\n      };\n\n      function isLastStage(index: number) {\n        return false;\n      }\n\n      return {\n        stageAdd,\n        isLastStage,\n      };\n    }\n\n    function useTrigger() {\n      const triggerFormRef: Ref<any> = ref(null);\n      const triggerAdd = () => {\n        triggerFormRef.value.triggerAdd((type: string, value: any) => {\n          if (type === \"save\") {\n            pipeline.value.triggers.push(value);\n          }\n        });\n      };\n      const triggerEdit = (trigger: any, index: number) => {\n        if (triggerFormRef.value == null) {\n          return;\n        }\n        if (props.editMode) {\n          triggerFormRef.value.triggerEdit(trigger, (type: string, value: any) => {\n            if (type === \"delete\") {\n              pipeline.value.triggers.splice(index, 1);\n            } else if (type === \"save\") {\n              pipeline.value.triggers[index] = value;\n            }\n          });\n        } else {\n          triggerFormRef.value.triggerView(trigger, (type: string, value: any) => {});\n        }\n      };\n      return {\n        triggerAdd,\n        triggerEdit,\n        triggerFormRef,\n      };\n    }\n\n    function useNotification() {\n      const notificationFormRef = ref();\n      const notificationAdd = () => {\n        notificationFormRef.value.notificationAdd((type: string, value: any) => {\n          if (type === \"save\") {\n            if (pipeline.value.notifications == null) {\n              pipeline.value.notifications = [];\n            }\n            pipeline.value.notifications.push(value);\n          }\n        });\n      };\n      const notificationEdit = (notification: any, index: any) => {\n        if (notificationFormRef.value == null) {\n          return;\n        }\n        if (props.editMode) {\n          notificationFormRef.value.notificationEdit(notification, (type: string, value: any) => {\n            if (type === \"delete\") {\n              pipeline.value.notifications.splice(index, 1);\n            } else if (type === \"save\") {\n              pipeline.value.notifications[index] = value;\n            }\n          });\n        } else {\n          notificationFormRef.value.notificationView(notification, (type: string, value: any) => {});\n        }\n      };\n      const notificationDelete = (notification: any, index: any) => {\n        Modal.confirm({\n          title: t(\"certd.confirm\"),\n          content: t(\"certd.confirm_delete_trigger\"),\n          async onOk() {\n            pipeline.value.notifications.splice(index, 1);\n          },\n        });\n      };\n      return {\n        notificationAdd,\n        notificationEdit,\n        notificationDelete,\n        notificationFormRef,\n      };\n    }\n\n    function useActions() {\n      const saveLoading = ref();\n      const run = async (stepId?: string) => {\n        if (props.editMode) {\n          const res = await new Promise((resolve, reject) => {\n            Modal.confirm({\n              title: \"需要保存才能运行管道\",\n              content: \"是否先保存\",\n              onOk() {\n                save();\n                resolve(true);\n              },\n              onCancel() {\n                resolve(false);\n              },\n            });\n          });\n          if (!res) {\n            return;\n          }\n        }\n        if (!props.options.doTrigger) {\n          message.warn(\"暂不支持运行\");\n          return;\n        }\n        if (pipeline.value.stages == null || pipeline.value.stages.length === 0) {\n          message.warn(\"请先添加阶段和任务\");\n          return;\n        }\n        Modal.confirm({\n          title: \"确认\",\n          content: `确定要手动触发运行吗？`,\n          async onOk() {\n            //@ts-ignore\n            await changeCurrentHistory(null);\n            await props.options.doTrigger({ pipelineId: pipeline.value.id, stepId: stepId });\n            notification.success({ message: \"管道已经开始运行\" });\n          },\n        });\n      };\n\n      function toggleEditMode(editMode: boolean) {\n        ctx.emit(\"update:editMode\", editMode);\n      }\n\n      const validateErrors: Ref = ref({});\n\n      function addValidateError(taskId: string, error: any) {\n        const errors = validateErrors.value[taskId] || [];\n        validateErrors.value[taskId] = errors;\n        errors.push(error);\n      }\n\n      function doValidate() {\n        validateErrors.value = {};\n\n        const stepIds: string[] = [];\n        //校验output id是否正确\n        const pp = pipeline.value;\n\n        //检查输出的stepid是否存在\n        let hasError = false;\n        let errorMessage = \"\";\n        eachSteps(pp, (step: any, task: any, stage: any) => {\n          stepIds.push(step.id);\n          if (step.input) {\n            for (const key in step.input) {\n              const value = step.input[key];\n              if (value == null || typeof value != \"string\" || !value.startsWith(\"step.\")) {\n                continue;\n              }\n              const arr = value.split(\".\");\n              if (arr.length != 3) {\n                continue;\n              }\n              const stepId = arr[1];\n              const paramName = arr[2];\n              if (!stepIds.includes(stepId)) {\n                hasError = true;\n                const message = `任务${step.title}的前置输出步骤${paramName}不存在，请重新修改此任务`;\n                addValidateError(task.id, {\n                  message,\n                });\n                addValidateError(step.id, {\n                  message,\n                });\n                errorMessage += message + \"；\";\n              }\n            }\n          }\n        });\n\n        if (hasError) {\n          notification.error({ message: errorMessage });\n          throw new Error(errorMessage);\n        }\n      }\n\n      function hasValidateError(taskId: string) {\n        return validateErrors.value[taskId] != null;\n      }\n\n      const save = async (offEdit = true) => {\n        doValidate();\n\n        saveLoading.value = true;\n        try {\n          if (props.options.doSave) {\n            if (pipeline.value.version == null) {\n              pipeline.value.version = 0;\n            }\n            pipeline.value.version++;\n            currentPipeline.value = pipeline.value;\n\n            //移除空阶段\n            remove(pipeline.value.stages, (item: Stage) => {\n              return item.tasks.length === 0;\n            });\n\n            await props.options.doSave(pipeline.value);\n          }\n          if (offEdit) {\n            toggleEditMode(false);\n          }\n        } finally {\n          saveLoading.value = false;\n        }\n      };\n      const edit = () => {\n        pipeline.value = cloneDeep(currentPipeline.value);\n        currentHistory.value = null;\n        toggleEditMode(true);\n      };\n      const cancel = () => {\n        pipeline.value = cloneDeep(currentPipeline.value);\n        toggleEditMode(false);\n      };\n\n      function fundStepFromPipeline(id: string) {\n        return findStep(pipeline.value, id);\n      }\n\n      return {\n        run,\n        save,\n        edit,\n        cancel,\n        saveLoading,\n        hasValidateError,\n        findStep: fundStepFromPipeline,\n      };\n    }\n\n    function useHistory() {\n      const historyView = (history: any) => {\n        changeCurrentHistory(history);\n        console.log(\"currentPipeline\", pipeline);\n      };\n\n      const historyCancel = () => {\n        changeCurrentHistory();\n        console.log(\"currentPipeline\", pipeline);\n      };\n\n      const logsCollapse = ref(false);\n\n      function toggleLogsCollapse() {\n        logsCollapse.value = !logsCollapse.value;\n      }\n\n      return {\n        historyView,\n        historyCancel,\n        logsCollapse,\n        toggleLogsCollapse,\n      };\n    }\n\n    function useScroll() {\n      const pipelineContainer = ref();\n      onMounted(() => {\n        if (pipelineContainer.value) {\n          const scrollableDiv = pipelineContainer.value;\n          let isDragging = false;\n          let startX: any = null;\n          let scrollLeft: any = null;\n\n          scrollableDiv.addEventListener(\"mousedown\", (e: any) => {\n            isDragging = true;\n            startX = e.pageX - scrollableDiv.offsetLeft;\n            scrollLeft = scrollableDiv.scrollLeft;\n            scrollableDiv.style.cursor = \"grabbing\"; // 按住时变成抓手\n            e.stopPropagation();\n          });\n\n          scrollableDiv.addEventListener(\"mouseleave\", () => {\n            isDragging = false;\n            scrollableDiv.style.cursor = \"grab\"; // 离开时恢复光标\n          });\n\n          scrollableDiv.addEventListener(\"mouseup\", () => {\n            isDragging = false;\n            scrollableDiv.style.cursor = \"grab\"; // 松开时恢复光标\n          });\n\n          scrollableDiv.addEventListener(\"mousemove\", (e: any) => {\n            if (!isDragging) return; // 如果没有按住鼠标，退出\n            e.preventDefault();\n            const x = e.pageX - scrollableDiv.offsetLeft;\n            const walk = (x - startX) * 2; // 移动的速度\n            scrollableDiv.scrollLeft = scrollLeft - walk; // 更新滚动位置\n          });\n        }\n      });\n\n      return { pipelineContainer };\n    }\n\n    const useTaskRet = useTask();\n    const useStageRet = useStage(useTaskRet);\n    const settingStore = useSettingStore();\n    const userStore = useUserStore();\n\n    const actions = useActions();\n    const trigger = useTrigger();\n    provide(\"getPipelineScope\", () => {\n      return {\n        run: actions.run,\n        pipeline: pipeline,\n        save: actions.save,\n        findStep: actions.findStep,\n      };\n    });\n\n    const { viewCert, downloadCert } = useCertViewer();\n    const isCert = computed(() => {\n      return currentPipeline.value?.type?.startsWith(\"cert\");\n    });\n    return {\n      isCert,\n      pipeline,\n      currentHistory,\n      histories,\n      goBack,\n      userStore,\n      settingStore,\n      ...useTaskRet,\n      ...useStageRet,\n      ...trigger,\n      ...actions,\n      ...useHistory(),\n      ...useNotification(),\n      ...useScroll(),\n      nextTriggerTimes,\n      viewCert,\n      downloadCert,\n    };\n  },\n});\n</script>\n<style lang=\"less\">\n.page-pipeline-edit {\n  .fs-page-header {\n    .title {\n      overflow: hidden;\n      text-overflow: ellipsis;\n      text-wrap: nowrap;\n      display: flex;\n\n      .back {\n        margin-right: 10px;\n      }\n\n      .text-editable {\n        width: 300px;\n      }\n    }\n  }\n\n  .pi-status-show {\n    display: inline-flex;\n  }\n\n  .fs-page-content {\n    overflow-x: auto;\n  }\n\n  .layout {\n    width: 100%;\n    height: 100%;\n    position: relative;\n    display: flex;\n    overflow-x: hidden;\n\n    .layout-left {\n      flex: 1;\n      height: 100%;\n    }\n\n    .layout-right {\n      width: 350px;\n      height: 100%;\n    }\n  }\n\n  .pipeline-container {\n    width: 100%;\n    height: 100%;\n    position: relative;\n    overflow: auto;\n  }\n\n  .pipeline {\n    position: absolute;\n    left: 0;\n    top: 0;\n    height: 100%;\n\n    .stages {\n      display: flex;\n      overflow: auto;\n      min-width: 100%;\n      height: 100%;\n\n      .stage {\n        width: 300px;\n        border-right: 1px solid #c7c7c7;\n\n        .is-add {\n          visibility: hidden;\n          color: gray;\n        }\n\n        &:hover .is-add {\n          visibility: visible;\n        }\n\n        .title {\n          padding: 20px;\n          color: gray;\n          display: flex;\n\n          .stage-move-handle {\n            cursor: move;\n            margin-left: 4px;\n          }\n        }\n\n        //.sortable-ghost {\n        //  .line {\n        //    visibility: hidden;\n        //  }\n        //}\n        .line {\n          height: 50px;\n          position: absolute;\n          top: -25px;\n          width: 25px;\n\n          &.line-left {\n            left: 25px;\n\n            .flow-line {\n              border-right: 0;\n            }\n          }\n\n          &.line-right {\n            right: 25px;\n\n            .flow-line {\n              border-left: 0;\n            }\n          }\n\n          .flow-line {\n            height: 100%;\n            border: 1px solid #c7c7c7;\n            border-top: 0;\n          }\n\n          .add-stage-btn {\n            display: inline-flex;\n            visibility: hidden;\n            font-size: 24px;\n            cursor: pointer;\n            position: absolute;\n            bottom: -12px;\n            left: -12px;\n            z-index: 100;\n\n            &:hover {\n              color: #1890ff;\n            }\n          }\n        }\n\n        .task-container:first-child {\n          .line {\n            width: 50px;\n\n            &.line-left {\n              left: 0;\n\n              .flow-line {\n                border-right: 0;\n                border-left: 0;\n              }\n            }\n\n            &.line-right {\n              right: 0;\n\n              .flow-line {\n                border-left: 0;\n                border-right: 0;\n              }\n            }\n\n            .add-stage-btn {\n              visibility: visible;\n            }\n          }\n        }\n\n        &.first-stage {\n          .line {\n            .flow-line {\n              border-left: 0;\n            }\n          }\n        }\n\n        &.last-stage {\n          .line {\n            width: 50% !important;\n            right: auto;\n\n            .flow-line {\n              border-right: 0;\n            }\n\n            .add-stage-btn {\n              visibility: hidden;\n            }\n          }\n        }\n\n        .tasks {\n          .task-container {\n            width: 100%;\n            height: 50px;\n            display: flex;\n            flex-direction: column;\n            justify-content: center;\n            align-items: center;\n            position: relative;\n\n            &.validate-error {\n              .task {\n                .ant-btn {\n                  border-color: red;\n                }\n              }\n            }\n\n            .task {\n              display: flex;\n              flex-direction: column;\n              justify-content: center;\n              align-items: center;\n              height: 100%;\n              z-index: 2;\n\n              .task-title {\n                &.in-edit {\n                  margin-right: 28px;\n                }\n\n                &.disabled {\n                }\n              }\n\n              .action {\n                position: absolute;\n                right: 10px;\n                top: 17px;\n                //font-size: 18px;\n                cursor: pointer;\n                z-index: 10;\n\n                &:hover {\n                  color: #1890ff;\n                }\n\n                &.copy {\n                  right: 30px;\n                }\n\n                &.drag {\n                  right: 10px;\n                  cursor: move;\n                }\n              }\n\n              .ant-btn {\n                width: 200px;\n              }\n\n              position: relative;\n\n              .shortcut {\n                position: absolute;\n                bottom: -10px;\n                left: 20px;\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  .layout-right {\n    position: relative;\n\n    &.collapsed {\n      margin-right: -350px;\n    }\n\n    .collapse-toggle {\n      position: absolute;\n      margin-left: -30px;\n      top: 10px;\n      cursor: pointer;\n      font-size: 20px;\n      color: #1890ff;\n      width: 30px;\n      height: 30px;\n      border: 1px solid #eee;\n      border-right: 0;\n      border-radius: 5px 0 0 5px;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n    }\n\n    .logs-block {\n      height: 100%;\n      overflow-y: auto;\n      max-width: 90vw;\n\n      .ant-page-header-content {\n        position: relative;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/plugin/index.ts",
    "content": "export class PluginManager {\n  // @ts-ignore\n  map: {\n    [key: string]: any;\n  } = {};\n\n  /**\n   * 初始化plugins\n   * @param plugins\n   */\n  init(plugins: any) {\n    const list = plugins;\n    const map: any = {};\n    for (const plugin of list) {\n      map[plugin.key] = plugin;\n    }\n    this.map = map;\n  }\n}\n\nexport const pluginManager = new PluginManager();\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/type.ts",
    "content": "import type { Pipeline } from \"@certd/pipeline\";\nimport { PluginGroups } from \"/@/store/plugin\";\n\nexport type PipelineDetail = {\n  pipeline: Pipeline;\n};\n\nexport type RunHistory = {\n  id: any;\n  pipeline: Pipeline;\n  logs?: {\n    [id: string]: string[];\n  };\n};\n\nexport type PipelineOptions = {\n  doTrigger(options: { pipelineId: number; stepId?: string }): Promise<void>;\n  doSave(pipelineConfig: Pipeline): Promise<void>;\n  getPipelineDetail(query: { pipelineId: number }): Promise<PipelineDetail>;\n  getHistoryList(query: { pipelineId: number }): Promise<RunHistory[]>;\n  getHistoryDetail(query: { historyId: number }): Promise<RunHistory>;\n  getPluginGroups(): Promise<PluginGroups>;\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/pipeline/utils/util.status.ts",
    "content": "export type StatusEnumItem = {\n  value: string;\n  label: string;\n  color: string;\n  icon: string;\n  spin?: boolean;\n  iconSpin?: boolean;\n  iconColor?: string;\n};\nexport type StatusEnumType = {\n  [key: string]: StatusEnumItem;\n};\n\nconst StatusEnum: StatusEnumType = {\n  success: {\n    value: \"success\",\n    label: \"成功\",\n    color: \"green\",\n    spin: false,\n    icon: \"ant-design:check-circle-outlined\",\n  },\n  error: {\n    value: \"error\",\n    label: \"错误\",\n    color: \"red\",\n    icon: \"ant-design:info-circle-outlined\",\n  },\n  skip: {\n    value: \"skip\",\n    label: \"跳过\",\n    color: \"blue\",\n    icon: \"fluent:arrow-step-over-20-filled\",\n  },\n  start: {\n    value: \"start\",\n    label: \"运行中\",\n    color: \"blue\",\n    spin: true,\n    iconSpin: true,\n    icon: \"ant-design:sync-outlined\",\n  },\n  canceled: {\n    value: \"canceled\",\n    label: \"已取消\",\n    color: \"yellow\",\n    iconColor: \"#d4b106\",\n    icon: \"ant-design:minus-circle-twotone\",\n  },\n  none: {\n    value: \"none\",\n    label: \"未运行\",\n    color: \"blue\",\n    icon: \"ant-design:minus-circle-twotone\",\n  },\n  disabled: {\n    value: \"disabled\",\n    label: \"禁用\",\n    color: \"gray\",\n    icon: \"ant-design:stop-outlined\",\n  },\n  no_deploy_count: {\n    value: \"no_deploy_count\",\n    label: \"次数不足\",\n    color: \"gray\",\n    icon: \"ant-design:stop-outlined\",\n  },\n};\nexport const statusUtil = {\n  getColor(status = \"none\") {\n    return StatusEnum[status].color;\n  },\n  get(status = \"none\") {\n    return StatusEnum[status];\n  },\n\n  getOptions() {\n    const options: any[] = [];\n    for (const key of Object.keys(StatusEnum)) {\n      options.push(StatusEnum[key]);\n    }\n    return options;\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/sub-domain/api.ts",
    "content": "// @ts-ignore\nimport { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/pi/subDomain\";\n\nexport async function GetList(query: any) {\n  return await request({\n    url: apiPrefix + \"/page\",\n    method: \"post\",\n    data: query,\n  });\n}\n\nexport async function AddObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/add\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function UpdateObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/update\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function DelObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/delete\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/info\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetDetail(id: any) {\n  return await request({\n    url: apiPrefix + \"/detail\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function DeleteBatch(ids: any[]) {\n  return await request({\n    url: apiPrefix + \"/batchDelete\",\n    method: \"post\",\n    data: { ids },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/sub-domain/crud.tsx",
    "content": "import * as api from \"./api\";\nimport { Ref, ref } from \"vue\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { useI18n } from \"/src/locales\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { t } = useI18n();\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  const selectedRowKeys: Ref<any[]> = ref([]);\n  context.selectedRowKeys = selectedRowKeys;\n\n  return {\n    crudOptions: {\n      settings: {\n        plugins: {\n          //这里使用行选择插件，生成行选择crudOptions配置，最终会与crudOptions合并\n          rowSelection: {\n            enabled: true,\n            order: -2,\n            before: true,\n            // handle: (pluginProps,useCrudProps)=>CrudOptions,\n            props: {\n              multiple: true,\n              crossPage: true,\n              selectedRowKeys,\n            },\n          },\n        },\n      },\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      // tabs: {\n      //   name: \"status\",\n      //   show: true,\n      // },\n      rowHandle: {\n        minWidth: 200,\n        fixed: \"right\",\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          column: {\n            width: 80,\n          },\n          form: {\n            show: false,\n          },\n        },\n        domain: {\n          title: t(\"certd.subdomainHosted\"),\n          type: \"text\",\n          search: {\n            show: true,\n          },\n          form: {\n            helper: {\n              render() {\n                return (\n                  <div>\n                    {t(\"certd.subdomainHelpText\")}\n                    <a href={\"https://help.aliyun.com/zh/dns/subdomain-management\"} target={\"_blank\"}>\n                      {t(\"certd.subdomainManagement\")}\n                    </a>\n                  </div>\n                );\n              },\n            },\n          },\n          editForm: {\n            component: {\n              disabled: true,\n            },\n          },\n        },\n        disabled: {\n          title: t(\"certd.isDisabled\"),\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { value: false, label: t(\"certd.enabled\"), color: \"green\" },\n              { value: true, label: t(\"certd.disabled\"), color: \"gray\" },\n            ],\n          }),\n          search: {\n            show: true,\n          },\n          form: {\n            value: false,\n          },\n        },\n        createTime: {\n          title: t(\"certd.createTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 160,\n            align: \"center\",\n          },\n        },\n        updateTime: {\n          title: t(\"certd.updateTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            show: true,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/sub-domain/index.vue",
    "content": "<template>\n  <fs-page class=\"page-cert\">\n    <template #header>\n      <div class=\"title\">\n        {{ t(\"certd.subdomainHosting\") }}\n        <span class=\"sub\">\n          {{ t(\"certd.subdomainHostingHint\") }}； {{ t(\"certd.subdomainHelpText\") }}\n          <a href=\"https://help.aliyun.com/zh/dns/subdomain-management\" target=\"_blank\">\n            {{ t(\"certd.subdomainManagement\") }}\n          </a>\n        </span>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\">\n      <template #pagination-left>\n        <a-tooltip :title=\"t('certd.batchDelete')\">\n          <fs-button icon=\"DeleteOutlined\" @click=\"handleBatchDelete\"></fs-button>\n        </a-tooltip>\n      </template>\n    </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { message, Modal } from \"ant-design-vue\";\nimport { DeleteBatch } from \"./api\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\ndefineOptions({\n  name: \"CnameRecord\",\n});\nconst { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions });\n\nconst selectedRowKeys = context.selectedRowKeys;\nconst handleBatchDelete = () => {\n  if (selectedRowKeys.value?.length > 0) {\n    Modal.confirm({\n      title: t(\"certd.confirm\"),\n      content: t(\"certd.batchDeleteConfirm\", { count: selectedRowKeys.value.length }),\n      async onOk() {\n        await DeleteBatch(selectedRowKeys.value);\n        message.info(t(\"certd.deleteSuccess\"));\n        crudExpose.doRefresh();\n        selectedRowKeys.value = [];\n      },\n    });\n  } else {\n    message.error(t(\"certd.selectRecordFirst\"));\n  }\n};\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(async () => {\n  await crudExpose.doRefresh();\n});\n</script>\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/template/api.ts",
    "content": "import { request } from \"/src/api/service\";\nimport { CertInfo } from \"/@/views/certd/pipeline/api\";\n\nconst apiPrefix = \"/pi/template\";\nexport const templateApi = {\n  async GetList(query: any) {\n    return await request({\n      url: apiPrefix + \"/page\",\n      method: \"post\",\n      data: query,\n    });\n  },\n\n  async AddObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/add\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async UpdateObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/update\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async DelObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/delete\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n\n  async GetObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/info\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n\n  async GetDetail(id: number) {\n    return await request({\n      url: apiPrefix + \"/detail\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n  async ListAll() {\n    return await request({\n      url: apiPrefix + \"/all\",\n      method: \"post\",\n    });\n  },\n\n  async CreatePipelineByTemplate(data: any) {\n    return await request({\n      url: apiPrefix + \"/createPipelineByTemplate\",\n      method: \"post\",\n      data,\n    });\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/template/crud.tsx",
    "content": "import { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, useFormWrapper, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { templateApi } from \"./api\";\nimport { useRouter } from \"vue-router\";\nimport { useModal } from \"/@/use/use-modal\";\nimport createCrudOptionsPipeline from \"../crud\";\nimport * as pipelineApi from \"../api\";\nimport { useTemplate } from \"/@/views/certd/pipeline/template/use\";\nimport { useI18n } from \"/@/locales\";\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const api = templateApi;\n  const { t } = useI18n();\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async (req: EditReq) => {\n    const { form, row } = req;\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async (req: DelReq) => {\n    const { row } = req;\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async (req: AddReq) => {\n    const { form } = req;\n    const res = await api.AddObj(form);\n    return res;\n  };\n  const { openCrudFormDialog } = useFormWrapper();\n  const router = useRouter();\n\n  const model = useModal();\n\n  const { openCreateFromTemplateDialog } = useTemplate();\n\n  return {\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      addForm: {\n        onSuccess: ({ res }) => {\n          router.push({ path: \"/certd/pipeline/template/edit\", query: { templateId: res.id, editMode: \"true\" } });\n        },\n      },\n      form: {\n        labelCol: {\n          //固定label宽度\n          span: null,\n          style: {\n            width: \"100px\",\n          },\n        },\n        col: {\n          span: 22,\n        },\n        wrapper: {\n          width: 600,\n        },\n      },\n      actionbar: {\n        show: true,\n        buttons: {\n          add: {\n            text: t(\"certd.template.createTemplate\"),\n            type: \"primary\",\n            show: true,\n          },\n        },\n      },\n      rowHandle: {\n        // width: 100,\n        fixed: \"right\",\n        buttons: {\n          edit: { show: false },\n          copy: { show: false },\n          // use: {\n          //   text: null,\n          //   title: \"使用此模版创建流水线\",\n          //   icon: \"ion:duplicate-outline\",\n          //   click({ row }) {\n          //     openCreateFromTemplateDialog({\n          //       templateId: row.id,\n          //       onCreated: ({ id }) => {\n          //         router.push({ path: \"/certd/pipeline/detail\", query: { id, editMode: \"true\" } });\n          //       },\n          //     });\n          //   },\n          // },\n          // import: {\n          //   text: null,\n          //   title: \"批量导入创建\",\n          //   icon: \"ion:duplicate\",\n          //   click({ row }) {\n          //     router.push({ path: \"/certd/pipeline/template/import\", query: { templateId: row.id } });\n          //   },\n          // },\n        },\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          search: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            editable: {\n              disabled: true,\n            },\n          },\n          form: {\n            show: false,\n          },\n        },\n        title: {\n          title: t(\"certd.template.templateName\"),\n          type: \"text\",\n          search: {\n            show: true,\n          },\n          form: {\n            rules: [{ required: true, message: t(\"certd.template.enterTemplateName\") }],\n          },\n          column: {\n            width: 400,\n            sorter: true,\n            cellRender({ row, value }) {\n              return (\n                <router-link class={\"flex items-center\"} to={{ path: \"/certd/pipeline/template/edit\", query: { templateId: row.id } }}>\n                  <fs-icon icon={\"ion:create-outline\"}></fs-icon>\n                  <span class={\"ml-5\"}> {value}</span>\n                </router-link>\n              );\n            },\n          },\n        },\n        pipelineId: {\n          title: t(\"certd.template.pipeline\"),\n          type: \"table-select\",\n          search: { show: true },\n          dict: dict({\n            value: \"id\",\n            label: \"title\",\n            //重要，根据value懒加载数据\n            getNodesByValues: async (values: any[]) => {\n              return await pipelineApi.GetSimpleByIds(values);\n            },\n          }),\n          editForm: {\n            show: false,\n          },\n          column: {\n            show: false,\n          },\n          form: {\n            show: true,\n            helper: t(\"certd.template.copyPipelineConfig\"),\n            component: {\n              valuesFormat: {\n                labelFormatter: (item: any) => {\n                  return `${item.id}.${item.title}`;\n                },\n              },\n              select: {\n                placeholder: \"点击选择\",\n              },\n              showSelect: false,\n              createCrudOptions: createCrudOptionsPipeline,\n              crudOptionsOverride: {\n                actionbar: {\n                  show: false,\n                },\n                toolbar: {\n                  show: false,\n                },\n                columns: {\n                  title: {\n                    column: {\n                      cellRender: null,\n                    },\n                  },\n                },\n              },\n            },\n          },\n        },\n        useCreate: {\n          title: t(\"certd.template.useTemplate\"),\n          form: { show: false },\n          column: {\n            conditionalRender: false,\n            width: 400,\n            cellRender({ row }) {\n              function create() {\n                openCreateFromTemplateDialog({\n                  templateId: row.id,\n                  onCreated: ({ id }) => {\n                    router.push({ path: \"/certd/pipeline/detail\", query: { id, editMode: \"true\" } });\n                  },\n                });\n              }\n              return (\n                <a class={\"flex items-center\"} onClick={create}>\n                  <fs-icon icon={\"ion:duplicate-outline\"}></fs-icon>\n                  <span class={\"ml-5\"}>{t(\"certd.template.singleCreate\")}</span>\n                </a>\n              );\n            },\n          },\n        },\n        useImport: {\n          title: t(\"certd.template.useTemplate\"),\n          form: { show: false },\n          column: {\n            conditionalRender: false,\n            width: 400,\n            cellRender({ row }) {\n              return (\n                <router-link class={\"flex items-center\"} to={{ path: \"/certd/pipeline/template/import\", query: { templateId: row.id } }}>\n                  <fs-icon icon={\"ion:duplicate\"}></fs-icon>\n                  <span class={\"ml-5\"}>{t(\"certd.template.batchCreate\")}</span>\n                </router-link>\n              );\n            },\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/template/edit.vue",
    "content": "<template>\n  <fs-page>\n    <template #header>\n      <div class=\"title flex flex-1\">\n        <fs-button class=\"back\" icon=\"ion:chevron-back-outline\" @click=\"goBack\"></fs-button>\n        <text-editable v-if=\"detail?.template\" v-model=\"detail.template.title\" class=\"ml-10\" :hover-show=\"false\"></text-editable>\n      </div>\n\n      <div class=\"more flex items-center flex-1 justify-end\">\n        <loading-button type=\"primary\" @click=\"doSave\">保存模版</loading-button>\n        <loading-button class=\"ml-10\" type=\"primary\" @click=\"useTemplateCreate\">使用模版</loading-button>\n        <loading-button class=\"ml-10\" type=\"primary\" danger @click=\"doDelete\">删除模版</loading-button>\n      </div>\n    </template>\n    <div class=\"page-template-edit\">\n      <div class=\"base\"></div>\n      <div class=\"props flex p-10\">\n        <div class=\"task-list w-50%\">\n          <div class=\"block-title flex flex-between\">\n            <div>\n              模版流水线参数\n              <div class=\"helper\">点击加号，将字段作为模版变量</div>\n            </div>\n            <div class=\"more\">\n              <router-link\n                v-if=\"detail?.template?.pipelineId > 0\"\n                :to=\"{\n                  path: '/certd/pipeline/detail',\n                  query: { id: detail?.template?.pipelineId, editMode: true },\n                }\"\n              >\n                修改模版流水线\n              </router-link>\n            </div>\n          </div>\n          <a-collapse v-if=\"detail?.template?.pipelineId > 0\" v-model:active-key=\"activeKey\">\n            <a-collapse-panel v-for=\"(step, stepId) in steps\" :key=\"stepId\" class=\"step-item\" :header=\"step.title\">\n              <div class=\"step-inputs flex flex-wrap\">\n                <div v-for=\"(input, key) of step.input\" :key=\"key\" class=\"hover:bg-gray-100 p-5 w-full xl:w-[50%]\">\n                  <div class=\"flex flex-between\" :title=\"input.define.helper\">\n                    <div class=\"flex flex-1 overflow-hidden mr-5\">\n                      <span style=\"min-width: 140px\" class=\"bas\">\n                        <a-tag color=\"green\">{{ input.define.title }}</a-tag>\n                      </span>\n                      <span :title=\"input.value\" class=\"ellipsis flex-1 text-nowrap\">= {{ input.value }}</span>\n                    </div>\n                    <fs-button v-if=\"!templateProps.input[stepId + '.' + key]\" size=\"small\" type=\"primary\" icon=\"ion:add\" title=\"添加为模版变量\" @click=\"addToProps(step.id, key)\"></fs-button>\n                    <fs-button v-else size=\"small\" danger icon=\"ion:close\" title=\"删除模版变量\" @click=\"removeToProps(step.id, key)\" />\n                  </div>\n                </div>\n              </div>\n            </a-collapse-panel>\n          </a-collapse>\n\n          <div v-else-if=\"detail?.template?.pipelineId === 0\">\n            <div class=\"p-20 flex flex-col flex-center text-sm\">\n              <div class=\"mb-10\">还未绑定模版流水线</div>\n              <div>\n                <a-button type=\"primary\" @click=\"bindPipelineByCreate\">创建新流水线作为模版</a-button>\n                或\n                <a-button type=\"primary\" @click=\"bindPipelineByCopy\">从已有流水线复制</a-button>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"template-props w-50%\">\n          <div class=\"block-title\">\n            模版变量\n            <div class=\"helper\">根据模版创建流水线时，只需要输入以下这些字段，其他字段将使用左侧的值</div>\n          </div>\n          <div class=\"p-10\">\n            <!--          <fs-form v-bind=\"templateFormOptions\"></fs-form>-->\n            <template-form :input=\"templateProps.input\" :pipeline=\"detail?.pipeline\"></template-form>\n          </div>\n        </div>\n      </div>\n    </div>\n  </fs-page>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onMounted, ref, Ref } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport { templateApi } from \"./api\";\nimport { usePluginStore } from \"/@/store/plugin\";\nimport { useStepHelper } from \"./utils\";\nimport TemplateForm from \"./form.vue\";\nimport { Modal, notification } from \"ant-design-vue\";\nimport { useTabbarStore } from \"/@/vben/stores\";\nimport { useTemplate } from \"./use\";\nconst route = useRoute();\nconst templateId = route.query.templateId as string;\n\nconst router = useRouter();\n\nfunction goBack() {\n  router.back();\n}\n\ntype TemplateDetail = {\n  template: any;\n  pipeline: any;\n};\nconst templateProps: Ref = ref({\n  input: {},\n});\nconst detail: Ref<TemplateDetail> = ref();\nasync function getTemplateDetail() {\n  if (!templateId) {\n    return;\n  }\n  const res = await templateApi.GetDetail(parseInt(templateId));\n  detail.value = res;\n  if (res.template.content) {\n    templateProps.value = JSON.parse(res.template.content);\n  }\n}\n\nconst pluginStore = usePluginStore();\n\nconst activeKey = ref([]);\nonMounted(async () => {\n  await pluginStore.init();\n  await getTemplateDetail();\n  nextTick(() => {\n    const keys = Object.keys(steps.value);\n    if (keys.length > 0) {\n      activeKey.value = [keys[0]];\n    }\n  });\n});\n\nconst { getStepsMap } = useStepHelper(pluginStore);\nconst steps = computed(() => {\n  if (!detail.value || !detail.value.pipeline) {\n    return {};\n  }\n\n  return getStepsMap(detail.value.pipeline);\n});\n\nfunction addToProps(stepId: string, key: any) {\n  if (!templateProps.value.input) {\n    templateProps.value.input = {};\n  }\n  const inputKey = stepId + \".\" + key;\n  templateProps.value.input[inputKey] = true;\n}\n\nfunction removeToProps(stepId: string, key: any) {\n  const inputKey = stepId + \".\" + key;\n  delete templateProps.value.input[inputKey];\n}\n\nasync function doSave() {\n  await templateApi.UpdateObj({\n    id: detail.value.template.id,\n    title: detail.value.template.title,\n    content: JSON.stringify(templateProps.value),\n  });\n  notification.success({\n    message: \"保存成功\",\n  });\n}\n\nconst tabbar = useTabbarStore();\nasync function doDelete() {\n  Modal.confirm({\n    title: \"确定删除模版？\",\n    content: \"删除后，该模版流水线将不能再使用\",\n    onOk() {\n      templateApi.DelObj(detail.value.template.id);\n      notification.success({\n        message: \"删除成功\",\n      });\n      tabbar.closeTab({ fullPath: route.fullPath } as any, router);\n    },\n  });\n}\n\nasync function bindPipelineByCreate() {\n  //\n  // openAddCertdPipelineDialog({ templateId: detail.value.template.id });\n}\n\nasync function bindPipelineByCopy() {}\n\nconst { openCreateFromTemplateDialog } = useTemplate();\n\nasync function useTemplateCreate() {\n  openCreateFromTemplateDialog({ templateId: detail.value.template.id });\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/template/form.vue",
    "content": "<template>\n  <a-form ref=\"formRef\" class=\"template-form w-full\" :model=\"templateForm\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\">\n    <template v-for=\"(item, key) in templateFormColumns\" :key=\"key\">\n      <fs-form-item v-if=\"item.show !== false\" :model-value=\"get(templateForm, key)\" :item=\"item\" :get-context-fn=\"getScopeFunc(key)\" @update:model-value=\"set(templateForm, key, $event)\" />\n    </template>\n  </a-form>\n</template>\n<script setup lang=\"ts\">\nimport { get, set } from \"lodash-es\";\nimport { computed, reactive, ref, defineProps } from \"vue\";\nimport { useStepHelper } from \"./utils\";\nimport { usePluginStore } from \"/@/store/plugin\";\n\ndefineOptions({\n  name: \"TemplateForm\",\n});\nconst formRef = ref();\nconst props = defineProps<{\n  input: any;\n  pipeline: any;\n}>();\nconst pluginStore = usePluginStore();\nconst { getStepsMap } = useStepHelper(pluginStore);\nconst steps = computed(() => {\n  if (!props.pipeline) {\n    return {};\n  }\n  return getStepsMap(props.pipeline);\n});\n\nconst labelCol = ref({\n  span: null,\n  style: {\n    width: \"145px\",\n  },\n});\nconst wrapperCol = ref({ span: 16 });\nconst templateForm: any = reactive({});\nconst templateFormColumns = computed(() => {\n  const formColumns: any = {};\n  const inputs = props.input || {};\n  for (const inputKey in inputs) {\n    const [stepId, key] = inputKey.split(\".\");\n    const step = steps.value[stepId];\n    if (!step) {\n      continue;\n    }\n    formColumns[inputKey] = {\n      ...step.input[key].define,\n      name: [stepId, key],\n    };\n  }\n  return formColumns;\n});\nfunction getScopeFunc(inputKey: string) {\n  const [stepId, key] = inputKey.split(\".\");\n  return () => {\n    return {\n      form: templateForm[stepId],\n    };\n  };\n}\n\nasync function validate() {\n  return await formRef.value.validate();\n}\n\ndefineExpose({\n  getForm() {\n    return templateForm;\n  },\n  validate,\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/template/import/crud.tsx",
    "content": "import { CreateCrudOptionsProps, CreateCrudOptionsRet, importTable } from \"@fast-crud/fast-crud\";\nimport { Modal, notification } from \"ant-design-vue\";\n\nexport default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  return {\n    crudOptions: {\n      mode: {\n        name: \"local\",\n        isMergeWhenUpdate: true,\n        isAppendWhenAdd: true,\n      },\n      //启用addRow按钮\n      actionbar: {\n        buttons: {\n          //禁用弹框添加\n          add: { show: false },\n          //启用添加行\n          addRow: { show: true },\n          //导入按钮\n          import: {\n            show: false,\n            text: \"批量导入\",\n            type: \"primary\",\n            click() {\n              const modal = Modal.info({\n                title: \"批量导入\",\n                okText: \"关闭\",\n                content() {\n                  async function onChange(e: any) {\n                    const file = e.target.files[0];\n                    await importTable(crudExpose, { file, append: true });\n                    modal.destroy();\n                    notification.success({\n                      message: \"导入成功\",\n                    });\n                  }\n                  return (\n                    <div>\n                      <p>\n                        1、<a href={\"template-import.csv\"}>下载导入模板</a>\n                      </p>\n                      <p>\n                        2、<span>模板填充数据</span>\n                      </p>\n                      <p>\n                        <span>3、导入：</span>\n                        <input type={\"file\"} onInput={onChange}></input>\n                      </p>\n                    </div>\n                  );\n                },\n              });\n            },\n          },\n        },\n      },\n      table: {\n        remove: {\n          //删除数据后不请求后台\n          refreshTable: false,\n        },\n        editable: {\n          enabled: true,\n          mode: \"row\",\n          activeTrigger: false,\n        },\n      },\n      search: {\n        show: false,\n      },\n      toolbar: {\n        show: false,\n      },\n      pagination: {\n        show: false,\n      },\n      columns: {},\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/template/import/form.tsx",
    "content": "import { useColumns } from \"@fast-crud/fast-crud\";\nimport { createExtraColumns } from \"/@/views/certd/pipeline/template/use\";\nimport TemplateImportTable from \"/@/views/certd/pipeline/template/import/table.vue\";\nimport { Ref } from \"vue\";\n\nexport function createFormOptions(detail: Ref): any {\n  const { buildFormOptions } = useColumns();\n\n  const crudOptions = {\n    columns: {\n      ...createExtraColumns(),\n      templateProps: {\n        title: \"流水线导入\",\n        type: \"text\",\n        form: {\n          order: 1,\n          component: {\n            name: TemplateImportTable,\n            detail: detail,\n          },\n          col: {\n            span: 24,\n          },\n        },\n      },\n    },\n  };\n\n  return buildFormOptions(crudOptions);\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/template/import/index.vue",
    "content": "<template>\n  <fs-page class=\"page-template-import\">\n    <template #header>\n      <div class=\"title flex flex-1 items-center\">\n        <fs-button class=\"back\" icon=\"ion:chevron-back-outline\" @click=\"goBack\"></fs-button>\n        <div class=\"ml-10\">从模版{{ detail?.template?.title }}批量创建流水线</div>\n      </div>\n    </template>\n    <fs-form v-if=\"importFromOptions\" ref=\"formRef\" class=\"mt-10\" v-bind=\"importFromOptions\"> </fs-form>\n    <div class=\"p-10\">\n      <a-button class=\"ml-20\" type=\"primary\" @click=\"doImport\">确定导入 </a-button>\n    </div>\n  </fs-page>\n</template>\n\n<script setup lang=\"tsx\">\nimport { onMounted, ref, Ref } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport { templateApi } from \"../api\";\nimport { createFormOptions } from \"/@/views/certd/pipeline/template/import/form\";\nimport { cloneDeep } from \"lodash-es\";\nimport { fillPipelineByDefaultForm } from \"/@/views/certd/pipeline/certd-form/use\";\nimport { createPipelineByTemplate } from \"/@/views/certd/pipeline/template/use\";\nimport { notification, Modal } from \"ant-design-vue\";\nconst route = useRoute();\nconst templateId = route.query.templateId as string;\n\nconst router = useRouter();\n\nfunction goBack() {\n  router.back();\n}\n\ntype TemplateDetail = {\n  template: any;\n  pipeline: any;\n};\n\nconst detail: Ref<TemplateDetail> = ref();\n\nasync function getTemplateDetail() {\n  if (!templateId) {\n    return;\n  }\n  detail.value = await templateApi.GetDetail(parseInt(templateId));\n}\n\nconst importFromOptions = ref();\nonMounted(async () => {\n  await getTemplateDetail();\n  importFromOptions.value = createFormOptions(detail);\n});\n\nconst formRef = ref();\nasync function doImport() {\n  await formRef.value.validate();\n\n  const form = formRef.value.getFormData();\n\n  const importTableRef = formRef.value.getComponentRef(\"templateProps\");\n\n  const templateList = importTableRef.getData();\n\n  const progress = ref({ total: templateList.length, current: 0 });\n  async function requestImport() {\n    for (let i = 0; i < templateList.length; i++) {\n      const tempInputs = templateList[i];\n      const title = tempInputs.title;\n      delete tempInputs.title;\n\n      let newPipeline = cloneDeep(detail.value.pipeline);\n      newPipeline = fillPipelineByDefaultForm(newPipeline, form);\n\n      await createPipelineByTemplate({\n        templateId: parseInt(templateId),\n        templateForm: tempInputs,\n        pipeline: newPipeline,\n        title: title,\n        groupId: form.groupId,\n      });\n      progress.value.current = progress.value.current + 1;\n    }\n    notification.success({\n      message: \"导入完成\",\n    });\n\n    importTableRef.clear();\n  }\n  requestImport();\n  Modal.info({\n    title: \"导入中\",\n    content() {\n      return (\n        <div>\n          当前导入进度： {progress.value.current} / {progress.value.total}\n        </div>\n      );\n    },\n  });\n}\n</script>\n\n<style lang=\"less\">\n.page-template-import {\n  .ant-table-container {\n    .ant-select {\n      width: 100%;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/template/import/table.vue",
    "content": "<template>\n  <fs-crud ref=\"crudRef\" class=\"template-import-table\" v-bind=\"crudBinding\">\n    <template #actionbar-right>\n      <div class=\"helper ml-10\">1. 点击添加按钮，添加一行记录； 2.输入流水线参数； 3. 点击右边“确认创建”，批量创建流水线。</div>\n    </template>\n  </fs-crud>\n</template>\n\n<script setup lang=\"tsx\">\nimport { computed, onMounted, ref, Ref, nextTick, watch } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport { templateApi } from \"../api\";\nimport { usePluginStore } from \"/@/store/plugin\";\nimport { useStepHelper } from \"../utils\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { Form } from \"ant-design-vue\";\n\ndefineOptions({\n  name: \"TemplateImportTable\",\n});\n\nconst formItemContext = Form.useInjectFormItemContext();\n\ntype TemplateDetail = {\n  template: any;\n  pipeline: any;\n};\nconst templateProps: Ref = ref({\n  input: {},\n});\n\nconst props = defineProps<{\n  detail: TemplateDetail;\n}>();\n\nconst pluginStore = usePluginStore();\n\nconst { getStepsMap } = useStepHelper(pluginStore);\n\nfunction buildColumns(steps: any) {\n  const columns: any = {\n    title: {\n      title: \"流水线标题\",\n      type: \"text\",\n      form: {\n        component: {\n          placeholder: \"请输入流水线标题\",\n        },\n        rules: [{ required: true, message: \"请输入流水线标题\" }],\n      },\n    },\n  };\n  for (const inputKey in templateProps.value.input) {\n    const [stepId, key] = inputKey.split(\".\");\n    const item = steps[stepId].input[key];\n    columns[inputKey] = {\n      title: item.define.title,\n      type: \"text\",\n      form: {\n        ...item.define,\n      },\n      column: {},\n    };\n  }\n  return {\n    table: {\n      slots: {\n        headerCell({ column }: any) {\n          const col = columns[column.key];\n          if (col && col?.form?.helper) {\n            return (\n              <span class={\"flex \"}>\n                {col.title}\n                <a-tooltip title={col.form.helper}>\n                  <fs-icon class={\"ml-5\"} icon={\"ion:alert-circle-outline\"}></fs-icon>\n                </a-tooltip>\n              </span>\n            );\n          }\n        },\n      },\n    },\n    columns,\n  };\n}\n\n//启用行编辑模式\nconst { crudBinding, crudRef, crudExpose, appendCrudOptions } = useFs({ createCrudOptions, context: {} });\nonMounted(async () => {\n  await pluginStore.init();\n  await nextTick();\n  const steps = getStepsMap(props.detail.pipeline);\n  if (props.detail.template?.content) {\n    templateProps.value = JSON.parse(props.detail.template?.content);\n  }\n\n  appendCrudOptions({ ...buildColumns(steps) });\n  crudBinding.value.data = [];\n  await crudExpose.editable.enable({ mode: \"row\" });\n});\n\ndefineExpose({\n  getData() {\n    return crudBinding.value.data;\n  },\n  clear() {\n    crudBinding.value.data = [];\n  },\n});\n</script>\n\n<style lang=\"less\">\n.template-import-table {\n  .ant-table-container {\n    .ant-select {\n      width: 100%;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/template/index.vue",
    "content": "<template>\n  <fs-page>\n    <template #header>\n      <div class=\"title flex items-center\">\n        {{ t(\"certd.template.title\") }}\n        <span class=\"ml-10 sub flex items-center\">\n          <span>{{ t(\"certd.template.intro\") }} </span>\n          <vip-button class=\"ml-10\" mode=\"button\" />\n        </span>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { useI18n } from \"/src/locales\";\ndefineOptions({\n  name: \"PipelineTemplate\",\n});\nconst { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: {} });\nconst { t } = useI18n();\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(() => {\n  crudExpose.doRefresh();\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/template/use.tsx",
    "content": "import { dict, useFormWrapper } from \"@fast-crud/fast-crud\";\nimport { checkPipelineLimit, eachSteps } from \"/@/views/certd/pipeline/utils\";\nimport { templateApi } from \"/@/views/certd/pipeline/template/api\";\nimport TemplateForm from \"./form.vue\";\nimport NotificationSelector from \"/@/views/certd/notification/notification-selector/index.vue\";\nimport GroupSelector from \"/@/views/certd/pipeline/group/group-selector.vue\";\nimport { ref } from \"vue\";\nimport { fillPipelineByDefaultForm } from \"/@/views/certd/pipeline/certd-form/use\";\nimport { cloneDeep } from \"lodash-es\";\n\nexport function createExtraColumns() {\n  const groupDictRef = dict({\n    url: \"/pi/pipeline/group/all\",\n    value: \"id\",\n    label: \"name\",\n  });\n  const randomHour = Math.floor(Math.random() * 6);\n  const randomMin = Math.floor(Math.random() * 60);\n  return {\n    triggerCron: {\n      title: \"定时触发\",\n      type: \"text\",\n      form: {\n        value: `0 ${randomMin} ${randomHour} * * *`,\n        component: {\n          name: \"cron-editor\",\n          vModel: \"modelValue\",\n          placeholder: \"0 0 4 * * *\",\n        },\n        col: {\n          span: 24,\n        },\n        helper: \"点击上面的按钮，选择每天几点定时执行。\\n建议设置为每天触发一次，证书未到期之前任务会跳过，不会重复执行\",\n        order: 100,\n      },\n    },\n    notification: {\n      title: \"失败通知\",\n      type: \"text\",\n      form: {\n        value: 0,\n        component: {\n          name: NotificationSelector,\n          vModel: \"modelValue\",\n          on: {\n            selectedChange(opts: any) {\n              opts.form.notificationTarget = opts.$event;\n            },\n          },\n        },\n        order: 101,\n        helper: \"任务执行失败实时提醒\",\n      },\n    },\n    groupId: {\n      title: \"流水线分组\",\n      type: \"dict-select\",\n      dict: groupDictRef,\n      form: {\n        component: {\n          name: GroupSelector,\n          vModel: \"modelValue\",\n        },\n        order: 999,\n      },\n    },\n  };\n}\n\nexport async function createPipelineByTemplate(opts: { templateId: number; title: string; groupId?: string; pipeline: any; templateForm: any; keepHistoryCount?: number }) {\n  const { title, groupId, pipeline, templateForm, keepHistoryCount, templateId } = opts;\n  //填充模版参数\n  const steps: any = {};\n  eachSteps(pipeline, (step: any) => {\n    steps[step.id] = step;\n  });\n\n  for (const stepId in templateForm) {\n    const step = steps[stepId];\n    const tempStep = templateForm[stepId];\n    if (step) {\n      for (const key in tempStep) {\n        step.input[key] = tempStep[key];\n      }\n    }\n  }\n\n  pipeline.title = title;\n  return await templateApi.CreatePipelineByTemplate({\n    title,\n    content: JSON.stringify(pipeline),\n    keepHistoryCount: keepHistoryCount ?? 30,\n    groupId,\n    templateId,\n  });\n}\n\nexport function useTemplate() {\n  const { openCrudFormDialog } = useFormWrapper();\n\n  async function openCreateFromTemplateDialog(req: { templateId?: number; onCreated?: (ctx: any) => void }) {\n    //检查是否流水线数量超出限制\n    await checkPipelineLimit();\n    const detail = await templateApi.GetDetail(req.templateId);\n    if (!detail) {\n      throw new Error(\"模板不存在\");\n    }\n    if (!detail.template?.pipelineId) {\n      throw new Error(\"还未绑定模版流水线\");\n    }\n    const templateProps = JSON.parse(detail.template.content || \"{}\");\n    const pipeline = detail.pipeline;\n\n    const wrapperRef = ref();\n    function getFormData() {\n      if (!wrapperRef.value) {\n        return null;\n      }\n      return wrapperRef.value.getFormData();\n    }\n\n    const templateFormRef = ref();\n\n    async function doSubmit(opts: { form: any }) {\n      const form = opts.form;\n      await templateFormRef.value.validate();\n\n      const tempInputs = templateFormRef.value.getForm();\n\n      let newPipeline = cloneDeep(pipeline);\n      newPipeline = fillPipelineByDefaultForm(newPipeline, form);\n      //填充模版参数\n      const { id } = await createPipelineByTemplate({\n        templateId: detail.template.id,\n        templateForm: tempInputs,\n        pipeline: newPipeline,\n        title: form.title,\n        groupId: form.groupId,\n      });\n      if (req.onCreated) {\n        req.onCreated({ id });\n      }\n    }\n\n    const crudOptions = {\n      form: {\n        doSubmit,\n        wrapper: {\n          title: `从模版<${detail.template.title}>创建流水线`,\n          width: 1100,\n          slots: {\n            \"form-body-top\": () => {\n              return (\n                <div class={\"w-full flex\"}>\n                  <TemplateForm ref={templateFormRef} input={templateProps.input} pipeline={pipeline} />\n                </div>\n              );\n            },\n          },\n        },\n      },\n      columns: {\n        title: {\n          title: \"流水线标题\",\n          type: \"text\",\n          form: {\n            component: {\n              placeholder: \"请输入流水线标题\",\n            },\n            rules: [{ required: true, message: \"请输入流水线标题\" }],\n          },\n        },\n        ...createExtraColumns(),\n      },\n    };\n\n    const wrapper = await openCrudFormDialog({ crudOptions });\n    wrapperRef.value = wrapper;\n  }\n\n  return {\n    openCreateFromTemplateDialog,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/template/utils.ts",
    "content": "import { eachSteps } from \"/@/views/certd/pipeline/utils\";\n\nexport function useStepHelper(pluginStore: any) {\n  function getStepsMap(pipeline: any) {\n    const stepMap: any = {};\n    eachSteps(pipeline, (step: any) => {\n      const plugin = pluginStore.getPluginDefineSync(step.type);\n      if (!plugin) {\n        return;\n      }\n\n      const inputs: any = {};\n      for (const key in plugin.input) {\n        const input: any = plugin.input[key];\n        if (input.template === false || input.component?.name === \"output-selector\") {\n          continue;\n        }\n        inputs[key] = {\n          value: step.input[key],\n          define: {\n            ...plugin.input[key],\n            name: [step.id, key],\n          },\n        };\n      }\n      stepMap[step.id] = {\n        id: step.id,\n        title: step.title,\n        type: step.type,\n        input: inputs,\n      };\n    });\n    return stepMap;\n  }\n  return {\n    getStepsMap,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/use.tsx",
    "content": "import * as api from \"/@/views/certd/pipeline/api\";\nimport { notification } from \"ant-design-vue\";\nimport CertView from \"/@/views/certd/pipeline/cert-view.vue\";\nimport { env } from \"/@/utils/util.env\";\nimport { useModal } from \"/@/use/use-modal\";\n\nexport function useCertViewer() {\n  const model = useModal();\n  const viewCert = async (id: number) => {\n    const cert = await api.GetCert(id);\n    if (!cert) {\n      notification.error({ message: \"请先运行一次流水线\" });\n      return;\n    }\n\n    model.success({\n      title: \"查看证书\",\n      maskClosable: true,\n      okText: \"关闭\",\n      width: 800,\n      content: () => {\n        return <CertView cert={cert}></CertView>;\n      },\n    });\n  };\n\n  const downloadCert = async (id: any) => {\n    const files = await api.GetFiles(id);\n    model.success({\n      title: \"点击链接下载\",\n      maskClosable: true,\n      okText: \"关闭\",\n      content: () => {\n        const children = [];\n        for (const file of files) {\n          const downloadUrl = `${env.API}/pi/history/download?pipelineId=${id}&fileId=${file.id}`;\n          children.push(\n            <div>\n              <div class={\"flex-o m-5\"}>\n                <fs-icon icon={\"ant-design:cloud-download-outlined\"} class={\"mr-5 fs-16\"}></fs-icon>\n                <a href={downloadUrl} target={\"_blank\"}>\n                  {file.filename}\n                </a>\n              </div>\n            </div>\n          );\n        }\n\n        if (children.length === 0) {\n          return <div>暂无文件下载</div>;\n        }\n\n        return (\n          <div class={\"mt-3\"}>\n            <div> {children}</div>\n          </div>\n        );\n      },\n    });\n  };\n  return {\n    viewCert,\n    downloadCert,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/pipeline/utils.ts",
    "content": "import { forEach } from \"lodash-es\";\nimport { mySuiteApi } from \"/@/views/certd/suite/mine/api\";\nimport { notification } from \"ant-design-vue\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { ReadCertDetail } from \"./api\";\nimport { util } from \"/@/utils\";\nexport function eachStages(list: any[], exec: (item: any, runnableType: string) => void, runnableType: string = \"stage\") {\n  if (!list || list.length <= 0) {\n    return;\n  }\n  forEach(list, item => {\n    exec(item, runnableType);\n    if (runnableType === \"stage\") {\n      eachStages(item.tasks, exec, \"task\");\n    } else if (runnableType === \"task\") {\n      eachStages(item.steps, exec, \"step\");\n    }\n  });\n}\n\nexport function eachSteps(pipeline: any, callback: any) {\n  const pp = pipeline;\n  if (pp.stages) {\n    for (const stage of pp.stages) {\n      if (stage.tasks) {\n        for (const task of stage.tasks) {\n          if (task.steps) {\n            for (const step of task.steps) {\n              callback(step, task, stage);\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\nexport function findStep(pipeline: any, id: string) {\n  const pp = pipeline;\n  if (pp.stages) {\n    for (const stage of pp.stages) {\n      if (stage.tasks) {\n        for (const task of stage.tasks) {\n          if (task.steps) {\n            for (const step of task.steps) {\n              if (step.id === id) {\n                return step;\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\nexport async function checkPipelineLimit() {\n  const settingsStore = useSettingStore();\n  if (settingsStore.isComm && settingsStore.suiteSetting.enabled) {\n    //检查数量是否超限\n\n    const suiteDetail = await mySuiteApi.SuiteDetailGet();\n    const max = suiteDetail.pipelineCount.max;\n    if (max != -1 && max <= suiteDetail.pipelineCount.used) {\n      notification.error({\n        message: `对不起，您最多只能创建${max}条流水线，请购买或升级套餐`,\n      });\n      throw new Error(\"流水线数量超限\");\n    }\n  }\n}\n\nexport async function readCertDetail(crt: string) {\n  const cached = await util.cache.get(crt);\n  if (cached) {\n    return cached;\n  }\n  const res = await ReadCertDetail(crt);\n  await util.cache.set(crt, res);\n  return res;\n}\n\nexport async function getAllDomainsFromCrt(crt: string) {\n  const { detail } = await readCertDetail(crt);\n  const altNames = detail.domains.altNames;\n  const commonName = detail.domains.commonName;\n  if (altNames.includes(commonName)) {\n    return altNames;\n  }\n  return [commonName, ...altNames];\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/suite/api.ts",
    "content": "import { request } from \"/@/api/service\";\nimport { dict } from \"@fast-crud/fast-crud\";\nexport const durationDict = dict({\n  data: [\n    { label: \"3天\", value: 3 },\n    { label: \"7天\", value: 7 },\n    { label: \"30天\", value: 30 },\n    { label: \"90天\", value: 90 },\n    { label: \"1年\", value: 365 },\n    { label: \"2年\", value: 730 },\n    { label: \"3年\", value: 1095 },\n    { label: \"4年\", value: 1460 },\n    { label: \"5年\", value: 1825 },\n    { label: \"6年\", value: 2190 },\n    { label: \"7年\", value: 2555 },\n    { label: \"8年\", value: 2920 },\n    { label: \"9年\", value: 3285 },\n    { label: \"10年\", value: 3650 },\n    { label: \"永久\", value: -1 },\n  ],\n});\n\nexport type OrderModalOpenReq = {\n  product: any;\n  duration: number;\n  num?: number;\n};\n\nexport async function ProductList() {\n  return await request({\n    url: \"/suite/product/list\",\n    method: \"POST\",\n  });\n}\n\nexport async function ProductInfo(productId: number) {\n  return await request({\n    url: \"/suite/product/info\",\n    method: \"POST\",\n    data: { id: productId },\n  });\n}\n\nexport type TradeCreateReq = {\n  productId: number;\n  duration: number;\n  num: number;\n  payType: string;\n};\n\nexport async function TradeCreate(form: TradeCreateReq) {\n  return await request({\n    url: \"/suite/trade/create\",\n    method: \"POST\",\n    data: form,\n  });\n}\n\nexport async function TradeCreateFree(form: TradeCreateReq) {\n  return await request({\n    url: \"/suite/trade/createFree\",\n    method: \"POST\",\n    data: form,\n  });\n}\n\nexport async function GetPaymentTypes() {\n  return await request({\n    url: \"/suite/trade/payments\",\n    method: \"POST\",\n  });\n}\n\nexport async function GetSuiteSetting() {\n  return await request({\n    url: \"/suite/settings/get\",\n    method: \"POST\",\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/suite/buy.vue",
    "content": "<template>\n  <fs-page class=\"page-suite-buy\">\n    <template #header>\n      <div class=\"title\">套餐购买</div>\n    </template>\n    <div class=\"suite-buy-content\">\n      <a-row class=\"w-100\" :gutter=\"8\">\n        <a-col :span=\"24\">\n          <a-card>\n            <div class=\"suite-intro-box\">\n              <div>说明：① 同一时间只有最新购买的一个套餐生效；② 可以购买多个加量包，加量包立即生效；③ 套餐和加量包内的数量可以叠加</div>\n              <div v-if=\"suiteIntro\" v-html=\"suiteIntro\"></div>\n            </div>\n          </a-card>\n        </a-col>\n      </a-row>\n      <a-row :gutter=\"8\" class=\"mt-10\">\n        <a-col v-for=\"item of suites\" :key=\"item.id\" class=\"mb-10 suite-card-col\">\n          <product-info :product=\"item\" @order=\"doOrder\" />\n        </a-col>\n        <a-col v-for=\"item of addons\" :key=\"item.id\" class=\"mb-10 suite-card-col\">\n          <product-info :product=\"item\" @order=\"doOrder\" />\n        </a-col>\n      </a-row>\n\n      <a-empty v-if=\"suites.length == 0 && addons.length == 0\" class=\"w-100 mt-10\" description=\"暂无套餐可购买\" />\n    </div>\n\n    <order-modal ref=\"orderModalRef\" />\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref } from \"vue\";\nimport * as api from \"./api\";\nimport ProductInfo from \"/@/views/certd/suite/product-info.vue\";\nimport OrderModal from \"/@/views/certd/suite/order-modal.vue\";\nimport { notification } from \"ant-design-vue\";\n\nconst suites = ref([]);\nconst addons = ref([]);\n\nasync function loadProducts() {\n  const list = await api.ProductList();\n  suites.value = list.filter((x: any) => x.type === \"suite\");\n  addons.value = list.filter((x: any) => x.type === \"addon\");\n}\n\nloadProducts();\nconst orderModalRef = ref<any>(null);\nasync function doOrder(req: any) {\n  await orderModalRef.value.open({\n    ...req,\n  });\n}\n\nconst suiteIntro = ref(\"\");\nasync function loadSuiteIntro() {\n  const res = await api.GetSuiteSetting();\n  suiteIntro.value = res.intro;\n}\nloadSuiteIntro();\n</script>\n\n<style lang=\"less\">\n.page-suite-buy {\n  .title {\n    background-color: #fff;\n  }\n  background: #f0f2f5;\n  .suite-buy-content {\n    padding: 20px;\n    display: flex;\n    flex-direction: column;\n    align-items: baseline;\n\n    .suite-intro-box {\n      //height: 60px;\n      //overflow: hidden;\n      //text-overflow: ellipsis;\n    }\n\n    .suite-list {\n      display: flex;\n      align-items: baseline;\n    }\n    .my-suites {\n      width: 360px;\n      margin-left: 10px;\n    }\n\n    .price-text {\n      align-items: baseline;\n      font-family: \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n    }\n\n    .prices {\n      display: flex;\n      justify-content: left;\n      margin-top: 20px;\n      .price-item {\n        border: 1px solid #c6c6c6;\n        background-color: #f8ebda;\n        padding: 10px;\n        text-align: center;\n        cursor: pointer;\n        width: 100px;\n        &:hover {\n          border-color: #38a0fb;\n        }\n        &.active {\n          border-color: #1890ff;\n        }\n        margin-right: 10px;\n      }\n    }\n\n    .suite-card-col {\n      width: 20% !important;\n      min-width: 360px !important;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/suite/mine/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/mine/suite\";\n\nexport type SuiteValue = {\n  max: number;\n  used: number;\n};\nexport type SuiteDetail = {\n  enabled?: boolean;\n  suites?: any[];\n  expiresTime?: number;\n  pipelineCount?: SuiteValue;\n  domainCount?: SuiteValue;\n  deployCount?: SuiteValue;\n  monitorCount?: SuiteValue;\n};\n\nexport const mySuiteApi = {\n  async GetList(query: any) {\n    return await request({\n      url: apiPrefix + \"/page\",\n      method: \"post\",\n      data: query,\n    });\n  },\n\n  async AddObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/add\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async UpdateObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/update\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async DelObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/delete\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n\n  async GetObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/info\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n  async ListAll() {\n    return await request({\n      url: apiPrefix + \"/all\",\n      method: \"post\",\n    });\n  },\n  async SuiteDetailGet() {\n    return await request({\n      url: `${apiPrefix}/detail`,\n      method: \"post\",\n    });\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/suite/mine/crud.tsx",
    "content": "import { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { mySuiteApi as api } from \"./api\";\nimport { useRouter } from \"vue-router\";\nimport SuiteValueEdit from \"/@/views/sys/suite/product/suite-value-edit.vue\";\nimport SuiteValue from \"/@/views/sys/suite/product/suite-value.vue\";\nimport DurationValue from \"/@/views/sys/suite/product/duration-value.vue\";\nimport UserSuiteStatus from \"/@/views/certd/suite/mine/user-suite-status.vue\";\nimport dayjs from \"dayjs\";\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async (req: EditReq) => {\n    const { form, row } = req;\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async (req: DelReq) => {\n    const { row } = req;\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async (req: AddReq) => {\n    const { form } = req;\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  const router = useRouter();\n\n  return {\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      form: {\n        labelCol: {\n          //固定label宽度\n          span: null,\n          style: {\n            width: \"100px\",\n          },\n        },\n        col: {\n          span: 22,\n        },\n        wrapper: {\n          width: 600,\n        },\n      },\n      actionbar: {\n        buttons: {\n          add: { show: false },\n          buy: {\n            text: \"购买\",\n            type: \"primary\",\n            click() {\n              router.push({\n                path: \"/certd/suite/buy\",\n              });\n            },\n          },\n        },\n      },\n      rowHandle: {\n        width: 200,\n        fixed: \"right\",\n        buttons: {\n          view: { show: false },\n          copy: { show: false },\n          edit: { show: false },\n          remove: { show: false },\n          // continue:{\n          //   text:\"续期\",\n          //   type:\"link\",\n          //   click(){\n          //     console.log(\"续期\");\n          //   }\n          // }\n        },\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          search: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            editable: {\n              disabled: true,\n            },\n          },\n          form: {\n            show: false,\n          },\n        },\n        title: {\n          title: \"套餐名称\",\n          type: \"text\",\n          search: {\n            show: true,\n          },\n          form: {\n            rules: [{ required: true, message: \"此项必填\" }],\n          },\n          column: {\n            width: 200,\n          },\n        },\n        productType: {\n          title: \"类型\",\n          type: \"dict-select\",\n          editForm: {\n            component: {\n              disabled: true,\n            },\n          },\n          dict: dict({\n            data: [\n              { label: \"套餐\", value: \"suite\", color: \"green\" },\n              { label: \"加量包\", value: \"addon\", color: \"blue\" },\n            ],\n          }),\n          form: {\n            rules: [{ required: true, message: \"此项必填\" }],\n          },\n          column: {\n            width: 80,\n            align: \"center\",\n          },\n          valueBuilder: ({ row }) => {\n            if (row.content) {\n              row.content = JSON.parse(row.content);\n            }\n          },\n          valueResolve: ({ form }) => {\n            if (form.content) {\n              form.content = JSON.stringify(form.content);\n            }\n          },\n        },\n        \"content.maxDomainCount\": {\n          title: \"域名数量\",\n          type: \"text\",\n          form: {\n            key: [\"content\", \"maxDomainCount\"],\n            component: {\n              name: SuiteValueEdit,\n              vModel: \"modelValue\",\n              unit: \"个\",\n            },\n            rules: [{ required: true, message: \"此项必填\" }],\n          },\n          column: {\n            width: 100,\n            component: {\n              name: SuiteValue,\n              vModel: \"modelValue\",\n              unit: \"个\",\n            },\n            align: \"center\",\n          },\n        },\n        \"content.maxPipelineCount\": {\n          title: \"流水线数量\",\n          type: \"text\",\n          form: {\n            key: [\"content\", \"maxPipelineCount\"],\n            component: {\n              name: SuiteValueEdit,\n              vModel: \"modelValue\",\n              unit: \"条\",\n            },\n            rules: [{ required: true, message: \"此项必填\" }],\n          },\n          column: {\n            width: 100,\n            component: {\n              name: SuiteValue,\n              vModel: \"modelValue\",\n              unit: \"条\",\n            },\n            align: \"center\",\n          },\n        },\n        \"content.maxDeployCount\": {\n          title: \"部署次数\",\n          type: \"text\",\n          form: {\n            key: [\"content\", \"maxDeployCount\"],\n            component: {\n              name: SuiteValueEdit,\n              vModel: \"modelValue\",\n              unit: \"次\",\n            },\n            rules: [{ required: true, message: \"此项必填\" }],\n          },\n          column: {\n            width: 100,\n            component: {\n              name: SuiteValue,\n              vModel: \"modelValue\",\n              unit: \"次\",\n              used: compute(({ row }) => {\n                return row.deployCountUsed;\n              }),\n            },\n            align: \"center\",\n          },\n        },\n        \"content.maxMonitorCount\": {\n          title: \"证书监控数量\",\n          type: \"text\",\n          form: {\n            key: [\"content\", \"maxMonitorCount\"],\n            component: {\n              name: SuiteValueEdit,\n              vModel: \"modelValue\",\n              unit: \"个\",\n            },\n            rules: [{ required: true, message: \"此项必填\" }],\n          },\n          column: {\n            width: 120,\n            component: {\n              name: SuiteValue,\n              vModel: \"modelValue\",\n              unit: \"个\",\n            },\n            align: \"center\",\n          },\n        },\n        duration: {\n          title: \"时长\",\n          type: \"text\",\n          form: {},\n          column: {\n            component: {\n              name: DurationValue,\n              vModel: \"modelValue\",\n            },\n            width: 100,\n            align: \"center\",\n          },\n        },\n        status: {\n          title: \"状态\",\n          type: \"text\",\n          form: { show: false },\n          column: {\n            width: 100,\n            align: \"center\",\n            component: {\n              name: UserSuiteStatus,\n              userSuite: compute(({ row }) => {\n                return row;\n              }),\n              currentSuite: context.currentSuite,\n            },\n            conditionalRender: {\n              match() {\n                return false;\n              },\n            },\n          },\n        },\n        activeTime: {\n          title: \"激活时间\",\n          type: \"date\",\n          column: {\n            width: 150,\n          },\n        },\n        expiresTime: {\n          title: \"过期时间\",\n          type: \"date\",\n          column: {\n            width: 150,\n            component: {\n              name: \"expires-time-text\",\n              vModel: \"value\",\n              mode: \"tag\",\n              title: compute(({ value }) => {\n                return dayjs(value).format(\"YYYY-MM-DD HH:mm:ss\");\n              }),\n            },\n          },\n        },\n        isPresent: {\n          title: \"是否赠送\",\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { label: \"是\", value: true, color: \"success\" },\n              { label: \"否\", value: false, color: \"blue\" },\n            ],\n          }),\n          form: {\n            value: true,\n          },\n          column: {\n            width: 100,\n            align: \"center\",\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/suite/mine/index.vue",
    "content": "<template>\n  <fs-page>\n    <template #header>\n      <div class=\"title flex-baseline\">\n        我的套餐\n        <div class=\"sub\">\n          <div class=\"flex-o flex-wrap\">当前套餐：<suite-card></suite-card></div>\n        </div>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\">\n      <template #actionbar-right> </template>\n    </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, onActivated, onMounted, ref } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { mySuiteApi, SuiteDetail } from \"/@/views/certd/suite/mine/api\";\nimport SuiteCard from \"/@/views/framework/home/dashboard/suite-card.vue\";\n\ndefineOptions({\n  name: \"MySuites\",\n});\nconst detail = ref<SuiteDetail>({});\nconst currentSuite = computed(() => {\n  if (detail.value?.suites && detail.value.suites.length > 0) {\n    return detail.value.suites[0];\n  }\n  return null;\n});\n\nconst { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: { detail, currentSuite } });\n\nasync function loadSuiteDetail() {\n  detail.value = await mySuiteApi.SuiteDetailGet();\n}\n\n// 页面打开后获取列表数据\nonMounted(async () => {\n  await loadSuiteDetail();\n  await crudExpose.doRefresh();\n});\nonActivated(() => {\n  crudExpose.doRefresh();\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/suite/mine/user-suite-status.vue",
    "content": "<template>\n  <a-tag :color=\"binding.color\">{{ binding.text }}</a-tag>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed } from \"vue\";\nimport dayjs from \"dayjs\";\n\ndefineOptions({\n  name: \"UserSuiteStatus\",\n});\n\nconst props = defineProps<{\n  userSuite: any;\n  currentSuite?: any;\n}>();\n\nconst binding = computed(() => {\n  const userSuite = props.userSuite;\n  if (!userSuite) {\n    return {};\n  }\n  if (userSuite.activeTime == null) {\n    return { color: \"blue\", text: \"未使用\" };\n  }\n  const now = dayjs().valueOf();\n  //已过期\n  const isExpired = userSuite.expiresTime != -1 && now > userSuite.expiresTime;\n  if (isExpired) {\n    return { color: \"error\", text: \"已过期\" };\n  }\n  //如果在激活时间之前\n  if (now < userSuite.activeTime) {\n    return { color: \"blue\", text: \"待生效\" };\n  }\n\n  if (userSuite.isEmpty) {\n    return { color: \"gray\", text: \"已用完\" };\n  }\n\n  //是否是当前套餐\n  if (props.currentSuite && props.currentSuite.productType === \"suite\" && props.currentSuite.id === userSuite.id) {\n    return { color: \"success\", text: \"当前套餐\" };\n  }\n  // 是否在激活时间和过期时间之间\n  if (now > userSuite.activeTime && (userSuite.expiresTime == -1 || now < userSuite.expiresTime)) {\n    if (userSuite.productType === \"suite\") {\n      return { color: \"success\", text: \"有效期内\" };\n    }\n    return { color: \"success\", text: \"生效中\" };\n  }\n  return {};\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/suite/order-modal.vue",
    "content": "<template>\n  <a-modal v-model:open=\"openRef\" class=\"order-modal\" :title=\"$t('certd.order.confirmTitle')\" @ok=\"orderCreate\">\n    <div v-if=\"product\" class=\"order-box\">\n      <div class=\"flex-o mt-5\">\n        <span class=\"label\">{{ $t(\"certd.order.package\") }}：</span>{{ product.title }}\n      </div>\n      <div class=\"flex-o mt-5\">\n        <span class=\"label\">{{ $t(\"certd.order.description\") }}：</span>{{ product.intro }}\n      </div>\n      <div class=\"flex-o mt-5\">\n        <span class=\"label\">{{ $t(\"certd.order.specifications\") }}：</span>\n        <span class=\"flex-o flex-wrap\">\n          <span class=\"flex-o\"> {{ $t(\"certd.order.pipeline\") }}<suite-value class=\"ml-5\" :model-value=\"product.content.maxPipelineCount\" :unit=\"$t('certd.order.unit.pieces')\" />； </span>\n          <span class=\"flex-o\"> {{ $t(\"certd.order.domain\") }}<suite-value class=\"ml-5\" :model-value=\"product.content.maxDomainCount\" :unit=\"$t('certd.order.unit.count')\" />； </span>\n          <span class=\"flex-o\"> {{ $t(\"certd.order.deployTimes\") }}<suite-value class=\"ml-5\" :model-value=\"product.content.maxDeployCount\" :unit=\"$t('certd.order.unit.times')\" />； </span>\n        </span>\n      </div>\n\n      <div class=\"flex-o mt-5\">\n        <span class=\"label\">{{ $t(\"certd.order.duration\") }}：</span>\n        <duration-value v-model=\"formRef.duration\"></duration-value>\n      </div>\n      <div class=\"flex-o mt-5\">\n        <span class=\"label\">{{ $t(\"certd.order.price\") }}：</span>\n        <price-input :edit=\"false\" :model-value=\"durationSelected.price\"></price-input>\n      </div>\n\n      <div class=\"flex-o mt-5\">\n        <span class=\"label\">{{ $t(\"certd.order.paymentMethod\") }}：</span>\n        <div v-if=\"durationSelected.price === 0\">{{ $t(\"certd.order.free\") }}</div>\n        <fs-dict-select v-else v-model:value=\"formRef.payType\" :dict=\"paymentsDictRef\" style=\"width: 200px\"> </fs-dict-select>\n      </div>\n    </div>\n  </a-modal>\n</template>\n\n<script setup lang=\"tsx\">\nimport { ref } from \"vue\";\nimport { GetPaymentTypes, OrderModalOpenReq, TradeCreate } from \"/@/views/certd/suite/api\";\nimport SuiteValue from \"/@/views/sys/suite/product/suite-value.vue\";\nimport PriceInput from \"/@/views/sys/suite/product/price-input.vue\";\nimport { dict } from \"@fast-crud/fast-crud\";\nimport { Modal, notification } from \"ant-design-vue\";\nimport DurationValue from \"/@/views/sys/suite/product/duration-value.vue\";\nimport { useRouter } from \"vue-router\";\nimport qrcode from \"qrcode\";\nimport * as api from \"/@/views/certd/suite/api\";\nconst openRef = ref(false);\n\nconst product = ref<any>(null);\nconst formRef = ref<any>({});\nconst durationSelected = ref<any>(null);\nasync function open(opts: OrderModalOpenReq) {\n  openRef.value = true;\n\n  product.value = opts.product;\n\n  durationSelected.value = opts.product.durationPrices.find((dp: any) => dp.duration === opts.duration);\n  formRef.value.productId = opts.product.id;\n  formRef.value.duration = opts.duration;\n  formRef.value.num = opts.num ?? 1;\n}\nconst paymentsDictRef = dict({\n  async getData() {\n    return await GetPaymentTypes();\n  },\n  onReady: ({ dict }) => {\n    if (dict.data.length > 0) {\n      formRef.value.payType = dict.data[0].value;\n    }\n  },\n});\n\nconst router = useRouter();\n\nasync function orderCreate() {\n  if (durationSelected.value.price === 0) {\n    //如果是0，直接请求创建订单\n    await api.TradeCreateFree({\n      productId: formRef.value.productId,\n      duration: formRef.value.duration,\n      num: formRef.value.num ?? 1,\n      payType: \"free\",\n    });\n    notification.success({\n      message: \"套餐购买成功\",\n    });\n    openRef.value = false;\n    return;\n  }\n\n  if (!formRef.value.payType) {\n    notification.error({\n      message: \"请选择支付方式\",\n    });\n    return;\n  }\n  const paymentReq = await TradeCreate({\n    productId: formRef.value.productId,\n    duration: formRef.value.duration,\n    num: formRef.value.num ?? 1,\n    payType: formRef.value.payType,\n  });\n\n  async function onPaid() {\n    openRef.value = false;\n    router.push({\n      path: \"/\",\n    });\n  }\n\n  //跳转到对应的页面\n  // http://pay.docmirror.cn/submit.php\n  //易支付表单提交\n  if (formRef.value.payType === \"yizhifu\") {\n    doYizhifu(paymentReq);\n  } else if (formRef.value.payType === \"alipay\") {\n    //支付宝、\n    doAlipay(paymentReq);\n  } else if (formRef.value.payType === \"wxpay\") {\n    //微信支付\n    doWxpay(paymentReq.qrcode, onPaid);\n    return;\n  } else {\n    notification.error({\n      message: \"暂不支持该支付方式\",\n    });\n    return;\n  }\n\n  Modal.confirm({\n    title: \"请在新页面完成支付\",\n    content: \"是否确认已完成支付\",\n    onOk: async () => {\n      onPaid();\n    },\n    cancelText: \"取消支付\",\n    okText: \"已完成支付\",\n  });\n}\n\nfunction doAlipay(paymentReq: any) {\n  window.open(paymentReq.url);\n}\n\nasync function doWxpay(qrcodeText: string, onPaid: () => Promise<void>) {\n  //展示微信支付二维码\n  const imageUrl = await qrcode.toDataURL(qrcodeText);\n\n  Modal.confirm({\n    wrapClassName: \"modal-confirm-center\",\n    title: \"请微信扫码支付\",\n    okText: \"已完成支付\",\n    cancelText: \"取消支付\",\n    icon() {\n      return \"\";\n    },\n    content: () => {\n      return (\n        <div style=\"text-align: center;\">\n          <img src={imageUrl} style=\"width: 200px;height: 200px;display: initial;\" />\n        </div>\n      );\n    },\n    async onOk() {\n      await onPaid();\n    },\n  });\n}\n\nfunction doYizhifu(paymentReq: any) {\n  console.log(\"doYizhifu\", paymentReq);\n  /**\n   * 商户ID\tpid\t是\tInt\t1001\n   * 支付方式\ttype\t否\tString\talipay\t支付方式列表\n   * 商户订单号\tout_trade_no\t是\tString\t20160806151343349\n   * 异步通知地址\tnotify_url\t是\tString\thttp://www.pay.com/notify_url.php\t服务器异步通知地址\n   * 跳转通知地址\treturn_url\t是\tString\thttp://www.pay.com/return_url.php\t页面跳转通知地址\n   * 商品名称\tname\t是\tString\tVIP会员\t如超过127个字节会自动截取\n   * 商品金额\tmoney\t是\tString\t1.00\t单位：元，最大2位小数\n   * 业务扩展参数\tparam\t否\tString\t没有请留空\t支付后原样返回\n   * 签名字符串\tsign\t是\tString\t202cb962ac59075b964b07152d234b70\t签名算法点此查看\n   * 签名类型\tsign_type\t是\tString\tMD5\t默认为MD5\n   */\n  const form = document.createElement(\"form\");\n  form.action = paymentReq.url;\n  form.method = \"post\";\n  form.target = \"_blank\";\n  // form.style.display = \"none\";\n  document.body.appendChild(form);\n\n  function createInput(name: string, value: any) {\n    const input = document.createElement(\"input\");\n    input.type = \"input\";\n    input.name = name;\n    input.value = value;\n    form.appendChild(input);\n  }\n\n  const body = paymentReq.body;\n  const keys = Object.keys(body);\n  keys.forEach(key => {\n    createInput(key, body[key]);\n  });\n\n  form.submit();\n  //delete form\n  document.body.removeChild(form);\n}\n\ndefineExpose({\n  open,\n});\n</script>\n<style lang=\"less\">\n.order-box {\n  .label {\n    width: 80px;\n    text-align: right;\n    margin-right: 5px;\n    color: #686868;\n    flex: none;\n  }\n}\n\n.modal-confirm-center {\n  .ant-modal-confirm-btns {\n    text-align: center;\n  }\n  .ant-modal-confirm-content {\n    margin: 0 !important;\n    max-width: 100% !important;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/suite/pay-return.vue",
    "content": "<template>\n  <div>\n    <h1>支付成功</h1>\n    <div>\n      <a-button type=\"primary\" @click=\"handleBack\">返回</a-button>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nfunction handleBack() {\n  window.location.href = \"/\";\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/suite/product-info.vue",
    "content": "<template>\n  <a-card :title=\"product.title\" class=\"product-card\">\n    <template #extra>\n      <fs-values-format v-model=\"product.type\" :dict=\"productTypeDictRef\"></fs-values-format>\n    </template>\n\n    <div class=\"product-intro\">{{ product.intro || \"暂无介绍\" }}</div>\n    <a-divider />\n    <div>\n      <div class=\"flex-between mt-5\">\n        <div class=\"flex-o\"><fs-icon icon=\"ant-design:check-outlined\" class=\"color-green mr-5\" /> 流水线条数：</div>\n        <suite-value :model-value=\"product.content.maxPipelineCount\" unit=\"条\" />\n      </div>\n      <div class=\"flex-between mt-5\">\n        <div class=\"flex-o\"><fs-icon icon=\"ant-design:check-outlined\" class=\"color-green mr-5\" />域名数量：</div>\n        <suite-value :model-value=\"product.content.maxDomainCount\" unit=\"个\" />\n      </div>\n      <div class=\"flex-between mt-5\">\n        <div class=\"flex-o\">\n          <fs-icon icon=\"ant-design:check-outlined\" class=\"color-green mr-5\" />\n          部署次数：\n          <a-tooltip title=\"只有运行成功才会扣除部署次数\">\n            <fs-icon class=\"font-size-16 ml-5\" icon=\"mingcute:question-line\"></fs-icon>\n          </a-tooltip>\n        </div>\n        <suite-value :model-value=\"product.content.maxDeployCount\" unit=\"次\" />\n      </div>\n      <div class=\"flex-between mt-5\">\n        <div class=\"flex-o\"><fs-icon icon=\"ant-design:check-outlined\" class=\"color-green mr-5\" /> 证书监控：</div>\n        <suite-value :model-value=\"product.content.maxMonitorCount\" unit=\"个\" />\n      </div>\n    </div>\n    <a-divider />\n    <div class=\"duration flex-between mt-5\">\n      <div class=\"flex-o duration-label\">时长</div>\n      <div class=\"duration-list\">\n        <div v-for=\"dp of product.durationPrices\" :key=\"dp.duration\" class=\"duration-item\" :class=\"{ active: selected.duration === dp.duration }\" @click=\"selected = dp\">\n          {{ durationDict.dataMap[dp.duration]?.label }}\n        </div>\n      </div>\n    </div>\n    <a-divider />\n    <div class=\"price flex-between mt-5\">\n      <div class=\"flex-o\">价格</div>\n      <div class=\"flex-o price-text\">\n        <price-input style=\"color: red\" :font-size=\"20\" :model-value=\"selected?.price\" :edit=\"false\" />\n        <span class=\"ml-5\" style=\"font-size: 12px\"> / {{ durationDict.dataMap[selected.duration]?.label }}</span>\n      </div>\n    </div>\n\n    <template #actions>\n      <a-button type=\"primary\" @click=\"doOrder\">立即购买</a-button>\n    </template>\n  </a-card>\n</template>\n<script setup lang=\"ts\">\nimport { durationDict } from \"/@/views/certd/suite/api\";\nimport SuiteValue from \"/@/views/sys/suite/product/suite-value.vue\";\nimport PriceInput from \"/@/views/sys/suite/product/price-input.vue\";\nimport { ref } from \"vue\";\nimport { dict, FsIcon } from \"@fast-crud/fast-crud\";\n\nconst props = defineProps<{\n  product: any;\n}>();\nconst selected = ref(props.product.durationPrices[0]);\n\nconst productTypeDictRef = dict({\n  data: [\n    { value: \"suite\", label: \"套餐\", color: \"green\" },\n    { value: \"addon\", label: \"加量包\", color: \"blue\" },\n  ],\n});\n\nconst emit = defineEmits([\"order\"]);\nasync function doOrder() {\n  emit(\"order\", { product: props.product, productId: props.product.id, duration: selected.value.duration, price: selected.value.price });\n}\n</script>\n\n<style lang=\"less\">\n.product-card {\n  .ant-card-body {\n    padding: 20px;\n    padding-top: 10px;\n    padding-bottom: 10px;\n\n    .product-intro {\n      font-size: 13px;\n      width: 100%;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      line-height: 28px;\n      height: 28px;\n    }\n\n    .ant-divider {\n      margin: 8px 0;\n    }\n  }\n  .duration-label {\n    width: 32px;\n  }\n  .duration-list {\n    display: flex;\n    flex-wrap: wrap;\n    .duration-item {\n      width: 45px;\n      border: 1px solid #cdcdcd;\n      text-align: center;\n      padding: 2px;\n      margin: 2px;\n      cursor: pointer;\n\n      &:hover {\n        border-color: #1890ff;\n      }\n      &.active {\n        border-color: #a6fba3;\n        background-color: #c1eafb;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/trade/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/suite/trade\";\n\nexport async function GetList(query: any) {\n  return await request({\n    url: apiPrefix + \"/page\",\n    method: \"post\",\n    data: query,\n  });\n}\n\nexport async function AddObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/add\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function UpdateObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/update\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function DelObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/delete\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/info\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetDetail(id: any) {\n  return await request({\n    url: apiPrefix + \"/detail\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function DeleteBatch(ids: any[]) {\n  return await request({\n    url: apiPrefix + \"/deleteByIds\",\n    method: \"post\",\n    data: { ids },\n  });\n}\n\nexport async function SyncStatus(id: any) {\n  return await request({\n    url: apiPrefix + \"/syncStatus\",\n    method: \"post\",\n    data: { id },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/trade/crud.tsx",
    "content": "import * as api from \"./api\";\nimport { useI18n } from \"/src/locales\";\nimport { computed, Ref, ref } from \"vue\";\nimport { useRouter } from \"vue-router\";\nimport { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes, utils } from \"@fast-crud/fast-crud\";\nimport { useUserStore } from \"/@/store/user\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { Modal } from \"ant-design-vue\";\nimport PriceInput from \"/@/views/sys/suite/product/price-input.vue\";\nimport SuiteValue from \"/@/views/sys/suite/product/suite-value.vue\";\nimport DurationValue from \"/@/views/sys/suite/product/duration-value.vue\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const router = useRouter();\n  const { t } = useI18n();\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  const userStore = useUserStore();\n  const settingStore = useSettingStore();\n  const selectedRowKeys: Ref<any[]> = ref([]);\n  context.selectedRowKeys = selectedRowKeys;\n\n  return {\n    crudOptions: {\n      settings: {\n        plugins: {\n          //这里使用行选择插件，生成行选择crudOptions配置，最终会与crudOptions合并\n          rowSelection: {\n            enabled: true,\n            order: -2,\n            before: true,\n            // handle: (pluginProps,useCrudProps)=>CrudOptions,\n            props: {\n              multiple: true,\n              crossPage: true,\n              selectedRowKeys,\n            },\n          },\n        },\n      },\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      rowHandle: {\n        width: 240,\n        fixed: \"right\",\n        buttons: {\n          view: { show: false },\n          edit: { show: false },\n          copy: { show: false },\n          syncStatus: {\n            show: compute(({ row }) => {\n              return row.status === \"wait_pay\";\n            }),\n            text: \"同步订单状态\",\n            type: \"link\",\n            click: async ({ row }) => {\n              Modal.confirm({\n                title: \"确认\",\n                content: \"确认同步订单状态？\",\n                onOk: async () => {\n                  await api.SyncStatus(row.id);\n                  await crudExpose.doRefresh();\n                },\n              });\n            },\n          },\n        },\n      },\n      actionbar: {\n        buttons: {\n          add: {\n            show: false,\n          },\n        },\n      },\n      toolbar: { show: false },\n      tabs: {\n        name: \"status\",\n        show: true,\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          column: {\n            width: 100,\n          },\n          form: {\n            show: false,\n          },\n        },\n        tradeNo: {\n          title: \"订单号\",\n          type: \"text\",\n          search: { show: true },\n          form: {\n            show: false,\n          },\n          column: {\n            width: 250,\n          },\n        },\n        title: {\n          title: \"商品名称\",\n          type: \"text\",\n          search: { show: true },\n          column: {\n            width: 150,\n          },\n        },\n        duration: {\n          title: \"时长\",\n          type: \"number\",\n          column: {\n            width: 100,\n            component: {\n              name: DurationValue,\n              vModel: \"modelValue\",\n            },\n          },\n        },\n        amount: {\n          title: \"金额\",\n          type: \"number\",\n          column: {\n            width: 100,\n            component: {\n              name: PriceInput,\n              vModel: \"modelValue\",\n              edit: false,\n            },\n          },\n        },\n        status: {\n          title: \"状态\",\n          search: { show: true },\n          type: \"dict-select\",\n          dict: dict({\n            data: [\n              { label: \"待支付\", value: \"wait_pay\", color: \"warning\" },\n              { label: \"已支付\", value: \"paid\", color: \"success\" },\n              { label: \"已关闭\", value: \"closed\", color: \"error\" },\n            ],\n          }),\n          column: {\n            width: 100,\n            align: \"center\",\n          },\n        },\n        payType: {\n          title: \"支付方式\",\n          search: { show: true },\n          type: \"dict-select\",\n          dict: dict({\n            data: [\n              { label: \"聚合支付\", value: \"yizhifu\" },\n              { label: \"支付宝\", value: \"alipay\" },\n              { label: \"微信\", value: \"wxpay\" },\n              { label: \"免费\", value: \"free\" },\n            ],\n          }),\n          column: {\n            width: 100,\n            component: {\n              color: \"auto\",\n            },\n            align: \"center\",\n          },\n        },\n        payTime: {\n          title: \"支付时间\",\n          type: \"datetime\",\n          column: {\n            width: 160,\n          },\n        },\n        createTime: {\n          title: \"创建时间\",\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 160,\n            align: \"center\",\n          },\n        },\n        updateTime: {\n          title: \"更新时间\",\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            show: true,\n            width: 160,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/certd/trade/index.vue",
    "content": "<template>\n  <fs-page class=\"page-cert\">\n    <template #header>\n      <div class=\"title\">我的订单</div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\">\n      <template #pagination-left>\n        <a-tooltip title=\"批量删除\">\n          <fs-button icon=\"DeleteOutlined\" @click=\"handleBatchDelete\"></fs-button>\n        </a-tooltip>\n      </template>\n    </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { message, Modal } from \"ant-design-vue\";\nimport { DeleteBatch } from \"./api\";\n\ndefineOptions({\n  name: \"MyTrade\",\n});\nconst { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions });\n\nconst selectedRowKeys = context.selectedRowKeys;\nconst handleBatchDelete = () => {\n  if (selectedRowKeys.value?.length > 0) {\n    Modal.confirm({\n      title: \"确认\",\n      content: `确定要批量删除这${selectedRowKeys.value.length}条记录吗`,\n      async onOk() {\n        await DeleteBatch(selectedRowKeys.value);\n        message.info(\"删除成功\");\n        crudExpose.doRefresh();\n        selectedRowKeys.value = [];\n      },\n    });\n  } else {\n    message.error(\"请先勾选记录\");\n  }\n};\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(async () => {\n  await crudExpose.doRefresh();\n});\n</script>\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/error/403.vue",
    "content": "<template>\n  <a-result status=\"403\" title=\"403\" sub-title=\"Sorry,  拒绝访问 .\">\n    <template #extra>\n      <a-button type=\"primary\" @click=\"toHome\">返回首页（ Back Home ） </a-button>\n    </template>\n  </a-result>\n</template>\n\n<script lang=\"ts\">\nexport default {\n  // eslint-disable-next-line vue/multi-word-component-names\n  name: \"Exception403\",\n  methods: {\n    toHome() {\n      this.$router.push({ path: \"/\" });\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/error/404.vue",
    "content": "<template>\n  <a-result status=\"404\" title=\"404\" sub-title=\"Sorry, the page you visited does not exist.\">\n    <template #extra>\n      <a-button type=\"primary\" @click=\"toHome\">返回首页（ Back Home ） </a-button>\n    </template>\n  </a-result>\n</template>\n\n<script lang=\"ts\">\nexport default {\n  // eslint-disable-next-line vue/multi-word-component-names\n  name: \"Exception404\",\n  methods: {\n    toHome() {\n      this.$router.push({ path: \"/\" });\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/home/content/index.vue",
    "content": "<template>\n  <div class=\"d2-page-cover\">\n    <div class=\"d2-page-cover__title\" @click=\"$open('https://github.com/certd/certd')\">\n      <div class=\"title-line\">\n        <span>{{ siteInfo.title }} v{{ version }}</span>\n      </div>\n    </div>\n    <p class=\"d2-page-cover__sub-title\">{{ siteInfo.slogan }}</p>\n    <div v-if=\"!settingStore.isCommOrAgent\" class=\"warning\">\n      <a-alert type=\"warning\" show-icon>\n        <template #description>\n          <div class=\"flex\">\n            证书和授权为敏感信息，不要使用来历不明的在线CertD服务，以免泄露；请务必私有化部署使用，认准官方版本发布渠道：\n            <a class=\"ml-5 flex\" href=\"https://gitee.com/certd/certd\" target=\"_blank\">gitee</a>、\n            <a class=\"ml-5 flex\" href=\"https://github.com/certd/certd\" target=\"_blank\">github</a>\n          </div>\n        </template>\n      </a-alert>\n    </div>\n    <div v-if=\"!settingStore.isCommOrAgent\" class=\"content\">\n      <img src=\"/static/images/preview.png\" class=\"preview_img\" />\n    </div>\n    <div v-if=\"!settingStore.isCommOrAgent\" class=\"footer_box\">\n      <div>如果觉得好用，请不要吝啬你的star哟！</div>\n      <a href=\"https://gitee.com/certd/certd\" target=\"_blank\"><img src=\"https://gitee.com/certd/certd/badge/star.svg?theme=dark\" alt=\"star\" /></a>\n      <a href=\"https://github.com/certd/certd\" target=\"_blank\"><img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/certd/certd?logo=github\" /></a>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nimport { computed, ref, Ref } from \"vue\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { SiteInfo } from \"/@/store/settings/api.basic\";\n\nconst version = ref(import.meta.env.VITE_APP_VERSION);\nconst settingStore = useSettingStore();\nconst siteInfo: Ref<SiteInfo> = computed(() => {\n  return settingStore.siteInfo;\n});\n</script>\n<style lang=\"less\" scoped>\n.d2-page-cover {\n  .logo {\n    width: 40px;\n    height: 40px;\n  }\n  display: flex;\n  flex-flow: column nowrap;\n  justify-content: center;\n  align-items: center;\n  .d2-page-cover__logo {\n    img {\n      width: 200px;\n    }\n  }\n  .d2-page-cover__title {\n    margin: 20px;\n    font-weight: bold;\n    display: -webkit-flex; /* Safari */\n    display: flex;\n    justify-content: flex-end;\n    .title-line {\n      display: flex;\n      align-items: center;\n      flex-direction: row;\n      justify-content: center;\n      cursor: pointer;\n      font-size: 20px;\n    }\n  }\n  .d2-page-cover__sub-title {\n    margin: 0px;\n    margin-bottom: 10px;\n  }\n  .d2-page-cover__build-time {\n    margin: 0px;\n    margin-bottom: 0px;\n    margin-top: 10px;\n    font-size: 12px;\n  }\n\n  .content {\n    padding: 20px;\n    width: 70%;\n    .preview_img {\n      width: 100%;\n      border: 1px solid #eee;\n    }\n  }\n\n  .footer_box {\n    padding: 10px;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    .right {\n      display: flex;\n      justify-items: center;\n      align-items: center;\n      & > * {\n        display: flex;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/home/dashboard/api.ts",
    "content": "import { request } from \"/@/api/service\";\nimport { LocalStorage } from \"/@/utils/util.storage\";\n\nexport async function GetStatisticCount() {\n  return await request({\n    url: \"/statistic/count\",\n    method: \"POST\",\n  });\n}\n\nexport async function GetLatestVersion() {\n  const latest = LocalStorage.get(\"latestVersion\");\n  if (latest) {\n    return latest;\n  }\n  const res = await request({\n    url: \"/app/latest\",\n    method: \"GET\",\n    unpack: true,\n  });\n  try {\n    const latest = res;\n    LocalStorage.set(\"latestVersion\", latest, 60 * 60 * 24);\n    return latest;\n  } catch (e: any) {\n    console.error(e);\n    return null;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/home/dashboard/charts/d.ts",
    "content": "export type ChartItem = {\n  name: string;\n  value: number;\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/home/dashboard/charts/day-count.vue",
    "content": "<template>\n  <v-chart v-if=\"props.data\" class=\"chart\" :option=\"option\" autoresize />\n</template>\n\n<script setup lang=\"ts\">\nimport { use } from \"echarts/core\";\nimport { CanvasRenderer } from \"echarts/renderers\";\nimport { PieChart, LineChart } from \"echarts/charts\";\nimport { TitleComponent, TooltipComponent, LegendComponent, GridComponent } from \"echarts/components\";\nimport VChart, { THEME_KEY } from \"vue-echarts\";\nimport { ref, provide, defineProps, computed } from \"vue\";\nimport { ChartItem } from \"/@/views/framework/home/dashboard/charts/d\";\n\nuse([CanvasRenderer, PieChart, LineChart, TitleComponent, TooltipComponent, GridComponent, LegendComponent]);\n\nprovide(THEME_KEY, \"\");\n\nconst props = withDefaults(\n  defineProps<{\n    data: ChartItem[];\n    title: string;\n  }>(),\n  {\n    data: () => {\n      return [];\n    },\n  }\n);\n\nconst dates = computed(() => {\n  return props.data.map(item => {\n    return item.name;\n  });\n});\nconst counts = computed(() => {\n  return props.data.map(item => {\n    return item.value;\n  });\n});\nconst option = ref({\n  color: [\"#91cc75\", \"#73c0de\", \"#ee6666\", \"#fac858\", \"#3ba272\", \"#fc8452\", \"#9a60b4\", \"#ea7ccc\", \"#5470c6\"],\n  title: {\n    show: props.data.length === 0, // 没数据才显示\n    extStyle: {\n      color: \"grey\",\n      fontSize: 20,\n    },\n    text: \"暂无数据\",\n    left: \"center\",\n    top: \"center\",\n  },\n\n  tooltip: {\n    trigger: \"item\",\n  },\n  // tooltip: {\n  //   trigger: \"axis\",\n  //   axisPointer: {\n  //     type: \"cross\",\n  //     label: {\n  //       backgroundColor: \"#6a7985\"\n  //     }\n  //   }\n  // },\n  // legend: {\n  //   data: [\"Email\",]\n  // },\n  grid: {\n    top: \"20px\",\n    left: \"20px\",\n    right: \"20px\",\n    bottom: \"10px\",\n    containLabel: true,\n  },\n  xAxis: [\n    {\n      type: \"category\",\n      boundaryGap: false,\n      data: dates,\n    },\n  ],\n  yAxis: [\n    {\n      type: \"value\",\n    },\n  ],\n  series: [\n    {\n      name: props.title,\n      type: \"line\",\n      stack: \"Total\",\n      label: {\n        show: true,\n        position: \"top\",\n      },\n      smooth: true,\n      areaStyle: {},\n      emphasis: {\n        focus: \"series\",\n      },\n      data: counts,\n    },\n  ],\n});\n</script>\n\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/home/dashboard/charts/expiring-list.vue",
    "content": "<template>\n  <div v-if=\"data.length !== 0\" class=\"expiring-pipeline-list\">\n    <div v-for=\"item of data\" class=\"pipeline-row\">\n      <div class=\"title\" :title=\"item.title\">\n        <pi-status-show :status=\"item.status\"></pi-status-show> <a @click=\"goDetail(item)\">{{ item.title }}</a>\n      </div>\n      <div class=\"time\">\n        <FsTimeHumanize v-model=\"item.lastVars.certExpiresTime\" :use-format-greater=\"1000000000000\" :options=\"{ units: ['d'] }\"></FsTimeHumanize>\n      </div>\n    </div>\n  </div>\n  <div v-else class=\"flex-center flex-1 flex-col\">\n    <a-empty> </a-empty>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useRouter } from \"vue-router\";\nimport PiStatusShow from \"/@/views/certd/pipeline/pipeline/component/status-show.vue\";\nconst props = defineProps<{\n  data: any[];\n}>();\nconst router = useRouter();\nfunction goDetail(item) {\n  router.push({ path: \"/certd/pipeline/detail\", query: { id: item.id } });\n}\n</script>\n<style lang=\"less\">\n.expiring-pipeline-list {\n  padding-top: 5px;\n  .pipeline-row {\n    display: flex;\n    justify-content: space-between;\n    padding: 4px 0;\n    .title {\n      display: flex;\n      align-items: center;\n      flex: 1;\n      overflow: hidden;\n      //多余隐藏\n      white-space: nowrap;\n      text-overflow: ellipsis;\n    }\n    .time {\n      margin-left: 10px;\n      width: 70px;\n      text-align: left;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/home/dashboard/charts/pie-count.vue",
    "content": "<template>\n  <v-chart class=\"chart\" :option=\"option\" autoresize />\n</template>\n\n<script setup lang=\"ts\">\nimport { use } from \"echarts/core\";\nimport { CanvasRenderer } from \"echarts/renderers\";\nimport { PieChart } from \"echarts/charts\";\nimport { TitleComponent, TooltipComponent, LegendComponent, GridComponent } from \"echarts/components\";\nimport VChart, { THEME_KEY } from \"vue-echarts\";\nimport { ref, provide, defineProps } from \"vue\";\nimport { ChartItem } from \"./d\";\n\nuse([CanvasRenderer, PieChart, TitleComponent, TooltipComponent, GridComponent, LegendComponent]);\n\nprovide(THEME_KEY, \"\");\n\nconst props = defineProps<{\n  data: ChartItem[];\n}>();\n\nconst option = ref({\n  color: [\"#91cc75\", \"#73c0de\", \"#ee6666\", \"#fac858\", \"#5470c6\", \"#3ba272\", \"#fc8452\", \"#9a60b4\", \"#ea7ccc\", \"#5470c6\"],\n  tooltip: {\n    trigger: \"item\",\n  },\n  legend: {\n    orient: \"vertical\",\n    bottom: \"5%\",\n    left: \"left\",\n  },\n  grid: {\n    top: \"20px\",\n    left: \"20px\",\n    right: \"20px\",\n    bottom: \"10px\",\n    containLabel: true,\n  },\n  series: [\n    {\n      center: [\"60%\", \"50%\"],\n      name: \"状态\",\n      type: \"pie\",\n      radius: \"80%\",\n      avoidLabelOverlap: false,\n      itemStyle: {\n        borderRadius: 0,\n        borderColor: \"#fff\",\n        borderWidth: 1,\n      },\n      label: {\n        show: false,\n        position: \"center\",\n      },\n      emphasis: {\n        label: {\n          show: false,\n          fontSize: 18,\n          fontWeight: \"bold\",\n        },\n      },\n      labelLine: {\n        show: false,\n      },\n      data: props.data,\n    },\n  ],\n});\n</script>\n\n<style lang=\"less\">\n.chart {\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/home/dashboard/index.vue",
    "content": "<template>\n  <div class=\"dashboard-user\">\n    <div class=\"header-profile flex-wrap bg-white dark:bg-black\">\n      <div class=\"flex flex-1\">\n        <div class=\"avatar\">\n          <a-avatar v-if=\"userInfo.avatar\" size=\"large\" :src=\"'api/basic/file/download?&key=' + userInfo.avatar\" style=\"background-color: #eee\"> </a-avatar>\n          <a-avatar v-else size=\"large\" style=\"background-color: #00b4f5\">\n            {{ userInfo.username }}\n          </a-avatar>\n        </div>\n        <div class=\"text\">\n          <div class=\"left\">\n            <div>\n              <span>{{ t(\"certd.dashboard.greeting\", { name: userInfo.nickName || userInfo.username, site: siteInfo.title }) }}</span>\n            </div>\n            <div class=\"flex-o flex-wrap profile-badges\">\n              <a-tooltip :title=\"deltaTimeTip\">\n                <a-badge :dot=\"deltaTimeWarning\">\n                  <a-tag :color=\"deltaTimeWarning ? 'red' : 'green'\" class=\"flex-inline pointer\"> <fs-icon icon=\"ion:time-outline\"></fs-icon> {{ now }} </a-tag>\n                </a-badge>\n              </a-tooltip>\n\n              <template v-if=\"userStore.isAdmin\">\n                <a-divider type=\"vertical\" />\n                <a-badge :dot=\"hasNewVersion\">\n                  <a-tag color=\"blue\" class=\"flex-inline pointer mr-0\" :title=\"t('certd.dashboard.latestVersion', { version: latestVersion })\" @click=\"openUpgradeUrl()\">\n                    <fs-icon icon=\"ion:rocket-outline\" class=\"mr-5\"></fs-icon>\n                    v{{ version }}\n                  </a-tag>\n                </a-badge>\n                <a-divider type=\"vertical\" />\n                <vip-button mode=\"nav\" style=\"font-size: 12px\"></vip-button>\n              </template>\n              <template v-if=\"settingsStore.isComm\">\n                <a-divider type=\"vertical\" />\n                <suite-card class=\"m-0\"></suite-card>\n              </template>\n              <template v-if=\"settingsStore.isPlus && settingsStore.sysPublic.userValidTimeEnabled === true && userInfo.validTime\">\n                <a-divider type=\"vertical\" />\n                <valid-time-format class=\"flex-o\" :prefix=\"t('certd.dashboard.validUntil')\" :model-value=\"userInfo.validTime\" />\n              </template>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"suggest hidden md:block\">\n        <tutorial-button class=\"flex-center mt-2\">\n          <a-tooltip :title=\"t('certd.dashboard.tutorialTooltip')\">\n            <a-tag color=\"blue\" class=\"flex-center\">\n              {{ t(\"certd.dashboard.tutorialText\") }}\n              <fs-icon class=\"font-size-16 ml-5\" icon=\"mingcute:question-line\"></fs-icon>\n            </a-tag>\n          </a-tooltip>\n        </tutorial-button>\n        <SimpleSteps></SimpleSteps>\n      </div>\n    </div>\n    <div v-if=\"!settingStore.isComm\" class=\"warning\">\n      <a-alert type=\"warning\" show-icon>\n        <template #message>\n          {{ t(\"certd.dashboard.alertMessage\") }}\n          <a class=\"ml-5 flex-inline\" href=\"https://gitee.com/certd/certd\" target=\"_blank\">gitee</a>、 <a class=\"ml-5 flex-inline\" href=\"https://github.com/certd/certd\" target=\"_blank\">github</a>、\n          <a class=\"ml-5 flex-inline\" href=\"https://certd.docmirror.cn\" target=\"_blank\">{{ t(\"certd.dashboard.helpDoc\") }}</a>\n        </template>\n      </a-alert>\n    </div>\n\n    <div class=\"statistic-data m-20\">\n      <a-row :gutter=\"20\" class=\"flex-wrap\">\n        <a-col :md=\"6\" :xs=\"24\">\n          <statistic-card :title=\"t('certd.dashboard.pipelineCount')\" :count=\"count.pipelineCount\">\n            <template v-if=\"count.pipelineCount === 0\" #default>\n              <div class=\"flex-center flex-1 flex-col\">\n                <div style=\"font-size: 18px; font-weight: 700\">{{ t(\"certd.dashboard.noPipeline\") }}</div>\n                <fs-button type=\"primary\" class=\"mt-10\" icon=\"ion:add-circle-outline\" @click=\"goPipeline\">{{ t(\"certd.dashboard.createNow\") }}</fs-button>\n              </div>\n            </template>\n            <template #footer>\n              <router-link to=\"/certd/pipeline\" class=\"flex\"> <fs-icon icon=\"ion:settings-outline\" class=\"mr-5 fs-16\" /> {{ t(\"certd.dashboard.managePipeline\") }} </router-link>\n            </template>\n          </statistic-card>\n        </a-col>\n        <a-col :md=\"6\" :xs=\"24\">\n          <statistic-card :title=\"t('certd.dashboard.pipelineStatus')\" :footer=\"false\">\n            <pie-count v-if=\"count.pipelineStatusCount\" :data=\"count.pipelineStatusCount\"></pie-count>\n          </statistic-card>\n        </a-col>\n        <a-col :md=\"6\" :xs=\"24\">\n          <statistic-card :title=\"t('certd.dashboard.recentRun')\" :footer=\"false\">\n            <day-count v-if=\"count.historyCountPerDay\" :data=\"count.historyCountPerDay\" :title=\"t('certd.dashboard.runCount')\"></day-count>\n          </statistic-card>\n        </a-col>\n        <a-col :md=\"6\" :xs=\"24\">\n          <statistic-card :title=\"t('certd.dashboard.expiringCerts')\">\n            <expiring-list v-if=\"count.expiringList\" :data=\"count.expiringList\"></expiring-list>\n          </statistic-card>\n        </a-col>\n      </a-row>\n    </div>\n\n    <div v-if=\"pluginGroups\" class=\"plugin-list\">\n      <a-card>\n        <template #title>\n          {{ t(\"certd.dashboard.supportedTasks\") }}\n          <a-tag color=\"green\">{{ pluginGroups.groups.all.plugins.length }}</a-tag>\n        </template>\n        <a-row :gutter=\"10\">\n          <a-col v-for=\"item of pluginGroups.groups.all.plugins\" :key=\"item.name\" class=\"plugin-item-col\" :xl=\"4\" :md=\"6\" :xs=\"24\">\n            <a-card>\n              <a-tooltip class=\"flex-between overflow-hidden\">\n                <template #title>\n                  <div>{{ item.title }}</div>\n                  <div>{{ item.desc }}</div>\n                </template>\n                <div class=\"plugin-item pointer\">\n                  <div class=\"icon\">\n                    <fs-icon :icon=\"item.icon\" class=\"font-size-16 color-blue\" />\n                  </div>\n                  <div class=\"text flex-1 ellipsis\">\n                    <div class=\"title\">{{ item.title }}</div>\n                  </div>\n                </div>\n                <div class=\"flex-o ml-1\"><vip-button v-if=\"item.needPlus\" mode=\"icon\" class=\"\" /></div>\n              </a-tooltip>\n            </a-card>\n          </a-col>\n        </a-row>\n      </a-card>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { FsIcon } from \"@fast-crud/fast-crud\";\nimport SimpleSteps from \"/@/components/tutorial/simple-steps.vue\";\nimport { useUserStore } from \"/@/store/user\";\nimport { computed, ComputedRef, onMounted, Ref, ref } from \"vue\";\nimport dayjs from \"dayjs\";\nimport StatisticCard from \"/@/views/framework/home/dashboard/statistic-card.vue\";\nimport TutorialButton from \"/@/components/tutorial/index.vue\";\nimport DayCount from \"./charts/day-count.vue\";\nimport PieCount from \"./charts/pie-count.vue\";\nimport ExpiringList from \"./charts/expiring-list.vue\";\nimport SuiteCard from \"./suite-card.vue\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { SiteInfo } from \"/@/store/settings/api.basic\";\nimport { UserInfoRes } from \"/@/store/user/api.user\";\nimport { GetStatisticCount } from \"/@/views/framework/home/dashboard/api\";\nimport { useRouter } from \"vue-router\";\nimport * as api from \"./api\";\nimport { useI18n } from \"/src/locales\";\nconst { t } = useI18n();\nimport { usePluginStore } from \"/@/store/plugin\";\ndefineOptions({\n  name: \"DashboardUser\",\n});\n\nconst version = ref(import.meta.env.VITE_APP_VERSION);\nconst latestVersion = ref(\"\");\nconst hasNewVersion = computed(() => {\n  if (!latestVersion.value) {\n    return false;\n  }\n  if (latestVersion.value === version.value) {\n    return false;\n  }\n  //分段比较\n  const current = version.value.split(\".\");\n  const latest = latestVersion.value.split(\".\");\n  for (let i = 0; i < current.length; i++) {\n    if (parseInt(latest[i]) < parseInt(current[i])) {\n      return false;\n    }\n  }\n  return true;\n});\nasync function loadLatestVersion() {\n  latestVersion.value = await api.GetLatestVersion();\n  console.log(\"latestVersion\", latestVersion.value);\n}\nconst settingStore = useSettingStore();\nconst siteInfo: Ref<SiteInfo> = computed(() => {\n  return settingStore.siteInfo;\n});\nconst settingsStore = useSettingStore();\nconst userStore = useUserStore();\nconst userInfo: ComputedRef<UserInfoRes> = computed(() => {\n  return userStore.getUserInfo;\n});\nconst now = computed(() => {\n  const serverTime = Date.now() - settingStore.app.deltaTime;\n  return dayjs(serverTime).format(\"YYYY-MM-DD HH:mm:ss\");\n});\n\nconst deltaTimeWarning = computed(() => {\n  return Math.abs(settingStore.app.deltaTime) > 1000 * 60 * 4;\n});\nconst deltaTimeTip = computed(() => {\n  const deltaMin = (Math.abs(settingStore.app.deltaTime) / 1000 / 60).toFixed(2);\n  return `服务器时间相差:${deltaMin}分钟${deltaTimeWarning.value ? \"，请检查服务器时间是否正确\" : \"\"}`;\n});\nconst router = useRouter();\nfunction goPipeline() {\n  router.push({ path: \"/certd/pipeline\" });\n}\n\nconst count: any = ref({});\nfunction transformStatusCount() {\n  const data = count.value.pipelineStatusCount;\n  const sorted = [\n    { name: \"success\", label: \"成功\" },\n    { name: \"start\", label: \"运行中\" },\n    { name: \"error\", label: \"失败\" },\n    { name: \"canceled\", label: \"已取消\" },\n    { name: null, label: \"未执行\" },\n    { name: \"skip\", label: \"跳过\" },\n  ];\n  const result = [];\n  for (const item of sorted) {\n    const find = data.find((v: any) => v.status === item.name);\n    if (find) {\n      result.push({ name: item.label, value: find.count });\n    } else {\n      result.push({ name: item.label, value: 0 });\n    }\n  }\n  count.value.pipelineStatusCount = result;\n}\nasync function loadCount() {\n  count.value = await GetStatisticCount();\n  transformStatusCount();\n  count.value.historyCountPerDay = count.value.historyCountPerDay.map((item: any) => {\n    return {\n      name: item.date,\n      value: item.count,\n    };\n  });\n}\n\nconst pluginStore = usePluginStore();\nasync function loadPluginGroups() {\n  const groups = await pluginStore.getGroups();\n  pluginGroups.value = groups;\n}\n\nconst pluginGroups = ref();\nonMounted(async () => {\n  await userStore.loadUserInfo();\n  loadLatestVersion();\n  loadCount();\n  loadPluginGroups();\n});\n\nfunction openUpgradeUrl() {\n  window.open(\"https://certd.docmirror.cn/guide/install/upgrade.html\");\n}\n</script>\n\n<style lang=\"less\">\n.dashboard-user {\n  .warning {\n    .ant-alert {\n      border-left: 0;\n      border-right: 0;\n      border-radius: 0;\n    }\n  }\n  .header-profile {\n    display: flex;\n    align-items: center;\n    padding: 20px;\n\n    .profile-badges {\n      > * {\n        margin: 4px;\n      }\n    }\n\n    .avatar {\n      margin-right: 10px;\n    }\n    .text {\n      flex: 1;\n      display: flex;\n      flex-direction: row;\n      .left {\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        > div {\n          margin: 4px;\n        }\n      }\n    }\n  }\n  .notice {\n    padding: 20px;\n  }\n  .plugin-list {\n    margin: 0 20px;\n\n    .ant-card .ant-card-body {\n      padding: 16px;\n    }\n    .plugin-item-col {\n      margin-bottom: 10px;\n      .plugin-item {\n        display: flex;\n        justify-items: center;\n        line-height: 20px;\n        overflow: hidden;\n        flex: 1;\n        .icon {\n          display: flex;\n          justify-items: center;\n          font-size: 20px;\n          margin-right: 8px;\n        }\n        .text {\n          overflow: hidden;\n          text-overflow: ellipsis;\n          word-break: keep-all;\n          white-space: nowrap;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/home/dashboard/statistic-card.vue",
    "content": "<template>\n  <div class=\"statistic-card\">\n    <a-card>\n      <div class=\"data-item\">\n        <div class=\"header\">\n          <div class=\"title\">{{ title }}</div>\n          <div class=\"more\"></div>\n        </div>\n        <div class=\"content\">\n          <div v-if=\"!slots.default\" class=\"statistic\">\n            <div v-if=\"count !== 0\" class=\"value\">{{ count }}</div>\n            <a-empty v-else></a-empty>\n          </div>\n          <slot></slot>\n        </div>\n        <div v-if=\"slots.footer\" class=\"footer\">\n          <slot name=\"footer\"></slot>\n        </div>\n      </div>\n    </a-card>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { FsIcon } from \"@fast-crud/fast-crud\";\nconst props = defineProps<{\n  title: string;\n  count?: number;\n}>();\nconst slots = defineSlots();\n</script>\n<style lang=\"less\">\n.statistic-card {\n  margin-bottom: 10px;\n  .icon-text {\n    display: inline-flex;\n    justify-content: left;\n    align-items: center;\n    .fs-icon {\n      margin-right: 5px;\n      font-size: 14px;\n    }\n  }\n  .data-item {\n    display: flex;\n    flex-direction: column;\n    height: 188px;\n    .header {\n      display: flex;\n      justify-content: space-between;\n      //padding-bottom: 10px;\n      color: #8077a4;\n    }\n    .content {\n      display: flex;\n      flex-direction: column;\n      flex: 1;\n      .statistic {\n        height: 100%;\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        align-items: center;\n        .value {\n          font-size: 50px;\n          font-weight: 700;\n          color: #2c254e;\n        }\n      }\n\n      x-vue-echarts {\n      }\n    }\n    .footer {\n      color: #8077a4;\n      font-size: 12px;\n      text-align: right;\n      display: flex;\n      justify-content: right;\n      align-items: center;\n      border-color: #e8e8e8;\n      border-style: dashed;\n      border-width: 1px 0 0;\n      padding-top: 15px;\n      > * {\n        cursor: pointer;\n      }\n      margin-bottom: -10px;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/home/dashboard/suite-card.vue",
    "content": "<template>\n  <div v-if=\"detail.enabled\" class=\"my-suite-card\">\n    <div class=\"flex-o flex-wrap\">\n      <a-popover>\n        <template #content>\n          <div>\n            <div class=\"flex-between mt-5\">\n              <div class=\"flex-o\"><fs-icon icon=\"ant-design:check-outlined\" class=\"color-green mr-5\" /> 流水线条数：</div>\n              <suite-value :model-value=\"detail.pipelineCount.max\" :used=\"detail.pipelineCount.used\" unit=\"条\" />\n            </div>\n            <div class=\"flex-between mt-5\">\n              <div class=\"flex-o\">\n                <fs-icon icon=\"ant-design:check-outlined\" class=\"color-green mr-5\" />\n                域名数量：\n              </div>\n              <suite-value :model-value=\"detail.domainCount.max\" :used=\"detail.domainCount.used\" unit=\"个\" />\n            </div>\n            <div class=\"flex-between mt-5\">\n              <div class=\"flex-o\">\n                <fs-icon icon=\"ant-design:check-outlined\" class=\"color-green mr-5\" />\n                部署次数：\n              </div>\n              <suite-value :model-value=\"detail.deployCount.max\" :used=\"detail.deployCount.used\" unit=\"次\" />\n            </div>\n            <div class=\"flex-between mt-5\">\n              <div class=\"flex-o\"><fs-icon icon=\"ant-design:check-outlined\" class=\"color-green mr-5\" /> 监控站点数：</div>\n              <suite-value :model-value=\"detail.monitorCount.max\" :used=\"detail.monitorCount.used\" unit=\"次\" />\n            </div>\n          </div>\n        </template>\n        <div class=\"flex-o\">\n          <fs-icon icon=\"ant-design:gift-outlined\" class=\"color-green mr-5\" />\n          <a-tag v-for=\"(item, index) of detail.suites\" :key=\"index\" color=\"green\" class=\"pointer flex-o\">\n            <span class=\"mr-5\">\n              {{ item.title }}\n            </span>\n            <span>(<expires-time-text :value=\"item.expiresTime\" />)</span>\n          </a-tag>\n          <div v-if=\"detail.suites?.length === 0\" class=\"flex-o ml-5\">暂无套餐 <a-button class=\"ml-5\" type=\"primary\" size=\"small\" @click=\"goBuy\">去购买</a-button></div>\n        </div>\n      </a-popover>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport SuiteValue from \"/@/views/sys/suite/product/suite-value.vue\";\nimport { ref } from \"vue\";\nimport ExpiresTimeText from \"/@/components/expires-time-text.vue\";\nimport { mySuiteApi, SuiteDetail } from \"/@/views/certd/suite/mine/api\";\nimport { FsIcon } from \"@fast-crud/fast-crud\";\nimport { useRouter } from \"vue-router\";\n\ndefineOptions({\n  name: \"SuiteCard\",\n});\n\nconst detail = ref<SuiteDetail>({});\n\nasync function loadSuiteDetail() {\n  detail.value = await mySuiteApi.SuiteDetailGet();\n}\n\nloadSuiteDetail();\n\nconst router = useRouter();\nfunction goBuy() {\n  router.push({\n    path: \"/certd/suite/buy\",\n  });\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/home/index.vue",
    "content": "<template>\n  <fs-page class=\"home—index bg-neutral-100 dark:bg-black\">\n    <!--    <page-content />-->\n    <dashboard-user />\n    <change-password-button ref=\"changePasswordButtonRef\" :show-button=\"false\"></change-password-button>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport DashboardUser from \"./dashboard/index.vue\";\nimport { useUserStore } from \"/@/store/user\";\nimport ChangePasswordButton from \"/@/views/certd/mine/change-password-button.vue\";\nimport { onMounted, ref } from \"vue\";\nimport { Modal } from \"ant-design-vue\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\nconst userStore = useUserStore();\nconst changePasswordButtonRef = ref();\nonMounted(() => {\n  if (userStore.getUserInfo.isWeak === true) {\n    Modal.info({\n      title: t(\"authentication.title\"),\n      content: t(\"authentication.weakPasswordWarning\"),\n      onOk: () => {\n        changePasswordButtonRef.value.open({\n          password: \"123456\",\n        });\n      },\n      okText: t(\"authentication.changeNow\"),\n    });\n  }\n});\n</script>\n<style lang=\"less\">\n.home—index {\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/login/image-code.vue",
    "content": "<template>\n  <div class=\"flex\">\n    <a-input :value=\"value\" placeholder=\"请输入图片验证码\" autocomplete=\"off\" @update:value=\"onChange\">\n      <template #prefix>\n        <fs-icon icon=\"ion:image-outline\"></fs-icon>\n      </template>\n    </a-input>\n    <div class=\"input-right pointer\" title=\"点击刷新\">\n      <img class=\"image-code\" :src=\"imageCodeUrl\" @click=\"resetImageCode\" />\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { ref, useAttrs } from \"vue\";\nimport { nanoid } from \"nanoid\";\n\nconst props = defineProps<{\n  randomStr?: string;\n  value?: string;\n}>();\nconst emit = defineEmits([\"update:value\", \"update:randomStr\", \"change\"]);\n\nfunction onChange(value: string) {\n  emit(\"update:value\", value);\n  emit(\"change\", value);\n}\n\nconst imageCodeUrl = ref();\nfunction resetImageCode() {\n  const randomStr = nanoid(10);\n  let url = \"api/basic/code/captcha\";\n  imageCodeUrl.value = url + \"?randomStr=\" + randomStr;\n  emit(\"update:randomStr\", randomStr);\n}\nresetImageCode();\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/login/index.vue",
    "content": "<template>\n  <div class=\"main login-page\">\n    <a-form v-if=\"!twoFactor.loginId\" ref=\"formRef\" class=\"user-layout-login\" name=\"custom-validation\" :model=\"formState\" v-bind=\"layout\" @finish=\"handleFinish\" @finish-failed=\"handleFinishFailed\">\n      <!--      <div class=\"login-title\">登录</div>-->\n      <a-tabs v-model:active-key=\"formState.loginType\" :tab-bar-style=\"{ textAlign: 'center', borderBottom: 'unset' }\">\n        <a-tab-pane key=\"password\" :tab=\"t('authentication.passwordTab')\" :disabled=\"sysPublicSettings.passwordLoginEnabled !== true\">\n          <template v-if=\"formState.loginType === 'password'\">\n            <!--      <div class=\"login-title\">登录</div>-->\n            <a-form-item required has-feedback name=\"username\" :rules=\"rules.username\">\n              <a-input v-model:value=\"formState.username\" :placeholder=\"t('authentication.usernamePlaceholder')\" autocomplete=\"off\">\n                <template #prefix>\n                  <fs-icon icon=\"ion:phone-portrait-outline\"></fs-icon>\n                </template>\n              </a-input>\n            </a-form-item>\n            <a-form-item has-feedback name=\"password\" :rules=\"rules.password\">\n              <a-input-password v-model:value=\"formState.password\" :placeholder=\"t('authentication.passwordPlaceholder')\" autocomplete=\"off\">\n                <template #prefix>\n                  <fs-icon icon=\"ion:lock-closed-outline\"></fs-icon>\n                </template>\n              </a-input-password>\n            </a-form-item>\n          </template>\n        </a-tab-pane>\n        <a-tab-pane v-if=\"sysPublicSettings.smsLoginEnabled === true\" key=\"sms\" :tab=\"t('authentication.smsTab')\">\n          <template v-if=\"formState.loginType === 'sms'\">\n            <a-form-item has-feedback name=\"mobile\" :rules=\"rules.mobile\">\n              <a-input v-model:value=\"formState.mobile\" :placeholder=\"t('authentication.mobilePlaceholder')\" autocomplete=\"off\">\n                <template #prefix>\n                  <fs-icon icon=\"ion:phone-portrait-outline\"></fs-icon>\n                </template>\n              </a-input>\n            </a-form-item>\n\n            <a-form-item has-feedback name=\"imgCode\">\n              <image-code v-model:value=\"formState.imgCode\" v-model:random-str=\"formState.randomStr\"></image-code>\n            </a-form-item>\n\n            <a-form-item name=\"smsCode\" :rules=\"rules.smsCode\">\n              <sms-code v-model:value=\"formState.smsCode\" :img-code=\"formState.imgCode\" :mobile=\"formState.mobile\" :phone-code=\"formState.phoneCode\" :random-str=\"formState.randomStr\" />\n            </a-form-item>\n          </template>\n        </a-tab-pane>\n      </a-tabs>\n      <a-form-item>\n        <a-button type=\"primary\" size=\"large\" html-type=\"submit\" :loading=\"loading\" class=\"login-button\">\n          {{ t(\"authentication.loginButton\") }}\n        </a-button>\n\n        <div v-if=\"!settingStore.isComm\" class=\"mt-2\">\n          <a href=\"https://certd.docmirror.cn/guide/use/forgotpasswd/\" target=\"_blank\">\n            {{ t(\"authentication.forgotAdminPassword\") }}\n          </a>\n        </div>\n      </a-form-item>\n\n      <a-form-item class=\"user-login-other\">\n        <div class=\"flex flex-between justify-between items-center\">\n          <language-toggle class=\"color-blue\"></language-toggle>\n          <router-link v-if=\"hasRegisterTypeEnabled()\" class=\"register\" :to=\"{ name: 'register' }\">\n            {{ t(\"authentication.registerLink\") }}\n          </router-link>\n        </div>\n      </a-form-item>\n    </a-form>\n    <a-form v-else ref=\"twoFactorFormRef\" class=\"user-layout-login\" :model=\"twoFactor\" v-bind=\"layout\">\n      <div class=\"mb-10 flex flex-center\">请打开您的Authenticator APP，获取动态验证码。</div>\n      <a-form-item name=\"verifyCode\">\n        <a-input ref=\"verifyCodeInputRef\" v-model:value=\"twoFactor.verifyCode\" placeholder=\"请输入动态验证码\" allow-clear @keydown.enter=\"handleTwoFactorSubmit\">\n          <template #prefix>\n            <fs-icon icon=\"ion:lock-closed-outline\"></fs-icon>\n          </template>\n        </a-input>\n      </a-form-item>\n      <a-form-item>\n        <loading-button type=\"primary\" size=\"large\" html-type=\"button\" class=\"login-button\" :click=\"handleTwoFactorSubmit\">OTP验证登录</loading-button>\n      </a-form-item>\n\n      <a-form-item class=\"user-login-other\">\n        <a class=\"register\" @click=\"twoFactor.loginId = null\"> 返回 </a>\n      </a-form-item>\n    </a-form>\n  </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent, nextTick, reactive, ref, toRaw } from \"vue\";\nimport { useUserStore } from \"/src/store/user\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { utils } from \"@fast-crud/fast-crud\";\nimport ImageCode from \"/@/views/framework/login/image-code.vue\";\nimport SmsCode from \"/@/views/framework/login/sms-code.vue\";\nimport { useI18n } from \"/@/locales\";\nimport { LanguageToggle } from \"/@/vben/layouts\";\n\nexport default defineComponent({\n  name: \"LoginPage\",\n  components: { LanguageToggle, SmsCode, ImageCode },\n  setup() {\n    const { t } = useI18n();\n    const verifyCodeInputRef = ref();\n    const loading = ref(false);\n    const userStore = useUserStore();\n    const settingStore = useSettingStore();\n    const formRef = ref();\n    const formState = reactive({\n      username: \"\",\n      phoneCode: \"86\",\n      mobile: \"\",\n      password: \"\",\n      loginType: \"password\", //password\n      imgCode: \"\",\n      smsCode: \"\",\n      randomStr: \"\",\n    });\n\n    const rules = {\n      mobile: [\n        {\n          required: true,\n          message: \"请输入手机号\",\n        },\n      ],\n      username: [\n        {\n          required: true,\n          message: \"请输入用户名\",\n        },\n      ],\n      password: [\n        {\n          required: true,\n          message: \"请输入登录密码\",\n        },\n      ],\n      smsCode: [\n        {\n          required: true,\n          message: \"请输入短信验证码\",\n        },\n      ],\n    };\n    const layout = {\n      labelCol: {\n        span: 0,\n      },\n      wrapperCol: {\n        span: 24,\n      },\n    };\n\n    const twoFactor = reactive({\n      loginId: \"\",\n      verifyCode: \"\",\n    });\n\n    const handleTwoFactorSubmit = async () => {\n      await userStore.loginByTwoFactor(twoFactor);\n    };\n\n    const handleFinish = async (values: any) => {\n      loading.value = true;\n      try {\n        const loginType = formState.loginType;\n        await userStore.login(loginType, toRaw(formState));\n      } catch (e: any) {\n        //@ts-ignore\n        if (e.code === 10020) {\n          //双重认证\n          //@ts-ignore\n          twoFactor.loginId = e.data;\n          await nextTick();\n          verifyCodeInputRef.value.focus();\n        } else {\n          throw e;\n        }\n      } finally {\n        loading.value = false;\n      }\n    };\n\n    const handleFinishFailed = (errors: any) => {\n      utils.logger.log(errors);\n    };\n\n    const resetForm = () => {\n      formRef.value.resetFields();\n    };\n\n    const isLoginError = ref();\n\n    const sysPublicSettings = settingStore.getSysPublic;\n\n    function hasRegisterTypeEnabled() {\n      return sysPublicSettings.registerEnabled && (sysPublicSettings.usernameRegisterEnabled || sysPublicSettings.emailRegisterEnabled);\n    }\n\n    return {\n      t,\n      loading,\n      formState,\n      formRef,\n      rules,\n      layout,\n      handleFinishFailed,\n      handleFinish,\n      resetForm,\n      isLoginError,\n      sysPublicSettings,\n      hasRegisterTypeEnabled,\n      twoFactor,\n      handleTwoFactorSubmit,\n      verifyCodeInputRef,\n      settingStore,\n    };\n  },\n});\n</script>\n\n<style lang=\"less\">\n\n.login-page.main {\n  //margin: 20px !important;\n  margin-bottom: 100px;\n\n  .user-layout-login {\n    //label {\n    //  font-size: 14px;\n    //}\n\n    .login-title {\n      font-size: 18px;\n      text-align: center;\n      margin: 20px;\n    }\n\n    .getCaptcha {\n      display: block;\n      width: 100%;\n    }\n\n    .image-code {\n      height: 34px;\n    }\n\n    .input-right {\n      width: 160px;\n      margin-left: 10px;\n    }\n\n    .forge-password {\n      font-size: 14px;\n    }\n\n    button.login-button {\n      padding: 0 15px;\n      font-size: 16px;\n      width: 100%;\n    }\n\n    .user-login-other {\n      text-align: left;\n      margin-top: 30px;\n      margin-bottom: 30px;\n      //line-height: 22px;\n\n      .item-icon {\n        font-size: 24px;\n        color: rgba(0, 0, 0, 0.2);\n        margin-left: 16px;\n        vertical-align: middle;\n        cursor: pointer;\n        transition: color 0.3s;\n\n        &:hover {\n        }\n      }\n\n      .register {\n        float: right;\n      }\n    }\n\n    .fs-icon {\n      color: rgba(0, 0, 0, 0.45);\n      margin-right: 4px;\n    }\n\n    .ant-input-affix-wrapper {\n      line-height: 1.8 !important;\n      font-size: 14px !important;\n\n      > * {\n        line-height: 1.8 !important;\n        font-size: 14px !important;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/login/sms-code.vue",
    "content": "<template>\n  <div class=\"flex\">\n    <a-input :value=\"value\" placeholder=\"短信验证码\" @update:value=\"onChange\">\n      <template #prefix>\n        <fs-icon icon=\"ion:mail-outline\"></fs-icon>\n      </template>\n    </a-input>\n    <div class=\"input-right\">\n      <a-button class=\"getCaptcha\" type=\"primary\" tabindex=\"-1\" :disabled=\"smsSendBtnDisabled\" @click=\"sendSmsCode\">\n        {{ smsTime <= 0 ? \"发送\" : smsTime + \" s\" }}\n      </a-button>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { computed, ref, useAttrs } from \"vue\";\nimport { notification } from \"ant-design-vue\";\nimport * as api from \"/@/store/settings/api.basic\";\n\nconst props = defineProps<{\n  value?: string;\n  mobile?: string;\n  phoneCode?: string;\n  imgCode?: string;\n  randomStr?: string;\n}>();\nconst emit = defineEmits([\"update:value\", \"change\"]);\n\nfunction onChange(value: string) {\n  emit(\"update:value\", value);\n  emit(\"change\", value);\n}\nconst loading = ref(false);\nconst smsTime = ref(0);\nconst smsSendBtnDisabled = computed(() => {\n  if (loading.value) {\n    return true;\n  }\n  if (smsTime.value === 0) {\n    return false;\n  }\n  return smsTime.value > 0;\n});\n\nasync function sendSmsCode() {\n  if (!props.mobile) {\n    notification.error({ message: \"请输入手机号\" });\n    return;\n  }\n  if (!props.imgCode) {\n    notification.error({ message: \"请输入图片验证码\" });\n    return;\n  }\n  loading.value = true;\n  try {\n    await api.sendSmsCode({\n      phoneCode: props.phoneCode,\n      mobile: props.mobile,\n      imgCode: props.imgCode,\n      randomStr: props.randomStr,\n    });\n  } finally {\n    loading.value = false;\n  }\n  smsTime.value = 60;\n  setInterval(() => {\n    smsTime.value--;\n  }, 1000);\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/register/email-code.vue",
    "content": "<template>\n  <div class=\"flex\">\n    <a-input :value=\"value\" placeholder=\"邮件验证码\" @update:value=\"onChange\">\n      <template #prefix>\n        <fs-icon icon=\"ion:mail-outline\"></fs-icon>\n      </template>\n    </a-input>\n    <div class=\"input-right\">\n      <a-button class=\"getCaptcha\" type=\"primary\" tabindex=\"-1\" :disabled=\"smsSendBtnDisabled\" @click=\"sendSmsCode\">\n        {{ smsTime <= 0 ? \"发送\" : smsTime + \" s\" }}\n      </a-button>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { computed, ref, useAttrs } from \"vue\";\nimport { notification } from \"ant-design-vue\";\nimport * as api from \"/@/store/settings/api.basic\";\n\nconst props = defineProps<{\n  value?: string;\n  email?: string;\n  imgCode?: string;\n  randomStr?: string;\n}>();\nconst emit = defineEmits([\"update:value\", \"change\"]);\n\nfunction onChange(value: string) {\n  emit(\"update:value\", value);\n  emit(\"change\", value);\n}\n\nconst loading = ref(false);\nconst smsTime = ref(0);\nconst smsSendBtnDisabled = computed(() => {\n  if (loading.value) {\n    return true;\n  }\n  return smsTime.value > 0;\n});\nasync function sendSmsCode() {\n  if (!props.email) {\n    notification.error({ message: \"请输入邮箱\" });\n    return;\n  }\n  if (!props.imgCode) {\n    notification.error({ message: \"请输入图片验证码\" });\n    return;\n  }\n  loading.value = true;\n  try {\n    await api.sendEmailCode({\n      email: props.email,\n      imgCode: props.imgCode,\n      randomStr: props.randomStr,\n    });\n  } finally {\n    loading.value = false;\n  }\n\n  smsTime.value = 60;\n  setInterval(() => {\n    smsTime.value--;\n  }, 1000);\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/framework/register/index.vue",
    "content": "<template>\n  <div class=\"main\">\n    <a-form ref=\"formRef\" class=\"user-layout-register\" name=\"custom-validation\" :model=\"formState\" :rules=\"rules\" v-bind=\"layout\" :label-col=\"{ span: 6 }\" @finish=\"handleFinish\" @finish-failed=\"handleFinishFailed\">\n      <a-tabs v-model:active-key=\"registerType\">\n        <a-tab-pane key=\"username\" tab=\"用户名注册\" :disabled=\"!settingsStore.sysPublic.usernameRegisterEnabled\">\n          <template v-if=\"registerType === 'username'\">\n            <a-form-item required has-feedback name=\"username\" label=\"用户名\" :rules=\"rules.username\">\n              <a-input v-model:value=\"formState.username\" placeholder=\"用户名\" size=\"large\" autocomplete=\"off\">\n                <template #prefix>\n                  <fs-icon icon=\"ion:person-outline\"></fs-icon>\n                </template>\n              </a-input>\n            </a-form-item>\n            <a-form-item has-feedback name=\"password\" label=\"密码\" :rules=\"rules.password\">\n              <a-input-password v-model:value=\"formState.password\" placeholder=\"密码\" size=\"large\" autocomplete=\"off\">\n                <template #prefix>\n                  <fs-icon icon=\"ion:lock-closed-outline\"></fs-icon>\n                </template>\n              </a-input-password>\n            </a-form-item>\n            <a-form-item has-feedback name=\"confirmPassword\" label=\"确认密码\">\n              <a-input-password v-model:value=\"formState.confirmPassword\" placeholder=\"确认密码\" size=\"large\" autocomplete=\"off\" :rules=\"rules.confirmPassword\">\n                <template #prefix>\n                  <fs-icon icon=\"ion:lock-closed-outline\"></fs-icon>\n                </template>\n              </a-input-password>\n            </a-form-item>\n            <a-form-item has-feedback name=\"imgCode\" label=\"图片验证码\" :rules=\"rules.imgCode\">\n              <image-code v-model:value=\"formState.imgCode\" v-model:random-str=\"formState.randomStr\"></image-code>\n            </a-form-item>\n          </template>\n        </a-tab-pane>\n        <a-tab-pane key=\"email\" tab=\"邮箱注册\" :disabled=\"!settingsStore.sysPublic.emailRegisterEnabled\">\n          <template v-if=\"registerType === 'email'\">\n            <a-form-item required has-feedback name=\"email\" label=\"邮箱\">\n              <a-input v-model:value=\"formState.email\" placeholder=\"邮箱\" size=\"large\" autocomplete=\"off\">\n                <template #prefix>\n                  <fs-icon icon=\"ion:mail-outline\"></fs-icon>\n                </template>\n              </a-input>\n            </a-form-item>\n            <a-form-item has-feedback name=\"password\" label=\"密码\">\n              <a-input-password v-model:value=\"formState.password\" placeholder=\"密码\" size=\"large\" autocomplete=\"off\">\n                <template #prefix>\n                  <fs-icon icon=\"ion:lock-closed-outline\"></fs-icon>\n                </template>\n              </a-input-password>\n            </a-form-item>\n            <a-form-item has-feedback name=\"confirmPassword\" label=\"确认密码\">\n              <a-input-password v-model:value=\"formState.confirmPassword\" placeholder=\"确认密码\" size=\"large\" autocomplete=\"off\">\n                <template #prefix>\n                  <fs-icon icon=\"ion:lock-closed-outline\"></fs-icon>\n                </template>\n              </a-input-password>\n            </a-form-item>\n\n            <a-form-item has-feedback name=\"imgCode\" label=\"图片验证码\" :rules=\"rules.imgCode\">\n              <image-code v-model:value=\"formState.imgCode\" v-model:random-str=\"formState.randomStr\"></image-code>\n            </a-form-item>\n\n            <a-form-item has-feedback name=\"validateCode\" :rules=\"rules.validateCode\" label=\"邮件验证码\">\n              <email-code v-model:value=\"formState.validateCode\" :img-code=\"formState.imgCode\" :email=\"formState.email\" :random-str=\"formState.randomStr\" />\n            </a-form-item>\n          </template>\n        </a-tab-pane>\n      </a-tabs>\n\n      <a-form-item>\n        <a-button type=\"primary\" size=\"large\" html-type=\"submit\" class=\"login-button\">注册</a-button>\n      </a-form-item>\n\n      <a-form-item class=\"user-login-other\">\n        <router-link class=\"register\" :to=\"{ name: 'login' }\"> 登录 </router-link>\n      </a-form-item>\n    </a-form>\n  </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent, reactive, ref, toRaw } from \"vue\";\nimport { useUserStore } from \"/src/store/user\";\nimport { utils } from \"@fast-crud/fast-crud\";\nimport ImageCode from \"/@/views/framework/login/image-code.vue\";\nimport EmailCode from \"./email-code.vue\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { notification } from \"ant-design-vue\";\nexport default defineComponent({\n  name: \"RegisterPage\",\n  components: { EmailCode, ImageCode },\n  setup() {\n    const settingsStore = useSettingStore();\n    const registerType = ref(\"email\");\n    if (!settingsStore.sysPublic.emailRegisterEnabled) {\n      registerType.value = \"username\";\n      if (!settingsStore.sysPublic.usernameRegisterEnabled) {\n        registerType.value = \"\";\n        notification.error({\n          message: \"没有启用任何一种注册方式\",\n        });\n      }\n    }\n    const userStore = useUserStore();\n    const formRef = ref();\n    const formState: any = reactive({\n      mobile: \"\",\n      phoneCode: \"\",\n      email: \"\",\n      username: \"\",\n      password: \"\",\n      confirmPassword: \"\",\n      randomStr: \"\",\n    });\n\n    const rules = {\n      username: [\n        {\n          required: true,\n          trigger: \"change\",\n          message: \"请输入用户名\",\n        },\n      ],\n      email: [\n        {\n          required: true,\n          trigger: \"change\",\n          message: \"请输入邮箱\",\n        },\n        {\n          type: \"email\",\n          message: \"请输入正确的邮箱\",\n        },\n      ],\n      password: [\n        {\n          required: true,\n          trigger: \"change\",\n          message: \"请输入密码\",\n        },\n      ],\n      confirmPassword: [\n        {\n          required: true,\n          trigger: \"change\",\n          message: \"请确认密码\",\n        },\n        {\n          validator: async (rule: any, value: any) => {\n            if (value && value !== formState.password) {\n              throw new Error(\"两次输入密码不一致\");\n            }\n            return true;\n          },\n        },\n      ],\n\n      imgCode: [\n        {\n          required: true,\n          message: \"请输入图片验证码\",\n        },\n        {\n          min: 4,\n          max: 4,\n          message: \"请输入4位图片验证码\",\n        },\n      ],\n      smsCode: [\n        {\n          required: true,\n          message: \"请输入短信验证码\",\n        },\n      ],\n      validateCode: [\n        {\n          required: true,\n          message: \"请输入邮件验证码\",\n        },\n      ],\n    };\n    const layout = {\n      labelCol: {\n        span: 0,\n      },\n      wrapperCol: {\n        span: 24,\n      },\n    };\n\n    const handleFinish = async (values: any) => {\n      await userStore.register(\n        toRaw({\n          type: registerType.value,\n          password: formState.password,\n          username: formState.username,\n          imgCode: formState.imgCode,\n          randomStr: formState.randomStr,\n          email: formState.email,\n          validateCode: formState.validateCode,\n        }) as any\n      );\n    };\n\n    const handleFinishFailed = (errors: any) => {\n      utils.logger.log(errors);\n    };\n\n    const resetForm = () => {\n      formRef.value.resetFields();\n    };\n\n    const imageCodeUrl = ref();\n    function resetImageCode() {\n      let url = \"/basic/code\";\n      imageCodeUrl.value = url + \"?t=\" + new Date().getTime();\n    }\n    resetImageCode();\n\n    return {\n      resetImageCode,\n      imageCodeUrl,\n      formState,\n      formRef,\n      rules,\n      layout,\n      handleFinishFailed,\n      handleFinish,\n      resetForm,\n      registerType,\n      settingsStore,\n    };\n  },\n});\n</script>\n\n<style lang=\"less\">\n.user-layout-register {\n  label {\n    font-size: 14px;\n  }\n\n  .ant-input-affix-wrapper {\n    line-height: 1.8 !important;\n    font-size: 14px !important;\n    > * {\n      line-height: 1.8 !important;\n      font-size: 14px !important;\n    }\n  }\n\n  .getCaptcha {\n    display: block;\n    width: 100%;\n  }\n\n  .image-code {\n    height: 34px;\n  }\n  .input-right {\n    width: 160px;\n    margin-left: 10px;\n  }\n\n  .login-title {\n    // color: @primary-color;\n    font-size: 18px;\n    text-align: center;\n    margin: 30px;\n    margin-top: 50px;\n  }\n\n  .forge-password {\n    font-size: 14px;\n  }\n\n  button.login-button {\n    padding: 0 15px;\n    font-size: 16px;\n    height: 40px;\n    width: 100%;\n  }\n\n  .user-login-other {\n    text-align: left;\n    margin-top: 30px;\n    margin-bottom: 30px;\n    line-height: 22px;\n\n    .item-icon {\n      font-size: 24px;\n      color: rgba(0, 0, 0, 0.2);\n      margin-left: 16px;\n      vertical-align: middle;\n      cursor: pointer;\n      transition: color 0.3s;\n\n      &:hover {\n      }\n    }\n\n    .register {\n      float: right;\n    }\n  }\n  .iconify {\n    color: rgba(0, 0, 0, 0.45);\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/access/index.vue",
    "content": "<template>\n  <fs-page>\n    <template #header>\n      <div class=\"title\">\n        系统级授权管理\n        <span class=\"sub\">管理第三方系统的授权信息(系统级)</span>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"../../certd/access/crud\";\nimport { createAccessApi } from \"/@/views/certd/access/api\";\n\nexport default defineComponent({\n  name: \"SysAccessManager\",\n  setup() {\n    const api = createAccessApi(\"sys\");\n    const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: { api } });\n\n    // 页面打开后获取列表数据\n    onMounted(() => {\n      crudExpose.doRefresh();\n    });\n\n    onActivated(async () => {\n      await crudExpose.doRefresh();\n    });\n\n    return {\n      crudBinding,\n      crudRef,\n    };\n  },\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/account/api.ts",
    "content": "import { request } from \"/@/api/service\";\n\nexport async function PreBindUser(userId: number) {\n  await request({\n    url: \"/sys/account/preBindUser\",\n    method: \"post\",\n    data: { userId },\n  });\n}\n\nexport async function BindUser(userId: number) {\n  await request({\n    url: \"/sys/account/bindUser\",\n    method: \"post\",\n    data: { userId },\n  });\n}\n\nexport async function UnbindUser(userId: number) {\n  await request({\n    url: \"/sys/account/unbindUser\",\n    method: \"post\",\n    data: { userId },\n  });\n}\n\nexport async function UpdateLicense(data: any) {\n  await request({\n    url: \"/sys/account/updateLicense\",\n    method: \"post\",\n    data,\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/account/index.vue",
    "content": "<template>\n  <fs-page class=\"cd-page-account\">\n    <!--    <template #header>-->\n    <!--      <div class=\"title\">-->\n    <!--        站点绑定-->\n    <!--        <span class=\"sub\">管理你安装过的Certd站点，可以通过转移功能避免丢失VIP，强烈建议绑定</span>-->\n    <!--      </div>-->\n    <!--    </template>-->\n\n    <iframe ref=\"iframeRef\" class=\"account-iframe\" :src=\"iframeSrcRef\"> </iframe>\n  </fs-page>\n</template>\n\n<script setup lang=\"tsx\">\nimport { IframeClient } from \"@certd/lib-iframe\";\nimport { computed, onMounted, ref } from \"vue\";\nimport { useUserStore } from \"/@/store/user\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport * as api from \"./api\";\nimport { notification } from \"ant-design-vue\";\n\ndefineOptions({\n  name: \"AccountBind\",\n});\nconst iframeRef = ref();\n\nconst userStore = useUserStore();\nconst settingStore = useSettingStore();\n\nconst iframeSrcRef = computed(() => {\n  if (!settingStore.installInfo.accountServerBaseUrl) {\n    return \"\";\n  }\n  return `${settingStore.installInfo.accountServerBaseUrl}/#/?appKey=${settingStore.installInfo.appKey}`;\n});\n\ntype SubjectInfo = {\n  subjectId: string;\n  installAt?: number;\n  vipType?: string;\n  expiresAt?: number;\n};\nonMounted(() => {\n  const iframeClient = new IframeClient(iframeRef.value, (e: any) => {\n    notification.error({\n      message: \" error\",\n      description: e.message,\n    });\n  });\n  iframeClient.register(\"getSubjectInfo\", async (req: any) => {\n    const subjectInfo: SubjectInfo = {\n      subjectId: settingStore.installInfo.siteId,\n      installAt: settingStore.installInfo.installTime,\n      vipType: settingStore.plusInfo.vipType || \"free\",\n      expiresAt: settingStore.plusInfo.expireTime,\n    };\n    return subjectInfo;\n  });\n\n  let preBindUserId: any = null;\n  iframeClient.register(\"preBindUser\", async req => {\n    const userId = req.data.userId;\n    preBindUserId = userId;\n    await api.PreBindUser(userId);\n  });\n\n  iframeClient.register(\"onBoundUser\", async req => {\n    await api.BindUser(preBindUserId);\n  });\n\n  iframeClient.register(\"unbindUser\", async req => {\n    const userId = req.data.userId;\n    await api.UnbindUser(userId);\n  });\n\n  iframeClient.register(\"updateLicense\", async req => {\n    await api.UpdateLicense(req.data);\n    await settingStore.init();\n    await settingStore.doBindUrl();\n    notification.success({\n      message: \"更新成功\",\n      description: \"专业版/商业版已激活\",\n    });\n  });\n});\n</script>\n\n<style lang=\"less\">\n.cd-page-account {\n  .fs-page-content {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n  }\n  .account-iframe {\n    width: 100%;\n    height: 100%;\n    border: none;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/authority/permission/api.ts",
    "content": "import { request } from \"/src/api/service\";\nconst apiPrefix = \"/sys/authority/permission\";\nexport async function GetList(query: any) {\n  return await request({\n    url: apiPrefix + \"/page\",\n    method: \"post\",\n    data: query,\n  });\n}\n\nexport async function GetTree() {\n  return await request({\n    url: apiPrefix + \"/tree\",\n    method: \"post\",\n  });\n}\n\nexport async function AddObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/add\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function UpdateObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/update\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function DelObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/delete\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/info\",\n    method: \"post\",\n    params: { id },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/authority/permission/crud.tsx",
    "content": "import * as api from \"./api.js\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { useI18n } from \"/src/locales\";\n\nexport default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { t } = useI18n();\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    const list = await api.GetTree();\n\n    return {\n      offset: 0,\n      records: list,\n      total: 10000,\n      limit: 10000,\n    };\n  };\n\n  async function afterChange() {\n    await permissionTreeDict.reloadDict();\n  }\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    const ret = await api.UpdateObj(form);\n    await afterChange();\n    return ret;\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    const ret = await api.DelObj(row.id);\n    await afterChange();\n    return ret;\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    const ret = await api.AddObj(form);\n    await afterChange();\n    return ret;\n  };\n  const permissionTreeDict = dict({\n    url: \"/sys/authority/permission/tree\",\n    isTree: true,\n    value: \"id\",\n    label: \"title\",\n    async onReady({ dict }: any) {\n      dict.setData([{ id: -1, title: t(\"certd.rootNode\"), children: dict.data }]);\n    },\n  });\n  return {\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      actionbar: {\n        show: false,\n      },\n      toolbar: {\n        show: false,\n      },\n      table: {\n        show: false,\n        // scroll: { fixed: true }\n      },\n      rowHandle: {\n        fixed: \"right\",\n      },\n      search: {\n        show: false,\n      },\n      pagination: {\n        show: false,\n        pageSize: 100000,\n      },\n      columns: {\n        id: {\n          title: \"id\",\n          type: \"number\",\n          form: { show: false }, // 表单配置\n          column: {\n            width: 120,\n            sortable: \"custom\",\n          },\n        },\n        title: {\n          title: t(\"certd.permissionName\"),\n          type: \"text\",\n          form: {\n            rules: [\n              { required: true, message: t(\"certd.enterPermissionName\") },\n              { max: 50, message: t(\"certd.max50Chars\") },\n            ],\n            component: {\n              placeholder: t(\"certd.permissionName\"),\n            },\n          },\n          column: {\n            width: 200,\n          },\n        },\n        permission: {\n          title: t(\"certd.permissionCode\"),\n          type: \"text\",\n          column: {\n            width: 170,\n          },\n          form: {\n            rules: [\n              { required: true, message: t(\"certd.enterPermissionCode\") },\n              { max: 100, message: t(\"certd.max100Chars\") },\n            ],\n            component: {\n              placeholder: t(\"certd.examplePermissionCode\"),\n            },\n          },\n        },\n        sort: {\n          title: t(\"certd.sortOrder\"),\n          type: \"number\",\n          column: {\n            width: 100,\n          },\n          form: {\n            value: 100,\n            rules: [{ required: true, type: \"number\", message: t(\"certd.sortRequired\") }],\n          },\n        },\n        parentId: {\n          title: t(\"certd.parentNode\"),\n          type: \"dict-tree\",\n          column: {\n            width: 100,\n          },\n          dict: permissionTreeDict,\n          form: {\n            value: -1,\n            component: {\n              multiple: false,\n              defaultExpandAll: true,\n              dict: { cache: false },\n              fieldNames: {\n                value: \"id\",\n                label: \"title\",\n              },\n            },\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/authority/permission/fs-permission-tree.vue",
    "content": "<template>\n  <a-tree\n    v-if=\"computedTree\"\n    ref=\"treeRef\"\n    class=\"fs-permission-tree\"\n    :class=\"{ 'is-editable': editable }\"\n    :selectable=\"false\"\n    show-line\n    :show-icon=\"false\"\n    :default-expand-all=\"true\"\n    :tree-data=\"computedTree\"\n    @check=\"onChecked\"\n  >\n    <template #title=\"scope\">\n      <div class=\"node-title-pane\">\n        <div class=\"node-title\">{{ scope.title }}</div>\n        <div v-if=\"editable === true\" class=\"node-suffix\">\n          <fs-icon v-if=\"actions.add !== false\" :icon=\"$fsui.icons.add\" @click.stop=\"add(scope)\" />\n          <fs-icon v-if=\"actions.edit !== false && scope.id !== -1\" :icon=\"$fsui.icons.edit\" @click.stop=\"edit(scope)\" />\n          <fs-icon v-if=\"actions.remove !== false && scope.id !== -1\" :icon=\"$fsui.icons.remove\" @click.stop=\"remove(scope)\" />\n        </div>\n      </div>\n    </template>\n  </a-tree>\n</template>\n\n<script lang=\"ts\">\nimport { utils } from \"@fast-crud/fast-crud\";\nimport { cloneDeep } from \"lodash-es\";\nimport { computed, defineComponent, ref } from \"vue\";\nimport { useI18n } from \"/src/locales\";\n\nexport default defineComponent({\n  name: \"FsPermissionTree\",\n  props: {\n    /**\n     * 树形数据\n     * */\n    tree: {},\n    /**\n     * 是否可编辑\n     */\n    editable: {\n      default: true,\n    },\n    actions: {\n      default: {},\n    },\n  } as any,\n  emits: [\"add\", \"edit\", \"remove\"],\n  setup(props: any, ctx) {\n    const { t } = useI18n();\n    const treeRef = ref();\n    const computedTree = computed(() => {\n      if (props.tree == null) {\n        return null;\n      }\n      const clone = cloneDeep(props.tree);\n      utils.deepdash.forEachDeep(clone, (value: any, key: any, pNode: any, context: any) => {\n        if (value == null) {\n          return;\n        }\n        if (!(value instanceof Object) || value instanceof Array) {\n          return;\n        }\n        if (value.class === \"is-leaf\") {\n          //处理过，无需再次处理\n          return;\n        }\n        value.class = \"is-twig\";\n        if (value.children != null && value.children.length > 0) {\n          return;\n        }\n        const parents = context.parents;\n        if (parents.length < 2) {\n          return;\n        }\n        const parent = parents[parents.length - 2].value;\n        //看parent下面的children，是否全部都没有children\n        for (const child of parent.children) {\n          if (child.children != null && child.children.length > 0) {\n            //存在child有children\n            return;\n          }\n        }\n        // 所有的子节点都没有children\n        parent.class = \"is-twig\"; // 连接叶子节点的末梢枝杈节点\n        let i = 0;\n        for (const child of parent.children) {\n          child.class = \"is-leaf\";\n          if (i !== 0) {\n            child.class += \" leaf-after\";\n          }\n          i++;\n        }\n      });\n      return [\n        {\n          title: t(\"certd.rootNode\"),\n          id: -1,\n          children: clone,\n        },\n      ];\n    });\n    function add(scope: any) {\n      ctx.emit(\"add\", scope.dataRef);\n    }\n    function edit(scope: any) {\n      ctx.emit(\"edit\", scope.dataRef);\n    }\n    function remove(scope: any) {\n      ctx.emit(\"remove\", scope.dataRef);\n    }\n    function onChecked(a: any, b: any, c: any) {\n      utils.logger.info(\"chedcked\", a, b, c);\n    }\n    function getChecked() {\n      const checked = treeRef.value.checkedKeys;\n      const halfChecked = treeRef.value.halfCheckedKeys;\n      return {\n        checked,\n        halfChecked,\n      };\n    }\n    return {\n      computedTree,\n      add,\n      edit,\n      remove,\n      treeRef,\n      onChecked,\n      getChecked,\n      t,\n    };\n  },\n});\n</script>\n\n<style lang=\"less\">\n.fs-permission-tree {\n  .ant-tree-list-holder-inner {\n    flex-direction: row !important;\n    flex-wrap: wrap;\n\n    .is-twig {\n      width: 100%;\n    }\n\n    .is-leaf {\n      //border-bottom: 1px solid #ddd;\n      &::before {\n        display: none;\n      }\n\n      &.leaf-after {\n        .ant-tree-indent-unit {\n          display: none;\n        }\n      }\n\n      .node-title-pane {\n        border-bottom: 1px solid #ddd;\n      }\n    }\n  }\n\n  //.is-twig ul {\n  //  display: flex;\n  //  flex-wrap: wrap;\n  //}\n  .node-title-pane {\n    display: flex;\n\n    .node-title {\n      width: 110px;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n  }\n\n  &.is-editable {\n    .ant-tree-title {\n      &:hover {\n        .node-suffix {\n          visibility: visible;\n        }\n      }\n    }\n\n    .node-suffix {\n      visibility: hidden;\n\n      > * {\n        margin-left: 3px;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/authority/permission/index.vue",
    "content": "<template>\n  <fs-page>\n    <template #header>\n      <div class=\"title\">{{ t(\"certd.permissionManagement\") }}</div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\">\n      <a-button v-permission=\"'1sys:auth:per:add'\" style=\"margin-left: 20px\" @click=\"addHandle({})\">\n        <fs-icon :icon=\"ui.icons.add\"></fs-icon>\n        {{ t(\"certd.adda\") }}\n      </a-button>\n      <fs-permission-tree class=\"permission-tree mt-10\" :tree=\"crudBinding.data\" :checkable=\"false\" :actions=\"permission\" @add=\"addHandle\" @edit=\"editHandle\" @remove=\"removeHandle\"></fs-permission-tree>\n    </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onActivated, onMounted, ref } from \"vue\";\nimport createCrudOptions from \"./crud.js\";\nimport FsPermissionTree from \"./fs-permission-tree.vue\";\nimport { usePermission } from \"/src/plugin/permission\";\nimport { useFs, useUi } from \"@fast-crud/fast-crud\";\nimport { useI18n } from \"/src/locales\";\n\nexport default defineComponent({\n  name: \"AuthorityManager\",\n  components: { FsPermissionTree },\n  setup() {\n    // 此处传入permission进行通用按钮权限设置，会通过commonOptions去设置actionbar和rowHandle的按钮的show属性\n    // 更多关于按钮权限的源代码设置，请参考 ./src/plugin/fast-crud/index.js （75-77行）\n    const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: { permission: \"sys:auth:per\" } });\n    const { t } = useI18n();\n\n    // 页面打开后获取列表数据\n    onMounted(async () => {\n      await crudExpose.doRefresh();\n    });\n    onActivated(async () => {\n      await crudExpose.doRefresh();\n    });\n\n    const { ui } = useUi();\n\n    //用户业务代码\n\n    async function addHandle(item: any) {\n      await crudExpose.openAdd({ row: { parentId: item?.id ?? -1 } });\n    }\n    async function editHandle(item: any) {\n      await crudExpose.openEdit({ row: item });\n    }\n    async function removeHandle(item: any) {\n      await crudExpose.doRemove({ row: { id: item.id }, index: null });\n    }\n\n    const { hasPermissions } = usePermission();\n    const permission = ref({\n      add: hasPermissions(\"1sys:auth:per:add\"),\n      edit: hasPermissions(\"1sys:auth:per:edit\"),\n      remove: hasPermissions(\"1sys:auth:per:remove\"),\n    });\n\n    return {\n      ui,\n      crudBinding,\n      crudRef,\n      addHandle,\n      editHandle,\n      removeHandle,\n      permission,\n      t,\n    };\n  },\n});\n</script>\n<style lang=\"less\">\n.permission-tree {\n  margin-left: 20px;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/authority/role/api.ts",
    "content": "import { request } from \"/src/api/service\";\nconst apiPrefix = \"/sys/authority/role\";\nexport async function GetList(query: any) {\n  return await request({\n    url: apiPrefix + \"/page\",\n    method: \"post\",\n    data: query,\n  });\n}\n\nexport async function AddObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/add\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function UpdateObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/update\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function DelObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/delete\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/info\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\n/**\n * 获取角色权限资源\n * @param roleId\n * @returns {*}\n * @constructor\n */\nexport async function getPermissionIds(roleId: any) {\n  return await request({\n    url: apiPrefix + \"/getPermissionIds\",\n    method: \"post\",\n    params: { id: roleId },\n  });\n}\n\n/**\n * 授权\n * @param roleId\n * @param permissionIds\n * @returns {*}\n * @constructor\n */\nexport async function DoAuthz(roleId: any, permissionIds: any) {\n  return await request({\n    url: apiPrefix + \"/authz\",\n    method: \"post\",\n    data: { roleId, permissionIds },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/authority/role/crud.tsx",
    "content": "import * as api from \"./api\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { useI18n } from \"/src/locales\";\n\nexport default function ({ crudExpose, context: { authz } }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { t } = useI18n();\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    return await api.UpdateObj(form);\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    return await api.AddObj(form);\n  };\n  return {\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      rowHandle: {\n        width: 300,\n        buttons: {\n          authz: {\n            type: \"link\",\n            text: \"授权\",\n            async click(context) {\n              await authz.authzOpen(context.record.id);\n            },\n          },\n        },\n      },\n      columns: {\n        id: {\n          title: \"id\",\n          type: \"text\",\n          form: { show: false }, // 表单配置\n          column: {\n            width: 70,\n            sorter: true,\n          },\n        },\n        name: {\n          title: t(\"certd.roleName\"),\n          type: \"text\",\n          search: { show: true },\n          form: {\n            rules: [\n              { required: true, message: t(\"certd.enterRoleName\") },\n              { max: 50, message: t(\"certd.max50Chars\") },\n            ],\n          }, // 表单配置\n          column: {\n            sorter: true,\n          },\n        },\n        createTime: {\n          title: t(\"certd.createTime\"),\n          type: \"datetime\",\n          column: {\n            sorter: true,\n          },\n          form: {\n            show: false,\n          },\n        },\n        updateTime: {\n          title: t(\"certd.updateTime\"),\n          type: \"datetime\",\n          column: {\n            sorter: true,\n          },\n          form: { show: false }, // 表单配置\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/authority/role/index.vue",
    "content": "<template>\n  <fs-page>\n    <template #header>\n      <div class=\"title\">{{ t(\"certd.roleManagement\") }}</div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\" />\n    <a-modal v-model:open=\"authzDialogVisible\" width=\"860px\" :title=\"t('certd.assignPermissions')\" @ok=\"updatePermission\">\n      <fs-permission-tree ref=\"permissionTreeRef\" v-model:checked-keys=\"checkedKeys\" :tree=\"permissionTreeData\" :editable=\"false\" checkable :replace-fields=\"{ key: 'id', label: 'title' }\"> </fs-permission-tree>\n    </a-modal>\n  </fs-page>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onActivated, onMounted, ref } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport * as permissionApi from \"../permission/api\";\nimport * as api from \"./api\";\nimport { message } from \"ant-design-vue\";\nimport FsPermissionTree from \"../permission/fs-permission-tree.vue\";\nimport { UseCrudPermissionCompProps, UseCrudPermissionExtraProps } from \"/@/plugin/permission\";\nimport { useI18n } from \"/src/locales\";\n\nfunction useAuthz() {\n  const checkedKeys = ref();\n\n  const permissionTreeData = ref();\n\n  const permissionTreeRef = ref();\n  const authzDialogVisible = ref(false);\n\n  const currentRoleId = ref();\n\n  // 如果勾选节点中存在非叶子节点，tree组件会将其所有子节点全部勾选\n  // 所以要找出所有叶子节点，仅勾选叶子节点，tree组件会将父节点同步勾选\n  function getAllCheckedLeafNodeId(tree: any, checkedIds: any, temp: any) {\n    for (let i = 0; i < tree.length; i++) {\n      const item = tree[i];\n      if (item.children && item.children.length !== 0) {\n        getAllCheckedLeafNodeId(item.children, checkedIds, temp);\n      } else {\n        if (checkedIds.indexOf(item.id) !== -1) {\n          temp.push(item.id);\n        }\n      }\n    }\n    return temp;\n  }\n  function authzClose() {\n    authzDialogVisible.value = false;\n  }\n  async function authzOpen(roleId: any) {\n    permissionTreeData.value = await permissionApi.GetTree();\n    checkedKeys.value = [];\n    currentRoleId.value = roleId;\n    // this.treeData = ret.data\n    await updateChecked(roleId);\n    authzDialogVisible.value = true;\n  }\n  async function updateChecked(roleId: any) {\n    let checkedIds = await api.getPermissionIds(roleId);\n    // 找出所有的叶子节点\n    checkedIds = getAllCheckedLeafNodeId(permissionTreeData.value, checkedIds, []);\n    checkedKeys.value = checkedIds;\n  }\n  async function updatePermission() {\n    const roleId = currentRoleId.value;\n    const { checked, halfChecked } = permissionTreeRef.value.getChecked();\n    const allChecked = [...checked, ...halfChecked];\n    await api.DoAuthz(roleId, allChecked);\n    authzClose();\n    //await updateChecked(roleId);\n\n    message.success(\"授权成功\");\n  }\n\n  return {\n    authzOpen,\n    updatePermission,\n    authzDialogVisible,\n    permissionTreeData,\n    checkedKeys,\n    permissionTreeRef,\n  };\n}\n\nexport default defineComponent({\n  name: \"RoleManager\",\n  components: { FsPermissionTree },\n  setup() {\n    //授权配置\n    const { t } = useI18n();\n    const authz = useAuthz();\n    const permission: UseCrudPermissionCompProps = {\n      prefix: \"sys:auth:role\", //权限代码前缀\n      extra: ({ hasActionPermission }: UseCrudPermissionExtraProps): any => {\n        //额外按钮权限控制\n        return { rowHandle: { buttons: { authz: { show: hasActionPermission(\"authz\") } } } };\n      },\n    };\n\n    // 初始化crud配置\n    // 此处传入permission进行通用按钮权限设置，会通过commonOptions去设置actionbar和rowHandle的按钮的show属性\n    // 更多关于按钮权限的源代码设置，请参考 ./src/plugin/fast-crud/index.js （75-77行）\n\n    const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: { authz, permission } });\n\n    // 页面打开后获取列表数据\n    onMounted(() => {\n      crudExpose.doRefresh();\n    });\n\n    onActivated(async () => {\n      await crudExpose.doRefresh();\n    });\n    return {\n      crudBinding,\n      crudRef,\n      ...authz,\n      t,\n    };\n  },\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/authority/user/api.ts",
    "content": "import { request } from \"/src/api/service\";\nconst apiPrefix = \"/sys/authority/user\";\nexport async function GetList(query: any) {\n  return await request({\n    url: apiPrefix + \"/page\",\n    method: \"post\",\n    data: query,\n  });\n}\n\nexport async function AddObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/add\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function UpdateObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/update\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function DelObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/delete\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/info\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function Unlock(id: any) {\n  return await request({\n    url: apiPrefix + \"/unlockBlock\",\n    method: \"post\",\n    data: { id },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/authority/user/crud.tsx",
    "content": "import * as api from \"./api\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { useUserStore } from \"/@/store/user\";\nimport { Modal, notification } from \"ant-design-vue\";\nimport dayjs from \"dayjs\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { useI18n } from \"/src/locales\";\nimport { computed } from \"vue\";\n\nexport default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { t } = useI18n();\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    return await api.UpdateObj(form);\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    return await api.AddObj(form);\n  };\n\n  const userStore = useUserStore();\n\n  const settingStore = useSettingStore();\n  const userValidTimeEnabled = computed(() => {\n    return settingStore.sysPublic.userValidTimeEnabled === true;\n  });\n  return {\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      rowHandle: {\n        fixed: \"right\",\n        buttons: {\n          unlock: {\n            title: t(\"certd.unlockLogin\"),\n            text: null,\n            type: \"link\",\n            icon: \"ion:lock-open-outline\",\n            click: async ({ row }) => {\n              Modal.confirm({\n                title: t(\"certd.notice\"),\n                content: t(\"certd.confirmUnlock\"),\n                onOk: async () => {\n                  await api.Unlock(row.id);\n                  notification.success({\n                    message: t(\"certd.unlockSuccess\"),\n                  });\n                },\n              });\n            },\n          },\n        },\n      },\n      table: {\n        scroll: {\n          //使用固定列时需要设置此值，并且大于等于列宽度之和的值\n          x: 1400,\n        },\n      },\n      columns: {\n        id: {\n          title: \"id\",\n          type: \"text\",\n          form: { show: false }, // 表单配置\n          column: {\n            width: 100,\n            sorter: true,\n          },\n        },\n        createTime: {\n          title: t(\"certd.createTime\"),\n          type: \"datetime\",\n          form: { show: false }, // 表单配置\n          column: {\n            width: 180,\n            sorter: true,\n          },\n        },\n        // updateTime: {\n        //   title: \"修改时间\",\n        //   type: \"datetime\",\n        //   form: { show: false }, // 表单配置\n        //   column: {\n        //     sortable: \"update_time\",\n        //     width: 180\n        //   }\n        // },\n        username: {\n          title: t(\"certd.username\"),\n          type: \"text\",\n          search: { show: true }, // 开启查询\n          form: {\n            rules: [\n              { required: true, message: t(\"certd.enterUsername\") },\n              { max: 50, message: t(\"certd.max50Chars\") },\n            ],\n          },\n          editForm: { component: { disabled: false } },\n          column: {\n            sorter: true,\n            width: 200,\n          },\n        },\n        password: {\n          title: t(\"certd.password\"),\n          type: \"text\",\n          key: \"password\",\n          column: {\n            show: false,\n          },\n          form: {\n            rules: [{ max: 50, message: t(\"certd.max50Chars\") }],\n            component: {\n              showPassword: true,\n            },\n            helper: t(\"certd.modifyPasswordIfFilled\"),\n          },\n        },\n        nickName: {\n          title: t(\"certd.nickName\"),\n          type: \"text\",\n          search: { show: true }, // 开启查询\n          form: {\n            rules: [{ max: 50, message: t(\"certd.max50Chars\") }],\n          },\n          column: {\n            sorter: true,\n          },\n        },\n        email: {\n          title: t(\"certd.emaila\"),\n          type: \"text\",\n          search: { show: true }, // 开启查询\n          form: {\n            rules: [{ max: 50, message: t(\"certd.max50Chars\") }],\n          },\n          column: {\n            sorter: true,\n            width: 160,\n          },\n        },\n        mobile: {\n          title: t(\"certd.mobile\"),\n          type: \"text\",\n          search: { show: true }, // 开启查询\n          form: {\n            rules: [{ max: 50, message: t(\"certd.max50Chars\") }],\n          },\n          column: {\n            sorter: true,\n            width: 130,\n          },\n        },\n        avatar: {\n          title: t(\"certd.avatar\"),\n          type: \"cropper-uploader\",\n          column: {\n            width: 70,\n            component: {\n              style: {\n                height: \"30px\",\n                width: \"auto\",\n              },\n              buildUrl(key: string) {\n                return `api/basic/file/download?&key=` + key;\n              },\n            },\n          },\n          form: {\n            component: {\n              vModel: \"modelValue\",\n              valueType: \"key\",\n              cropper: {\n                aspectRatio: 1,\n                autoCropArea: 1,\n                viewMode: 0,\n              },\n              onReady: null,\n              uploader: {\n                type: \"form\",\n                action: \"/basic/file/upload\",\n                name: \"file\",\n                headers: {\n                  Authorization: \"Bearer \" + userStore.getToken,\n                },\n                successHandle(res: any) {\n                  return res;\n                },\n              },\n              buildUrl(key: string) {\n                return `api/basic/file/download?&key=` + key;\n              },\n            },\n          },\n        },\n        status: {\n          title: t(\"certd.status\"),\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { label: t(\"common.enabled\"), value: 1, color: \"green\" },\n              { label: t(\"common.disabled\"), value: 0, color: \"red\" },\n            ],\n          }),\n          column: {\n            align: \"center\",\n            sorter: true,\n            width: 100,\n          },\n        },\n        validTime: {\n          title: t(\"certd.validTime\"),\n          type: \"date\",\n          form: {\n            show: userValidTimeEnabled,\n          },\n          column: {\n            align: \"center\",\n            sorter: true,\n            width: 160,\n            show: userValidTimeEnabled,\n            cellRender({ value }) {\n              if (value == null || value === 0) {\n                return \"\";\n              }\n              if (value < dayjs().valueOf()) {\n                return <a-tag color={\"red\"}>{t(\"certd.expired\")}</a-tag>;\n              }\n              const date = dayjs(value).format(\"YYYY-MM-DD\");\n              return (\n                <a-tag color={\"green\"} title={date}>\n                  <fs-time-humanize modelValue={value} options={{ largest: 1, units: [\"y\", \"d\", \"h\"] }} useFormatGreater={30000000000} />\n                </a-tag>\n              );\n            },\n          },\n          valueBuilder({ value, row, key }) {\n            if (value != null) {\n              row[key] = dayjs(value);\n            }\n          },\n          valueResolve({ value, row, key }) {\n            if (value != null) {\n              row[key] = value.valueOf();\n            }\n          },\n        },\n        remark: {\n          title: t(\"certd.remark\"),\n          type: \"text\",\n          column: {\n            sorter: true,\n          },\n          form: {\n            rules: [{ max: 100, message: t(\"certd.max100Chars\") }],\n          },\n        },\n        roles: {\n          title: t(\"certd.roles\"),\n          type: \"dict-select\",\n          dict: dict({\n            url: \"/sys/authority/role/list\",\n            value: \"id\",\n            label: \"name\",\n          }), // 数据字典\n          form: {\n            component: { mode: \"multiple\" },\n          },\n          column: {\n            width: 250,\n            sortable: true,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/authority/user/index.vue",
    "content": "<template>\n  <fs-page class=\"page-sys-user\">\n    <template #header>\n      <div class=\"title\">用户管理</div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\" />\n  </fs-page>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, onMounted, onActivated } from \"vue\";\nimport { useCrud, useExpose, useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nexport default defineComponent({\n  name: \"UserManager\",\n  setup() {\n    // 初始化crud配置\n    // 此处传入权限前缀进行通用按钮权限设置，会通过commonOptions去设置actionbar和rowHandle的按钮的show属性\n    // 更多关于按钮权限的源代码设置，请参考 ./src/plugin/fast-crud/index.js （75-77行）\n    const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: { permission: \"sys:auth:user\" } });\n\n    // 页面打开后获取列表数据\n    onMounted(() => {\n      crudExpose.doRefresh();\n    });\n    onActivated(async () => {\n      await crudExpose.doRefresh();\n    });\n\n    return {\n      crudBinding,\n      crudRef,\n    };\n  },\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/cname/provider/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/sys/cname/provider\";\n\nexport async function GetList(query: any) {\n  return await request({\n    url: apiPrefix + \"/page\",\n    method: \"post\",\n    data: query,\n  });\n}\n\nexport async function AddObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/add\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function UpdateObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/update\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function DelObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/delete\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/info\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetDetail(id: any) {\n  return await request({\n    url: apiPrefix + \"/detail\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function DeleteBatch(ids: any[]) {\n  return await request({\n    url: apiPrefix + \"/deleteByIds\",\n    method: \"post\",\n    data: { ids },\n  });\n}\n\nexport async function SetDefault(id: any) {\n  return await request({\n    url: apiPrefix + \"/setDefault\",\n    method: \"post\",\n    data: { id },\n  });\n}\n\nexport async function SetDisabled(id: any, disabled: boolean) {\n  return await request({\n    url: apiPrefix + \"/setDisabled\",\n    method: \"post\",\n    data: { id, disabled },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/cname/provider/crud.tsx",
    "content": "import * as api from \"./api\";\nimport { useI18n } from \"/src/locales\";\nimport { computed, Ref, ref } from \"vue\";\nimport { useRouter } from \"vue-router\";\nimport { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes, utils } from \"@fast-crud/fast-crud\";\nimport { useUserStore } from \"/@/store/user\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { Modal } from \"ant-design-vue\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const router = useRouter();\n  const { t } = useI18n();\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  const userStore = useUserStore();\n  const settingStore = useSettingStore();\n  const selectedRowKeys: Ref<any[]> = ref([]);\n  context.selectedRowKeys = selectedRowKeys;\n\n  return {\n    crudOptions: {\n      settings: {\n        plugins: {\n          //这里使用行选择插件，生成行选择crudOptions配置，最终会与crudOptions合并\n          rowSelection: {\n            enabled: true,\n            order: -2,\n            before: true,\n            // handle: (pluginProps,useCrudProps)=>CrudOptions,\n            props: {\n              multiple: true,\n              crossPage: true,\n              selectedRowKeys,\n            },\n          },\n        },\n      },\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      rowHandle: {\n        minWidth: 200,\n        fixed: \"right\",\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          column: {\n            width: 100,\n          },\n          form: {\n            show: false,\n          },\n        },\n        domain: {\n          title: t(\"certd.cnameDomain\"),\n          type: \"text\",\n          editForm: {\n            component: {\n              disabled: true,\n            },\n          },\n          search: {\n            show: true,\n          },\n          form: {\n            component: {\n              placeholder: t(\"certd.cnameDomainPlaceholder\"),\n            },\n            helper: t(\"certd.cnameDomainHelper\"),\n            rules: [{ required: true, message: t(\"certd.requiredField\") }],\n          },\n          column: {\n            width: 200,\n          },\n        },\n        dnsProviderType: {\n          title: t(\"certd.dnsProvider\"),\n          type: \"dict-select\",\n          search: {\n            show: true,\n          },\n          dict: dict({\n            url: \"pi/dnsProvider/list\",\n            value: \"key\",\n            label: \"title\",\n          }),\n          form: {\n            rules: [{ required: true, message: t(\"certd.requiredField\") }],\n          },\n          column: {\n            width: 150,\n            component: {\n              color: \"auto\",\n            },\n          },\n        },\n        accessId: {\n          title: t(\"certd.dnsProviderAuthorization\"),\n          type: \"dict-select\",\n          dict: dict({\n            url: \"/pi/access/list\",\n            value: \"id\",\n            label: \"name\",\n          }),\n          form: {\n            component: {\n              name: \"access-selector\",\n              vModel: \"modelValue\",\n              type: compute(({ form }) => {\n                return form.dnsProviderType;\n              }),\n            },\n            rules: [{ required: true, message: t(\"certd.requiredField\") }],\n          },\n          column: {\n            width: 150,\n            component: {\n              color: \"auto\",\n            },\n          },\n        },\n        isDefault: {\n          title: t(\"certd.isDefault\"),\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { label: t(\"certd.yes\"), value: true, color: \"success\" },\n              { label: t(\"certd.no\"), value: false, color: \"default\" },\n            ],\n          }),\n          form: {\n            value: false,\n            rules: [{ required: true, message: t(\"certd.selectIsDefault\") }],\n          },\n          column: {\n            align: \"center\",\n            width: 100,\n          },\n        },\n        setDefault: {\n          title: t(\"certd.setDefault\"),\n          type: \"text\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            align: \"center\",\n            conditionalRenderDisabled: true,\n            cellRender: ({ row }) => {\n              if (row.isDefault) {\n                return;\n              }\n              const onClick = async () => {\n                Modal.confirm({\n                  title: t(\"certd.prompt\"),\n                  content: t(\"certd.confirmSetDefault\"),\n                  onOk: async () => {\n                    await api.SetDefault(row.id);\n                    await crudExpose.doRefresh();\n                  },\n                });\n              };\n\n              return (\n                <a-button type={\"link\"} size={\"small\"} onClick={onClick}>\n                  {t(\"certd.setAsDefault\")}\n                </a-button>\n              );\n            },\n          },\n        },\n        disabled: {\n          title: t(\"certd.disabled\"),\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { label: t(\"certd.enabled\"), value: false, color: \"success\" },\n              { label: t(\"certd.disabledLabel\"), value: true, color: \"error\" },\n            ],\n          }),\n          form: {\n            value: false,\n          },\n          column: {\n            width: 100,\n            component: {\n              title: t(\"certd.clickToToggle\"),\n              on: {\n                async click({ value, row }) {\n                  Modal.confirm({\n                    title: t(\"certd.prompt\"),\n                    content: t(\"certd.confirmToggleStatus\", { action: !value ? t(\"certd.disable\") : t(\"certd.enable\") }),\n                    onOk: async () => {\n                      await api.SetDisabled(row.id, !value);\n                      await crudExpose.doRefresh();\n                    },\n                  });\n                },\n              },\n            },\n          },\n        },\n        createTime: {\n          title: t(\"certd.createTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 160,\n            align: \"center\",\n          },\n        },\n        updateTime: {\n          title: t(\"certd.updateTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            show: true,\n            width: 160,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/cname/provider/index.vue",
    "content": "<template>\n  <fs-page class=\"page-cert\">\n    <template #header>\n      <div class=\"title\">\n        {{ t(\"certd.cnameTitle\") }}\n        <span class=\"sub\">\n          {{ t(\"certd.cnameDescription\") }}\n          <a href=\"https://certd.docmirror.cn/guide/feature/cname/\" target=\"_blank\">\n            {{ t(\"certd.cnameLinkText\") }}\n          </a>\n        </span>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\">\n      <template #pagination-left>\n        <a-tooltip :title=\"t('certd.batchDelete')\">\n          <fs-button icon=\"DeleteOutlined\" @click=\"handleBatchDelete\"></fs-button>\n        </a-tooltip>\n      </template>\n    </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { message, Modal } from \"ant-design-vue\";\nimport { DeleteBatch } from \"./api\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\ndefineOptions({\n  name: \"CnameProvider\",\n});\nconst { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions });\n\nconst selectedRowKeys = context.selectedRowKeys;\nconst handleBatchDelete = () => {\n  if (selectedRowKeys.value?.length > 0) {\n    Modal.confirm({\n      title: t(\"certd.confirmTitle\"),\n      content: t(\"certd.confirmDeleteBatch\", { count: selectedRowKeys.value.length }),\n      async onOk() {\n        await DeleteBatch(selectedRowKeys.value);\n        message.info(t(\"certd.deleteSuccess\"));\n        crudExpose.doRefresh();\n        selectedRowKeys.value = [];\n      },\n    });\n  } else {\n    message.error(t(\"certd.selectRecordsFirst\"));\n  }\n};\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(async () => {\n  await crudExpose.doRefresh();\n});\n</script>\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/console/api.ts",
    "content": "import { request } from \"/@/api/service\";\n\nexport async function GetStatisticCount() {\n  return await request({\n    url: \"/sys/statistic/count\",\n    method: \"POST\",\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/console/index.vue",
    "content": "<template>\n  <fs-page class=\"page-sys-console\">\n    <template #header>\n      <div class=\"title\">控制台</div>\n    </template>\n    <div>\n      <div class=\"statistic-data m-20\">\n        <a-row :gutter=\"20\">\n          <a-col :span=\"6\">\n            <statistic-card title=\"用户总数\" :count=\"count.userCount\">\n              <template #footer>\n                <router-link to=\"/sys/authority/user\" class=\"flex\">\n                  <fs-icon icon=\"ion:settings-outline\" class=\"mr-5 fs-16\" />\n                  管理用户\n                </router-link>\n              </template>\n            </statistic-card>\n          </a-col>\n          <a-col :span=\"6\">\n            <statistic-card title=\"用户增长趋势\">\n              <day-count v-if=\"count.userRegisterCountPerDay\" :data=\"count.userRegisterCountPerDay\" title=\"新增用户\"></day-count>\n            </statistic-card>\n          </a-col>\n          <a-col :span=\"6\">\n            <statistic-card title=\"全站流水线总数\" :count=\"count.pipelineCount\">\n              <template #footer>\n                <router-link to=\"/certd/pipeline\" class=\"flex\">\n                  <fs-icon icon=\"ion:settings-outline\" class=\"mr-5 fs-16\" />\n                  管理流水线\n                </router-link>\n              </template>\n            </statistic-card>\n          </a-col>\n          <a-col :span=\"6\">\n            <statistic-card title=\"流水线增长趋势\">\n              <day-count v-if=\"count.pipelineCreateCountPerDay\" :data=\"count.pipelineCreateCountPerDay\" title=\"新增流水线\"></day-count>\n            </statistic-card>\n          </a-col>\n          <a-col :span=\"6\">\n            <statistic-card title=\"最近运行统计\" :footer=\"false\">\n              <day-count v-if=\"count.historyCountPerDay\" :data=\"count.historyCountPerDay\" title=\"运行次数\"></day-count>\n            </statistic-card>\n          </a-col>\n        </a-row>\n      </div>\n    </div>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onMounted, ref, Ref } from \"vue\";\nimport { FsIcon } from \"@fast-crud/fast-crud\";\nimport StatisticCard from \"/@/views/framework/home/dashboard/statistic-card.vue\";\nimport DayCount from \"/@/views/framework/home/dashboard/charts/day-count.vue\";\nimport { GetStatisticCount } from \"./api\";\n\nconst count: Ref = ref({});\n\nfunction transformCountPerDayToChartData(key: string) {\n  count.value[key] = count.value[key].map((item: any) => {\n    return {\n      name: item.date,\n      value: item.count,\n    };\n  });\n}\n\nasync function loadCount() {\n  count.value = await GetStatisticCount();\n  transformCountPerDayToChartData(\"userRegisterCountPerDay\");\n  transformCountPerDayToChartData(\"pipelineCreateCountPerDay\");\n  transformCountPerDayToChartData(\"historyCountPerDay\");\n}\n\nonMounted(async () => {\n  await loadCount();\n});\n</script>\n<style lang=\"less\">\n.page-sys-console {\n  .fs-page-content {\n    background-color: #eee;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/plugin/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/sys/plugin\";\n\nexport async function GetList(query: any) {\n  return await request({\n    url: apiPrefix + \"/page\",\n    method: \"post\",\n    data: query,\n  });\n}\n\nexport async function AddObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/add\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function UpdateObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/update\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function DelObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/delete\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/info\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetDetail(id: any) {\n  return await request({\n    url: apiPrefix + \"/detail\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function DeleteBatch(ids: any[]) {\n  return await request({\n    url: apiPrefix + \"/deleteByIds\",\n    method: \"post\",\n    data: { ids },\n  });\n}\n\nexport async function SetDisabled(data: { id?: number; name?: string; type?: string; disabled: boolean }) {\n  return await request({\n    url: apiPrefix + \"/setDisabled\",\n    method: \"post\",\n    data: data,\n  });\n}\n\nexport async function ExportPlugin(id: number) {\n  return await request({\n    url: apiPrefix + \"/export\",\n    method: \"post\",\n    data: { id },\n  });\n}\n\nexport async function ImportPlugin(body: any) {\n  return await request({\n    url: apiPrefix + \"/import\",\n    method: \"post\",\n    data: body,\n  });\n}\n\nexport type PluginConfigBean = {\n  name: string;\n  disabled: boolean;\n  sysSetting: {\n    input?: Record<string, any>;\n  };\n};\n\nexport type CertApplyPluginSysInput = {\n  googleCommonEabAccessId?: number;\n  zerosslCommonEabAccessId?: number;\n};\nexport type PluginSysSetting<T> = {\n  sysSetting: {\n    input?: T;\n  };\n};\nexport type CommPluginConfig = {\n  CertApply?: PluginSysSetting<CertApplyPluginSysInput>;\n};\n\nexport async function GetCommPluginConfigs(): Promise<CommPluginConfig> {\n  return await request({\n    url: apiPrefix + \"/getCommPluginConfigs\",\n    method: \"post\",\n  });\n}\n\nexport async function SaveCommPluginConfigs(data: CommPluginConfig): Promise<void> {\n  return await request({\n    url: apiPrefix + \"/saveCommPluginConfigs\",\n    method: \"post\",\n    data,\n  });\n}\n\nexport async function DoTest(req: { id: number; input: any }): Promise<void> {\n  return await request({\n    url: apiPrefix + \"/doTest\",\n    method: \"post\",\n    data: req,\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/plugin/components/plugin-input.vue",
    "content": "<template>\n  <div class=\"plugin-inputs\">\n    <div class=\"actions mb-1\">\n      <a-button type=\"primary\" @click=\"addNewField\"> 添加 </a-button>\n    </div>\n\n    <div class=\"inputs\">\n      <div class=\"inputs-inner\">\n        <a-collapse v-model:active-key=\"activeKey\">\n          <a-collapse-panel v-for=\"(item, index) of inputs\" :key=\"index\">\n            <template #header> {{ item.key }} ： {{ item.title }} </template>\n            <a-form :label-col=\"{ style: { width: '80px' } }\">\n              <a-form-item label=\"字段名称\">\n                <a-input v-model:value=\"item.key\" />\n              </a-form-item>\n              <a-form-item label=\"字段标题\">\n                <a-input v-model:value=\"item.title\" />\n              </a-form-item>\n              <a-form-item label=\"字段说明\">\n                <a-input v-model:value=\"item.helper\" />\n              </a-form-item>\n              <a-form-item label=\"默认值\">\n                <a-input v-model:value=\"item.value\" />\n              </a-form-item>\n              <a-form-item label=\"必填\">\n                <a-switch v-model:checked=\"item.required\" />\n              </a-form-item>\n              <a-form-item label=\"组件名称\">\n                <a-input v-model:value=\"item.component.name\" />\n              </a-form-item>\n              <a-form-item label=\"组件vModel\">\n                <a-input v-model:value=\"item.component.vModel\" />\n              </a-form-item>\n            </a-form>\n          </a-collapse-panel>\n        </a-collapse>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, Ref, inject, toRef } from \"vue\";\nimport { useFormWrapper } from \"@fast-crud/fast-crud\";\nimport yaml from \"js-yaml\";\nconst activeKey = ref([]);\n\nconst getPlugin: any = inject(\"get:plugin\");\nconst pluginRef = getPlugin();\nconst inputs = toRef(pluginRef.value.metadata, \"input\");\nif (!inputs.value) {\n  inputs.value = {};\n}\nfunction addNewField() {\n  inputs.value.push({\n    key: \"newKey\",\n    title: \"字段名\",\n  });\n  // const { openCrudFormDialog } = useFormWrapper();\n  //\n  // openCrudFormDialog({\n  //   crudOptions: {\n  //     form: {\n  //       labelCol: { style: { width: \"80px\" } },\n  //       wrapperCol: { span: 18 },\n  //       wrapper: {\n  //         title: \"添加输入\",\n  //       },\n  //       doSubmit({ form }: any) {\n  //         const key = form.key;\n  //         const title = form.title;\n  //         inputs.value[key] = {\n  //           key,\n  //           title,\n  //           component: {\n  //             name: \"a-input\",\n  //             vModel: \"value\",\n  //           },\n  //           helper: \"\",\n  //           value: undefined,\n  //           required: false,\n  //         };\n  //       },\n  //     },\n  //     columns: {\n  //       key: {\n  //         title: \"字段名称\",\n  //         type: \"text\",\n  //         form: {\n  //           helper: \"英文字段名称\",\n  //         },\n  //       },\n  //       title: {\n  //         title: \"字段标题\",\n  //         type: \"text\",\n  //         form: {\n  //           helper: \"字段标题\",\n  //         },\n  //       },\n  //     },\n  //   },\n  // });\n}\n\n// function onComponentChange(item: any, value: any) {\n//   if (!item) {\n//     item.component = {};\n//     return;\n//   }\n//   item.component = yaml.load(value);\n// }\n</script>\n\n<style lang=\"less\">\n.plugin-inputs {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  .actions {\n  }\n  .inputs {\n    flex: 1;\n    height: 100%;\n    overflow: hidden;\n    .inputs-inner {\n      height: 100%;\n      overflow-y: auto;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/plugin/config.vue",
    "content": "<template>\n  <fs-page class=\"page-plugin-config\">\n    <template #header>\n      <div class=\"title\">证书插件配置</div>\n    </template>\n\n    <div class=\"sys-plugin-config settings-form\">\n      <a-form :model=\"formState\" :label-col=\"{ span: 8 }\" :wrapper-col=\"{ span: 16 }\" autocomplete=\"off\" @finish=\"onFinish\" @finish-failed=\"onFinishFailed\">\n        <a-form-item label=\"公共Google EAB授权\" :name=\"['CertApply', 'sysSetting', 'input', 'googleCommonEabAccessId']\">\n          <access-selector v-model:model-value=\"formState.CertApply.sysSetting.input.googleCommonEabAccessId\" type=\"eab\" from=\"sys\"></access-selector>\n          <div class=\"helper\">\n            <div>设置公共Google EAB授权给用户使用，避免用户自己去翻墙获取Google EAB授权</div>\n            <div>\n              <a href=\"https://certd.docmirror.cn/guide/use/google/\">获取Google EAB授权方法 </a>\n            </div>\n          </div>\n        </a-form-item>\n\n        <a-form-item label=\"公共ZeroSSL EAB授权\" :name=\"['CertApply', 'sysSetting', 'input', 'zerosslCommonEabAccessId']\">\n          <access-selector v-model:model-value=\"formState.CertApply.sysSetting.input.zerosslCommonEabAccessId\" type=\"eab\" from=\"sys\"></access-selector>\n          <div class=\"helper\">\n            <div>设置公共ZeroSSL EAB授权给用户使用，避免用户自己去翻墙获取Zero EAB授权</div>\n            <div>\n              <a href=\"https://app.zerossl.com/developer\">zerossl开发者中心获取EAB </a>\n            </div>\n          </div>\n        </a-form-item>\n\n        <a-form-item :wrapper-col=\"{ offset: 8, span: 16 }\">\n          <a-button :loading=\"saveLoading\" type=\"primary\" html-type=\"submit\">保存</a-button>\n        </a-form-item>\n      </a-form>\n    </div>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport AccessSelector from \"/@/views/certd/access/access-selector/index.vue\";\nimport { reactive, ref } from \"vue\";\nimport { CommPluginConfig, GetCommPluginConfigs, SaveCommPluginConfigs } from \"/@/views/sys/plugin/api\";\nimport { merge } from \"lodash-es\";\nimport { notification } from \"ant-design-vue\";\n\ndefineOptions({\n  name: \"SysPluginConfig\",\n});\nconst formState = reactive<Partial<CommPluginConfig>>({\n  CertApply: {\n    sysSetting: {\n      input: {\n        googleCommonEabAccessId: null,\n      },\n    },\n  },\n});\n\nasync function loadForm() {\n  const res = await GetCommPluginConfigs();\n  merge(formState, res);\n}\n\nloadForm();\n\nconst saveLoading = ref(false);\nconst onFinish = async (form: any) => {\n  try {\n    saveLoading.value = true;\n    await SaveCommPluginConfigs(form);\n    notification.success({\n      message: \"保存成功\",\n    });\n  } finally {\n    saveLoading.value = false;\n  }\n};\n\nconst onFinishFailed = (errorInfo: any) => {\n  console.log(\"Failed:\", errorInfo);\n};\n</script>\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/plugin/crud.tsx",
    "content": "import * as api from \"./api\";\nimport { useI18n } from \"/src/locales\";\nimport { Ref, ref } from \"vue\";\nimport { useRouter } from \"vue-router\";\nimport { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, useFormWrapper, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { Modal, notification } from \"ant-design-vue\";\n//@ts-ignore\nimport yaml from \"js-yaml\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const router = useRouter();\n  const { t } = useI18n();\n\n  let lastType = \"\";\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    if (lastType && lastType != query?.query?.type) {\n      query.page.offset = 0;\n    }\n    lastType = query?.query?.type;\n    return await api.GetList(query);\n  };\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  const selectedRowKeys: Ref<any[]> = ref([]);\n  context.selectedRowKeys = selectedRowKeys;\n  const { openCrudFormDialog } = useFormWrapper();\n\n  async function openImportDialog() {\n    function createCrudOptions() {\n      return {\n        crudOptions: {\n          columns: {\n            content: {\n              title: t(\"certd.pluginFile\"),\n              type: \"text\",\n              form: {\n                component: {\n                  name: \"pem-input\",\n                  vModel: \"modelValue\",\n                  textarea: {\n                    rows: 8,\n                  },\n                },\n                col: {\n                  span: 24,\n                },\n                helper: t(\"certd.selectPluginFile\"),\n              },\n            },\n            override: {\n              title: t(\"certd.overrideSameName\"),\n              type: \"dict-switch\",\n              dict: dict({\n                data: [\n                  {\n                    value: true,\n                    label: t(\"certd.override\"),\n                  },\n                  {\n                    value: false,\n                    label: t(\"certd.noOverride\"),\n                  },\n                ],\n              }),\n              form: {\n                value: false,\n                col: {\n                  span: 24,\n                },\n                helper: t(\"certd.overrideHelper\"),\n              },\n            },\n          },\n          form: {\n            wrapper: {\n              title: t(\"certd.importPlugin\"),\n              saveRemind: false,\n            },\n            afterSubmit() {\n              notification.success({ message: t(\"certd.operationSuccess\") });\n              crudExpose.doRefresh();\n            },\n            async doSubmit({ form }: any) {\n              return await api.ImportPlugin({\n                ...form,\n              });\n            },\n          },\n        },\n      };\n    }\n    const { crudOptions } = createCrudOptions();\n    await openCrudFormDialog({ crudOptions });\n  }\n  return {\n    crudOptions: {\n      settings: {\n        plugins: {\n          rowSelection: {\n            enabled: true,\n            order: -2,\n            before: true,\n            props: {\n              multiple: true,\n              crossPage: true,\n              selectedRowKeys,\n            },\n          },\n        },\n      },\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      actionbar: {\n        buttons: {\n          add: {\n            show: true,\n            icon: \"ion:ios-add-circle-outline\",\n            text: t(\"certd.customPlugin\"),\n          },\n          import: {\n            show: true,\n            icon: \"ion:cloud-upload-outline\",\n            text: t(\"certd.import\"),\n            type: \"primary\",\n            async click() {\n              await openImportDialog();\n            },\n          },\n        },\n      },\n      rowHandle: {\n        show: true,\n        minWidth: 200,\n        fixed: \"right\",\n        buttons: {\n          edit: {\n            show: compute(({ row }) => {\n              return row.type === \"custom\";\n            }),\n          },\n          copy: {\n            show: compute(({ row }) => {\n              return row.type === \"custom\";\n            }),\n          },\n          remove: {\n            order: 999,\n            show: compute(({ row }) => {\n              return row.type === \"custom\";\n            }),\n          },\n          export: {\n            text: null,\n            icon: \"ion:cloud-download-outline\",\n            title: t(\"certd.export\"),\n            type: \"link\",\n            show: compute(({ row }) => {\n              return row.type === \"custom\";\n            }),\n            async click({ row }) {\n              const content = await api.ExportPlugin(row.id);\n              if (content) {\n                const blob = new Blob([content], { type: \"text/plain;charset=utf-8\" });\n                const url = URL.createObjectURL(blob);\n                const link = document.createElement(\"a\");\n                link.href = url;\n                link.download = `${row.name}.yaml`;\n                link.click();\n                URL.revokeObjectURL(url);\n              }\n            },\n          },\n        },\n      },\n      table: {\n        rowKey: \"name\",\n      },\n      tabs: {\n        name: \"type\",\n        show: true,\n        defaultOption: {\n          show: false,\n        },\n      },\n      form: {\n        onSuccess(opts: any) {\n          if (opts.res?.id) {\n            router.push({\n              name: \"SysPluginEdit\",\n              query: {\n                id: opts.res.id,\n              },\n            });\n          }\n        },\n      },\n      columns: {\n        pluginType: {\n          title: t(\"certd.pluginType\"),\n          type: \"dict-select\",\n          search: {\n            show: true,\n          },\n          form: {\n            order: 0,\n            rules: [{ required: true }],\n            component: {\n              disabled: true,\n            },\n          },\n          addForm: {\n            component: {\n              disabled: false,\n            },\n          },\n          dict: dict({\n            data: [\n              { label: t(\"certd.auth\"), value: \"access\" },\n              { label: t(\"certd.dns\"), value: \"dnsProvider\" },\n              { label: t(\"certd.deployPlugin\"), value: \"deploy\" },\n            ],\n          }),\n          column: {\n            width: 100,\n            align: \"center\",\n            component: {\n              color: \"auto\",\n            },\n          },\n        },\n        icon: {\n          title: t(\"certd.icon\"),\n          type: \"icon\",\n          form: {\n            rules: [{ required: true }],\n          },\n          column: {\n            width: 70,\n            align: \"center\",\n            component: {\n              name: \"fs-icon\",\n              vModel: \"icon\",\n              style: {\n                fontSize: \"22px\",\n              },\n            },\n          },\n        },\n        name: {\n          title: t(\"certd.pluginName\"),\n          type: \"text\",\n          search: {\n            show: true,\n          },\n          form: {\n            show: true,\n            helper: t(\"certd.pluginNameHelper\"),\n            rules: [\n              { required: true },\n              {\n                type: \"regexp\",\n                pattern: /^[a-zA-Z][a-zA-Z0-9]+$/,\n                message: t(\"certd.pluginNameRuleMsg\"),\n              },\n            ],\n          },\n          column: {\n            width: 250,\n            cellRender({ row }) {\n              if (row.author) {\n                return <fs-copyable model-value={`${row.author}/${row.name}`} />;\n              } else {\n                return <fs-copyable model-value={row.name} />;\n              }\n            },\n          },\n        },\n        author: {\n          title: t(\"certd.author\"),\n          type: \"text\",\n          search: {\n            show: true,\n          },\n          form: {\n            show: true,\n            helper: t(\"certd.authorHelper\"),\n            rules: [\n              { required: true },\n              {\n                type: \"regexp\",\n                pattern: /^[a-zA-Z][a-zA-Z0-9]+$/,\n                message: t(\"certd.authorRuleMsg\"),\n              },\n            ],\n          },\n          column: {\n            width: 200,\n            show: false,\n          },\n        },\n        title: {\n          title: t(\"certd.titlea\"),\n          type: \"text\",\n          form: {\n            helper: t(\"certd.titleHelper\"),\n            rules: [{ required: true }],\n          },\n          column: {\n            width: 300,\n            cellRender({ row }) {\n              if (row.type === \"custom\") {\n                return <router-link to={`/sys/plugin/edit?id=${row.id}`}>{row.title}</router-link>;\n              }\n              return <div>{row.title}</div>;\n            },\n          },\n        },\n        desc: {\n          title: t(\"certd.description\"),\n          type: \"textarea\",\n          helper: t(\"certd.descriptionHelper\"),\n          column: {\n            width: 300,\n            show: false,\n          },\n        },\n        type: {\n          title: t(\"certd.sourcee\"),\n          type: \"dict-select\",\n          search: {\n            show: true,\n          },\n          form: {\n            value: \"custom\",\n            component: {\n              disabled: true,\n            },\n          },\n          dict: dict({\n            data: [\n              { label: t(\"certd.builtIn\"), value: \"builtIn\" },\n              { label: t(\"certd.custom\"), value: \"custom\" },\n              { label: t(\"certd.store\"), value: \"store\" },\n            ],\n          }),\n          column: {\n            width: 70,\n            align: \"center\",\n            component: {\n              color: \"auto\",\n            },\n          },\n        },\n        version: {\n          title: t(\"certd.version\"),\n          type: \"text\",\n          column: {\n            width: 100,\n            align: \"center\",\n          },\n        },\n        \"extra.dependPlugins\": {\n          title: t(\"certd.pluginDependencies\"),\n          type: \"text\",\n          form: {\n            component: {\n              name: \"a-select\",\n              mode: \"tags\",\n              open: false,\n              allowClear: true,\n            },\n            helper: t(\"certd.pluginDependenciesHelper\"),\n          },\n          column: {\n            show: false,\n          },\n        },\n        \"extra.showRunStrategy\": {\n          title: t(\"certd.editableRunStrategy\"),\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { value: true, label: t(\"certd.editable\") },\n              { value: false, label: t(\"certd.notEditable\") },\n            ],\n          }),\n          form: {\n            value: false,\n            rules: [{ required: true }],\n          },\n          column: {\n            width: 100,\n            align: \"left\",\n            show: false,\n          },\n        },\n        \"extra.default.strategy.runStrategy\": {\n          title: t(\"certd.runStrategy\"),\n          type: \"dict-select\",\n          dict: dict({\n            data: [\n              { value: 0, label: t(\"certd.normalRun\") },\n              { value: 1, label: t(\"certd.skipOnSuccess\") },\n            ],\n          }),\n          form: {\n            value: 1,\n            rules: [{ required: true }],\n            helper: t(\"certd.defaultRunStrategyHelper\"),\n            show: compute(({ form }) => {\n              return form.extra.showRunStrategy;\n            }),\n          },\n          column: {\n            width: 100,\n            align: \"left\",\n            component: {\n              color: \"auto\",\n            },\n            show: false,\n          },\n          valueBuilder({ row }) {\n            if (row.extra) {\n              row.extra = yaml.load(row.extra);\n            }\n          },\n          valueResolve({ row }) {\n            if (row.extra) {\n              row.extra = yaml.dump(row.extra);\n            }\n          },\n        },\n        disabled: {\n          title: t(\"certd.enableDisable\"),\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { label: t(\"certd.enabled\"), value: false, color: \"success\" },\n              { label: t(\"certd.disabled\"), value: true, color: \"error\" },\n            ],\n          }),\n          form: {\n            title: t(\"certd.enableDisable\"),\n            value: false,\n          },\n          column: {\n            width: 120,\n            align: \"center\",\n            component: {\n              title: t(\"certd.clickToToggle\"),\n              on: {\n                async click({ value, row }) {\n                  Modal.confirm({\n                    title: t(\"certd.confirm\"),\n                    content: `${t(\"certd.confirmToggle\")} ${!value ? t(\"certd.disable\") : t(\"certd.enable\")}?`,\n                    onOk: async () => {\n                      await api.SetDisabled({\n                        id: row.id,\n                        name: row.name,\n                        type: row.type,\n                        disabled: !value,\n                      });\n                      await crudExpose.doRefresh();\n                    },\n                  });\n                },\n              },\n            },\n          },\n        },\n        group: {\n          title: t(\"certd.pluginGroup\"),\n          type: \"dict-select\",\n          dict: dict({\n            url: \"/pi/plugin/groupsList\",\n            label: \"title\",\n            value: \"key\",\n          }),\n          form: {\n            rules: [{ required: true }],\n            show: compute(({ form }) => {\n              return form.pluginType === \"deploy\";\n            }),\n          },\n          column: {\n            width: 100,\n            align: \"left\",\n            component: {\n              color: \"auto\",\n            },\n          },\n        },\n        createTime: {\n          title: t(\"certd.createTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 160,\n            align: \"center\",\n          },\n        },\n        updateTime: {\n          title: t(\"certd.updateTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            show: true,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/plugin/demo/access.yaml",
    "content": "name: AliyunAccess\nauthor: greper\nversion: 1.0.0\nminCertdVersion: 1.31.11\ntitle: 阿里云授权\ndesc: 阿里云授权\nicon: fa-cloud\ntype: access\ndependentPlugins:\n  - greper/AliyunSdk\nmetadata:\n  dependencies:\n    - \"@alicloud/pop-core\": \"^1.7.10\"\n  input:\n    accessKeyId:\n      title: AccessKeyId\n      type: string\n      component:\n        name: a-input\n      required: true\n      helper: 访问密钥ID\n    accessKeySecret:\n      type: string\n      title: AccessKeySecret\n      encrypt: true\nscript: |\n  import { AccessInput, BaseAccess, IsAccess } from '@certd/pipeline';\n  class AliyunAccess extends BaseAccess {\n    accessKeyId = '';\n    secretAccessKey = '';\n  }\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/plugin/demo/plugin.yaml",
    "content": "name: AliyunDeployToCdn\nversion: 1.0.0\nauthor:\ntitle: 阿里云-部署到CDN\ndesc: 部署证书到阿里云CDN\nicon: fa-cloud\npluginType: plugin\nmetadata:\n  dependencies:\n    - \"@alicloud/pop-core\": \"^1.7.10\"\n  input:\n    endpoint:\n      type: string,\n      title: '证书服务接入点',\n      helper: '不会选就按默认',\n      value: 'cas.aliyuncs.com',\n      component:\n        name: 'a-select',\n        options:\n          - value: 'cas.aliyuncs.com'\n            label: '中国大陆'\n      required: true,\n\n    cert:\n      type: string,\n      title: '域名证书',\n      helper: '请选择前置任务输出的域名证书',\n      component:\n        name: 'output-selector',\n        from:\n          - 'group:cert_apply',\n          - 'xxx',\n      required: true,\n\nscript: |\n  import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\n  class AliyunDeployToCdn extends AbstractTaskPlugin {\n    endpoint = '';\n    cert = '';\n    async onInstance() {}\n    async execute(): Promise<void> {\n      this.logger.info('开始部署证书到阿里云cdn');\n      const access = await this.accessService.getById<AliyunAccess>(this.accessId);\n      const sslClient = new AliyunSslClient({\n        access,\n        logger: this.logger,\n        endpoint: this.endpoint || 'cas.aliyuncs.com',\n      });\n    }\n  }"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/plugin/demo/sdk.yaml",
    "content": "name: AliyunSdk\nversion: 1.0.0\ntitle: 阿里云SDK\ndesc: 阿里云SDK\nicon: fa-cloud\nauthor:\npluginType: sdk\nmetadata:\n  types: |\n    {\n      AliyunClient: xxx\n    }\nscript: |\n  class AliyunClient extends BaseAccess {\n    accessKeyId = '';\n    secretAccessKey = '';\n  }\n\n  return {\n    AliyunClient\n  }\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/plugin/edit.vue",
    "content": "<template>\n  <fs-page class=\"page-plugin-edit\">\n    <template #header>\n      <div class=\"title\">\n        插件编辑\n        <span class=\"sub\">\n          <span class=\"name flex-inline\"> 插件名称：<fs-copyable :model-value=\"pluginName\"></fs-copyable> </span>\n        </span>\n      </div>\n      <div class=\"more\">\n        <a-button class=\"mr-1\" type=\"primary\" :loading=\"saveLoading\" @click=\"doSave\">保存</a-button>\n      </div>\n    </template>\n    <div class=\"pi-plugin-editor\">\n      <div class=\"base\">\n        <a-tabs type=\"card\">\n          <a-tab-pane key=\"base\" tab=\"插件信息\"> </a-tab-pane>\n        </a-tabs>\n        <div class=\"base-body\">\n          <fs-form ref=\"baseFormRef\" v-bind=\"formOptionsRef\"></fs-form>\n        </div>\n      </div>\n      <div class=\"metadata\">\n        <a-tabs type=\"card\">\n          <a-tab-pane key=\"editor\" tab=\"元数据\"> </a-tab-pane>\n        </a-tabs>\n        <div class=\"metadata-body\">\n          <code-editor id=\"metadata\" v-model:model-value=\"plugin.metadata\" language=\"yaml\" @save=\"doSave\"></code-editor>\n        </div>\n      </div>\n      <div class=\"script\">\n        <a-tabs type=\"card\">\n          <a-tab-pane key=\"script\" tab=\"脚本\"> </a-tab-pane>\n        </a-tabs>\n        <div class=\"script-body\">\n          <code-editor id=\"content\" v-model:model-value=\"plugin.content\" language=\"javascript\" @save=\"doSave\"></code-editor>\n        </div>\n      </div>\n    </div>\n  </fs-page>\n</template>\n<script lang=\"ts\" setup>\nimport { onMounted, provide, ref, Ref, computed } from \"vue\";\nimport { useRoute } from \"vue-router\";\nimport * as api from \"./api\";\nimport { notification } from \"ant-design-vue\";\nimport createCrudOptions from \"./crud\";\nimport { useColumns } from \"@fast-crud/fast-crud\";\nimport { usePluginStore } from \"/@/store/plugin\";\n//@ts-ignore\nimport yaml from \"js-yaml\";\n\ndefineOptions({\n  name: \"SysPluginEdit\",\n});\nconst route = useRoute();\n\nconst pluginStore = usePluginStore();\nconst plugin = ref<any>({});\nconst formOptionsRef: Ref = ref();\nconst baseFormRef: Ref = ref({});\nfunction initFormOptions() {\n  const formCrudOptions = createCrudOptions({\n    //@ts-ignore\n    crudExpose: {},\n    context: {},\n  });\n\n  const { buildFormOptions } = useColumns();\n\n  const formOptions = buildFormOptions(formCrudOptions.crudOptions, {});\n\n  formOptions.mode = \"edit\";\n  formOptions.col = {\n    span: 24,\n  };\n  formOptions.labelCol = {\n    style: {\n      width: \"100px\",\n    },\n  };\n  formOptionsRef.value = formOptions;\n}\ninitFormOptions();\n\nasync function getPlugin() {\n  const id = route.query.id;\n  const pluginObj = await api.GetObj(id);\n  plugin.value = pluginObj;\n\n  const baseFrom = {\n    ...pluginObj,\n  };\n  if (baseFrom.extra) {\n    baseFrom.extra = yaml.load(baseFrom.extra);\n  }\n  delete baseFrom.metadata;\n  delete baseFrom.content;\n  baseFormRef.value.setFormData(baseFrom);\n}\n\nonMounted(async () => {\n  getPlugin();\n});\n\nconst pluginName = computed(() => {\n  if (!plugin.value) {\n    return \"\";\n  }\n  if (plugin.value.author) {\n    return `${plugin.value.author}/${plugin.value.name}`;\n  }\n  return plugin.value.name;\n});\n\nprovide(\"get:plugin\", () => {\n  return plugin;\n});\n\nfunction validate() {\n  try {\n    yaml.load(plugin.value.metadata);\n  } catch (e: any) {\n    const message = `元数据校验失败:${e.message}`;\n    notification.error({\n      message,\n    });\n\n    throw new Error(message);\n  }\n}\n\nconst saveLoading = ref(false);\nasync function doSave() {\n  validate();\n  saveLoading.value = true;\n  const baseForm = baseFormRef.value.getFormData();\n  const form = {\n    ...plugin.value,\n    ...baseForm,\n  };\n  if (form.extra) {\n    form.extra = yaml.dump(form.extra);\n  }\n  try {\n    await api.UpdateObj(form);\n    notification.success({\n      message: \"保存成功\",\n    });\n    pluginStore.clear();\n  } finally {\n    saveLoading.value = false;\n  }\n}\n\nasync function doTest() {\n  await doSave();\n  const result = await api.DoTest({\n    id: plugin.value.id,\n    input: {},\n  });\n  notification.success({\n    message: \"测试已开始\",\n    description: result,\n  });\n}\n</script>\n\n<style lang=\"less\">\n.page-plugin-edit {\n  .pi-plugin-editor {\n    display: flex;\n    flex-direction: row;\n    width: 100%;\n    height: 100%;\n    padding: 20px;\n    .fs-editor-code {\n      height: 100%;\n      flex: 1;\n    }\n\n    .base {\n      width: 400px;\n      max-width: 30%;\n      margin-right: 20px;\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n      .base-body {\n        flex: 1;\n        overflow: auto;\n      }\n    }\n\n    .metadata {\n      width: 600px;\n      max-width: 30%;\n      margin-right: 20px;\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n      .metadata-body {\n        height: 100%;\n        flex: 1;\n      }\n\n      .metadata-editor {\n        height: 100%;\n        flex: 1;\n        .ant-tabs-content {\n          height: 100%;\n        }\n      }\n      .metadata-source {\n        height: 100%;\n      }\n    }\n    .script {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n      .script-body {\n        flex: 1;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/plugin/index.vue",
    "content": "<template>\n  <fs-page class=\"page-cert\">\n    <template #header>\n      <div class=\"title\">\n        {{ t(\"certd.pluginManagement\") }}\n        <span class=\"sub\">{{ t(\"certd.pluginBetaWarning\") }}</span>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\">\n      <!--      <template #pagination-left>-->\n      <!--        <a-tooltip :title=\"t('certd.batchDelete')\">-->\n      <!--          <fs-button icon=\"DeleteOutlined\" @click=\"handleBatchDelete\"></fs-button>-->\n      <!--        </a-tooltip>-->\n      <!--      </template>-->\n    </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { message, Modal } from \"ant-design-vue\";\nimport { DeleteBatch } from \"./api\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\ndefineOptions({\n  name: \"SysPlugin\",\n});\nconst { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions });\n\nonActivated(async () => {\n  await crudExpose.doRefresh();\n});\n\nconst selectedRowKeys = context.selectedRowKeys;\nconst handleBatchDelete = () => {\n  if (selectedRowKeys.value?.length > 0) {\n    Modal.confirm({\n      title: t(\"certd.confirm\"),\n      content: t(\"certd.batchDeleteConfirm\", { count: selectedRowKeys.value.length }),\n      async onOk() {\n        await DeleteBatch(selectedRowKeys.value);\n        message.info(t(\"certd.deleteSuccess\"));\n        crudExpose.doRefresh();\n        selectedRowKeys.value = [];\n      },\n    });\n  } else {\n    message.error(t(\"certd.pleaseSelectRecord\"));\n  }\n};\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\n</script>\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/settings/api.ts",
    "content": "// @ts-ignore\nimport { request } from \"/@/api/service\";\nimport { SysPrivateSetting, SysPublicSetting } from \"/@/store/settings/api.basic\";\nconst apiPrefix = \"/sys/settings\";\nexport type SysSettings = { public: SysPublicSetting; private: SysPrivateSetting };\n\nexport const SettingKeys = {\n  SysPublic: \"sys.public\",\n  SysPrivate: \"sys.private\",\n  SysEmail: \"sys.email\",\n};\nexport async function SettingsGet(key: string) {\n  const res = await request({\n    url: apiPrefix + \"/get\",\n    method: \"post\",\n    params: {\n      key,\n    },\n  });\n  if (!res) {\n    return {};\n  }\n  return JSON.parse(res.setting);\n}\n\nexport async function SettingsSave(key: string, setting: any) {\n  return await request({\n    url: apiPrefix + \"/save\",\n    method: \"post\",\n    data: {\n      key,\n      setting: JSON.stringify(setting),\n    },\n  });\n}\n\nexport async function HeaderMenusSettingsSave(setting: any) {\n  return await request({\n    url: apiPrefix + \"/headerMenus/save\",\n    method: \"post\",\n    data: setting,\n  });\n}\n\nexport async function EmailSettingsGet() {\n  return await request({\n    url: apiPrefix + \"/getEmailSettings\",\n    method: \"post\",\n  });\n}\n\nexport async function EmailSettingsSave(setting: any) {\n  return await request({\n    url: apiPrefix + \"/saveEmailSettings\",\n    method: \"post\",\n    data: setting,\n  });\n}\n\nexport async function stopOtherUserTimer() {\n  return await request({\n    url: apiPrefix + \"/stopOtherUserTimer\",\n    method: \"post\",\n  });\n}\n\nexport async function SysSettingsGet(): Promise<SysSettings> {\n  return await request({\n    url: apiPrefix + \"/getSysSettings\",\n    method: \"post\",\n  });\n}\n\nexport async function SysSettingsSave(data: SysSettings) {\n  return await request({\n    url: apiPrefix + \"/saveSysSettings\",\n    method: \"post\",\n    data: data,\n  });\n}\n\nexport async function TestProxy() {\n  return await request({\n    url: apiPrefix + \"/testProxy\",\n    method: \"post\",\n  });\n}\n\nexport async function TestSms(data: any) {\n  return await request({\n    url: apiPrefix + \"/testSms\",\n    method: \"post\",\n    data,\n  });\n}\n\nexport async function GetSmsTypeDefine(type: string) {\n  return await request({\n    url: apiPrefix + \"/getSmsTypeDefine\",\n    method: \"post\",\n    data: {\n      type,\n    },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/settings/email/api.email.ts",
    "content": "import { request } from \"/src/api/service\";\nconst apiPrefix = \"/mine/email\";\n\nexport async function TestSend(receiver: string) {\n  await request({\n    url: apiPrefix + \"/test\",\n    method: \"post\",\n    data: {\n      receiver,\n    },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/settings/email/index.vue",
    "content": "<template>\n  <fs-page class=\"page-setting-email\">\n    <template #header>\n      <div class=\"title\">\n        {{ t(\"certd.emailServerSettings\") }}\n        <span class=\"sub\">{{ t(\"certd.setEmailSendingServer\") }}</span>\n      </div>\n    </template>\n\n    <div class=\"flex-o\">\n      <a-form :model=\"formState\" name=\"basic\" :label-col=\"{ span: 8 }\" :wrapper-col=\"{ span: 16 }\" autocomplete=\"off\" class=\"email-form-box\" @finish=\"onFinish\" @finish-failed=\"onFinishFailed\">\n        <div v-if=\"!formState.usePlus\" class=\"email-form\">\n          <a-form-item :label=\"t('certd.useCustomEmailServer')\"> </a-form-item>\n          <a-form-item :label=\"t('certd.smtpDomain')\" name=\"host\" :rules=\"[{ required: true, message: t('certd.pleaseEnterSmtpDomain') }]\">\n            <a-input v-model:value=\"formState.host\" />\n          </a-form-item>\n\n          <a-form-item :label=\"t('certd.smtpPort')\" name=\"port\" :rules=\"[{ required: true, message: t('certd.pleaseEnterSmtpPort') }]\">\n            <a-input v-model:value=\"formState.port\" />\n          </a-form-item>\n\n          <a-form-item :label=\"t('certd.username')\" :name=\"['auth', 'user']\" :rules=\"[{ required: true, message: t('certd.pleaseEnterUsername') }]\">\n            <a-input v-model:value=\"formState.auth.user\" />\n          </a-form-item>\n          <a-form-item :label=\"t('certd.password')\" :name=\"['auth', 'pass']\" :rules=\"[{ required: true, message: t('certd.pleaseEnterPassword') }]\">\n            <a-input-password v-model:value=\"formState.auth.pass\" />\n            <div class=\"helper\">{{ t(\"certd.qqEmailAuthCodeHelper\") }}</div>\n          </a-form-item>\n          <a-form-item :label=\"t('certd.senderEmail')\" name=\"sender\" :rules=\"[{ required: true, message: t('certd.pleaseEnterSenderEmail') }]\">\n            <a-input v-model:value=\"formState.sender\" />\n          </a-form-item>\n          <a-form-item :label=\"t('certd.useSsl')\" name=\"secure\">\n            <a-switch v-model:checked=\"formState.secure\" />\n            <div class=\"helper\">{{ t(\"certd.sslPortNote\") }}</div>\n          </a-form-item>\n          <a-form-item :label=\"t('certd.ignoreCertValidation')\" :name=\"['tls', 'rejectUnauthorized']\">\n            <a-switch v-model:checked=\"formState.tls.rejectUnauthorized\" />\n          </a-form-item>\n\n          <a-form-item :wrapper-col=\"{ offset: 8, span: 16 }\">\n            <a-button type=\"primary\" html-type=\"submit\">{{ t(\"certd.save\") }}</a-button>\n          </a-form-item>\n        </div>\n        <div class=\"email-form\">\n          <a-form-item :label=\"t('certd.useOfficialEmailServer')\" name=\"usePlus\">\n            <div class=\"flex-o\">\n              <a-switch v-model:checked=\"formState.usePlus\" :disabled=\"!settingStore.isPlus\" @change=\"onUsePlusChanged\" />\n              <vip-button class=\"ml-5\" mode=\"button\"></vip-button>\n            </div>\n            <div class=\"helper\">{{ t(\"certd.useOfficialEmailServerHelper\") }}</div>\n          </a-form-item>\n        </div>\n      </a-form>\n    </div>\n    <div class=\"email-form\">\n      <a-form :model=\"testFormState\" name=\"basic\" :label-col=\"{ span: 8 }\" :wrapper-col=\"{ span: 16 }\" autocomplete=\"off\" @finish=\"onTestSend\">\n        <a-form-item :label=\"t('certd.testReceiverEmail')\" name=\"receiver\" :rules=\"[{ required: true, message: t('certd.pleaseEnterTestReceiverEmail') }]\">\n          <a-input v-model:value=\"testFormState.receiver\" />\n          <div class=\"helper\">{{ t(\"certd.saveBeforeTest\") }}</div>\n          <div class=\"helper\">\n            {{ t(\"certd.sendFailHelpDoc\") }}<a href=\"https://certd.docmirror.cn/guide/use/email/\" target=\"_blank\">{{ t(\"certd.emailConfigHelpDoc\") }}</a>\n          </div>\n          <div class=\"helper\">{{ t(\"certd.tryOfficialEmailServer\") }}</div>\n        </a-form-item>\n        <a-form-item :wrapper-col=\"{ offset: 8, span: 16 }\">\n          <a-button type=\"primary\" :loading=\"testFormState.loading\" html-type=\"submit\">{{ t(\"certd.test\") }}</a-button>\n        </a-form-item>\n      </a-form>\n    </div>\n  </fs-page>\n</template>\n\n<script setup lang=\"ts\">\nimport { reactive } from \"vue\";\nimport * as api from \"../api\";\nimport * as emailApi from \"./api.email\";\nimport { notification } from \"ant-design-vue\";\nimport { useSettingStore } from \"/src/store/settings\";\nimport * as _ from \"lodash-es\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\ndefineOptions({\n  name: \"EmailSetting\",\n});\n\ninterface FormState {\n  host: string;\n  port: number;\n  auth: {\n    user: string;\n    pass: string;\n  };\n  secure: boolean; // use TLS\n  tls: {\n    // do not fail on invalid certs\n    rejectUnauthorized?: boolean;\n  };\n  sender: string;\n  usePlus: boolean;\n}\n\nconst formState = reactive<Partial<FormState>>({\n  auth: {\n    user: \"\",\n    pass: \"\",\n  },\n  tls: {},\n  usePlus: false,\n});\n\nasync function load() {\n  const data: any = await api.EmailSettingsGet();\n  _.merge(formState, data);\n}\n\nload();\n\nconst onFinish = async (form: any) => {\n  console.log(\"Success:\", form);\n  await api.EmailSettingsSave(form);\n  notification.success({\n    message: t(\"certd.saveSuccess\"),\n  });\n};\n\nconst onFinishFailed = (errorInfo: any) => {\n  // console.log(\"Failed:\", errorInfo);\n};\n\nasync function onUsePlusChanged() {\n  await api.EmailSettingsSave(formState);\n}\n\ninterface TestFormState {\n  receiver: string;\n  loading: boolean;\n}\nconst testFormState = reactive<TestFormState>({\n  receiver: \"\",\n  loading: false,\n});\nasync function onTestSend() {\n  testFormState.loading = true;\n  try {\n    await emailApi.TestSend(testFormState.receiver);\n    notification.success({\n      message: t(\"certd.sendSuccess\"),\n    });\n  } finally {\n    testFormState.loading = false;\n  }\n}\n\nconst settingStore = useSettingStore();\n</script>\n\n<style lang=\"less\">\n.page-setting-email {\n  .email-form-box {\n    display: flex;\n  }\n\n  .email-form {\n    width: 500px;\n    margin: 20px;\n  }\n\n  .helper {\n    padding: 1px;\n    margin: 0px;\n    color: #999;\n    font-size: 10px;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/settings/header-menus/crud.tsx",
    "content": "import { useI18n } from \"/src/locales\";\nimport { Ref, ref } from \"vue\";\nimport { useRouter } from \"vue-router\";\nimport { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { cloneDeep, find, merge, remove } from \"lodash-es\";\nimport { nanoid } from \"nanoid\";\nimport { HeaderMenusSettingsSave, SettingsSave } from \"../api\";\nimport { utils } from \"/@/utils\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { crudBinding } = crudExpose;\n  const router = useRouter();\n  const { t } = useI18n();\n  const settingStore = useSettingStore();\n\n  async function saveMenus() {\n    const menus = settingStore.headerMenus;\n    await HeaderMenusSettingsSave(menus);\n  }\n\n  const expandedRowKeys = ref<string[]>([]);\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    const records = cloneDeep(settingStore.headerMenus?.menus || []);\n    expandedRowKeys.value = [];\n    utils.tree.eachTree(records, (item: any) => {\n      if (item.children && item.children.length > 0) {\n        expandedRowKeys.value.push(item.id);\n      }\n    });\n\n    return {\n      records: records,\n      total: records.length,\n      limit: 9999999,\n      offset: 0,\n    };\n  };\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    let found: any = undefined;\n    utils.tree.eachTree(settingStore.headerMenus?.menus || [], item => {\n      if (item.id === row.id) {\n        merge(item, form);\n        found = item;\n      }\n    });\n    await saveMenus();\n    return found;\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    utils.tree.eachTree([{ children: settingStore.headerMenus?.menus }], item => {\n      if (item.children) {\n        remove(item.children, (child: any) => child.id === row.id);\n      }\n    });\n    await saveMenus();\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    form.id = nanoid();\n    if (form.parentId) {\n      utils.tree.eachTree(settingStore.headerMenus?.menus || [], item => {\n        if (item.id === form.parentId) {\n          if (!item.children) {\n            item.children = [];\n          }\n          item.children.push(form);\n        }\n      });\n    } else {\n      settingStore.headerMenus?.menus.push(form);\n    }\n    await saveMenus();\n    return form;\n  };\n\n  return {\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      search: {\n        show: false,\n      },\n      table: {\n        expandRowByClick: true,\n        defaultExpandAllRows: true,\n        expandedRowKeys: expandedRowKeys,\n        \"onUpdate:expandedRowKeys\": (val: string[]) => {\n          expandedRowKeys.value = val;\n        },\n      },\n      pagination: { show: false, pageSize: 9999999 },\n      rowHandle: {\n        width: 300,\n        fixed: \"right\",\n        buttons: {\n          addChild: {\n            title: \"添加子菜单\",\n            text: null,\n            type: \"link\",\n            icon: \"ion:add-circle-outline\",\n            click: ({ row }) => {\n              crudExpose.openAdd({\n                row: {\n                  parentId: row.id,\n                },\n              });\n            },\n          },\n        },\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"text\",\n          column: {\n            width: 200,\n            show: false,\n          },\n          form: {\n            show: false,\n          },\n        },\n        title: {\n          title: \"菜单标题\",\n          type: \"text\",\n          column: {\n            width: 300,\n          },\n          form: {\n            rules: [\n              {\n                required: true,\n                message: \"请输入标题\",\n              },\n            ],\n          },\n        },\n        icon: {\n          title: \"图标\",\n          type: \"icon\",\n          column: {\n            width: 300,\n            cellRender: ({ row }) => {\n              return <fs-icon class={\"fs-16\"} icon={row.icon}></fs-icon>;\n            },\n          },\n          form: {\n            component: {\n              placeholder: \"ion:add-circle\",\n            },\n          },\n        },\n        path: {\n          title: \"链接\",\n          type: \"link\",\n          column: {\n            width: 300,\n          },\n          form: {\n            rules: [\n              {\n                required: true,\n                message: \"请输入链接\",\n              },\n              {\n                type: \"url\",\n                message: \"请输入正确的链接\",\n              },\n            ],\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/settings/header-menus/index.vue",
    "content": "<template>\n  <fs-page class=\"page-cert\">\n    <template #header>\n      <div class=\"title\">顶部菜单配置</div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { useSettingStore } from \"/@/store/settings\";\n\ndefineOptions({\n  name: \"SettingsHeaderMenus\",\n});\nconst { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions });\n\nconst settingStore = useSettingStore();\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(async () => {\n  await crudExpose.doRefresh();\n});\n</script>\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/settings/index.vue",
    "content": "<template>\n  <fs-page class=\"page-sys-settings\">\n    <!--    <template #header>-->\n    <!--      <div class=\"title\">系统设置</div>-->\n    <!--    </template>-->\n    <div class=\"sys-settings-body md:p-5\">\n      <a-tabs :active-key=\"activeKey\" type=\"card\" class=\"sys-settings-tabs\" @update:active-key=\"onChange\">\n        <a-tab-pane key=\"base\" tab=\"基本设置\">\n          <SettingBase v-if=\"activeKey === 'base'\" />\n        </a-tab-pane>\n        <a-tab-pane key=\"register\" tab=\"注册设置\">\n          <SettingRegister v-if=\"activeKey === 'register'\" />\n        </a-tab-pane>\n        <a-tab-pane v-if=\"settingsStore.isComm\" key=\"payment\" tab=\"支付设置\">\n          <SettingPayment v-if=\"activeKey === 'payment'\" />\n        </a-tab-pane>\n        <a-tab-pane key=\"save\" tab=\"安全设置\">\n          <SettingSafe v-if=\"activeKey === 'save'\" />\n        </a-tab-pane>\n      </a-tabs>\n    </div>\n  </fs-page>\n</template>\n\n<script setup lang=\"tsx\">\nimport SettingBase from \"/@/views/sys/settings/tabs/base.vue\";\nimport SettingRegister from \"/@/views/sys/settings/tabs/register.vue\";\nimport SettingPayment from \"/@/views/sys/settings/tabs/payment.vue\";\nimport SettingSafe from \"/@/views/sys/settings/tabs/safe.vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport { ref } from \"vue\";\nimport { useSettingStore } from \"/@/store/settings\";\ndefineOptions({\n  name: \"SysSettings\",\n});\nconst settingsStore = useSettingStore();\nconst activeKey = ref(\"base\");\nconst route = useRoute();\nconst router = useRouter();\nif (route.query.tab) {\n  activeKey.value = (route.query.tab as string) || \"base\";\n}\n\nfunction onChange(value: string) {\n  // activeKey.value = value;\n  // 创建一个新的查询参数对象\n  const query: any = {};\n  if (value !== \"\") {\n    query.tab = value;\n  }\n  // 使用`push`方法更新路由，保留其他查询参数不变\n  router.push({ path: route.path, query });\n}\n</script>\n\n<style lang=\"less\">\n.page-sys-settings {\n  .sys-settings-form {\n    width: 600px;\n    max-width: 100%;\n    padding: 20px;\n  }\n\n  .sys-settings-body {\n    height: 100%;\n    padding-top: 20px;\n    .sys-settings-tabs {\n      height: 100%;\n      display: flex;\n      flex-direction: column;\n      .ant-tabs-content-holder {\n        flex: 1;\n        overflow: auto;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/settings/tabs/base.vue",
    "content": "<template>\n  <div class=\"sys-settings-form sys-settings-base\">\n    <a-form :model=\"formState\" name=\"basic\" :label-col=\"{ span: 8 }\" :wrapper-col=\"{ span: 16 }\" autocomplete=\"off\" @finish=\"onFinish\" @finish-failed=\"onFinishFailed\">\n      <a-form-item :label=\"t('certd.icpRegistrationNumber')\" :name=\"['public', 'icpNo']\">\n        <a-input v-model:value=\"formState.public.icpNo\" :placeholder=\"t('certd.icpPlaceholder')\" />\n      </a-form-item>\n      <a-form-item :label=\"t('certd.publicSecurityRegistrationNumber')\" :name=\"['public', 'mpsNo']\">\n        <a-input v-model:value=\"formState.public.mpsNo\" :placeholder=\"t('certd.publicSecurityPlaceholder')\" />\n      </a-form-item>\n\n      <a-form-item :label=\"t('certd.enableAssistant')\" :name=\"['public', 'aiChatEnabled']\">\n        <a-switch v-model:checked=\"formState.public.aiChatEnabled\" />\n      </a-form-item>\n      <a-form-item :label=\"t('certd.allowCrawlers')\" :name=\"['public', 'robots']\">\n        <a-switch v-model:checked=\"formState.public.robots\" />\n      </a-form-item>\n\n      <a-form-item :label=\"t('certd.httpProxy')\" :name=\"['private', 'httpProxy']\" :rules=\"urlRules\">\n        <a-input v-model:value=\"formState.private.httpProxy\" :placeholder=\"t('certd.httpProxyPlaceholder')\" />\n        <div class=\"helper\">{{ t(\"certd.httpProxyHelper\") }}</div>\n      </a-form-item>\n\n      <a-form-item :label=\"t('certd.httpsProxy')\" :name=\"['private', 'httpsProxy']\" :rules=\"urlRules\">\n        <div class=\"flex\">\n          <a-input v-model:value=\"formState.private.httpsProxy\" :placeholder=\"t('certd.httpsProxyPlaceholder')\" />\n          <a-button class=\"ml-5\" type=\"primary\" :loading=\"testProxyLoading\" :title=\"t('certd.saveThenTestTitle')\" @click=\"testProxy\">{{ t(\"certd.testButton\") }}</a-button>\n        </div>\n        <div class=\"helper\">{{ t(\"certd.httpsProxyHelper\") }}</div>\n      </a-form-item>\n\n      <a-form-item :label=\"t('certd.dualStackNetwork')\" :name=\"['private', 'dnsResultOrder']\">\n        <a-select v-model:value=\"formState.private.dnsResultOrder\">\n          <a-select-option value=\"verbatim\">{{ t(\"certd.default\") }}</a-select-option>\n          <a-select-option value=\"ipv4first\">{{ t(\"certd.ipv4Priority\") }}</a-select-option>\n          <a-select-option value=\"ipv6first\">{{ t(\"certd.ipv6Priority\") }}</a-select-option>\n        </a-select>\n        <div class=\"helper\">{{ t(\"certd.dualStackNetworkHelper\") }}</div>\n      </a-form-item>\n\n      <a-form-item :label=\"t('certd.sys.setting.showRunStrategy')\" :name=\"['public', 'showRunStrategy']\">\n        <a-switch v-model:checked=\"formState.public.showRunStrategy\" />\n        <div class=\"helper\">{{ t(\"certd.sys.setting.showRunStrategyHelper\") }}</div>\n      </a-form-item>\n\n      <a-form-item :label=\"t('certd.enableCommonCnameService')\" :name=\"['private', 'commonCnameEnabled']\">\n        <a-switch v-model:checked=\"formState.private.commonCnameEnabled\" />\n        <div class=\"helper\" v-html=\"t('certd.commonCnameHelper')\"></div>\n      </a-form-item>\n\n      <a-form-item label=\" \" :colon=\"false\" :wrapper-col=\"{ span: 8 }\">\n        <a-button :loading=\"saveLoading\" type=\"primary\" html-type=\"submit\">{{ t(\"certd.saveButton\") }}</a-button>\n      </a-form-item>\n    </a-form>\n  </div>\n</template>\n\n<script setup lang=\"tsx\">\nimport { reactive, ref } from \"vue\";\nimport { SysSettings } from \"/@/views/sys/settings/api\";\nimport * as api from \"/@/views/sys/settings/api\";\nimport { merge } from \"lodash-es\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { notification } from \"ant-design-vue\";\nimport { util } from \"/@/utils\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\ndefineOptions({\n  name: \"SettingBase\",\n});\n\nconst formState = reactive<Partial<SysSettings>>({\n  public: {\n    icpNo: \"\",\n    mpsNo: \"\",\n  },\n  private: {},\n});\n\nconst urlRules = ref({\n  type: \"url\",\n  message: \"请输入正确的URL\",\n});\n\nasync function loadSysSettings() {\n  const data: any = await api.SysSettingsGet();\n  merge(formState, data);\n}\n\nconst saveLoading = ref(false);\nloadSysSettings();\nconst settingsStore = useSettingStore();\nconst onFinish = async (form: any) => {\n  try {\n    saveLoading.value = true;\n    await api.SysSettingsSave(form);\n    await settingsStore.loadSysSettings();\n    notification.success({\n      message: t(\"certd.saveSuccess\"),\n    });\n  } finally {\n    saveLoading.value = false;\n  }\n};\n\nconst onFinishFailed = (errorInfo: any) => {\n  // console.log(\"Failed:\", errorInfo);\n};\n\nasync function stopOtherUserTimer() {\n  await api.stopOtherUserTimer();\n  notification.success({\n    message: t(\"certd.stopSuccess\"),\n  });\n}\n\nconst testProxyLoading = ref(false);\nasync function testProxy() {\n  testProxyLoading.value = true;\n  try {\n    const res = await api.TestProxy();\n    let success = true;\n    if (res.google !== true || res.baidu !== true) {\n      success = false;\n    }\n    const content = () => {\n      return (\n        <div>\n          <div>\n            {t(\"certd.google\")}: {res.google === true ? t(\"certd.success\") : util.maxLength(res.google)}\n          </div>\n          <div>\n            {t(\"certd.baidu\")}: {res.baidu === true ? t(\"certd.success\") : util.maxLength(res.baidu)}\n          </div>\n        </div>\n      );\n    };\n    if (!success) {\n      notification.error({\n        message: t(\"certd.testFailed\"),\n        description: content,\n      });\n      return;\n    }\n    notification.success({\n      message: t(\"certd.testCompleted\"),\n      description: content,\n    });\n  } finally {\n    testProxyLoading.value = false;\n  }\n}\n</script>\n<style lang=\"less\">\n.sys-settings-base {\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/settings/tabs/payment.vue",
    "content": "<template>\n  <div class=\"sys-settings-form sys-settings-payment\">\n    <a-form ref=\"formRef\" :model=\"formState\" :label-col=\"{ span: 8 }\" :wrapper-col=\"{ span: 16 }\" autocomplete=\"off\">\n      <div>支付方式</div>\n      <a-form-item label=\"彩虹易支付\" :name=\"['yizhifu', 'enabled']\" :required=\"true\">\n        <a-switch v-model:checked=\"formState.yizhifu.enabled\" />\n      </a-form-item>\n      <a-form-item v-if=\"formState.yizhifu.enabled\" label=\"易支付配置\" :name=\"['yizhifu', 'accessId']\" :required=\"true\">\n        <access-selector v-model=\"formState.yizhifu.accessId\" type=\"yizhifu\" from=\"sys\" />\n        <div class=\"helper\">\n          <a href=\"https://certd.docmirror.cn/comm/payments/yizhifu.html\">彩虹易支付配置帮助文档</a>\n        </div>\n      </a-form-item>\n\n      <a-form-item label=\"支付宝\" :name=\"['alipay', 'enabled']\" :required=\"true\">\n        <a-switch v-model:checked=\"formState.alipay.enabled\" />\n      </a-form-item>\n      <a-form-item v-if=\"formState.alipay.enabled\" label=\"支付宝配置\" :name=\"['alipay', 'accessId']\" :required=\"true\">\n        <access-selector v-model=\"formState.alipay.accessId\" type=\"alipay\" from=\"sys\" />\n        <div class=\"helper\">需要开通电脑网站支付， <a href=\"https://certd.docmirror.cn/comm/payments/alipay.html\">支付宝配置帮助文档</a></div>\n      </a-form-item>\n\n      <a-form-item label=\"微信支付\" :name=\"['wxpay', 'enabled']\" :required=\"true\">\n        <a-switch v-model:checked=\"formState.wxpay.enabled\" />\n      </a-form-item>\n      <a-form-item v-if=\"formState.wxpay.enabled\" label=\"微信支付配置\" :name=\"['wxpay', 'accessId']\" :required=\"true\">\n        <access-selector v-model=\"formState.wxpay.accessId\" type=\"wxpay\" from=\"sys\" />\n        <div class=\"helper\">需要开通Native支付， <a href=\"https://certd.docmirror.cn/comm/payments/wxpay.html\">微信配置帮助文档</a></div>\n      </a-form-item>\n\n      <a-form-item label=\" \" :colon=\"false\" :wrapper-col=\"{ span: 16 }\">\n        <loading-button type=\"primary\" html-type=\"button\" :click=\"onClick\">保存</loading-button>\n      </a-form-item>\n    </a-form>\n  </div>\n</template>\n\n<script setup lang=\"tsx\">\nimport { reactive, ref } from \"vue\";\nimport { merge } from \"lodash-es\";\nimport { notification } from \"ant-design-vue\";\nimport { request } from \"/@/api/service\";\n\ndefineOptions({\n  name: \"SettingPayment\",\n});\n\nconst api = {\n  async SettingGet() {\n    return await request({\n      url: \"/sys/settings/payment/get\",\n      method: \"post\",\n    });\n  },\n  async SettingSave(data: any) {\n    return await request({\n      url: \"/sys/settings/payment/save\",\n      method: \"post\",\n      data,\n    });\n  },\n};\n\nconst formRef = ref<any>(null);\ntype PaymentItem = {\n  enabled: boolean;\n  accessId?: number;\n};\n\nconst formState = reactive<\n  Partial<{\n    yizhifu: PaymentItem;\n    alipay: PaymentItem;\n    wxpay: PaymentItem;\n  }>\n>({\n  yizhifu: { enabled: false },\n  alipay: { enabled: false },\n  wxpay: { enabled: false },\n});\n\nasync function loadSettings() {\n  const data: any = await api.SettingGet();\n  merge(formState, data);\n}\n\nloadSettings();\nconst onClick = async () => {\n  const form = await formRef.value.validateFields();\n  await api.SettingSave(form);\n  await loadSettings();\n  notification.success({\n    message: \"保存成功\",\n  });\n};\n</script>\n<style lang=\"less\">\n.sys-settings-base {\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/settings/tabs/register.vue",
    "content": "<template>\n  <div class=\"sys-settings-form sys-settings-register\">\n    <a-form :model=\"formState\" name=\"register\" :label-col=\"{ span: 8 }\" :wrapper-col=\"{ span: 16 }\" autocomplete=\"off\" @finish=\"onFinish\">\n      <a-form-item :label=\"t('certd.manageOtherUserPipeline')\" :name=\"['public', 'managerOtherUserPipeline']\">\n        <a-switch v-model:checked=\"formState.public.managerOtherUserPipeline\" />\n      </a-form-item>\n      <a-form-item :label=\"t('certd.limitUserPipelineCount')\" :name=\"['public', 'limitUserPipelineCount']\">\n        <a-input-number v-model:value=\"formState.public.limitUserPipelineCount\" />\n        <div class=\"helper\">{{ t(\"certd.limitUserPipelineCountHelper\") }}</div>\n      </a-form-item>\n      <a-form-item :label=\"t('certd.enableSelfRegistration')\" :name=\"['public', 'registerEnabled']\">\n        <a-switch v-model:checked=\"formState.public.registerEnabled\" />\n      </a-form-item>\n      <a-form-item :label=\"t('certd.enableUserValidityPeriod')\" :name=\"['public', 'userValidTimeEnabled']\">\n        <div class=\"flex-o\">\n          <a-switch v-model:checked=\"formState.public.userValidTimeEnabled\" :disabled=\"!settingsStore.isPlus\" />\n          <vip-button class=\"ml-5\" mode=\"button\"></vip-button>\n        </div>\n        <div class=\"helper\">{{ t(\"certd.userValidityPeriodHelper\") }}</div>\n      </a-form-item>\n      <template v-if=\"formState.public.registerEnabled\">\n        <a-form-item :label=\"t('certd.enableUsernameRegistration')\" :name=\"['public', 'usernameRegisterEnabled']\">\n          <a-switch v-model:checked=\"formState.public.usernameRegisterEnabled\" />\n        </a-form-item>\n\n        <a-form-item :label=\"t('certd.enableEmailRegistration')\" :name=\"['public', 'emailRegisterEnabled']\">\n          <div class=\"flex-o\">\n            <a-switch v-model:checked=\"formState.public.emailRegisterEnabled\" :disabled=\"!settingsStore.isPlus\" :title=\"t('certd.proFeature')\" />\n            <vip-button class=\"ml-5\" mode=\"button\"></vip-button>\n          </div>\n          <div class=\"helper\">\n            <router-link to=\"/sys/settings/email\">{{ t(\"certd.emailServerSetup\") }}</router-link>\n          </div>\n        </a-form-item>\n        <a-form-item :label=\"t('certd.enableSmsLoginRegister')\" :name=\"['public', 'smsLoginEnabled']\">\n          <div class=\"flex-o\">\n            <a-switch v-model:checked=\"formState.public.smsLoginEnabled\" :disabled=\"!settingsStore.isComm\" :title=\"t('certd.commFeature')\" />\n            <vip-button class=\"ml-5\" mode=\"comm\"></vip-button>\n          </div>\n        </a-form-item>\n        <template v-if=\"formState.public.smsLoginEnabled\">\n          <a-form-item :label=\"t('certd.smsProvider')\" :name=\"['private', 'sms', 'type']\">\n            <a-select v-model:value=\"formState.private.sms.type\" @change=\"smsTypeChange\">\n              <a-select-option value=\"aliyun\">{{ t(\"certd.aliyunSms\") }}</a-select-option>\n              <a-select-option value=\"yfysms\">{{ t(\"certd.yfySms\") }}</a-select-option>\n            </a-select>\n          </a-form-item>\n          <template v-for=\"item of smsTypeDefineInputs\" :key=\"item.simpleKey\">\n            <fs-form-item v-model=\"formState.private.sms.config[item.simpleKey]\" :path=\"'private.sms.config' + item.key\" :item=\"item\" />\n          </template>\n\n          <a-form-item :label=\"t('certd.smsTest')\">\n            <div class=\"flex\">\n              <a-input v-model:value=\"testMobile\" :placeholder=\"t('certd.testMobilePlaceholder')\" />\n              <loading-button class=\"ml-5\" :title=\"t('certd.saveThenTest')\" type=\"primary\" :click=\"testSendSms\">{{ t(\"certd.testButton\") }}</loading-button>\n            </div>\n            <div class=\"helper\">{{ t(\"certd.saveThenTest\") }}</div>\n          </a-form-item>\n        </template>\n      </template>\n\n      <a-form-item label=\" \" :colon=\"false\" :wrapper-col=\"{ span: 16 }\">\n        <a-button :loading=\"saveLoading\" type=\"primary\" html-type=\"submit\">{{ t(\"certd.saveButton\") }}</a-button>\n      </a-form-item>\n    </a-form>\n  </div>\n</template>\n\n<script setup lang=\"tsx\">\nimport { reactive, ref, Ref } from \"vue\";\nimport { GetSmsTypeDefine, SysSettings } from \"/@/views/sys/settings/api\";\nimport * as api from \"/@/views/sys/settings/api\";\nimport { merge } from \"lodash-es\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { notification } from \"ant-design-vue\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\n\ndefineOptions({\n  name: \"SettingRegister\",\n});\n\nconst testMobile = ref(\"\");\nasync function testSendSms() {\n  if (!testMobile.value) {\n    notification.error({\n      message: t(\"certd.enterTestMobile\"),\n    });\n    return;\n  }\n  await api.TestSms({\n    mobile: testMobile.value,\n  });\n  notification.success({\n    message: t(\"certd.sendSuccess\"),\n  });\n}\n\nconst formState = reactive<Partial<SysSettings>>({\n  public: {\n    registerEnabled: false,\n  },\n  private: {\n    sms: {\n      type: \"aliyun\",\n      config: {},\n    },\n  },\n});\n\nconst rules = {\n  leastOneLogin: {\n    validator: (rule: any, value: any) => {\n      if (!formState.public.passwordLoginEnabled && !formState.public.smsLoginEnabled) {\n        return Promise.reject(t(\"certd.atLeastOneLoginRequired\"));\n      }\n      return Promise.resolve();\n    },\n  },\n  required: {\n    required: true,\n    trigger: \"change\",\n    message: t(\"certd.fieldRequired\"),\n  },\n};\n\nasync function smsTypeChange(value: string) {\n  if (formState.private?.sms?.config) {\n    formState.private.sms.config = {};\n  }\n\n  await loadTypeDefine(value);\n}\nconst smsTypeDefineInputs: Ref = ref({});\nasync function loadTypeDefine(type: string) {\n  const define: any = await api.GetSmsTypeDefine(type);\n  const keys = Object.keys(define.input);\n  const inputs: any = {};\n  keys.forEach(key => {\n    const value = define.input[key];\n    value.simpleKey = key;\n    value.key = \"private.sms.config.\" + key;\n    if (!value.component) {\n      value.component = {\n        name: \"a-input\",\n      };\n    }\n    if (!value.component.name) {\n      value.component.vModel = \"value\";\n    }\n    if (!value.rules) {\n      value.rules = [];\n    }\n    if (value.required) {\n      value.rules.push(rules.required);\n    }\n\n    inputs[key] = define.input[key];\n  });\n  smsTypeDefineInputs.value = inputs;\n}\n\nasync function loadSysSettings() {\n  const data: any = await api.SysSettingsGet();\n  merge(formState, data);\n  if (data?.private.sms?.type) {\n    await loadTypeDefine(data.private.sms.type);\n  }\n  if (!settingsStore.isPlus) {\n    formState.public.userValidTimeEnabled = false;\n    formState.public.emailRegisterEnabled = false;\n  }\n\n  if (!settingsStore.isComm) {\n    formState.public.smsLoginEnabled = false;\n  }\n}\n\nconst saveLoading = ref(false);\nloadSysSettings();\nconst settingsStore = useSettingStore();\nconst onFinish = async (form: any) => {\n  try {\n    saveLoading.value = true;\n    await api.SysSettingsSave(form);\n    await settingsStore.loadSysSettings();\n    notification.success({\n      message: t(\"certd.saveSuccess\"),\n    });\n  } finally {\n    saveLoading.value = false;\n  }\n};\n</script>\n<style lang=\"less\">\n.sys-settings-site {\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/settings/tabs/safe.vue",
    "content": "<template>\n  <div class=\"sys-settings-form sys-settings-safe\">\n    <a-form ref=\"formRef\" :model=\"formState\" :label-col=\"{ span: 8 }\" :wrapper-col=\"{ span: 16 }\" autocomplete=\"off\">\n      <h2>{{ t(\"certd.siteHide\") }}</h2>\n      <a-form-item :label=\"t('certd.enableSiteHide')\" :name=\"['hidden', 'enabled']\" :required=\"true\">\n        <div class=\"flex\">\n          <a-switch v-model:checked=\"formState.hidden.enabled\" />\n        </div>\n\n        <div class=\"helper\">\n          {{ t(\"certd.siteHideDescription\") }}\n          <a href=\"https://certd.docmirror.cn/guide/feature/safe/hidden\" class=\"flex items-center\" target=\"_blank\">\n            <span>{{ t(\"certd.helpDoc\") }}</span>\n            <fs-icon class=\"ml-1\" icon=\"mingcute:question-line\"></fs-icon\n          ></a>\n        </div>\n      </a-form-item>\n      <a-form-item v-if=\"formState.hidden.enabled\" :label=\"t('certd.randomAddress')\" :name=\"['hidden', 'openPath']\" :required=\"true\">\n        <a-input-search v-model:value=\"formState.hidden.openPath\" :allow-clear=\"true\" @search=\"changeOpenPath\">\n          <template #enterButton>\n            <fs-icon icon=\"ion:refresh\"></fs-icon>\n          </template>\n        </a-input-search>\n        <div class=\"helper\">{{ t(\"certd.siteHideUrlHelper\") }}</div>\n      </a-form-item>\n      <a-form-item v-if=\"formState.hidden.enabled\" :label=\"t('certd.fullUnlockUrl')\" :name=\"['hidden', 'openPath']\" :required=\"true\">\n        <div class=\"flex\"><fs-copyable v-model=\"openUrl\" class=\"flex-inline\"></fs-copyable></div>\n        <div class=\"helper red\">{{ t(\"certd.saveThisUrl\") }}</div>\n      </a-form-item>\n      <a-form-item v-if=\"formState.hidden.enabled\" :label=\"t('certd.unlockPassword')\" :name=\"['hidden', 'openPassword']\" :required=\"false\">\n        <a-input-password v-model:value=\"formState.hidden.openPassword\" :allow-clear=\"true\" />\n        <div class=\"helper\">{{ t(\"certd.unlockPasswordHelper\") }}</div>\n      </a-form-item>\n      <a-form-item v-if=\"formState.hidden.enabled\" :label=\"t('certd.autoHideTime')\" :name=\"['hidden', 'autoHiddenTimes']\" :required=\"true\">\n        <a-input-number v-model:value=\"formState.hidden.autoHiddenTimes\" :allow-clear=\"true\" />\n        <div class=\"helper\">{{ t(\"certd.autoHideTimeHelper\") }}</div>\n      </a-form-item>\n      <a-form-item v-if=\"formState.hidden.enabled\" :label=\"t('certd.hideOpenApi')\" :name=\"['hidden', 'hiddenOpenApi']\" :required=\"true\">\n        <a-switch v-model:checked=\"formState.hidden.hiddenOpenApi\" />\n        <div class=\"helper\">{{ t(\"certd.hideOpenApiHelper\") }}</div>\n      </a-form-item>\n      <a-form-item v-if=\"formState.hidden.enabled\" :label=\"t('certd.hideSiteImmediately')\">\n        <loading-button class=\"ml-1\" type=\"primary\" html-type=\"button\" :click=\"doHiddenImmediate\">{{ t(\"certd.hideImmediately\") }}</loading-button>\n      </a-form-item>\n      <a-form-item label=\" \" :colon=\"false\" :wrapper-col=\"{ span: 16 }\">\n        <loading-button type=\"primary\" html-type=\"button\" :click=\"onClick\">{{ t(\"certd.save\") }}</loading-button>\n      </a-form-item>\n    </a-form>\n  </div>\n</template>\n\n<script setup lang=\"tsx\">\nimport { computed, reactive, ref } from \"vue\";\nimport { merge } from \"lodash-es\";\nimport { Modal, notification } from \"ant-design-vue\";\nimport { request } from \"/@/api/service\";\nimport { util, utils } from \"/@/utils\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { useI18n } from \"/src/locales\";\n\nconst { t } = useI18n();\ndefineOptions({\n  name: \"SettingSafe\",\n});\nconst settingsStore = useSettingStore();\nconst api = {\n  async SettingGet() {\n    return await request({\n      url: \"/sys/settings/safe/get\",\n      method: \"post\",\n    });\n  },\n  async SettingSave(data: any) {\n    return await request({\n      url: \"/sys/settings/safe/save\",\n      method: \"post\",\n      data,\n    });\n  },\n  async HiddenImmediate() {\n    return await request({\n      url: \"/sys/settings/safe/hidden\",\n      method: \"post\",\n    });\n  },\n};\n\nconst defaultState = {\n  hidden: {\n    enabled: false,\n    autoHiddenTimes: 5,\n    hiddenOpenApi: false,\n  },\n};\nconst formRef = ref<any>(defaultState);\ntype SiteHidden = {\n  enabled: boolean;\n  openPath?: string;\n  autoHiddenTimes?: number;\n  openPassword?: string;\n  hiddenOpenApi?: boolean;\n};\n\nconst formState = reactive<\n  Partial<{\n    hidden: SiteHidden;\n  }>\n>({\n  hidden: { enabled: false },\n});\n\nfunction changeOpenPath() {\n  formState.hidden.openPath = util.randomString(16);\n}\n\nasync function loadSettings() {\n  const data: any = await api.SettingGet();\n  merge(formState, defaultState, formState, data);\n  if (!formState.hidden.openPath) {\n    changeOpenPath();\n  }\n}\n\nloadSettings();\n\nconst openUrl = computed(() => {\n  const url = new URL(window.location.href);\n  url.pathname = `/api/unhidden/${formState.hidden?.openPath || \"\"}`;\n  //@ts-ignore\n  url.query = undefined;\n  url.hash = \"\";\n  return url.href;\n});\n\nconst onClick = async () => {\n  const form = await formRef.value.validateFields();\n  //密码md5\n  // if (form.hidden?.openPassword) {\n  //   form.hidden.openPassword = util.hash.md5(form.hidden.openPassword);\n  // }\n  await api.SettingSave(form);\n  await loadSettings();\n  notification.success({\n    message: t(\"certd.saveSuccess\"),\n  });\n};\n\nasync function doHiddenImmediate() {\n  Modal.confirm({\n    title: t(\"certd.confirmHideSiteTitle\"),\n    content: t(\"certd.confirmHideSiteContent\"),\n    async onOk() {\n      await api.HiddenImmediate();\n      notification.success({\n        message: t(\"certd.siteHiddenSuccess\"),\n      });\n    },\n  });\n}\n</script>\n<style lang=\"less\">\n.sys-settings-base {\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/site/api.ts",
    "content": "// @ts-ignore\nimport { request } from \"/src/api/service\";\nconst apiPrefix = \"/sys/site\";\n\nexport async function SettingsGet(key: string) {\n  return await request({\n    url: apiPrefix + \"/get\",\n    method: \"post\",\n  });\n}\n\nexport async function SettingsSave(setting: any) {\n  await request({\n    url: apiPrefix + \"/save\",\n    method: \"post\",\n    data: setting,\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/site/index.vue",
    "content": "<template>\n  <fs-page class=\"page-sys-settings page-sys-site\">\n    <template #header>\n      <div class=\"title\">站点个性化设置</div>\n    </template>\n    <div class=\"sys-settings-form\">\n      <a-form :model=\"formState\" name=\"basic\" :label-col=\"{ span: 8 }\" :wrapper-col=\"{ span: 16 }\" autocomplete=\"off\" @finish=\"onFinish\" @finish-failed=\"onFinishFailed\">\n        <a-form-item label=\"站点名称\" name=\"title\">\n          <a-input v-model:value=\"formState.title\" />\n        </a-form-item>\n        <a-form-item label=\"副标题/口号\" name=\"slogan\">\n          <a-input v-model:value=\"formState.slogan\" />\n        </a-form-item>\n        <a-form-item label=\"Logo\" name=\"logo\">\n          <fs-cropper-uploader v-model:model-value=\"formState.logo\" :cropper=\"cropperOptions\" value-type=\"key\" :uploader=\"uploaderConfig\" :build-url=\"buildUrl\" />\n        </a-form-item>\n        <a-form-item label=\"登录页Logo\" name=\"loginLogo\">\n          <fs-cropper-uploader v-model:model-value=\"formState.loginLogo\" :cropper=\"loginLogoCropperOptions\" value-type=\"key\" :uploader=\"uploaderConfig\" :build-url=\"buildUrl\" />\n        </a-form-item>\n        <a-form-item label=\"你的主体名称\" name=\"licenseTo\">\n          <a-input v-model:value=\"formState.licenseTo\" />\n          <div class=\"helper\">将会显示在底部</div>\n        </a-form-item>\n        <a-form-item label=\"你的主体URL\" name=\"licenseToUrl\">\n          <a-input v-model:value=\"formState.licenseToUrl\" />\n        </a-form-item>\n        <a-form-item label=\" \" :colon=\"false\" :wrapper-col=\"{ span: 8 }\">\n          <a-button :loading=\"saveLoading\" type=\"primary\" html-type=\"submit\">保存</a-button>\n        </a-form-item>\n      </a-form>\n\n      <!--      <a-descriptions label=\"系统维护操作\">-->\n      <!--        <a-descriptions-item label=\"自动化任务\">-->\n      <!--          <a-button @click=\"stopOtherUserTimer\">停止所有其他用户的定时任务</a-button>-->\n      <!--        </a-descriptions-item>-->\n      <!--      </a-descriptions>-->\n    </div>\n  </fs-page>\n</template>\n\n<script setup lang=\"ts\">\nimport { reactive, ref } from \"vue\";\nimport * as api from \"./api\";\nimport { notification } from \"ant-design-vue\";\nimport { useSettingStore } from \"/src/store/settings\";\nimport { useUserStore } from \"/@/store/user\";\nimport { merge } from \"lodash-es\";\n\ndefineOptions({\n  name: \"SiteSetting\",\n});\n\ninterface FormState {\n  title: string;\n  slogan: string;\n  logo: string;\n  loginLogo: string;\n  licenseTo: string;\n  licenseToUrl: string;\n}\n\nconst formState = reactive<Partial<FormState>>({});\n\nasync function loadSysSiteSettings() {\n  const data: any = await api.SettingsGet();\n  if (data == null) {\n    return;\n  }\n  merge(formState, data);\n}\nconst saveLoading = ref(false);\nloadSysSiteSettings();\nconst settingsStore = useSettingStore();\nconst onFinish = async (form: any) => {\n  saveLoading.value = true;\n  try {\n    await api.SettingsSave(form);\n    await loadSysSiteSettings();\n    await settingsStore.loadSysSettings();\n    notification.success({\n      message: \"保存成功\",\n    });\n  } finally {\n    saveLoading.value = false;\n  }\n};\n\nconst userStore = useUserStore();\nconst uploaderConfig = ref({\n  type: \"form\",\n  action: \"/basic/file/upload\",\n  name: \"file\",\n  headers: {\n    Authorization: \"Bearer \" + userStore.getToken,\n  },\n  successHandle(res: any) {\n    return res;\n  },\n});\n\nfunction buildUrl(key: string) {\n  return `/api/basic/file/download?&key=` + key;\n}\n\nfunction onFinishFailed(err: any) {\n  console.log(err);\n}\n\nconst cropperOptions = ref({\n  aspectRatio: 1,\n  autoCropArea: 1,\n  viewMode: 0,\n});\nconst loginLogoCropperOptions = ref({\n  aspectRatio: 3,\n  autoCropArea: 1,\n  viewMode: 0,\n});\n</script>\n\n<style lang=\"less\">\n.fs-cropper-dialog__preview img {\n  border-radius: 0 !important;\n  margin-top: 0 !important;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/product/api.ts",
    "content": "import { request } from \"/src/api/service\";\nconst apiPrefix = \"/sys/suite/product\";\nexport type PriceItem = {\n  duration: number;\n  price: number;\n};\n\nexport async function GetList(query: any) {\n  return await request({\n    url: apiPrefix + \"/page\",\n    method: \"post\",\n    data: query,\n  });\n}\n\nexport async function AddObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/add\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function UpdateObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/update\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function DelObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/delete\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/info\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetDetail(id: any) {\n  return await request({\n    url: apiPrefix + \"/detail\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function DeleteBatch(ids: any[]) {\n  return await request({\n    url: apiPrefix + \"/deleteByIds\",\n    method: \"post\",\n    data: { ids },\n  });\n}\n\nexport async function SetDefault(id: any) {\n  return await request({\n    url: apiPrefix + \"/setDefault\",\n    method: \"post\",\n    data: { id },\n  });\n}\n\nexport async function SetDisabled(id: any, disabled: boolean) {\n  return await request({\n    url: apiPrefix + \"/setDisabled\",\n    method: \"post\",\n    data: { id, disabled },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/product/crud.tsx",
    "content": "import * as api from \"./api\";\nimport { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport SuiteValue from \"./suite-value.vue\";\nimport SuiteValueEdit from \"./suite-value-edit.vue\";\nimport PriceEdit from \"./price-edit.vue\";\nimport DurationPriceValue from \"/@/views/sys/suite/product/duration-price-value.vue\";\nimport { useI18n } from \"/src/locales\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { t } = useI18n();\n  const emit = context.emit;\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  return {\n    crudOptions: {\n      table: {\n        onRefreshed: () => {\n          emit(\"refreshed\");\n        },\n      },\n      search: {\n        show: false,\n      },\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      pagination: {\n        show: false,\n        pageSize: 999999,\n      },\n      rowHandle: {\n        minWidth: 200,\n        fixed: \"right\",\n      },\n      form: {\n        group: {\n          groups: {\n            base: {\n              header: t(\"certd.basicInfo\"),\n              columns: [\"title\", \"type\", \"disabled\", \"order\", \"supportBuy\", \"intro\"]\n            },\n            content: {\n              header: t(\"certd.packageContent\"),\n              columns: [\"content.maxDomainCount\", \"content.maxPipelineCount\", \"content.maxDeployCount\", \"content.maxMonitorCount\"]\n            },\n            price: {\n              header: t(\"certd.price\"),\n              columns: [\"durationPrices\"]\n            },\n          },\n        },\n      },\n      columns: {\n        // id: {\n        //   title: \"ID\",\n        //   key: \"id\",\n        //   type: \"number\",\n        //   column: {\n        //     width: 100\n        //   },\n        //   form: {\n        //     show: false\n        //   }\n        // },\n        title: {\n          title: t(\"certd.packageName\"),\n          type: \"text\",\n          search: {\n            show: true,\n          },\n          form: {\n            rules: [{ required: true, message: t(\"certd.requiredField\") }],\n          },\n          column: {\n            width: 200,\n          },\n        },\n        type: {\n          title: t(\"certd.type\"),\n          type: \"dict-select\",\n          editForm: {\n            component: {\n              disabled: true,\n            },\n          },\n          dict: dict({\n            data: [\n              { label: t(\"certd.suite\"), value: \"suite\" },\n              { label: t(\"certd.addon\"), value: \"addon\" },\n            ],\n          }),\n          form: {\n            value: \"suite\",\n            rules: [{ required: true, message: t(\"certd.requiredField\") }],\n            helper: t(\"certd.typeHelper\"),\n          },\n          column: {\n            width: 80,\n            align: \"center\",\n          },\n          valueBuilder: ({ row }) => {\n            if (row.content) {\n              row.content = JSON.parse(row.content);\n            }\n            if (row.durationPrices) {\n              row.durationPrices = JSON.parse(row.durationPrices);\n            }\n          },\n          valueResolve: ({ form }) => {\n            if (form.content) {\n              form.content = JSON.stringify(form.content);\n            }\n            if (form.durationPrices) {\n              form.durationPrices = JSON.stringify(form.durationPrices);\n            }\n          },\n        },\n        \"content.maxDomainCount\": {\n          title: t(\"certd.domainCount\"),\n          type: \"text\",\n          form: {\n            key: [\"content\", \"maxDomainCount\"],\n            component: {\n              name: SuiteValueEdit,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unitCount\"),\n            },\n            rules: [{ required: true, message: t(\"certd.requiredField\") }],\n          },\n          column: {\n            width: 100,\n            component: {\n              name: SuiteValue,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unitCount\"),\n            },\n          },\n        },\n        \"content.maxPipelineCount\": {\n          title: t(\"certd.pipelineCount\"),\n          type: \"text\",\n          form: {\n            key: [\"content\", \"maxPipelineCount\"],\n            component: {\n              name: SuiteValueEdit,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unitPipeline\"),\n            },\n            rules: [{ required: true, message: t(\"certd.requiredField\") }],\n          },\n          column: {\n            width: 100,\n            component: {\n              name: SuiteValue,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unitPipeline\"),\n            },\n          },\n        },\n        \"content.maxDeployCount\": {\n          title: t(\"certd.deployCount\"),\n          type: \"text\",\n          form: {\n            key: [\"content\", \"maxDeployCount\"],\n            component: {\n              name: SuiteValueEdit,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unitDeploy\"),\n            },\n            rules: [{ required: true, message: t(\"certd.requiredField\") }],\n          },\n          column: {\n            width: 100,\n            component: {\n              name: SuiteValue,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unitDeploy\"),\n            },\n          },\n        },\n        \"content.maxMonitorCount\": {\n          title: t(\"certd.monitorCount\"),\n          type: \"text\",\n          form: {\n            key: [\"content\", \"maxMonitorCount\"],\n            component: {\n              name: SuiteValueEdit,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unitCount\"),\n            },\n            rules: [{ required: true, message: t(\"certd.requiredField\") }],\n          },\n          column: {\n            width: 120,\n            component: {\n              name: SuiteValue,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unitCount\"),\n            },\n          },\n        },\n        durationPrices: {\n          title: t(\"certd.durationPriceTitle\"),\n          type: \"text\",\n          form: {\n            title: t(\"certd.selectDuration\"),\n            component: {\n              name: PriceEdit,\n              vModel: \"modelValue\",\n              edit: true,\n              style: {\n                minHeight: \"120px\",\n              },\n            },\n            col: {\n              span: 24,\n            },\n            rules: [{ required: true, message: t(\"certd.requiredField\") }],\n          },\n          column: {\n            component: {\n              name: DurationPriceValue,\n              vModel: \"modelValue\",\n            },\n            width: 350,\n          },\n        },\n        supportBuy: {\n          title: t(\"certd.supportBuy\"),\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { label: t(\"certd.supportPurchase\"), value: true, color: \"success\" },\n              { label: t(\"certd.cannotPurchase\"), value: false, color: \"gray\" },\n            ],\n          }),\n          form: {\n            value: true,\n          },\n          column: {\n            width: 120,\n          },\n        },\n        disabled: {\n          title: t(\"certd.shelfStatus\"),\n          type: \"dict-radio\",\n          dict: dict({\n            data: [\n              { value: false, label: t(\"certd.onShelf\"), color: \"green\" },\n              { value: true, label: t(\"certd.offShelf\"), color: \"gray\" },\n            ],\n          }),\n          form: {\n            value: false,\n          },\n          column: {\n            width: 100,\n          },\n        },\n        order: {\n          title: t(\"certd.ordera\"),\n          type: \"number\",\n          form: {\n            helper: t(\"certd.orderHelper\"),\n            value: 0,\n          },\n          column: {\n            width: 100,\n          },\n        },\n        intro: {\n          title: t(\"certd.description\"),\n          type: \"textarea\",\n          column: {\n            width: 200,\n          },\n        },\n        createTime: {\n          title: t(\"certd.createTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 160,\n            align: \"center\",\n          },\n        },\n        updateTime: {\n          title: t(\"certd.updateTime\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            show: true,\n            width: 160,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/product/duration-price-value.vue",
    "content": "<template>\n  <div class=\"cd-duration-price-value\">\n    <a-tag v-for=\"item of modelValue\" :key=\"item.duration\" class=\"flex-o price-group-item m-2\">\n      <div style=\"width: 40px\">{{ durationDict.dataMap[item.duration]?.label }}:</div>\n      <price-input v-model=\"item.price\" :edit=\"false\" class=\"mr-5\" />\n    </a-tag>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { PriceItem } from \"./api\";\nimport PriceInput from \"./price-input.vue\";\nimport { durationDict } from \"../../../certd/suite/api\";\n\ndefineOptions({\n  name: \"DurationPriceValue\",\n});\n\nconst props = withDefaults(\n  defineProps<{\n    modelValue?: PriceItem[];\n  }>(),\n  {\n    modelValue: () => {\n      return [];\n    },\n  }\n);\n</script>\n<style lang=\"less\">\n.cd-duration-price-value {\n  display: flex;\n  flex-wrap: wrap;\n  item-align: center;\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/product/duration-value.vue",
    "content": "<template>\n  <a-tag color=\"green\"> {{ durationDict.dataMap[modelValue]?.label }}</a-tag>\n</template>\n\n<script lang=\"ts\" setup>\nimport { durationDict } from \"/@/views/certd/suite/api\";\n\ndefineOptions({\n  name: \"DurationValue\",\n});\nconst props = defineProps<{\n  modelValue: number;\n}>();\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/product/index.vue",
    "content": "<template>\n  <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n</template>\n\n<script lang=\"ts\" setup>\nimport { defineEmits, onActivated, onMounted, ref } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\n\ndefineOptions({\n  name: \"ProductManager\",\n});\nconst emit = defineEmits([\"refreshed\"]);\n\nconst context: any = { emit };\nconst { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context });\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(async () => {\n  await crudExpose.doRefresh();\n});\n</script>\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/product/price-edit.vue",
    "content": "<template>\n  <div class=\"cd-price-edit\">\n    <div v-if=\"edit\" class=\"duration-list flex-o\">\n      <div v-for=\"item of durationDict.data\" :key=\"item.value\" :class=\"{ active: isActive(item) }\" class=\"duration-item\" @click=\"onDurationClicked(item)\">\n        {{ item.label }}\n      </div>\n    </div>\n    <div class=\"price-group-list\">\n      <div v-for=\"item of modelValue\" :key=\"item.duration\" class=\"flex-o price-group-item\">\n        <div style=\"width: 50px\">{{ durationDict.dataMap[item.duration]?.label }}:</div>\n        <price-input v-model=\"item.price\" style=\"width: 150px\" :edit=\"edit\" class=\"mr-10\" />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Form } from \"ant-design-vue\";\nimport { PriceItem } from \"./api\";\nimport PriceInput from \"./price-input.vue\";\nimport { durationDict } from \"../../../certd/suite/api\";\nconst props = withDefaults(\n  defineProps<{\n    modelValue?: PriceItem[];\n    edit: boolean;\n  }>(),\n  {\n    modelValue: () => {\n      return [];\n    },\n  }\n);\n\nconst formItemContext = Form.useInjectFormItemContext();\n\nconst emit = defineEmits([\"update:modelValue\"]);\n\nfunction doEmit(value: PriceItem[]) {\n  emit(\"update:modelValue\", value);\n  formItemContext.onFieldChange();\n}\n\nfunction isActive(item: any) {\n  return props.modelValue.some(v => v.duration === item.value);\n}\n\nfunction onDurationClicked(item: any) {\n  const has = props.modelValue.some(v => v.duration === item.value);\n  if (has) {\n    // remove\n    const newValue = props.modelValue.filter(v => v.duration !== item.value);\n    doEmit(newValue);\n  } else {\n    // add\n    const newValue = [...props.modelValue, { duration: item.value, price: 0.0 }];\n    //sort\n    newValue.sort((a, b) => a.duration - b.duration);\n    if (newValue.length > 0) {\n      const first = newValue[0];\n      if (first.duration === -1) {\n        //挪到后面去\n        newValue.shift();\n        newValue.push(first);\n      }\n    }\n    doEmit(newValue);\n  }\n}\n</script>\n<style lang=\"less\">\n.cd-price-edit {\n  .duration-item {\n    border: 1px solid #eee;\n    padding: 2px;\n    width: 45px;\n    text-align: center;\n    cursor: pointer;\n\n    &.active {\n      background: #1890ff;\n      color: #fff;\n    }\n  }\n\n  .price-group-list {\n    display: flex;\n    flex-wrap: wrap;\n    .price-group-item {\n      margin-right: 10px;\n      margin-top: 10px;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/product/price-input.vue",
    "content": "<template>\n  <div class=\"flex-o price-input\">\n    <a-input-number v-if=\"edit\" prefix=\"¥\" :value=\"priceValue\" :precision=\"2\" class=\"ml-5\" @update:value=\"onPriceChange\"> </a-input-number>\n    <span v-else class=\"price-text\" :style=\"style\">{{ priceLabel }}</span>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed } from \"vue\";\nimport { utils } from \"/@/utils\";\nconst props = withDefaults(\n  defineProps<{\n    modelValue?: number;\n    edit?: boolean;\n    fontSize?: number;\n  }>(),\n  {\n    modelValue: 0,\n    edit: false,\n    fontSize: 14,\n  }\n);\n\nconst style = computed(() => {\n  if (props.fontSize == null) {\n    return {};\n  }\n  return {\n    fontSize: props.fontSize + \"px\",\n  };\n});\n\nconst priceValue = computed(() => {\n  if (props.modelValue == null) {\n    return 0;\n  }\n  return utils.amount.toYuan(props.modelValue);\n});\n\nconst priceLabel = computed(() => {\n  if (priceValue.value === 0) {\n    return \"免费\";\n  }\n  return `¥${priceValue.value}`;\n});\n\nconst emit = defineEmits([\"update:modelValue\"]);\n\nconst onPriceChange = (price: number) => {\n  emit(\"update:modelValue\", utils.amount.toCent(price));\n};\n</script>\n\n<style lang=\"less\">\n.price-input {\n  .price-text {\n    color: red;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/product/suite-value-edit.vue",
    "content": "<template>\n  <div class=\"cd-suite-value-edit flex-o\">\n    <div class=\"flex- 1\"><a-checkbox :checked=\"modelValue === -1\" @update:checked=\"onCheckedChange\">无限制</a-checkbox><span class=\"ml-5\"></span></div>\n    <div class=\"ml-10 w-50%\">\n      <a-input-number v-if=\"modelValue == null || modelValue >= 0\" :value=\"modelValue\" class=\"ml-5\" @update:value=\"onValueChange\">\n        <template v-if=\"unit\" #addonAfter>{{ unit }}</template>\n      </a-input-number>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Form } from \"ant-design-vue\";\n\nconst props = defineProps<{\n  modelValue?: number;\n  unit?: string;\n}>();\nconst formItemContext = Form.useInjectFormItemContext();\n\nconst emit = defineEmits([\"update:modelValue\"]);\n\nconst onCheckedChange = (checked: boolean) => {\n  const value = checked ? -1 : 1;\n  onValueChange(value);\n};\n\nfunction onValueChange(value: number) {\n  emit(\"update:modelValue\", value);\n  formItemContext.onFieldChange();\n}\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/product/suite-value.vue",
    "content": "<template>\n  <div v-if=\"target\" class=\"cd-suite-value\">\n    <a-tag :color=\"target.color\" class=\"m-0\">\n      <span v-if=\"used != null\">{{ used }} /</span>\n      {{ target.label }}\n    </a-tag>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed } from \"vue\";\n\nconst props = defineProps<{\n  modelValue: number;\n  unit?: string;\n  used?: number;\n}>();\n\nconst target = computed(() => {\n  if (props.modelValue == null) {\n    return {};\n  }\n  if (props.modelValue === -1) {\n    return {\n      value: -1,\n      label: \"无限制\",\n      color: \"green\",\n    };\n  } else if (props.modelValue === 0) {\n    return {\n      value: 0,\n      label: \"0\" + (props.unit || \"\"),\n      color: \"red\",\n    };\n  } else {\n    let color = \"blue\";\n    if (props.used != null) {\n      color = props.used >= props.modelValue ? \"red\" : \"green\";\n    }\n    return {\n      value: props.modelValue,\n      label: props.modelValue + (props.unit || \"\"),\n      color: color,\n    };\n  }\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/setting/index.vue",
    "content": "<template>\n  <fs-page class=\"page-sys-settings page-sys-settings-suite\">\n    <template #header>\n      <div class=\"title\">\n        套餐设置\n        <span class=\"sub\"> 需要<router-link :to=\"{ path: '/sys/settings', query: { tab: 'payment' } }\">开启至少一种支付方式</router-link></span>\n      </div>\n    </template>\n\n    <div class=\"form-content\">\n      <a-form ref=\"formRef\" :model=\"formState\" :label-col=\"{ style: { width: '150px' } }\" :wrapper-col=\"{ span: 20 }\" autocomplete=\"off\">\n        <a-form-item label=\"开启套餐功能\" name=\"enabled\" required>\n          <a-switch v-model:checked=\"formState.enabled\" />\n        </a-form-item>\n        <template v-if=\"formState.enabled\">\n          <a-form-item label=\"套餐列表\" name=\"enabled\">\n            <div style=\"height: 400px\">\n              <ProductManager @refreshed=\"onTableRefresh\"></ProductManager>\n            </div>\n            <div class=\"helper\">不建议设置免费套餐，可以在下方配置注册赠送套餐，或者在用户套餐管理中手动赠送套餐</div>\n          </a-form-item>\n\n          <a-form-item label=\"注册赠送套餐\" name=\"registerGift\">\n            <suite-duration-selector ref=\"suiteDurationSelectedRef\" v-model=\"formState.registerGift\"></suite-duration-selector>\n            <div class=\"helper\">添加套餐后再选择</div>\n          </a-form-item>\n          <a-form-item label=\"套餐说明\" name=\"intro\">\n            <a-textarea v-model:value=\"formState.intro\" :rows=\"3\"></a-textarea>\n            <div class=\"helper\">将显示在套餐购买页面</div>\n          </a-form-item>\n        </template>\n\n        <a-form-item label=\" \" :colon=\"false\">\n          <loading-button type=\"primary\" html-type=\"button\" :click=\"onClick\">保存</loading-button>\n          <div class=\"helper\">需要 <router-link :to=\"{ path: '/sys/settings', query: { tab: 'payment' } }\">开启至少一种支付方式</router-link></div>\n        </a-form-item>\n      </a-form>\n    </div>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { reactive, ref } from \"vue\";\nimport { merge } from \"lodash-es\";\nimport { notification } from \"ant-design-vue\";\nimport { request } from \"/@/api/service\";\nimport SuiteDurationSelector from \"/@/views/sys/suite/setting/suite-duration-selector.vue\";\nimport ProductManager from \"/@/views/sys/suite/product/index.vue\";\nimport { useSettingStore } from \"/@/store/settings\";\n\ndefineOptions({\n  name: \"SettingsSuite\",\n});\n\nconst api = {\n  async SuiteSettingGet() {\n    return await request({\n      url: \"/sys/settings/suite/get\",\n      method: \"post\",\n    });\n  },\n  async SuiteSettingSave(data: any) {\n    return await request({\n      url: \"/sys/settings/suite/save\",\n      method: \"post\",\n      data,\n    });\n  },\n};\n\nconst formRef = ref<any>(null);\nconst formState = reactive<\n  Partial<{\n    enabled: boolean;\n    registerGift?: {\n      productId?: number;\n      duration?: number;\n    };\n    intro?: string;\n  }>\n>({ enabled: false });\n\nasync function loadSettings() {\n  const data: any = await api.SuiteSettingGet();\n  merge(formState, data);\n}\n\nconst settingsStore = useSettingStore();\nloadSettings();\nconst onClick = async () => {\n  const form = await formRef.value.validateFields();\n  await api.SuiteSettingSave(form);\n  await loadSettings();\n  await settingsStore.loadSysSettings();\n  notification.success({\n    message: \"保存成功\",\n  });\n};\n\nconst suiteDurationSelectedRef = ref();\nfunction onTableRefresh() {\n  suiteDurationSelectedRef.value?.refresh();\n}\n</script>\n\n<style lang=\"less\">\n.page-sys-settings-suite {\n  .form-content {\n    padding: 20px;\n    .ant-table-body {\n      height: 400px !important;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/setting/suite-duration-selector.vue",
    "content": "<template>\n  <fs-dict-select style=\"width: 200px\" :value=\"selectedValue\" :dict=\"suiteDictRef\" @selected-change=\"onSelectedChange\"></fs-dict-select>\n</template>\n<script setup lang=\"ts\">\nimport { durationDict } from \"/@/views/certd/suite/api\";\nimport { ref, watch } from \"vue\";\nimport { dict } from \"@fast-crud/fast-crud\";\nimport { request } from \"/@/api/service\";\n\ndefineOptions({\n  name: \"SuiteDurationSelector\",\n});\n\nconst props = defineProps<{\n  modelValue?: {\n    productId?: number;\n    duration?: number;\n  };\n}>();\n\nconst suiteDictRef = dict({\n  async getData() {\n    const res = await request({\n      url: \"/sys/suite/product/list\",\n      method: \"post\",\n    });\n    const options: any = [\n      {\n        value: \"\",\n        label: \"不赠送\",\n      },\n    ];\n    res.forEach((item: any) => {\n      const durationPrices = JSON.parse(item.durationPrices);\n      for (const dp of durationPrices) {\n        const value = item.id + \"_\" + dp.duration;\n        options.push({\n          label: `${item.title}<${durationDict.dataMap[dp.duration]?.label}>`,\n          value: value,\n          target: {\n            productId: item.id,\n            duration: dp.duration,\n          },\n        });\n      }\n    });\n    return options;\n  },\n});\n\nconst selectedValue = ref();\nwatch(\n  () => {\n    return props.modelValue;\n  },\n  value => {\n    if (value && value.productId && value.duration) {\n      selectedValue.value = value.productId + \"_\" + value.duration;\n    } else {\n      selectedValue.value = \"\";\n    }\n  },\n  {\n    immediate: true,\n  }\n);\n\nconst emit = defineEmits([\"update:modelValue\"]);\nconst onSelectedChange = (value: any) => {\n  selectedValue.value = value;\n  if (!value) {\n    emit(\"update:modelValue\", undefined);\n    return;\n  }\n  const arr = value.value.split(\"_\");\n  emit(\"update:modelValue\", {\n    productId: parseInt(arr[0]),\n    duration: parseInt(arr[1]),\n  });\n};\n\ndefineExpose({\n  refresh() {\n    suiteDictRef.reloadDict();\n  },\n});\n</script>\n\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/trade/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/sys/suite/trade\";\n\nexport async function GetList(query: any) {\n  return await request({\n    url: apiPrefix + \"/page\",\n    method: \"post\",\n    data: query,\n  });\n}\n\nexport async function AddObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/add\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function UpdateObj(obj: any) {\n  return await request({\n    url: apiPrefix + \"/update\",\n    method: \"post\",\n    data: obj,\n  });\n}\n\nexport async function DelObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/delete\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetObj(id: any) {\n  return await request({\n    url: apiPrefix + \"/info\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function GetDetail(id: any) {\n  return await request({\n    url: apiPrefix + \"/detail\",\n    method: \"post\",\n    params: { id },\n  });\n}\n\nexport async function DeleteBatch(ids: any[]) {\n  return await request({\n    url: apiPrefix + \"/deleteByIds\",\n    method: \"post\",\n    data: { ids },\n  });\n}\n\nexport async function UpdatePaid(id: any) {\n  return await request({\n    url: apiPrefix + \"/updatePaid\",\n    method: \"post\",\n    data: { id },\n  });\n}\n\nexport async function SyncStatus(id: any) {\n  return await request({\n    url: apiPrefix + \"/syncStatus\",\n    method: \"post\",\n    data: { id },\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/trade/crud.tsx",
    "content": "import * as api from \"./api\";\nimport { useI18n } from \"/src/locales\";\nimport { computed, Ref, ref } from \"vue\";\nimport { useRouter } from \"vue-router\";\nimport { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes, utils } from \"@fast-crud/fast-crud\";\nimport { useUserStore } from \"/@/store/user\";\nimport { useSettingStore } from \"/@/store/settings\";\nimport { Modal } from \"ant-design-vue\";\nimport DurationValue from \"/@/views/sys/suite/product/duration-value.vue\";\nimport PriceInput from \"/@/views/sys/suite/product/price-input.vue\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const router = useRouter();\n  const { t } = useI18n();\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async ({ form, row }: EditReq) => {\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async ({ row }: DelReq) => {\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async ({ form }: AddReq) => {\n    const res = await api.AddObj(form);\n    return res;\n  };\n\n  const userStore = useUserStore();\n  const settingStore = useSettingStore();\n  const selectedRowKeys: Ref<any[]> = ref([]);\n  context.selectedRowKeys = selectedRowKeys;\n\n  return {\n    crudOptions: {\n      settings: {\n        plugins: {\n          //这里使用行选择插件，生成行选择crudOptions配置，最终会与crudOptions合并\n          rowSelection: {\n            enabled: true,\n            order: -2,\n            before: true,\n            // handle: (pluginProps,useCrudProps)=>CrudOptions,\n            props: {\n              multiple: true,\n              crossPage: true,\n              selectedRowKeys,\n            },\n          },\n        },\n      },\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      actionbar: {\n        buttons: {\n          add: {\n            show: false,\n          },\n        },\n      },\n      toolbar: { show: false },\n      rowHandle: {\n        width: 320,\n        fixed: \"right\",\n        buttons: {\n          view: {\n            show: false,\n          },\n          copy: {\n            show: false,\n          },\n          edit: {\n            show: false,\n          },\n          syncStatus: {\n            show: compute(({ row }) => {\n              return row.status === \"wait_pay\";\n            }),\n            text: \"同步订单状态\",\n            type: \"link\",\n            click: async ({ row }) => {\n              Modal.confirm({\n                title: \"确认\",\n                content: \"确认同步订单状态？\",\n                onOk: async () => {\n                  await api.SyncStatus(row.id);\n                  await crudExpose.doRefresh();\n                },\n              });\n            },\n          },\n          updatePaid: {\n            show: compute(({ row }) => {\n              return row.status === \"wait_pay\";\n            }),\n            text: \"确认已支付\",\n            type: \"link\",\n            click({ row }) {\n              Modal.confirm({\n                title: \"确认\",\n                content: \"确认修改订单状态为已支付？\",\n                onOk: async () => {\n                  await api.UpdatePaid(row.id);\n                  await crudExpose.doRefresh();\n                },\n              });\n            },\n          },\n        },\n      },\n      tabs: {\n        name: \"status\",\n        show: true,\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          column: {\n            width: 100,\n          },\n          form: {\n            show: false,\n          },\n        },\n        tradeNo: {\n          title: \"订单号\",\n          type: \"text\",\n          search: { show: true },\n          form: {\n            show: false,\n          },\n          column: {\n            width: 250,\n          },\n        },\n        title: {\n          title: \"商品名称\",\n          type: \"text\",\n          search: { show: true },\n          column: {\n            width: 150,\n          },\n        },\n        duration: {\n          title: \"时长\",\n          type: \"number\",\n          column: {\n            width: 100,\n            component: {\n              name: DurationValue,\n              vModel: \"modelValue\",\n            },\n            align: \"center\",\n          },\n        },\n        amount: {\n          title: \"金额\",\n          type: \"number\",\n          column: {\n            width: 100,\n            component: {\n              name: PriceInput,\n              vModel: \"modelValue\",\n              edit: false,\n            },\n          },\n        },\n        status: {\n          title: \"状态\",\n          search: { show: true },\n          type: \"dict-select\",\n          dict: dict({\n            data: [\n              { label: \"待支付\", value: \"wait_pay\", color: \"warning\" },\n              { label: \"已支付\", value: \"paid\", color: \"success\" },\n              { label: \"已关闭\", value: \"closed\", color: \"error\" },\n            ],\n          }),\n          column: {\n            width: 100,\n            align: \"center\",\n          },\n        },\n        payType: {\n          title: \"支付方式\",\n          search: { show: true },\n          type: \"dict-select\",\n          dict: dict({\n            data: [\n              { label: \"聚合支付\", value: \"yizhifu\" },\n              { label: \"支付宝\", value: \"alipay\" },\n              { label: \"微信\", value: \"wxpay\" },\n              { label: \"免费\", value: \"free\" },\n            ],\n          }),\n          column: {\n            width: 100,\n            component: {\n              color: \"auto\",\n            },\n            align: \"center\",\n          },\n        },\n        payTime: {\n          title: \"支付时间\",\n          type: \"datetime\",\n          column: {\n            width: 160,\n          },\n        },\n        createTime: {\n          title: \"创建时间\",\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 160,\n            align: \"center\",\n          },\n        },\n        updateTime: {\n          title: \"更新时间\",\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            show: true,\n            width: 160,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/trade/index.vue",
    "content": "<template>\n  <fs-page class=\"page-cert\">\n    <template #header>\n      <div class=\"title\">\n        订单管理\n        <span class=\"sub\"> </span>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\">\n      <template #pagination-left>\n        <a-tooltip title=\"批量删除\">\n          <fs-button icon=\"DeleteOutlined\" @click=\"handleBatchDelete\"></fs-button>\n        </a-tooltip>\n      </template>\n    </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\nimport { message, Modal } from \"ant-design-vue\";\nimport { DeleteBatch } from \"./api\";\n\ndefineOptions({\n  name: \"TradeManager\",\n});\nconst { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions });\n\nconst selectedRowKeys = context.selectedRowKeys;\nconst handleBatchDelete = () => {\n  if (selectedRowKeys.value?.length > 0) {\n    Modal.confirm({\n      title: \"确认\",\n      content: `确定要批量删除这${selectedRowKeys.value.length}条记录吗`,\n      async onOk() {\n        await DeleteBatch(selectedRowKeys.value);\n        message.info(\"删除成功\");\n        crudExpose.doRefresh();\n        selectedRowKeys.value = [];\n      },\n    });\n  } else {\n    message.error(\"请先勾选记录\");\n  }\n};\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(async () => {\n  await crudExpose.doRefresh();\n});\n</script>\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/user-suite/api.ts",
    "content": "import { request } from \"/src/api/service\";\n\nconst apiPrefix = \"/sys/suite/user-suite\";\nexport const sysUserSuiteApi = {\n  async GetList(query: any) {\n    return await request({\n      url: apiPrefix + \"/page\",\n      method: \"post\",\n      data: query,\n    });\n  },\n\n  async AddObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/add\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async UpdateObj(obj: any) {\n    return await request({\n      url: apiPrefix + \"/update\",\n      method: \"post\",\n      data: obj,\n    });\n  },\n\n  async DelObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/delete\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n\n  async GetObj(id: number) {\n    return await request({\n      url: apiPrefix + \"/info\",\n      method: \"post\",\n      params: { id },\n    });\n  },\n  async ListAll() {\n    return await request({\n      url: apiPrefix + \"/all\",\n      method: \"post\",\n    });\n  },\n\n  async GetSimpleUserByIds(ids: number[]) {\n    return await request({\n      url: \"/sys/authority/user/getSimpleUserByIds\",\n      method: \"post\",\n      data: { ids },\n    });\n  },\n  async PresentSuite(form: any) {\n    return await request({\n      url: apiPrefix + \"/presentSuite\",\n      method: \"post\",\n      data: form,\n    });\n  },\n};\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/user-suite/crud.tsx",
    "content": "import { AddReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from \"@fast-crud/fast-crud\";\nimport { sysUserSuiteApi } from \"./api\";\nimport { useRouter } from \"vue-router\";\nimport SuiteValueEdit from \"/@/views/sys/suite/product/suite-value-edit.vue\";\nimport SuiteValue from \"/@/views/sys/suite/product/suite-value.vue\";\nimport DurationValue from \"/@/views/sys/suite/product/duration-value.vue\";\nimport createCrudOptionsUser from \"/@/views/sys/authority/user/crud\";\nimport UserSuiteStatus from \"/@/views/certd/suite/mine/user-suite-status.vue\";\nimport SuiteDurationSelector from \"../setting/suite-duration-selector.vue\";\nimport dayjs from \"dayjs\";\nimport { useI18n } from \"/src/locales\";\n\nexport default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {\n  const { t } = useI18n();\n  const api = sysUserSuiteApi;\n  const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {\n    return await api.GetList(query);\n  };\n  const editRequest = async (req: EditReq) => {\n    const { form, row } = req;\n    form.id = row.id;\n    const res = await api.UpdateObj(form);\n    return res;\n  };\n  const delRequest = async (req: DelReq) => {\n    const { row } = req;\n    return await api.DelObj(row.id);\n  };\n\n  const addRequest = async (req: AddReq) => {\n    const { form } = req;\n    const res = await api.PresentSuite(form);\n    return res;\n  };\n\n  const router = useRouter();\n\n  return {\n    crudOptions: {\n      request: {\n        pageRequest,\n        addRequest,\n        editRequest,\n        delRequest,\n      },\n      form: {\n        labelCol: {\n          //固定label宽度\n          span: null,\n          style: {\n            width: \"100px\",\n          },\n        },\n        col: {\n          span: 22,\n        },\n        wrapper: {\n          width: 600,\n        },\n      },\n      actionbar: {\n        buttons: {\n          add: { text: t(\"certd.gift_package\") },\n        },\n      },\n\n      toolbar: { show: false },\n      rowHandle: {\n        width: 200,\n        fixed: \"right\",\n        buttons: {\n          view: { show: true },\n          copy: { show: false },\n          edit: { show: false },\n          remove: { show: true },\n          // continue:{\n          //   text:\"续期\",\n          //   type:\"link\",\n          //   click(){\n          //     console.log(\"续期\");\n          //   }\n          // }\n        },\n      },\n      columns: {\n        id: {\n          title: \"ID\",\n          key: \"id\",\n          type: \"number\",\n          search: {\n            show: false,\n          },\n          column: {\n            width: 100,\n            editable: {\n              disabled: true,\n            },\n          },\n          form: {\n            show: false,\n          },\n        },\n        title: {\n          title: t(\"certd.package_name\"),\n          type: \"text\",\n          search: {\n            show: true,\n          },\n          form: {\n            show: false,\n          },\n          column: {\n            width: 200,\n          },\n        },\n        userId: {\n          title: t(\"certd.usera\"),\n          type: \"table-select\",\n          search: {\n            show: true,\n          },\n          dict: dict({\n            async getNodesByValues(ids: number[]) {\n              return await api.GetSimpleUserByIds(ids);\n            },\n            value: \"id\",\n            label: \"nickName\",\n          }),\n          form: {\n            component: {\n              crossPage: true,\n              multiple: false,\n              select: {\n                placeholder: t(\"certd.click_to_select\"),\n              },\n              createCrudOptions: createCrudOptionsUser,\n              // crudOptionsOverride: crudOptionsOverride\n            },\n          },\n        },\n        //赠送\n        presentSuiteId: {\n          title: t(\"certd.gift_package\"),\n          type: \"dict-select\",\n          column: { show: false },\n          addForm: {\n            show: true,\n            component: {\n              name: SuiteDurationSelector,\n              vModel: \"modelValue\",\n            },\n            rules: [\n              {\n                validator: async (rule, value) => {\n                  if (value && value.productId) {\n                    return true;\n                  }\n                  throw new Error(t(\"certd.please_select_package\"));\n                },\n              },\n            ],\n          },\n          valueResolve({ form, value }) {\n            if (value && value.productId) {\n              form.productId = value.productId;\n              form.duration = value.duration;\n            }\n          },\n          form: { show: false },\n        },\n        productType: {\n          title: t(\"certd.type\"),\n          type: \"dict-select\",\n          editForm: {\n            component: {\n              disabled: true,\n            },\n          },\n          dict: dict({\n            data: [\n              { label: t(\"certd.package\"), value: \"suite\", color: \"green\" },\n              { label: t(\"certd.addon_package\"), value: \"addon\", color: \"blue\" },\n            ],\n          }),\n          form: {\n            show: false,\n          },\n          column: {\n            width: 80,\n            align: \"center\",\n          },\n          valueBuilder: ({ row }) => {\n            if (row.content) {\n              row.content = JSON.parse(row.content);\n            }\n          },\n          valueResolve: ({ form }) => {\n            if (form.content) {\n              form.content = JSON.stringify(form.content);\n            }\n          },\n        },\n        \"content.maxDomainCount\": {\n          title: t(\"certd.domain_count\"),\n          type: \"text\",\n          form: {\n            show: false,\n            key: [\"content\", \"maxDomainCount\"],\n            component: {\n              name: SuiteValueEdit,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unit_count\"),\n            },\n            rules: [{ required: true, message: t(\"certd.field_required\") }],\n          },\n          column: {\n            width: 100,\n            component: {\n              name: SuiteValue,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unit_count\"),\n            },\n            align: \"center\",\n          },\n        },\n        \"content.maxPipelineCount\": {\n          title: t(\"certd.pipeline_count\"),\n          type: \"text\",\n          form: {\n            show: false,\n            key: [\"content\", \"maxPipelineCount\"],\n            component: {\n              name: SuiteValueEdit,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unit_item\"),\n            },\n            rules: [{ required: true, message: t(\"certd.field_required\") }],\n          },\n          column: {\n            width: 100,\n            component: {\n              name: SuiteValue,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unit_item\"),\n            },\n            align: \"center\",\n          },\n        },\n        \"content.maxDeployCount\": {\n          title: t(\"certd.deploy_count\"),\n          type: \"text\",\n          form: {\n            show: false,\n            key: [\"content\", \"maxDeployCount\"],\n            component: {\n              name: SuiteValueEdit,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unit_times\"),\n            },\n            rules: [{ required: true, message: t(\"certd.field_required\") }],\n          },\n          column: {\n            width: 100,\n            component: {\n              name: SuiteValue,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unit_times\"),\n              used: compute(({ row }) => {\n                return row.deployCountUsed;\n              }),\n            },\n            align: \"center\",\n          },\n        },\n        \"content.maxMonitorCount\": {\n          title: t(\"certd.monitor_count\"),\n          type: \"text\",\n          form: {\n            show: false,\n            key: [\"content\", \"maxMonitorCount\"],\n            component: {\n              name: SuiteValueEdit,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unit_count\"),\n            },\n            rules: [{ required: true, message: t(\"certd.field_required\") }],\n          },\n          column: {\n            width: 120,\n            component: {\n              name: SuiteValue,\n              vModel: \"modelValue\",\n              unit: t(\"certd.unit_count\"),\n            },\n            align: \"center\",\n          },\n        },\n        duration: {\n          title: t(\"certd.duration\"),\n          type: \"text\",\n          form: { show: false },\n          column: {\n            component: {\n              name: DurationValue,\n              vModel: \"modelValue\",\n            },\n            width: 100,\n            align: \"center\",\n          },\n        },\n        status: {\n          title: t(\"certd.status\"),\n          type: \"text\",\n          form: { show: false },\n          column: {\n            width: 100,\n            align: \"center\",\n            component: {\n              name: UserSuiteStatus,\n              userSuite: compute(({ row }) => {\n                return row;\n              }),\n            },\n            conditionalRender: {\n              match() {\n                return false;\n              },\n            },\n          },\n        },\n        activeTime: {\n          title: t(\"certd.active_time\"),\n          type: \"date\",\n          column: {\n            width: 150,\n          },\n          form: {\n            show: false,\n          },\n        },\n        expiresTime: {\n          title: t(\"certd.expires_time\"),\n          type: \"date\",\n          form: {\n            show: false,\n          },\n          column: {\n            width: 150,\n            component: {\n              name: \"expires-time-text\",\n              vModel: \"value\",\n              mode: \"tag\",\n              title: compute(({ value }) => {\n                return dayjs(value).format(\"YYYY-MM-DD HH:mm:ss\");\n              }),\n            },\n          },\n        },\n        isPresent: {\n          title: t(\"certd.is_present\"),\n          type: \"dict-switch\",\n          dict: dict({\n            data: [\n              { label: t(\"certd.is_present_yes\"), value: true, color: \"success\" },\n              { label: t(\"certd.is_present_no\"), value: false, color: \"blue\" },\n            ],\n          }),\n          form: {\n            value: true,\n            show: false,\n          },\n          column: {\n            width: 100,\n            align: \"center\",\n          },\n        },\n        createTime: {\n          title: t(\"certd.create_time\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            sorter: true,\n            width: 160,\n            align: \"center\",\n          },\n        },\n        updateTime: {\n          title: t(\"certd.update_time\"),\n          type: \"datetime\",\n          form: {\n            show: false,\n          },\n          column: {\n            show: true,\n            width: 160,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-client/src/views/sys/suite/user-suite/index.vue",
    "content": "<template>\n  <fs-page>\n    <template #header>\n      <div class=\"title\">\n        用户套餐\n        <span class=\"sub\">管理用户的套餐</span>\n      </div>\n    </template>\n    <fs-crud ref=\"crudRef\" v-bind=\"crudBinding\"> </fs-crud>\n  </fs-page>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onActivated, onMounted } from \"vue\";\nimport { useFs } from \"@fast-crud/fast-crud\";\nimport createCrudOptions from \"./crud\";\n\ndefineOptions({\n  name: \"UserSuites\",\n});\nconst { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: {} });\n\n// 页面打开后获取列表数据\nonMounted(() => {\n  crudExpose.doRefresh();\n});\nonActivated(() => {\n  crudExpose.doRefresh();\n});\n</script>\n"
  },
  {
    "path": "packages/ui/certd-client/tailwind.config.mjs",
    "content": "export { default } from \"./build/tailwind-config/index.mjs\";\n"
  },
  {
    "path": "packages/ui/certd-client/tests/unit/example.spec.ts",
    "content": "import { expect } from 'chai'\nimport { shallowMount } from '@vue/test-utils'\nimport HelloWorld from '@/components/HelloWorld.vue'\n\ndescribe('HelloWorld.vue', () => {\n  it('renders props.msg when passed', () => {\n    const msg = 'new message'\n    const wrapper = shallowMount(HelloWorld, {\n      props: { msg }\n    })\n    expect(wrapper.text()).to.include(msg)\n  })\n})\n"
  },
  {
    "path": "packages/ui/certd-client/tsconfig.json",
    "content": "{\n  \"compileOnSave\": true,\n  \"compilerOptions\": {\n    // 这样就可以对 `this` 上的数据属性进行更严格的推断`\n    \"noImplicitAny\": true,\n    \"allowJs\": true,\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"strict\": true,\n    \"jsx\": \"preserve\",\n    \"importHelpers\": true,\n    \"moduleResolution\": \"node\",\n    \"experimentalDecorators\": true,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strictNullChecks\" :false,\n    \"sourceMap\": true,\n    \"baseUrl\": \".\",\n    \"outDir\": \"./dist/ts\",\n    \"types\": [\n      \"vite/client\",\n      \"mocha\",\n      \"chai\",\n      \"node\",\n      \"unplugin-vue-define-options/macros-global\"\n    ],\n    \"paths\": {\n      \"/@/*\": [\"src/*\"],\n      \"/src/*\": [\"src/*\"],\n      \"/#/*\": [\"types/*\"]\n    },\n    \"lib\": [\n      \"esnext\",\n      \"dom\",\n      \"dom.iterable\",\n      \"scripthost\"\n    ]\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"src/**/*.tsx\",\n    \"src/**/*.vue\",\n    \"tests/**/*.ts\",\n    \"tests/**/*.tsx\"\n  ],\n  \"exclude\": [\n    \"node_modules\",\n    \"vite.config.ts\"\n  ]\n}\n"
  },
  {
    "path": "packages/ui/certd-client/vite.config.ts",
    "content": "import vue from \"@vitejs/plugin-vue\";\nimport vueJsx from \"@vitejs/plugin-vue-jsx\";\nimport visualizer from \"rollup-plugin-visualizer\";\nimport viteCompression from \"vite-plugin-compression\";\nimport { createHtmlPlugin } from \"vite-plugin-html\";\nimport { loadEnv } from \"vite\";\nimport * as path from \"path\";\nimport DefineOptions from \"unplugin-vue-define-options/vite\";\n// import WindiCSS from \"vite-plugin-windicss\";\n// import { generateModifyVars } from \"./build/modify-vars\";\n// import { configThemePlugin } from \"./build/theme-plugin\";\n// import OptimizationPersist from \"vite-plugin-optimize-persist\";\n// https://vitejs.dev/config/\n// 增加环境变量 _\nprocess.env.VITE_APP_VERSION = require(\"./package.json\").version;\nprocess.env.VITE_APP_BUILD_TIME = require(\"dayjs\")().format(\"YYYY-M-D HH:mm:ss\");\nimport * as https from \"node:https\";\n\nexport default ({ command, mode }) => {\n  console.log(\"args\", command, mode);\n  const env = loadEnv(mode, process.cwd());\n  const devServerFs: any = {};\n  const devAlias: any[] = [];\n  const base = \"./\";\n  // if (mode.startsWith(\"dev\")) {\n  //   base = \"./\";\n  // }\n  return {\n    base: base,\n    plugins: [\n      DefineOptions(),\n      vueJsx(),\n      vue(),\n      createHtmlPlugin({\n        inject: {\n          data: {\n            title: env.VITE_APP_TITLE,\n            projectPath: env.VITE_APP_PROJECT_PATH,\n            version: env.VITE_APP_VERSION,\n          },\n        },\n      }),\n      // 压缩build后的代码\n      viteCompression(),\n      //主题色替换\n      //...configThemePlugin(true),\n      // viteThemePlugin({\n      //   // Match the color to be modified\n      //   colorVariables: [\"#1890ff\", \"#40a9ff\"]\n      // }),\n      // windicss tailwindcss\n      // WindiCSS()\n    ],\n    esbuild: {\n      drop: command === \"build\" ? [\"debugger\"] : [],\n      pure: [\"console.log\", \"debugger\"],\n      jsxFactory: \"h\",\n      jsxFragment: \"Fragment\",\n    },\n    resolve: {\n      alias: [...devAlias, { find: \"/@\", replacement: path.resolve(\"./src\") }, { find: \"/#\", replacement: path.resolve(\"./types\") }],\n      dedupe: [\"vue\"],\n    },\n    optimizeDeps: {\n      include: [\"ant-design-vue\"],\n    },\n    build: {\n      rollupOptions: {\n        plugins: [visualizer()],\n      },\n    },\n    css: {\n      preprocessorOptions: {\n        less: {\n          // 修改默认主题颜色，配置less变量\n          // modifyVars: generateModifyVars(),\n          javascriptEnabled: true,\n          // modifyVars: mapToken\n        },\n      },\n    },\n    server: {\n      host: \"0.0.0.0\",\n      port: 3008,\n      fs: devServerFs,\n      proxy: {\n        // with options\n        \"/api\": {\n          //配套后端 https://github.com/fast-crud/fs-server-js\n          target: \"https://127.0.0.1:7002\",\n          //忽略证书\n          agent: new https.Agent({ rejectUnauthorized: false }),\n        },\n      },\n    },\n  };\n};\n"
  },
  {
    "path": "packages/ui/certd-server/.dockerignore",
    "content": "logs/\nnpm-debug.log\nyarn-error.log\nnode_modules/\npackage-lock.json\nyarn.lock\ncoverage/\n!dist/\n.idea/\nrun/\n.DS_Store\n*.sw*\n*.un~\n.tsbuildinfo\n.tsbuildinfo.*\n/data/db.sqlite\n*/node_modules\ncertd-server/tools/windows/\n.clinic\n"
  },
  {
    "path": "packages/ui/certd-server/.editorconfig",
    "content": "# 🎨 editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_style = space\nindent_size = 2\ntrim_trailing_whitespace = true\ninsert_final_newline = true"
  },
  {
    "path": "packages/ui/certd-server/.eslintrc",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"plugins\": [\n    \"@typescript-eslint\"\n  ],\n  \"extends\": [\n    \"plugin:@typescript-eslint/recommended\",\n    \"plugin:prettier/recommended\",\n    \"prettier\"\n  ],\n  \"env\": {\n    \"mocha\": true\n  },\n  \"rules\": {\n    \"@typescript-eslint/no-var-requires\": \"off\",\n    \"@typescript-eslint/ban-ts-comment\": \"off\",\n    \"@typescript-eslint/ban-ts-ignore\": \"off\",\n    \"@typescript-eslint/no-explicit-any\": \"off\",\n    \"@typescript-eslint/no-empty-function\": \"off\"\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/.gitattributes",
    "content": "\n\n"
  },
  {
    "path": "packages/ui/certd-server/.gitignore",
    "content": "logs/\nnpm-debug.log\nyarn-error.log\nnode_modules/\ncoverage/\ndist/\n.idea/\nrun/\n.DS_Store\n*.sw*\n*.un~\n.tsbuildinfo\n.tsbuildinfo.*\n\n/test/**/*.js\n/test/setup.js\n/test/setup.ts\n/data/\n.clinic\n\n.env.pgpl.yaml\ntools/lego/*\n!tools/lego/readme.md\ntest.mjs\n"
  },
  {
    "path": "packages/ui/certd-server/.mocharc.json",
    "content": "{\n  \"extension\": [\"ts\"],\n  \"node-option\": [\"no-warnings\", \"loader=ts-node/esm\"],\n  \"spec\": [\"test/**/*.test.ts\"],\n  \"require\": [\"test/setup.ts\"]\n}"
  },
  {
    "path": "packages/ui/certd-server/.npmrc",
    "content": "link-workspace-packages=deep\nprefer-workspace-packages=true\n"
  },
  {
    "path": "packages/ui/certd-server/.prettierrc",
    "content": "{\n  \"printWidth\": 220,\n  \"bracketSpacing\": true,\n  \"singleQuote\": false,\n  \"trailingComma\": \"es5\",\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "packages/ui/certd-server/CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://conventionalcommits.org) for commit guidelines.\n\n## [1.36.10](https://github.com/certd/certd/compare/v1.36.9...v1.36.10) (2025-07-18)\n\n### Bug Fixes\n\n* 企业微信通知改成text类型，因为markdown类型不支持@用户 ([747d266](https://github.com/certd/certd/commit/747d26674248082e678a3fd5ecc94712641a2716))\n* api接口获取不到证书的bug ([05a33a0](https://github.com/certd/certd/commit/05a33a0ec9999e2802f6c7b23cc1c61a2b9e963d))\n\n### Performance Improvements\n\n* 部署到阿里云oss插件支持选择上传到阿里云cas中的证书 ([2ea2c8c](https://github.com/certd/certd/commit/2ea2c8c05fc40f79595f1bbde67c1413558bf684))\n* 账号即将过期通知 ([e403450](https://github.com/certd/certd/commit/e40345095f31e2fb8e2333a6647466659133fa0c))\n* 子域名托管重复域名不允许添加 ([ffc0c7b](https://github.com/certd/certd/commit/ffc0c7bb7b16d9904fd2d905d1c4e1d4854e92a9))\n\n## [1.36.9](https://github.com/certd/certd/compare/v1.36.7...v1.36.9) (2025-07-15)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.36.7](https://github.com/certd/certd/compare/v1.36.6...v1.36.7) (2025-07-15)\n\n### Bug Fixes\n\n* 修复流水线列表页报length错误的bug ([9864792](https://github.com/certd/certd/commit/9864792bbfd149e770d6e1ffa809573694f99dd3))\n* 修复流水线页面状态没有刷新的bug ([93e9498](https://github.com/certd/certd/commit/93e9498b410353f504e11e264db62468895d7290))\n* 修复自定义证书检查时间重启之后不生效的bug ([38e867c](https://github.com/certd/certd/commit/38e867c917bbc68bd228bdd8064f3e7358d6413d))\n\n### Performance Improvements\n\n* 支持上传证书到各种对象存储，oss、cos、七牛、s3、minio等 ([1da8617](https://github.com/certd/certd/commit/1da8617a53a675776635bbc3bcb3c6d7dff83e27))\n* 支持邮箱发送证书 ([95332d5](https://github.com/certd/certd/commit/95332d5db96cd54ddab6ab737332417a09169b39))\n\n## [1.36.6](https://github.com/certd/certd/compare/v1.36.5...v1.36.6) (2025-07-14)\n\n### Performance Improvements\n\n* 优化流水线列表页面、详情页面性能，精简返回数据 ([609ac9c](https://github.com/certd/certd/commit/609ac9c9a2dde605eb09834ae59693c1cb238765))\n* 支持自动选择校验方式申请证书 ([3f99432](https://github.com/certd/certd/commit/3f9943270cfb12946e38e6272bc5e8d95ad6ab9e))\n* OpenAPI支持autoApply参数 ([42f4d14](https://github.com/certd/certd/commit/42f4d1477dc791520a874aed56035abcbc8c433b))\n\n## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)\n\n### Bug Fixes\n\n* 某些插件找不到的bug ([4b3f4a8](https://github.com/certd/certd/commit/4b3f4a868a8b0800c5c59de9d0f47bddc079e7b3))\n\n## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)\n\n### Performance Improvements\n\n* 站点证书即将过期通知标题颜色优化为红色 ([80c5331](https://github.com/certd/certd/commit/80c5331a5d4c320323d9b9b800e4ea3b72577b33))\n* 支持部署到阿里云vod ([98da4e1](https://github.com/certd/certd/commit/98da4e1791ed8bb21daf2a9914fda875d14633c9))\n* 支持部署证书到网宿CDN ([c3da026](https://github.com/certd/certd/commit/c3da026b33106f5195959825a68cadbe49efef00))\n* 重置管理员密码同时可以清除管理员的2FA设置 ([1ece091](https://github.com/certd/certd/commit/1ece0915f172d5f8b8adb866434e7efcc5c8c46d))\n* output-selector from参数支持更丰富的过滤规则 ([87853a2](https://github.com/certd/certd/commit/87853a201535f3bfe8505c40f8f5229d82ffcc73))\n\n## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)\n\n### Performance Improvements\n\n* 优化部署到腾讯TKE插件，支持Opaque类型选择，优化填写说明 ([1445325](https://github.com/certd/certd/commit/144532530a865b634e68539e4888e26f52f73492))\n\n## [1.36.2](https://github.com/certd/certd/compare/v1.36.1...v1.36.2) (2025-07-06)\n\n### Bug Fixes\n\n* 优化更新飞牛os证书有效期，修复某些情况下部署证书后飞牛无法访问https的bug ([610c919](https://github.com/certd/certd/commit/610c919c72037becc0ed326f5d5b18c963dfcb3a))\n\n### Performance Improvements\n\n* 证书检查支持自定义dns服务器 ([c53bb7c](https://github.com/certd/certd/commit/c53bb7cf677faa32729709ae0c10359db5194d7a))\n\n## [1.36.1](https://github.com/certd/certd/compare/v1.36.0...v1.36.1) (2025-07-02)\n\n### Performance Improvements\n\n* 支持部署到七牛云DCDN ([bde601b](https://github.com/certd/certd/commit/bde601bfffb4f7345d97e1e3b064520816d31555))\n\n# [1.36.0](https://github.com/certd/certd/compare/v1.35.5...v1.36.0) (2025-07-01)\n\n### Bug Fixes\n\n* 支持自定义证书生成插件 ([481cc02](https://github.com/certd/certd/commit/481cc029fafaf280aa844cd3ca30f4653ec35d55))\n\n### Features\n\n* 支持模版创建流水线 ([2559f0e](https://github.com/certd/certd/commit/2559f0e822db095d1d26a7f1d517622dce22a5c2))\n\n### Performance Improvements\n\n* 阿里云waf cname站点选择支持翻页及域名查询 ([4cf9858](https://github.com/certd/certd/commit/4cf98584dacc5999752732f136246647a2f1f07d))\n* 部署到ssh主机命令支持前置命令 ([991b741](https://github.com/certd/certd/commit/991b741cbe223b342f534157da63b71e81661f8e))\n* 模版导入流水线 ([dcc8c56](https://github.com/certd/certd/commit/dcc8c569693432579709ce63656665a76bcf9a44))\n* 添加用户资料编辑功能 ([7c0f43c](https://github.com/certd/certd/commit/7c0f43c8a3052f73afee3e93c9fcbc43c44ab690))\n* 优化阿里云waf的日志信息 ([821c6d8](https://github.com/certd/certd/commit/821c6d807d4b3cc5092d09a6282b8cbafb9e7c9f))\n* 站点IP监控前先同步一下IP ([a080b60](https://github.com/certd/certd/commit/a080b606ab6e289d96b17ef7d2879b4603f889ba))\n* 支持选择运行策略设置 ([60f055f](https://github.com/certd/certd/commit/60f055f293ce237c21cd9050333dad9609eceac1))\n\n## [1.35.5](https://github.com/certd/certd/compare/v1.35.4...v1.35.5) (2025-06-20)\n\n### Bug Fixes\n\n* 腾讯云授权支持设置是否国际站，部署到EO插件支持国际站 ([5cd3968](https://github.com/certd/certd/commit/5cd3968929acef333cf30d3b20cf21cea6c82c5f))\n\n### Performance Improvements\n\n* 支持批量修改通知和定时 ([e11b3be](https://github.com/certd/certd/commit/e11b3becfd4abe6547e84d09adc38ebd6e1c4b87))\n\n## [1.35.4](https://github.com/certd/certd/compare/v1.35.3...v1.35.4) (2025-06-13)\n\n### Performance Improvements\n\n* 支持s3 access做测试 ([f00aeac](https://github.com/certd/certd/commit/f00aeacb8b5c81f0bafa4c1b76723dec2b6b7784))\n\n## [1.35.3](https://github.com/certd/certd/compare/v1.35.2...v1.35.3) (2025-06-12)\n\n### Bug Fixes\n\n* 修复重试次数设置无效的bug ([e2099ac](https://github.com/certd/certd/commit/e2099ac9ca344bc70bfa4219002e9138708973ae))\n\n### Performance Improvements\n\n* 支持雨云dns解析 ([8354348](https://github.com/certd/certd/commit/83543487e7418683bd79cfe3b9e0d792bdb977f7))\n* 支持雨云dns解析以及雨云证书更新 ([43c7a19](https://github.com/certd/certd/commit/43c7a1984926f5d4647760cc134bb0aede3a7b7a))\n* github 版本检查支持执行脚本 ([bad3504](https://github.com/certd/certd/commit/bad3504d4a15e6989b967b66aa9da8c6981f25bf))\n\n## [1.35.2](https://github.com/certd/certd/compare/v1.35.1...v1.35.2) (2025-06-09)\n\n### Bug Fixes\n\n* 修复阿里云新加坡clb无法部署证书的bug ([c1fbc8c](https://github.com/certd/certd/commit/c1fbc8cd68ae020ef342e4e92f4d9b4869ca1ead))\n* 修复阿里云新加坡clb无法部署证书的bug ([3e84e11](https://github.com/certd/certd/commit/3e84e116e863b54c6b4d7db160af372dacc5857f))\n* 修复检查github release 插件无法保存最后版本的bug ([a92107c](https://github.com/certd/certd/commit/a92107cc47133883b099d5228b06373e84c8bb50))\n* 修复站点监控定时器多次添加的bug ([9361679](https://github.com/certd/certd/commit/936167972fe83e519bc01a0dd961d9c0635d24ab))\n\n### Performance Improvements\n\n* 阿里云dns操作增加重试机制 ([424fd96](https://github.com/certd/certd/commit/424fd96615c05e949af8c837c261c1400bdffba2))\n* 优化阿里云nlb支持部署扩展证书 ([9cbdfda](https://github.com/certd/certd/commit/9cbdfda829b231733d54c66c5024d46e6fc11af3))\n* history增加触发类型显示 ([7f6070c](https://github.com/certd/certd/commit/7f6070c960ed7bf02add5ab36436de6573f2f1fa))\n\n## [1.35.1](https://github.com/certd/certd/compare/v1.35.0...v1.35.1) (2025-06-07)\n\n### Bug Fixes\n\n* 修复站点监控通知渠道设置无效的bug ([a00453c](https://github.com/certd/certd/commit/a00453c83a58114ce2873dd6e6aaf313f1ce0f87))\n\n### Performance Improvements\n\n* 修改 HTTPS 服务器监听地址 ([e1cf64a](https://github.com/certd/certd/commit/e1cf64ae16d4abfe4299ff16d5088c30cf3c6365))\n* 优化流水线页面，增加下次执行时间、查看证书显示 ([c820315](https://github.com/certd/certd/commit/c8203154094fae3d17198747f49f5f41ddf29a4e))\n* 站点证书监控支持定时设置，重试次数设置 ([d3c2f8e](https://github.com/certd/certd/commit/d3c2f8eb436e670772d14a54acd6b541c5aa3978))\n* aliyun alb支持部署扩展证书 ([2a19b61](https://github.com/certd/certd/commit/2a19b61b7a78620c06396c2cc37cc77d738b6d12))\n\n# [1.35.0](https://github.com/certd/certd/compare/v1.34.11...v1.35.0) (2025-06-05)\n\n### Features\n\n* 完善注释 ([6702ca1](https://github.com/certd/certd/commit/6702ca10a17f5d7dbff789b039f7269496f66b97))\n* AWS 中国区 CloudFront 证书部署（IAM 证书） ([8a55bed](https://github.com/certd/certd/commit/8a55beda924b3be2a53b9ba80d9487cefa8bf887))\n\n## [1.34.11](https://github.com/certd/certd/compare/v1.34.10...v1.34.11) (2025-06-05)\n\n### Bug Fixes\n\n* 修复用户最大流水线数量校验的问题 ([919f70a](https://github.com/certd/certd/commit/919f70a5fd2842ca69f96f1659bb5a7ba3f73776))\n* 修复中文域名使用cname方式校验无法通过的问题 ([f7d5baa](https://github.com/certd/certd/commit/f7d5baa6d04cb83c572b06e62f885890cfa0143a))\n* 修复cv4pve sdk (proxmox插件连接失败时无法正常结束任务的bug) ([49f26b4](https://github.com/certd/certd/commit/49f26b4049a0549b0270395157e96e8f04a68bc4))\n* 修复flexcdn部署证书的顶级CA名称显示 ([6467edb](https://github.com/certd/certd/commit/6467edb84324d7c80a85212675dbacedc459df83))\n* 修复flexcdn证书commonNames错误的问题 ([ace363f](https://github.com/certd/certd/commit/ace363fa355436e769b27f71cc487d30d6441780))\n\n### Performance Improvements\n\n* 分组选择支持清空选项 ([03e2e99](https://github.com/certd/certd/commit/03e2e9949837b34eb3ea56d14a9e8a5dabc96063))\n* 优化cname检查，当有冲突的cname记录时，给出提示 ([e639a8f](https://github.com/certd/certd/commit/e639a8f9f12640ffcca69f1a6a0324459924afbd))\n* 站点监控支持批量导入域名和ip ([2d7729d](https://github.com/certd/certd/commit/2d7729dbe98f29088f5f317db2b52cc1ede223a6))\n* 支持设置用户有效期 ([6ac3bc5](https://github.com/certd/certd/commit/6ac3bc564f407dad2cd0b0b0744e887387aa5da3))\n\n## [1.34.10](https://github.com/certd/certd/compare/v1.34.9...v1.34.10) (2025-06-03)\n\n### Bug Fixes\n\n* **flexcdn:** fix cert upload and skipSslVerify required ([c48da5d](https://github.com/certd/certd/commit/c48da5dea7f0f0cdeae643b106b4a678acc3b14b))\n\n### Performance Improvements\n\n* 阿里云CLB支持部署到扩展域名 ([0e8339c](https://github.com/certd/certd/commit/0e8339c70190890d449099e1d26e5ed06ff135fb))\n* 支持部署到飞牛OS ([ddfd0fb](https://github.com/certd/certd/commit/ddfd0fb81d6638352920261065f1ab8e27bdd564))\n* 支持日志写入文件 ([37edbf5](https://github.com/certd/certd/commit/37edbf5824d6aaae68ea1ef7259c6f739d418d2c))\n\n## [1.34.9](https://github.com/certd/certd/compare/v1.34.8...v1.34.9) (2025-05-30)\n\n### Bug Fixes\n\n* 修复Farcdn证书有效期错误的问题 ([1fe4c36](https://github.com/certd/certd/commit/1fe4c367f7128de9ba5e3395ae06bc81e63a7d5a))\n\n### Performance Improvements\n\n* 不止证书自动化，插件解锁无限可能 ([a9b302e](https://github.com/certd/certd/commit/a9b302e38d3328d75df8b2da3d8b914851e55e9c))\n* 邮箱支持保存和选择 ([f7b0b44](https://github.com/certd/certd/commit/f7b0b44ef6044bec36510a6f0b06d8dca5bfce49))\n* 支持github 新版本检查并发布通知 ([356703c](https://github.com/certd/certd/commit/356703c83ea18c6efb8931402e181280d7b7e696))\n\n## [1.34.8](https://github.com/certd/certd/compare/v1.34.7...v1.34.8) (2025-05-28)\n\n### Bug Fixes\n\n* 更新 1panel API 版本支持v1/v2设置 ([e6195ad](https://github.com/certd/certd/commit/e6195ade3ec54b138825b8d6738f86eb8afdd720))\n* 同步更新namesilo接口，修复无法创建和删除dns记录的问题 ([36b02c2](https://github.com/certd/certd/commit/36b02c2cec145c13d4ef29d49aba5b6b4f697df2))\n* 修复阿里云 esa 证书获取站点列表错误的问题 ([0c2ea5d](https://github.com/certd/certd/commit/0c2ea5da4c836f8a0df132a3f22d399bd9ee1de9))\n* 修复部署到华为cdn，子账号ak查询不到域名的bug ([ebb292a](https://github.com/certd/certd/commit/ebb292a2f7a425c1bc810f59468beb3f1d5bc3f0))\n\n### Performance Improvements\n\n* 关闭腾讯云证书通知提醒 ([231a875](https://github.com/certd/certd/commit/231a875bb481420c39bf76ec9ff4e50954ab9fe4))\n* 优化站点选择组件，切换选择时不刷新列表 ([3a14714](https://github.com/certd/certd/commit/3a147141b1a5d67c92a5ce88a5313eaa62859e03))\n* 优化站点ip检查 ([a463711](https://github.com/certd/certd/commit/a463711b03a20120f2a298be15d71ca152d27f21))\n* 站点监控支持监控IP ([9cc4c01](https://github.com/certd/certd/commit/9cc4c017ae646a18284e732769b82636feda01d3))\n* 支持批量重新运行 ([8189982](https://github.com/certd/certd/commit/818998259ddc75e722196ac5c365038818539b9b))\n* farcdn优化 ([a06ef07](https://github.com/certd/certd/commit/a06ef07178ed73c537e21c7d57e5e5144d2c056d))\n\n## [1.34.7](https://github.com/certd/certd/compare/v1.34.6...v1.34.7) (2025-05-26)\n\n### Performance Improvements\n\n* 优化阿里云DCDN插件，支持多选 ([b091657](https://github.com/certd/certd/commit/b091657b5c537acf2442a2bfc345d0a77f5e2c50))\n* 支持部署到farcdn ([e08cf57](https://github.com/certd/certd/commit/e08cf57b72128998f487ab6469868052fbce0dba))\n\n## [1.34.6](https://github.com/certd/certd/compare/v1.34.5...v1.34.6) (2025-05-25)\n\n### Bug Fixes\n\n* 修复又拍云 CDN 设置证书参数和强制 HTTPS 配置报错的bug ([7984b62](https://github.com/certd/certd/commit/7984b625ba6727132f205db8e25f790bce27b2f7))\n\n### Performance Improvements\n\n* 添加阿里云 ESA证书部署插件 ([1db1ffd](https://github.com/certd/certd/commit/1db1ffde99ac7e4684fa606ebc4c327f829b3a26))\n* 站点证书监控增加通知设置 ([3422a1a](https://github.com/certd/certd/commit/3422a1a59fd0d2c0f17fa9c7e8988ac527ecfdd9))\n\n## [1.34.5](https://github.com/certd/certd/compare/v1.34.4...v1.34.5) (2025-05-19)\n\n### Performance Improvements\n\n* 1panel增加授权测试按钮 ([566b12f](https://github.com/certd/certd/commit/566b12f5d14ce10e8f5cf1807c58f7bf27f0d199))\n* 优化钉钉通知标题颜色 ([a560999](https://github.com/certd/certd/commit/a560999d13eed18d08dd32ee530166569e3f8746))\n* 优化飞书通知为卡片模式 ([a818a3d](https://github.com/certd/certd/commit/a818a3d293e22fb46979bc77055c05621a6fed81))\n\n## [1.34.4](https://github.com/certd/certd/compare/v1.34.3...v1.34.4) (2025-05-16)\n\n### Bug Fixes\n\n* 修复部署flexcdn问题 ([76b19a4](https://github.com/certd/certd/commit/76b19a4980f8edba5238543b82a7811e1003746c))\n* 修复插件导入的bug ([677fec0](https://github.com/certd/certd/commit/677fec0a0b6fceb4966705e471bbfeeda91610c7))\n* 修复导入在线插件不生效的bug ([fcf8309](https://github.com/certd/certd/commit/fcf8309c238208281ecb4575b2c3cfe50c11d783))\n* 修复自建插件保存丢失部署策略的bug ([863e74d](https://github.com/certd/certd/commit/863e74dd2e3912f950ff5025b5ed0070aeb37035))\n\n## [1.34.3](https://github.com/certd/certd/compare/v1.34.2...v1.34.3) (2025-05-15)\n\n### Performance Improvements\n\n* 添加 FlexCDN 更新证书插件 ([bf040d4](https://github.com/certd/certd/commit/bf040d4c428d29c06fbaca5e29100e0c583b2b0b))\n\n## [1.34.2](https://github.com/certd/certd/compare/v1.34.1...v1.34.2) (2025-05-11)\n\n### Bug Fixes\n\n* 修复部署到又拍云强制https无效的bug ([2397097](https://github.com/certd/certd/commit/2397097e4ddcb6f593210598e8779ffd44ac3f8f))\n\n## [1.34.1](https://github.com/certd/certd/compare/v1.34.0...v1.34.1) (2025-05-05)\n\n### Bug Fixes\n\n* 根据SOA记录判断子域名托管有缺陷，改回手动配置子域名托管记录的方式 ([1b280a2](https://github.com/certd/certd/commit/1b280a2940f9e2d919b0bf23b89cc185be1fa498))\n\n### Performance Improvements\n\n* 支持部署证书到火山dcdn ([5f85219](https://github.com/certd/certd/commit/5f852194953dc1b4e6336770f417507b8f5a33ad))\n* 支持部署证书到unicloud ([a63d687](https://github.com/certd/certd/commit/a63d687f1c573159f0857693f37602b0e1e44072))\n\n# [1.34.0](https://github.com/certd/certd/compare/v1.33.8...v1.34.0) (2025-04-28)\n\n### Bug Fixes\n\n* 修复二次认证登录进入错误账号的bug ([e3930e0](https://github.com/certd/certd/commit/e3930e07172dd7903cb0f6ff26e0e3e828ba3e77))\n\n### Features\n\n* 从yaml文件注册插件 ([deb3893](https://github.com/certd/certd/commit/deb38938204b29543f36d3266249958faaaa6b66))\n\n### Performance Improvements\n\n* 优化cdnfly插件，支持自动匹配域名部署 ([afd59e9](https://github.com/certd/certd/commit/afd59e9933b2650f41c5d47684c171b93b962065))\n\n## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26)\n\n### Performance Improvements\n\n* 数据库备份支持oss ([308d460](https://github.com/certd/certd/commit/308d4600efe2002f199c33b4594d3071784e58ea))\n* 支持反向代理增加contextPath路径 ([0088929](https://github.com/certd/certd/commit/0088929622160cc922995de9a563e8061686ff34))\n* 支持中文域名 ([162ebfd](https://github.com/certd/certd/commit/162ebfd4e0c25727efb33952d3bbf7420a02e2c3))\n\n## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22)\n\n### Performance Improvements\n\n* 添加部署证书至火山 Live ([abea80e](https://github.com/certd/certd/commit/abea80e3ab9b1672aebe1c5d5e856693b29931a8))\n* 证书申请支持51dns ([8638fc9](https://github.com/certd/certd/commit/8638fc91ff34fccaf12ff9874fd3fa9d2a8c18b7))\n* 支持51dns ([96a0900](https://github.com/certd/certd/commit/96a0900edc95dcfd9acccf9d13592f12f5a09b3d))\n\n## [1.33.6](https://github.com/certd/certd/compare/v1.33.5...v1.33.6) (2025-04-20)\n\n### Bug Fixes\n\n* 上传商用证书，直接粘贴文本报错的问题；修复无法上传ec加密证书的bug ([5750bb7](https://github.com/certd/certd/commit/5750bb706779da274d8e7a87e71416cb64d2df79))\n* 修复下载证书时提示token已过期的问题 ([0e07ae6](https://github.com/certd/certd/commit/0e07ae6ce84dcb9279d3c44060d621566afa593c))\n\n### Performance Improvements\n\n* 新增部署到火山引擎ALB/CLB、上传到证书中心 ([c9a3e3d](https://github.com/certd/certd/commit/c9a3e3d9d26f964c7af7b56667936f1414fbf42a))\n* 优化/api缓存为0 ([dc05cd4](https://github.com/certd/certd/commit/dc05cd481f186b13375192be965000e6b4b429a5))\n* 优化华为cdn插件引用ccm证书 ([b565b4b](https://github.com/certd/certd/commit/b565b4b3b919b71b98ea2517670bc1ef00e00dc9))\n\n## [1.33.5](https://github.com/certd/certd/compare/v1.33.4...v1.33.5) (2025-04-17)\n\n### Performance Improvements\n\n* 登录支持双重认证 ([48aef25](https://github.com/certd/certd/commit/48aef25b3f6499d674ca4e4ef16f4c62399fb735))\n* 多重认证登录 ([0f82cf4](https://github.com/certd/certd/commit/0f82cf409bc60706ab07e4ca4f272b9a1ca7eecb))\n* 优化部署到华为云CDN，支持先上传到ccm，再使用证书id部署，修复offline状态下导致部署报错的bug ([79df39a](https://github.com/certd/certd/commit/79df39acabab10ae7e1864dadcdc186bb007a3c5))\n\n## [1.33.4](https://github.com/certd/certd/compare/v1.33.3...v1.33.4) (2025-04-15)\n\n### Bug Fixes\n\n* 补充类型断言 ([2143dff](https://github.com/certd/certd/commit/2143dff2ae96e6a78bef9f0498e36f8cd9e6941f))\n* 修复腾讯云部署到任意资源插件，无法使用之前已上传的腾讯云证书问题 ([32c714d](https://github.com/certd/certd/commit/32c714d1b6e68c71a74a7452115040c87ac4bfdc))\n\n### Performance Improvements\n\n* 插件支持导入导出 ([cf8abb4](https://github.com/certd/certd/commit/cf8abb45282070c8ba91469f93fd379fabf1f74a))\n* 支持上传证书到华为云CCM ([cfd3b66](https://github.com/certd/certd/commit/cfd3b66be9ebf53a26693057e70ed60c3f116be9))\n\n## [1.33.3](https://github.com/certd/certd/compare/v1.33.2...v1.33.3) (2025-04-14)\n\n### Bug Fixes\n\n* 修复登录错误次数过多阻止再次登录逻辑 ([bf4d191](https://github.com/certd/certd/commit/bf4d191c8bd2f9209eb6768f662b9c77de99e998))\n\n## [1.33.2](https://github.com/certd/certd/compare/v1.33.1...v1.33.2) (2025-04-12)\n\n### Performance Improvements\n\n* 修复内置插件分页查询逻辑 ([a2710dd](https://github.com/certd/certd/commit/a2710ddc2525e4e637fd157f0180e6d3b801c8be))\n\n## [1.33.1](https://github.com/certd/certd/compare/v1.33.0...v1.33.1) (2025-04-12)\n\n### Bug Fixes\n\n* 修复阿里云cdn证书部署失败问题，增加certname参数传入 ([965dc2c](https://github.com/certd/certd/commit/965dc2cb476f690af716f291c6b20ba98be0c8f0))\n\n# [1.33.0](https://github.com/certd/certd/compare/v1.32.0...v1.33.0) (2025-04-11)\n\n### Bug Fixes\n\n* 升级mysql驱动，支持mysql8最新版本的认证 ([2f5ed3a](https://github.com/certd/certd/commit/2f5ed3aead97641f2c80d692a50226839016df0b))\n\n### Features\n\n* 支持在线自定义插件，无需源码开发 ([d0d9d68](https://github.com/certd/certd/commit/d0d9d68fe6740f6ff49fe40b7c9917c5a2e4b442))\n\n### Performance Improvements\n\n* 隐藏运行策略选项 ([2951df0](https://github.com/certd/certd/commit/2951df0cd94c23e2efee84ff1b843055aac56cae))\n\n# [1.32.0](https://github.com/certd/certd/compare/v1.31.11...v1.32.0) (2025-04-04)\n\n### Bug Fixes\n\n* 创建cname记录移除域名两端的空格 ([903a413](https://github.com/certd/certd/commit/903a4131ab5f42c8286cd2150ed1032d486fda2f))\n\n### Performance Improvements\n\n* 优化华为dns解析记录创建和删除问题 ([0948c5b](https://github.com/certd/certd/commit/0948c5bc691d2ee6eb47c72a85da1b7453361878))\n* 又拍云支持云存储 ([9339b78](https://github.com/certd/certd/commit/9339b78f801d193472c0af25749e8e7a27ffb7af))\n* 又拍云支持云存储 ([8449f85](https://github.com/certd/certd/commit/8449f8580da90c1f6b5d02d07c3236ebaf6cf161))\n\n## [1.31.11](https://github.com/certd/certd/compare/v1.31.10...v1.31.11) (2025-04-02)\n\n### Performance Improvements\n\n* 支持部署到京东云cdn ([6f17c70](https://github.com/certd/certd/commit/6f17c700b84965baa01b40fe2abaa0a91bcbaffd))\n* 支持京东云dns申请证书 ([04d79f9](https://github.com/certd/certd/commit/04d79f9117670be504960b018fd49ae3bf7c1c11))\n\n## [1.31.10](https://github.com/certd/certd/compare/v1.31.9...v1.31.10) (2025-03-29)\n\n### Performance Improvements\n\n* 升级lego版本到4.22.2 ([4e15556](https://github.com/certd/certd/commit/4e15556e5e8100719497edb1729570d5a29668e1))\n\n## [1.31.9](https://github.com/certd/certd/compare/v1.31.8...v1.31.9) (2025-03-28)\n\n### Bug Fixes\n\n* 修复华为云dns接口请求出错的bug ([caa15b4](https://github.com/certd/certd/commit/caa15b47355363cbb8847f415ff12363cd53eeda))\n* 修复某些情况下站点证书监控报undefined.includes的错误 ([0b6618f](https://github.com/certd/certd/commit/0b6618ff709322a0eeba78953c8c6e9d073d083a))\n\n### Performance Improvements\n\n* 站点监控保存时异步检查 ([993bc74](https://github.com/certd/certd/commit/993bc7432fce2d954e9897ed85b54f22150bfc7e))\n* dns支持火山引擎 ([99ff879](https://github.com/certd/certd/commit/99ff879d93658c29ea493a4bde7e9e3f85996d64))\n\n## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)\n\n### Bug Fixes\n\n* 修复编辑通知勾选默认，导致出现多个默认通知的bug ([6cd7bdd](https://github.com/certd/certd/commit/6cd7bddc37da8b0d7b9860fd9a26ddfe84c869a7))\n\n### Performance Improvements\n\n* 优化scp上传 ([e51123a](https://github.com/certd/certd/commit/e51123a95131cc76d655937488caf08956a67020))\n* 支持又拍云cdn ([fd0536b](https://github.com/certd/certd/commit/fd0536bd4b41f15b6b5d42e0b447f0dcbf73b8a8))\n* 支持又拍云cdn ([57389a7](https://github.com/certd/certd/commit/57389a79a1a61c45d081712562f8b33c9633158e))\n\n## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)\n\n### Performance Improvements\n\n* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))\n\n## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)\n\n### Bug Fixes\n\n* 修复dns.la无法申请证书的bug ([90b045a](https://github.com/certd/certd/commit/90b045af6d1a4f46986e4b118885c1f050df067c))\n\n### Performance Improvements\n\n* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))\n* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))\n\n## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)\n\n### Bug Fixes\n\n* 修复站点监控通知通过webhook发送失败的bug ([9be1ecc](https://github.com/certd/certd/commit/9be1ecc8aab3ea23dd0dc2dab3688f4edb90ef2c))\n* 修复dns.la域名申请失败的bug ([1de8eee](https://github.com/certd/certd/commit/1de8eee6ea8307f3c11626af75303d3cc104bb95))\n\n### Performance Improvements\n\n* 流水线增加上传证书快捷方式 ([425bba6](https://github.com/certd/certd/commit/425bba67c539b734e2a85a83a4f9ecc9b2434fb4))\n* 手动上传证书部署流水线 ([fbb66f3](https://github.com/certd/certd/commit/fbb66f3c4389489aa8a43b194d82bc8cf391607b))\n* 站点监控，手动测试也发通知 ([729b19c](https://github.com/certd/certd/commit/729b19c8da60d5efb5baef7cf8df0518e7f6b471))\n* 站点证书监控支持模糊查询 ([0069c0e](https://github.com/certd/certd/commit/0069c0e3992946a8dd6410f299d4fc974ef0e76b))\n* 支持飞书通知 ([b82e1dc](https://github.com/certd/certd/commit/b82e1dcd6217b09a7d7e21cd648bb31de320cadf))\n* 支持手动上传证书并部署 ([a9fffa5](https://github.com/certd/certd/commit/a9fffa5180c83da27b35886aa2e858a92a2c5f94))\n\n## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)\n\n### Bug Fixes\n\n* 修复阿里云fc获取不到列表的bug ([474b337](https://github.com/certd/certd/commit/474b3372d8ce98e6d45900bf8046bc0b3f220686))\n\n### Performance Improvements\n\n* 支持dns.la ([ee8af18](https://github.com/certd/certd/commit/ee8af18d0ac0af82544d6dda1e4b4c678b733041))\n* cf授权支持配置http代理 ([27386ea](https://github.com/certd/certd/commit/27386ea04d3c1a5aebe3cfdd7ac48185eaa76629))\n\n## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)\n\n### Bug Fixes\n\n* 修复cname记录查找bug ([95fb4e3](https://github.com/certd/certd/commit/95fb4e3e8be6ca13cc43b451f6141d62190ba453))\n\n## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)\n\n**Note:** Version bump only for package @certd/ui-server\n\n# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)\n\n### Bug Fixes\n\n* 修复CDN插件我爱云因更换接口导致部署失败的问题 ([5641c19](https://github.com/certd/certd/commit/5641c19502970f67af19709bddf8c781b1a25bdc))\n* 修复webhook headers value中带等号是解析错误的bug ([1fe3365](https://github.com/certd/certd/commit/1fe3365e10c464c4c60c82f424cf74fe35b883e0))\n* ProxmoxUploadCert 增加强制部署证书 ([441b15e](https://github.com/certd/certd/commit/441b15ed2fe5a143a5bd5508613b3816ddbff596))\n\n### Performance Improvements\n\n* 历史记录查看详情，可以切换到对应的历史记录日志上去 ([082802e](https://github.com/certd/certd/commit/082802e1197156837800f814728ee0f6b300b18c))\n* 升级midwayjs版本 ([057b0b4](https://github.com/certd/certd/commit/057b0b4565e19bb93195633f767b2942e8e40e59))\n* 是否允许爬虫爬取增加ui设置选项 ([779db9d](https://github.com/certd/certd/commit/779db9da705d2dfef36fec21f52bd38af9fc5f2e))\n* 通知支持钉钉群聊机器人 ([fc8bef5](https://github.com/certd/certd/commit/fc8bef5aae522d75d408d8c3aa74543269da5398))\n\n## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)\n\n### Performance Improvements\n\n* 上传到阿里云证书名称后缀增加毫秒时间戳 ([9f0ee21](https://github.com/certd/certd/commit/9f0ee219d02907ffe128a5cf10173397d934ccd7))\n* 支持部署到阿里云FC3.0 ([bcaf54d](https://github.com/certd/certd/commit/bcaf54d4cb7bc469486aae6cdb127ae017eb3abb))\n\n## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)\n\n### Bug Fixes\n\n* 适配最新版1panel密码编码方式 ([78044c0](https://github.com/certd/certd/commit/78044c062e20cdd04f08baef9fb6745bf25eddcf))\n\n## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)\n\n### Bug Fixes\n\n* 修复腾讯云CLB多域名同证书部署报错的bug ([c3a5542](https://github.com/certd/certd/commit/c3a55429357e78f4b78c9592d3e5897db2d4d549))\n\n## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)\n\n### Bug Fixes\n\n* 修复cloudflare删除解析记录报错的bug ([00c2da4](https://github.com/certd/certd/commit/00c2da444f84adb89f3f1226d03294d7c6e3e4f1))\n\n### Performance Improvements\n\n* 上传自定义证书 ([75a38d9](https://github.com/certd/certd/commit/75a38d95f305b4271d9106babe7cffc1c89ae8f3))\n\n## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)\n\n### Bug Fixes\n\n* 修复部署到阿里云ALB、NLB插件加载混乱的bug ([6ab83b6](https://github.com/certd/certd/commit/6ab83b662a2c5e715b9cb7eb1244de2ebb7f47b0))\n* 修复腾讯clb重复执行会报错的bug ([e95d29f](https://github.com/certd/certd/commit/e95d29f446d06eced315a3087fc9e105a30b20bd))\n* 修复tg消息内容中存在.和*就会发送失败的bug ([ae5dfc3](https://github.com/certd/certd/commit/ae5dfc3bee950267123ae2fbd1c11e7ce36626ea))\n\n### Performance Improvements\n\n* http方式校验，选择sftp时，支持修改文件访问权限比如777 ([15d6eaf](https://github.com/certd/certd/commit/15d6eaf5532ed25acd4f8d58c429353a2f44206c))\n\n# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)\n\n### Bug Fixes\n\n* 修复namesilo ttl太短的问题 ([865f26d](https://github.com/certd/certd/commit/865f26d75c0d3dd4dc8b41448f8830068e45957c))\n\n### Features\n\n* 支持open api接口，根据域名获取证书 ([52a4fd3](https://github.com/certd/certd/commit/52a4fd33180e9b3f71b8dc9f7671d7cd8e448c3b))\n\n### Performance Improvements\n\n* 证书仓库 ([91e7f45](https://github.com/certd/certd/commit/91e7f45a1c5ea1e0ec0aa3236b80028f03a6d0aa))\n* 支持部署到阿里云ALB ([653940a](https://github.com/certd/certd/commit/653940a0ca64fc380178c1b0b58ae0af64dfaf07))\n* 支持部署到阿里云NLB、SLB ([c085bac](https://github.com/certd/certd/commit/c085bac5d877c4250a8a79e17eb8673b8e4fc89c))\n* 支持部署到腾讯云直播 ([417d37b](https://github.com/certd/certd/commit/417d37b199b79a42f790f9edab8f178eedf8fbf7))\n* 支持部署证书到proxmox ([d10795e](https://github.com/certd/certd/commit/d10795ecd97eb8cf2ffa46aabfdbfc6812636396))\n\n## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)\n\n### Bug Fixes\n\n* 修复复制到本机插件，pfx格式复制时报错的bug ([f57116d](https://github.com/certd/certd/commit/f57116d2bebf33e47ad93e0b39c4efe8e4aea25c))\n\n## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)\n\n### Performance Improvements\n\n* 优化腾讯云CLB插件，支持非sni情况，sni情况支持填写多个域名 ([635b042](https://github.com/certd/certd/commit/635b042690637bff85e97e07c7aac4b87a8a124b))\n\n## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)\n\n### Bug Fixes\n\n* 修复系统级授权无法查看密钥的bug ([8644348](https://github.com/certd/certd/commit/8644348fc41ae2e1672f946ca37e5d3a674e0218))\n\n### Performance Improvements\n\n* 优化站点证书检查页面，检查增加3次重试 ([e6dd7cd](https://github.com/certd/certd/commit/e6dd7cd54a3e23897031b5df6e0c3cdc0545d35a))\n* 支持http校验方式申请证书 ([405591c](https://github.com/certd/certd/commit/405591c5d08fa1a3b228ee3980199e7731cfec4a))\n* http校验方式，支持七牛云oss、阿里云oss、腾讯云cos ([3f74d4d](https://github.com/certd/certd/commit/3f74d4d9e5f5d0e629b44cff1895b3f7a8fbcafc))\n\n## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)\n\n### Bug Fixes\n\n* 修复套餐关闭状态下，仍然限制用户流水线数量的bug ([66fb9e5](https://github.com/certd/certd/commit/66fb9e5f49491f9c159363b48af14720a37673b1))\n\n## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)\n\n### Performance Improvements\n\n* 用户创建证书流水线没有购买套餐或者超限时提前报错 ([472f06c](https://github.com/certd/certd/commit/472f06c2d190d0ae48e8b53c18bc278437656a1c))\n* 优化插件名称显示 ([26adf7d](https://github.com/certd/certd/commit/26adf7d437e674385f26a8f92fded6521a620671))\n\n# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)\n\n### Bug Fixes\n\n* 修复左侧菜单收起时无法展开子菜单的bug ([0056223](https://github.com/certd/certd/commit/005622307e612717a5408aa1484717ef03003a22))\n\n### Features\n\n* 基础版不再限制流水线数量 ([cb27d4b](https://github.com/certd/certd/commit/cb27d4b4906b2782eaceb0a95bbdc5d0534370d2))\n* 套餐购买支持易支付、支付宝支付 ([faa28f8](https://github.com/certd/certd/commit/faa28f88f954cba4c1dd29125562e5acd2fd99af))\n* 用户套餐，用户支付功能 ([a019956](https://github.com/certd/certd/commit/a019956698acaf2c4beb620b5ad8c18918ead6a1))\n* 站点证书监控 ([9c8c7a7](https://github.com/certd/certd/commit/9c8c7a781223f4217f45510db1e89495600e3cd5))\n* 支持微信支付 ([45d6347](https://github.com/certd/certd/commit/45d6347f5b6199493b11aabdd74177f6dca2cea4))\n\n### Performance Improvements\n\n* 同一时间只允许一个套餐生效 ([8ebf95a](https://github.com/certd/certd/commit/8ebf95a222a900d1707716c7b1f3b39f8a6d8f94))\n* 用户名支持修改 ([89c7f07](https://github.com/certd/certd/commit/89c7f070343e86453c84677ebe1669f9b266d871))\n* 站点证书监控通知发送，每天定时检查 ([bb4910f](https://github.com/certd/certd/commit/bb4910f4e57234e42b44505f4620ae7af66025c5))\n* 支持一体证书 ([53c38cf](https://github.com/certd/certd/commit/53c38cf714a6f7486abbf1d71c9f48f56a790100))\n\n## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)\n\n### Bug Fixes\n\n* mysql下access.setting字段改成text ([b7f5740](https://github.com/certd/certd/commit/b7f5740c57743914f754f3b4fdd94b59a2e8338c))\n\n### Performance Improvements\n\n* 通知标题优化 ([ff083ce](https://github.com/certd/certd/commit/ff083ce6848a8bee3c8248e4b881086ae1517c28))\n* 支持腾讯虚拟机开关机([@wujingke](https://github.com/wujingke)) ([8039e8b](https://github.com/certd/certd/commit/8039e8baf83c82d03f1a6198cf61c372026b962b))\n* 支持aws cloudfront ([0ae39f1](https://github.com/certd/certd/commit/0ae39f160a7c6b6696b3bf513d68aa28905810ad))\n\n## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)\n\n### Bug Fixes\n\n* 修复创建流水线通知设置无效的bug ([498cf34](https://github.com/certd/certd/commit/498cf34999fddfa24ce088e2e678469fa669abb8))\n* 修复流水线分组可以被所有人看见的bug ([a0e838d](https://github.com/certd/certd/commit/a0e838d1eec918e5dc92fe95dc72ac14facb930e))\n\n### Performance Improvements\n\n* 优化数据表索引 ([228fdf0](https://github.com/certd/certd/commit/228fdf0a0d28013f5dd156a97bbde80537e8e97e))\n* 支持mysql ([7cde1fd](https://github.com/certd/certd/commit/7cde1fdc4a9ed851900d231a5460c8dbfbcd148e))\n\n## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)\n\n### Performance Improvements\n\n* 通知选择器优化 ([2c0cbdd](https://github.com/certd/certd/commit/2c0cbdd29ecb74cc939b2ae7ee86b8d40f70ba31))\n* 新增七牛云插件分组 ([49e7dc5](https://github.com/certd/certd/commit/49e7dc56e1a95fbdea3e30cdeb945b48415b69e3))\n* 新增server酱3通知 ([6aa4872](https://github.com/certd/certd/commit/6aa487269c9f6862e188b37a0d6c73f79c937d94))\n* 支持易发云短信 ([94fa77f](https://github.com/certd/certd/commit/94fa77fcd2b9bea294fb05736c0d8cdc81f56103))\n* cname value优化 ([e8c9c2a](https://github.com/certd/certd/commit/e8c9c2a47d47048ae743b16f7bc932dbe18a89e9))\n* favicon支持自定义 ([8b9c47d](https://github.com/certd/certd/commit/8b9c47daf194515006689a212ae9cf586bdf5993))\n\n# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)\n\n### Bug Fixes\n\n* 修复自定义webhook contextType的bug ([7e5ea0c](https://github.com/certd/certd/commit/7e5ea0cee003acda952d922ca70592f1e8a2ed80))\n\n### Features\n\n* 手机号登录、邮箱验证码注册 ([7b55337](https://github.com/certd/certd/commit/7b55337c5edb470cca7aa62201eda8d274784004))\n\n### Performance Improvements\n\n* 部署到IIS插件 ([1534f45](https://github.com/certd/certd/commit/1534f4523633265d219d7b3a249a9ea1af99c512))\n* 登录失败增加重试次数限制及冷却时间 ([954b6df](https://github.com/certd/certd/commit/954b6df3608695fe074130f8149a33e311d80cc4))\n* 流水线支持批量修改分组，批量删除 ([a847e66](https://github.com/certd/certd/commit/a847e66c4fc843b98f1520b2b8072d3586ce8b81))\n* 首页新增修改密码提示 ([0772d3b](https://github.com/certd/certd/commit/0772d3b3fd24afdde4086d9f09ef19d037b431b4))\n* 选项显示图标 ([aedc462](https://github.com/certd/certd/commit/aedc46213571a3bd93809b7af7fa17a08d546237))\n* 优化七牛云cdn，获取域名列表可以选择 ([5a20242](https://github.com/certd/certd/commit/5a20242111d6bd255b25dac86fe1f062c8543096))\n* 优化七牛云cdn部署，保持http2和forceHttp设置，当未开启https时，主动开启https ([196f7d9](https://github.com/certd/certd/commit/196f7d9dc23d7dd96b663c686542e85270b81aef))\n* 优化证书申请成功通知发送方式 ([8002a56](https://github.com/certd/certd/commit/8002a56efc5998aa03db5711ae87f9eb4bc9e160))\n* 支持短信验证码登录 ([387bcc5](https://github.com/certd/certd/commit/387bcc5fa418cdeea81a06da5e3f8cd6b43cd082))\n* 支持威联通证书部署 ([0d8913e](https://github.com/certd/certd/commit/0d8913ea2f56fdebbcc9bb207eae59e8ddbb8cad))\n* 自定义webhook显示详细的错误信息 ([3254afc](https://github.com/certd/certd/commit/3254afc75640eed3729d0fc02a818fefbe5c7fc3))\n\n## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)\n\n### Performance Improvements\n\n* 通知支持自定义webhook、anpush、iyuu、server酱 ([cbccd9e](https://github.com/certd/certd/commit/cbccd9e3d0a4c24aba772af62734666d40b22c57))\n* 通知支持vocechat、bark、telegram、discord、slack ([642f57f](https://github.com/certd/certd/commit/642f57ff6d7152a9e14f59c7fc0e32a6b1751fb7))\n\n## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)\n\n### Bug Fixes\n\n* 修复关键字查询bug ([fab6660](https://github.com/certd/certd/commit/fab66606b35a540fac31fee902331ba1ffdebc16))\n* 修复CNAME时子域名级数超出限制的问题 ([3af6d96](https://github.com/certd/certd/commit/3af6d96e6e353c9b2111cff81679b79c55195a0a))\n\n### Performance Improvements\n\n* 华为云密钥获取提示及访问链接 ([de43391](https://github.com/certd/certd/commit/de43391e4c12dc3ad976f8fa8787f4eb70a41e75))\n* 通知管理 ([d9a00ee](https://github.com/certd/certd/commit/d9a00eeaf72735ced67c59d7983d84e3c730064a))\n* 通知渠道支持测试按钮 ([b54ae27](https://github.com/certd/certd/commit/b54ae272ebc2d31b32b049d44e2299a6be7f153c))\n* 优化插件开发，dnsProvider无需写http logger 变量 ([fcbb5e4](https://github.com/certd/certd/commit/fcbb5e46a112174150a62648319b8224fce3b7ed))\n* 支持部署到阿里云WAF ([c96fcb7](https://github.com/certd/certd/commit/c96fcb7afced979435cffa73591275008033c90d))\n* 支持企业微信群聊机器人通知 ([b805a29](https://github.com/certd/certd/commit/b805a2925984144a31575b8aaa622f0c30d41b56))\n\n## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)\n\n### Bug Fixes\n\n* .env 读取 \\r 问题 ([0e33dfa](https://github.com/certd/certd/commit/0e33dfa019a55ea76193c428ec756af386adeb9d))\n\n## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)\n\n### Bug Fixes\n\n* 修复角色无法删除的bug ([66629a5](https://github.com/certd/certd/commit/66629a591aecc2d8364ea415c7afc3f9d0406562))\n\n### Performance Improvements\n\n* 新手导航在非编辑模式下不显示 ([18bfcc2](https://github.com/certd/certd/commit/18bfcc24ad0bde57bb04db8a4209861ec6b8ff1d))\n* 优化腾讯云 cloudflare 重复解析记录时的返回值 ([90d1b68](https://github.com/certd/certd/commit/90d1b68bd6cf232fbe085234efe07d29b7690044))\n* 支持namesilo ([80159ec](https://github.com/certd/certd/commit/80159ecca895103d0495f3217311199e66056572))\n* 专业版试用，无需绑定账号 ([c7c4318](https://github.com/certd/certd/commit/c7c4318c11b65a76089787aa58939832d338a232))\n\n## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)\n\n### Performance Improvements\n\n* 公共cname服务支持关闭 ([f4ae512](https://github.com/certd/certd/commit/f4ae5125dc4cd97816976779cb3586b5ee78947e))\n\n## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)\n\n### Bug Fixes\n\n* 修复偶发性cname一直验证超时的bug ([d2ce72e](https://github.com/certd/certd/commit/d2ce72e4aaacdf726ba8b91fcd71db40a27714ba))\n* 修复邮件配置，忽略证书校验设置不生效的bug ([66a9690](https://github.com/certd/certd/commit/66a9690dc958732e1b3c672d965db502296446f9))\n\n### Performance Improvements\n\n* 优化上传到主机插 路径选择，根据证书格式显示 ([8c3f86c](https://github.com/certd/certd/commit/8c3f86c6909ed91f48bb2880e78834e22f6f6a29))\n\n## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)\n\n### Bug Fixes\n\n* 修复删除腾讯云过期证书时间判断上的bug，导致已过期仍然没有删除证书 ([1ba1007](https://github.com/certd/certd/commit/1ba10072615015d91b81fc56a3b01dae6a2ae9d1))\n\n### Performance Improvements\n\n* 优化部署到阿里云CDN插件，支持多域名，更易用 ([80c500f](https://github.com/certd/certd/commit/80c500f618b169a1f64c57fe442242a4d0d9d833))\n* 优化流水线页面切换回来不丢失查询条件 ([4dcf6e8](https://github.com/certd/certd/commit/4dcf6e87bc5f7657ce8a56c5331e8723a0fee8ee))\n* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941))\n* 执行历史支持点击查看流水线详情 ([8968639](https://github.com/certd/certd/commit/89686399f90058835435b92872fc236fac990148))\n* 专业版7天试用 ([c58250e](https://github.com/certd/certd/commit/c58250e1f065a9bd8b4e82acc1df754504c0010c))\n\n## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)\n\n### Performance Improvements\n\n* 优化时间选择器，自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211))\n* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9))\n\n# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)\n\n### Bug Fixes\n\n* 修复历史记录不能按名称查询的bug ([6113c38](https://github.com/certd/certd/commit/6113c388b7fc58b11ca19ff05cc1286d096c8d28))\n\n### Features\n\n* 首页全新改版 ([63ec5b5](https://github.com/certd/certd/commit/63ec5b5519c760a3330569c0da6dac157302a330))\n\n### Performance Improvements\n\n* 管理控制台数据统计 ([babd589](https://github.com/certd/certd/commit/babd5897ae013ff7c04ebfcbfac8a00d84dd627c))\n* lego 升级到 4.19.2 ([129bf53](https://github.com/certd/certd/commit/129bf53edc9bbb001fe49fbd7e239bd1d09cc128))\n\n## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)\n\n### Performance Improvements\n\n* 支持华为云cdn ([81a3fdb](https://github.com/certd/certd/commit/81a3fdbc29b71f380762008cc151493ec97458f9))\n\n## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)\n\n### Performance Improvements\n\n* 默认证书更新时间设置为35天，增加腾讯云删除过期证书插件，可以避免腾讯云过期证书邮件 ([51b6fed](https://github.com/certd/certd/commit/51b6fed468eaa6f28ce4497ce303ace1a52abb96))\n* 授权加密支持解密查看 ([5575c83](https://github.com/certd/certd/commit/5575c839705f6987ad2bdcd33256b0962c6a9c6a))\n* 重置管理员密码同时启用管理员账户，避免之前禁用了，重置密码还是登录不进去 ([f92d918](https://github.com/certd/certd/commit/f92d918a1e28e29b794ad4754661ea760c18af46))\n\n## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)\n\n### Bug Fixes\n\n* 修复阿里云部署大杀器报插件_还未注册错误的bug ([abd2dcf](https://github.com/certd/certd/commit/abd2dcf2e85a545321bae6451406d081f773b132))\n* 修复启动时自签证书无法保存的bug ([526c484](https://github.com/certd/certd/commit/526c48450bcd37b3ccded9b448f17de8140bdc6e))\n\n### Performance Improvements\n\n* 禁用readonly用户 ([d10d42e](https://github.com/certd/certd/commit/d10d42e20619bb55a50d636b8867ff33db4e3b4b))\n* 限制其他用户流水线数量 ([315e437](https://github.com/certd/certd/commit/315e43746baf01682737f82e41579237a48409af))\n* 用户管理优化头像上传 ([661293c](https://github.com/certd/certd/commit/661293c189a3abf3cdc953b5225192372f57930d))\n\n## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)\n\n### Performance Improvements\n\n* 更新certd本身的证书文档说明 ([0c50ede](https://github.com/certd/certd/commit/0c50ede129337b82df54575cbd2f4c2a783a0732))\n* 支持同时监听https端口，7002 ([d5a17f9](https://github.com/certd/certd/commit/d5a17f9e6afd63fda2df0981118480f25a1fac2e))\n\n## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)\n\n### Performance Improvements\n\n* 部署到阿里云任意云资源，阿里云部署大杀器 ([4075be7](https://github.com/certd/certd/commit/4075be7849b140acb92bd8da8a9acbf4eef85180))\n* 文件名特殊字符限制输入 ([c4164c6](https://github.com/certd/certd/commit/c4164c66e29f3ec799f98108a344806ca61e94ff))\n* 新增部署到百度云CDN插件 ([f126f9f](https://github.com/certd/certd/commit/f126f9f932d37fa01fff1accc7bdd17d349f8db5))\n* 新增部署到腾讯云CDN-v2，推荐使用 ([d782655](https://github.com/certd/certd/commit/d782655cb4dfbb74138178afbffeee76fc755115))\n* 支持部署到腾讯云COS ([a8a45d7](https://github.com/certd/certd/commit/a8a45d7f757820990e278533277a3deda5ba48f3))\n* 支持配置公共ZeroSSL授权 ([a90d1e6](https://github.com/certd/certd/commit/a90d1e68ee9cbc3705223457b8a86f071b150968))\n\n## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)\n\n### Bug Fixes\n\n* 允许七牛云cdn插件输入.号开头的通配符域名 ([18ee87d](https://github.com/certd/certd/commit/18ee87daff6eafc2201b58e28d85aafd3cb7a5b9))\n\n### Performance Improvements\n\n* 优化证书申请速度和成功率，反代地址优化，google基本可以稳定请求。增加请求重试。 ([41d9c3a](https://github.com/certd/certd/commit/41d9c3ac8398def541e65351cbe920d4a927182d))\n\n## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)\n\n### Bug Fixes\n\n* 修复cname服务普通用户access访问权限问题 ([c1e3e2e](https://github.com/certd/certd/commit/c1e3e2ee1f923ee5806479dd5f178c3286a01ae0))\n\n## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)\n\n### Bug Fixes\n\n* 修复普通用户无法校验cname配置的bug ([6285497](https://github.com/certd/certd/commit/62854978bf0bdbe749b42f8e40ab227ab31ec92f))\n\n### Performance Improvements\n\n* 触发证书重新申请input变化对比规则优化，减少升级版本后触发申请证书的情况 ([c46a2a9](https://github.com/certd/certd/commit/c46a2a9a399c2a9a8bb59a48b9fb6e93227cce9b))\n* 授权配置去除前后空格 ([57d8d48](https://github.com/certd/certd/commit/57d8d48046fbf51c52b041d2dec03d51fb018587))\n* 数据库备份插件，先压缩再备份 ([304ef49](https://github.com/certd/certd/commit/304ef494fd5787c996ad0dcb6edd2f517afce9e2))\n\n## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)\n\n### Bug Fixes\n\n* 修复无法设置角色的bug ([02fe704](https://github.com/certd/certd/commit/02fe704769edb25fea5ffd85a51a5530864b37b3))\n\n### Performance Improvements\n\n* 角色删除安全 ([28bb485](https://github.com/certd/certd/commit/28bb4856bee03569153f6471527c9b9f28cb3d14))\n* 密钥备份 ([1c6028a](https://github.com/certd/certd/commit/1c6028abcf8849163462bb2f8441b6838357e09b))\n* 证书直接查看 ([5dde5bd](https://github.com/certd/certd/commit/5dde5bd3f76db3959d411619d29bfb8064e3b307))\n* sqlite数据库备份插件 ([77f1631](https://github.com/certd/certd/commit/77f163144f7dcfb0431475c55508fecfd6d969f8))\n\n## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)\n\n### Bug Fixes\n\n* 修复排序失效的bug ([1f0742e](https://github.com/certd/certd/commit/1f0742ef9f0caae0c7e713acf0fd3cebf5d63875))\n\n## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)\n\n### Bug Fixes\n\n* 修复版本号获取错误的bug ([8851870](https://github.com/certd/certd/commit/8851870400df86e496198ad509061b8989fcc44f))\n\n## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)\n\n### Performance Improvements\n\n* [comm] 支持插件管理 ([e8b617b](https://github.com/certd/certd/commit/e8b617b80ce882dd63006f0cfc719a80a1cc6acc))\n* 新增代理设置功能 ([273ab61](https://github.com/certd/certd/commit/273ab6139f5807f4d7fe865cc353b97f51b9a668))\n* EAB授权支持绑定邮箱，支持公共EAB设置 ([07043af](https://github.com/certd/certd/commit/07043aff0ca7fd29c56dd3c363002cb15d78b464))\n\n## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)\n\n### Performance Improvements\n\n* 优化系统设置加载时机 ([7396253](https://github.com/certd/certd/commit/73962536d5a4769902d760d005f3f879465addcc))\n\n## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)\n\n### Bug Fixes\n\n* 修复某些情况下bindUrl失败的bug ([91fc1cd](https://github.com/certd/certd/commit/91fc1cd7353be4a22be951239ed70b38baebc74e))\n\n### Performance Improvements\n\n* 邮箱设置改为系统设置，普通用户无需配置发件邮箱 ([4244569](https://github.com/certd/certd/commit/42445692117184a3293e63bef84a74cbb5984b0e))\n\n## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)\n\n**Note:** Version bump only for package @certd/ui-server\n\n# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)\n\n### Bug Fixes\n\n* 修复管理员编辑其他用户流水线任务时归属userid也被修改的bug ([e85c477](https://github.com/certd/certd/commit/e85c47744cf740b4af3b93dca7c2f0ccc818ec2f))\n\n### Features\n\n* 域名验证方法支持CNAME间接方式，此方式支持所有域名注册商，且无需提供Access授权，但是需要手动添加cname解析 ([f3d3508](https://github.com/certd/certd/commit/f3d35084ed44f9f33845f7045e520be5c27eed93))\n* 站点个性化设置 ([11a9fe9](https://github.com/certd/certd/commit/11a9fe9014d96cba929e5a066e78f2af7ae59d14))\n\n### Performance Improvements\n\n* 调整静态资源到static目录 ([0584b36](https://github.com/certd/certd/commit/0584b3672b40f9042a2ed87e5627022606d046cd))\n* 调整全部静态资源到static目录 ([a218890](https://github.com/certd/certd/commit/a21889080d6c7ffdf0af526a3a21f0b2d1c77288))\n* 检查cname是否正确配置 ([b5d8935](https://github.com/certd/certd/commit/b5d8935159374fbe7fc7d4c48ae0ed9396861bdd))\n* 七牛云cdn支持配置多个域名 ([88d745e](https://github.com/certd/certd/commit/88d745e29063a089864fb9c6705be7b8d4c2669a))\n* 上传到主机插件支持注入环境变量 ([81fac73](https://github.com/certd/certd/commit/81fac736f9ccc8d1cda7ef4178752239cec20849))\n* 优化缩短首页缓存时间 ([49395e8](https://github.com/certd/certd/commit/49395e8cb65f4b30c0145329ed5de48be4ef3842))\n\n## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)\n\n### Bug Fixes\n\n* 修复西部数码账户级别apikey不可用的bug ([f8f3e8b](https://github.com/certd/certd/commit/f8f3e8b43fd5d815887bcb53b95f46dc96424b79))\n\n### Performance Improvements\n\n* 增加等待插件 ([3ef0541](https://github.com/certd/certd/commit/3ef0541cc85ab6abf698ead3b258ae1ac156ef98))\n\n## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)\n\n### Bug Fixes\n\n* 修复某些地区被屏蔽无法激活专业版的bug ([7532a96](https://github.com/certd/certd/commit/7532a960851b84d4f2cc3dba02353c5235e1a364))\n\n### Performance Improvements\n\n* 上传到主机，支持socks代理 ([d91026d](https://github.com/certd/certd/commit/d91026dc4fbfe5fedc4ee8e43dc0d08f1cf88356))\n* 支持上传到七牛云oss ([bf024bd](https://github.com/certd/certd/commit/bf024bdda8bc2a463475be5761acf0da7317a08a))\n\n## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)\n\n### Bug Fixes\n\n* 修复中间证书复制错误的bug ([76e86ea](https://github.com/certd/certd/commit/76e86ea283ecbe4ec76cdc92b98457d0fef544ac))\n\n### Performance Improvements\n\n* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))\n\n## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)\n\n### Bug Fixes\n\n* 修复启动报授权验证失败的bug ([3460d3d](https://github.com/certd/certd/commit/3460d3ddca222ea702816ab805909d489eff957f))\n\n## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)\n\n### Bug Fixes\n\n* 修复upload to host trim错误 ([0f0ddb9](https://github.com/certd/certd/commit/0f0ddb9c5963fd643d6d203334efac471c43ec3b))\n\n## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)\n\n**Note:** Version bump only for package @certd/ui-server\n\n# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)\n\n### Bug Fixes\n\n* 修复首次创建任务运行时不自动设置当前运行情况的bug ([ecd83ee](https://github.com/certd/certd/commit/ecd83ee136abdd3df9ed2f21ec2ff0f24c0ed9d9))\n\n### Features\n\n* 账号绑定 ([e046640](https://github.com/certd/certd/commit/e0466409d0c021bb415abd94df448c8a0d4799e9))\n* 支持中间证书 ([e86756e](https://github.com/certd/certd/commit/e86756e4c65a53dd23106d7ecbfe2fa987cc13f3))\n* 支持vip转移 ([361e8fe](https://github.com/certd/certd/commit/361e8fe7ae5877e23fd5de31bc919bedd09c57f5))\n\n### Performance Improvements\n\n* 群晖支持OTP双重验证登录 ([8b8039f](https://github.com/certd/certd/commit/8b8039f42bbce10a4d0e737cdeeeef9bb17bee5a))\n* 任务支持禁用 ([8ed16b3](https://github.com/certd/certd/commit/8ed16b3ea2dfe847357863a0bfa614e4fa5fc041))\n* 优化主机登录失败提示 ([9de77b3](https://github.com/certd/certd/commit/9de77b327d39cff5ed6660ec53b58ba0eea18e5a))\n* 增加重启certd插件 ([48238d9](https://github.com/certd/certd/commit/48238d929e6c4afa1d428e4d35b9159d37a47ae0))\n* 支持七牛云 ([8ecc2f9](https://github.com/certd/certd/commit/8ecc2f9446a9ebd11b9bfbffbb6cf7812a043495))\n* 支持k8s ingress secret ([e5a5d0a](https://github.com/certd/certd/commit/e5a5d0a607bb6b4e1a1f7a1a419bada5f2dee59f))\n* plugins增加图标 ([a8da658](https://github.com/certd/certd/commit/a8da658a9723342b4f43a579f7805bfef0648efb))\n\n## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09)\n\n### Bug Fixes\n\n* 修复腾讯云cdn证书部署后会自动关闭hsts，http2.0等配置的bug ([7908ab7](https://github.com/certd/certd/commit/7908ab79da624c94fa05849925b15e480e3317c4))\n* 修复腾讯云tke证书部署报错的bug ([653f409](https://github.com/certd/certd/commit/653f409d91a441850d6381f89a8dd390831f0d5e))\n\n### Performance Improvements\n\n* 支持群晖 ([5c270b6](https://github.com/certd/certd/commit/5c270b6b9d45a2152f9fdb3c07bd98b7c803cb8e))\n\n## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06)\n\n### Performance Improvements\n\n* 支持多吉云cdn证书部署 ([65ef685](https://github.com/certd/certd/commit/65ef6857296784ca765926e09eafcb6fc8b6ecde))\n\n## [1.24.2](https://github.com/certd/certd/compare/v1.24.1...v1.24.2) (2024-09-06)\n\n### Bug Fixes\n\n* 修复复制流水线出现的各种问题 ([6314e8d](https://github.com/certd/certd/commit/6314e8d7eb58cd52e2a7bd3b5ffb9112b0b69577))\n* 修复windows下无法执行第二条命令的bug ([71ac8aa](https://github.com/certd/certd/commit/71ac8aae4aa694e1a23761e9761c9fba30b43a21))\n\n### Performance Improvements\n\n* 任务配置不需要的字段可以自动隐藏 ([192d9dc](https://github.com/certd/certd/commit/192d9dc7e36737d684c769f255f407c28b1152ac))\n* 任务支持拖动排序 ([1e9b563](https://github.com/certd/certd/commit/1e9b5638aa36a8ce70019a9c750230ba41938327))\n* 西部数据支持用户级的apikey ([1c17b41](https://github.com/certd/certd/commit/1c17b41e160944b073e1849e6f9467c3659a4bfc))\n* 修复windows下无法执行第二条命令的bug ([d5bfcdb](https://github.com/certd/certd/commit/d5bfcdb6de1dcc1702155442e2e00237d0bbb6e5))\n* 支持阿里云oss ([87a2673](https://github.com/certd/certd/commit/87a2673e8c33dff6eda1b836d92ecc121564ed78))\n* 支持西部数码DNS ([c59cab1](https://github.com/certd/certd/commit/c59cab1aaeb19f86df8e3e0d8127cbd0a9ef77f3))\n* 支持pfx、der ([fbeaed2](https://github.com/certd/certd/commit/fbeaed203519f59b6d9396c4e8953353ccb5e723))\n\n## [1.24.1](https://github.com/certd/certd/compare/v1.24.0...v1.24.1) (2024-09-02)\n\n### Performance Improvements\n\n* 部署插件支持宝塔、易盾云等 ([ee61709](https://github.com/certd/certd/commit/ee617095efa1171548cf52fd45f0f98a368555a3))\n* 授权配置支持加密 ([42a56b5](https://github.com/certd/certd/commit/42a56b581d754c3e5f9838179d19ab0d004ef2eb))\n* 优化内存占用 ([db61033](https://github.com/certd/certd/commit/db6103363364440b650bc10bb334834e4a9470c7))\n* 支持阿里云 DCDN ([98b77f8](https://github.com/certd/certd/commit/98b77f80843834616fb26f83b4c42245326abd06))\n* 支持已跳过的步骤重新运行 ([ea775ad](https://github.com/certd/certd/commit/ea775adae18d57a04470cfba6b9460d761d74035))\n* 支持cdnfly ([724a850](https://github.com/certd/certd/commit/724a85028b4a7146c9e3b4df4497dcf2a7bf7c67))\n* 支持ftp上传 ([b9bddbf](https://github.com/certd/certd/commit/b9bddbfabb5664365f1232e9432532187c98006c))\n\n# [1.24.0](https://github.com/certd/certd/compare/v1.23.1...v1.24.0) (2024-08-25)\n\n### Bug Fixes\n\n* 部署到腾讯云cdn选择证书任务步骤限制只能选证书 ([3345c14](https://github.com/certd/certd/commit/3345c145b802170f75a098a35d0c4b8312efcd17))\n* 修复成功后跳过之后丢失腾讯云证书id的bug ([37eb762](https://github.com/certd/certd/commit/37eb762afe25c5896b75dee25f32809f8426e7b7))\n* 修复创建流水线后立即运行时报no id错误的bug ([17ead54](https://github.com/certd/certd/commit/17ead547aab25333603980304aa3aad3db1f73d5))\n* 修复执行日志没有清理的bug ([22a3363](https://github.com/certd/certd/commit/22a336370a88a7df2a23c967043bae153da71ed5))\n* 修复ssh无法连接成功，无法执行命令的bug ([41b9837](https://github.com/certd/certd/commit/41b9837582323fb400ef8525ce65e8b37ad4b36f))\n\n### Features\n\n* 支持ECC类型 ([a7424e0](https://github.com/certd/certd/commit/a7424e02f5c7e02ac1688791040785920ce67473))\n\n### Performance Improvements\n\n* 更新k8s底层api库 ([746bb9d](https://github.com/certd/certd/commit/746bb9d385e2f397daef4976eca1d4782a2f5ebd))\n* 优化成功后跳过的提示 ([7b451bb](https://github.com/certd/certd/commit/7b451bbf6e6337507f4627b5a845f5bd96ab4f7b))\n* 优化证书申请成功率 ([968c469](https://github.com/certd/certd/commit/968c4690a07f69c08dcb3d3a494da4e319627345))\n* 优化dnspod的token id 说明 ([790bf11](https://github.com/certd/certd/commit/790bf11af06d6264ef74bc1bb919661f0354239a))\n* email proxy ([453f1ba](https://github.com/certd/certd/commit/453f1baa0b9eb0f648aa1b71ccf5a95b202ce13f))\n\n## [1.23.1](https://github.com/certd/certd/compare/v1.23.0...v1.23.1) (2024-08-06)\n\n### Bug Fixes\n\n* 修复模糊查询无效的bug ([9355917](https://github.com/certd/certd/commit/93559174c780173f0daec7cdbd1f72f8d5c504d5))\n\n### Performance Improvements\n\n* 优化插件字段的default value ([24c7be2](https://github.com/certd/certd/commit/24c7be2c9cb39c14f7a97b674127c88033280b02))\n\n# [1.23.0](https://github.com/certd/certd/compare/v1.22.9...v1.23.0) (2024-08-05)\n\n### Bug Fixes\n\n* 修复环境变量多个下划线不生效的bug ([7ec2218](https://github.com/certd/certd/commit/7ec2218c9fee5bee2bf0aa31f3e3a4301575f247))\n\n## [1.22.9](https://github.com/certd/certd/compare/v1.22.8...v1.22.9) (2024-08-05)\n\n### Performance Improvements\n\n* 优化定时任务 ([87e440e](https://github.com/certd/certd/commit/87e440ee2a8b10dc571ce619f28bc83c1e5eb147))\n\n## [1.22.8](https://github.com/certd/certd/compare/v1.22.7...v1.22.8) (2024-08-05)\n\n### Performance Improvements\n\n* 修复删除历史记录没有删除log的bug，新增history管理页面，演示站点启动时不自动启动非管理员用户的定时任务 ([f78ae93](https://github.com/certd/certd/commit/f78ae93eedfe214008c3d071ca3d77c962137a64))\n* 优化pipeline删除时，删除其他history ([b425203](https://github.com/certd/certd/commit/b4252033d56a9ad950f3e204ff021497c3978015))\n\n## [1.22.7](https://github.com/certd/certd/compare/v1.22.6...v1.22.7) (2024-08-04)\n\n### Bug Fixes\n\n* 修复保存配置报id不能为空的bug ([367f807](https://github.com/certd/certd/commit/367f80731396003416665c22853dfbc09c2c03a0))\n\n## [1.22.6](https://github.com/certd/certd/compare/v1.22.5...v1.22.6) (2024-08-03)\n\n### Bug Fixes\n\n* 修复在相同的cron时偶尔无法触发定时任务的bug ([680941a](https://github.com/certd/certd/commit/680941af119619006b592e3ab6fb112cb5556a8b))\n* 修复pg下pipeline title 类型问题 ([a9717b9](https://github.com/certd/certd/commit/a9717b9a0df7b5a64d4fe03314fecad4f59774cc))\n\n### Performance Improvements\n\n* 流水线支持名称模糊查询 ([59897c4](https://github.com/certd/certd/commit/59897c4ceae992ebe2972ca9e8f9196616ffdfd7))\n* 腾讯云clb支持更多大区选择 ([e4f4570](https://github.com/certd/certd/commit/e4f4570b29f26c60f1ee9660a4c507cbeaba3d7e))\n\n## [1.22.5](https://github.com/certd/certd/compare/v1.22.4...v1.22.5) (2024-07-26)\n\n### Bug Fixes\n\n* 修复用户管理无法添加用户的bug ([e7e89b8](https://github.com/certd/certd/commit/e7e89b8de7386e84c0d6b8e217e2034909657d68))\n\n## [1.22.4](https://github.com/certd/certd/compare/v1.22.3...v1.22.4) (2024-07-26)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.22.3](https://github.com/certd/certd/compare/v1.22.2...v1.22.3) (2024-07-25)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.22.2](https://github.com/certd/certd/compare/v1.22.1...v1.22.2) (2024-07-23)\n\n### Bug Fixes\n\n* 修复创建流水线时，无法根据dns类型默认正确的dns授权的bug ([a2c43b5](https://github.com/certd/certd/commit/a2c43b50a6069ed48958fd142844a8568c2af452))\n\n## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20)\n\n### Performance Improvements\n\n* 创建证书任务可以选择lege插件 ([affef13](https://github.com/certd/certd/commit/affef130378030c517250c58a4e787b0fc85d7d1))\n* 支持配置启动后自动触发一次任务 ([a5a0c1f](https://github.com/certd/certd/commit/a5a0c1f6e7a3f05e581005e491d5b102ee854412))\n\n# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)\n\n### Features\n\n* 升级midway，支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))\n* 支持lego，海量DNS提供商 ([0bc6d0a](https://github.com/certd/certd/commit/0bc6d0a211920fb0084d705e1db67ee1e7262c44))\n* 支持postgresql ([3b19bfb](https://github.com/certd/certd/commit/3b19bfb4291e89064b3b407a80dae092d54747d5))\n\n### Performance Improvements\n\n* 优化一些小细节 ([b168852](https://github.com/certd/certd/commit/b1688525dbbbfd67e0ab1cf5b4ddfbe9d394f370))\n* 自动生成jwtkey，无需手动配置 ([390e485](https://github.com/certd/certd/commit/390e4853a570390a97df6a3b3882579f9547eeb4))\n\n## [1.21.2](https://github.com/fast-crud/fast-server-js/compare/v1.21.1...v1.21.2) (2024-07-08)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.21.1](https://github.com/fast-crud/fast-server-js/compare/v1.21.0...v1.21.1) (2024-07-08)\n\n### Performance Improvements\n\n* 上传到主机，支持设置不mkdirs ([5ba9831](https://github.com/fast-crud/fast-server-js/commit/5ba9831ed1aa6ec6057df246f1035b36b9c41d2e))\n* 说明优化，默认值优化 ([970c7fd](https://github.com/fast-crud/fast-server-js/commit/970c7fd8a0f557770e973d8462ee5684ef742810))\n\n# [1.21.0](https://github.com/fast-crud/fast-server-js/compare/v1.20.17...v1.21.0) (2024-07-03)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.20.17](https://github.com/fast-crud/fast-server-js/compare/v1.20.16...v1.20.17) (2024-07-03)\n\n### Performance Improvements\n\n* 文件上传提示由cert.crt改为cert.pem ([a09b0e4](https://github.com/fast-crud/fast-server-js/commit/a09b0e48c176f3ed763791bd50322c29729f7c1c))\n\n## [1.20.16](https://github.com/fast-crud/fast-server-js/compare/v1.20.15...v1.20.16) (2024-07-01)\n\n### Bug Fixes\n\n* 修复配置了cdn cname后申请失败的bug ([4a5fa76](https://github.com/fast-crud/fast-server-js/commit/4a5fa767edc347d03d29a467e86c9a4d70b0220c))\n\n## [1.20.15](https://github.com/fast-crud/fast-server-js/compare/v1.20.14...v1.20.15) (2024-06-28)\n\n### Bug Fixes\n\n* 修复无法强制取消任务的bug ([9cc01db](https://github.com/fast-crud/fast-server-js/commit/9cc01db1d569a5c45bb3e731f35d85df324a8e62))\n\n### Performance Improvements\n\n* 腾讯云dns provider 支持腾讯云的accessId ([e0eb3a4](https://github.com/fast-crud/fast-server-js/commit/e0eb3a441384d474fe2923c69b25318264bdc9df))\n* 支持windows文件上传 ([7f61cab](https://github.com/fast-crud/fast-server-js/commit/7f61cab101fa13b4e88234e9ad47434e6130fed2))\n\n## [1.20.14](https://github.com/fast-crud/fast-server-js/compare/v1.20.13...v1.20.14) (2024-06-23)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.20.13](https://github.com/fast-crud/fast-server-js/compare/v1.20.12...v1.20.13) (2024-06-18)\n\n### Performance Improvements\n\n* ssh登录支持openssh格式私钥、支持私钥密码 ([5c2c508](https://github.com/fast-crud/fast-server-js/commit/5c2c50839a9076004f9034d754ac6deb531acdfb))\n\n## [1.20.12](https://github.com/fast-crud/fast-server-js/compare/v1.20.10...v1.20.12) (2024-06-17)\n\n### Bug Fixes\n\n* 修复aliyun域名超过100个找不到域名的bug ([5b1494b](https://github.com/fast-crud/fast-server-js/commit/5b1494b3ce93d1026dc56ee741342fbb8bf7be24))\n\n### Performance Improvements\n\n* 增加系统设置，可以关闭自助注册功能 ([20feace](https://github.com/fast-crud/fast-server-js/commit/20feacea12d43386540db6a600f391d786be4014))\n* 增加cloudflare access token说明 ([934e6e2](https://github.com/fast-crud/fast-server-js/commit/934e6e2bd05387cd50ffab95f230933543954098))\n* 支持重置管理员密码，忘记密码的补救方案 ([732cbc5](https://github.com/fast-crud/fast-server-js/commit/732cbc5e927b526850724594830392b2f10c6705))\n* 支持cloudflare域名 ([fbb9a47](https://github.com/fast-crud/fast-server-js/commit/fbb9a47e8f7bb805289b9ee64bd46ffee0f01c06))\n\n## [1.20.10](https://github.com/fast-crud/fast-server-js/compare/v1.20.9...v1.20.10) (2024-05-30)\n\n### Performance Improvements\n\n* 上传到主机插件支持复制到本机路径 ([92446c3](https://github.com/fast-crud/fast-server-js/commit/92446c339936f98f08f654b8971a7393d8435224))\n* 优化文件下载包名 ([d9eb927](https://github.com/fast-crud/fast-server-js/commit/d9eb927b0a1445feab08b1958aa9ea80637a5ae6))\n\n## [1.20.9](https://github.com/fast-crud/fast-server-js/compare/v1.20.8...v1.20.9) (2024-03-22)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.20.8](https://github.com/fast-crud/fast-server-js/compare/v1.20.7...v1.20.8) (2024-03-22)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.20.7](https://github.com/fast-crud/fast-server-js/compare/v1.20.6...v1.20.7) (2024-03-22)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.20.6](https://github.com/fast-crud/fast-server-js/compare/v1.20.5...v1.20.6) (2024-03-21)\n\n### Performance Improvements\n\n* 插件贡献文档及示例 ([72fb20a](https://github.com/fast-crud/fast-server-js/commit/72fb20abf3ba5bdd862575d2907703a52fd7eb17))\n\n## [1.20.5](https://github.com/fast-crud/fast-server-js/compare/v1.20.2...v1.20.5) (2024-03-11)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.20.2](https://github.com/fast-crud/fast-server-js/compare/v1.2.1...v1.20.2) (2024-02-28)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.2.1](https://github.com/fast-crud/fast-server-js/compare/v1.2.0...v1.2.1) (2023-12-12)\n\n### Bug Fixes\n\n* 修复邮箱设置无效的bug ([aaa3224](https://github.com/fast-crud/fast-server-js/commit/aaa322464d0f65e924d1850995540d396ee24d25))\n\n**Note:** Version bump only for package @certd/ui-server\n\n# [1.2.0](https://github.com/fast-crud/fast-server-js/compare/v1.1.6...v1.2.0) (2023-10-27)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.1.6](https://github.com/fast-crud/fast-server-js/compare/v1.1.5...v1.1.6) (2023-07-10)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.1.5](https://github.com/fast-crud/fast-server-js/compare/v1.1.4...v1.1.5) (2023-07-03)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.1.4](https://github.com/fast-crud/fast-server-js/compare/v1.1.3...v1.1.4) (2023-07-03)\n\n### Performance Improvements\n\n* cancel task ([bc65c0a](https://github.com/fast-crud/fast-server-js/commit/bc65c0a786360c087fe95cad93ec6a87804cc5ee))\n* flush logger ([91be682](https://github.com/fast-crud/fast-server-js/commit/91be6826b902e0f302b1a6cbdb1d24e15914c18d))\n* timeout ([3eeb1f7](https://github.com/fast-crud/fast-server-js/commit/3eeb1f77aa2922f3545f3d2067f561d95621d54f))\n\n## [1.1.3](https://github.com/fast-crud/fast-server-js/compare/v1.1.2...v1.1.3) (2023-07-03)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.1.2](https://github.com/fast-crud/fast-server-js/compare/v1.1.1...v1.1.2) (2023-07-03)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.1.1](https://github.com/fast-crud/fast-server-js/compare/v1.1.0...v1.1.1) (2023-06-28)\n\n**Note:** Version bump only for package @certd/ui-server\n\n# [1.1.0](https://github.com/fast-crud/fast-server-js/compare/v1.0.6...v1.1.0) (2023-06-28)\n\n### Features\n\n* 权限控制 ([27a4c81](https://github.com/fast-crud/fast-server-js/commit/27a4c81c6d70e70abb3892c3ea58d4719988808a))\n* 邮件通知 ([937e3fa](https://github.com/fast-crud/fast-server-js/commit/937e3fac19cd03b8aa91db8ba03fda7fcfbacea2))\n* cert download ([5a51c14](https://github.com/fast-crud/fast-server-js/commit/5a51c14de521cb8075a80d2ae41a16e6d5281259))\n* config  merge ([fdc25dc](https://github.com/fast-crud/fast-server-js/commit/fdc25dc0d795555cffacc4572648ec158988fbbb))\n* save files ([671d273](https://github.com/fast-crud/fast-server-js/commit/671d273e2f9136d16896536b0ca127cf372f1619))\n\n## [1.0.6](https://github.com/fast-crud/fast-server-js/compare/v1.0.5...v1.0.6) (2023-05-25)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.0.5](https://github.com/fast-crud/fast-server-js/compare/v1.0.4...v1.0.5) (2023-05-25)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.0.4](https://github.com/fast-crud/fast-server-js/compare/v1.0.3...v1.0.4) (2023-05-25)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.0.3](https://github.com/fast-crud/fast-server-js/compare/v1.0.2...v1.0.3) (2023-05-25)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.0.2](https://github.com/fast-crud/fast-server-js/compare/v1.0.1...v1.0.2) (2023-05-24)\n\n**Note:** Version bump only for package @certd/ui-server\n\n## [1.0.1](https://github.com/fast-crud/fast-server-js/compare/v1.0.0...v1.0.1) (2023-05-24)\n\n**Note:** Version bump only for package @certd/ui-server\n"
  },
  {
    "path": "packages/ui/certd-server/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 fast-crud\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": "packages/ui/certd-server/README.md",
    "content": "# certd-server\n\n## heap分析\n\n```shell\n# node_modules\\@midwayjs\\bootstrap\\dist\\bootstrap.js\n# 注释 137行\n// process.once('SIGINT', this.onSignal.bind(t\n\n```\n\n\n```shell\nnpm run heap\n```\n\n"
  },
  {
    "path": "packages/ui/certd-server/README.zh-CN.md",
    "content": "# my_midway_project\n\n## 快速入门\n\n<!-- 在此次添加使用文档 -->\n\n如需进一步了解，参见 [midway 文档][midway]。\n\n### 本地开发\n\n```bash\n$ npm i\n$ npm run dev\n$ open http://localhost:7001/\n```\n\n### 部署\n\n```bash\n$ npm start\n```\n\n### 内置指令\n\n- 使用 `npm run lint` 来做代码风格检查。\n- 使用 `npm test` 来执行单元测试。\n\n\n[midway]: https://midwayjs.org\n"
  },
  {
    "path": "packages/ui/certd-server/app.js",
    "content": "// 获取框架\nconst WebFramework = require('@midwayjs/koa').Framework;\nconst { Bootstrap } = require('@midwayjs/bootstrap');\n\nconst DirectoryFileDetector = require('@midwayjs/core').DirectoryFileDetector;\n\nconst baseDir = process.cwd();\nconst pipelineDir = baseDir + './node_modules/@certd/pipeline/dist';\nconst customFileDetector = new DirectoryFileDetector({\n  loadDir: [baseDir, pipelineDir],\n});\n\nmodule.exports = async () => {\n  // 加载框架并执行\n  await Bootstrap.configure({\n    moduleDetector: customFileDetector,\n  }).run();\n  // 获取依赖注入容器\n  const container = Bootstrap.getApplicationContext();\n  // 获取 koa framework\n  const framework = container.get(WebFramework);\n  // 返回 app 对象\n  return framework.getApplication();\n};\n"
  },
  {
    "path": "packages/ui/certd-server/before-build.js",
    "content": "import fs from 'fs';\n//瘦身\nconst filePath = './node_modules/typeorm/platform/PlatformTools.js';\nconst find = `const cli_highlight_1 = require(\"cli-highlight\");`;\nconst rep = 'const cli_highlight_1 ={highlight: (str) => { return str }};';\n\n// 在 filePath 找到 find那一行 用 rep 替换\nfunction slimming(filePath, find, rep) {\n  fs.readFile(filePath, 'utf8', function (err, data) {\n    if (err) {\n      return console.log(err);\n    }\n    var result = data.replace(find, rep);\n    fs.writeFile(filePath, result, 'utf8', function (err) {\n      if (err) return console.log(err);\n    });\n  });\n}\nslimming(filePath, find, rep);\n"
  },
  {
    "path": "packages/ui/certd-server/bootstrap.js",
    "content": "import { Bootstrap } from '@midwayjs/bootstrap';\nawait Bootstrap.run();\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v00001__init.sql",
    "content": "-- 表：sys_permission\nCREATE TABLE \"sys_permission\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"title\" varchar(100) NOT NULL, \"permission\" varchar(100), \"parent_id\" integer NOT NULL DEFAULT (-1), \"sort\" integer NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (1, '系统管理', 'sys', -1, 1, 1, 1624085863636);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (2, '权限管理', 'sys:auth', 1, 1, 1, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (3, '用户管理', 'sys:auth:user', 2, 1, 1, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (4, '查看', 'sys:auth:user:view', 3, 100, 1, 1624189112333);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (5, '权限管理', 'sys:auth:per', 2, 1, 1, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (6, '查看', 'sys:auth:per:view', 5, 100, 1, 1624189161317);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (7, '角色管理', 'sys:auth:role', 2, 1, 1, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (8, '查看', 'sys:auth:role:view', 7, 1, 1, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (9, '修改', 'sys:auth:user:edit', 3, 300, 1, 1624189127688);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (10, '删除', 'sys:auth:user:remove', 3, 400, 1, 1624189133184);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (11, '添加', 'sys:auth:user:add', 3, 200, 1, 1624189142576);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (12, '修改', 'sys:auth:role:edit', 7, 1, 1, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (13, '删除', 'sys:auth:role:remove', 7, 1, 1, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (14, '添加', 'sys:auth:role:add', 7, 1, 1, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (15, '修改', 'sys:auth:per:edit', 5, 300, 1, 1624189308837);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (16, '删除', 'sys:auth:per:remove', 5, 400, 1, 1624189256926);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (17, '添加', 'sys:auth:per:add', 5, 200, 1, 1624189283766);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort, create_time, update_time) VALUES (18,'授权','sys:auth:role:authz',7,100,1,1624335712144);\n\n\n\n-- 表：sys_role\nCREATE TABLE \"sys_role\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"name\" varchar(100) NOT NULL, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_role (id, name, create_time, update_time) VALUES (1, '管理员', 1, 1623749138537);\nINSERT INTO sys_role (id, name, create_time, update_time) VALUES (2, '只读角色', 1, 1623749138537);\n\n-- 表：sys_role_permission\nCREATE TABLE \"sys_role_permission\" (\"role_id\" integer NOT NULL, \"permission_id\" integer NOT NULL, PRIMARY KEY (\"role_id\", \"permission_id\"));\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 2);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 3);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 4);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 5);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 6);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 7);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 8);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 9);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 10);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 11);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 12);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 13);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 14);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 15);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 16);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 17);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 18);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, -1);\n\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 4);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 6);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 8);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 2);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 3);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 5);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 7);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, -1);\n\n-- 表：sys_user\nCREATE TABLE \"sys_user\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"username\" varchar(100) NOT NULL, \"password\" varchar(50) NOT NULL, \"nick_name\" varchar(50), \"avatar\" varchar(255), \"phone_code\" varchar(20), \"mobile\" varchar(20), \"email\" varchar(100),\"remark\" varchar(100), \"status\" integer NOT NULL DEFAULT (1), \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 'admin', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,NULL);\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status, create_time, update_time,remark) VALUES (2, 'readonly', 'e10adc3949ba59abbe56e057f20f883e', '只读用户', NULL, NULL, NULL, NULL, 1, 2011123132, 123132,'密码：123456');\n\n-- 表：sys_user_role\nCREATE TABLE \"sys_user_role\" (\"role_id\" integer NOT NULL, \"user_id\" integer NOT NULL, PRIMARY KEY (\"role_id\", \"user_id\"));\nINSERT INTO sys_user_role (role_id, user_id) VALUES (1, 1);\nINSERT INTO sys_user_role (role_id, user_id) VALUES (2, 2);\n\n-- 索引：IDX_223de54d6badbe43a5490450c3\nCREATE UNIQUE INDEX \"IDX_223de54d6badbe43a5490450c3\" ON \"sys_role\" (\"name\");\n\n-- 索引：IDX_9e7164b2f1ea1348bc0eb0a7da\nCREATE UNIQUE INDEX \"IDX_9e7164b2f1ea1348bc0eb0a7da\" ON \"sys_user\" (\"username\");\n\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v00002__for_pre.sql",
    "content": "-- for preview 限制演示环境的数据修改\nupdate sqlite_sequence set seq = 1000 where name = 'sys_user' ;\nupdate sqlite_sequence set seq = 1000 where name = 'sys_permission' ;\nupdate sqlite_sequence set seq = 1000 where name = 'sys_role' ;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10000__certd.sql",
    "content": "--\n-- 由SQLiteStudio v3.3.3 产生的文件 周六 7月 3 00:38:02 2021\n--\n-- 文本编码：UTF-8\n--\n\n-- 表：cd_access\nCREATE TABLE \"cd_access\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"user_id\" integer NOT NULL, \"name\" varchar(100) NOT NULL, \"type\" varchar(100) NOT NULL, \"setting\" varchar(1024), \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\n-- 表：cd_cert\nCREATE TABLE \"cd_cert\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"user_id\" integer NOT NULL, \"domains\" varchar(2048) NOT NULL, \"email\" varchar(100) NOT NULL, \"cert_issuer_id\" integer, \"challenge_type\" varchar(100),  \"challenge_dns_type\" varchar(100),\"challenge_access_id\" integer, \"country\" varchar(100), \"state\" varchar(100), \"locality\" varchar(100), \"organization\" varchar(100), \"organization_unit\" varchar(100), \"remark\" varchar(100), \"last_history_id\" integer, \"last_success_id\" integer, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\n-- 表：cd_cert_apply_history\nCREATE TABLE \"cd_cert_apply_history\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"user_id\" integer NOT NULL, \"cert_id\" integer NOT NULL, \"success\" boolean, \"result\" varchar(1024), \"cert_crt\" varchar(1024), \"cert_key\" varchar(1024), \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\n-- 表：cd_cert_issuer\nCREATE TABLE \"cd_cert_issuer\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"user_id\" integer NOT NULL, \"type\" varchar(20) NOT NULL, \"account\" varchar(100) NOT NULL, \"private_key\" varchar(1024), \"setting\" varchar, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\n-- 表：cd_task\nCREATE TABLE \"cd_task\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"user_id\" integer NOT NULL, \"name\" varchar(100), \"type\" varchar(100), \"setting\" varchar(2048), \"cert_id\" integer NOT NULL, \"last_history_id\" integer, \"last_success_id\" integer, \"remark\" varchar(100), \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\n-- 表：cd_task_history\nCREATE TABLE \"cd_task_history\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"user_id\" integer NOT NULL, \"task_id\" integer NOT NULL, \"cert_id\" integer NOT NULL, \"cert_apply_history_id\" integer NOT NULL, \"success\" boolean, \"result\" varchar(2048), \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10001__certdv2.sql",
    "content": "CREATE TABLE \"pi_history\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"user_id\" integer NOT NULL, \"pipeline_id\" integer NOT NULL, \"pipeline\" varchar(40960), \"status\" varchar(20), \"end_time\" datetime, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\nCREATE TABLE \"pi_history_log\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"user_id\" integer NOT NULL, \"pipeline_id\" integer NOT NULL, \"history_id\" integer NOT NULL, \"node_id\" varchar(100), \"logs\" varchar(40960), \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\nCREATE TABLE \"pi_pipeline\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"user_id\" integer NOT NULL, \"title\" integer NOT NULL, \"content\" varchar(40960) NOT NULL, \"keep_history_count\" integer, \"remark\" varchar(100), \"status\" varchar(100), \"disabled\" boolean DEFAULT (0), \"last_history_time\" integer, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\nCREATE TABLE \"pi_storage\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"user_id\" integer NOT NULL, \"scope\" varchar NOT NULL, \"namespace\" varchar NOT NULL, \"version\" varchar(100),\"key\" varchar(100), \"value\" varchar(40960), \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10002__settings.sql",
    "content": "CREATE TABLE \"sys_settings\" (\n                              \"id\" integer NOT NULL PRIMARY KEY AUTOINCREMENT,\n                              \"user_id\" integer NOT NULL,\n                              \"key\" varchar(100) NOT NULL,\n                              \"title\" varchar(100) NOT NULL,\n                              \"setting\" varchar(1024),\n                              \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n                              \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10003__role_user.sql",
    "content": "INSERT INTO sys_role (id, name, create_time, update_time) VALUES (3, '普通用户', 1, 1623749138537);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10004__settings.sql",
    "content": "ALTER TABLE \"sys_settings\" RENAME TO \"user_settings\";\n\nCREATE TABLE \"sys_settings\" (\n                              \"id\" integer NOT NULL PRIMARY KEY AUTOINCREMENT,\n                              \"key\" varchar(100) NOT NULL,\n                              \"title\" varchar(100) NOT NULL,\n                              \"setting\" varchar(1024),\n                              \"access\" varchar(100) NOT NULL,\n                              \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n                              \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\n\nINSERT INTO sys_permission (title, permission, parent_id, sort, create_time, update_time) VALUES ('系统设置', 'sys:settings', (SELECT id FROM sys_permission WHERE permission = 'sys'), 1, 1, 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, last_insert_rowid());\nINSERT INTO sys_permission (title, permission, parent_id, sort, create_time, update_time) VALUES ('查看', 'sys:settings:view', (SELECT id FROM sys_permission WHERE permission = 'sys:settings'), 1, 1, 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, last_insert_rowid());\nINSERT INTO sys_permission (title, permission, parent_id, sort, create_time, update_time) VALUES ('编辑', 'sys:settings:edit', (SELECT id FROM sys_permission WHERE permission = 'sys:settings'), 1, 1, 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, last_insert_rowid());\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10005__password2.sql",
    "content": "INSERT INTO sys_settings (\"key\", title, setting,access) VALUES ('sys.install','安装信息','{\"installTime\":'|| (select timestamp from 'flyway_history' where id = 1 )||'}','private');\n\nALTER TABLE sys_user ADD COLUMN password_version integer DEFAULT 1;\nALTER TABLE sys_user ADD COLUMN password_salt varchar(36);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10006__pipeline_title.sql",
    "content": "alter table pi_pipeline  add COLUMN \"order\" integer default 0;\n\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10007__access_text.sql",
    "content": ""
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10008__access_encrypt.sql",
    "content": "alter table cd_access  add COLUMN \"encrypt_setting\" text;\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10009__cname.sql",
    "content": "CREATE TABLE \"cd_cname_provider\"\n(\n  \"id\"                integer      NOT NULL PRIMARY KEY AUTOINCREMENT,\n  \"domain\"            varchar(100) NOT NULL,\n  \"dns_provider_type\" varchar(100) NOT NULL,\n  \"access_id\"         integer      NOT NULL,\n  \"is_default\"        boolean      NOT NULL,\n  \"remark\"            varchar(200),\n  \"disabled\"          boolean      NOT NULL,\n  \"create_time\"       datetime     NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"       datetime     NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\n\nCREATE TABLE \"cd_cname_record\"\n(\n  \"id\"                integer      NOT NULL PRIMARY KEY AUTOINCREMENT,\n  \"user_id\"           integer      NOT NULL,\n  \"domain\"            varchar(100) NOT NULL,\n  \"host_record\"       varchar(100) NOT NULL,\n  \"record_value\"      varchar(200) NOT NULL,\n  \"cname_provider_id\" integer      NOT NULL,\n  \"status\"            varchar(100) NOT NULL,\n  \"create_time\"       datetime     NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"       datetime     NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10010__plugin.sql",
    "content": "CREATE TABLE \"pi_plugin\"\n(\n  \"id\"          integer      NOT NULL PRIMARY KEY AUTOINCREMENT,\n  \"name\"        varchar(100) NOT NULL,\n  \"icon\"        varchar(100),\n  \"title\"       varchar(200),\n  \"desc\"        varchar(500),\n  \"group\"       varchar(100),\n  \"version\"     varchar(100),\n  \"setting\"     text,\n  \"sys_setting\" text,\n  \"content\"     text,\n  \"type\"        varchar(100) NOT NULL,\n  \"disabled\"    boolean      NOT NULL,\n  \"create_time\" datetime     NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" datetime     NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10011__cname_provider_user_id.sql",
    "content": "ALTER TABLE cd_cname_provider ADD COLUMN user_id integer;\n\nupdate cd_cname_provider set user_id = 1;\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10012__disabled_readonly_user.sql",
    "content": "\nupdate sys_user set status = 0 where id = 2;\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10013__notification.sql",
    "content": "\nCREATE TABLE \"pi_notification\" (\"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL, \"user_id\" integer NOT NULL, \"name\" varchar(100) NOT NULL, \"type\" varchar(100) NOT NULL, \"setting\" text, \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10014__notification_default.sql",
    "content": "ALTER TABLE pi_notification ADD COLUMN is_default boolean DEFAULT (0);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10015__pipeline_group.sql",
    "content": "CREATE TABLE \"pi_pipeline_group\"\n(\n  \"id\"          integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n  \"user_id\"     integer      NOT NULL,\n  \"name\"        varchar(100) NOT NULL,\n  \"icon\"        varchar(100),\n  \"favorite\"    boolean      NOT NULL DEFAULT (false),\n  \"create_time\" datetime     NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" datetime     NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nALTER TABLE pi_pipeline\n  ADD COLUMN group_id integer;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10016__index.sql",
    "content": "\nCREATE INDEX \"index_access_user_id\" ON \"cd_access\" (\"user_id\");\n\nCREATE INDEX \"index_cname_record_user_id\" ON \"cd_cname_record\" (\"user_id\");\n\n\nCREATE INDEX \"index_history_user_id\" ON \"pi_history\" (\"user_id\");\n\nCREATE INDEX \"index_history_log_user_id\" ON \"pi_history_log\" (\"user_id\");\n\nCREATE INDEX \"index_history_log_pipeline_id\" ON \"pi_history_log\" (\"pipeline_id\");\n\nCREATE INDEX \"index_notification_user_id\" ON \"pi_notification\" (\"user_id\");\n\nCREATE INDEX \"index_pipeline_user_id\" ON \"pi_pipeline\" (\"user_id\");\nCREATE INDEX \"index_pipeline_group_user_id\" ON \"pi_pipeline_group\" (\"user_id\");\n\n\n\nCREATE INDEX \"index_storage_default_get\" ON \"pi_storage\" (\"scope\", \"namespace\", \"key\");\nCREATE INDEX \"index_storage_user_id\" ON \"pi_storage\" (\"user_id\");\n\n\nCREATE INDEX \"index_user_email\" ON \"sys_user\" (\"email\");\nCREATE INDEX \"index_user_mobile\" ON \"sys_user\" (\"mobile\");\n\nCREATE INDEX \"index_permission\" ON \"sys_permission\" (\"permission\");\n\n\nCREATE INDEX \"index_user_settings_user_id\" ON \"user_settings\" (\"user_id\");\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10017__field_type.sql",
    "content": ""
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10018__suite.sql",
    "content": "CREATE TABLE \"cd_product\"\n(\n  \"id\"              integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n  \"icon\"            varchar(100),\n  \"title\"           varchar(100),\n  \"type\"            varchar(100),\n  \"content\"         varchar(4096),\n  \"duration_prices\" varchar(10240),\n  \"duration\"        integer,\n  \"price\"           integer,\n  \"intro\"           varchar(10240),\n  \"order\"           integer,\n  \"support_buy\"     boolean,\n  \"disabled\"        boolean  NOT NULL DEFAULT (false),\n  \"create_time\"     datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"     datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE TABLE \"cd_trade\"\n(\n  \"id\"          integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n  \"trade_no\"    varchar(100),\n  \"user_id\"     integer,\n  \"product_id\"  integer,\n  \"title\"       varchar(1024),\n  \"desc\"        varchar(2048),\n  \"num\"         integer,\n  \"duration\"    integer,\n  \"price\"       integer,\n  \"amount\"      integer,\n  \"remark\"      varchar(2048),\n  \"status\"      varchar(100),\n  \"pay_type\"    varchar(50),\n  \"pay_time\"    integer,\n  \"pay_no\"      varchar(100),\n  \"end_time\"    integer,\n  \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_trade_user_id\" ON \"cd_trade\" (\"user_id\");\nCREATE UNIQUE INDEX \"index_trade_trade_no\" ON \"cd_trade\" (\"trade_no\");\nCREATE INDEX \"index_trade_pay_no\" ON \"cd_trade\" (\"pay_type\", \"pay_no\");\n\n\nCREATE TABLE \"cd_user_suite\"\n(\n  \"id\"                integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n  \"user_id\"           integer,\n  \"product_id\"        integer,\n  \"trade_id\"          integer,\n  \"icon\"              varchar(100),\n  \"title\"             varchar(100),\n  \"content\"           text,\n  \"duration\"          integer,\n  \"product_type\"      varchar(50),\n  \"deploy_count_used\" integer,\n  \"is_present\"        boolean,\n  \"is_bootstrap\"      boolean,\n  \"is_empty\"          boolean,\n  \"disabled\"          boolean  NOT NULL DEFAULT (false),\n  \"active_time\"       integer,\n  \"expires_time\"      integer,\n  \"create_time\"       datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"       datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_user_suite_user_id\" ON \"cd_user_suite\" (\"user_id\");\n\n\nDROP TABLE IF EXISTS \"cd_cert\";\nDROP TABLE IF EXISTS \"cd_cert_apply_history\";\nDROP TABLE IF EXISTS \"cd_cert_issuer\";\nDROP TABLE IF EXISTS \"cd_task\";\nDROP TABLE IF EXISTS \"cd_task_history\";\n\n\n\nCREATE TABLE \"cd_cert_info\"\n(\n  \"id\"            integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n  \"user_id\"       integer,\n  \"domain\"        varchar(100),\n  \"domains\"       varchar(10240),\n  \"domain_count\"  integer,\n  \"pipeline_id\"   integer,\n  \"apply_time\"    integer,\n  \"from_type\"     varchar(100),\n  \"cert_provider\" varchar(100),\n  \"expires_time\"  integer,\n  \"cert_info\"     text,\n  \"cert_file\"     varchar(100),\n  \"disabled\"      boolean  NOT NULL DEFAULT (false),\n  \"create_time\"   datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"   datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_cert_info_user_id\" ON \"cd_cert_info\" (\"user_id\");\nCREATE INDEX \"index_cert_info_domain\" ON \"cd_cert_info\" (\"domain\");\nCREATE INDEX \"index_cert_info_domains\" ON \"cd_cert_info\" (\"domains\");\nCREATE INDEX \"index_cert_info_pipeline\" ON \"cd_cert_info\" (\"pipeline_id\");\n\n\nCREATE TABLE \"cd_site_info\"\n(\n  \"id\"                integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n  \"user_id\"           integer,\n\n  \"name\"              varchar(100),\n  \"domain\"            varchar(100),\n\n  \"https_port\"        integer,\n  \"cert_domains\"      varchar(10240),\n  \"cert_info\"         varchar(10240),\n  \"cert_provider\"     varchar(100),\n  \"cert_status\"       varchar(100),\n  \"cert_expires_time\" integer,\n  \"last_check_time\"   integer,\n  \"check_status\"      varchar(100),\n  \"error\"             varchar(4096),\n  \"pipeline_id\"       integer,\n  \"cert_info_id\"      integer,\n  \"disabled\"          boolean  NOT NULL DEFAULT (false),\n\n  \"create_time\"       datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"       datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_site_info_user_id\" ON \"cd_site_info\" (\"user_id\");\nCREATE INDEX \"index_site_info_domain\" ON \"cd_site_info\" (\"domain\");\nCREATE INDEX \"index_site_info_pipeline\" ON \"cd_site_info\" (\"pipeline_id\");\n\n\nALTER TABLE pi_pipeline\n  ADD COLUMN \"type\" varchar(50);\nALTER TABLE pi_pipeline\n  ADD COLUMN \"from\" varchar(50);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10019__text_too_short.sql",
    "content": ""
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10020__open.sql",
    "content": "CREATE TABLE \"cd_open_key\"\n(\n  \"id\"          integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n  \"user_id\"     integer,\n  \"key_id\"      varchar(50),\n  \"key_secret\"  varchar(100),\n  \"scope\"       varchar(50),\n  \"disabled\"    boolean  NOT NULL DEFAULT (false),\n  \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\n\n\nCREATE INDEX \"index_open_key_user_id\" ON \"cd_open_key\" (\"user_id\");\nCREATE INDEX \"index_open_key_key_id\" ON \"cd_open_key\" (\"key_id\");\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10021__plugin.sql",
    "content": "ALTER TABLE pi_plugin ADD COLUMN \"pluginType\" varchar(100);\nALTER TABLE pi_plugin ADD COLUMN \"metadata\" text;\nALTER TABLE pi_plugin ADD COLUMN \"author\" varchar(100);\nALTER TABLE pi_plugin ADD COLUMN \"extra\" text;\n\n\n\nCREATE TABLE \"pi_sub_domain\"\n(\n  \"id\"          integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n  \"user_id\"     integer,\n  \"domain\"  varchar(100),\n  \"disabled\"    boolean  NOT NULL DEFAULT (false),\n  \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\n\nCREATE INDEX \"index_sub_domain_user_id\" ON \"pi_sub_domain\" (\"user_id\");\nCREATE INDEX \"index_sub_domain_domain\" ON \"pi_sub_domain\" (\"domain\");\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10022__plugin.sql",
    "content": "\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10023__site_ip.sql",
    "content": "\nALTER TABLE cd_site_info ADD COLUMN \"ip_check\" boolean;\nALTER TABLE cd_site_info ADD COLUMN \"ip_count\" integer;\nALTER TABLE cd_site_info ADD COLUMN \"ip_error_count\" integer;\n\n\nCREATE TABLE \"cd_site_ip\"\n(\n  \"id\"                integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n  \"user_id\"           integer,\n  \"site_id\"           integer,\n  \"ip_address\"        varchar(100),\n  \"cert_domains\"      varchar(10240),\n  \"cert_provider\"     varchar(100),\n  \"cert_status\"       varchar(100),\n  \"cert_expires_time\" integer,\n  \"last_check_time\"   integer,\n  \"check_status\"      varchar(100),\n  \"error\"             varchar(4096),\n  \"remark\"            varchar(4096),\n  \"from\"              varchar(100),\n  \"disabled\"          boolean  NOT NULL DEFAULT (false),\n  \"create_time\"       datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"       datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_site_ip_user_id\" ON \"cd_site_ip\" (\"user_id\");\nCREATE INDEX \"index_site_ip_site_id\" ON \"cd_site_ip\" (\"site_id\");\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10024__cname_error.sql",
    "content": "\nALTER TABLE cd_cname_record ADD COLUMN \"error\" varchar(4096);\nALTER TABLE sys_user ADD COLUMN \"valid_time\" integer;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10025__history_trigger_type.sql",
    "content": "\nALTER TABLE pi_history ADD COLUMN \"trigger_type\" varchar(100);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10026__template.sql",
    "content": "CREATE TABLE \"pi_template\"\n(\n  \"id\"          integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n  \"user_id\"     integer,\n  \"pipeline_id\" integer,\n  \"title\"       varchar(1024),\n  \"content\"     text,\n  \"order\"       integer,\n  \"desc\"        varchar(1024),\n  \"disabled\"    boolean  NOT NULL DEFAULT (false),\n  \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_template_user_id\" ON \"pi_template\" (\"user_id\");\nCREATE INDEX \"index_template_pipeline_id\" ON \"pi_template\" (\"pipeline_id\");\n\nALTER TABLE pi_pipeline ADD COLUMN \"template_id\" integer DEFAULT (0);\nALTER TABLE pi_pipeline ADD COLUMN \"is_template\" boolean DEFAULT (0);\nCREATE INDEX \"index_pipeline_template_id\" ON \"pi_pipeline\" (\"template_id\");\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration/v10027__auto.sql",
    "content": "DROP TABLE IF EXISTS \"cd_domain\";\nCREATE TABLE \"cd_domain\"\n(\n  \"id\"          integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n  \"user_id\"     integer,\n  \"domain\" varchar(512),\n  challenge_type varchar(50),\n  dns_provider_type varchar(50),\n  dns_provider_access bigint,\n  http_uploader_type varchar(50),\n  http_uploader_access bigint,\n  http_upload_root_dir varchar(512),\n  \"disabled\"    boolean  NOT NULL DEFAULT (false),\n  \"create_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_domain_user_id\" ON \"cd_domain\" (\"user_id\");\nCREATE INDEX \"index_domain_domain\" ON \"cd_domain\" (\"domain\");\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v00001__init.sql",
    "content": "-- 表：sys_permission\nCREATE TABLE `sys_permission` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `title` varchar(100) NOT NULL, `permission` varchar(100), `parent_id` bigint NOT NULL DEFAULT -1, `sort` bigint NOT NULL, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (1, '系统管理', 'sys', -1, 1 );\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (2, '权限管理', 'sys:auth', 1, 1 );\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (3, '用户管理', 'sys:auth:user', 2, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (4, '查看', 'sys:auth:user:view', 3, 100);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (5, '权限管理', 'sys:auth:per', 2, 1 );\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (6, '查看', 'sys:auth:per:view', 5, 100);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (7, '角色管理', 'sys:auth:role', 2, 1 );\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (8, '查看', 'sys:auth:role:view', 7, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (9, '修改', 'sys:auth:user:edit', 3, 300);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (10, '删除', 'sys:auth:user:remove', 3, 400);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (11, '添加', 'sys:auth:user:add', 3, 200);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (12, '修改', 'sys:auth:role:edit', 7, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (13, '删除', 'sys:auth:role:remove', 7, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (14, '添加', 'sys:auth:role:add', 7, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (15, '修改', 'sys:auth:per:edit', 5, 300);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (16, '删除', 'sys:auth:per:remove', 5, 400);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (17, '添加', 'sys:auth:per:add', 5, 200);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort) VALUES (18,'授权','sys:auth:role:authz',7,100);\n\n\n\n-- 表：sys_role\nCREATE TABLE `sys_role` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `name` varchar(100) NOT NULL, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\nINSERT INTO sys_role (id, name) VALUES (1, '管理员');\nINSERT INTO sys_role (id, name) VALUES (2, '只读角色');\n\n-- 表：sys_role_permission\nCREATE TABLE `sys_role_permission` (`role_id` bigint NOT NULL, `permission_id` bigint NOT NULL, PRIMARY KEY (`role_id`, `permission_id`));\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 2);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 3);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 4);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 5);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 6);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 7);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 8);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 9);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 10);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 11);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 12);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 13);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 14);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 15);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 16);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 17);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 18);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, -1);\n\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 4);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 6);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 8);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 2);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 3);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 5);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 7);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, -1);\n\n-- 表：sys_user\nCREATE TABLE `sys_user` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `username` varchar(100) NOT NULL, `password` varchar(100) NOT NULL, `nick_name` varchar(50), `avatar` varchar(255), `phone_code` varchar(20), `mobile` varchar(20), `email` varchar(100),`remark` varchar(100), `status` bigint NOT NULL DEFAULT 1, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status,remark) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 'admin', NULL, NULL, NULL, NULL, 1, NULL);\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status,remark) VALUES (2, 'readonly', 'e10adc3949ba59abbe56e057f20f883e', '只读用户', NULL, NULL, NULL, NULL, 0, '密码：123456');\n\n-- 表：sys_user_role\nCREATE TABLE `sys_user_role` (`role_id` bigint NOT NULL, `user_id` bigint NOT NULL, PRIMARY KEY (`role_id`, `user_id`));\nINSERT INTO sys_user_role (role_id, user_id) VALUES (1, 1);\nINSERT INTO sys_user_role (role_id, user_id) VALUES (2, 2);\n\n-- 索引：IDX_223de54d6badbe43a5490450c3\nCREATE UNIQUE INDEX `IDX_223de54d6badbe43a5490450c3` ON `sys_role` (`name`);\n\n-- 索引：IDX_9e7164b2f1ea1348bc0eb0a7da\nCREATE UNIQUE INDEX `IDX_9e7164b2f1ea1348bc0eb0a7da` ON `sys_user` (`username`);\n\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v00002__for_pre.sql",
    "content": "-- for preview 限制演示环境的数据修改\nALTER TABLE sys_user AUTO_INCREMENT = 1000;\nALTER TABLE sys_permission AUTO_INCREMENT = 1000;\nALTER TABLE sys_role AUTO_INCREMENT = 1000;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10000__certd.sql",
    "content": "--\n-- 由SQLiteStudio v3.3.3 产生的文件 周六 7月 3 00:38:02 2021\n--\n-- 文本编码：UTF-8\n--\n\n-- 表：cd_access\nCREATE TABLE `cd_access` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `user_id` bigint NOT NULL, `name` varchar(100) NOT NULL, `type` varchar(100) NOT NULL, `setting` varchar(1024), `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\n\n-- 表：cd_cert\nCREATE TABLE `cd_cert` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `user_id` bigint NOT NULL, `domains` varchar(2048) NOT NULL, `email` varchar(100) NOT NULL, `cert_issuer_id` bigint, `challenge_type` varchar(100),  `challenge_dns_type` varchar(100),`challenge_access_id` bigint, `country` varchar(100), `state` varchar(100), `locality` varchar(100), `organization` varchar(100), `organization_unit` varchar(100), `remark` varchar(100), `last_history_id` bigint, `last_success_id` bigint, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\n\n-- 表：cd_cert_apply_history\nCREATE TABLE `cd_cert_apply_history` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `user_id` bigint NOT NULL, `cert_id` bigint NOT NULL, `success` boolean, `result` varchar(1024), `cert_crt` varchar(1024), `cert_key` varchar(1024), `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\n\n-- 表：cd_cert_issuer\nCREATE TABLE `cd_cert_issuer` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `user_id` bigint NOT NULL, `type` varchar(20) NOT NULL, `account` varchar(100) NOT NULL, `private_key` varchar(1024), `setting` varchar(1024), `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\n\n-- 表：cd_task\nCREATE TABLE `cd_task` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `user_id` bigint NOT NULL, `name` varchar(100), `type` varchar(100), `setting` varchar(2048), `cert_id` bigint NOT NULL, `last_history_id` bigint, `last_success_id` bigint, `remark` varchar(100), `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\n\n-- 表：cd_task_history\nCREATE TABLE `cd_task_history` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `user_id` bigint NOT NULL, `task_id` bigint NOT NULL, `cert_id` bigint NOT NULL, `cert_apply_history_id` bigint NOT NULL, `success` boolean, `result` varchar(2048), `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10001__certdv2.sql",
    "content": "CREATE TABLE `pi_history` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `user_id` bigint NOT NULL, `pipeline_id` bigint NOT NULL, `pipeline` TEXT, `status` varchar(20), `end_time` timestamp, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\n\nCREATE TABLE `pi_history_log` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `user_id` bigint NOT NULL, `pipeline_id` bigint NOT NULL, `history_id` bigint NOT NULL, `node_id` varchar(100), `logs` TEXT, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\n\nCREATE TABLE `pi_pipeline` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `user_id` bigint NOT NULL, `title` varchar(200) NOT NULL, `content` TEXT NOT NULL, `keep_history_count` bigint, `remark` varchar(100), `status` varchar(100), `disabled` boolean DEFAULT 0, `last_history_time` bigint, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\n\nCREATE TABLE `pi_storage` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `user_id` bigint NOT NULL, `scope` varchar(100) NOT NULL, `namespace` varchar(100) NOT NULL, `version` varchar(100),`key` varchar(100), `value` TEXT, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10002__settings.sql",
    "content": "CREATE TABLE `sys_settings` (\n                              `id` bigint NOT NULL PRIMARY KEY AUTO_INCREMENT,\n                              `user_id` bigint NOT NULL,\n                              `key` varchar(100) NOT NULL,\n                              `title` varchar(100) NOT NULL,\n                              `setting` varchar(1024),\n                              `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n                              `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10003__role_user.sql",
    "content": "INSERT INTO sys_role (id, name) VALUES (3, '普通用户');\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10004__settings.sql",
    "content": "ALTER TABLE `sys_settings` RENAME TO `user_settings`;\n\nCREATE TABLE `sys_settings` (\n                              `id` bigint NOT NULL PRIMARY KEY AUTO_INCREMENT,\n                              `key` varchar(100) NOT NULL,\n                              `title` varchar(100) NOT NULL,\n                              `setting` varchar(1024),\n                              `access` varchar(100) NOT NULL,\n                              `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n                              `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\nSET @parent_id = (SELECT id FROM sys_permission WHERE permission = 'sys');\nINSERT INTO sys_permission (title, permission, parent_id, sort) VALUES ('系统设置', 'sys:settings', @parent_id, 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, LAST_INSERT_ID());\n\nSET @parent_id = (SELECT id FROM sys_permission WHERE permission = 'sys:settings');\nINSERT INTO sys_permission (title, permission, parent_id, sort) VALUES ('查看', 'sys:settings:view',@parent_id, 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, LAST_INSERT_ID());\nINSERT INTO sys_permission (title, permission, parent_id, sort) VALUES ('编辑', 'sys:settings:edit', @parent_id, 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, LAST_INSERT_ID());\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10005__password2.sql",
    "content": "INSERT INTO sys_settings (`key`, title, setting, access)\nVALUES (\n         'sys.install',\n         '安装信息',\n         CONCAT('{\"installTime\":', (SELECT timestamp FROM flyway_history WHERE id = 1), '}'),\n         'private'\n       );\n\nALTER TABLE sys_user ADD COLUMN password_version bigint DEFAULT 1;\nALTER TABLE sys_user ADD COLUMN password_salt varchar(36);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10006__pipeline_title.sql",
    "content": "alter table pi_pipeline  add COLUMN `order` bigint default 0;\n\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10007__access_text.sql",
    "content": ""
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10008__access_encrypt.sql",
    "content": "alter table cd_access  add COLUMN `encrypt_setting` text;\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10009__cname.sql",
    "content": "CREATE TABLE `cd_cname_provider`\n(\n  `id`                bigint      NOT NULL PRIMARY KEY AUTO_INCREMENT,\n  `domain`            varchar(100) NOT NULL,\n  `dns_provider_type` varchar(100) NOT NULL,\n  `access_id`         bigint      NOT NULL,\n  `is_default`        boolean      NOT NULL,\n  `remark`            varchar(200),\n  `disabled`          boolean      NOT NULL,\n  `create_time`       timestamp     NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time`       timestamp     NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\n\nCREATE TABLE `cd_cname_record`\n(\n  `id`                bigint      NOT NULL PRIMARY KEY AUTO_INCREMENT,\n  `user_id`           bigint      NOT NULL,\n  `domain`            varchar(100) NOT NULL,\n  `host_record`       varchar(100) NOT NULL,\n  `record_value`      varchar(200) NOT NULL,\n  `cname_provider_id` bigint      NOT NULL,\n  `status`            varchar(100) NOT NULL,\n  `create_time`       timestamp     NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time`       timestamp     NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10010__plugin.sql",
    "content": "CREATE TABLE `pi_plugin`\n(\n  `id`          bigint      NOT NULL PRIMARY KEY AUTO_INCREMENT,\n  `name`        varchar(100) NOT NULL,\n  `icon`        varchar(100),\n  `title`       varchar(200),\n  `desc`        varchar(500),\n  `group`       varchar(100),\n  `version`     varchar(100),\n  `setting`     text,\n  `sys_setting` text,\n  `content`     text,\n  `type`        varchar(100) NOT NULL,\n  `disabled`    boolean      NOT NULL,\n  `create_time` timestamp     NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp     NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10011__cname_provider_user_id.sql",
    "content": "ALTER TABLE cd_cname_provider ADD COLUMN user_id bigint;\n\nupdate cd_cname_provider set user_id = 1;\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10012__disabled_readonly_user.sql",
    "content": "\nupdate sys_user set status = 0 where id = 2;\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10013__notification.sql",
    "content": "\nCREATE TABLE `pi_notification` (`id` bigint PRIMARY KEY AUTO_INCREMENT NOT NULL, `user_id` bigint NOT NULL, `name` varchar(100) NOT NULL, `type` varchar(100) NOT NULL, `setting` text, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10014__notification_default.sql",
    "content": "ALTER TABLE pi_notification ADD COLUMN is_default boolean DEFAULT 0;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10015__pipeline_group.sql",
    "content": "CREATE TABLE `pi_pipeline_group`\n(\n  `id`          bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n  `user_id`     bigint      NOT NULL,\n  `name`        varchar(100) NOT NULL,\n  `icon`        varchar(100),\n  `favorite`    boolean      NOT NULL DEFAULT false,\n  `create_time` timestamp     NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp     NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\nALTER TABLE pi_pipeline\n  ADD COLUMN group_id bigint;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10016__index.sql",
    "content": "\nCREATE INDEX `index_access_user_id` ON `cd_access` (`user_id`);\n\nCREATE INDEX `index_cname_record_user_id` ON `cd_cname_record` (`user_id`);\n\n\nCREATE INDEX `index_history_user_id` ON `pi_history` (`user_id`);\n\nCREATE INDEX `index_history_log_user_id` ON `pi_history_log` (`user_id`);\n\nCREATE INDEX `index_history_log_pipeline_id` ON `pi_history_log` (`pipeline_id`);\n\nCREATE INDEX `index_notification_user_id` ON `pi_notification` (`user_id`);\n\nCREATE INDEX `index_pipeline_user_id` ON `pi_pipeline` (`user_id`);\nCREATE INDEX `index_pipeline_group_user_id` ON `pi_pipeline_group` (`user_id`);\n\n\nCREATE INDEX `index_storage_default_get` ON `pi_storage` (`scope`(50), `namespace`(50), `key`(50));\nCREATE INDEX `index_storage_user_id` ON `pi_storage` (`user_id`);\n\n\nCREATE INDEX `index_user_email` ON `sys_user` (`email`);\nCREATE INDEX `index_user_mobile` ON `sys_user` (`mobile`);\n\nCREATE INDEX `index_permission` ON `sys_permission` (`permission`);\n\n\nCREATE INDEX `index_user_settings_user_id` ON `user_settings` (`user_id`);\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10017__field_type.sql",
    "content": "ALTER TABLE `cd_access` MODIFY COLUMN `setting` text  NULL AFTER `type`;\n\nALTER TABLE `pi_pipeline` MODIFY COLUMN `content` longtext  NULL AFTER `title`;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10018__suite.sql",
    "content": "CREATE TABLE `cd_product`\n(\n  `id`              bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n  `icon`            varchar(100),\n  `title`           varchar(100),\n  `type`            varchar(100),\n  `content`         varchar(4096),\n  `duration_prices` varchar(4096),\n  `duration`        bigint,\n  `price`           bigint,\n  `intro`           varchar(4096),\n  `order`           bigint,\n  `support_buy`     boolean,\n  `disabled`        boolean  NOT NULL DEFAULT false,\n  `create_time`     timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time`     timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE `cd_trade`\n(\n  `id`          bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n  `trade_no`    varchar(100),\n  `user_id`     bigint,\n  `product_id`  bigint,\n  `title`       varchar(1024),\n  `desc`        varchar(2048),\n  `num`         bigint,\n  `duration`    bigint,\n  `price`       bigint,\n  `amount`      bigint,\n  `remark`      varchar(2048),\n  `status`      varchar(100),\n  `pay_type`    varchar(50),\n  `pay_time`    bigint,\n  `pay_no`      varchar(100),\n  `end_time`    bigint,\n  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX `index_trade_user_id` ON `cd_trade` (`user_id`);\nCREATE UNIQUE INDEX `index_trade_trade_no` ON `cd_trade` (`trade_no`);\nCREATE INDEX `index_trade_pay_no` ON `cd_trade` (`pay_type`, `pay_no`);\n\n\nCREATE TABLE `cd_user_suite`\n(\n  `id`                bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n  `user_id`           bigint,\n  `product_id`        bigint,\n  `trade_id`          bigint,\n  `icon`              varchar(100),\n  `title`             varchar(100),\n  `content`           text,\n  `duration`          bigint,\n  `product_type`      varchar(50),\n  `deploy_count_used` bigint,\n  `is_present`        boolean,\n  `is_bootstrap`      boolean,\n  `is_empty`          boolean,\n  `disabled`          boolean  NOT NULL DEFAULT false,\n  `active_time`       bigint,\n  `expires_time`      bigint,\n  `create_time`       timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time`       timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX `index_user_suite_user_id` ON `cd_user_suite` (`user_id`);\n\n\nDROP TABLE IF EXISTS `cd_cert`;\nDROP TABLE IF EXISTS `cd_cert_apply_history`;\nDROP TABLE IF EXISTS `cd_cert_issuer`;\nDROP TABLE IF EXISTS `cd_task`;\nDROP TABLE IF EXISTS `cd_task_history`;\n\n\n\nCREATE TABLE `cd_cert_info`\n(\n  `id`            bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n  `user_id`       bigint,\n  `domain`        varchar(100),\n  `domains`       varchar(4096),\n  `domain_count`  bigint,\n  `pipeline_id`   bigint,\n  `apply_time`    bigint,\n  `from_type`     varchar(100),\n  `cert_provider` varchar(100),\n  `expires_time`  bigint,\n  `cert_info`     text,\n  `cert_file`     varchar(100),\n  `disabled`      boolean  NOT NULL DEFAULT false,\n  `create_time`   timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time`   timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX `index_cert_info_user_id` ON `cd_cert_info` (`user_id`);\nCREATE INDEX `index_cert_info_domain` ON `cd_cert_info` (`domain`);\nCREATE INDEX `index_cert_info_domains` ON `cd_cert_info` (`domains`(200));\nCREATE INDEX `index_cert_info_pipeline` ON `cd_cert_info` (`pipeline_id`);\n\n\nCREATE TABLE `cd_site_info`\n(\n  `id`                bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n  `user_id`           bigint,\n\n  `name`              varchar(100),\n  `domain`            varchar(100),\n\n  `https_port`        bigint,\n  `cert_domains`      varchar(4096),\n  `cert_info`         varchar(4096),\n  `cert_provider`     varchar(100),\n  `cert_status`       varchar(100),\n  `cert_expires_time` bigint,\n  `last_check_time`   bigint,\n  `check_status`      varchar(100),\n  `error`             varchar(4096),\n  `pipeline_id`       bigint,\n  `cert_info_id`      bigint,\n  `disabled`          boolean  NOT NULL DEFAULT false,\n\n  `create_time`       timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time`       timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX `index_site_info_user_id` ON `cd_site_info` (`user_id`);\nCREATE INDEX `index_site_info_domain` ON `cd_site_info` (`domain`);\nCREATE INDEX `index_site_info_pipeline` ON `cd_site_info` (`pipeline_id`);\n\n\nALTER TABLE pi_pipeline\n  ADD COLUMN `type` varchar(50);\nALTER TABLE pi_pipeline\n  ADD COLUMN `from` varchar(50);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10019__text_too_short.sql",
    "content": "\nALTER TABLE `pi_history` MODIFY COLUMN `pipeline` longtext  NULL;\nALTER TABLE `pi_storage` MODIFY COLUMN `value` longtext  NULL;\nALTER TABLE `pi_history_log` MODIFY COLUMN `logs` longtext  NULL;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10020__open.sql",
    "content": "CREATE TABLE `cd_open_key`\n(\n  `id`          bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n  `user_id`     bigint,\n  `key_id`      varchar(50),\n  `key_secret`  varchar(100),\n  `scope`       varchar(50),\n  `disabled`    boolean  NOT NULL DEFAULT false,\n  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\n\n\nCREATE INDEX `index_open_key_user_id` ON `cd_open_key` (`user_id`);\nCREATE INDEX `index_open_key_key_id` ON `cd_open_key` (`key_id`);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10021__plugin.sql",
    "content": "ALTER TABLE pi_plugin ADD COLUMN `pluginType` varchar(100);\nALTER TABLE pi_plugin ADD COLUMN `metadata` longtext;\nALTER TABLE pi_plugin ADD COLUMN `author` varchar(100);\nALTER TABLE pi_plugin ADD COLUMN `extra` longtext;\n\n\n\nCREATE TABLE `pi_sub_domain`\n(\n  `id`          bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n  `user_id`     bigint,\n  `domain`  varchar(100),\n  `disabled`    boolean  NOT NULL DEFAULT false,\n  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\n\nCREATE INDEX `index_sub_domain_user_id` ON `pi_sub_domain` (`user_id`);\nCREATE INDEX `index_sub_domain_domain` ON `pi_sub_domain` (`domain`);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10022__plugin.sql",
    "content": "ALTER TABLE pi_plugin\n  MODIFY COLUMN `setting` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL AFTER `author`,\n  MODIFY COLUMN `sys_setting` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL AFTER `setting`,\n  MODIFY COLUMN `metadata` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL AFTER `sys_setting`,\n  MODIFY COLUMN `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL AFTER `metadata`;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10023__site_ip.sql",
    "content": "\nALTER TABLE cd_site_info ADD COLUMN `ip_check` boolean;\nALTER TABLE cd_site_info ADD COLUMN `ip_count` bigint;\nALTER TABLE cd_site_info ADD COLUMN `ip_error_count` bigint;\nALTER TABLE cd_site_info MODIFY COLUMN `error` longtext  NULL;\n\n\nCREATE TABLE `cd_site_ip`\n(\n  `id`                bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n  `user_id`           bigint,\n  `site_id`           bigint,\n  `ip_address`        varchar(100),\n  `cert_domains`      varchar(10240),\n  `cert_provider`     varchar(100),\n  `cert_status`       varchar(100),\n  `cert_expires_time` bigint,\n  `last_check_time`   bigint,\n  `check_status`      varchar(100),\n  `error`             longtext,\n  `remark`            varchar(4096),\n  `from`              varchar(100),\n  `disabled`          boolean  NOT NULL DEFAULT false,\n  `create_time`       timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time`       timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX `index_site_ip_user_id` ON `cd_site_ip` (`user_id`);\nCREATE INDEX `index_site_ip_site_id` ON `cd_site_ip` (`site_id`);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10024__cname_error.sql",
    "content": "\nALTER TABLE cd_cname_record ADD COLUMN `error` varchar(4096);\nALTER TABLE sys_user ADD COLUMN `valid_time` bigint;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10025__history_trigger_type.sql",
    "content": "\nALTER TABLE pi_history ADD COLUMN `trigger_type` varchar(100);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10026__template.sql",
    "content": "CREATE TABLE `pi_template`\n(\n  `id`          bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n  `user_id`     bigint,\n  `pipeline_id` bigint,\n  `title`       varchar(1024),\n  `content`     longtext,\n  `order`       bigint,\n  `desc`        varchar(1024),\n  `disabled`    boolean  NOT NULL DEFAULT false,\n  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX `index_template_user_id` ON `pi_template` (`user_id`);\nCREATE INDEX `index_template_pipeline_id` ON `pi_template` (`pipeline_id`);\n\nALTER TABLE pi_pipeline ADD COLUMN `template_id` bigint DEFAULT 0;\nALTER TABLE pi_pipeline ADD COLUMN `is_template` boolean DEFAULT 0;\nCREATE INDEX `index_pipeline_template_id` ON `pi_pipeline` (`template_id`);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-mysql/v10027__auto.sql",
    "content": "DROP TABLE IF EXISTS `cd_domain`;\nCREATE TABLE `cd_domain`\n(\n  `id`          bigint PRIMARY KEY AUTO_INCREMENT NOT NULL,\n  `user_id`     bigint,\n  `domain` varchar(512),\n  challenge_type varchar(50),\n  dns_provider_type varchar(50),\n  dns_provider_access bigint,\n  http_uploader_type varchar(50),\n  http_uploader_access bigint,\n  http_upload_root_dir varchar(512),\n  `disabled`    boolean  NOT NULL DEFAULT false,\n  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX `index_domain_user_id` ON `cd_domain` (`user_id`);\nCREATE INDEX `index_domain_domain` ON `cd_domain` (`domain`);\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v00001__init.sql",
    "content": "-- 表：sys_permission\nCREATE TABLE \"sys_permission\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY  NOT NULL, \"title\" varchar(100) NOT NULL, \"permission\" varchar(100), \"parent_id\" bigint NOT NULL DEFAULT (-1), \"sort\" bigint NOT NULL, \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (1, '系统管理', 'sys', -1, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (2, '权限管理', 'sys:auth', 1, 1 );\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (3, '用户管理', 'sys:auth:user', 2, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (4, '查看', 'sys:auth:user:view', 3, 100);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (5, '权限管理', 'sys:auth:per', 2, 1 );\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (6, '查看', 'sys:auth:per:view', 5, 100);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (7, '角色管理', 'sys:auth:role', 2, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (8, '查看', 'sys:auth:role:view', 7, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (9, '修改', 'sys:auth:user:edit', 3, 300);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (10, '删除', 'sys:auth:user:remove', 3, 400);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (11, '添加', 'sys:auth:user:add', 3, 200);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (12, '修改', 'sys:auth:role:edit', 7, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (13, '删除', 'sys:auth:role:remove', 7, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (14, '添加', 'sys:auth:role:add', 7, 1);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (15, '修改', 'sys:auth:per:edit', 5, 300);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (16, '删除', 'sys:auth:per:remove', 5, 400);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (17, '添加', 'sys:auth:per:add', 5, 200);\nINSERT INTO sys_permission (id, title, permission, parent_id, sort ) VALUES (18,'授权','sys:auth:role:authz',7,100);\n\n\n\n-- 表：sys_role\nCREATE TABLE \"sys_role\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY  NOT NULL, \"name\" varchar(100) NOT NULL, \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_role (id, name ) VALUES (1, '管理员');\nINSERT INTO sys_role (id, name ) VALUES (2, '只读角色');\n\n-- 表：sys_role_permission\nCREATE TABLE \"sys_role_permission\" (\"role_id\" bigint NOT NULL, \"permission_id\" bigint NOT NULL, PRIMARY KEY (\"role_id\", \"permission_id\"));\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 2);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 3);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 4);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 5);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 6);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 7);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 8);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 9);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 10);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 11);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 12);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 13);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 14);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 15);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 16);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 17);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, 18);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, -1);\n\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 4);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 6);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 8);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 2);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 3);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 5);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, 7);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (2, -1);\n\n-- 表：sys_user\nCREATE TABLE \"sys_user\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY  NOT NULL, \"username\" varchar(100) NOT NULL, \"password\" varchar(50) NOT NULL, \"nick_name\" varchar(50), \"avatar\" varchar(255), \"phone_code\" varchar(20), \"mobile\" varchar(20), \"email\" varchar(100),\"remark\" varchar(100), \"status\" bigint NOT NULL DEFAULT (1), \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status ,remark) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 'admin', NULL, NULL, NULL, NULL, 1,NULL);\nINSERT INTO sys_user (id, username, password, nick_name, avatar, phone_code, mobile, email, status ,remark) VALUES (2, 'readonly', 'e10adc3949ba59abbe56e057f20f883e', '只读用户', NULL, NULL, NULL, NULL, 1,'密码：123456');\n\n-- 表：sys_user_role\nCREATE TABLE \"sys_user_role\" (\"role_id\" bigint NOT NULL, \"user_id\" bigint NOT NULL, PRIMARY KEY (\"role_id\", \"user_id\"));\nINSERT INTO sys_user_role (role_id, user_id) VALUES (1, 1);\nINSERT INTO sys_user_role (role_id, user_id) VALUES (2, 2);\n\n-- 索引：IDX_223de54d6badbe43a5490450c3\nCREATE UNIQUE INDEX \"IDX_223de54d6badbe43a5490450c3\" ON \"sys_role\" (\"name\");\n\n-- 索引：IDX_9e7164b2f1ea1348bc0eb0a7da\nCREATE UNIQUE INDEX \"IDX_9e7164b2f1ea1348bc0eb0a7da\" ON \"sys_user\" (\"username\");\n\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v00002__for_pre.sql",
    "content": "-- for preview 限制演示环境的数据修改\nselect setval('sys_permission_id_seq', 1000);\nselect setval('sys_user_id_seq', 1000);\nselect setval('sys_role_id_seq', 1000);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10000__certd.sql",
    "content": "--\n-- 由SQLiteStudio v3.3.3 产生的文件 周六 7月 3 00:38:02 2021\n--\n-- 文本编码：UTF-8\n--\n\n-- 表：cd_access\nCREATE TABLE \"cd_access\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY  NOT NULL, \"user_id\" bigint NOT NULL, \"name\" varchar(100) NOT NULL, \"type\" varchar(100) NOT NULL, \"setting\" varchar(1024), \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\n-- 表：cd_cert\nCREATE TABLE \"cd_cert\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY  NOT NULL, \"user_id\" bigint NOT NULL, \"domains\" varchar(2048) NOT NULL, \"email\" varchar(100) NOT NULL, \"cert_issuer_id\" bigint, \"challenge_type\" varchar(100),  \"challenge_dns_type\" varchar(100),\"challenge_access_id\" bigint, \"country\" varchar(100), \"state\" varchar(100), \"locality\" varchar(100), \"organization\" varchar(100), \"organization_unit\" varchar(100), \"remark\" varchar(100), \"last_history_id\" bigint, \"last_success_id\" bigint, \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\n-- 表：cd_cert_apply_history\nCREATE TABLE \"cd_cert_apply_history\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY  NOT NULL, \"user_id\" bigint NOT NULL, \"cert_id\" bigint NOT NULL, \"success\" boolean, \"result\" varchar(1024), \"cert_crt\" varchar(1024), \"cert_key\" varchar(1024), \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\n-- 表：cd_cert_issuer\nCREATE TABLE \"cd_cert_issuer\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY  NOT NULL, \"user_id\" bigint NOT NULL, \"type\" varchar(20) NOT NULL, \"account\" varchar(100) NOT NULL, \"private_key\" varchar(1024), \"setting\" varchar, \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\n-- 表：cd_task\nCREATE TABLE \"cd_task\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY  NOT NULL, \"user_id\" bigint NOT NULL, \"name\" varchar(100), \"type\" varchar(100), \"setting\" varchar(2048), \"cert_id\" bigint NOT NULL, \"last_history_id\" bigint, \"last_success_id\" bigint, \"remark\" varchar(100), \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\n-- 表：cd_task_history\nCREATE TABLE \"cd_task_history\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY  NOT NULL, \"user_id\" bigint NOT NULL, \"task_id\" bigint NOT NULL, \"cert_id\" bigint NOT NULL, \"cert_apply_history_id\" bigint NOT NULL, \"success\" boolean, \"result\" varchar(2048), \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10001__certdv2.sql",
    "content": "CREATE TABLE \"pi_history\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY  NOT NULL, \"user_id\" bigint NOT NULL, \"pipeline_id\" bigint NOT NULL, \"pipeline\" varchar(40960), \"status\" varchar(20), \"end_time\" timestamp, \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\nCREATE TABLE \"pi_history_log\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY  NOT NULL, \"user_id\" bigint NOT NULL, \"pipeline_id\" bigint NOT NULL, \"history_id\" bigint NOT NULL, \"node_id\" varchar(100), \"logs\" varchar(40960), \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\nCREATE TABLE \"pi_pipeline\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY  NOT NULL, \"user_id\" bigint NOT NULL, \"title\" bigint NOT NULL, \"content\" varchar(40960) NOT NULL, \"keep_history_count\" bigint, \"remark\" varchar(100), \"status\" varchar(100), \"disabled\" boolean DEFAULT (false), \"last_history_time\" bigint, \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n\nCREATE TABLE \"pi_storage\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY  NOT NULL, \"user_id\" bigint NOT NULL, \"scope\" varchar NOT NULL, \"namespace\" varchar NOT NULL, \"version\" varchar(100),\"key\" varchar(100), \"value\" varchar(40960), \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10002__settings.sql",
    "content": "CREATE TABLE \"sys_settings\" (\n                              \"id\" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY ,\n                              \"user_id\" bigint NOT NULL,\n                              \"key\" varchar(100) NOT NULL,\n                              \"title\" varchar(100) NOT NULL,\n                              \"setting\" varchar(1024),\n                              \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n                              \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10003__role_user.sql",
    "content": "INSERT INTO sys_role (id, name ) VALUES (3, '普通用户');\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10004__settings.sql",
    "content": "ALTER TABLE \"sys_settings\" RENAME TO \"user_settings\";\n\nCREATE TABLE \"sys_settings\" (\n                              \"id\" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY ,\n                              \"key\" varchar(100) NOT NULL,\n                              \"title\" varchar(100) NOT NULL,\n                              \"setting\" varchar(1024),\n                              \"access\" varchar(100) NOT NULL,\n                              \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n                              \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\n\nINSERT INTO sys_permission (title, permission, parent_id, sort ) VALUES ('系统设置', 'sys:settings', (SELECT id FROM sys_permission WHERE permission = 'sys'), 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, LASTVAL());\nINSERT INTO sys_permission (title, permission, parent_id, sort ) VALUES ('查看', 'sys:settings:view', (SELECT id FROM sys_permission WHERE permission = 'sys:settings'), 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, LASTVAL());\nINSERT INTO sys_permission (title, permission, parent_id, sort ) VALUES ('编辑', 'sys:settings:edit', (SELECT id FROM sys_permission WHERE permission = 'sys:settings'), 1);\nINSERT INTO sys_role_permission (role_id, permission_id) VALUES (1, LASTVAL());\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10005__password2.sql",
    "content": "INSERT INTO sys_settings (key, title, setting,access) VALUES ('sys.install','安装信息','{\"installTime\":'|| (select (timestamp) from flyway_history where id = 1 )||'}','private');\n\nALTER TABLE sys_user ADD COLUMN password_version bigint DEFAULT 1;\nALTER TABLE sys_user ADD COLUMN password_salt varchar(36);\nalter table sys_user alter column password type varchar(100) using password::varchar(100);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10006__pipeline_title.sql",
    "content": "alter table pi_pipeline alter column title type varchar(100) using title::varchar(100);\nalter table pi_pipeline alter column content type text using content::text;\nalter table pi_storage alter column value type text using value::text;\n\nalter table pi_pipeline  add \"order\" bigint default 0;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10007__access_text.sql",
    "content": "alter table cd_access alter column setting type text using setting::text;\nalter table sys_settings alter column setting type text using setting::text;\nalter table user_settings alter column setting type text using setting::text;\nalter table pi_history_log alter column logs type text using logs::text;\nalter table pi_history alter column pipeline type text using pipeline::text;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10008__access_encrypt.sql",
    "content": "alter table cd_access  add \"encrypt_setting\" text;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10009__cname.sql",
    "content": "CREATE TABLE \"cd_cname_provider\"\n(\n  \"id\"                bigint      NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,\n  \"domain\"            varchar(100) NOT NULL,\n  \"dns_provider_type\" varchar(100) NOT NULL,\n  \"access_id\"         bigint      NOT NULL,\n  \"is_default\"        boolean      NOT NULL,\n  \"remark\"            varchar(200),\n  \"disabled\"          boolean      NOT NULL,\n  \"create_time\"       timestamp     NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"       timestamp     NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\n\nCREATE TABLE \"cd_cname_record\"\n(\n  \"id\"                bigint      NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,\n  \"user_id\"           bigint      NOT NULL,\n  \"domain\"            varchar(100) NOT NULL,\n  \"host_record\"       varchar(100) NOT NULL,\n  \"record_value\"      varchar(200) NOT NULL,\n  \"cname_provider_id\" bigint      NOT NULL,\n  \"status\"            varchar(100) NOT NULL,\n  \"create_time\"       timestamp     NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"       timestamp     NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10010__plugin.sql",
    "content": "CREATE TABLE \"pi_plugin\"\n(\n  \"id\"          bigint      NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,\n  \"name\"        varchar(100) NOT NULL,\n  \"icon\"        varchar(100),\n  \"title\"       varchar(200),\n  \"desc\"        varchar(500),\n  \"group\"       varchar(100),\n  \"version\"     varchar(100),\n  \"setting\"     text,\n  \"sys_setting\" text,\n  \"content\"     text,\n  \"type\"        varchar(100) NOT NULL,\n  \"disabled\"    boolean      NOT NULL,\n  \"create_time\" timestamp     NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" timestamp     NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10011__cname_provider_user_id.sql",
    "content": "ALTER TABLE cd_cname_provider ADD COLUMN user_id bigint;\n\nupdate cd_cname_provider set user_id = 1;\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10012__disabled_readonly_user.sql",
    "content": "\nupdate sys_user set status = 0 where id = 2;\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10013__notification.sql",
    "content": "\nCREATE TABLE \"pi_notification\" (\"id\" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, \"user_id\" bigint NOT NULL, \"name\" varchar(100) NOT NULL, \"type\" varchar(100) NOT NULL, \"setting\" text, \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP), \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP));\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10014__notification_default.sql",
    "content": "ALTER TABLE pi_notification ADD COLUMN is_default boolean DEFAULT (false);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10015__pipeline_group.sql",
    "content": "CREATE TABLE \"pi_pipeline_group\"\n(\n  \"id\"          bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL,\n  \"user_id\"     bigint      NOT NULL,\n  \"name\"        varchar(100) NOT NULL,\n  \"icon\"        varchar(100),\n  \"favorite\"    boolean      NOT NULL DEFAULT (false),\n  \"create_time\" timestamp     NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" timestamp     NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nALTER TABLE pi_pipeline\n  ADD COLUMN group_id bigint;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10016__index.sql",
    "content": "\nCREATE INDEX \"index_access_user_id\" ON \"cd_access\" (\"user_id\");\n\nCREATE INDEX \"index_cname_record_user_id\" ON \"cd_cname_record\" (\"user_id\");\n\n\nCREATE INDEX \"index_history_user_id\" ON \"pi_history\" (\"user_id\");\n\nCREATE INDEX \"index_history_log_user_id\" ON \"pi_history_log\" (\"user_id\");\n\nCREATE INDEX \"index_history_log_pipeline_id\" ON \"pi_history_log\" (\"pipeline_id\");\n\nCREATE INDEX \"index_notification_user_id\" ON \"pi_notification\" (\"user_id\");\n\nCREATE INDEX \"index_pipeline_user_id\" ON \"pi_pipeline\" (\"user_id\");\nCREATE INDEX \"index_pipeline_group_user_id\" ON \"pi_pipeline_group\" (\"user_id\");\n\n\n\nCREATE INDEX \"index_storage_default_get\" ON \"pi_storage\" (\"scope\", \"namespace\", \"key\");\nCREATE INDEX \"index_storage_user_id\" ON \"pi_storage\" (\"user_id\");\n\n\nCREATE INDEX \"index_user_email\" ON \"sys_user\" (\"email\");\nCREATE INDEX \"index_user_mobile\" ON \"sys_user\" (\"mobile\");\n\nCREATE INDEX \"index_permission\" ON \"sys_permission\" (\"permission\");\n\n\nCREATE INDEX \"index_user_settings_user_id\" ON \"user_settings\" (\"user_id\");\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10017__field_type.sql",
    "content": ""
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10018__suite.sql",
    "content": "CREATE TABLE \"cd_product\"\n(\n  \"id\"              bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL,\n  \"icon\"            varchar(100),\n  \"title\"           varchar(100),\n  \"type\"            varchar(100),\n  \"content\"         varchar(4096),\n  \"duration_prices\" varchar(10240),\n  \"duration\"        bigint,\n  \"price\"           bigint,\n  \"intro\"           varchar(10240),\n  \"order\"           bigint,\n  \"support_buy\"     boolean,\n  \"disabled\"        boolean  NOT NULL DEFAULT (false),\n  \"create_time\"     timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"     timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE TABLE \"cd_trade\"\n(\n  \"id\"          bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL,\n  \"trade_no\"    varchar(100),\n  \"user_id\"     bigint,\n  \"product_id\"  bigint,\n  \"title\"       varchar(1024),\n  \"desc\"        varchar(2048),\n  \"num\"         bigint,\n  \"duration\"    bigint,\n  \"price\"       bigint,\n  \"amount\"      bigint,\n  \"remark\"      varchar(2048),\n  \"status\"      varchar(100),\n  \"pay_type\"    varchar(50),\n  \"pay_time\"    bigint,\n  \"pay_no\"      varchar(100),\n  \"end_time\"    bigint,\n  \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_trade_user_id\" ON \"cd_trade\" (\"user_id\");\nCREATE UNIQUE INDEX \"index_trade_trade_no\" ON \"cd_trade\" (\"trade_no\");\nCREATE INDEX \"index_trade_pay_no\" ON \"cd_trade\" (\"pay_type\", \"pay_no\");\n\n\nCREATE TABLE \"cd_user_suite\"\n(\n  \"id\"                bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL,\n  \"user_id\"           bigint,\n  \"product_id\"        bigint,\n  \"trade_id\"          bigint,\n  \"icon\"              varchar(100),\n  \"title\"             varchar(100),\n  \"content\"           text,\n  \"duration\"          bigint,\n  \"product_type\"      varchar(50),\n  \"deploy_count_used\" bigint,\n  \"is_present\"        boolean,\n  \"is_bootstrap\"      boolean,\n  \"is_empty\"          boolean,\n  \"disabled\"          boolean  NOT NULL DEFAULT (false),\n  \"active_time\"       bigint,\n  \"expires_time\"      bigint,\n  \"create_time\"       timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"       timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_user_suite_user_id\" ON \"cd_user_suite\" (\"user_id\");\n\n\nDROP TABLE IF EXISTS \"cd_cert\";\nDROP TABLE IF EXISTS \"cd_cert_apply_history\";\nDROP TABLE IF EXISTS \"cd_cert_issuer\";\nDROP TABLE IF EXISTS \"cd_task\";\nDROP TABLE IF EXISTS \"cd_task_history\";\n\n\n\nCREATE TABLE \"cd_cert_info\"\n(\n  \"id\"            bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL,\n  \"user_id\"       bigint,\n  \"domain\"        varchar(100),\n  \"domains\"       varchar(10240),\n  \"domain_count\"  bigint,\n  \"pipeline_id\"   bigint,\n  \"apply_time\"    bigint,\n  \"from_type\"     varchar(100),\n  \"cert_provider\" varchar(100),\n  \"expires_time\"  bigint,\n  \"cert_info\"     text,\n  \"cert_file\"     varchar(100),\n  \"disabled\"      boolean  NOT NULL DEFAULT (false),\n  \"create_time\"   timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"   timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_cert_info_user_id\" ON \"cd_cert_info\" (\"user_id\");\nCREATE INDEX \"index_cert_info_domain\" ON \"cd_cert_info\" (\"domain\");\nCREATE INDEX \"index_cert_info_domains\" ON \"cd_cert_info\" (\"domains\");\nCREATE INDEX \"index_cert_info_pipeline\" ON \"cd_cert_info\" (\"pipeline_id\");\n\n\nCREATE TABLE \"cd_site_info\"\n(\n  \"id\"                bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL,\n  \"user_id\"           bigint,\n\n  \"name\"              varchar(100),\n  \"domain\"            varchar(100),\n\n  \"https_port\"        bigint,\n  \"cert_domains\"      varchar(10240),\n  \"cert_info\"         varchar(10240),\n  \"cert_provider\"     varchar(100),\n  \"cert_status\"       varchar(100),\n  \"cert_expires_time\" bigint,\n  \"last_check_time\"   bigint,\n  \"check_status\"      varchar(100),\n  \"error\"             varchar(4096),\n  \"pipeline_id\"       bigint,\n  \"cert_info_id\"      bigint,\n  \"disabled\"          boolean  NOT NULL DEFAULT (false),\n\n  \"create_time\"       timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"       timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_site_info_user_id\" ON \"cd_site_info\" (\"user_id\");\nCREATE INDEX \"index_site_info_domain\" ON \"cd_site_info\" (\"domain\");\nCREATE INDEX \"index_site_info_pipeline\" ON \"cd_site_info\" (\"pipeline_id\");\n\n\nALTER TABLE pi_pipeline\n  ADD COLUMN \"type\" varchar(50);\nALTER TABLE pi_pipeline\n  ADD COLUMN \"from\" varchar(50);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10019__text_too_short.sql",
    "content": ""
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10020__open.sql",
    "content": "CREATE TABLE \"cd_open_key\"\n(\n  \"id\"          bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL,\n  \"user_id\"     bigint,\n  \"key_id\"      varchar(50),\n  \"key_secret\"  varchar(100),\n  \"scope\"       varchar(50),\n  \"disabled\"    boolean  NOT NULL DEFAULT (false),\n  \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\n\n\nCREATE INDEX \"index_open_key_user_id\" ON \"cd_open_key\" (\"user_id\");\nCREATE INDEX \"index_open_key_key_id\" ON \"cd_open_key\" (\"key_id\");\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10021__plugin.sql",
    "content": "ALTER TABLE pi_plugin ADD COLUMN \"pluginType\" varchar(100);\nALTER TABLE pi_plugin ADD COLUMN \"metadata\" text;\nALTER TABLE pi_plugin ADD COLUMN \"author\" varchar(100);\nALTER TABLE pi_plugin ADD COLUMN \"extra\" text;\n\n\n\nCREATE TABLE \"pi_sub_domain\"\n(\n  \"id\"          bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL,\n  \"user_id\"     bigint,\n  \"domain\"  varchar(100),\n  \"disabled\"    boolean  NOT NULL DEFAULT (false),\n  \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\n\nCREATE INDEX \"index_sub_domain_user_id\" ON \"pi_sub_domain\" (\"user_id\");\nCREATE INDEX \"index_sub_domain_domain\" ON \"pi_sub_domain\" (\"domain\");\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10022__plugin.sql",
    "content": "\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10023__site_ip.sql",
    "content": "\nALTER TABLE cd_site_info ADD COLUMN \"ip_check\" boolean;\nALTER TABLE cd_site_info ADD COLUMN \"ip_count\" bigint;\nALTER TABLE cd_site_info ADD COLUMN \"ip_error_count\" bigint;\nalter table cd_site_info alter column error type text using error::text;\n\nCREATE TABLE \"cd_site_ip\"\n(\n  \"id\"                bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL,\n  \"user_id\"           bigint,\n  \"site_id\"           bigint,\n  \"ip_address\"        varchar(100),\n  \"cert_domains\"      varchar(10240),\n  \"cert_provider\"     varchar(100),\n  \"cert_status\"       varchar(100),\n  \"cert_expires_time\" bigint,\n  \"last_check_time\"   bigint,\n  \"check_status\"      varchar(100),\n  \"error\"             text,\n  \"remark\"            varchar(4096),\n  \"from\"              varchar(100),\n  \"disabled\"          boolean  NOT NULL DEFAULT (false),\n  \"create_time\"       timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\"       timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_site_ip_user_id\" ON \"cd_site_ip\" (\"user_id\");\nCREATE INDEX \"index_site_ip_site_id\" ON \"cd_site_ip\" (\"site_id\");\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10024__cname_error.sql",
    "content": "\nALTER TABLE cd_cname_record ADD COLUMN \"error\" varchar(4096);\nALTER TABLE sys_user ADD COLUMN \"valid_time\" bigint;\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10025__history_trigger_type.sql",
    "content": "\nALTER TABLE pi_history ADD COLUMN \"trigger_type\" varchar(100);\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10026__template.sql",
    "content": "CREATE TABLE \"pi_template\"\n(\n  \"id\"          bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL,\n  \"user_id\"     bigint,\n  \"pipeline_id\" bigint,\n  \"title\"       varchar(1024),\n  \"content\"     text,\n  \"order\"       bigint,\n  \"desc\"        varchar(1024),\n  \"disabled\"    boolean  NOT NULL DEFAULT (false),\n  \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_template_user_id\" ON \"pi_template\" (\"user_id\");\nCREATE INDEX \"index_template_pipeline_id\" ON \"pi_template\" (\"pipeline_id\");\n\nALTER TABLE pi_pipeline ADD COLUMN \"template_id\" bigint DEFAULT (0);\nALTER TABLE pi_pipeline ADD COLUMN \"is_template\" boolean DEFAULT (false);\nCREATE INDEX \"index_pipeline_template_id\" ON \"pi_pipeline\" (\"template_id\");\n"
  },
  {
    "path": "packages/ui/certd-server/db/migration-pg/v10027__auto.sql",
    "content": "DROP TABLE IF EXISTS \"cd_domain\";\nCREATE TABLE \"cd_domain\"\n(\n  \"id\"          bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL,\n  \"user_id\"     bigint,\n  \"domain\" varchar(512),\n  challenge_type varchar(50),\n  dns_provider_type varchar(50),\n  dns_provider_access bigint,\n  http_uploader_type varchar(50),\n  http_uploader_access bigint,\n  http_upload_root_dir varchar(512),\n  \"disabled\"    boolean  NOT NULL DEFAULT (false),\n  \"create_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP),\n  \"update_time\" timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP)\n);\n\nCREATE INDEX \"index_domain_user_id\" ON \"cd_domain\" (\"user_id\");\nCREATE INDEX \"index_domain_domain\" ON \"cd_domain\" (\"domain\");\n\n"
  },
  {
    "path": "packages/ui/certd-server/db/readme.md",
    "content": "## sqlite与postgres不同点\n1.\nsqlite: AUTOINCREAMENT\npostgresql: GENERATED BY DEFAULT AS IDENTITY\n\n2.\nsqlite: datetime\npostgresql: timestamp\n\n3.\nsqlite: update sqlite_sequence set seq = 1000 where name = 'sys_role' ;\npostgresql: select setval('sys_role_id_seq', 1000);\n\n4.\nsqlite: \"disabled\" boolean DEFAULT (0)\npostgresql: \"disabled\" boolean DEFAULT (false)\n\n5.\nsqlite: last_insert_rowid()\npostgresql: LASTVAL()\n\n6.\nsqlite: integer\npostgresql: bigint\n"
  },
  {
    "path": "packages/ui/certd-server/db/transform.js",
    "content": "import fs from 'fs';\n/**\n * ## sqlite与postgres不同点\n * 1.\n * sqlite: AUTOINCREAMENT\n * postgresql: GENERATED BY DEFAULT AS IDENTITY\n *\n * 2.\n * sqlite: datetime\n * postgresql: timestamp\n *\n * 3.\n * sqlite: update sqlite_sequence set seq = 1000 where name = 'sys_role' ;\n * postgresql: select setval('sys_role_id_seq', 1000);\n *\n * 4.\n * sqlite: \"disabled\" boolean DEFAULT (0)\n * postgresql: \"disabled\" boolean DEFAULT (false)\n *\n * 5.\n * sqlite: last_insert_rowid()\n * postgresql: LASTVAL()\n *\n * 6.\n * sqlite: integer\n * postgresql: bigint\n */\nfunction transformPG() {\n  // 读取文件列表\n  const sqliteFiles = fs.readdirSync('./migration/');\n  const pgFiles = fs.readdirSync('./migration-pg/');\n  //找出pg里面没有的文件\n  const notFiles = sqliteFiles.filter(file => !pgFiles.includes(file));\n  for (const notFile of notFiles) {\n    //开始转换\n    const sqliteSql = fs.readFileSync(`./migration/${notFile}`, 'utf-8');\n    let pgSql = sqliteSql.replaceAll(/AUTOINCREMENT/g, 'GENERATED BY DEFAULT AS IDENTITY');\n    pgSql = pgSql.replaceAll(/datetime/g, 'timestamp');\n    pgSql = pgSql.replaceAll(/boolean DEFAULT \\(0\\)/g, 'boolean DEFAULT (false)');\n    pgSql = pgSql.replaceAll(/boolean.*NOT NULL DEFAULT \\(0\\)/g, 'boolean NOT NULL DEFAULT (false)');\n    pgSql = pgSql.replaceAll(/integer/g, 'bigint');\n    pgSql = pgSql.replaceAll(/last_insert_rowid\\(\\)/g, 'LASTVAL()');\n    fs.writeFileSync(`./migration-pg/${notFile}`, pgSql);\n  }\n\n  if (notFiles.length > 0) {\n    console.log('sqlite->pg 转换完成');\n\n    throw new Error('sqlite->pg 转换完成，有更新，需要测试pg');\n  } else {\n    console.log('sql无需更新');\n  }\n}\n\nfunction transformMysql() {\n  // 读取文件列表\n  const sqliteFiles = fs.readdirSync('./migration/');\n  const pgFiles = fs.readdirSync('./migration-mysql/');\n  //找出pg里面没有的文件\n  const notFiles = sqliteFiles.filter(file => !pgFiles.includes(file));\n  for (const notFile of notFiles) {\n    //开始转换\n    const sqliteSql = fs.readFileSync(`./migration/${notFile}`, 'utf-8');\n    let pgSql = sqliteSql.replaceAll(/AUTOINCREMENT/g, 'AUTO_INCREMENT');\n    pgSql = pgSql.replaceAll(/datetime/g, 'timestamp');\n    //DEFAULT (xxx) 替换成 DEFAULT xxx\n    pgSql = pgSql.replaceAll(/DEFAULT \\(([^)]*)\\)/g, 'DEFAULT $1');\n    pgSql = pgSql.replaceAll(/integer/g, 'bigint');\n    pgSql = pgSql.replaceAll(/last_insert_rowid\\(\\)/g, 'LAST_INSERT_ID()');\n    //text 改成longtext\n    pgSql = pgSql.replaceAll(/text/g, 'longtext');\n    //双引号 替换成反引号\n    pgSql = pgSql.replaceAll(/\"/g, '`');\n\n    fs.writeFileSync(`./migration-mysql/${notFile}`, pgSql);\n  }\n\n  if (notFiles.length > 0) {\n    console.log('sqlite->mysql 转换完成');\n\n    throw new Error('sqlite->mysql 转换完成，有更新，需要测试mysql');\n  } else {\n    console.log('sql无需更新');\n  }\n}\n\ntransformPG();\ntransformMysql();\n"
  },
  {
    "path": "packages/ui/certd-server/export-plugin-md.js",
    "content": "import \"./dist/plugins/index.js\";\nimport { accessRegistry, notificationRegistry, pluginGroups, pluginRegistry } from \"@certd/pipeline\";\nimport { dnsProviderRegistry } from \"@certd/plugin-cert\";\nimport fs from \"fs\";\n\nfunction genPluginMd() {\n  const plugins = {\n    access: [],\n    deploy: [],\n    dnsProvider: [],\n    notification: []\n  };\n\n  plugins.access = accessRegistry.getDefineList();\n  plugins.deploy = pluginRegistry.getDefineList();\n  plugins.dnsProvider = dnsProviderRegistry.getDefineList();\n  plugins.notification = notificationRegistry.getDefineList();\n\n\n//   function genMd(list) {\n//     let mdContent = `<table style='width:100%'>\n// <thead style='width:100%'>\n// <tr >\n//   <th width='70'>序号</th><th width='265'>名称</th><th>说明</th>\n// </tr>\n// </thead>\n// <tbody>\n// `;\n//     let i = 0;\n//     for (const x of list) {\n//       i++\n//       mdContent += `<tr> <td>${i}.</td> <td style='font-weight: bold'>${x.title}</td> <td>${x.desc||''}</td> </tr>`;\n//     }\n//     mdContent += `</tbody></table>`;\n//     return mdContent;\n//   }\n\n  //   function genMd(list) {\n  //   let mdContent = ``;\n  //   let i = 0;\n  //   for (const x of list) {\n  //     i++\n  //     mdContent += `${i}. **${x.title}**     \\n${x.desc||''}  \\n\\n\\n`;\n  //   }\n  //   return mdContent;\n  // }\n\n  function genMd(list) {\n    let mdContent = `\n| 序号 | 名称 | 说明 |\n|-----|-----|-----|\n`;\n    let i = 0;\n    for (const x of list) {\n      i++\n      mdContent += `| ${i}.| **${x.title}** | ${x.desc||''} | \\n`;\n    }\n    return mdContent;\n  }\n\n  function addTableStyle(){\n    return `\n<style module>\ntable th:first-of-type {\n        width: 65px;\n    }\ntable th:nth-of-type(2) {\n        width: 240px;\n    }\n</style>\n    `\n  }\n\n  let mdContent = \"\";\n  mdContent = \"# 授权列表\\n\";\n  mdContent += genMd(plugins.access);\n  mdContent += addTableStyle()\n  fs.writeFileSync(\"../../../docs/guide/plugins/access.md\", mdContent);\n\n  mdContent = \"# DNS提供商\\n\";\n  mdContent += genMd(plugins.dnsProvider);\n  mdContent += addTableStyle()\n  fs.writeFileSync(\"../../../docs/guide/plugins/dns-provider.md\", mdContent);\n\n\n  mdContent = \"# 通知插件\\n\";\n  mdContent += genMd(plugins.notification);\n  mdContent += addTableStyle()\n  fs.writeFileSync(\"../../../docs/guide/plugins/notification.md\", mdContent);\n\n\n  mdContent = \"# 任务插件\\n\";\n  mdContent += `共 \\`${plugins.deploy.length}\\` 款任务插件    \\n`\n  let index =0\n  for (const key in pluginGroups) {\n    index++\n    const group = pluginGroups[key];\n    mdContent += `## ${index}. ${group.title}\\n`;\n    mdContent += genMd(group.plugins);\n  }\n  mdContent += addTableStyle()\n  fs.writeFileSync(\"../../../docs/guide/plugins/deploy.md\", mdContent);\n\n  process.exit()\n}\n\ngenPluginMd()\n"
  },
  {
    "path": "packages/ui/certd-server/export-plugin-yaml.js",
    "content": "// 扫描目录，列出文件，然后加载为模块\n\nimport path, { join } from \"path\";\nimport fs from \"fs\";\nimport { pathToFileURL } from \"node:url\";\nimport * as yaml from \"js-yaml\";\nimport { AbstractTaskPlugin, BaseAccess, BaseNotification } from \"@certd/pipeline\";\n\nfunction scanDir(dir) {\n  const files = fs.readdirSync(dir);\n  const result = [];\n  // 扫描目录及子目录\n  for (const file of files) {\n\n    const filePath = join(dir, file);\n    const stat = fs.statSync(filePath);\n    if (stat.isDirectory()) {\n      result.push(...scanDir(filePath));\n    } else {\n      if (!file.endsWith(\".js\")) {\n        continue;\n      }\n      result.push(filePath);\n    }\n  }\n  return result\n}\n\nexport default async function loadModules(dir) {\n  const files = scanDir(dir);\n  const modules = {}\n  for (const file of files) {\n    if(file === \"dist/plugins/index.js\" || file === \"dist\\\\plugins\\\\index.js\"){\n      continue\n    }\n    try {\n      // 转换为 file:// URL（Windows 必需）\n      const moduleUrl = pathToFileURL(file).href\n      const module = await import(moduleUrl)\n\n      // 如果模块有默认导出，优先使用\n      modules[file] = module.default || module\n    } catch (err) {\n      console.error(`加载模块 ${file} 失败:`, err)\n    }\n  }\n  return modules;\n}\n\nfunction isPrototypeOf(value,cls){\n  return cls.prototype.isPrototypeOf(value.prototype)\n}\nasync function genMetadata(){\n  const modules = await loadModules('./dist/plugins');\n\n  fs.rmSync(\"./metadata\", { recursive: true });\n  fs.mkdirSync(\"./metadata\", { recursive: true });\n  for (const key in modules) {\n    console.log(key)\n    const module = modules[key]\n    const entry = Object.entries(module)\n    for (const [name, value] of entry) {\n      //如果有define属性\n      if(value.define){\n        //那么就是插件\n        let location = key.substring(4)\n        location = location.substring(0, location.length - 3)\n        location = location.replaceAll(\"\\\\\",\"/\")\n        location += \".js\"\n        location = `../../..${location}` // 从modules/plugin/plugin-service 加载 ../../plugins目录下的文件\n\n        const pluginDefine = {\n          ...value.define\n        }\n        pluginDefine.type = \"builtIn\"\n        if(pluginDefine.accessType){\n          pluginDefine.pluginType = \"dnsProvider\"\n        }else if(isPrototypeOf(value,AbstractTaskPlugin)){\n          pluginDefine.pluginType = \"deploy\"\n        }else if(isPrototypeOf(value,BaseNotification)){\n          pluginDefine.pluginType = \"notification\"\n        }else if(isPrototypeOf(value,BaseAccess)){\n          pluginDefine.pluginType = \"access\"\n        }else{\n          console.log(`[warning] 未知的插件类型：${pluginDefine.name}`)\n        }\n\n        const filePath = path.join(`./metadata/${pluginDefine.pluginType}_${pluginDefine.name}.yaml`)\n\n        pluginDefine.scriptFilePath = location\n        const data  = yaml.dump(pluginDefine)\n        fs.writeFileSync(filePath,data ,'utf8')\n      }\n    }\n  }\n  process.exit()\n}\n// import why from 'why-is-node-running'\n// setTimeout(() => why(), 100); // 延迟打印原因\ngenMetadata()\n\n"
  },
  {
    "path": "packages/ui/certd-server/f.yaml",
    "content": "service: certd         ## 应用发布到云平台的名字，一般指应用名\n\nprovider:\n  name: aliyun                 ## 发布的云平台，aliyun，tencent 等\n\ndeployType:\n  type: koa                    ## 部署的应用类型\n  version: 3.0.0\ncustom:\n  customDomain:\n    domainName: auto\n"
  },
  {
    "path": "packages/ui/certd-server/jest.config.js",
    "content": "module.exports = {\n  preset: 'ts-jest',\n  testEnvironment: 'node',\n  testPathIgnorePatterns: ['<rootDir>/test/fixtures'],\n  coveragePathIgnorePatterns: ['<rootDir>/test/'],\n};"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_51dns.yaml",
    "content": "name: 51dns\ntitle: 51dns授权\nicon: arcticons:dns-changer-3\ndesc: ''\ninput:\n  username:\n    title: 用户名\n    component:\n      placeholder: 用户名或手机号\n    required: true\n    encrypt: false\n  password:\n    title: 登录密码\n    component:\n      name: a-input-password\n      vModel: value\n      placeholder: 密码\n    required: true\n    encrypt: true\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-51dns/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_CacheFly.yaml",
    "content": "name: CacheFly\ntitle: CacheFly\ndesc: CacheFly\nicon: clarity:plugin-line\ninput:\n  username:\n    title: username\n    component:\n      placeholder: username\n    required: true\n  password:\n    title: password\n    component:\n      placeholder: password\n    required: true\n    encrypt: true\n  otpkey:\n    title: totp key\n    component:\n      placeholder: totp key\n    encrypt: true\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-cachefly/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_Gcore.yaml",
    "content": "name: Gcore\ntitle: Gcore\ndesc: Gcore\nicon: clarity:plugin-line\ninput:\n  username:\n    title: username\n    component:\n      placeholder: username\n    required: true\n  password:\n    title: password\n    component:\n      placeholder: password\n    required: true\n    encrypt: true\n  otpkey:\n    title: totp key\n    component:\n      placeholder: totp key\n    encrypt: true\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-gcore/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_aws.yaml",
    "content": "name: aws\ntitle: 亚马逊云aws授权\ndesc: ''\nicon: svg:icon-aws\ninput:\n  accessKeyId:\n    title: accessKeyId\n    component:\n      placeholder: accessKeyId\n    helper: >-\n      右上角->安全凭证->访问密钥，[点击前往](https://us-east-1.console.aws.amazon.com/iam/home?region=ap-east-1#/security_credentials/access-key-wizard)\n    required: true\n  secretAccessKey:\n    title: secretAccessKey\n    component:\n      placeholder: secretAccessKey\n    required: true\n    encrypt: true\n    helper: 请妥善保管您的安全访问密钥。您可以在AWS管理控制台的IAM中创建新的访问密钥。\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-aws/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_cloudflare.yaml",
    "content": "name: cloudflare\ntitle: cloudflare授权\nicon: simple-icons:cloudflare\ndesc: ''\ninput:\n  apiToken:\n    title: API Token\n    component:\n      placeholder: api token，用户 API 令牌\n    helper: |-\n      前往 [获取API令牌](https://dash.cloudflare.com/profile/api-tokens)，注意是令牌，不是密钥。\n       token权限必须包含：[Zone区域-Zone区域-Edit编辑], [Zone区域-DNS-Edit编辑]\n    required: true\n    encrypt: true\n  proxy:\n    title: HTTP代理\n    component:\n      placeholder: http://xxxx.xxx.xx:10811\n    helper: 是否使用http代理\n    required: false\n    encrypt: false\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-cloudflare/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_demo.yaml",
    "content": "name: demo\ntitle: 授权插件示例\nicon: clarity:plugin-line\ndesc: ''\ninput:\n  demoKeyId:\n    title: 密钥Id\n    component:\n      placeholder: demoKeyId\n    required: true\n  demoKeySecret:\n    title: 密钥串\n    component:\n      placeholder: demoKeySecret\n    required: true\n    encrypt: true\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-demo/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_dnsla.yaml",
    "content": "name: dnsla\ntitle: dns.la授权\nicon: arcticons:dns-changer-3\ndesc: ''\ninput:\n  apiId:\n    title: APIID\n    component:\n      placeholder: APIID\n    helper: 从我的账户->API密钥中获取 APIID APISecret\n    required: true\n    encrypt: false\n  apiSecret:\n    title: APISecret\n    component:\n      placeholder: ''\n    helper: ''\n    required: false\n    encrypt: true\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-dnsla/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_dnspod.yaml",
    "content": "name: dnspod\ntitle: dnspod(已废弃)\ndesc: 腾讯云的域名解析接口已迁移到dnspod\ndeprecated: dnspod已废弃，请换成腾讯云\nicon: svg:icon-tencentcloud\ninput:\n  endpoint:\n    title: 端点\n    component:\n      placeholder: endpoint\n      name: a-auto-complete\n      vModel: value\n      options:\n        - value: https://dnsapi.cn\n          label: 中国站\n        - value: https://api.dnspod.com\n          label: 国际站\n    rules:\n      - required: true\n        message: 该项必填\n  id:\n    title: ID\n    component:\n      placeholder: dnspod token 的 id\n    rules:\n      - required: true\n        message: 该项必填\n  token:\n    title: token\n    component:\n      placeholder: 开放接口token\n    encrypt: true\n    rules:\n      - required: true\n        message: 该项必填\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-tencent/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_dogecloud.yaml",
    "content": "name: dogecloud\ntitle: 多吉云\ndesc: ''\nicon: svg:icon-dogecloud\ninput:\n  accessKey:\n    title: AccessKey\n    component:\n      placeholder: AccessKey\n    helper: 请前往[多吉云-密钥管理](https://console.dogecloud.com/user/keys)获取\n    required: true\n    encrypt: false\n  secretKey:\n    title: SecretKey\n    component:\n      placeholder: SecretKey\n    helper: 请前往[多吉云-密钥管理](https://console.dogecloud.com/user/keys)获取\n    required: true\n    encrypt: true\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-doge/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_huawei.yaml",
    "content": "name: huawei\ntitle: 华为云授权\ndesc: ''\nicon: svg:icon-huawei\ninput:\n  accessKeyId:\n    title: accessKeyId\n    component:\n      placeholder: accessKeyId\n    helper: >-\n      证书申请需要有dns解析权限，前往[我的凭证-访问密钥](https://console.huaweicloud.com/iam/?region=cn-east-3#/mine/accessKey)获取\n    required: true\n  accessKeySecret:\n    title: accessKeySecret\n    component:\n      placeholder: accessKeySecret\n    required: true\n    encrypt: true\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-huawei/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_jdcloud.yaml",
    "content": "name: jdcloud\ntitle: 京东云\ndesc: ''\nicon: svg:icon-jdcloud\ninput:\n  accessKeyId:\n    title: AccessKeyID\n    component:\n      placeholder: AccessKeyID\n    helper: '[获取密钥](https://uc.jdcloud.com/account/accesskey)'\n    required: true\n  secretAccessKey:\n    title: SecretAccessKey\n    component:\n      placeholder: SecretAccessKey\n    required: true\n    encrypt: true\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-jdcloud/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_namesilo.yaml",
    "content": "name: namesilo\ntitle: namesilo授权\ndesc: ''\nicon: simple-icons:namesilo\ninput:\n  apiKey:\n    title: API Key\n    component:\n      placeholder: api key\n    helper: |-\n      前往 [获取API Key](https://www.namesilo.com/account/api-manager)\n      不要勾选第一项（Generate key for read-only access）\n      勾选第二项（Submitting this form...）\n      然后点击Generate按钮\n    required: true\n    encrypt: true\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-namesilo/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_proxmox.yaml",
    "content": "name: proxmox\ntitle: proxmox\ndesc: ''\nicon: svg:icon-proxmox\ninput:\n  host:\n    title: host\n    component:\n      placeholder: IP或域名\n    required: true\n    encrypt: false\n  port:\n    title: 端口\n    component:\n      placeholder: 端口\n      component:\n        name: a-input-number\n    required: true\n    encrypt: false\n  username:\n    title: 用户名\n    component:\n      placeholder: username\n    required: true\n    encrypt: false\n  password:\n    title: 密码\n    component:\n      placeholder: password\n    required: true\n    encrypt: true\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-proxmox/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_upyun.yaml",
    "content": "name: upyun\ntitle: 又拍云\ndesc: ''\nicon: svg:icon-upyun\ninput:\n  username:\n    title: 账号\n    component:\n      placeholder: 又拍云账号\n    required: true\n  password:\n    title: 密码\n    component:\n      placeholder: 又拍云密码\n    required: true\n    encrypt: true\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-upyun/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_volcengine.yaml",
    "content": "name: volcengine\ntitle: 火山引擎\ndesc: ''\nicon: svg:icon-volcengine\ninput:\n  accessKeyId:\n    title: AccessKeyID\n    component:\n      placeholder: AccessKeyID\n    helper: '[获取密钥](https://console.volcengine.com/iam/keymanage/)'\n    required: true\n  secretAccessKey:\n    title: SecretAccessKey\n    component:\n      placeholder: SecretAccessKey\n    required: true\n    encrypt: true\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-volcengine/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_west.yaml",
    "content": "name: west\ntitle: 西部数码授权\ndesc: ''\nicon: tabler:map-west\ninput:\n  scope:\n    title: 权限范围\n    component:\n      name: a-select\n      vModel: value\n      options:\n        - value: account\n          label: 账户级别，对所有域名都有权限管理\n        - value: domain\n          label: 域名级别，仅能管理单个域名\n    helper: 选择权限范围\n    required: true\n  username:\n    title: 账号\n    helper: 你的登录账号\n    encrypt: false\n    required: false\n    mergeScript: |2-\n\n          return {\n            show:ctx.compute(({form})=>{\n              return form.access.scope === 'account'\n            })\n          }\n          \n  apikey:\n    title: ApiKey\n    component:\n      placeholder: 账户级别的key，对整个账户都有管理权限\n    helper: |-\n      账户级别的key，对整个账户都有管理权限\n      前往https://www.west.cn/manager/API/APIconfig.asp，手动设置“api连接密码”\n    encrypt: true\n    required: false\n    mergeScript: |2-\n\n          return {\n            show:ctx.compute(({form})=>{\n              return form.access.scope === 'account'\n            })\n          }\n          \n  apidomainkey:\n    title: apidomainkey\n    component:\n      placeholder: 域名级别的key，仅对单个域名有权限\n    helper: |-\n      域名级别的key，仅对单个域名有权限。 \n      前往[西部数据域名管理](https://www.west.cn/manager/domain/)，点击域名，右上方点击ApiKey获取密钥\n    encrypt: true\n    required: false\n    mergeScript: |2-\n\n          return {\n            show:ctx.compute(({form})=>{\n              return form.access.scope === 'domain'\n            })\n          }\n          \ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-west/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/access_woai.yaml",
    "content": "name: woai\ntitle: 我爱云授权\ndesc: 我爱云CDN\nicon: clarity:plugin-line\ninput:\n  username:\n    title: 账号\n    component:\n      placeholder: 我爱云的账号\n    required: true\n  password:\n    title: 密码\n    component:\n      placeholder: 我爱云的密码\n    required: true\n    encrypt: true\ntype: builtIn\npluginType: access\nscriptFilePath: ../../../plugins/plugin-woai/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_AliyunDeployCertToALB.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: AliyunDeployCertToALB\ntitle: 阿里云-部署至ALB（应用负载均衡）\nicon: svg:icon-aliyun\ngroup: aliyun\ndesc: ALB,更新监听器的默认证书\nneedPlus: false\ninput:\n  cert:\n    title: 域名证书\n    helper: |-\n      请选择证书申请任务输出的域名证书\n      或者选择前置任务“上传证书到阿里云”任务的证书ID，可以减少上传到阿里云的证书数量\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - uploadCertToAliyun\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 阿里云授权AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: aliyun\n    required: true\n    order: 0\n  regionId:\n    title: ALB所在地区\n    component:\n      name: remote-select\n      vModel: value\n      type: plugin\n      typeName: AliyunDeployCertToALB\n      action: onGetRegionList\n      watches:\n        - certDomains\n        - accessId\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 请选择\n    order: 0\n  loadBalancers:\n    title: 负载均衡列表\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: AliyunDeployCertToALB\n      action: onGetLoadBalanceList\n      watches:\n        - certDomains\n        - accessId\n        - regionId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 要部署证书的负载均衡ID\n    order: 0\n  listeners:\n    title: 监听器列表\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: AliyunDeployCertToALB\n      action: onGetListenerList\n      watches:\n        - certDomains\n        - accessId\n        - loadBalancers\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 要部署证书的监听器列表\n    order: 0\n  casEndpoint:\n    title: 证书接入点\n    helper: 不会选就保持默认即可\n    value: cas.aliyuncs.com\n    component:\n      name: a-select\n      options:\n        - value: cas.aliyuncs.com\n          label: 中国大陆\n        - value: cas.ap-southeast-1.aliyuncs.com\n          label: 新加坡\n        - value: cas.eu-central-1.aliyuncs.com\n          label: 德国（法兰克福）\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-aliyun/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_AliyunDeployCertToFC.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: AliyunDeployCertToFC\ntitle: 阿里云-部署至阿里云FC(3.0)\nicon: svg:icon-aliyun\ngroup: aliyun\ndesc: 部署证书到阿里云函数计算（FC3.0）,【注意】证书的加密算法必须选择【pkcs1旧版】\nneedPlus: true\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择证书申请任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  regionId:\n    title: FC大区\n    value: cn-hangzhou\n    component:\n      name: a-auto-complete\n      vModel: value\n      options:\n        - value: cn-qingdao\n          label: 华北1（青岛）\n        - value: cn-beijing\n          label: 华北2（北京）\n        - value: cn-zhangjiakou\n          label: 华北 3（张家口）\n        - value: cn-huhehaote\n          label: 华北5（呼和浩特）\n        - value: cn-hangzhou\n          label: 华东1（杭州）\n        - value: cn-shanghai\n          label: 华东2（上海）\n        - value: cn-shenzhen\n          label: 华南1（深圳）\n        - value: ap-southeast-2\n          label: 澳大利亚（悉尼）\n        - value: eu-central-1\n          label: 德国（法兰克福）\n        - value: ap-southeast-3\n          label: 马来西亚（吉隆坡）\n        - value: us-east-1\n          label: 美国（弗吉尼亚）\n        - value: us-west-1\n          label: 美国（硅谷）\n        - value: ap-northeast-1\n          label: 日本（东京）\n        - value: ap-southeast-7\n          label: 泰国（曼谷）\n        - value: cn-chengdu\n          label: 西南1（成都）\n        - value: ap-southeast-1\n          label: 新加坡\n        - value: ap-south-1\n          label: 印度（孟买）\n        - value: ap-southeast-5\n          label: 印度尼西亚（雅加达）\n        - value: eu-west-1\n          label: 英国（伦敦）\n        - value: cn-hongkong\n          label: 中国香港\n    required: true\n    order: 0\n  accountId:\n    title: 阿里云账号id\n    helper: 阿里云主账号ID，右上角头像下方获取\n    component:\n      name: a-input\n      vModel: value\n    required: true\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 阿里云授权AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: aliyun\n    required: true\n    order: 0\n  fcDomains:\n    title: FC域名\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: AliyunDeployCertToFC\n      action: onGetDomainList\n      watches:\n        - certDomains\n        - accessId\n        - accessId\n        - regionId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: |-\n      请选择要部署证书的域名\n      【注意】证书的加密算法必须选择【pkcs1旧版】（否则会报'private key' has to be in PEM format错误）\n    order: 0\n  protocol:\n    title: 域名支持的协议类型\n    component:\n      name: a-select\n      value: ''\n      options:\n        - value: ''\n          label: 保持原样（适用于原来已经开启了HTTPS）\n        - value: HTTPS\n          label: 仅HTTPS\n        - value: HTTP,HTTPS\n          label: HTTP与HTTPS同时支持\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-aliyun/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_AliyunDeployCertToNLB.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: AliyunDeployCertToNLB\ntitle: 阿里云-部署至NLB（网络负载均衡）\nicon: svg:icon-aliyun\ngroup: aliyun\ndesc: NLB,网络负载均衡,更新监听器的默认证书\nneedPlus: false\ninput:\n  cert:\n    title: 域名证书\n    helper: |-\n      请选择证书申请任务输出的域名证书\n      或者选择前置任务“上传证书到阿里云”任务的证书ID，可以减少上传到阿里云的证书数量\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - uploadCertToAliyun\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 阿里云授权AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: aliyun\n    required: true\n    order: 0\n  regionId:\n    title: NLB所在地区\n    component:\n      name: remote-select\n      vModel: value\n      type: plugin\n      typeName: AliyunDeployCertToNLB\n      action: onGetRegionList\n      watches:\n        - certDomains\n        - accessId\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 请选择\n    order: 0\n  loadBalancers:\n    title: 负载均衡列表\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: AliyunDeployCertToNLB\n      action: onGetLoadBalanceList\n      watches:\n        - certDomains\n        - accessId\n        - regionId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 要部署证书的负载均衡ID\n    order: 0\n  listeners:\n    title: 监听器列表\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: AliyunDeployCertToNLB\n      action: onGetListenerList\n      watches:\n        - certDomains\n        - accessId\n        - loadBalancers\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 要部署证书的监听器列表\n    order: 0\n  casEndpoint:\n    title: 证书接入点\n    helper: 不会选就保持默认即可\n    value: cas.aliyuncs.com\n    component:\n      name: a-select\n      options:\n        - value: cas.aliyuncs.com\n          label: 中国大陆\n        - value: cas.ap-southeast-1.aliyuncs.com\n          label: 新加坡\n        - value: cas.eu-central-1.aliyuncs.com\n          label: 德国（法兰克福）\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-aliyun/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_AliyunDeployCertToSLB.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: AliyunDeployCertToSLB\ntitle: 阿里云-部署至SLB(传统负载均衡)\nicon: svg:icon-aliyun\ngroup: aliyun\ndesc: 部署证书到阿里云SLB(传统负载均衡)\nneedPlus: false\ninput:\n  cert:\n    title: 域名证书\n    helper: |-\n      请选择证书申请任务输出的域名证书\n      或者选择前置任务“上传证书到阿里云”任务的证书ID，可以减少上传到阿里云的证书数量\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - uploadCertToAliyun\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 阿里云授权AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: aliyun\n    required: true\n    order: 0\n  regionId:\n    title: LB所在地区\n    component:\n      name: remote-select\n      vModel: value\n      type: plugin\n      typeName: AliyunDeployCertToSLB\n      action: onGetRegionList\n      watches:\n        - certDomains\n        - accessId\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 请选择\n    order: 0\n  loadBalancers:\n    title: 负载均衡列表\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: AliyunDeployCertToSLB\n      action: onGetLoadBalanceList\n      watches:\n        - certDomains\n        - accessId\n        - regionId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 要部署证书的负载均衡ID\n    order: 0\n  listeners:\n    title: 监听器列表\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: AliyunDeployCertToSLB\n      action: onGetListenerList\n      watches:\n        - certDomains\n        - accessId\n        - loadBalancers\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 要部署证书的监听器列表\n    order: 0\n  casEndpoint:\n    title: 证书接入点\n    helper: 不会选就保持默认即可\n    value: cas.aliyuncs.com\n    component:\n      name: a-select\n      options:\n        - value: cas.aliyuncs.com\n          label: 中国大陆\n        - value: cas.ap-southeast-1.aliyuncs.com\n          label: 新加坡\n        - value: cas.eu-central-1.aliyuncs.com\n          label: 德国（法兰克福）\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-aliyun/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_AliyunDeployCertToWaf.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: AliyunDeployCertToWaf\ntitle: 阿里云-部署至阿里云WAF\nicon: svg:icon-aliyun\ngroup: aliyun\ndesc: 部署证书到阿里云WAF\nneedPlus: true\ninput:\n  cert:\n    title: 域名证书\n    helper: |-\n      请选择证书申请任务输出的域名证书\n      或者选择前置任务“上传证书到阿里云”任务的证书ID，可以减少上传到阿里云的证书数量\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - uploadCertToAliyun\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  regionId:\n    title: WAF接入点\n    helper: 不会选就按默认\n    value: cn-hangzhou\n    component:\n      name: a-select\n      options:\n        - value: cn-hangzhou\n          label: 中国大陆-华东1(杭州)\n        - value: ap-southeast-1\n          label: 新加坡\n    required: true\n    order: 0\n  casEndpoint:\n    title: 证书接入点\n    helper: 跟上面保持一致即可\n    value: cas.aliyuncs.com\n    component:\n      name: a-select\n      options:\n        - value: cas.aliyuncs.com\n          label: 中国大陆\n        - value: cas.ap-southeast-1.aliyuncs.com\n          label: 新加坡\n        - value: cas.eu-central-1.aliyuncs.com\n          label: 德国（法兰克福）\n    required: true\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 阿里云授权AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: aliyun\n    required: true\n    order: 0\n  cnameDomains:\n    title: CNAME站点\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: AliyunDeployCertToWaf\n      action: onGetCnameList\n      watches:\n        - certDomains\n        - accessId\n        - accessId\n        - regionId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 请选择要部署证书的CNAME站点\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-aliyun/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_AwsDeployToCloudFront.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: AwsDeployToCloudFront\ntitle: AWS-部署证书到CloudFront\ndesc: 部署证书到 AWS CloudFront\nicon: svg:icon-aws\ngroup: aws\nneedPlus: true\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - AwsUploadToACM\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  region:\n    title: 区域\n    helper: 证书上传区域\n    component:\n      name: a-auto-complete\n      vModel: value\n      options:\n        - label: us-east-1\n          value: us-east-1\n        - label: us-east-2\n          value: us-east-2\n        - label: us-west-1\n          value: us-west-1\n        - label: us-west-2\n          value: us-west-2\n        - label: af-south-1\n          value: af-south-1\n        - label: ap-east-1\n          value: ap-east-1\n        - label: ap-northeast-1\n          value: ap-northeast-1\n        - label: ap-northeast-2\n          value: ap-northeast-2\n        - label: ap-northeast-3\n          value: ap-northeast-3\n        - label: ap-south-1\n          value: ap-south-1\n        - label: ap-south-2\n          value: ap-south-2\n        - label: ap-southeast-1\n          value: ap-southeast-1\n        - label: ap-southeast-2\n          value: ap-southeast-2\n        - label: ap-southeast-3\n          value: ap-southeast-3\n        - label: ap-southeast-4\n          value: ap-southeast-4\n        - label: ap-southeast-5\n          value: ap-southeast-5\n        - label: ca-central-1\n          value: ca-central-1\n        - label: ca-west-1\n          value: ca-west-1\n        - label: eu-central-1\n          value: eu-central-1\n        - label: eu-central-2\n          value: eu-central-2\n        - label: eu-north-1\n          value: eu-north-1\n        - label: eu-south-1\n          value: eu-south-1\n        - label: eu-south-2\n          value: eu-south-2\n        - label: eu-west-1\n          value: eu-west-1\n        - label: eu-west-2\n          value: eu-west-2\n        - label: eu-west-3\n          value: eu-west-3\n        - label: il-central-1\n          value: il-central-1\n        - label: me-central-1\n          value: me-central-1\n        - label: me-south-1\n          value: me-south-1\n        - label: sa-east-1\n          value: sa-east-1\n    required: true\n    order: 0\n  accessId:\n    title: Access授权\n    helper: aws的授权\n    component:\n      name: access-selector\n      type: aws\n    required: true\n    order: 0\n  distributionIds:\n    title: 分配ID\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      action: onGetDistributions\n      watches:\n        - certDomains\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 请选择distributions id\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-aws/plugins/plugin-deploy-to-cloudfront.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_AwsUploadToACM.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: AwsUploadToACM\ntitle: AWS-上传证书到ACM\ndesc: 上传证书 AWS ACM\nicon: svg:icon-aws\ngroup: aws\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  accessId:\n    title: Access授权\n    helper: aws的授权\n    component:\n      name: access-selector\n      type: aws\n    required: true\n    order: 0\n  region:\n    title: 区域\n    helper: 证书上传区域\n    component:\n      name: a-auto-complete\n      vModel: value\n      options:\n        - label: us-east-1\n          value: us-east-1\n        - label: us-east-2\n          value: us-east-2\n        - label: us-west-1\n          value: us-west-1\n        - label: us-west-2\n          value: us-west-2\n        - label: af-south-1\n          value: af-south-1\n        - label: ap-east-1\n          value: ap-east-1\n        - label: ap-northeast-1\n          value: ap-northeast-1\n        - label: ap-northeast-2\n          value: ap-northeast-2\n        - label: ap-northeast-3\n          value: ap-northeast-3\n        - label: ap-south-1\n          value: ap-south-1\n        - label: ap-south-2\n          value: ap-south-2\n        - label: ap-southeast-1\n          value: ap-southeast-1\n        - label: ap-southeast-2\n          value: ap-southeast-2\n        - label: ap-southeast-3\n          value: ap-southeast-3\n        - label: ap-southeast-4\n          value: ap-southeast-4\n        - label: ap-southeast-5\n          value: ap-southeast-5\n        - label: ca-central-1\n          value: ca-central-1\n        - label: ca-west-1\n          value: ca-west-1\n        - label: eu-central-1\n          value: eu-central-1\n        - label: eu-central-2\n          value: eu-central-2\n        - label: eu-north-1\n          value: eu-north-1\n        - label: eu-south-1\n          value: eu-south-1\n        - label: eu-south-2\n          value: eu-south-2\n        - label: eu-west-1\n          value: eu-west-1\n        - label: eu-west-2\n          value: eu-west-2\n        - label: eu-west-3\n          value: eu-west-3\n        - label: il-central-1\n          value: il-central-1\n        - label: me-central-1\n          value: me-central-1\n        - label: me-south-1\n          value: me-south-1\n        - label: sa-east-1\n          value: sa-east-1\n    required: true\n    order: 0\noutput:\n  awsCertARN:\n    title: 证书ARN\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-aws/plugins/plugin-upload-to-acm.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_CacheFly.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: CacheFly\ntitle: CacheFly-部署证书到CacheFly\ndesc: 部署证书到 CacheFly\nicon: clarity:plugin-line\ngroup: cdn\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  accessId:\n    title: Access授权\n    helper: CacheFly 的授权\n    component:\n      name: access-selector\n      type: CacheFly\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-cachefly/plugins/plugin-deploy-to-cdn.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_CopyToLocal.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: CopyToLocal\ntitle: 主机-复制到本机\nicon: solar:copy-bold-duotone\ndesc: 【仅管理员使用】实际上是复制证书到docker容器内的某个路径，需要做目录映射到宿主机\ngroup: host\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  certType:\n    title: 证书类型\n    helper: 要部署的证书格式，支持pem、pfx、der、jks格式\n    component:\n      name: a-select\n      options:\n        - value: pem\n          label: pem(crt)，用于Nginx等大部分应用\n        - value: pfx\n          label: pfx，一般用于IIS\n        - value: der\n          label: der，一般用于Apache\n        - value: jks\n          label: jks，一般用于JAVA应用\n    required: true\n    order: 0\n  crtPath:\n    title: 证书保存路径\n    helper: |-\n      全链证书，路径要包含文件名\n      推荐使用相对路径，将写入与数据库同级目录，无需映射，例如：tmp/cert.pem\n    component:\n      placeholder: tmp/full_chain.pem\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.certType === 'pem';\n              })\n            }\n          \n    required: true\n    rules:\n      - type: filepath\n    order: 0\n  keyPath:\n    title: 私钥保存路径\n    helper: |-\n      路径要包含文件名\n      推荐使用相对路径，将写入与数据库同级目录，无需映射，例如：tmp/cert.key\n    component:\n      placeholder: tmp/cert.key\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.certType === 'pem';\n              })\n            }\n          \n    required: true\n    rules:\n      - type: filepath\n    order: 0\n  icPath:\n    title: 中间证书保存路径\n    helper: 路径要包含文件名，一般情况传上面两个文件就行了，极少数情况需要这个中间证书\n    component:\n      placeholder: /root/deploy/nginx/intermediate.pem\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.certType === 'pem';\n              })\n            }\n          \n    rules:\n      - type: filepath\n    order: 0\n  pfxPath:\n    title: PFX证书保存路径\n    helper: |-\n      用于IIS证书部署，路径要包含文件名\n      推荐使用相对路径，将写入与数据库同级目录，无需映射，例如：tmp/cert.pfx\n    component:\n      placeholder: tmp/cert.pfx\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.certType === 'pfx';\n              })\n            }\n          \n    required: true\n    rules:\n      - type: filepath\n    order: 0\n  derPath:\n    title: DER证书保存路径\n    helper: |-\n      用于Apache证书部署，路径要包含文件名\n      推荐使用相对路径，将写入与数据库同级目录，无需映射，例如：tmp/cert.der\n      .der和.cer是相同的东西，改个后缀名即可\n    component:\n      placeholder: tmp/cert.der 或 tmp/cert.cer\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.certType === 'der';\n              })\n            }\n          \n    required: true\n    rules:\n      - type: filepath\n    order: 0\n  jksPath:\n    title: jks证书保存路径\n    helper: 用于java，路径要包含文件名，例如：tmp/cert.jks\n    component:\n      placeholder: tmp/cert.jks\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.certType === 'jks';\n              })\n            }\n          \n    required: true\n    rules:\n      - type: filepath\n    order: 0\noutput:\n  hostCrtPath:\n    title: 证书保存路径\n    type: HostCrtPath\n  hostKeyPath:\n    title: 私钥保存路径\n    type: HostKeyPath\n  hostIcPath:\n    title: 中间证书保存路径\n    type: HostKeyPath\n  hostPfxPath:\n    title: PFX保存路径\n    type: HostPfxPath\n  hostDerPath:\n    title: DER保存路径\n    type: HostDerPath\n  hostJksPath:\n    title: jks保存路径\n    type: HostJksPath\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-host/plugin/copy-to-local/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_CustomScript.yaml",
    "content": "showRunStrategy: true\ndefault:\n  strategy:\n    runStrategy: 1\nname: CustomScript\ntitle: 自定义js脚本\nicon: ri:javascript-line\ndesc: 【仅管理员】运行自定义js脚本执行\ngroup: other\ninput:\n  script:\n    title: 脚本\n    helper: 自定义js脚本，[脚本编写帮助文档](https://certd.docmirror.cn/guide/use/custom-script/)\n    component:\n      name: a-textarea\n      vModel: value\n      rows: 10\n      style: 'background-color: #000c17;color: #fafafa;'\n    required: true\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: false\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-other/plugins/plugin-script.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_DBBackupPlugin.yaml",
    "content": "showRunStrategy: true\ndefault:\n  strategy:\n    runStrategy: 0\nname: DBBackupPlugin\ntitle: 数据库备份\nicon: lucide:database-backup\ndesc: 仅支持备份SQLite数据库\ngroup: other\nneedPlus: true\ninput:\n  backupMode:\n    title: 备份方式\n    value: local\n    component:\n      name: a-select\n      options:\n        - label: 本地复制\n          value: local\n        - label: ssh上传\n          value: ssh\n        - label: oss上传\n          value: oss\n      placeholder: ''\n    helper: 支持本地复制、ssh上传\n    required: true\n    order: 0\n  sshAccessId:\n    title: 主机登录授权\n    component:\n      name: access-selector\n      type: ssh\n    mergeScript: |2-\n\n            return {\n               show:ctx.compute(({form})=>{\n                return form.backupMode === 'ssh';\n              })\n            }\n          \n    required: true\n    order: 0\n  ossType:\n    title: OSS类型\n    component:\n      name: a-select\n      options:\n        - value: alioss\n          label: 阿里云OSS\n        - value: s3\n          label: MinIO/S3\n        - value: qiniuoss\n          label: 七牛云\n        - value: tencentcos\n          label: 腾讯云COS\n        - value: ftp\n          label: Ftp\n        - value: sftp\n          label: Sftp\n    mergeScript: |2-\n\n            return {\n               show:ctx.compute(({form})=>{\n                return form.backupMode === 'oss';\n              })\n            }\n          \n    required: true\n    order: 0\n  ossAccessId:\n    title: OSS授权\n    component:\n      name: access-selector\n    mergeScript: |2-\n\n            return {\n              show:ctx.compute(({form})=>{\n                return form.backupMode === 'oss';\n              }),\n              component:{\n                type: ctx.compute(({form})=>{\n                  return form.ossType;\n                }),\n              }\n            }\n          \n    required: true\n    order: 0\n  backupDir:\n    title: 备份保存目录\n    component:\n      name: a-input\n      type: value\n      placeholder: 默认certd_backup\n    helper: ssh方式默认保存在当前用户的certd_backup目录下，本地方式默认保存在data/certd_backup目录下，也可以填写绝对路径\n    required: false\n    order: 0\n  filePrefix:\n    title: 备份文件前缀\n    component:\n      name: a-input\n      vModel: value\n      placeholder: 默认db_backup\n    required: false\n    order: 0\n  withUpload:\n    title: 附加上传文件\n    value: true\n    component:\n      name: a-switch\n      vModel: checked\n      placeholder: 是否备份上传的头像等文件\n    required: false\n    order: 0\n  retainDays:\n    title: 删除过期备份\n    component:\n      name: a-input-number\n      vModel: value\n      placeholder: '20'\n    helper: 删除多少天前的备份,不填则不删除，windows暂不支持\n    required: false\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-other/plugins/plugin-db-backup.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_DemoTest.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: DemoTest\ntitle: Demo-测试插件\nicon: clarity:plugin-line\ngroup: other\ninput:\n  text:\n    title: 属性示例\n    value: 默认值\n    component:\n      name: a-input\n      vModel: value\n    helper: 帮助说明,[链接](https://certd.docmirror.cn)\n    required: false\n    order: 0\n  select:\n    title: 选择框\n    component:\n      name: a-auto-complete\n      vModel: value\n      options:\n        - value: show\n          label: 动态显\n        - value: hide\n          label: 动态隐\n    order: 0\n  showText:\n    title: 动态显隐\n    helper: 我会根据选择框的值进行显隐\n    show: true\n    mergeScript: |2-\n\n          return {\n            show: ctx.compute(({form})=>{\n              return form.select === 'show';\n            })\n          }\n          \n    order: 0\n  multiSelect:\n    title: 多选框\n    component:\n      name: a-select\n      vModel: value\n      mode: tags\n      multiple: true\n      options:\n        - value: '1'\n          label: 选项1\n        - value: '2'\n          label: 选项2\n    order: 0\n  switch:\n    title: switch\n    component:\n      name: a-switch\n      vModel: checked\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: demo授权\n    helper: demoAccess授权\n    component:\n      name: access-selector\n      type: demo\n    order: 0\n  siteName:\n    title: 从后端获取选项\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      action: onGetSiteList\n      watches:\n        - certDomains\n        - accessId\n        - certDomains\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 选择时可以从后端获取选项\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-demo/plugins/plugin-test.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_DeployCertToAliyunCDN.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: DeployCertToAliyunCDN\ntitle: 阿里云-部署证书至CDN\nicon: svg:icon-aliyun\ngroup: aliyun\ndesc: 自动部署域名证书至阿里云CDN\ninput:\n  endpoint:\n    title: 证书服务接入点\n    helper: 不会选就按默认\n    value: cas.aliyuncs.com\n    component:\n      name: a-select\n      options:\n        - value: cas.aliyuncs.com\n          label: 中国大陆\n        - value: cas.ap-southeast-1.aliyuncs.com\n          label: 新加坡\n        - value: cas.eu-central-1.aliyuncs.com\n          label: 德国（法兰克福）\n    required: true\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - uploadCertToAliyun\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 阿里云授权AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: aliyun\n    required: true\n    order: 0\n  domainName:\n    title: CDN加速域名\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: DeployCertToAliyunCDN\n      action: onGetDomainList\n      watches:\n        - certDomains\n        - accessId\n        - certDomains\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 你在阿里云上配置的CDN加速域名，比如:certd.docmirror.cn\n    order: 0\n  certRegion:\n    title: 证书所在地域\n    helper: cn-hangzhou和ap-southeast-1，默认cn-hangzhou。国际站用户建议使用ap-southeast-1。\n    value: cn-hangzhou\n    component:\n      name: a-select\n      options:\n        - value: cn-hangzhou\n          label: 中国大陆\n        - value: ap-southeast-1\n          label: 新加坡\n    required: true\n    order: 0\n  certName:\n    title: 证书名称\n    helper: 上传后将以此名称作为前缀备注\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-aliyun/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_DeployCertToAliyunDCDN.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: DeployCertToAliyunDCDN\ntitle: 阿里云-部署证书至DCDN\nicon: svg:icon-aliyun\ngroup: aliyun\ndesc: 依赖证书申请前置任务，自动部署域名证书至阿里云DCDN\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - uploadCertToAliyun\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 阿里云授权AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: aliyun\n    required: true\n    order: 0\n  domainName:\n    title: DCDN加速域名\n    helper: 你在阿里云上配置的CDN加速域名，比如:certd.docmirror.cn\n    required: true\n    order: 0\n  certName:\n    title: 证书名称\n    helper: 上传后将以此名称作为前缀备注\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-aliyun/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_DeployCertToAliyunOSS.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: DeployCertToAliyunOSS\ntitle: 阿里云-部署证书至OSS\nicon: svg:icon-aliyun\ngroup: aliyun\ndesc: 自动部署域名证书至阿里云OSS\ninput:\n  region:\n    title: 大区\n    component:\n      name: a-auto-complete\n      vModel: value\n      options:\n        - value: oss-cn-hangzhou\n          label: 华东1（杭州）\n        - value: oss-cn-shanghai\n          label: 华东2（上海）\n        - value: oss-cn-nanjing\n          label: 华东5（南京-本地地域）\n        - value: oss-cn-fuzhou\n          label: 华东6（福州-本地地域）\n        - value: oss-cn-wuhan-lr\n          label: 华中1（武汉-本地地域）\n        - value: oss-cn-qingdao\n          label: 华北1（青岛）\n        - value: oss-cn-beijing\n          label: 华北2（北京）\n        - value: oss-cn-zhangjiakou\n          label: 华北 3（张家口）\n        - value: oss-cn-huhehaote\n          label: 华北5（呼和浩特）\n        - value: oss-cn-wulanchabu\n          label: 华北6（乌兰察布）\n        - value: oss-cn-shenzhen\n          label: 华南1（深圳）\n        - value: oss-cn-heyuan\n          label: 华南2（河源）\n        - value: oss-cn-guangzhou\n          label: 华南3（广州）\n        - value: oss-cn-chengdu\n          label: 西南1（成都）\n        - value: oss-cn-hongkong\n          label: 中国香港\n        - value: oss-us-west-1\n          label: 美国（硅谷）①\n        - value: oss-us-east-1\n          label: 美国（弗吉尼亚）①\n        - value: oss-ap-northeast-1\n          label: 日本（东京）①\n        - value: oss-ap-northeast-2\n          label: 韩国（首尔）\n        - value: oss-ap-southeast-1\n          label: 新加坡①\n        - value: oss-ap-southeast-2\n          label: 澳大利亚（悉尼）①\n        - value: oss-ap-southeast-3\n          label: 马来西亚（吉隆坡）①\n        - value: oss-ap-southeast-5\n          label: 印度尼西亚（雅加达）①\n        - value: oss-ap-southeast-6\n          label: 菲律宾（马尼拉）\n        - value: oss-ap-southeast-7\n          label: 泰国（曼谷）\n        - value: oss-eu-central-1\n          label: 德国（法兰克福）①\n        - value: oss-eu-west-1\n          label: 英国（伦敦）\n        - value: oss-me-east-1\n          label: 阿联酋（迪拜）①\n        - value: oss-rg-china-mainland\n          label: 无地域属性（中国内地）\n    required: true\n    order: 0\n  bucket:\n    title: Bucket\n    helper: 存储桶名称\n    required: true\n    order: 0\n  domainName:\n    title: 绑定的域名\n    helper: 你在阿里云OSS上绑定的域名，比如:certd.docmirror.cn\n    required: true\n    order: 0\n  certName:\n    title: 证书名称\n    helper: 上传后将以此名称作为前缀备注\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 阿里云授权AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: aliyun\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-aliyun/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_DeployCertToTencentAll.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: DeployCertToTencentAll\ntitle: 腾讯云-部署证书到任意云资源\nneedPlus: false\nicon: svg:icon-tencentcloud\ngroup: tencent\ndesc: 支持负载均衡、CDN、DDoS、直播、点播、Web应用防火墙、API网关、TEO、容器服务、对象存储、轻应用服务器、云原生微服务、云开发\ninput:\n  accessId:\n    title: Access授权\n    helper: access授权\n    component:\n      name: access-selector\n      type: tencent\n    required: true\n    order: 0\n  tencentCertId:\n    title: 证书\n    helper: 请选择\"证书申请任务\"或“上传证书到腾讯云”前置任务的输出\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - UploadCertToTencent\n    required: true\n    order: 0\n  resourceType:\n    title: 资源类型\n    component:\n      name: a-select\n      vModel: value\n      allowClear: true\n      options:\n        - value: clb\n          label: 负载均衡\n        - value: cdn\n          label: CDN\n        - value: ddos\n          label: DDoS\n        - value: live\n          label: 直播\n        - value: vod\n          label: 点播\n        - value: waf\n          label: Web应用防火墙\n        - value: apigateway\n          label: API网关\n        - value: teo\n          label: TEO\n        - value: tke\n          label: 容器服务\n        - value: cos\n          label: 对象存储\n        - value: lighthouse\n          label: 轻应用服务器\n        - value: tse\n          label: 云原生微服务\n        - value: tcb\n          label: 云开发\n    helper: ''\n    required: true\n    order: 0\n  region:\n    title: Region\n    component:\n      name: a-input\n      vModel: value\n      allowClear: true\n    helper: >-\n      当云资源类型传入clb、waf、apigateway、cos、lighthouse、tke、tse、tcb\n      时，公共参数Region必传。[参考文档](https://cloud.tencent.com/document/product/400/91667)\n    order: 0\n  instanceIdList:\n    title: 云资源实例Id列表\n    component:\n      name: a-select\n      vModel: value\n      open: false\n      mode: tags\n    helper: '[参考文档](https://cloud.tencent.com/document/product/400/91667)'\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-tencent/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_DeployCertToTencentCDN.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: DeployCertToTencentCDN\ntitle: 腾讯云-部署到CDN（废弃）\nicon: svg:icon-tencentcloud\ngroup: tencent\ndesc: 已废弃，请使用v2版\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  accessId:\n    title: Access提供者\n    helper: access 授权\n    component:\n      name: access-selector\n      type: tencent\n    required: true\n    order: 0\n  certName:\n    title: 证书名称\n    helper: 证书上传后将以此参数作为名称前缀\n    order: 0\n  domainName:\n    title: cdn加速域名\n    rules:\n      - required: true\n        message: 该项必填\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-tencent/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_DeployCertToTencentCLB.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: DeployCertToTencentCLB\ntitle: 腾讯云-部署到CLB\nicon: svg:icon-tencentcloud\ngroup: tencent\ndesc: 暂时只支持单向认证证书，暂时只支持通用负载均衡\ninput:\n  region:\n    title: 大区\n    component:\n      name: a-auto-complete\n      vModel: value\n      options:\n        - value: ap-guangzhou\n        - value: ap-beijing\n        - value: ap-chengdu\n        - value: ap-chongqing\n        - value: ap-hongkong\n        - value: ap-jakarta\n        - value: ap-mumbai\n        - value: ap-nanjing\n        - value: ap-seoul\n        - value: ap-shanghai\n        - value: ap-shanghai-fsi\n        - value: ap-shenzhen-fsi\n        - value: ap-singapore\n        - value: ap-tokyo\n        - value: eu-frankfurt\n        - value: na-ashburn\n        - value: na-siliconvalley\n        - value: na-toronto\n        - value: sa-saopaulo\n    required: true\n    order: 0\n  certName:\n    title: 证书名称前缀\n    order: 0\n  loadBalancerId:\n    title: 负载均衡ID\n    helper: 如果没有配置，则根据域名匹配负载均衡下的监听器（根据域名匹配时暂时只支持前100个）\n    required: true\n    order: 0\n  listenerId:\n    title: 监听器ID\n    required: true\n    order: 0\n  domain:\n    title: 域名\n    required: false\n    component:\n      name: a-select\n      vModel: value\n      open: false\n      mode: tags\n    helper: 如果开启了sni，则此项必须填写，未开启，则不要填写\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  accessId:\n    title: Access提供者\n    helper: access授权\n    component:\n      name: access-selector\n      type: tencent\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-tencent/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_DeployCertToTencentCosPlugin.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: DeployCertToTencentCosPlugin\ntitle: 腾讯云-部署证书到COS\nneedPlus: false\nicon: svg:icon-tencentcloud\ngroup: tencent\ndesc: 部署到腾讯云COS源站域名证书【注意：很不稳定，需要重试很多次偶尔才能成功一次】\ninput:\n  accessId:\n    title: Access授权\n    helper: access授权\n    component:\n      name: access-selector\n      type: tencent\n    required: true\n    order: 0\n  bucket:\n    title: 存储桶名称\n    helper: 请输入存储桶名称\n    order: 0\n  region:\n    title: 所在地域\n    helper: 存储桶所在地域\n    component:\n      name: a-auto-complete\n      vModel: value\n      options:\n        - value: ''\n          label: '--------中国大陆地区-------'\n          disabled: true\n        - value: ap-beijing-1\n          label: 北京1区\n        - value: ap-beijing\n          label: 北京\n        - value: ap-nanjing\n          label: 南京\n        - value: ap-shanghai\n          label: 上海\n        - value: ap-guangzhou\n          label: 广州\n        - value: ap-chengdu\n          label: 成都\n        - value: ap-chongqing\n          label: 重庆\n        - value: ap-shenzhen-fsi\n          label: 深圳金融\n        - value: ap-shanghai-fsi\n          label: 上海金融\n        - value: ap-beijing-fsi\n          label: 北京金融\n        - value: ''\n          label: '--------中国香港及境外-------'\n          disabled: true\n        - value: ap-hongkong\n          label: 中国香港\n        - value: ap-singapore\n          label: 新加坡\n        - value: ap-mumbai\n          label: 孟买\n        - value: ap-jakarta\n          label: 雅加达\n        - value: ap-seoul\n          label: 首尔\n        - value: ap-bangkok\n          label: 曼谷\n        - value: ap-tokyo\n          label: 东京\n        - value: na-siliconvalley\n          label: 硅谷\n        - value: na-ashburn\n          label: 弗吉尼亚\n        - value: sa-saopaulo\n          label: 圣保罗\n        - value: eu-frankfurt\n          label: 法兰克福\n    order: 0\n  domains:\n    title: COS域名\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: DeployCertToTencentCosPlugin\n      action: onGetDomainList\n      watches:\n        - certDomains\n        - accessId\n        - bucket\n        - region\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 请选择域名\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书，或者选择前置任务“上传证书到腾讯云”任务的证书ID\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - UploadCertToTencent\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-tencent/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_DeployCertToTencentEO.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: DeployCertToTencentEO\ntitle: 腾讯云-部署到腾讯云EO\nicon: svg:icon-tencentcloud\ndesc: 腾讯云边缘安全加速平台EO，必须配置上传证书到腾讯云任务\ngroup: tencent\ninput:\n  certId:\n    title: 已上传证书ID\n    helper: 请选择前置任务上传到腾讯云的证书\n    component:\n      name: output-selector\n      from: UploadCertToTencent\n    required: true\n    order: 0\n  accessId:\n    title: Access提供者\n    helper: access 授权\n    component:\n      name: access-selector\n      type: tencent\n    required: true\n    order: 0\n  zoneId:\n    title: 站点ID\n    helper: 类似于zone-xxxx的字符串，在站点概览页面左上角，或者，站点列表页面站点名称下方\n    required: true\n    order: 0\n  certName:\n    title: 证书名称\n    helper: 证书上传后将以此参数作为名称前缀\n    order: 0\n  domainNames:\n    title: cdn加速域名\n    component:\n      name: a-select\n      vModel: value\n      mode: tags\n      open: false\n    helper: 支持多个域名\n    rules:\n      - required: true\n        message: 该项必填\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-tencent/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_DeployCertToTencentTKEIngress.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: DeployCertToTencentTKEIngress\ntitle: 腾讯云-部署到TKE-ingress\nneedPlus: true\nicon: svg:icon-tencentcloud\ngroup: tencent\ndesc: serverless集群请使用K8S部署插件；Qcloud类型需要【上传到腾讯云】作为前置任务；ApiServer未开启外网访问则需要做域名的内网IP映射\ninput:\n  region:\n    title: 大区\n    value: ap-guangzhou\n    required: true\n    order: 0\n  clusterId:\n    title: 集群ID\n    required: true\n    desc: 例如：cls-6lbj1vee\n    request: true\n    order: 0\n  namespace:\n    title: 集群namespace\n    value: default\n    required: true\n    order: 0\n  secretName:\n    title: 证书的secret名称\n    required: true\n    order: 0\n  ingressName:\n    title: ingress名称\n    required: true\n    order: 0\n  ingressClass:\n    title: ingress类型\n    component:\n      name: a-auto-complete\n      vModel: value\n      options:\n        - value: qcloud\n        - value: nginx\n    helper: 可选 qcloud / nginx\n    order: 0\n  clusterDomain:\n    title: 集群域名\n    helper: 可不填，默认为:[clusterId].ccs.tencent-cloud.com\n    order: 0\n  accessId:\n    title: Access授权\n    helper: access授权\n    component:\n      name: access-selector\n      type: tencent\n    required: true\n    order: 0\n  tencentCertId:\n    title: 腾讯云证书id\n    helper: 请选择“上传证书到腾讯云”前置任务的输出\n    component:\n      name: output-selector\n      from: UploadCertToTencent\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.ingressClass === \"qcloud\"\n              })\n            }\n          \n    required: true\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.ingressClass === \"nginx\"\n              })\n            }\n          \n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-tencent/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_DogeCloudDeployToCDN.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: DogeCloudDeployToCDN\ntitle: 多吉云-部署到多吉云CDN\nicon: svg:icon-dogecloud\ngroup: cdn\ninput:\n  domain:\n    title: 域名\n    helper: CDN域名\n    required: true\n    order: 0\n  cert:\n    title: 证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  accessId:\n    title: 多吉云授权\n    helper: 多吉云AccessKey\n    component:\n      name: access-selector\n      type: dogecloud\n    rules:\n      - required: true\n        message: 此项必填\n    order: 0\n  ignoreDeployNullCode:\n    title: 忽略部署接口报错\n    helper: 当该域名部署后报错，但是实际上已经部署成功时，可以勾选\n    value: false\n    component:\n      name: a-switch\n      type: checked\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-doge/plugins/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_Gcoreflush.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: Gcoreflush\ntitle: Gcore-刷新Gcore证书\ndesc: 刷新现有的证书\nicon: clarity:plugin-line\ngroup: cdn\ninput:\n  certName:\n    title: 证书名称\n    helper: 可以修改也可以和现在的保留一致\n    order: 0\n  ssl_id:\n    title: 证书ID\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  accessId:\n    title: Access授权\n    helper: Gcore\n    component:\n      name: access-selector\n      type: Gcore\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-gcore/plugins/plugin-flush.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_Gcoreupload.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: Gcoreupload\ntitle: Gcore-部署证书到Gcore\ndesc: 仅上传 并不会部署到cdn\nicon: clarity:plugin-line\ngroup: cdn\ninput:\n  certName:\n    title: 证书名称\n    helper: 作为备注\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  accessId:\n    title: Access授权\n    helper: Gcore\n    component:\n      name: access-selector\n      type: Gcore\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-gcore/plugins/plugin-upload.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_HauweiDeployCertToCDN.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: HauweiDeployCertToCDN\ntitle: 华为云-部署证书至CDN\nicon: svg:icon-huawei\ngroup: huawei\ndesc: ''\ninput:\n  cert:\n    title: 域名证书\n    helper: >-\n      请选择前置任务输出的域名证书\n\n      如果你选择使用ccm证书ID，则需要在[域名管理页面右上角开启SCM授权](https://console.huaweicloud.com/cdn/#/cdn/domain)\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - HauweiUploadToCCM\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 华为云授权AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: huawei\n    required: true\n    order: 0\n  domains:\n    title: CDN域名\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: HauweiDeployCertToCDN\n      action: onGetDomainList\n      watches:\n        - certDomains\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 请选择域名或输入域名\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-huawei/plugins/deploy-to-cdn/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_HauweiUploadToCCM.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: HauweiUploadToCCM\ntitle: 华为云-上传证书至CCM\nicon: svg:icon-huawei\ngroup: huawei\ndesc: 上传证书到华为云CCM\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 华为云授权AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: huawei\n    required: true\n    order: 0\noutput:\n  huaweiCertId:\n    title: 华为云CertId\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-huawei/plugins/upload-to-ccm/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_JDCloudDeployToCDN.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: JDCloudDeployToCDN\ntitle: 京东云-部署证书至CDN\nicon: svg:icon-jdcloud\ngroup: jdcloud\ndesc: 京东云内容分发网络\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - JDCloudUploadCert\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 京东云AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: jdcloud\n    required: true\n    order: 0\n  domainName:\n    title: CDN加速域名\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      action: onGetDomainList\n      watches:\n        - certDomains\n        - accessId\n        - certDomains\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 你在京东云上配置的CDN加速域名，比如:certd.docmirror.cn\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-jdcloud/plugins/plugin-deploy-to-cdn.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_JDCloudUpdateCert.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: JDCloudUpdateCert\ntitle: 京东云-更新已有证书\nicon: svg:icon-jdcloud\ngroup: jdcloud\ndesc: 更新SSL数字证书中的证书\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - JDCloudUploadCert\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 京东云AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: jdcloud\n    required: true\n    order: 0\n  certIds:\n    title: 要更新的证书id\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      action: onGetCertList\n      watches:\n        - certDomains\n        - accessId\n        - certDomains\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 您在京东云上已有的证书Id\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-jdcloud/plugins/plugin-update-cert.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_JDCloudUploadCert.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: JDCloudUploadCert\ntitle: 京东云-上传新证书\nicon: svg:icon-jdcloud\ngroup: jdcloud\ndesc: 上传证书到SSL数字证书中心\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - JDCloudUploadCert\n    required: true\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 京东云AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: jdcloud\n    required: true\n    order: 0\n  certName:\n    title: 证书名称前缀\n    helper: 证书形成，默认为certd\n    required: false\n    order: 0\noutput:\n  jdcloudCertId:\n    title: 上传成功后的京东云CertId\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-jdcloud/plugins/plugin-upload-cert.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_ProxmoxUploadCert.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: ProxmoxUploadCert\ntitle: Proxmox-上传证书到Proxmox\nicon: svg:icon-proxmox\ngroup: panel\nneedPlus: true\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    order: 0\n  accessId:\n    title: Proxmox授权\n    component:\n      name: access-selector\n      type: proxmox\n    required: true\n    order: 0\n  nodes:\n    title: 节点\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: ProxmoxUploadCert\n      action: onGetNodeList\n      watches:\n        - certDomains\n        - accessId\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 要部署证书的节点\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-proxmox/plugins/plugin-upload.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_QiniuCertUpload.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: QiniuCertUpload\ntitle: 七牛云-上传证书到七牛云\nicon: svg:icon-qiniuyun\ngroup: qiniu\ndesc: 上传到七牛云\ninput:\n  certName:\n    title: 证书名称\n    helper: 上传后将以此名称作为前缀备注\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 七牛云授权\n    component:\n      name: access-selector\n      type: qiniu\n    required: true\n    order: 0\noutput:\n  qiniuCertId:\n    title: 上传成功后的七牛云CertId\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-qiniu/plugin/upload-cert/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_QiniuDeployCertToCDN.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: QiniuDeployCertToCDN\ntitle: 七牛云-部署证书至CDN\nicon: svg:icon-qiniuyun\ngroup: qiniu\ndesc: 自动部署域名证书至七牛云CDN\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书，或者上传到七牛云的证书id\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - QiniuCertUpload\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 七牛云授权\n    component:\n      name: access-selector\n      type: qiniu\n    required: true\n    order: 0\n  domainName:\n    title: CDN加速域名\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      action: onGetDomainList\n      watches:\n        - certDomains\n        - accessId\n    rules:\n      - type: domains\n        allowDotStart: true\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 你在七牛云上配置的CDN加速域名，比如:certd.handsfree.work\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-qiniu/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_QnapDeploy.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: QnapDeploy\ntitle: 威联通-部署证书到威联通\nicon: svg:icon-qnap\ngroup: panel\ndesc: 部署证书到qnap\nneedPlus: true\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  accessId:\n    title: ssh登录授权\n    helper: ssh登录授权\n    component:\n      name: access-selector\n      type: ssh\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-qnap/plugins/plugin-qnap.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_RestartCertd.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: RestartCertd\ntitle: 重启 Certd\nicon: mdi:restart\ndesc: 【仅管理员可用】 重启 certd的https服务，用于更新 Certd 的 ssl 证书\ngroup: other\ninput: {}\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-other/plugins/plugin-restart.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_TencentActionInstancesPlugin.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 0\nname: TencentActionInstancesPlugin\ntitle: 腾讯云-实例开关机\nicon: svg:icon-tencentcloud\ngroup: tencent\ndesc: 腾讯云实例开关机\nneedPlus: false\ninput:\n  accessId:\n    title: Access提供者\n    helper: access 授权\n    component:\n      name: access-selector\n      type: tencent\n    required: true\n    order: 0\n  region:\n    title: 所在地域\n    helper: 实例所在地域\n    component:\n      name: a-auto-complete\n      vModel: value\n      options:\n        - value: ''\n          label: '--------中国大陆地区-------'\n          disabled: true\n        - value: ap-beijing-1\n          label: 北京1区\n        - value: ap-beijing\n          label: 北京\n        - value: ap-nanjing\n          label: 南京\n        - value: ap-shanghai\n          label: 上海\n        - value: ap-guangzhou\n          label: 广州\n        - value: ap-chengdu\n          label: 成都\n        - value: ap-chongqing\n          label: 重庆\n        - value: ap-shenzhen-fsi\n          label: 深圳金融\n        - value: ap-shanghai-fsi\n          label: 上海金融\n        - value: ap-beijing-fsi\n          label: 北京金融\n        - value: ''\n          label: '--------中国香港及境外-------'\n          disabled: true\n        - value: ap-hongkong\n          label: 中国香港\n        - value: ap-singapore\n          label: 新加坡\n        - value: ap-mumbai\n          label: 孟买\n        - value: ap-jakarta\n          label: 雅加达\n        - value: ap-seoul\n          label: 首尔\n        - value: ap-bangkok\n          label: 曼谷\n        - value: ap-tokyo\n          label: 东京\n        - value: na-siliconvalley\n          label: 硅谷\n        - value: na-ashburn\n          label: 弗吉尼亚\n        - value: sa-saopaulo\n          label: 圣保罗\n        - value: eu-frankfurt\n          label: 法兰克福\n    required: true\n    order: 0\n  instanceId:\n    title: 实列ID\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: TencentStartInstancesPlugin\n      action: onGetInstanceList\n      watches:\n        - certDomains\n        - accessId\n        - region\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 请选择实列\n    order: 0\n  action:\n    title: 操作\n    component:\n      name: a-radio-group\n      vModel: value\n      options:\n        - value: start\n          label: 开机\n        - value: stop\n          label: 关机\n    required: true\n    order: 0\n  charging:\n    title: 实例关机不收费\n    value: true\n    component:\n      name: a-switch\n      vModel: checked\n      placeholder: 按量计费实例关机不收费\n    required: false\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.action === 'stop';\n              })\n            }\n        \n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-tencent/plugin/start-instances/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_TencentDeleteExpiringCert.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 0\nname: TencentDeleteExpiringCert\ntitle: 腾讯云-删除即将过期证书\nicon: svg:icon-tencentcloud\ngroup: tencent\ndesc: 仅删除未使用的证书\nneedPlus: true\ninput:\n  accessId:\n    title: Access提供者\n    helper: access 授权\n    component:\n      name: access-selector\n      type: tencent\n    required: true\n    order: 0\n  searchKey:\n    title: 关键字筛选\n    helper: 仅匹配ID、备注名称、域名包含关键字的证书，可以不填\n    required: false\n    component:\n      name: a-input\n    order: 0\n  maxCount:\n    title: 最大删除数量\n    helper: 单次运行最大删除数量\n    value: 100\n    component:\n      name: a-input-number\n      vModel: value\n    required: true\n    order: 0\n  expiringDays:\n    title: 即将过期天数\n    helper: >-\n      仅删除有效期小于此天数的证书,\n\n      <span\n      class=\"color-red\">注意：`1.26.14`版本之前Certd创建的证书流水线默认是到期前20天才更新证书，需要将之前创建的证书申请任务的更新天数改为35天，保证删除之前就已经替换掉即将过期证书</span>\n    value: 30\n    component:\n      name: a-input-number\n      vModel: value\n    required: true\n    order: 0\n  checkTimeout:\n    title: 检查超时时间\n    helper: 检查删除任务结果超时时间,单位分钟\n    value: 10\n    component:\n      name: a-input-number\n      vModel: value\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-tencent/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_TencentDeployCertToCDNv2.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: TencentDeployCertToCDNv2\ntitle: 腾讯云-部署到CDN-v2\nicon: svg:icon-tencentcloud\ngroup: tencent\ndesc: 推荐使用\ninput:\n  accessId:\n    title: Access提供者\n    helper: access 授权\n    component:\n      name: access-selector\n      type: tencent\n    required: true\n    order: 0\n  domains:\n    title: CDN域名\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: TencentDeployCertToCDNv2\n      action: onGetDomainList\n      watches:\n        - certDomains\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 请选择域名或输入域名\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书，或者选择前置任务“上传证书到腾讯云”任务的证书ID\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - UploadCertToTencent\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-tencent/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_TencentDeployCertToLive.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: TencentDeployCertToLive\ntitle: 腾讯云-部署到腾讯云直播\nicon: svg:icon-tencentcloud\ndesc: https://console.cloud.tencent.com/live/\ngroup: tencent\nneedPlus: true\ninput:\n  accessId:\n    title: Access提供者\n    helper: access 授权\n    component:\n      name: access-selector\n      type: tencent\n    required: true\n    order: 0\n  domains:\n    title: 直播域名\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: TencentDeployCertToLive\n      action: onGetDomainList\n      watches:\n        - certDomains\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 请选择域名或输入域名\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书，或者选择前置任务“上传证书到腾讯云”任务的证书ID\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - UploadCertToTencent\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-tencent/plugin/deploy-to-live/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_UploadCertToTencent.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: UploadCertToTencent\ntitle: 腾讯云-上传证书到腾讯云\nicon: svg:icon-tencentcloud\ndesc: 上传成功后输出：tencentCertId\ngroup: tencent\ninput:\n  name:\n    title: 证书名称\n    order: 0\n  accessId:\n    title: Access授权\n    helper: access授权\n    component:\n      name: access-selector\n      type: tencent\n    required: true\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\noutput:\n  tencentCertId:\n    title: 上传成功后的腾讯云CertId\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-tencent/plugin/upload-to-tencent/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_UpyunDeployToCdn.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: UpyunDeployToCdn\ntitle: 又拍云-部署证书到CDN/USS\nicon: svg:icon-upyun\ndesc: 支持又拍云CDN，又拍云云存储USS\ngroup: cdn\nneedPlus: true\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Upyun授权\n    component:\n      name: access-selector\n      type: upyun\n    required: true\n    order: 0\n  cdnList:\n    title: 加速域名\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      typeName: UpyunDeployToCdn\n      action: onGetCdnList\n      watches:\n        - certDomains\n        - accessId\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 选择加速域名，可以手动输入\n    order: 0\n  forceHttps:\n    title: 强制HTTPS\n    value: keep\n    component:\n      name: a-select\n      vModel: value\n      options:\n        - value: 'true'\n          label: 强制HTTPS\n        - value: 'false'\n          label: 不强制HTTPS\n        - value: keep\n          label: 保持原样\n    required: true\n    order: 0\n  https:\n    title: 开启HTTPS\n    value: 'true'\n    component:\n      name: a-select\n      vModel: value\n      options:\n        - value: 'true'\n          label: 开启HTTPS\n        - value: 'false'\n          label: 关闭HTTPS\n        - value: keep\n          label: 保持原样\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-upyun/plugins/plugin-depoy-to-cdn.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_VolcengineDeployToALB.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: VolcengineDeployToALB\ntitle: 火山引擎-部署证书至ALB\nicon: svg:icon-volcengine\ngroup: volcengine\ndesc: 部署至火山引擎应用负载均衡\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - VolcengineUploadToCertCenter\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 火山引擎AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: volcengine\n    required: true\n    order: 0\n  regionId:\n    title: Region\n    helper: 地区选择\n    component:\n      name: a-select\n      options:\n        - label: 北京\n          value: cn-beijing\n        - label: 上海\n          value: cn-shanghai\n        - label: 广州\n          value: cn-guangzhou\n        - label: 香港\n          value: cn-hongkong\n        - label: 柔佛\n          value: ap-southeast-1\n        - label: 雅加达\n          value: ap-southeast-3\n    value: cn-beijing\n    required: true\n    order: 0\n  listenerList:\n    title: 监听器列表\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      action: onGetListenerList\n      watches:\n        - certDomains\n        - accessId\n        - certDomains\n        - accessId\n        - regionId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: |-\n      选择要部署证书的监听器\n      需要在监听器中选择证书中心，进行跨服务访问授权\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-volcengine/plugins/plugin-deploy-to-alb.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_VolcengineDeployToCDN.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: VolcengineDeployToCDN\ntitle: 火山引擎-部署证书至CDN\nicon: svg:icon-volcengine\ngroup: volcengine\ndesc: 支持网页，文件下载，音视频点播\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - VolcengineUploadToCertCenter\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 火山引擎AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: volcengine\n    required: true\n    order: 0\n  serviceType:\n    title: 服务类型\n    helper: 网页，文件下载，音视频点播\n    component:\n      name: a-select\n      options:\n        - label: 网页\n          value: web\n        - label: 文件下载\n          value: download\n        - label: 音视频点播\n          value: video\n    value: web\n    required: true\n    order: 0\n  domainName:\n    title: CDN加速域名\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      action: onGetDomainList\n      watches:\n        - certDomains\n        - accessId\n        - certDomains\n        - accessId\n        - serviceType\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 你在火山引擎上配置的CDN加速域名，比如:certd.docmirror.cn\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-volcengine/plugins/plugin-deploy-to-cdn.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_VolcengineDeployToCLB.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: VolcengineDeployToCLB\ntitle: 火山引擎-部署证书至CLB\nicon: svg:icon-volcengine\ngroup: volcengine\ndesc: 部署至火山引擎负载均衡\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - VolcengineUploadToCertCenter\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 火山引擎AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: volcengine\n    required: true\n    order: 0\n  regionId:\n    title: Region\n    helper: 地区选择\n    component:\n      name: a-select\n      options:\n        - label: 北京\n          value: cn-beijing\n        - label: 上海\n          value: cn-shanghai\n        - label: 广州\n          value: cn-guangzhou\n        - label: 深圳\n          value: cn-shenzhen\n        - label: 杭州\n          value: cn-hangzhou\n        - label: 南京\n          value: cn-north-1\n        - label: 青岛\n          value: cn-qingdao\n        - label: 重庆\n          value: cn-chengdu\n        - label: 香港\n          value: cn-hongkong\n        - label: 柔佛\n          value: ap-southeast-1\n        - label: 雅加达\n          value: ap-southeast-3\n    value: cn-beijing\n    required: true\n    order: 0\n  listenerList:\n    title: 监听器列表\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      action: onGetListenerList\n      watches:\n        - certDomains\n        - accessId\n        - certDomains\n        - accessId\n        - regionId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: |-\n      选择要部署证书的监听器\n      需要在监听器中选择证书中心，进行跨服务访问授权\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-volcengine/plugins/plugin-deploy-to-clb.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_VolcengineDeployToLive.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: VolcengineDeployToLive\ntitle: 火山引擎-部署证书至Live\nicon: svg:icon-volcengine\ngroup: volcengine\ndesc: 部署至火山引擎视频直播\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 火山引擎AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: volcengine\n    required: true\n    order: 0\n  domainList:\n    title: 直播域名\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      action: onGetDomainList\n      watches:\n        - certDomains\n        - accessId\n        - certDomains\n        - accessId\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: 选择要部署证书的直播域名\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-volcengine/plugins/plugin-deploy-to-live.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_VolcengineDeployToVOD.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: VolcengineDeployToVOD\ntitle: 火山引擎-部署证书至VOD\nicon: svg:icon-volcengine\ngroup: volcengine\ndesc: 部署至火山引擎视频点播(暂不可用)\ndeprecated: 暂时缺少部署ssl接口\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n        - VolcengineUploadToCertCenter\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 火山引擎AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: volcengine\n    required: true\n    order: 0\n  spaceName:\n    title: 空间名称\n    required: true\n    order: 0\n  domainList:\n    title: 点播域名\n    component:\n      name: remote-select\n      vModel: value\n      mode: tags\n      type: plugin\n      action: onGetDomainList\n      watches:\n        - certDomains\n        - accessId\n        - certDomains\n        - accessId\n        - spaceName\n    required: true\n    mergeScript: |2-\n\n                return {\n                  component:{\n                    form: ctx.compute(({form})=>{\n                      return form\n                    })\n                  },\n               }\n              \n    helper: |-\n      选择要部署证书的点播域名\n      需要先在域名管理页面进行证书中心访问授权（即点击去配置SSL证书）\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-volcengine/plugins/plugin-deploy-to-vod.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_VolcengineUploadToCertCenter.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: VolcengineUploadToCertCenter\ntitle: 火山引擎-上传证书至证书中心\nicon: svg:icon-volcengine\ngroup: volcengine\ndesc: 上传证书至火山引擎证书中心\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |2-\n\n              return {\n                component:{\n                    inputKey: ctx.compute(({form})=>{\n                      return form.cert\n                    }),\n                }\n              }\n              \n    required: false\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 火山引擎AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: volcengine\n    required: true\n    order: 0\noutput:\n  volcengineCertId:\n    title: 上传成功后的火山引擎证书Id\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-volcengine/plugins/plugin-upload-to-cert-center.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_WaitPlugin.yaml",
    "content": "showRunStrategy: true\ndefault:\n  strategy:\n    runStrategy: 1\nname: WaitPlugin\ntitle: 等待\nicon: ri:rest-time-line\ndesc: 等待一段时间\ngroup: other\ninput:\n  waitTime:\n    title: 等待时长\n    value: 30\n    component:\n      name: a-input-number\n      vModel: value\n    helper: 单位：秒\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-other/plugins/plugin-wait.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_WoaiCDN.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: WoaiCDN\ntitle: 我爱云-部署证书到我爱云CDN\ndesc: 部署证书到我爱云CDN\nicon: clarity:plugin-line\ngroup: cdn\ninput:\n  baseApi:\n    title: 接口地址(可留空)\n    helper: 请填写我爱云的地址, 默认为 [API](https://console.edeg.sxhjgy.cn) 末尾请不要携带`/`\n    component:\n      name: a-input\n    required: false\n    order: 0\n  certId:\n    title: 证书ID\n    helper: 请填写 [证书列表](https://console.edge.sxhjgy.cn/site/certificate) 中的证书的ID\n    component:\n      name: a-input\n    required: true\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 我爱云的用户、密码授权\n    component:\n      name: access-selector\n      type: woai\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-woai/plugins/plugin-deploy-to-cdn.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_hostShellExecute.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: hostShellExecute\ntitle: 主机-执行远程主机脚本命令\nicon: tabler:brand-powershell\ngroup: host\ndesc: 可以执行重启nginx等操作让证书生效\ninput:\n  accessId:\n    title: 主机登录配置\n    helper: 登录\n    component:\n      name: access-selector\n      type: ssh\n    required: true\n    order: 0\n  script:\n    title: shell脚本命令\n    component:\n      name: a-textarea\n      vModel: value\n      rows: 6\n      placeholder: systemctl restart nginx\n    helper: 注意：如果目标主机是windows，且终端是cmd，系统会自动将多行命令通过“&&”连接成一行\n    required: true\n    order: 0\noutput: {}\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-host/plugin/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_uploadCertToAliyun.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: uploadCertToAliyun\ntitle: 阿里云-上传证书到阿里云\nicon: svg:icon-aliyun\ngroup: aliyun\ndesc: 如果不想在阿里云上同一份证书上传多次，可以把此任务作为前置任务，其他阿里云任务证书那一项选择此任务的输出\ninput:\n  name:\n    title: 证书名称\n    helper: 证书上传后将以此参数作为名称前缀\n    order: 0\n  regionId:\n    title: 大区\n    value: cn-hangzhou\n    component:\n      name: a-auto-complete\n      vModel: value\n      options:\n        - value: cn-hangzhou\n          endpoint: cas.aliyuncs.com\n          label: cn-hangzhou-中国大陆\n        - value: eu-central-1\n          endpoint: cas.eu-central-1.aliyuncs.com\n          label: eu-central-1-德国（法兰克福）\n        - value: ap-southeast-1\n          endpoint: cas.ap-southeast-1.aliyuncs.com\n          label: ap-southeast-1-新加坡\n        - value: ap-southeast-3\n          endpoint: cas.ap-southeast-3.aliyuncs.com\n          label: ap-southeast-3-马来西亚（吉隆坡）\n        - value: ap-southeast-5\n          endpoint: cas.ap-southeast-5.aliyuncs.com\n          label: ap-southeast-5-印度尼西亚（雅加达）\n        - value: cn-hongkong\n          endpoint: cas.cn-hongkong.aliyuncs.com\n          label: cn-hongkong-中国香港\n    required: true\n    order: 0\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  accessId:\n    title: Access授权\n    helper: 阿里云授权AccessKeyId、AccessKeySecret\n    component:\n      name: access-selector\n      type: aliyun\n    required: true\n    order: 0\noutput:\n  aliyunCertId:\n    title: 上传成功后的阿里云CertId\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-aliyun/plugin/upload-to-aliyun/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/deploy_uploadCertToHost.yaml",
    "content": "showRunStrategy: false\ndefault:\n  strategy:\n    runStrategy: 1\nname: uploadCertToHost\ntitle: 主机-部署证书到SSH主机\nicon: line-md:uploading-loop\ngroup: host\ndesc: SFTP上传证书到主机，然后SSH执行部署脚本命令\norder: 1\ninput:\n  cert:\n    title: 域名证书\n    helper: 请选择前置任务输出的域名证书\n    component:\n      name: output-selector\n      from:\n        - CertApply\n        - CertApplyLego\n        - CertApplyUpload\n    required: true\n    order: 0\n  certType:\n    title: 证书格式\n    helper: 要部署的证书格式，支持pem、pfx、der、jks\n    component:\n      name: a-select\n      options:\n        - value: pem\n          label: pem（crt），Nginx等大部分应用\n        - value: pfx\n          label: pfx，一般用于IIS\n        - value: der\n          label: der，一般用于Apache\n        - value: jks\n          label: jks，一般用于JAVA应用\n        - value: one\n          label: 证书私钥一体，crt+key简单合并为一个pem文件\n    required: true\n    order: 0\n  crtPath:\n    title: 证书保存路径\n    helper: 填写应用原本的证书保存路径，路径要包含证书文件名，例如：/tmp/cert.pem\n    component:\n      placeholder: /root/deploy/nginx/full_chain.pem\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.certType === 'pem';\n              })\n            }\n          \n    required: true\n    rules:\n      - type: filepath\n    order: 0\n  keyPath:\n    title: 私钥保存路径\n    helper: 需要有写入权限，路径要包含私钥文件名，例如：/tmp/cert.key\n    component:\n      placeholder: /root/deploy/nginx/cert.key\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.certType === 'pem';\n              })\n            }\n          \n    required: true\n    rules:\n      - type: filepath\n    order: 0\n  icPath:\n    title: 中间证书保存路径\n    helper: 路径要包含文件名，一般情况传上面两个文件即可，极少数情况需要这个中间证书\n    component:\n      placeholder: /root/deploy/nginx/intermediate.pem\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.certType === 'pem';\n              })\n            }\n          \n    rules:\n      - type: filepath\n    order: 0\n  pfxPath:\n    title: PFX证书保存路径\n    helper: 填写应用原本的证书保存路径，路径要包含证书文件名，例如：D:\\iis\\cert.pfx\n    component:\n      placeholder: D:\\iis\\cert.pfx\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.certType === 'pfx';\n              })\n            }\n          \n    required: true\n    rules:\n      - type: filepath\n    order: 0\n  derPath:\n    title: DER证书保存路径\n    helper: 填写应用原本的证书保存路径，路径要包含证书文件名，例如：/tmp/cert.der\n    component:\n      placeholder: /root/deploy/apache/cert.der\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.certType === 'der';\n              })\n            }\n          \n    required: true\n    rules:\n      - type: filepath\n    order: 0\n  jksPath:\n    title: jks证书保存路径\n    helper: 填写应用原本的证书保存路径，路径要包含证书文件名，例如：/tmp/cert.jks\n    component:\n      placeholder: /root/deploy/java_app/cert.jks\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.certType === 'jks';\n              })\n            }\n          \n    required: true\n    rules:\n      - type: filepath\n    order: 0\n  onePath:\n    title: 一体证书保存路径\n    helper: 填写应用原本的证书保存路径，路径要包含证书文件名，例如：/tmp/crt_key.pem\n    component:\n      placeholder: /root/deploy/app/crt_key.pem\n    mergeScript: |2-\n\n            return {\n              show: ctx.compute(({form})=>{\n                return form.certType === 'one';\n              })\n            }\n          \n    required: true\n    rules:\n      - type: filepath\n    order: 0\n  accessId:\n    title: 主机登录配置\n    helper: access授权\n    component:\n      name: access-selector\n      type: ssh\n    required: true\n    order: 0\n  uploadType:\n    title: 上传方式\n    helper: 选择上传方式，sftp或者scp\n    value: sftp\n    component:\n      name: a-select\n      options:\n        - value: sftp\n          label: sftp\n        - value: scp\n          label: scp\n    required: true\n    order: 0\n  mkdirs:\n    title: 自动创建远程目录\n    helper: 是否自动创建远程目录,如果关闭则你需要自己确保远程目录存在\n    value: true\n    component:\n      name: a-switch\n      vModel: checked\n    order: 0\n  script:\n    title: shell脚本命令\n    component:\n      name: a-textarea\n      vModel: value\n      rows: 6\n    helper: |-\n      上传后执行脚本命令，不填则不执行\n      注意：如果目标主机是windows，且终端是cmd，系统会自动将多行命令通过“&&”连接成一行\n    required: false\n    order: 0\n  injectEnv:\n    title: 注入环境变量\n    value: false\n    component:\n      name: a-switch\n      vModel: checked\n    helper: 是否将证书域名、路径等信息注入脚本执行环境变量中，具体的变量名称，可以运行后从日志中查看\n    required: false\n    order: 0\noutput:\n  hostCrtPath:\n    title: 证书保存路径\n  hostKeyPath:\n    title: 私钥保存路径\n  hostIcPath:\n    title: 中间证书保存路径\n  hostPfxPath:\n    title: PFX保存路径\n  hostDerPath:\n    title: DER保存路径\n  hostJksPath:\n    title: jks保存路径\n  hostOnePath:\n    title: 一体证书保存路径\ntype: builtIn\npluginType: deploy\nscriptFilePath: ../../../plugins/plugin-host/plugin/upload-to-host/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/dnsProvider_51dns.yaml",
    "content": "name: 51dns\ntitle: 51dns\ndesc: 51DNS\nicon: arcticons:dns-changer-3\naccessType: 51dns\norder: 999\ntype: builtIn\npluginType: dnsProvider\nscriptFilePath: ../../../plugins/plugin-51dns/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/dnsProvider_aliyun.yaml",
    "content": "name: aliyun\ntitle: 阿里云\ndesc: 阿里云DNS解析提供商\naccessType: aliyun\nicon: svg:icon-aliyun\norder: 0\ntype: builtIn\npluginType: dnsProvider\nscriptFilePath: ../../../plugins/plugin-aliyun/dns-provider/aliyun-dns-provider.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/dnsProvider_cloudflare.yaml",
    "content": "name: cloudflare\ntitle: cloudflare\ndesc: cloudflare dns provider\nicon: simple-icons:cloudflare\naccessType: cloudflare\ntype: builtIn\npluginType: dnsProvider\nscriptFilePath: ../../../plugins/plugin-cloudflare/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/dnsProvider_demo.yaml",
    "content": "name: demo\ntitle: Dns提供商Demo\ndesc: dns provider示例\nicon: clarity:plugin-line\naccessType: demo\ntype: builtIn\npluginType: dnsProvider\nscriptFilePath: ../../../plugins/plugin-demo/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/dnsProvider_dnsla.yaml",
    "content": "name: dnsla\ntitle: dns.la\ndesc: dns.la\nicon: arcticons:dns-changer-3\naccessType: dnsla\ntype: builtIn\npluginType: dnsProvider\nscriptFilePath: ../../../plugins/plugin-dnsla/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/dnsProvider_dnspod.yaml",
    "content": "name: dnspod\ntitle: dnspod(已过时,请尽快换成腾讯云)\ndesc: 已废弃，请尽快换成腾讯云类型\naccessType: dnspod\ndeprecated: dnspod已废弃，请换成腾讯云\nicon: svg:icon-tencentcloud\ntype: builtIn\npluginType: dnsProvider\nscriptFilePath: ../../../plugins/plugin-tencent/dns-provider/dnspod-dns-provider.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/dnsProvider_huawei.yaml",
    "content": "name: huawei\ntitle: 华为云\ndesc: 华为云DNS解析提供商\naccessType: huawei\nicon: svg:icon-huawei\ntype: builtIn\npluginType: dnsProvider\nscriptFilePath: ../../../plugins/plugin-huawei/dns-provider/huawei-dns-provider.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/dnsProvider_jdcloud.yaml",
    "content": "name: jdcloud\ntitle: 京东云\ndesc: 京东云DNS解析提供商\naccessType: jdcloud\nicon: svg:icon-jdcloud\ntype: builtIn\npluginType: dnsProvider\nscriptFilePath: ../../../plugins/plugin-jdcloud/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/dnsProvider_namesilo.yaml",
    "content": "name: namesilo\ntitle: namesilo\ndesc: namesilo dns provider\nicon: simple-icons:namesilo\naccessType: namesilo\ntype: builtIn\npluginType: dnsProvider\nscriptFilePath: ../../../plugins/plugin-namesilo/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/dnsProvider_tencent.yaml",
    "content": "name: tencent\ntitle: 腾讯云\ndesc: 腾讯云域名DNS解析提供者\naccessType: tencent\nicon: svg:icon-tencentcloud\ntype: builtIn\npluginType: dnsProvider\nscriptFilePath: ../../../plugins/plugin-tencent/dns-provider/tencent-dns-provider.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/dnsProvider_volcengine.yaml",
    "content": "name: volcengine\ntitle: 火山引擎\ndesc: 火山引擎DNS解析提供商\naccessType: volcengine\nicon: svg:icon-volcengine\ntype: builtIn\npluginType: dnsProvider\nscriptFilePath: ../../../plugins/plugin-volcengine/volcengine-dns-provider.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/dnsProvider_west.yaml",
    "content": "name: west\ntitle: 西部数码\ndesc: west dns provider\nicon: svg:icon-xibushuma\naccessType: west\ntype: builtIn\npluginType: dnsProvider\nscriptFilePath: ../../../plugins/plugin-west/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_anpush.yaml",
    "content": "name: anpush\ntitle: AnPush\ndesc: https://anpush.com\nneedPlus: true\ninput:\n  token:\n    title: API密钥\n    component:\n      placeholder: ''\n    helper: '[获取API密钥](https://anpush.com/push/tool) '\n    required: true\n  channel:\n    title: 通道ID\n    component:\n      placeholder: ''\n    helper: '[获取通道ID](https://anpush.com/push/setting)创建通道，复制通道id，填入此处'\n    required: true\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_bark.yaml",
    "content": "name: bark\ntitle: Bark 通知\ndesc: Bark 推送通知插件\nneedPlus: true\ninput:\n  webhook:\n    title: 服务地址\n    component:\n      placeholder: https://api.day.app/your_key\n    required: true\n    helper: 你的bark服务地址+key\n  skipSslVerify:\n    title: 忽略证书校验\n    value: false\n    component:\n      name: a-switch\n      vModel: checked\n    required: false\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_dingtalk.yaml",
    "content": "name: dingtalk\ntitle: 钉钉通知\ndesc: 钉钉群聊通知\nneedPlus: true\ninput:\n  webhook:\n    title: webhook地址\n    component:\n      placeholder: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxx\n    helper: >-\n      钉钉APP->群聊->设置->机器人->添加机器人->自定义->[创建机器人->复制webhook地址](https://open.dingtalk.com/document/robots/custom-robot-access)\n    required: true\n  secret:\n    title: 加签密钥\n    component:\n      placeholder: SECxxxxxxxxxxxxxxxxxxxxx\n    helper: 必须选择一种安全设置，请选择加密密钥\n    required: false\n  atUserIds:\n    title: '@用户ID'\n    component:\n      placeholder: 非必填，填写完一个按回车\n      name: a-select\n      vModel: value\n      mode: tags\n      multiple: true\n      open: false\n    helper: 填写要@的用户ID\n    required: false\n  atMobiles:\n    title: '@用户手机号'\n    component:\n      placeholder: 非必填，填写一个按回车\n      name: a-select\n      vModel: value\n      mode: tags\n      multiple: true\n      open: false\n    helper: 填写要@的用户的手机号\n    required: false\n  isAtAll:\n    title: '@all'\n    component:\n      placeholder: 非必填\n      name: a-switch\n      vModel: checked\n    helper: 是否@所有人\n    required: false\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/dingtalk/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_discord.yaml",
    "content": "name: discord\ntitle: Discord 通知\ndesc: Discord 机器人通知\nneedPlus: true\ninput:\n  webhook:\n    title: Webhook URL\n    component:\n      placeholder: https://discord.com/api/webhooks/xxxxx/xxxx\n    helper: >-\n      [Discord Webhook\n      说明](https://discord.com/developers/docs/resources/webhook#execute-webhook)\n    required: true\n  mentionedList:\n    title: 提醒指定成员\n    component:\n      name: a-select\n      vModel: value\n      mode: tags\n      open: false\n    required: false\n    helper: 填写成员的Id，或者角色Id（&id），或者everyone\n  httpsProxy:\n    title: 代理\n    component:\n      placeholder: http://xxxxx:xx\n    helper: 使用https_proxy\n    required: false\n  skipSslVerify:\n    title: 忽略证书校验\n    value: false\n    component:\n      name: a-switch\n      vModel: checked\n    required: false\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_email.yaml",
    "content": "name: email\ntitle: 电子邮件\ndesc: 电子邮件通知\ninput:\n  receivers:\n    title: 收件人邮箱\n    component:\n      name: a-select\n      vModel: value\n      mode: tags\n      open: false\n    required: true\n    helper: |-\n      可以填写多个，填写一个按回车键再填写下一个\n      需要先[配置邮件服务器](#/sys/settings/email)\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_feishu.yaml",
    "content": "name: feishu\ntitle: 飞书通知\ndesc: 飞书群聊webhook通知\nneedPlus: true\ninput:\n  webhook:\n    title: webhook地址\n    component:\n      placeholder: https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxx\n    helper: >-\n      飞书APP->群聊->设置->机器人->添加机器人->自定义webhook->[创建机器人->复制webhook地址](https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot?lang=zh-CN)\n    required: true\n  secret:\n    title: 加签密钥\n    component:\n      placeholder: SECxxxxxxxxxxxxxxxxxxxxx\n    helper: 必须选择一种安全设置，建议选择加密密钥\n    required: false\n  atUserIds:\n    title: '@用户'\n    component:\n      placeholder: 非必填，支持多个，填写完一个按回车\n      name: a-select\n      vModel: value\n      mode: tags\n      multiple: true\n      open: false\n    helper: >-\n      填写要@的用户ID：【ou_xxxxxxxxx】\n\n      用户ID获取方法,[查看OpenId获取方法](https://open.feishu.cn/document/home/user-identity-introduction/open-id)\n    required: false\n  isAtAll:\n    title: '@all'\n    component:\n      placeholder: 非必填\n      name: a-switch\n      vModel: checked\n    helper: 是否@所有人\n    required: false\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_iyuu.yaml",
    "content": "name: iyuu\ntitle: 爱语飞飞微信通知(iyuu)\ndesc: https://iyuu.cn/\nneedPlus: true\ninput:\n  token:\n    title: Token令牌\n    component:\n      placeholder: ''\n    helper: https://iyuu.cn/ 微信扫码获取\n    required: true\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/iyuu/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_qywx.yaml",
    "content": "name: qywx\ntitle: 企业微信通知\ndesc: 企业微信群聊机器人通知\nneedPlus: true\ninput:\n  webhook:\n    title: webhook地址\n    component:\n      placeholder: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx\n    helper: '[企微群聊机器人配置说明](https://developer.work.weixin.qq.com/document/path/91770)'\n    required: true\n  mentionedList:\n    title: 提醒指定成员\n    component:\n      name: a-select\n      vModel: value\n      mode: tags\n      open: false\n    required: false\n    helper: 填写成员名字，@all 为提醒所有人\n  mentionedMobileList:\n    title: 提醒指定手机号成员\n    component:\n      name: a-select\n      vModel: value\n      mode: tags\n      open: false\n    required: false\n    helper: 填写成员手机号，@all 为提醒所有人\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/qywx/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_serverchan.yaml",
    "content": "name: serverchan\ntitle: Server酱ᵀ\ndesc: https://sct.ftqq.com/\nneedPlus: true\ninput:\n  endpoint:\n    title: 服务地址\n    value: https://sctapi.ftqq.com\n    required: true\n  sendKey:\n    title: SendKey\n    component:\n      placeholder: https://sctapi.ftqq.com/<SENDKEY>.send\n    helper: https://sct.ftqq.com/ 微信扫码获取\n    required: true\n  channel:\n    title: 消息通道号\n    component:\n      placeholder: 9|66\n    helper: 可以不填，最多两个通道，[通道配置说明](https://sct.ftqq.com/sendkey)\n    required: false\n  noip:\n    title: 是否隐藏IP\n    component:\n      name: a-switch\n      vModel: checked\n    required: false\n  skipSslVerify:\n    title: 忽略证书校验\n    value: false\n    component:\n      name: a-switch\n      vModel: checked\n    required: false\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/serverchan/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_serverchan3.yaml",
    "content": "name: serverchan3\ntitle: Server酱³\ndesc: https://doc.sc3.ft07.com/serverchan3\nneedPlus: true\ninput:\n  apiURL:\n    title: ApiURL\n    component:\n      placeholder: https://uid.push.ft07.com/send/sendKey.send\n    required: true\n  tags:\n    title: 标签Tags\n    component:\n      name: a-select\n      vModel: value\n      mode: tags\n      open: false\n    helper: 支持多个，回车后填写下一个\n    required: false\n  short:\n    title: short\n    required: false\n  skipSslVerify:\n    title: 忽略证书校验\n    value: false\n    component:\n      name: a-switch\n      vModel: checked\n    required: false\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/serverchan3/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_slack.yaml",
    "content": "name: slack\ntitle: Slack通知\ndesc: Slack消息推送通知\nneedPlus: true\ninput:\n  webhook:\n    title: webhook地址\n    component:\n      placeholder: >-\n        https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX\n    helper: >-\n      [APPS](https://api.slack.com/apps/)->进入APP->incoming-webhooks->Add New\n      Webhook to Workspace\n    required: true\n  httpsProxy:\n    title: 代理\n    component:\n      placeholder: http://xxxxx:xx\n    helper: 使用https_proxy\n    required: false\n  skipSslVerify:\n    title: 忽略证书校验\n    value: false\n    component:\n      name: a-switch\n      vModel: checked\n    required: false\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/slack/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_telegram.yaml",
    "content": "name: telegram\ntitle: Telegram通知\ndesc: Telegram Bot推送通知\nneedPlus: true\ninput:\n  endpoint:\n    title: URL\n    value: https://api.telegram.org\n    component:\n      placeholder: https://api.telegram.org\n    required: true\n  botToken:\n    title: Bot Token\n    component:\n      placeholder: 123456789:ABCdefGhijklmnopqrstUVWXyz\n    helper: '[token获取](https://core.telegram.org/bots/features#botfather)'\n    required: true\n  chatId:\n    title: 聊天ID\n    component:\n      placeholder: 聊天ID，例如 123456789 或 @channelusername\n    helper: 用户ID(纯数字)或频道名称(@xxxx)\n    required: true\n  httpsProxy:\n    title: 代理\n    component:\n      placeholder: http://xxxxx:xx\n    helper: 使用https_proxy\n    required: false\n  skipSslVerify:\n    title: 忽略证书校验\n    value: false\n    component:\n      name: a-switch\n      vModel: checked\n    required: false\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/telegram/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_vocechat.yaml",
    "content": "name: vocechat\ntitle: VoceChat通知\ndesc: https://voce.chat\nneedPlus: true\ninput:\n  endpoint:\n    title: 服务地址\n    component:\n      placeholder: https://replace.your.domain\n    required: true\n  apiKey:\n    title: apiKey\n    component:\n      placeholder: ''\n    helper: '[获取APIKEY](https://doc.voce.chat/bot/bot-and-webhook)'\n    required: true\n  targetType:\n    title: 目标类型\n    component:\n      name: a-select\n      options:\n        - value: user\n          label: 用户\n        - value: channel\n          label: 频道\n    required: true\n    helper: 发送消息的目标类型\n  targetId:\n    title: 目标ID\n    component:\n      placeholder: 发送消息的目标ID\n    required: true\n    helper: 目标ID可以是用户ID或频道ID\n  skipSslVerify:\n    title: 忽略证书校验\n    value: false\n    component:\n      name: a-switch\n      vModel: checked\n    required: false\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/vocechat/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/metadata/notification_webhook.yaml",
    "content": "name: webhook\ntitle: 自定义webhook\ndesc: 根据模版自定义http请求\ninput:\n  webhook:\n    title: webhook地址\n    component:\n      placeholder: https://xxxxx.com/xxxx\n    col:\n      span: 24\n    required: true\n  method:\n    title: 请求方式\n    value: POST\n    component:\n      name: a-select\n      placeholder: post/put/get\n      options:\n        - value: POST\n          label: POST\n        - value: PUT\n          label: PUT\n        - value: GET\n          label: GET\n    required: true\n  contentType:\n    title: ContentType\n    value: application/json\n    component:\n      name: a-auto-complete\n      options:\n        - value: application/json\n          label: application/json\n        - value: application/x-www-form-urlencoded\n          label: application/x-www-form-urlencoded\n    helper: 也可以自定义填写\n    required: true\n  headers:\n    title: Headers\n    component:\n      name: a-textarea\n      vModel: value\n      rows: 2\n    col:\n      span: 24\n    helper: 一行一个，格式为key=value\n    required: false\n  template:\n    title: 消息body模版\n    value: |-\n      {\n          \"title\":\"{title}\",\n          \"content\":\"{content}\\n[查看详情]({url})\"\n      }\n    component:\n      name: a-textarea\n      rows: 4\n    col:\n      span: 24\n    helper: |-\n      根据对应的webhook接口文档，构建一个json对象作为参数（默认值只是一个示例，一般不是正确的参数）\n      支持变量：{title}、{content}、{url}，变量用{}包裹\n      字符串需要双引号，使用\\n换行\n      如果是get方式，将作为query参数拼接到url上\n    required: true\n  skipSslVerify:\n    title: 忽略证书校验\n    value: false\n    component:\n      name: a-switch\n      vModel: checked\n    required: false\ntype: builtIn\npluginType: notification\nscriptFilePath: ../../../plugins/plugin-notification/webhook/index.js\n"
  },
  {
    "path": "packages/ui/certd-server/package.json",
    "content": "{\n  \"name\": \"@certd/ui-server\",\n  \"version\": \"1.36.10\",\n  \"description\": \"fast-server base midway\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"start\": \"cross-env NODE_ENV=production node ./bootstrap.js\",\n    \"dev\": \"cross-env NODE_ENV=local mwtsc --watch --run @midwayjs/mock/app\",\n    \"dev-commlocal\": \"cross-env NODE_ENV=dev-commlocal mwtsc --watch --run @midwayjs/mock/app\",\n    \"dev-commpro\": \"cross-env NODE_ENV=dev-commpro mwtsc --watch --run @midwayjs/mock/app\",\n    \"dev-pg\": \"cross-env NODE_ENV=dev-pg mwtsc --watch --run @midwayjs/mock/app\",\n    \"dev-mysql\": \"cross-env NODE_ENV=dev-mysql mwtsc --watch --run @midwayjs/mock/app\",\n    \"dev-localplus\": \"cross-env NODE_ENV=dev-localplus mwtsc --watch --run @midwayjs/mock/app\",\n    \"dev-pgpl\": \"cross-env NODE_ENV=dev-pgpl mwtsc --watch --run @midwayjs/mock/app\",\n    \"dev-new\": \"cross-env NODE_ENV=dev-new mwtsc --watch --run @midwayjs/mock/app\",\n    \"rm-newdb\": \"rimraf ./data/db-new.sqlite\",\n    \"test\": \"cross-env NODE_ENV=unittest mocha\",\n    \"cov\": \"cross-env c8 --all --reporter=text --reporter=lcovonly npm run test\",\n    \"lint\": \"mwts check\",\n    \"lint:fix\": \"mwts fix\",\n    \"ci\": \"npm run cov\",\n    \"build\": \"mwtsc --cleanOutDir --skipLibCheck\",\n    \"export-metadata\": \"node export-plugin-yaml.js\",\n    \"export-md\": \"node export-plugin-md.js\",\n    \"dev-build\": \"echo 1\",\n    \"build-on-docker\": \"node ./before-build.js && npm run build\",\n    \"up-mw-deps\": \"npx midway-version -u -w\",\n    \"heap\": \"cross-env NODE_ENV=local clinic heapprofiler    --  node ./bootstrap.js\",\n    \"flame\": \"clinic flame   -- node ./bootstrap.js\",\n    \"tsc\": \"tsc --skipLibCheck\",\n    \"slimming\": \"node ./slimming.js\",\n    \"pub\": \"echo 1\"\n  },\n  \"dependencies\": {\n    \"@alicloud/fc20230330\": \"^4.1.7\",\n    \"@alicloud/openapi-client\": \"^0.4.12\",\n    \"@alicloud/pop-core\": \"^1.7.10\",\n    \"@alicloud/tea-typescript\": \"^1.8.0\",\n    \"@alicloud/tea-util\": \"^1.4.10\",\n    \"@aws-sdk/client-acm\": \"^3.699.0\",\n    \"@aws-sdk/client-cloudfront\": \"^3.699.0\",\n    \"@aws-sdk/client-iam\": \"^3.699.0\",\n    \"@aws-sdk/client-s3\": \"^3.705.0\",\n    \"@certd/acme-client\": \"^1.36.10\",\n    \"@certd/basic\": \"^1.36.10\",\n    \"@certd/commercial-core\": \"^1.36.10\",\n    \"@certd/cv4pve-api-javascript\": \"^8.4.1\",\n    \"@certd/jdcloud\": \"^1.36.10\",\n    \"@certd/lib-huawei\": \"^1.36.10\",\n    \"@certd/lib-k8s\": \"^1.36.10\",\n    \"@certd/lib-server\": \"^1.36.10\",\n    \"@certd/midway-flyway-js\": \"^1.36.10\",\n    \"@certd/pipeline\": \"^1.36.10\",\n    \"@certd/plugin-cert\": \"^1.36.10\",\n    \"@certd/plugin-lib\": \"^1.36.10\",\n    \"@certd/plugin-plus\": \"^1.36.10\",\n    \"@certd/plus-core\": \"^1.36.10\",\n    \"@huaweicloud/huaweicloud-sdk-cdn\": \"^3.1.120\",\n    \"@huaweicloud/huaweicloud-sdk-core\": \"^3.1.120\",\n    \"@koa/cors\": \"^5.0.0\",\n    \"@midwayjs/bootstrap\": \"~3.20.3\",\n    \"@midwayjs/cache\": \"~3.14.0\",\n    \"@midwayjs/core\": \"~3.20.3\",\n    \"@midwayjs/i18n\": \"~3.20.3\",\n    \"@midwayjs/info\": \"~3.20.3\",\n    \"@midwayjs/koa\": \"~3.20.3\",\n    \"@midwayjs/logger\": \"~3.4.2\",\n    \"@midwayjs/static-file\": \"~3.20.3\",\n    \"@midwayjs/typeorm\": \"~3.20.3\",\n    \"@midwayjs/upload\": \"~3.20.3\",\n    \"@midwayjs/validate\": \"~3.20.3\",\n    \"@volcengine/openapi\": \"^1.28.1\",\n    \"ali-oss\": \"^6.21.0\",\n    \"axios\": \"^1.7.2\",\n    \"basic-ftp\": \"^5.0.5\",\n    \"bcryptjs\": \"^2.4.3\",\n    \"better-sqlite3\": \"^11.1.2\",\n    \"cache-manager\": \"^6.1.0\",\n    \"cos-nodejs-sdk-v5\": \"^2.14.6\",\n    \"cron-parser\": \"^4.9.0\",\n    \"cross-env\": \"^7.0.3\",\n    \"crypto-js\": \"^4.2.0\",\n    \"dayjs\": \"^1.11.7\",\n    \"form-data\": \"^4.0.0\",\n    \"glob\": \"^11.0.0\",\n    \"https-proxy-agent\": \"^7.0.5\",\n    \"iconv-lite\": \"^0.6.3\",\n    \"jdcloud-sdk-js\": \"^1.2.202\",\n    \"js-yaml\": \"^4.1.0\",\n    \"jsonwebtoken\": \"^9.0.0\",\n    \"jszip\": \"^3.10.1\",\n    \"koa-send\": \"^5.0.1\",\n    \"kubernetes-client\": \"^9.0.0\",\n    \"lodash-es\": \"^4.17.21\",\n    \"log4js\": \"^6.7.1\",\n    \"lru-cache\": \"^11.0.1\",\n    \"mitt\": \"^3.0.1\",\n    \"mwts\": \"^1.3.0\",\n    \"mwtsc\": \"^1.15.1\",\n    \"mysql2\": \"^3.14.0\",\n    \"nanoid\": \"^5.0.7\",\n    \"node-forge\": \"^1.3.1\",\n    \"nodemailer\": \"^6.9.16\",\n    \"otplib\": \"^12.0.1\",\n    \"pg\": \"^8.12.0\",\n    \"psl\": \"^1.9.0\",\n    \"punycode.js\": \"^2.3.1\",\n    \"qiniu\": \"^7.12.0\",\n    \"qrcode\": \"^1.5.4\",\n    \"qs\": \"^6.13.1\",\n    \"querystring\": \"^0.2.1\",\n    \"reflect-metadata\": \"^0.2.2\",\n    \"rimraf\": \"^5.0.5\",\n    \"socks\": \"^2.8.3\",\n    \"socks-proxy-agent\": \"^8.0.4\",\n    \"strip-ansi\": \"^7.1.0\",\n    \"svg-captcha\": \"^1.4.0\",\n    \"tencentcloud-sdk-nodejs\": \"^4.0.983\",\n    \"typeorm\": \"^0.3.20\",\n    \"uuid\": \"^10.0.0\"\n  },\n  \"devDependencies\": {\n    \"@midwayjs/mock\": \"~3.20.3\",\n    \"@types/ali-oss\": \"^6.16.11\",\n    \"@types/cache-manager\": \"^4.0.6\",\n    \"@types/jest\": \"^29.5.13\",\n    \"@types/koa\": \"2.15.0\",\n    \"@types/lodash-es\": \"^4.17.12\",\n    \"@types/mocha\": \"^10.0.1\",\n    \"@types/node\": \"^18\",\n    \"@types/nodemailer\": \"^6.4.8\",\n    \"@types/ssh2\": \"^1.15.0\",\n    \"c8\": \"^10.1.2\",\n    \"mocha\": \"^10.2.0\",\n    \"prettier\": \"^2.8.8\",\n    \"rimraf\": \"^5.0.5\",\n    \"tslib\": \"^2.8.1\",\n    \"typescript\": \"^5.4.2\",\n    \"why-is-node-running\": \"^3.2.2\"\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"\"\n  },\n  \"pnpm\": {\n    \"neverBuiltDependencies\": []\n  },\n  \"author\": \"anonymous\",\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/ui/certd-server/plugin-doc-gen.mjs",
    "content": "// 扫描目录，列出文件，然后加载为模块\n\nimport { join } from 'path';\nimport fs from 'fs'\nimport { pathToFileURL } from \"node:url\";\nimport path from 'path'\nfunction scanDir(dir) {\n  const files = fs.readdirSync(dir);\n  const result = [];\n  // 扫描目录及子目录\n  for (const file of files) {\n    if (file.includes(\"index.js\")) {\n      continue;\n    }\n\n    const filePath = join(dir, file);\n    const stat = fs.statSync(filePath);\n    if (stat.isDirectory()) {\n      result.push(...scanDir(filePath));\n    } else {\n      if (!file.endsWith(\".js\")) {\n        continue;\n      }\n      result.push(filePath);\n    }\n  }\n  return result\n}\n\nexport default async function loadModules(dir) {\n  const files = scanDir(dir);\n  const modules = {}\n  for (const file of files) {\n\n    try {\n      // 转换为 file:// URL（Windows 必需）\n      const moduleUrl = pathToFileURL(file).href\n      const module = await import(moduleUrl)\n\n      // 如果模块有默认导出，优先使用\n      modules[file] = module.default || module\n    } catch (err) {\n      console.error(`加载模块 ${file} 失败:`, err)\n    }\n  }\n  return modules;\n}\n\nconst modules = await loadModules('./dist/plugins');\n\nfor (const key in modules) {\n  console.log(key)\n}\n"
  },
  {
    "path": "packages/ui/certd-server/public/.gitignore",
    "content": "\n"
  },
  {
    "path": "packages/ui/certd-server/public/index.html",
    "content": "certd server is ready\n"
  },
  {
    "path": "packages/ui/certd-server/src/config/config.default.ts",
    "content": "import { MidwayConfig } from '@midwayjs/core';\n// import { join } from 'path';\n// import { dirname } from 'node:path';\n// import { fileURLToPath } from 'node:url';\n// // const __filename = fileURLToPath(import.meta.url);\n// const __dirname = dirname(fileURLToPath(import.meta.url));\nimport { FlywayHistory } from '@certd/midway-flyway-js';\nimport { UserEntity } from '../modules/sys/authority/entity/user.js';\nimport { PipelineEntity } from '../modules/pipeline/entity/pipeline.js';\n//import { logger } from '../utils/logger';\n// load .env file in process.cwd\nimport { loadDotEnv, mergeConfig } from './loader.js';\nimport { libServerEntities } from '@certd/lib-server';\nimport { commercialEntities } from '@certd/commercial-core';\nimport { tmpdir } from 'node:os';\nimport { DefaultUploadFileMimeType, uploadWhiteList } from '@midwayjs/upload';\nimport path from 'path';\n\nconst env = process.env.NODE_ENV || 'development';\n\nconst development = {\n  midwayLogger: {\n    default: {\n      dir: './logs',\n    },\n    // ...\n  },\n  keys: 'certd',\n  koa: {\n    port: 7001,\n  },\n  https: {\n    enabled: true,\n    port: 7002,\n    key: './data/ssl/cert.key',\n    cert: './data/ssl/cert.crt',\n  },\n  staticFile: {\n    usePrecompiledGzip: true,\n    buffer: true,\n    maxAge: 30 * 24 * 60 * 60,\n    gzip: true,\n    dirs: {\n      default: {\n        prefix: '/',\n        dir: 'public',\n        alias: {\n          '/': '/index.html',\n          '\\\\': '/index.html',\n        },\n        maxFiles: 200,\n      },\n    },\n  },\n  cron: {\n    //启动时立即触发一次\n    immediateTriggerOnce: false,\n    immediateTriggerSiteMonitor: false,\n    //启动时仅注册admin（id=1）用户的\n    onlyAdminUser: false,\n  },\n  /**\n   * 演示环境\n   */\n  preview: {\n    enabled: false,\n  },\n\n  /**\n   *  数据库\n   */\n  typeorm: {\n    dataSource: {\n      default: {\n        /**\n         * 单数据库实例\n         */\n        type: 'better-sqlite3',\n        database: './data/db.sqlite',\n        synchronize: false, // 如果第一次使用，不存在表，有同步的需求可以写 true\n        logging: false,\n        highlightSql: false,\n\n        // 配置实体模型 或者 entities: '/entity',\n        entities: ['**/modules/**/entity/*.js', ...libServerEntities, ...commercialEntities, PipelineEntity, FlywayHistory, UserEntity],\n      },\n    },\n  },\n  /**\n   * 自动升级数据库脚本\n   */\n  flyway: {\n    scriptDir: './db/migration',\n  },\n\n  auth: {\n    jwt: {\n      expire: 7 * 24 * 60 * 60, //单位秒\n    },\n  },\n  certd: {\n    fileRootDir: './data/files',\n  },\n  system: {\n    resetAdminPasswd: false,\n  },\n  plus: {\n    serverBaseUrls: ['http://127.0.0.1:11007'],\n  },\n  upload: {\n    // mode: UploadMode, 默认为file，即上传到服务器临时目录，可以配置为 stream\n    mode: 'file',\n    // fileSize: string, 最大上传文件大小，默认为 10mb\n    fileSize: '10mb',\n    whitelist: uploadWhiteList, //文件扩展名白名单\n    mimeTypeWhiteList: DefaultUploadFileMimeType, //文件MIME类型白名单\n    // whitelist: uploadWhiteList.filter(ext => ext !== '.pdf'),\n    // tmpdir: string，上传的文件临时存储路径\n    tmpdir: path.join(tmpdir(), 'certd-upload-files'),\n    // cleanTimeout: number，上传的文件在临时目录中多久之后自动删除，默认为 5 分钟\n    cleanTimeout: 5 * 60 * 1000,\n    // base64: boolean，设置原始body是否是base64格式，默认为false，一般用于腾讯云的兼容\n    base64: false,\n    // 仅在匹配路径到 /api/upload 的时候去解析 body 中的文件信息\n    match: /\\/api\\/basic\\/file\\/upload/,\n  },\n  agent: {\n    enabled: false,\n    contactText: '',\n    contactLink: '',\n  },\n} as MidwayConfig;\nloadDotEnv();\n\nmergeConfig(development, 'development');\n\nmergeConfig(development, env);\n\nexport default development;\n"
  },
  {
    "path": "packages/ui/certd-server/src/config/loader.ts",
    "content": "import path from 'path';\nimport * as _ from 'lodash-es';\nimport yaml from 'js-yaml';\nimport fs from 'fs';\nimport { logger } from '@certd/basic';\n\nfunction parseEnv(defaultConfig: any) {\n  const config = {};\n  for (const key in process.env) {\n    let keyName = key;\n    if (!keyName.startsWith('certd_')) {\n      continue;\n    }\n    keyName = keyName.replace('certd_', '');\n    const configKey = keyName.replaceAll('_', '.');\n    const oldValue = _.get(defaultConfig, configKey);\n    let value: any = process.env[key];\n    if (typeof oldValue === 'boolean') {\n      value = value === 'true';\n    } else if (Number.isInteger(oldValue)) {\n      value = parseInt(value, 10);\n    } else if (typeof oldValue === 'number') {\n      value = parseFloat(value);\n    }\n    _.set(config, configKey, value);\n  }\n  return config;\n}\n\nexport function load(config, env = '') {\n  // Get document, or throw exception on error\n  logger.info('load config', env);\n  const yamlPath = path.join(process.cwd(), `.env.${env}.yaml`);\n  if (fs.existsSync(yamlPath)) {\n    const doc = yaml.load(fs.readFileSync(yamlPath, 'utf8'));\n    return _.merge(doc, parseEnv(config));\n  }\n  return parseEnv(config);\n}\n\nexport function mergeConfig(config: any, envType: string) {\n  _.merge(config, load(config, envType));\n  const keys = _.get(config, 'auth.jwt.secret');\n  if (keys) {\n    config.keys = keys;\n  }\n  return config;\n}\n\nexport function loadDotEnv() {\n  const envStr = fs.readFileSync('.env').toString();\n  envStr.split('\\n').forEach(line => {\n    const [key, value] = line.trim().split('=');\n    const oldValue = process.env[key];\n    if (!oldValue) {\n      process.env[key] = value;\n    }\n  });\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/configuration.ts",
    "content": "import { App, Configuration } from '@midwayjs/core';\nimport * as koa from '@midwayjs/koa';\nimport { IMidwayKoaContext, NextFunction } from '@midwayjs/koa';\nimport * as orm from '@midwayjs/typeorm';\nimport * as cache from '@midwayjs/cache';\nimport * as validate from '@midwayjs/validate';\nimport * as info from '@midwayjs/info';\nimport * as staticFile from '@midwayjs/static-file';\nimport * as cron from './modules/cron/index.js';\nimport * as flyway from '@certd/midway-flyway-js';\nimport cors from '@koa/cors';\nimport { GlobalExceptionMiddleware } from './middleware/global-exception.js';\nimport { PreviewMiddleware } from './middleware/preview.js';\nimport { AuthorityMiddleware } from './middleware/authority.js';\nimport { logger } from '@certd/basic';\nimport { ResetPasswdMiddleware } from './middleware/reset-passwd/middleware.js';\nimport DefaultConfig from './config/config.default.js';\nimport * as libServer from '@certd/lib-server';\nimport * as commercial from '@certd/commercial-core';\nimport * as upload from '@midwayjs/upload';\nimport { setLogger } from '@certd/acme-client';\nimport {HiddenMiddleware} from \"./middleware/hidden.js\";\nprocess.on('uncaughtException', error => {\n  console.error('未捕获的异常：', error);\n  // 在这里可以添加日志记录、发送错误通知等操作\n});\n\n@Configuration({\n  detectorOptions: {\n    ignore: [\n      '**/plugins/**'\n    ]\n  },\n  imports: [\n    koa,\n    orm,\n    cache,\n    flyway,\n    cron,\n    staticFile,\n    validate,\n    upload,\n    libServer,\n    commercial,\n    {\n      component: info,\n      enabledEnvironment: ['local'],\n    },\n  ],\n  importConfigs: [\n    {\n      default: DefaultConfig,\n    },\n  ],\n})\nexport class MainConfiguration {\n  @App('koa')\n  app: koa.Application;\n\n  async onReady() {\n    // add middleware\n    // this.app.useMiddleware([ReportMiddleware]);\n    // add filter\n    // this.app.useFilter([NotFoundFilter, DefaultErrorFilter]);\n    //跨域\n    this.app.use(\n      cors({\n        origin: '*',\n      })\n    );\n    //\n    // this.app.use(async (ctx, next) => {\n    //   // 只在返回 'index.html' 的时候设置 maxAge\n    //   if (ctx.path === '/') {\n    //     // ctx.response.redirect('/index.html');\n    //     ctx.send(file)\n    //     return;\n    //   }\n    // });\n    // bodyparser options see https://github.com/koajs/bodyparser\n    //this.app.use(bodyParser());\n    //请求日志打印\n    this.app.useMiddleware([\n      //统一异常处理\n      GlobalExceptionMiddleware,\n      //站点隐藏\n      HiddenMiddleware,\n      //预览模式限制修改id<1000的数据\n      PreviewMiddleware,\n      //授权处理\n      AuthorityMiddleware,\n\n      //resetPasswd,重置密码模式下不提供服务\n      ResetPasswdMiddleware,\n    ]);\n\n    this.app.getMiddleware().insertFirst(async (ctx: IMidwayKoaContext, next: NextFunction) => {\n      await next();\n      if (ctx.path === '/' || ctx.path === '/index.html' || ctx.path.startsWith(\"/api\")) {\n        ctx.response.set('Cache-Control', 'public,max-age=0');\n      }\n    });\n\n    //acme setlogger\n    setLogger((text: string) => {\n      logger.info(text);\n    });\n\n    logger.info('当前环境：', this.app.getEnv()); // prod\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/basic/app-controller.ts",
    "content": "import { Controller, Get, Inject, Provide } from '@midwayjs/core';\nimport { BaseController, Constants, FileService, SysSettingsService, SysSiteInfo } from '@certd/lib-server';\nimport { http, logger } from '@certd/basic';\nimport { isComm } from '@certd/plus-core';\n\n/**\n */\n@Provide()\n@Controller('/api/app/')\nexport class AppController extends BaseController {\n  @Inject()\n  sysSettingsService: SysSettingsService;\n  @Inject()\n  fileService: FileService;\n\n  @Get('/latest', { summary: Constants.per.authOnly })\n  async latest(): Promise<any> {\n    try {\n      const res = await http.request({\n        url: 'https://registry.npmmirror.com/@certd/pipeline',\n        method: 'get',\n        logRes: false,\n        timeout: 5000,\n      });\n      const latest = res['dist-tags'].latest;\n      return this.ok(latest);\n    } catch (e: any) {\n      logger.error(e);\n      return this.ok('');\n    }\n  }\n\n  @Get('/favicon', { summary: Constants.per.guest })\n  public async getFavicon() {\n    if (isComm()) {\n      const siteInfo = await this.sysSettingsService.getSetting<SysSiteInfo>(SysSiteInfo);\n      const favicon = siteInfo.logo;\n      if (favicon) {\n        const redirect = '/api/basic/file/download?key=' + favicon;\n        this.ctx.response.redirect(redirect);\n        this.ctx.response.set('Cache-Control', 'public,max-age=25920');\n        return;\n      }\n    }\n    const redirect = '/static/images/logo/logo.svg';\n    this.ctx.response.redirect(redirect);\n    this.ctx.response.set('Cache-Control', 'public,max-age=25920');\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/basic/code-controller.ts",
    "content": "import { Rule, RuleType } from '@midwayjs/validate';\nimport { ALL, Body, Controller, Get, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { BaseController, Constants } from '@certd/lib-server';\nimport { CodeService } from '../../modules/basic/service/code-service.js';\nimport { EmailService } from '../../modules/basic/service/email-service.js';\n\nexport class SmsCodeReq {\n  @Rule(RuleType.string().required())\n  phoneCode: string;\n\n  @Rule(RuleType.string().required())\n  mobile: string;\n\n  @Rule(RuleType.string().required().max(10))\n  randomStr: string;\n\n  @Rule(RuleType.string().required().max(4))\n  imgCode: string;\n}\n\nexport class EmailCodeReq {\n  @Rule(RuleType.string().required())\n  email: string;\n\n  @Rule(RuleType.string().required().max(10))\n  randomStr: string;\n\n  @Rule(RuleType.string().required().max(4))\n  imgCode: string;\n}\n\n/**\n */\n@Provide()\n@Controller('/api/basic/code')\nexport class BasicController extends BaseController {\n  @Inject()\n  codeService: CodeService;\n\n  @Inject()\n  emailService: EmailService;\n\n  @Post('/sendSmsCode', { summary: Constants.per.guest })\n  public async sendSmsCode(\n    @Body(ALL)\n    body: SmsCodeReq\n  ) {\n    await this.codeService.checkCaptcha(body.randomStr, body.imgCode);\n    await this.codeService.sendSmsCode(body.phoneCode, body.mobile, body.randomStr);\n    return this.ok(null);\n  }\n\n  @Post('/sendEmailCode', { summary: Constants.per.guest })\n  public async sendEmailCode(\n    @Body(ALL)\n    body: EmailCodeReq\n  ) {\n    await this.codeService.checkCaptcha(body.randomStr, body.imgCode);\n    await this.codeService.sendEmailCode(body.email, body.randomStr);\n    // 设置缓存内容\n    return this.ok(null);\n  }\n\n  @Get('/captcha', { summary: Constants.per.guest })\n  public async getCaptcha(@Query('randomStr') randomStr: any) {\n    const captcha = await this.codeService.generateCaptcha(randomStr);\n    this.ctx.res.setHeader('Content-Type', 'image/svg+xml');\n    return captcha.data;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/basic/file-controller.ts",
    "content": "import { Controller, Fields, Files, Get, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { BaseController, Constants, FileService, UploadFileItem, uploadTmpFileCacheKey } from '@certd/lib-server';\nimport send from 'koa-send';\nimport { nanoid } from 'nanoid';\nimport { cache } from '@certd/basic';\nimport { UploadFileInfo } from '@midwayjs/upload';\n\n/**\n */\n@Provide()\n@Controller('/api/basic/file')\nexport class FileController extends BaseController {\n  @Inject()\n  fileService: FileService;\n\n  @Post('/upload', { summary: Constants.per.authOnly })\n  async upload(@Files() files: UploadFileInfo<string>[], @Fields() fields: any) {\n    console.log('files', files, fields);\n    const cacheKey = uploadTmpFileCacheKey + nanoid();\n    const file = files[0];\n    cache.set(\n      cacheKey,\n      {\n        filename: file.filename,\n        tmpFilePath: file.data,\n      } as UploadFileItem,\n      {\n        ttl: 1000 * 60 * 60,\n      }\n    );\n    return this.ok({\n      key: cacheKey,\n    });\n  }\n\n  @Get('/download', { summary: Constants.per.guest })\n  async download(@Query('key') key: string) {\n    let userId: any = null;\n    if (!key.startsWith('/public')) {\n      userId = this.getUserId();\n    }\n    const filePath = this.fileService.getFile(key, userId);\n    this.ctx.response.attachment(filePath);\n    this.ctx.response.set('Cache-Control', 'public,max-age=2592000');\n    await send(this.ctx, filePath);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/basic/home-controller.ts",
    "content": "import { Controller, Get, Inject, MidwayEnvironmentService, Provide } from '@midwayjs/core';\nimport { logger } from '@certd/basic';\nimport { Constants } from '@certd/lib-server';\n\n@Provide()\n@Controller('/home')\nexport class HomeController {\n  @Inject()\n  environmentService: MidwayEnvironmentService;\n  @Get('/', { summary: Constants.per.guest })\n  async home(): Promise<string> {\n    logger.info('当前环境：', this.environmentService.getCurrentEnvironment()); // prod\n    return 'Hello Midwayjs!';\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/basic/root-controller.ts",
    "content": "import { Controller, Get, Inject, Provide } from '@midwayjs/core';\nimport { Constants, SysSettingsService } from '@certd/lib-server';\n\n@Provide()\n@Controller('/')\nexport class HomeController {\n  @Inject()\n  sysSettingsService: SysSettingsService;\n  @Get('/robots.txt', { summary: Constants.per.guest })\n  async robots(): Promise<string> {\n    const publicSettings = await this.sysSettingsService.getPublicSettings();\n    if (!publicSettings.robots) {\n      return 'User-agent: *\\nDisallow: /';\n    } else {\n      return 'User-agent: *\\nAllow: /';\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/basic/settings-controller.ts",
    "content": "import { Config, Controller, Get, Inject, Provide } from \"@midwayjs/core\";\nimport {\n  BaseController,\n  Constants,\n  SysHeaderMenus,\n  SysInstallInfo,\n  SysPublicSettings,\n  SysSettingsService,\n  SysSiteEnv,\n  SysSiteInfo,\n  SysSuiteSetting\n} from \"@certd/lib-server\";\nimport { AppKey, getPlusInfo, isComm } from \"@certd/plus-core\";\nimport { cloneDeep } from \"lodash-es\";\nimport { getVersion } from \"../../utils/version.js\";\nimport { http } from \"@certd/basic\";\n\n/**\n */\n@Provide()\n@Controller(\"/api/basic/settings\")\nexport class BasicSettingsController extends BaseController {\n  @Inject()\n  sysSettingsService: SysSettingsService;\n  @Config(\"account.server.baseUrl\")\n  accountServerBaseUrl: any;\n\n  @Config(\"agent\")\n  agentConfig: SysSiteEnv[\"agent\"];\n\n  public async getSysPublic() {\n    return await this.sysSettingsService.getSetting(SysPublicSettings);\n  }\n\n  public async getInstallInfo() {\n    const settings: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);\n    settings.accountServerBaseUrl = this.accountServerBaseUrl;\n    settings.appKey = AppKey;\n    return settings;\n  }\n\n  public async getSiteInfo() {\n    return await this.sysSettingsService.getSetting(SysSiteInfo);\n  }\n\n  public async getHeaderMenus() {\n    return await this.sysSettingsService.getSetting(SysHeaderMenus);\n  }\n\n  public async getSuiteSetting() {\n    if (!isComm()) {\n      return { enabled: false };\n    }\n    const setting = await this.sysSettingsService.getSetting<SysSuiteSetting>(SysSuiteSetting);\n    return {\n      enabled: setting.enabled\n    };\n  }\n\n  public async getSiteEnv() {\n    const env: SysSiteEnv = {\n      agent: this.agentConfig\n    };\n    return env;\n  }\n\n  async plusInfo() {\n    const res = getPlusInfo();\n    const copy = cloneDeep(res);\n    delete copy.secret;\n    return copy;\n  }\n\n  @Get(\"/productInfo\", { summary: Constants.per.guest })\n  async getProductInfo() {\n    const info = await http.request({\n      url: \"https://app.handfree.work/certd/info.json\"\n    });\n    return this.ok(info);\n\n  }\n\n  @Get(\"/all\", { summary: Constants.per.guest })\n  async getAllSettings() {\n    const sysPublic = await this.getSysPublic();\n    const installInfo = await this.getInstallInfo();\n    let siteInfo = {};\n    if (isComm()) {\n      siteInfo = await this.getSiteInfo();\n    }\n    const siteEnv = await this.getSiteEnv();\n    const plusInfo = await this.plusInfo();\n    const headerMenus = await this.getHeaderMenus();\n    const suiteSetting = await this.getSuiteSetting();\n    const version = await getVersion();\n    return this.ok({\n      sysPublic,\n      installInfo,\n      siteInfo,\n      siteEnv,\n      plusInfo,\n      headerMenus,\n      suiteSetting,\n      app: {\n        time: new Date().getTime(),\n        version\n      },\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/basic/unhidden-controller.ts",
    "content": "import {Body, Controller, Get, Inject, Post, Provide} from '@midwayjs/core';\nimport {Constants, NotFoundException, ParamException, SysInstallInfo, SysSettingsService} from '@certd/lib-server';\nimport {utils} from \"@certd/basic\";\nimport {hiddenStatus, SafeService} from \"../../modules/sys/settings/safe-service.js\";\nimport {IMidwayKoaContext} from \"@midwayjs/koa\";\n\nconst unhiddenHtml = `\n<html lang=\"en\">\n<head>\n<title>certd解除站点隐藏</title>\n</head>\n<body>\n<div style=\"margin:50px;width:500px\">\n<h3>解除站点隐藏</h3>\n<form method=\"post\">\n请输入解除密码： <input type=\"password\" name=\"password\" /> <button type=\"submit\">确定</button>\n</form>\n</div>\n</body>\n</html>\n\n`\n\n@Provide()\n@Controller('/api/unhidden')\nexport class HnhiddenController {\n    @Inject()\n    ctx: IMidwayKoaContext;\n    @Inject()\n    safeService: SafeService;\n    @Inject()\n    sysSettingsService: SysSettingsService;\n\n\n    @Post('/:randomPath', {summary: Constants.per.guest})\n    async randomPath(@Body(\"password\") password: any) {\n        await this.checkUnhiddenPath()\n        const hiddenSetting = await this.safeService.getHiddenSetting()\n        if (utils.hash.md5(password) === hiddenSetting.openPassword) {\n            //解锁\n            hiddenStatus.isHidden = false;\n            const setting = await this.sysSettingsService.getSetting<SysInstallInfo>(SysInstallInfo)\n            const bindUrl = setting.bindUrl\n            //解锁成功,跳转回首页,redirect\n            this.ctx.response.redirect(bindUrl || \"/\");\n            return\n        } else {\n            //密码错误\n            throw new ParamException('解锁密码错误');\n        }\n    }\n\n    @Get('/:randomPath', {summary: Constants.per.guest})\n    async unhiddenGet() {\n        await this.checkUnhiddenPath()\n        this.ctx.response.body = unhiddenHtml\n    }\n\n    async checkUnhiddenPath() {\n        const hiddenSetting = await this.safeService.getHiddenSetting()\n        if (this.ctx.path != `/api/unhidden/${hiddenSetting.openPath}`) {\n            this.ctx.res.statusCode = 404\n            throw new NotFoundException(\"Page not found\")\n        }\n    }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/openapi/base-open-controller.ts",
    "content": "import { BaseController, Encryptor } from '@certd/lib-server';\nimport { OpenKey } from '../../modules/open/service/open-key-service.js';\n\nexport class BaseOpenController extends BaseController {\n  ok(res: any) {\n    const openKey: OpenKey = this.ctx.openKey;\n    if (openKey.encrypt) {\n      const data = JSON.stringify(res);\n      const encryptor = new Encryptor(openKey.keySecret, 'hex');\n      const encrypted = encryptor.encrypt(data);\n      return this.ok(encrypted);\n    }\n    return super.ok(res);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/openapi/v1/cert-controller.ts",
    "content": "import { ALL, Body, Controller, Get, Inject, Post, Provide, Query } from \"@midwayjs/core\";\nimport { CodeException, Constants, EncryptService } from \"@certd/lib-server\";\nimport { CertInfo } from \"@certd/plugin-cert\";\nimport { OpenKey } from \"../../../modules/open/service/open-key-service.js\";\nimport { BaseOpenController } from \"../base-open-controller.js\";\nimport { CertInfoFacade } from \"../../../modules/monitor/facade/cert-info-facade.js\";\nimport { merge } from \"lodash-es\";\n\nexport type CertGetReq = {\n  domains?: string;\n  certId: number;\n  autoApply?:boolean;\n};\n\n/**\n */\n@Provide()\n@Controller('/api/v1/cert')\nexport class OpenCertController extends BaseOpenController {\n  @Inject()\n  certInfoFacade: CertInfoFacade;\n  @Inject()\n  encryptService: EncryptService;\n\n  @Get('/get', { summary: Constants.per.open })\n  @Post('/get', { summary: Constants.per.open })\n  async get(@Body(ALL) bean: CertGetReq, @Query(ALL) query: CertGetReq) {\n    const openKey: OpenKey = this.ctx.openKey;\n    const userId = openKey.userId;\n    if (!userId) {\n      throw new CodeException(Constants.res.openKeyError);\n    }\n\n    const req = merge({}, bean, query)\n\n    const res: CertInfo = await this.certInfoFacade.getCertInfo({\n      userId,\n      domains: req.domains,\n      certId: req.certId,\n      autoApply: req.autoApply??false,\n    });\n    return this.ok(res);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/sys/access/access-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { AccessService, Constants } from '@certd/lib-server';\nimport { AccessController } from '../../user/pipeline/access-controller.js';\nimport { checkComm } from '@certd/plus-core';\n\n/**\n * 授权\n */\n@Provide()\n@Controller('/api/sys/access')\nexport class SysAccessController extends AccessController {\n  @Inject()\n  service2: AccessService;\n\n  getService(): AccessService {\n    return this.service2;\n  }\n\n  getUserId() {\n    checkComm();\n    return 0;\n  }\n\n  @Post('/page', { summary: 'sys:settings:view' })\n  async page(@Body(ALL) body: any) {\n    return await super.page(body);\n  }\n\n  @Post('/list', { summary: 'sys:settings:view' })\n  async list(@Body(ALL) body: any) {\n    return await super.list(body);\n  }\n\n  @Post('/add', { summary: 'sys:settings:edit' })\n  async add(@Body(ALL) bean: any) {\n    return await super.add(bean);\n  }\n\n  @Post('/update', { summary: 'sys:settings:edit' })\n  async update(@Body(ALL) bean: any) {\n    return await super.update(bean);\n  }\n  @Post('/info', { summary: 'sys:settings:view' })\n  async info(@Query('id') id: number) {\n    return await super.info(id);\n  }\n\n  @Post('/delete', { summary: 'sys:settings:edit' })\n  async delete(@Query('id') id: number) {\n    return await super.delete(id);\n  }\n\n  @Post('/define', { summary: 'sys:settings:view' })\n  async define(@Query('type') type: string) {\n    return await super.define(type);\n  }\n\n  @Post('/getSecretPlain', { summary: Constants.per.authOnly })\n  async getSecretPlain(@Body(ALL) body: { id: number; key: string }) {\n    const value = await this.service.getById(body.id, 0);\n    return this.ok(value[body.key]);\n  }\n\n  @Post('/accessTypeDict', { summary: 'sys:settings:view' })\n  async getAccessTypeDict() {\n    return await super.getAccessTypeDict();\n  }\n\n  @Post('/simpleInfo', { summary: 'sys:settings:view' })\n  async simpleInfo(@Query('id') id: number) {\n    return await super.simpleInfo(id);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/sys/account/account-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core';\nimport { BaseController, PlusService, SysInstallInfo, SysSettingsService } from '@certd/lib-server';\n\nexport type PreBindUserReq = {\n  userId: number;\n};\nexport type BindUserReq = {\n  userId: number;\n};\n/**\n */\n@Provide()\n@Controller('/api/sys/account')\nexport class BasicController extends BaseController {\n  @Inject()\n  plusService: PlusService;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  @Post('/preBindUser', { summary: 'sys:settings:edit' })\n  public async preBindUser(@Body(ALL) body: PreBindUserReq) {\n    // 设置缓存内容\n    await this.plusService.userPreBind(body.userId);\n    return this.ok({});\n  }\n\n  @Post('/bindUser', { summary: 'sys:settings:edit' })\n  public async bindUser(@Body(ALL) body: BindUserReq) {\n    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);\n    installInfo.bindUserId = body.userId;\n    await this.sysSettingsService.saveSetting(installInfo);\n    return this.ok({});\n  }\n\n  @Post('/unbindUser', { summary: 'sys:settings:edit' })\n  public async unbindUser() {\n    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);\n    installInfo.bindUserId = null;\n    await this.sysSettingsService.saveSetting(installInfo);\n    return this.ok({});\n  }\n\n  @Post('/updateLicense', { summary: 'sys:settings:edit' })\n  public async updateLicense(@Body(ALL) body: { license: string }) {\n    await this.plusService.updateLicense(body.license);\n    return this.ok(true);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/sys/authority/permission-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { CrudController } from '@certd/lib-server';\nimport { PermissionService } from '../../../modules/sys/authority/service/permission-service.js';\n\n/**\n * 权限资源\n */\n@Provide()\n@Controller('/api/sys/authority/permission')\nexport class PermissionController extends CrudController<PermissionService> {\n  @Inject()\n  service: PermissionService;\n\n  getService() {\n    return this.service;\n  }\n\n  @Post('/page', { summary: 'sys:auth:per:view' })\n  async page(\n    @Body(ALL)\n    body\n  ) {\n    return await super.page(body);\n  }\n\n  @Post('/add', { summary: 'sys:auth:per:add' })\n  async add(\n    @Body(ALL)\n    bean\n  ) {\n    return await super.add(bean);\n  }\n\n  @Post('/update', { summary: 'sys:auth:per:edit' })\n  async update(\n    @Body(ALL)\n    bean\n  ) {\n    return await super.update(bean);\n  }\n  @Post('/delete', { summary: 'sys:auth:per:remove' })\n  async delete(\n    @Query('id')\n    id: number\n  ) {\n    return await super.delete(id);\n  }\n\n  @Post('/tree', { summary: 'sys:auth:per:view' })\n  async tree() {\n    const tree = await this.service.tree({});\n    return this.ok(tree);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/sys/authority/role-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { CrudController } from '@certd/lib-server';\nimport { RoleService } from '../../../modules/sys/authority/service/role-service.js';\n\n/**\n * 系统用户\n */\n@Provide()\n@Controller('/api/sys/authority/role')\nexport class RoleController extends CrudController<RoleService> {\n  @Inject()\n  service: RoleService;\n\n  getService() {\n    return this.service;\n  }\n\n  @Post('/page', { summary: 'sys:auth:role:view' })\n  async page(\n    @Body(ALL)\n    body\n  ) {\n    return await super.page(body);\n  }\n\n  @Post('/list', { summary: 'sys:auth:role:view' })\n  async list() {\n    const ret = await this.service.find({});\n    return this.ok(ret);\n  }\n\n  @Post('/add', { summary: 'sys:auth:role:add' })\n  async add(\n    @Body(ALL)\n    bean\n  ) {\n    return await super.add(bean);\n  }\n\n  @Post('/update', { summary: 'sys:auth:role:edit' })\n  async update(\n    @Body(ALL)\n    bean\n  ) {\n    return await super.update(bean);\n  }\n  @Post('/delete', { summary: 'sys:auth:role:remove' })\n  async delete(\n    @Query('id')\n    id: number\n  ) {\n    if (id === 1) {\n      throw new Error('不能删除默认的管理员角色');\n    }\n    return await super.delete(id);\n  }\n\n  @Post('/getPermissionTree', { summary: 'sys:auth:role:view' })\n  async getPermissionTree(\n    @Query('id')\n    id: number\n  ) {\n    const ret = await this.service.getPermissionTreeByRoleId(id);\n    return this.ok(ret);\n  }\n\n  @Post('/getPermissionIds', { summary: 'sys:auth:role:view' })\n  async getPermissionIds(\n    @Query('id')\n    id: number\n  ) {\n    const ret = await this.service.getPermissionIdsByRoleId(id);\n    return this.ok(ret);\n  }\n\n  /**\n   * 给角色授予权限\n   * @param roleId\n   * @param permissionIds\n   */\n  @Post('/authz', { summary: 'sys:auth:role:edit' })\n  async authz(@Body('roleId') roleId, @Body('permissionIds') permissionIds) {\n    await this.service.authz(roleId, permissionIds);\n    return this.ok(null);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/sys/authority/user-controller.ts",
    "content": "import {Provide, Controller, Post, Inject, Body, Query, ALL} from '@midwayjs/core';\nimport {UserService} from '../../../modules/sys/authority/service/user-service.js';\nimport {CrudController} from '@certd/lib-server';\nimport {RoleService} from '../../../modules/sys/authority/service/role-service.js';\nimport {PermissionService} from '../../../modules/sys/authority/service/permission-service.js';\nimport {Constants} from '@certd/lib-server';\nimport {In} from 'typeorm';\nimport {LoginService} from \"../../../modules/login/service/login-service.js\";\n\n/**\n * 系统用户\n */\n@Provide()\n@Controller('/api/sys/authority/user')\nexport class UserController extends CrudController<UserService> {\n  @Inject()\n  service: UserService;\n\n  @Inject()\n  roleService: RoleService;\n  @Inject()\n  permissionService: PermissionService;\n\n  @Inject()\n  loginService: LoginService;\n\n  getService() {\n    return this.service;\n  }\n\n  @Post('/getSimpleUserByIds', {summary: 'sys:auth:user:add'})\n  async getSimpleUserByIds(@Body('ids') ids: number[]) {\n    const users = await this.service.find({\n      select: {\n        id: true,\n        username: true,\n        nickName: true,\n        mobile: true,\n        phoneCode: true,\n      },\n      where: {\n        id: In(ids),\n      },\n    });\n\n    return this.ok(users);\n  }\n\n  @Post('/page', {summary: 'sys:auth:user:view'})\n  async page(\n    @Body(ALL)\n      body\n  ) {\n    const ret = await super.page(body);\n\n    const users = ret.data.records;\n\n    //获取roles\n    const userIds = users.map(item => item.id);\n    const userRoles = await this.roleService.getByUserIds(userIds);\n    const userRolesMap = new Map();\n    for (const ur of userRoles) {\n      let roles = userRolesMap.get(ur.userId);\n      if (roles == null) {\n        roles = [];\n        userRolesMap.set(ur.userId, roles);\n      }\n      roles.push(ur.roleId);\n    }\n\n    for (const record of users) {\n      //withRoles\n      record.roles = userRolesMap.get(record.id);\n      //删除密码字段\n      delete record.password;\n    }\n\n    return ret;\n  }\n\n  @Post('/add', {summary: 'sys:auth:user:add'})\n  async add(\n    @Body(ALL)\n      bean\n  ) {\n    return await super.add(bean);\n  }\n\n  @Post('/update', {summary: 'sys:auth:user:edit'})\n  async update(\n    @Body(ALL)\n      bean\n  ) {\n    return await super.update(bean);\n  }\n\n  @Post('/delete', {summary: 'sys:auth:user:remove'})\n  async delete(\n    @Query('id')\n      id: number\n  ) {\n    if (id === 1) {\n      throw new Error('不能删除默认的管理员角色');\n    }\n    if (id === 3) {\n      throw new Error('不能删除默认的普通用户角色');\n    }\n    return await super.delete(id);\n  }\n\n  /**\n   * 解除登录锁定\n   */\n  @Post('/unlockBlock', {summary: \"sys:auth:user:edit\"})\n  public async unlockBlock(@Body('id') id: number) {\n    const info = await this.service.info(id, ['password']);\n    this.loginService.clearCacheOnSuccess(info.username)\n    if (info.mobile) {\n      this.loginService.clearCacheOnSuccess(info.mobile)\n    }\n    return this.ok(info);\n  }\n\n  /**\n   * 当前登录用户的个人信息\n   */\n  @Post('/mine', {summary: Constants.per.authOnly})\n  public async mine() {\n    const id = this.getUserId();\n    const info = await this.service.info(id, ['password']);\n    return this.ok(info);\n  }\n\n  /**\n   * 当前登录用户的权限列表\n   */\n  @Post('/permissions', {summary: Constants.per.authOnly})\n  public async permissions() {\n    const id = this.getUserId();\n    const permissions = await this.service.getUserPermissions(id);\n    return this.ok(permissions);\n  }\n\n  /**\n   * 当前登录用户的权限树形列表\n   */\n  @Post('/permissionTree', {summary: Constants.per.authOnly})\n  public async permissionTree() {\n    const id = this.getUserId();\n    const permissions = await this.service.getUserPermissions(id);\n    const tree = this.permissionService.buildTree(permissions);\n    return this.ok(tree);\n  }\n\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/sys/cname/cname-provider-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { CrudController } from '@certd/lib-server';\nimport { merge } from 'lodash-es';\nimport { CnameProviderService } from '../../../modules/cname/service/cname-provider-service.js';\n\n/**\n * 授权\n */\n@Provide()\n@Controller('/api/sys/cname/provider')\nexport class CnameRecordController extends CrudController<CnameProviderService> {\n  @Inject()\n  service: CnameProviderService;\n\n  getService(): CnameProviderService {\n    return this.service;\n  }\n\n  @Post('/page', { summary: 'sys:settings:view' })\n  async page(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    return await super.page(body);\n  }\n\n  @Post('/list', { summary: 'sys:settings:view' })\n  async list(@Body(ALL) body: any) {\n    return super.list(body);\n  }\n\n  @Post('/add', { summary: 'sys:settings:edit' })\n  async add(@Body(ALL) bean: any) {\n    const def: any = {\n      isDefault: false,\n      disabled: false,\n    };\n    merge(bean, def);\n    bean.userId = this.getUserId();\n    return super.add(bean);\n  }\n\n  @Post('/update', { summary: 'sys:settings:edit' })\n  async update(@Body(ALL) bean: any) {\n    bean.userId = this.getUserId();\n    return super.update(bean);\n  }\n\n  @Post('/info', { summary: 'sys:settings:view' })\n  async info(@Query('id') id: number) {\n    return super.info(id);\n  }\n\n  @Post('/delete', { summary: 'sys:settings:edit' })\n  async delete(@Query('id') id: number) {\n    return super.delete(id);\n  }\n\n  @Post('/deleteByIds', { summary: 'sys:settings:edit' })\n  async deleteByIds(@Body('ids') ids: number[]) {\n    const res = await this.service.delete(ids);\n    return this.ok(res);\n  }\n\n  @Post('/setDefault', { summary: 'sys:settings:edit' })\n  async setDefault(@Body('id') id: number) {\n    await this.service.setDefault(id);\n    return this.ok();\n  }\n\n  @Post('/setDisabled', { summary: 'sys:settings:edit' })\n  async setDisabled(@Body('id') id: number, @Body('disabled') disabled: boolean) {\n    await this.service.setDisabled(id, disabled);\n    return this.ok();\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/sys/console/statistic-controller.ts",
    "content": "import { Controller, Inject, Post, Provide } from '@midwayjs/core';\nimport { BaseController } from '@certd/lib-server';\nimport { UserService } from '../../../modules/sys/authority/service/user-service.js';\nimport { RoleService } from '../../../modules/sys/authority/service/role-service.js';\nimport { PipelineService } from '../../../modules/pipeline/service/pipeline-service.js';\nimport { HistoryService } from '../../../modules/pipeline/service/history-service.js';\n\nexport type ChartItem = {\n  name: string;\n  value: number;\n};\nexport type SysStatisticCount = {\n  userCount: number;\n  pipelineCount?: number;\n  historyCountPerDay: ChartItem[];\n  userRegisterCountPerDay: ChartItem[];\n  pipelineCreateCountPerDay: ChartItem[];\n};\n/**\n */\n@Provide()\n@Controller('/api/sys/statistic/')\nexport class SysStatisticController extends BaseController {\n  @Inject()\n  userService: UserService;\n  @Inject()\n  roleService: RoleService;\n\n  @Inject()\n  pipelineService: PipelineService;\n  @Inject()\n  historyService: HistoryService;\n\n  @Post('/count', { summary: 'sys:settings:view' })\n  public async count() {\n    const userCount = await this.userService.count();\n    const userRegisterCountPerDay = await this.userService.registerCountPerDay({ days: 7 });\n    const pipelineCreateCountPerDay = await this.pipelineService.createCountPerDay({ days: 7 });\n    const pipelineCount = await this.pipelineService.count({});\n    const historyCountPerDay = await this.historyService.countPerDay({ days: 7 });\n\n    const count: SysStatisticCount = {\n      userCount,\n      userRegisterCountPerDay,\n      pipelineCount,\n      pipelineCreateCountPerDay,\n      historyCountPerDay,\n    };\n    return this.ok(count);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/sys/plugin/plugin-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { merge } from 'lodash-es';\nimport { CrudController } from '@certd/lib-server';\nimport { PluginImportReq, PluginService } from \"../../../modules/plugin/service/plugin-service.js\";\nimport { CommPluginConfig, PluginConfigService } from '../../../modules/plugin/service/plugin-config-service.js';\n/**\n * 插件\n */\n@Provide()\n@Controller('/api/sys/plugin')\nexport class PluginController extends CrudController<PluginService> {\n  @Inject()\n  service: PluginService;\n\n  @Inject()\n  pluginConfigService: PluginConfigService;\n\n  getService() {\n    return this.service;\n  }\n\n  @Post('/page', { summary: 'sys:settings:view' })\n  async page(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    return await super.page(body);\n  }\n\n  @Post('/list', { summary: 'sys:settings:view' })\n  async list(@Body(ALL) body: any) {\n    return super.list(body);\n  }\n\n  @Post('/add', { summary: 'sys:settings:edit' })\n  async add(@Body(ALL) bean: any) {\n    const def: any = {\n      isDefault: false,\n      disabled: false,\n    };\n    merge(bean, def);\n    return super.add(bean);\n  }\n\n  @Post('/update', { summary: 'sys:settings:edit' })\n  async update(@Body(ALL) bean: any) {\n\n    const res = await super.update(bean);\n    return res\n  }\n\n  @Post('/info', { summary: 'sys:settings:view' })\n  async info(@Query('id') id: number) {\n    return super.info(id);\n  }\n\n  @Post('/delete', { summary: 'sys:settings:edit' })\n  async delete(@Query('id') id: number) {\n    return super.deleteByIds([id]);\n  }\n\n  @Post('/deleteByIds', { summary: 'sys:settings:edit' })\n  async deleteByIds(@Body('ids') ids: number[]) {\n    const res = await this.service.deleteByIds(ids);\n    return this.ok(res);\n  }\n\n  @Post('/setDisabled', { summary: 'sys:settings:edit' })\n  async setDisabled(@Body(ALL) body: { id: number; name: string; type: string; disabled: boolean }) {\n    await this.service.setDisabled(body);\n    return this.ok();\n  }\n  @Post('/getCommPluginConfigs', { summary: 'sys:settings:view' })\n  async getCommPluginConfigs() {\n    const res = await this.pluginConfigService.getCommPluginConfig();\n    return this.ok(res);\n  }\n\n  @Post('/saveCommPluginConfigs', { summary: 'sys:settings:edit' })\n  async saveCommPluginConfigs(@Body(ALL) body: CommPluginConfig) {\n    const res = await this.pluginConfigService.saveCommPluginConfig(body);\n    return this.ok(res);\n  }\n\n\n  @Post('/import', { summary: 'sys:settings:edit' })\n  async import(@Body(ALL) body: PluginImportReq) {\n    const res = await this.service.importPlugin(body);\n    return this.ok(res);\n  }\n\n  @Post('/export', { summary: 'sys:settings:edit' })\n  async export(@Body('id') id: number) {\n    const res = await this.service.exportPlugin(id);\n    return this.ok(res);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/sys/plus/plus-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core';\nimport { BaseController, PlusService, SysInstallInfo, SysSettingsService } from '@certd/lib-server';\n\n/**\n */\n@Provide()\n@Controller('/api/sys/plus')\nexport class SysPlusController extends BaseController {\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  @Inject()\n  plusService: PlusService;\n\n  @Post('/active', { summary: 'sys:settings:edit' })\n  async active(@Body(ALL) body) {\n    const { code, inviteCode } = body;\n\n    await this.plusService.active(code, inviteCode);\n\n    return this.ok(true);\n  }\n  @Post('/bindUrl', { summary: 'sys:settings:edit' })\n  async bindUrl(@Body(ALL) body: { url: string }) {\n    const { url } = body;\n\n    await this.plusService.register();\n    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);\n    await this.plusService.bindUrl(url);\n\n    installInfo.bindUrl = url;\n    await this.sysSettingsService.saveSetting(installInfo);\n\n    //重新验证配置\n    await this.plusService.verify();\n\n    return this.ok(true);\n  }\n\n  @Post('/getVipTrial', { summary: 'sys:settings:edit' })\n  async getVipTrial(@Body(ALL) body) {\n    const res = await this.plusService.getVipTrial();\n    return this.ok(res);\n  }\n  //\n  // @Get('/test', { summary: Constants.per.guest })\n  // async test() {\n  //   const subjectId = 'xxxxxx';\n  //   const license = '';\n  //   const timestamps = 1728365013899;\n  //   const bindUrl = 'http://127.0.0.1:7001/';\n  //   const service = new PlusRequestService({\n  //     subjectId: subjectId,\n  //     plusServerBaseUrls: ['https://api.ai.handsfree.work'],\n  //   });\n  //   const body = { subjectId, appKey: 'kQth6FHM71IPV3qdWc', url: bindUrl };\n  //\n  //   async function test() {\n  //     await verify({\n  //       subjectId: subjectId,\n  //       license: license,\n  //       plusRequestService: service,\n  //     });\n  //\n  //     const res = await service.sign(body, timestamps);\n  //     console.log('sign:', res);\n  //\n  //     const res2 = await service.request({\n  //       url: '/activation/subject/vip/check',\n  //       data: {\n  //         url: 'http://127.0.0.1:7001/',\n  //       },\n  //     });\n  //\n  //     console.log('res2:', res2);\n  //   }\n  //   console.log('2222');\n  //   await test();\n  //   console.log('3333');\n  //\n  //   return this.ok(true);\n  // }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/sys/settings/sys-safe-settings-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide } from \"@midwayjs/core\";\nimport { BaseController, SysSafeSetting } from \"@certd/lib-server\";\nimport { cloneDeep } from \"lodash-es\";\nimport { SafeService } from \"../../../modules/sys/settings/safe-service.js\";\n\n\n/**\n */\n@Provide()\n@Controller('/api/sys/settings/safe')\nexport class SysSettingsController extends BaseController {\n  @Inject()\n  safeService: SafeService;\n\n\n\n  @Post(\"/get\", { summary: \"sys:settings:view\" })\n  async safeGet() {\n    const res = await this.safeService.getSafeSetting()\n    const clone:SysSafeSetting = cloneDeep(res);\n    delete clone.hidden?.openPassword;\n    return this.ok(clone);\n  }\n\n  @Post(\"/save\", { summary: \"sys:settings:edit\" })\n  async safeSave(@Body(ALL) body: any) {\n    await this.safeService.saveSafeSetting(body);\n    return this.ok({});\n  }\n\n  /**\n   * 立即隐藏\n   */\n  @Post(\"/hidden\", { summary: \"sys:settings:edit\" })\n  async hiddenImmediate() {\n    await this.safeService.hiddenImmediately();\n    return this.ok({});\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/sys/settings/sys-settings-controller.ts",
    "content": "import {ALL, Body, Controller, Inject, Post, Provide, Query} from '@midwayjs/core';\nimport {\n  CrudController,\n  SysPrivateSettings,\n  SysPublicSettings,\n  SysSafeSetting,\n  SysSettingsEntity,\n  SysSettingsService\n} from '@certd/lib-server';\nimport {cloneDeep, merge} from 'lodash-es';\nimport {PipelineService} from '../../../modules/pipeline/service/pipeline-service.js';\nimport {UserSettingsService} from '../../../modules/mine/service/user-settings-service.js';\nimport {getEmailSettings} from '../../../modules/sys/settings/fix.js';\nimport {http, logger, simpleNanoId, utils} from '@certd/basic';\nimport {CodeService} from '../../../modules/basic/service/code-service.js';\nimport {SmsServiceFactory} from '../../../modules/basic/sms/factory.js';\n\n\n/**\n */\n@Provide()\n@Controller('/api/sys/settings')\nexport class SysSettingsController extends CrudController<SysSettingsService> {\n  @Inject()\n  service: SysSettingsService;\n  @Inject()\n  userSettingsService: UserSettingsService;\n  @Inject()\n  pipelineService: PipelineService;\n  @Inject()\n  codeService: CodeService;\n\n  getService() {\n    return this.service;\n  }\n\n  @Post('/page', { summary: 'sys:settings:view' })\n  async page(@Body(ALL) body) {\n    return super.page(body);\n  }\n\n  @Post('/list', { summary: 'sys:settings:view' })\n  async list(@Body(ALL) body) {\n    return super.list(body);\n  }\n\n  @Post('/add', { summary: 'sys:settings:edit' })\n  async add(@Body(ALL) bean) {\n    return super.add(bean);\n  }\n\n  @Post('/update', { summary: 'sys:settings:edit' })\n  async update(@Body(ALL) bean) {\n    await this.service.checkUserId(bean.id, this.getUserId());\n    return super.update(bean);\n  }\n  @Post('/info', { summary: 'sys:settings:view' })\n  async info(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.info(id);\n  }\n\n  @Post('/delete', { summary: 'sys:settings:edit' })\n  async delete(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.delete(id);\n  }\n\n  @Post('/save', { summary: 'sys:settings:edit' })\n  async save(@Body(ALL) bean: SysSettingsEntity) {\n    await this.service.save(bean);\n    return this.ok({});\n  }\n\n  @Post('/get', { summary: 'sys:settings:view' })\n  async get(@Query('key') key: string) {\n    const entity = await this.service.getByKey(key);\n    return this.ok(entity);\n  }\n\n  // savePublicSettings\n  @Post('/getEmailSettings', { summary: 'sys:settings:view' })\n  async getEmailSettings(@Body(ALL) body) {\n    const conf = await getEmailSettings(this.service, this.userSettingsService);\n    return this.ok(conf);\n  }\n\n  @Post('/saveEmailSettings', { summary: 'sys:settings:edit' })\n  async saveEmailSettings(@Body(ALL) body) {\n    const conf = await getEmailSettings(this.service, this.userSettingsService);\n    merge(conf, body);\n    await this.service.saveSetting(conf);\n    return this.ok(conf);\n  }\n\n  @Post('/getSysSettings', { summary: 'sys:settings:view' })\n  async getSysSettings() {\n    const publicSettings = await this.service.getPublicSettings();\n    let privateSettings = await this.service.getPrivateSettings();\n    privateSettings = privateSettings.removeSecret();\n    return this.ok({ public: publicSettings, private: privateSettings });\n  }\n\n  // savePublicSettings\n  @Post('/saveSysSettings', { summary: 'sys:settings:edit' })\n  async saveSysSettings(@Body(ALL) body: { public: SysPublicSettings; private: SysPrivateSettings }) {\n    const publicSettings = await this.service.getPublicSettings();\n    const privateSettings = await this.service.getPrivateSettings();\n    merge(publicSettings, body.public);\n    merge(privateSettings, body.private);\n    await this.service.savePublicSettings(publicSettings);\n    await this.service.savePrivateSettings(privateSettings);\n    return this.ok({});\n  }\n  @Post('/stopOtherUserTimer', { summary: 'sys:settings:edit' })\n  async stopOtherUserTimer(@Body(ALL) body) {\n    await this.pipelineService.stopOtherUserPipeline(1);\n    return this.ok({});\n  }\n\n  @Post('/testProxy', { summary: 'sys:settings:edit' })\n  async testProxy(@Body(ALL) body) {\n    const google = 'https://www.google.com/';\n    const baidu = 'https://www.baidu.com/';\n    let googleRes = false;\n    try {\n      await http.request({\n        url: google,\n        method: 'GET',\n        timeout: 5000,\n        logRes: false,\n        logParams: false,\n      });\n      googleRes = true;\n    } catch (e) {\n      googleRes = e.message;\n      logger.info('test google error:', e);\n    }\n    let baiduRes = false;\n    try {\n      await http.request({\n        url: baidu,\n        method: 'GET',\n        timeout: 5000,\n        logRes: false,\n        logParams: false,\n      });\n      baiduRes = true;\n    } catch (e) {\n      baiduRes = e.message;\n      logger.info('test baidu error:', e);\n    }\n    return this.ok({\n      google: googleRes,\n      baidu: baiduRes,\n    });\n  }\n\n  @Post('/testSms', { summary: 'sys:settings:edit' })\n  async testSms(@Body(ALL) body) {\n    await this.codeService.sendSmsCode(body.phoneCode, body.mobile, simpleNanoId());\n    return this.ok({});\n  }\n\n  @Post('/getSmsTypeDefine', { summary: 'sys:settings:view' })\n  async getSmsTypeDefine(@Body('type') type: string) {\n    return this.ok(SmsServiceFactory.getDefine(type));\n  }\n\n\n\n  @Post(\"/safe/get\", { summary: \"sys:settings:view\" })\n  async safeGet() {\n    const res = await this.service.getSetting<SysSafeSetting>(SysSafeSetting);\n    const clone:SysSafeSetting = cloneDeep(res);\n    delete clone.hidden?.openPassword;\n    return this.ok(clone);\n  }\n\n  @Post(\"/safe/save\", { summary: \"sys:settings:edit\" })\n  async safeSave(@Body(ALL) body: any) {\n    if(body.hidden.openPassword){\n      body.hidden.openPassword = utils.hash.md5(body.hidden.openPassword);\n    }\n    const blankSetting = new SysSafeSetting()\n    const setting = await this.service.getSetting<SysSafeSetting>(SysSafeSetting);\n    const newSetting = merge(blankSetting,cloneDeep(setting), body);\n    if(newSetting.hidden?.enabled && !newSetting.hidden?.openPassword){\n      throw new Error(\"首次设置需要填写解锁密码\")\n    }\n    await this.service.saveSetting(blankSetting);\n    return this.ok({});\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/cert/domain-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { Constants, CrudController } from '@certd/lib-server';\nimport {DomainService} from \"../../../modules/cert/service/domain-service.js\";\n\n/**\n * 授权\n */\n@Provide()\n@Controller('/api/cert/domain')\nexport class DomainController extends CrudController<DomainService> {\n  @Inject()\n  service: DomainService;\n\n  getService(): DomainService {\n    return this.service;\n  }\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    const domain = body.query.domain;\n    delete body.query.domain;\n\n    const bq = qb => {\n      if (domain) {\n        qb.andWhere('domain like :domain', { domain: `%${domain}%` });\n      }\n    };\n\n    const pageRet = await this.getService().page({\n      query: body.query,\n      page: body.page,\n      sort: body.sort,\n      buildQuery: bq,\n    });\n    return this.ok(pageRet);\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    const list = await this.getService().list(body);\n    return this.ok(list);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) bean: any) {\n    bean.userId = this.getUserId();\n    return super.add(bean);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean: any) {\n    await this.service.checkUserId(bean.id, this.getUserId());\n    delete bean.userId;\n    return super.update(bean);\n  }\n\n  @Post('/info', { summary: Constants.per.authOnly })\n  async info(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.info(id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.delete(id);\n  }\n\n  @Post('/deleteByIds', { summary: Constants.per.authOnly })\n  async deleteByIds(@Body(ALL) body: any) {\n    await this.service.delete(body.ids, {\n      userId: this.getUserId(),\n    });\n    return this.ok();\n  }\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/cname/cname-provider-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core';\nimport { BaseController, Constants } from '@certd/lib-server';\nimport { CnameRecordService } from '../../../modules/cname/service/cname-record-service.js';\nimport { CnameProviderService } from '../../../modules/cname/service/cname-provider-service.js';\n\n/**\n * 授权\n */\n@Provide()\n@Controller('/api/cname/provider')\nexport class CnameProviderController extends BaseController {\n  @Inject()\n  service: CnameRecordService;\n  @Inject()\n  providerService: CnameProviderService;\n\n  getService(): CnameRecordService {\n    return this.service;\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    const res = await this.providerService.list({});\n    return this.ok(res);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/cname/cname-record-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { Constants, CrudController } from '@certd/lib-server';\nimport { CnameRecordService } from '../../../modules/cname/service/cname-record-service.js';\n\n/**\n * 授权\n */\n@Provide()\n@Controller('/api/cname/record')\nexport class CnameRecordController extends CrudController<CnameRecordService> {\n  @Inject()\n  service: CnameRecordService;\n\n  getService(): CnameRecordService {\n    return this.service;\n  }\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    const domain = body.query.domain;\n    delete body.query.domain;\n\n    const bq = qb => {\n      if (domain) {\n        qb.andWhere('domain like :domain', { domain: `%${domain}%` });\n      }\n    };\n\n    const pageRet = await this.getService().page({\n      query: body.query,\n      page: body.page,\n      sort: body.sort,\n      buildQuery: bq,\n    });\n    return this.ok(pageRet);\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    const list = await this.getService().list(body);\n    return this.ok(list);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) bean: any) {\n    bean.userId = this.getUserId();\n    return super.add(bean);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean: any) {\n    await this.service.checkUserId(bean.id, this.getUserId());\n    delete bean.userId;\n    return super.update(bean);\n  }\n\n  @Post('/info', { summary: Constants.per.authOnly })\n  async info(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.info(id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.delete(id);\n  }\n\n  @Post('/deleteByIds', { summary: Constants.per.authOnly })\n  async deleteByIds(@Body(ALL) body: any) {\n    await this.service.delete(body.ids, {\n      userId: this.getUserId(),\n    });\n    return this.ok();\n  }\n  @Post('/getByDomain', { summary: Constants.per.authOnly })\n  async getByDomain(@Body(ALL) body: { domain: string; createOnNotFound: boolean }) {\n    const userId = this.getUserId();\n    const res = await this.service.getByDomain(body.domain, userId, body.createOnNotFound);\n    return this.ok(res);\n  }\n\n  @Post('/verify', { summary: Constants.per.authOnly })\n  async verify(@Body(ALL) body: { id: string }) {\n    const userId = this.getUserId();\n    await this.service.checkUserId(body.id, userId);\n    const res = await this.service.verify(body.id);\n    return this.ok(res);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/dashboard/statistic-controller.ts",
    "content": "import { Controller, Inject, Post, Provide } from '@midwayjs/core';\nimport { BaseController, Constants } from '@certd/lib-server';\nimport { UserService } from '../../../modules/sys/authority/service/user-service.js';\nimport { RoleService } from '../../../modules/sys/authority/service/role-service.js';\nimport { PipelineService } from '../../../modules/pipeline/service/pipeline-service.js';\nimport { HistoryService } from '../../../modules/pipeline/service/history-service.js';\n\nexport type ChartItem = {\n  name: string;\n  value: number;\n};\nexport type UserStatisticCount = {\n  pipelineCount?: number;\n  pipelineStatusCount?: ChartItem[];\n  historyCountPerDay: ChartItem[];\n  expiringList: any[];\n};\n/**\n */\n@Provide()\n@Controller('/api/statistic/')\nexport class StatisticController extends BaseController {\n  @Inject()\n  userService: UserService;\n  @Inject()\n  roleService: RoleService;\n\n  @Inject()\n  pipelineService: PipelineService;\n  @Inject()\n  historyService: HistoryService;\n\n  @Post('/count', { summary: Constants.per.authOnly })\n  public async count() {\n    const pipelineCount = await this.pipelineService.count({ userId: this.getUserId() });\n    const pipelineStatusCount = await this.pipelineService.statusCount({ userId: this.getUserId() });\n    const historyCount = await this.historyService.countPerDay({ userId: this.getUserId(), days: 7 });\n    const expiringList = await this.pipelineService.latestExpiringList({ userId: this.getUserId(), count: 5 });\n    const count: UserStatisticCount = {\n      pipelineCount,\n      pipelineStatusCount,\n      historyCountPerDay: historyCount,\n      expiringList,\n    };\n    return this.ok(count);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/login/login-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core';\nimport { LoginService } from '../../../modules/login/service/login-service.js';\nimport { BaseController, Constants, SysPublicSettings, SysSettingsService } from '@certd/lib-server';\nimport { CodeService } from '../../../modules/basic/service/code-service.js';\nimport { checkComm } from '@certd/plus-core';\n\n/**\n */\n@Provide()\n@Controller('/api/')\nexport class LoginController extends BaseController {\n  @Inject()\n  loginService: LoginService;\n  @Inject()\n  codeService: CodeService;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  @Post('/login', { summary: Constants.per.guest })\n  public async login(\n    @Body(ALL)\n    user: any\n  ) {\n    const token = await this.loginService.loginByPassword(user);\n    this.writeTokenCookie(token);\n    return this.ok(token);\n  }\n\n  private writeTokenCookie(token: { expire: any; token: any }) {\n    this.ctx.cookies.set(\"certd_token\", token.token, {\n      maxAge: 1000 * token.expire\n    });\n  }\n\n  @Post('/loginBySms', { summary: Constants.per.guest })\n  public async loginBySms(\n    @Body(ALL)\n    body: any\n  ) {\n    const settings = await this.sysSettingsService.getSetting<SysPublicSettings>(SysPublicSettings);\n    if (settings.smsLoginEnabled !== true) {\n      throw new Error('当前站点禁止短信验证码登录');\n    }\n    checkComm();\n\n    const token = await this.loginService.loginBySmsCode({\n      phoneCode: body.phoneCode,\n      mobile: body.mobile,\n      smsCode: body.smsCode,\n      randomStr: body.randomStr,\n    });\n\n    this.writeTokenCookie(token);\n\n    return this.ok(token);\n  }\n\n  @Post('/loginByTwoFactor', { summary: Constants.per.guest })\n  public async loginByTwoFactor(\n    @Body(ALL)\n    body: any\n  ) {\n\n    const token = await this.loginService.loginByTwoFactor({\n      loginId: body.loginId,\n      verifyCode: body.verifyCode,\n    });\n\n    this.writeTokenCookie(token);\n    return this.ok(token);\n  }\n\n  @Post('/logout', { summary: Constants.per.authOnly })\n  public logout() {\n    this.ctx.cookies.set(\"certd_token\", \"\", {\n      maxAge: 0\n    });\n    return this.ok();\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/login/register-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core';\nimport { BaseController, Constants, SysSettingsService } from '@certd/lib-server';\nimport { RegisterType, UserService } from '../../../modules/sys/authority/service/user-service.js';\nimport { CodeService } from '../../../modules/basic/service/code-service.js';\nimport { checkComm, checkPlus } from '@certd/plus-core';\n\nexport type RegisterReq = {\n  type: RegisterType;\n  username: string;\n  password: string;\n  mobile: string;\n  email: string;\n  phoneCode?: string;\n\n  validateCode: string;\n  imgCode: string;\n  randomStr: string;\n};\n\n/**\n */\n@Provide()\n@Controller('/api/')\nexport class RegisterController extends BaseController {\n  @Inject()\n  userService: UserService;\n  @Inject()\n  codeService: CodeService;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  @Post('/register', { summary: Constants.per.guest })\n  public async register(\n    @Body(ALL)\n    body: RegisterReq\n  ) {\n    const sysPublicSettings = await this.sysSettingsService.getPublicSettings();\n    if (sysPublicSettings.registerEnabled === false) {\n      throw new Error('当前站点已禁止自助注册功能');\n    }\n\n    if (body.type === 'username') {\n      if (sysPublicSettings.usernameRegisterEnabled === false) {\n        throw new Error('当前站点已禁止用户名注册功能');\n      }\n      await this.codeService.checkCaptcha(body.randomStr, body.imgCode);\n      const newUser = await this.userService.register(body.type, {\n        username: body.username,\n        password: body.password,\n      } as any);\n      return this.ok(newUser);\n    } else if (body.type === 'mobile') {\n      if (sysPublicSettings.mobileRegisterEnabled === false) {\n        throw new Error('当前站点已禁止手机号注册功能');\n      }\n      checkComm();\n      //验证短信验证码\n      await this.codeService.checkSmsCode({\n        mobile: body.mobile,\n        phoneCode: body.phoneCode,\n        smsCode: body.validateCode,\n        randomStr: body.randomStr,\n        throwError: true,\n      });\n      const newUser = await this.userService.register(body.type, {\n        phoneCode: body.phoneCode,\n        mobile: body.mobile,\n        password: body.password,\n      } as any);\n      return this.ok(newUser);\n    } else if (body.type === 'email') {\n      if (sysPublicSettings.emailRegisterEnabled === false) {\n        throw new Error('当前站点已禁止Email注册功能');\n      }\n      checkPlus();\n      this.codeService.checkEmailCode({\n        email: body.email,\n        randomStr: body.randomStr,\n        validateCode: body.validateCode,\n        throwError: true,\n      });\n      const newUser = await this.userService.register(body.type, {\n        email: body.email,\n        password: body.password,\n      } as any);\n      return this.ok(newUser);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/mine/email-controller.ts",
    "content": "import { Body, Controller, Inject, Post, Provide } from '@midwayjs/core';\nimport { BaseController } from '@certd/lib-server';\nimport { Constants } from '@certd/lib-server';\nimport { EmailService } from '../../../modules/basic/service/email-service.js';\n\n/**\n */\n@Provide()\n@Controller('/api/mine/email')\nexport class EmailController extends BaseController {\n  @Inject()\n  emailService: EmailService;\n\n  @Post('/test', { summary: Constants.per.authOnly })\n  public async test(@Body('receiver') receiver) {\n    const userId = super.getUserId();\n    await this.emailService.test(userId, receiver);\n    return this.ok({});\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  public async list() {\n    const userId = super.getUserId();\n    const res = await this.emailService.list(userId);\n    return this.ok(res);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  public async add(@Body('email') email) {\n    const userId = super.getUserId();\n    await this.emailService.add(userId, email);\n    return this.ok({});\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  public async delete(@Body('email') email) {\n    const userId = super.getUserId();\n    await this.emailService.delete(userId, email);\n    return this.ok({});\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/mine/mine-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core';\nimport { BaseController, Constants } from '@certd/lib-server';\nimport { UserService } from '../../../modules/sys/authority/service/user-service.js';\nimport { RoleService } from '../../../modules/sys/authority/service/role-service.js';\n\n/**\n */\n@Provide()\n@Controller('/api/mine')\nexport class MineController extends BaseController {\n  @Inject()\n  userService: UserService;\n  @Inject()\n  roleService: RoleService;\n  @Post('/info', { summary: Constants.per.authOnly })\n  public async info() {\n    const userId = this.getUserId();\n    const user = await this.userService.info(userId);\n    const isWeak = await this.userService.checkPassword('123456', user.password, user.passwordVersion);\n    if (isWeak) {\n      //@ts-ignore\n      user.isWeak = true;\n    }\n    user.roleIds = await this.roleService.getRoleIdsByUserId(userId);\n    delete user.password;\n    return this.ok(user);\n  }\n\n  @Post('/changePassword', { summary: Constants.per.authOnly })\n  public async changePassword(@Body(ALL) body: any) {\n    const userId = this.getUserId();\n    await this.userService.changePassword(userId, body);\n    return this.ok({});\n  }\n\n  @Post('/updateProfile', { summary: Constants.per.authOnly })\n  public async updateProfile(@Body(ALL) body: any) {\n    const userId = this.getUserId();\n  \n    await this.userService.updateProfile(userId, {\n      avatar: body.avatar,\n      nickName: body.nickName,\n    });\n    return this.ok({});\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/mine/setting-two-factor-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide } from \"@midwayjs/core\";\nimport { BaseController, Constants } from \"@certd/lib-server\";\nimport { UserSettingsService } from \"../../../modules/mine/service/user-settings-service.js\";\nimport { UserTwoFactorSetting } from \"../../../modules/mine/service/models.js\";\nimport { merge } from \"lodash-es\";\nimport { TwoFactorService } from \"../../../modules/mine/service/two-factor-service.js\";\nimport {isPlus} from \"@certd/plus-core\";\n\n/**\n */\n@Provide()\n@Controller(\"/api/user/settings/twoFactor\")\nexport class UserTwoFactorSettingController extends BaseController {\n  @Inject()\n  service: UserSettingsService;\n\n  @Inject()\n  twoFactorService: TwoFactorService;\n\n\n\n  @Post(\"/get\", { summary: Constants.per.authOnly })\n  async get() {\n    const userId = this.getUserId();\n    const setting = await this.service.getSetting<UserTwoFactorSetting>(userId, UserTwoFactorSetting);\n    return this.ok(setting);\n  }\n\n  @Post(\"/save\", { summary: Constants.per.authOnly })\n  async save(@Body(ALL) bean: any) {\n    if (!isPlus()) {\n      throw new Error('本功能需要开通专业版')\n    }\n    const userId = this.getUserId();\n    const setting = new UserTwoFactorSetting();\n    merge(setting, bean);\n\n    // 禁用时清除\n    if(!setting.authenticator.enabled){\n        setting.authenticator.secret = null;\n        setting.authenticator.verified = false;\n    }\n\n    await this.service.saveSetting(userId, setting);\n    return this.ok({});\n  }\n\n  @Post(\"/authenticator/qrcode\", { summary: Constants.per.authOnly })\n  async authenticatorQrcode() {\n    const userId = this.getUserId();\n    const qrcode = await this.twoFactorService.getAuthenticatorQrCode(userId);\n    return this.ok(qrcode);\n  }\n\n  @Post(\"/authenticator/save\", { summary: Constants.per.authOnly })\n  async authenticatorSave(@Body(ALL) bean: any) {\n    if (!isPlus()) {\n      throw new Error('本功能需要开通专业版')\n    }\n    const userId = this.getUserId();\n    await this.twoFactorService.saveAuthenticator({\n        userId,\n        verifyCode: bean.verifyCode,\n    });\n    return this.ok();\n  }\n\n  @Post(\"/authenticator/off\", { summary: Constants.per.authOnly })\n  async authenticatorOff() {\n    const userId = this.getUserId();\n    await this.twoFactorService.offAuthenticator(userId);\n    return this.ok();\n  }\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/mine/user-settings-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from \"@midwayjs/core\";\nimport { Constants, CrudController } from \"@certd/lib-server\";\nimport { UserSettingsService } from \"../../../modules/mine/service/user-settings-service.js\";\nimport { UserSettingsEntity } from \"../../../modules/mine/entity/user-settings.js\";\n\n/**\n */\n@Provide()\n@Controller('/api/user/settings')\nexport class UserSettingsController extends CrudController<UserSettingsService> {\n  @Inject()\n  service: UserSettingsService;\n\n  getService() {\n    return this.service;\n  }\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    return super.page(body);\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    return super.list(body);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) bean) {\n    bean.userId = this.getUserId();\n    return super.add(bean);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean) {\n    await this.service.checkUserId(bean.id, this.getUserId());\n    delete bean.userId;\n    return super.update(bean);\n  }\n  @Post('/info', { summary: Constants.per.authOnly })\n  async info(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.info(id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.delete(id);\n  }\n\n  @Post('/save', { summary: Constants.per.authOnly })\n  async save(@Body(ALL) bean: UserSettingsEntity) {\n    bean.userId = this.getUserId();\n    await this.service.save(bean);\n    return this.ok({});\n  }\n\n  @Post('/get', { summary: Constants.per.authOnly })\n  async get(@Query('key') key: string) {\n    const entity = await this.service.getByKey(key, this.getUserId());\n    return this.ok(entity);\n  }\n\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/monitor/cert-info-controller.ts",
    "content": "import { ALL, Body, Controller, Get, Inject, Post, Provide, Query } from \"@midwayjs/core\";\nimport { CommonException, Constants, CrudController } from \"@certd/lib-server\";\nimport { AuthService } from \"../../../modules/sys/authority/service/auth-service.js\";\nimport { CertInfoService } from \"../../../modules/monitor/index.js\";\nimport { PipelineService } from \"../../../modules/pipeline/service/pipeline-service.js\";\nimport { SelectQueryBuilder } from \"typeorm\";\nimport { logger } from \"@certd/basic\";\nimport fs from \"fs\";\n\n/**\n */\n@Provide()\n@Controller('/api/monitor/cert')\nexport class CertInfoController extends CrudController<CertInfoService> {\n  @Inject()\n  service: CertInfoService;\n  @Inject()\n  authService: AuthService;\n  @Inject()\n  pipelineService: PipelineService;\n\n  getService(): CertInfoService {\n    return this.service;\n  }\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    const domains = body.query?.domains;\n    delete body.query.domains;\n    const res = await this.service.page({\n      query: body.query,\n      page: body.page,\n      sort: body.sort,\n      buildQuery: (bq) => {\n        if (domains) {\n          bq.andWhere('domains like :domains', { domains: `%${domains}%` });\n        }\n      }\n    });\n\n    const records = res.records;\n    const pipelineIds = records.map(r => r.pipelineId);\n    const pipelines = await this.pipelineService.getSimplePipelines(pipelineIds);\n    const pMap = new Map();\n    for (const p of pipelines) {\n      pMap.set(p.id, p);\n    }\n    for (const record of records) {\n      record.pipeline = pMap.get(record.pipelineId);\n    }\n    return this.ok(res);\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    return await super.list(body);\n  }\n\n\n  @Post('/getOptionsByIds', { summary: Constants.per.authOnly })\n  async getOptionsByIds(@Body(ALL) body: {ids:any[]}) {\n\n    const list = await this.service.list({\n      query:{\n        userId: this.getUserId(),\n      },\n      buildQuery: (bq: SelectQueryBuilder<any>) => {\n        bq.andWhere('id in (:...ids)', { ids: body.ids });\n      }\n    })\n\n    const safeList =list.map((item:any) => {\n      const domainsArr = item.domains? item.domains.split(',') : [];\n      return {\n        id: item.id,\n        domain: item.domain,\n        domains:domainsArr,\n        userId: item.userId,\n      }\n    })\n    return this.ok(safeList);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) bean: any) {\n    bean.userId = this.getUserId();\n    return await super.add(bean);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean) {\n    await this.service.checkUserId(bean.id, this.getUserId());\n    delete bean.userId;\n    return await super.update(bean);\n  }\n  @Post('/info', { summary: Constants.per.authOnly })\n  async info(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return await super.info(id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return await super.delete(id);\n  }\n\n  @Post('/all', { summary: Constants.per.authOnly })\n  async all() {\n    const list: any = await this.service.find({\n      where: {\n        userId: this.getUserId(),\n      },\n    });\n    return this.ok(list);\n  }\n\n\n\n  @Post('/getCert', { summary: Constants.per.authOnly })\n  async getCert(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    const certInfoEntity = await this.service.info(id);\n    const certInfo = JSON.parse(certInfoEntity.certInfo);\n    return this.ok(certInfo);\n  }\n\n  @Get('/download', { summary: Constants.per.authOnly })\n  async download(@Query('id') id: number) {\n    const certInfo = await this.service.info(id)\n    if (certInfo == null) {\n      throw new CommonException('file not found');\n    }\n    if (certInfo.userId !== this.getUserId()) {\n      throw new CommonException('file not found');\n    }\n    // koa send file\n    // 下载文件的名称\n    // const filename = file.filename;\n    // 要下载的文件的完整路径\n    const path = certInfo.certFile;\n    if (!path) {\n      throw new CommonException('file not found');\n    }\n    logger.info(`download:${path}`);\n    // 以流的形式下载文件\n    this.ctx.attachment(path);\n    this.ctx.set('Content-Type', 'application/octet-stream');\n\n    return fs.createReadStream(path);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/monitor/site-info-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from \"@midwayjs/core\";\nimport { Constants, CrudController } from \"@certd/lib-server\";\nimport { AuthService } from \"../../../modules/sys/authority/service/auth-service.js\";\nimport { SiteInfoService } from \"../../../modules/monitor/service/site-info-service.js\";\nimport { UserSiteMonitorSetting } from \"../../../modules/mine/service/models.js\";\nimport { merge } from \"lodash-es\";\nimport {SiteIpService} from \"../../../modules/monitor/service/site-ip-service.js\";\n\n/**\n */\n@Provide()\n@Controller('/api/monitor/site')\nexport class SiteInfoController extends CrudController<SiteInfoService> {\n  @Inject()\n  service: SiteInfoService;\n  @Inject()\n  authService: AuthService;\n  @Inject()\n  siteIpService: SiteIpService;\n\n  getService(): SiteInfoService {\n    return this.service;\n  }\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    const certDomains = body.query.certDomains;\n    const domain = body.query.domain;\n    const name = body.query.name;\n    delete body.query.certDomains;\n    delete body.query.domain;\n    delete body.query.name;\n    const res = await this.service.page({\n      query: body.query,\n      page: body.page,\n      sort: body.sort,\n      buildQuery: (bq) => {\n        if (domain) {\n          bq.andWhere('domain like :domain', { domain: `%${domain}%` });\n        }\n        if (certDomains) {\n          bq.andWhere('cert_domains like :cert_domains', { cert_domains: `%${certDomains}%` });\n        }\n        if (name) {\n          bq.andWhere('name like :name', { name: `%${name}%` });\n        }\n      }\n    });\n    return this.ok(res);\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    return await super.list(body);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) bean: any) {\n    bean.userId = this.getUserId();\n    const res = await this.service.add(bean);\n    const entity = await this.service.info(res.id);\n    if (entity.disabled) {\n      this.service.check(entity.id, true, 0);\n    }\n    return this.ok(res);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean) {\n    await this.service.checkUserId(bean.id, this.getUserId());\n    delete bean.userId;\n    await this.service.update(bean);\n    const entity = await this.service.info(bean.id);\n    if (entity.disabled) {\n      this.service.check(entity.id, true, 0);\n    }\n    return this.ok();\n  }\n  @Post('/info', { summary: Constants.per.authOnly })\n  async info(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return await super.info(id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return await super.delete(id);\n  }\n\n  @Post('/check', { summary: Constants.per.authOnly })\n  async check(@Body('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    await this.service.check(id, true, 0);\n    return this.ok();\n  }\n\n  @Post('/checkAll', { summary: Constants.per.authOnly })\n  async checkAll() {\n    const userId = this.getUserId();\n    await this.service.checkAllByUsers(userId);\n    return this.ok();\n  }\n\n  @Post('/import', { summary: Constants.per.authOnly })\n  async doImport(@Body(ALL) body: any) {\n    const userId = this.getUserId();\n    await this.service.doImport({\n      text:body.text,\n      userId\n    })\n    return this.ok();\n  }\n\n  @Post('/ipCheckChange', { summary: Constants.per.authOnly })\n  async ipCheckChange(@Body(ALL) bean: any) {\n    const userId = this.getUserId();\n    await this.service.checkUserId(bean.id, userId)\n    await this.service.ipCheckChange({\n      id: bean.id,\n      ipCheck: bean.ipCheck\n    });\n    return this.ok();\n  }\n\n  @Post('/disabledChange', { summary: Constants.per.authOnly })\n  async disabledChange(@Body(ALL) bean: any) {\n    const userId = this.getUserId();\n    await this.service.checkUserId(bean.id, userId)\n    await this.service.disabledChange({\n      id: bean.id,\n      disabled: bean.disabled\n    });\n    return this.ok();\n  }\n\n  @Post(\"/setting/get\", { summary: Constants.per.authOnly })\n  async get() {\n    const userId = this.getUserId();\n    const setting = await this.service.getSetting(userId)\n    return this.ok(setting);\n  }\n\n  @Post(\"/setting/save\", { summary: Constants.per.authOnly })\n  async save(@Body(ALL) bean: any) {\n    const userId = this.getUserId();\n    const setting = new UserSiteMonitorSetting();\n    merge(setting, bean);\n\n    await this.service.saveSetting(userId, setting);\n    return this.ok({});\n  }\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/monitor/site-ip-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from \"@midwayjs/core\";\nimport { Constants, CrudController } from \"@certd/lib-server\";\nimport { AuthService } from \"../../../modules/sys/authority/service/auth-service.js\";\nimport { SiteIpService } from \"../../../modules/monitor/service/site-ip-service.js\";\nimport { SiteInfoService } from \"../../../modules/monitor/index.js\";\n\n/**\n */\n@Provide()\n@Controller('/api/monitor/site/ip')\nexport class SiteInfoController extends CrudController<SiteIpService> {\n  @Inject()\n  service: SiteIpService;\n  @Inject()\n  authService: AuthService;\n  @Inject()\n  siteInfoService: SiteInfoService;\n\n  getService(): SiteIpService {\n    return this.service;\n  }\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    const res = await this.service.page({\n      query: body.query,\n      page: body.page,\n      sort: body.sort,\n    });\n    return this.ok(res);\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    return await super.list(body);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) bean: any) {\n    bean.userId = this.getUserId();\n    bean.from = \"manual\"\n    const res = await this.service.add(bean);\n    const siteEntity = await this.siteInfoService.info(bean.siteId);\n    if(!siteEntity.disabled){\n      const {domain,  httpsPort} = siteEntity;\n      this.service.check(res.id,domain,  httpsPort);\n    }\n    return this.ok(res);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean) {\n    await this.service.checkUserId(bean.id, this.getUserId());\n    delete bean.userId;\n    await this.service.update(bean);\n    const siteEntity = await this.siteInfoService.info(bean.siteId);\n    if(!siteEntity.disabled){\n      const {domain,  httpsPort} = siteEntity;\n      this.service.check(siteEntity.id,domain,  httpsPort);\n    }\n    return this.ok();\n  }\n  @Post('/info', { summary: Constants.per.authOnly })\n  async info(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return await super.info(id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    const entity = await this.service.info(id);\n    await this.service.checkUserId(id, this.getUserId());\n\n    const res = await super.delete(id);\n    await this.service.updateIpCount(entity.siteId)\n    return res\n  }\n\n  @Post('/check', { summary: Constants.per.authOnly })\n  async check(@Body('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    const entity = await this.service.info(id);\n    const siteEntity = await this.siteInfoService.info(entity.siteId);\n    const domain = siteEntity.domain;\n    const port = siteEntity.httpsPort;\n    this.service.check(id,domain,port);\n    return this.ok();\n  }\n\n  @Post('/checkAll', { summary: Constants.per.authOnly })\n  async checkAll(@Body('siteId') siteId: number) {\n    const userId = this.getUserId();\n    await this.siteInfoService.checkUserId(siteId, userId);\n    const siteEntity = await this.siteInfoService.info(siteId);\n    await this.service.syncAndCheck(siteEntity);\n    return this.ok();\n  }\n\n  @Post('/sync', { summary: Constants.per.authOnly })\n  async sync(@Body('siteId') siteId: number) {\n    const userId = this.getUserId();\n    const entity = await this.siteInfoService.info(siteId)\n    if(entity.userId != userId){\n      throw new Error('无权限')\n    }\n    await this.service.sync(entity);\n    return this.ok();\n  }\n\n  @Post('/import', { summary: Constants.per.authOnly })\n  async doImport(@Body(ALL) body: any) {\n    const userId = this.getUserId();\n    await this.service.doImport({\n      text:body.text,\n      userId,\n      siteId:body.siteId\n    })\n    return this.ok();\n  }\n\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/open/open-key-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { Constants, CrudController } from '@certd/lib-server';\nimport { AuthService } from '../../../modules/sys/authority/service/auth-service.js';\nimport { OpenKeyService } from '../../../modules/open/service/open-key-service.js';\n\n/**\n */\n@Provide()\n@Controller('/api/open/key')\nexport class OpenKeyController extends CrudController<OpenKeyService> {\n  @Inject()\n  service: OpenKeyService;\n  @Inject()\n  authService: AuthService;\n\n  getService(): OpenKeyService {\n    return this.service;\n  }\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    const res = await this.service.page({\n      query: body.query,\n      page: body.page,\n      sort: body.sort,\n    });\n    return this.ok(res);\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    return await super.list(body);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) body: any) {\n    body.userId = this.getUserId();\n    const res = await this.service.add(body);\n    return this.ok(res);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean) {\n    await this.service.checkUserId(bean.id, this.getUserId());\n    delete bean.userId;\n    await this.service.update(bean);\n    return this.ok();\n  }\n  @Post('/info', { summary: Constants.per.authOnly })\n  async info(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return await super.info(id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return await super.delete(id);\n  }\n\n  @Post('/getApiToken', { summary: Constants.per.authOnly })\n  async getApiToken(@Body('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    const token = await this.service.getApiToken(id);\n    return this.ok(token);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/pipeline/access-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { Constants, CrudController } from '@certd/lib-server';\nimport { AccessService } from '@certd/lib-server';\nimport { AuthService } from '../../../modules/sys/authority/service/auth-service.js';\nimport { AccessDefine } from '@certd/pipeline';\n\n/**\n * 授权\n */\n@Provide()\n@Controller('/api/pi/access')\nexport class AccessController extends CrudController<AccessService> {\n  @Inject()\n  service: AccessService;\n  @Inject()\n  authService: AuthService;\n\n  getService(): AccessService {\n    return this.service;\n  }\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body) {\n    body.query = body.query ?? {};\n    delete body.query.userId;\n    const buildQuery = qb => {\n      qb.andWhere('user_id = :userId', { userId: this.getUserId() });\n    };\n    const res = await this.service.page({\n      query: body.query,\n      page: body.page,\n      sort: body.sort,\n      buildQuery,\n    });\n    return this.ok(res);\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    return super.list(body);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) bean) {\n    bean.userId = this.getUserId();\n    return super.add(bean);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean) {\n    await this.service.checkUserId(bean.id, this.getUserId());\n    delete bean.userId;\n    return super.update(bean);\n  }\n  @Post('/info', { summary: Constants.per.authOnly })\n  async info(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.info(id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.delete(id);\n  }\n\n  @Post('/define', { summary: Constants.per.authOnly })\n  async define(@Query('type') type: string) {\n    const access = this.service.getDefineByType(type);\n    return this.ok(access);\n  }\n\n  @Post('/getSecretPlain', { summary: Constants.per.authOnly })\n  async getSecretPlain(@Body(ALL) body: { id: number; key: string }) {\n    const value = await this.service.getById(body.id, this.getUserId());\n    return this.ok(value[body.key]);\n  }\n\n  @Post('/accessTypeDict', { summary: Constants.per.authOnly })\n  async getAccessTypeDict() {\n    let list: AccessDefine[] = this.service.getDefineList();\n    list = list.sort((a,b) => {\n      return (a.order??10) - (b.order??10);\n    });\n    const dict = [];\n    for (const item of list) {\n      dict.push({\n        value: item.name,\n        label: item.title,\n        icon: item.icon,\n      });\n    }\n    return this.ok(dict);\n  }\n\n  @Post('/simpleInfo', { summary: Constants.per.authOnly })\n  async simpleInfo(@Query('id') id: number) {\n    await this.authService.checkEntityUserId(this.ctx, this.service, id);\n    const res = await this.service.getSimpleInfo(id);\n    return this.ok(res);\n  }\n\n  @Post('/getDictByIds', { summary: Constants.per.authOnly })\n  async getDictByIds(@Body('ids') ids: number[]) {\n    const res = await this.service.getSimpleByIds(ids, this.getUserId());\n    return this.ok(res);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/pipeline/cert-controller.ts",
    "content": "import {Body, Controller, Inject, Post, Provide, Query} from '@midwayjs/core';\nimport { PipelineService } from '../../../modules/pipeline/service/pipeline-service.js';\nimport { BaseController, Constants } from '@certd/lib-server';\nimport { StorageService } from '../../../modules/pipeline/service/storage-service.js';\nimport {CertReader} from \"@certd/plugin-cert\";\n\n@Provide()\n@Controller('/api/pi/cert')\nexport class CertController extends BaseController {\n  @Inject()\n  pipelineService: PipelineService;\n  @Inject()\n  storeService: StorageService;\n\n  @Post('/get', { summary: Constants.per.authOnly })\n  async getCert(@Query('id') id: number) {\n    const userId = this.getUserId();\n    await this.pipelineService.checkUserId(id, userId);\n    const privateVars = await this.storeService.getPipelinePrivateVars(id);\n    return this.ok(privateVars.cert);\n  }\n\n\n  @Post('/readCertDetail', { summary: Constants.per.authOnly })\n  async readCertDetail(@Body('crt') crt: string) {\n    if (!crt) {\n       throw new Error('crt is required');\n    }\n    const certDetail = CertReader.readCertDetail(crt)\n    return this.ok(certDetail);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/pipeline/dns-provider-controller.ts",
    "content": "import { ALL, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { DnsProviderService } from '../../../modules/pipeline/service/dns-provider-service.js';\nimport { BaseController } from '@certd/lib-server';\nimport { Constants } from '@certd/lib-server';\n\n/**\n * 插件\n */\n@Provide()\n@Controller('/api/pi/dnsProvider')\nexport class DnsProviderController extends BaseController {\n  @Inject()\n  service: DnsProviderService;\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Query(ALL) query: any) {\n    query.userId = this.getUserId();\n    const list = this.service.getList();\n    return this.ok(list);\n  }\n\n  @Post('/dnsProviderTypeDict', { summary: Constants.per.authOnly })\n  async getDnsProviderTypeDict() {\n    const list = this.service.getList();\n    const dict = [];\n    for (const item of list) {\n      dict.push({\n        value: item.name,\n        label: item.title,\n        //@ts-ignore\n        accessType: item.accessType,\n      });\n    }\n    return this.ok(dict);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/pipeline/handle-controller.ts",
    "content": "import {ALL, Body, Controller, Inject, Post, Provide} from '@midwayjs/core';\nimport {AccessGetter, AccessService, BaseController, Constants} from '@certd/lib-server';\nimport {\n  AccessRequestHandleReq,\n  IAccessService,\n  ITaskPlugin,\n  newAccess,\n  newNotification,\n  NotificationRequestHandleReq,\n  pluginRegistry,\n  PluginRequestHandleReq,\n  TaskInstanceContext,\n} from '@certd/pipeline';\nimport {EmailService} from '../../../modules/basic/service/email-service.js';\nimport {http, HttpRequestConfig, logger, mergeUtils, utils} from '@certd/basic';\nimport {NotificationService} from '../../../modules/pipeline/service/notification-service.js';\nimport {TaskServiceBuilder} from \"../../../modules/pipeline/service/getter/task-service-getter.js\";\n\n@Provide()\n@Controller('/api/pi/handle')\nexport class HandleController extends BaseController {\n  @Inject()\n  accessService: AccessService;\n\n  @Inject()\n  emailService: EmailService;\n\n  @Inject()\n  taskServiceBuilder: TaskServiceBuilder;\n\n  @Inject()\n  notificationService: NotificationService;\n\n  @Post('/access', { summary: Constants.per.authOnly })\n  async accessRequest(@Body(ALL) body: AccessRequestHandleReq) {\n    const userId = this.getUserId();\n    let inputAccess = body.input.access;\n    if (body.input.id > 0) {\n      const oldEntity = await this.accessService.info(body.input.id);\n      if (oldEntity) {\n        if (oldEntity.userId !== this.getUserId()) {\n          throw new Error('access not found');\n        }\n        const param: any = {\n          type: body.typeName,\n          setting: JSON.stringify(body.input.access),\n        };\n        this.accessService.encryptSetting(param, oldEntity);\n        inputAccess = this.accessService.decryptAccessEntity(param);\n      }\n    }\n    const accessGetter = new AccessGetter(userId, this.accessService.getById.bind(this.accessService));\n    const access = await newAccess(body.typeName, inputAccess,accessGetter);\n\n    const res = await access.onRequest(body);\n\n    return this.ok(res);\n  }\n\n  @Post('/notification', { summary: Constants.per.authOnly })\n  async notificationRequest(@Body(ALL) body: NotificationRequestHandleReq) {\n    const input = body.input.body;\n\n    const notification = await newNotification(body.typeName, input, {\n      http,\n      logger,\n      utils,\n      emailService: this.emailService,\n    });\n\n    const res = await notification.onRequest(body);\n\n    return this.ok(res);\n  }\n\n  @Post('/plugin', { summary: Constants.per.authOnly })\n  async pluginRequest(@Body(ALL) body: PluginRequestHandleReq) {\n    const userId = this.getUserId();\n    const pluginDefine = pluginRegistry.get(body.typeName);\n    const pluginCls = await pluginDefine.target();\n    if (pluginCls == null) {\n      throw new Error(`plugin ${body.typeName} not found`);\n    }\n    //实例化access\n    //@ts-ignore\n    const plugin: PluginRequestHandler = new pluginCls();\n    //@ts-ignore\n    const instance = plugin as ITaskPlugin;\n\n    const download = async (config: HttpRequestConfig, savePath: string) => {\n      await utils.download({\n        http,\n        logger,\n        config,\n        savePath,\n      });\n    };\n\n    const taskServiceGetter = this.taskServiceBuilder.create({userId})\n\n    const accessGetter = await taskServiceGetter.get<IAccessService>(\"accessService\")\n    //@ts-ignore\n    const taskCtx: TaskInstanceContext = {\n      pipeline: undefined,\n      step: undefined,\n      lastStatus: undefined,\n      http,\n      download,\n      logger: logger,\n      inputChanged: true,\n      accessService: accessGetter,\n      emailService: this.emailService,\n      pipelineContext: undefined,\n      userContext: undefined,\n      fileStore: undefined,\n      signal: undefined,\n      user: {id:userId,role:\"user\"},\n      // pipelineContext: this.pipelineContext,\n      // userContext: this.contextFactory.getContext('user', this.options.userId),\n      // fileStore: new FileStore({\n      //   scope: this.pipeline.id,\n      //   parent: this.runtime.id,\n      //   rootDir: this.options.fileRootDir,\n      // }),\n      // signal: this.abort.signal,\n      utils,\n      serviceGetter:taskServiceGetter\n    };\n    instance.setCtx(taskCtx);\n    mergeUtils.merge(plugin, body.input);\n    await instance.onInstance();\n    const res = await plugin.onRequest(body);\n\n    return this.ok(res);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/pipeline/history-controller.ts",
    "content": "import { ALL, Body, Controller, Get, Inject, Post, Provide, Query } from \"@midwayjs/core\";\nimport { CommonException, Constants, CrudController, PermissionException, SysSettingsService } from \"@certd/lib-server\";\nimport { PipelineEntity } from \"../../../modules/pipeline/entity/pipeline.js\";\nimport { HistoryService } from \"../../../modules/pipeline/service/history-service.js\";\nimport { HistoryLogService } from \"../../../modules/pipeline/service/history-log-service.js\";\nimport { HistoryEntity } from \"../../../modules/pipeline/entity/history.js\";\nimport { HistoryLogEntity } from \"../../../modules/pipeline/entity/history-log.js\";\nimport { PipelineService } from \"../../../modules/pipeline/service/pipeline-service.js\";\nimport * as fs from \"fs\";\nimport { logger } from \"@certd/basic\";\nimport { AuthService } from \"../../../modules/sys/authority/service/auth-service.js\";\nimport { In } from \"typeorm\";\n\n/**\n * 证书\n */\n@Provide()\n@Controller('/api/pi/history')\nexport class HistoryController extends CrudController<HistoryService> {\n  @Inject()\n  service: HistoryService;\n  @Inject()\n  pipelineService: PipelineService;\n  @Inject()\n  logService: HistoryLogService;\n\n  @Inject()\n  authService: AuthService;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  getService(): HistoryService {\n    return this.service;\n  }\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body: any) {\n    const isAdmin = await this.authService.isAdmin(this.ctx);\n    const publicSettings = await this.sysSettingsService.getPublicSettings();\n    const pipelineQuery: any = {};\n    if (!(publicSettings.managerOtherUserPipeline && isAdmin)) {\n      body.query.userId = this.getUserId();\n      pipelineQuery.userId = this.getUserId();\n    }\n\n    let pipelineIds: any = null;\n    const pipelineTitle = body.query?.pipelineTitle;\n    delete body.query.pipelineTitle;\n    if (pipelineTitle) {\n      const pipelines = await this.pipelineService.list({\n        query: pipelineQuery,\n        buildQuery: qb => {\n          qb.andWhere('title like :title', { title: `%${pipelineTitle}%` });\n        },\n      });\n      pipelineIds = pipelines.map(p => p.id);\n    }\n\n    const buildQuery = qb => {\n      if (pipelineIds) {\n        qb.andWhere({\n          pipelineId: In(pipelineIds),\n        });\n      }\n    };\n\n    const res = await this.service.page({\n      query: body.query,\n      page: body.page,\n      sort: body.sort,\n      buildQuery,\n    });\n\n    return this.ok(res);\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body) {\n    const isAdmin = await this.authService.isAdmin(this.ctx);\n    if (!isAdmin) {\n      body.userId = this.getUserId();\n    }\n    if (body.pipelineId == null) {\n      return this.ok([]);\n    }\n    const buildQuery = qb => {\n      qb.limit(20);\n    };\n    const withDetail = body.withDetail;\n    delete body.withDetail;\n    let select:any = null\n    if (!withDetail) {\n      select = {\n        pipeline: true, // 后面这里改成false\n        id: true,\n        userId: true,\n        pipelineId: true,\n        status: true,\n        // startTime: true,\n        triggerType: true,\n        endTime: true,\n        createTime: true,\n        updateTime: true\n      };\n    }\n    const listRet = await this.getService().list({\n      query: body,\n      sort: { prop: 'id', asc: false },\n      buildQuery,\n      select\n    });\n\n    for (const item of listRet) {\n      if (!item.pipeline) {\n        continue;\n      }\n      const json = JSON.parse(item.pipeline);\n      delete json.stages;\n      item.pipeline = json;\n\n      //@ts-ignore\n      item.version = json.version;\n      item.status = json.status.result\n      delete item.pipeline;\n    }\n\n    return this.ok(listRet);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) bean: PipelineEntity) {\n    bean.userId = this.getUserId();\n    return super.add(bean);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean) {\n    await this.authService.checkEntityUserId(this.ctx, this.getService(), bean.id);\n    delete bean.userId;\n    return super.update(bean);\n  }\n\n  @Post('/save', { summary: Constants.per.authOnly })\n  async save(@Body(ALL) bean: HistoryEntity) {\n    bean.userId = this.getUserId();\n    if (bean.id > 0) {\n      await this.authService.checkEntityUserId(this.ctx, this.getService(), bean.id);\n    }\n    await this.service.save(bean);\n    return this.ok(bean.id);\n  }\n\n  @Post('/saveLog', { summary: Constants.per.authOnly })\n  async saveLog(@Body(ALL) bean: HistoryLogEntity) {\n    bean.userId = this.getUserId();\n    if (bean.id > 0) {\n      await this.authService.checkEntityUserId(this.ctx, this.getService(), bean.id);\n    }\n    await this.logService.save(bean);\n    return this.ok(bean.id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    await this.authService.checkEntityUserId(this.ctx, this.getService(), id);\n    await super.delete(id);\n    return this.ok();\n  }\n\n  @Post('/deleteByIds', { summary: Constants.per.authOnly })\n  async deleteByIds(@Body(ALL) body: any) {\n    await this.authService.checkEntityUserId(this.ctx, this.getService(), body.ids);\n    const isAdmin = await this.authService.isAdmin(this.ctx);\n    const userId = isAdmin ? null : this.getUserId();\n    await this.getService().deleteByIds(body.ids, userId);\n    return this.ok();\n  }\n\n  @Post('/detail', { summary: Constants.per.authOnly })\n  async detail(@Query('id') id: number) {\n    await this.authService.checkEntityUserId(this.ctx, this.getService(), id);\n    const detail = await this.service.detail(id);\n    return this.ok(detail);\n  }\n\n  @Post('/logs', { summary: Constants.per.authOnly })\n  async logs(@Query('id') id: number) {\n    await this.authService.checkEntityUserId(this.ctx, this.logService, id);\n    const logInfo = await this.logService.info(id);\n    return this.ok(logInfo);\n  }\n\n  @Post('/files', { summary: Constants.per.authOnly })\n  async files(@Query('pipelineId') pipelineId: number, @Query('historyId') historyId: number) {\n    await this.authService.checkEntityUserId(this.ctx, this.service, historyId);\n    const files = await this.getFiles(historyId, pipelineId);\n    return this.ok(files);\n  }\n\n  private async getFiles(historyId, pipelineId) {\n    let history = null;\n    if (historyId != null) {\n      // nothing\n      history = await this.service.info(historyId);\n    } else if (pipelineId != null) {\n      history = await this.service.getLastHistory(pipelineId);\n    }\n    if (history == null) {\n      throw new CommonException('historyId is null');\n    }\n    if (history.userId !== this.getUserId()) {\n      throw new PermissionException();\n    }\n    return await this.service.getFiles(history);\n  }\n\n  @Get('/download', { summary: Constants.per.authOnly })\n  async download(@Query('pipelineId') pipelineId: number, @Query('historyId') historyId: number, @Query('fileId') fileId: string) {\n    await this.authService.checkEntityUserId(this.ctx, this.service, historyId);\n    const files = await this.getFiles(historyId, pipelineId);\n    const file = files.find(f => f.id === fileId);\n    if (file == null) {\n      throw new CommonException('file not found');\n    }\n    // koa send file\n    // 下载文件的名称\n    // const filename = file.filename;\n    // 要下载的文件的完整路径\n    const path = file.path;\n    logger.info(`download:${path}`);\n    // 以流的形式下载文件\n    this.ctx.attachment(path);\n    this.ctx.set('Content-Type', 'application/octet-stream');\n\n    return fs.createReadStream(path);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/pipeline/notification-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { Constants, CrudController, ValidateException } from '@certd/lib-server';\nimport { NotificationService } from '../../../modules/pipeline/service/notification-service.js';\nimport { AuthService } from '../../../modules/sys/authority/service/auth-service.js';\nimport { NotificationDefine } from '@certd/pipeline';\nimport { checkPlus } from '@certd/plus-core';\n\n/**\n * 通知\n */\n@Provide()\n@Controller('/api/pi/notification')\nexport class NotificationController extends CrudController<NotificationService> {\n  @Inject()\n  service: NotificationService;\n  @Inject()\n  authService: AuthService;\n\n  getService(): NotificationService {\n    return this.service;\n  }\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body) {\n    body.query = body.query ?? {};\n    delete body.query.userId;\n    const buildQuery = qb => {\n      qb.andWhere('user_id = :userId', { userId: this.getUserId() });\n    };\n    const res = await this.service.page({\n      query: body.query,\n      page: body.page,\n      sort: body.sort,\n      buildQuery,\n    });\n    return this.ok(res);\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    return super.list(body);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) bean) {\n    bean.userId = this.getUserId();\n    const type = bean.type;\n    const define: NotificationDefine = this.service.getDefineByType(type);\n    if (!define) {\n      throw new ValidateException('通知类型不存在');\n    }\n    if (define.needPlus) {\n      checkPlus();\n    }\n    return super.add(bean);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean) {\n    await this.service.checkUserId(bean.id, this.getUserId());\n    const old = await this.service.info(bean.id);\n    if (!old) {\n      throw new ValidateException('通知配置不存在');\n    }\n    if (old.type !== bean.type) {\n      const type = bean.type;\n      const define: NotificationDefine = this.service.getDefineByType(type);\n      if (!define) {\n        throw new ValidateException('通知类型不存在');\n      }\n      if (define.needPlus) {\n        checkPlus();\n      }\n    }\n    delete bean.userId;\n    return super.update(bean);\n  }\n  @Post('/info', { summary: Constants.per.authOnly })\n  async info(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.info(id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.delete(id);\n  }\n\n  @Post('/define', { summary: Constants.per.authOnly })\n  async define(@Query('type') type: string) {\n    const notification = this.service.getDefineByType(type);\n    return this.ok(notification);\n  }\n\n  @Post('/getTypeDict', { summary: Constants.per.authOnly })\n  async getTypeDict() {\n    const list: any = this.service.getDefineList();\n    let dict = [];\n    for (const item of list) {\n      dict.push({\n        value: item.name,\n        label: item.title,\n        needPlus: item.needPlus ?? false,\n        icon: item.icon,\n      });\n    }\n    dict = dict.sort(a => {\n      return a.needPlus ? 0 : -1;\n    });\n    return this.ok(dict);\n  }\n\n  @Post('/simpleInfo', { summary: Constants.per.authOnly })\n  async simpleInfo(@Query('id') id: number) {\n    if (id === 0) {\n      //获取默认\n      const res = await this.service.getDefault(this.getUserId());\n      if (!res) {\n        throw new ValidateException('默认通知配置不存在');\n      }\n      const simple = await this.service.getSimpleInfo(res.id);\n      return this.ok(simple);\n    }\n    await this.authService.checkEntityUserId(this.ctx, this.service, id);\n    const res = await this.service.getSimpleInfo(id);\n    return this.ok(res);\n  }\n\n  @Post('/getDefaultId', { summary: Constants.per.authOnly })\n  async getDefaultId() {\n    const res = await this.service.getDefault(this.getUserId());\n    return this.ok(res?.id);\n  }\n\n  @Post('/setDefault', { summary: Constants.per.authOnly })\n  async setDefault(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    const res = await this.service.setDefault(id, this.getUserId());\n    return this.ok(res);\n  }\n\n  @Post('/getOrCreateDefault', { summary: Constants.per.authOnly })\n  async getOrCreateDefault(@Body('email') email: string) {\n    const res = await this.service.getOrCreateDefault(email, this.getUserId());\n    return this.ok(res);\n  }\n\n  @Post('/options', { summary: Constants.per.authOnly })\n  async options() {\n    const res = await this.service.list({\n      query: {\n        userId: this.getUserId(),\n      },\n    });\n    for (const item of res) {\n      delete item.setting;\n    }\n    return this.ok(res);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/pipeline/pipeline-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { Constants, CrudController, SysSettingsService } from '@certd/lib-server';\nimport { PipelineService } from '../../../modules/pipeline/service/pipeline-service.js';\nimport { PipelineEntity } from '../../../modules/pipeline/entity/pipeline.js';\nimport { HistoryService } from '../../../modules/pipeline/service/history-service.js';\nimport { AuthService } from '../../../modules/sys/authority/service/auth-service.js';\n\n/**\n * 证书\n */\n@Provide()\n@Controller('/api/pi/pipeline')\nexport class PipelineController extends CrudController<PipelineService> {\n  @Inject()\n  service: PipelineService;\n  @Inject()\n  historyService: HistoryService;\n  @Inject()\n  authService: AuthService;\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  getService() {\n    return this.service;\n  }\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body) {\n    const isAdmin = await this.authService.isAdmin(this.ctx);\n    const publicSettings = await this.sysSettingsService.getPublicSettings();\n    if (!(publicSettings.managerOtherUserPipeline && isAdmin)) {\n      body.query.userId = this.getUserId();\n    }\n\n    const title = body.query.title;\n    delete body.query.title;\n\n    const buildQuery = qb => {\n      if (title) {\n        qb.andWhere('(title like :title or content like :content)', { title: `%${title}%`, content: `%${title}%` });\n      }\n    };\n    if (!body.sort || !body.sort?.prop) {\n      body.sort = { prop: 'order', asc: false };\n    }\n\n    const pageRet = await this.getService().page({\n      query: body.query,\n      page: body.page,\n      sort: body.sort,\n      buildQuery,\n    });\n    return this.ok(pageRet);\n  }\n\n  @Post('/getSimpleByIds', { summary: Constants.per.authOnly })\n  async getSimpleById(@Body(ALL) body) {\n    const ret = await this.getService().getSimplePipelines(body.ids,this.getUserId() );\n    return this.ok(ret);\n  }\n\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) bean: PipelineEntity) {\n    bean.userId = this.getUserId();\n    return super.add(bean);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean) {\n    await this.authService.checkEntityUserId(this.ctx, this.getService(), bean.id);\n    delete bean.userId;\n    return super.update(bean);\n  }\n\n  @Post('/save', { summary: Constants.per.authOnly })\n  async save(@Body(ALL) bean: PipelineEntity) {\n    if (bean.id > 0) {\n      await this.authService.checkEntityUserId(this.ctx, this.getService(), bean.id);\n    } else {\n      bean.userId = this.getUserId();\n    }\n    await this.service.save(bean);\n    return this.ok(bean.id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    await this.authService.checkEntityUserId(this.ctx, this.getService(), id);\n    await this.service.delete(id);\n    return this.ok({});\n  }\n\n  @Post('/detail', { summary: Constants.per.authOnly })\n  async detail(@Query('id') id: number) {\n    await this.authService.checkEntityUserId(this.ctx, this.getService(), id);\n    const detail = await this.service.detail(id);\n    return this.ok(detail);\n  }\n\n  @Post('/trigger', { summary: Constants.per.authOnly })\n  async trigger(@Query('id') id: number, @Query('stepId') stepId?: string) {\n    await this.authService.checkEntityUserId(this.ctx, this.getService(), id);\n    await this.service.trigger(id, stepId);\n    return this.ok({});\n  }\n\n  @Post('/cancel', { summary: Constants.per.authOnly })\n  async cancel(@Query('historyId') historyId: number) {\n    await this.authService.checkEntityUserId(this.ctx, this.historyService, historyId);\n    await this.service.cancel(historyId);\n    return this.ok({});\n  }\n\n  @Post('/count', { summary: Constants.per.authOnly })\n  async count() {\n    const count = await this.service.count({ userId: this.getUserId() });\n    return this.ok({ count });\n  }\n\n  @Post('/batchDelete', { summary: Constants.per.authOnly })\n  async batchDelete(@Body('ids') ids: number[]) {\n    await this.service.batchDelete(ids, this.getUserId());\n    return this.ok({});\n  }\n\n  @Post('/batchUpdateGroup', { summary: Constants.per.authOnly })\n  async batchUpdateGroup(@Body('ids') ids: number[], @Body('groupId') groupId: number) {\n    await this.service.batchUpdateGroup(ids, groupId, this.getUserId());\n    return this.ok({});\n  }\n\n\n  @Post('/batchUpdateTrigger', { summary: Constants.per.authOnly })\n  async batchUpdateTrigger(@Body('ids') ids: number[], @Body('trigger') trigger: any) {\n    await this.service.batchUpdateTrigger(ids, trigger, this.getUserId());\n    return this.ok({});\n  }\n\n  @Post('/batchUpdateNotification', { summary: Constants.per.authOnly })\n  async batchUpdateNotification(@Body('ids') ids: number[], @Body('notification') notification: any) {\n    await this.service.batchUpdateNotifications(ids, notification, this.getUserId());\n    return this.ok({});\n  }\n\n  @Post('/batchRerun', { summary: Constants.per.authOnly })\n  async batchRerun(@Body('ids') ids: number[]) {\n    await this.service.batchRerun(ids, this.getUserId());\n    return this.ok({});\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/pipeline/pipeline-group-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { Constants, CrudController } from '@certd/lib-server';\nimport { AuthService } from '../../../modules/sys/authority/service/auth-service.js';\nimport { PipelineGroupService } from '../../../modules/pipeline/service/pipeline-group-service.js';\n\n/**\n * 通知\n */\n@Provide()\n@Controller('/api/pi/pipeline/group')\nexport class PipelineGroupController extends CrudController<PipelineGroupService> {\n  @Inject()\n  service: PipelineGroupService;\n  @Inject()\n  authService: AuthService;\n\n  getService(): PipelineGroupService {\n    return this.service;\n  }\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    delete body.query.userId;\n    const buildQuery = qb => {\n      qb.andWhere('user_id = :userId', { userId: this.getUserId() });\n    };\n    const res = await this.service.page({\n      query: body.query,\n      page: body.page,\n      sort: body.sort,\n      buildQuery,\n    });\n    return this.ok(res);\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body: any) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    return await super.list(body);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) bean: any) {\n    bean.userId = this.getUserId();\n    return await super.add(bean);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean) {\n    await this.service.checkUserId(bean.id, this.getUserId());\n    delete bean.userId;\n    return await super.update(bean);\n  }\n  @Post('/info', { summary: Constants.per.authOnly })\n  async info(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return await super.info(id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return await super.delete(id);\n  }\n\n  @Post('/all', { summary: Constants.per.authOnly })\n  async all() {\n    const list: any = await this.service.find({\n      where: {\n        userId: this.getUserId(),\n      },\n    });\n    return this.ok(list);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/pipeline/plugin-controller.ts",
    "content": "import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';\nimport { BaseController, Constants } from '@certd/lib-server';\nimport { PluginService } from '../../../modules/plugin/service/plugin-service.js';\nimport { PluginConfigService } from '../../../modules/plugin/service/plugin-config-service.js';\nimport {pluginGroups} from \"@certd/pipeline\";\n\n/**\n * 插件\n */\n@Provide()\n@Controller('/api/pi/plugin')\nexport class PluginController extends BaseController {\n  @Inject()\n  service: PluginService;\n\n  @Inject()\n  pluginConfigService: PluginConfigService;\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Query(ALL) query: any) {\n    query.userId = this.getUserId();\n    const list = await this.service.getEnabledBuiltInList();\n    return this.ok(list);\n  }\n\n  @Post('/groups', { summary: Constants.per.authOnly })\n  async groups(@Query(ALL) query: any) {\n    query.userId = this.getUserId();\n    const group = await this.service.getEnabledBuildInGroup();\n    return this.ok(group);\n  }\n\n  @Post('/groupsList', { summary: Constants.per.authOnly })\n  async groupsList(@Query(ALL) query: any) {\n    query.userId = this.getUserId();\n    const groups = pluginGroups\n    const groupsList:any = []\n    for (const key in groups) {\n      const group = {\n        ...groups[key]\n      }\n      delete group.plugins\n      groupsList.push(group)\n    }\n    return this.ok(groupsList);\n  }\n\n  @Post('/getDefineByType', { summary: Constants.per.authOnly })\n  async getDefineByType(@Body('type') type: string) {\n    const define = await this.service.getDefineByType(type);\n    return this.ok(define);\n  }\n\n  @Post('/config', { summary: Constants.per.authOnly })\n  async config(@Body(ALL) body: { id?: number; name?: string; type: string }) {\n    const config = await this.pluginConfigService.getPluginConfig(body);\n    return this.ok(config);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/pipeline/sub-domain-controller.ts",
    "content": "import {ALL, Body, Controller, Inject, Post, Provide, Query} from '@midwayjs/core';\nimport {Constants, CrudController} from '@certd/lib-server';\nimport {SubDomainService} from \"../../../modules/pipeline/service/sub-domain-service.js\";\nimport {DomainParser} from '@certd/plugin-cert/dist/dns-provider/domain-parser.js';\nimport { SubDomainsGetter } from '../../../modules/pipeline/service/getter/sub-domain-getter.js';\n\n/**\n * 子域名托管\n */\n@Provide()\n@Controller('/api/pi/subDomain')\nexport class SubDomainController extends CrudController<SubDomainService> {\n  @Inject()\n  service: SubDomainService;\n\n  getService() {\n    return this.service;\n  }\n\n  @Post('/parseDomain', { summary: Constants.per.authOnly })\n  async parseDomain(@Body(\"fullDomain\") fullDomain:string) {\n    const userId = this.getUserId()\n    const subDomainGetter = new SubDomainsGetter(userId, this.service)\n    const domainParser = new DomainParser(subDomainGetter)\n    const domain = await domainParser.parse(fullDomain)\n    return this.ok(domain);\n  }\n\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body) {\n    body.query = body.query ?? {};\n    delete body.query.userId;\n    const buildQuery = qb => {\n      qb.andWhere('user_id = :userId', { userId: this.getUserId() });\n    };\n    const res = await this.service.page({\n      query: body.query,\n      page: body.page,\n      sort: body.sort,\n      buildQuery,\n    });\n    return this.ok(res);\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    return super.list(body);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) bean) {\n    bean.userId = this.getUserId();\n    return super.add(bean);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean) {\n    await this.service.checkUserId(bean.id, this.getUserId());\n    delete bean.userId;\n    return super.update(bean);\n  }\n  @Post('/info', { summary: Constants.per.authOnly })\n  async info(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.info(id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.delete(id);\n  }\n\n  @Post('/batchDelete', { summary: Constants.per.authOnly })\n  async batchDelete(@Body('ids') ids: number[]) {\n    await this.service.batchDelete(ids, this.getUserId());\n    return this.ok({});\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/controller/user/pipeline/template-controller.ts",
    "content": "import {ALL, Body, Controller, Inject, Post, Provide, Query} from '@midwayjs/core';\nimport {Constants, CrudController} from '@certd/lib-server';\nimport { TemplateService } from '../../../modules/pipeline/service/template-service.js';\nimport { checkPlus } from '@certd/plus-core';\n\n/**\n * 流水线模版\n */\n@Provide()\n@Controller('/api/pi/template')\nexport class TemplateController extends CrudController<TemplateService> {\n  @Inject()\n  service: TemplateService;\n\n  getService() {\n    return this.service;\n  }\n\n\n  @Post('/page', { summary: Constants.per.authOnly })\n  async page(@Body(ALL) body) {\n    body.query = body.query ?? {};\n    delete body.query.userId;\n    const buildQuery = qb => {\n      qb.andWhere('user_id = :userId', { userId: this.getUserId() });\n    };\n    const res = await this.service.page({\n      query: body.query,\n      page: body.page,\n      sort: body.sort,\n      buildQuery,\n    });\n    return this.ok(res);\n  }\n\n  @Post('/list', { summary: Constants.per.authOnly })\n  async list(@Body(ALL) body) {\n    body.query = body.query ?? {};\n    body.query.userId = this.getUserId();\n    return super.list(body);\n  }\n\n  @Post('/add', { summary: Constants.per.authOnly })\n  async add(@Body(ALL) bean) {\n    bean.userId = this.getUserId();\n    checkPlus()\n    return super.add(bean);\n  }\n\n  @Post('/update', { summary: Constants.per.authOnly })\n  async update(@Body(ALL) bean) {\n    await this.service.checkUserId(bean.id, this.getUserId());\n    delete bean.userId;\n    return super.update(bean);\n  }\n  @Post('/info', { summary: Constants.per.authOnly })\n  async info(@Query('id') id: number) {\n    await this.service.checkUserId(id, this.getUserId());\n    return super.info(id);\n  }\n\n  @Post('/delete', { summary: Constants.per.authOnly })\n  async delete(@Query('id') id: number) {\n    await this.service.batchDelete([id], this.getUserId());\n    return this.ok({});\n  }\n\n  @Post('/batchDelete', { summary: Constants.per.authOnly })\n  async batchDelete(@Body('ids') ids: number[]) {\n    await this.service.batchDelete(ids, this.getUserId());\n    return this.ok({});\n  }\n\n  @Post('/detail', { summary: Constants.per.authOnly })\n  async detail(@Query('id') id: number) {\n    const detail = await this.service.detail(id, this.getUserId());\n    return this.ok(detail);\n  }\n  @Post('/createPipelineByTemplate', { summary: Constants.per.authOnly })\n  async createPipelineByTemplate(@Body(ALL) body: any) {\n    body.userId = this.getUserId();\n    checkPlus()\n    const res = await this.service.createPipelineByTemplate(body);\n    return this.ok(res);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/filter/default.filter.ts",
    "content": "import { Catch } from '@midwayjs/core';\nimport { Context } from '@midwayjs/koa';\n\n@Catch()\nexport class DefaultErrorFilter {\n  async catch(err: Error, ctx: Context) {\n    // 所有的未分类错误会到这里\n    return {\n      success: false,\n      message: err.message,\n    };\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/filter/notfound.filter.ts",
    "content": "import { Catch, httpError, MidwayHttpError } from '@midwayjs/core';\nimport { Context } from '@midwayjs/koa';\n\n@Catch(httpError.NotFoundError)\nexport class NotFoundFilter {\n  async catch(err: MidwayHttpError, ctx: Context) {\n    // 404 错误会到这里\n    ctx.redirect('/404.html');\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/middleware/authority.ts",
    "content": "import { Init, Inject, MidwayWebRouterService, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { IMidwayKoaContext, IWebMiddleware, NextFunction } from '@midwayjs/koa';\nimport jwt from 'jsonwebtoken';\nimport { Constants, SysPrivateSettings, SysSettingsService } from '@certd/lib-server';\nimport { logger } from '@certd/basic';\nimport { AuthService } from '../modules/sys/authority/service/auth-service.js';\nimport { OpenKeyService } from '../modules/open/service/open-key-service.js';\nimport { RoleService } from '../modules/sys/authority/service/role-service.js';\n\n/**\n * 权限校验\n */\n@Provide()\n@Scope(ScopeEnum.Singleton)\nexport class AuthorityMiddleware implements IWebMiddleware {\n  @Inject()\n  webRouterService: MidwayWebRouterService;\n  @Inject()\n  authService: AuthService;\n  @Inject()\n  roleService: RoleService;\n  @Inject()\n  openKeyService: OpenKeyService;\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  secret: string;\n  @Init()\n  async init() {\n    const setting: SysPrivateSettings = await this.sysSettingsService.getSetting(SysPrivateSettings);\n    this.secret = setting.jwtKey;\n  }\n\n  resolve() {\n    return async (ctx: IMidwayKoaContext, next: NextFunction) => {\n      // 查询当前路由是否在路由表中注册\n      const routeInfo = await this.webRouterService.getMatchedRouterInfo(ctx.path, ctx.method);\n      if (routeInfo == null) {\n        // 404\n        await next();\n        return;\n      }\n      const permission = routeInfo.summary;\n      if (permission == null || permission === '') {\n        ctx.status = 500;\n        ctx.body = Constants.res.serverError('该路由未配置权限控制:' + ctx.path);\n        return;\n      }\n\n      if (permission === Constants.per.guest) {\n        await next();\n        return;\n      }\n\n      let token = ctx.get('Authorization') || '';\n      token = token.replace('Bearer ', '').trim();\n      if (!token) {\n        //尝试从cookie中获取token\n        const cookie = ctx.headers.cookie;\n        if (cookie) {\n          const items = cookie.split(';');\n          for (const item of items) {\n            if (!item  || !item.trim()) {\n              continue;\n            }\n            const [key, value] = item.split('=');\n            if (key.trim() === 'certd_token') {\n              token = value.trim();\n              break;\n            }\n          }\n        }\n      }\n      if (!token) {\n        //尝试从query中获取token\n        token = (ctx.query.token as string) || '';\n      }\n\n      if (token) {\n        try {\n          ctx.user = jwt.verify(token, this.secret);\n        } catch (err) {\n          logger.error('token verify error: ', err);\n          return this.notAuth(ctx);\n        }\n      } else {\n        //找找openKey\n        const openKey = await this.doOpenHandler(ctx);\n        if (!openKey) {\n          return this.notAuth(ctx);\n        }\n        if (permission === Constants.per.open) {\n          await next();\n          return;\n        } else if (openKey.scope === 'open') {\n          return this.notAuth(ctx);\n        }\n      }\n\n      if (permission === Constants.per.authOnly) {\n        await next();\n        return;\n      }\n\n      const pass = await this.authService.checkPermission(ctx, permission);\n      if (!pass) {\n        logger.info('not permission: ', ctx.req.url);\n        ctx.status = 200;\n        ctx.body = Constants.res.permission;\n        return;\n      }\n      await next();\n    };\n  }\n\n  private notAuth(ctx: IMidwayKoaContext) {\n    ctx.status = 401;\n    ctx.body = Constants.res.auth;\n    return;\n  }\n\n  async doOpenHandler(ctx: IMidwayKoaContext) {\n    //开放接口\n    const openKey = ctx.get('x-certd-token') || '';\n    if (!openKey) {\n      return null;\n    }\n\n    //校验 openKey\n    const openKeyRes = await this.openKeyService.verifyOpenKey(openKey);\n    const roles = await this.roleService.getRoleIdsByUserId(openKeyRes.userId);\n    ctx.user = { id: openKeyRes.userId, roles };\n    ctx.openKey = openKeyRes;\n    return openKeyRes;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/middleware/global-exception.ts",
    "content": "import { Provide } from '@midwayjs/core';\nimport { IMidwayKoaContext, IWebMiddleware, NextFunction } from '@midwayjs/koa';\nimport { logger } from '@certd/basic';\nimport { Result, TextException } from \"@certd/lib-server\";\n\n@Provide()\nexport class GlobalExceptionMiddleware implements IWebMiddleware {\n  resolve() {\n    return async (ctx: IMidwayKoaContext, next: NextFunction) => {\n      const { url } = ctx;\n      const startTime = Date.now();\n      logger.info('请求开始:', url);\n      try {\n        await next();\n        logger.info('请求完成:', url, Date.now() - startTime + 'ms');\n      } catch (err) {\n        if(err instanceof TextException){\n          delete err.stack\n        }\n        logger.error('请求异常:', url, Date.now() - startTime + 'ms', err);\n        ctx.status = 200;\n        if (err.code == null || typeof err.code !== 'number') {\n          err.code = 1;\n        }\n        ctx.body = Result.error(err.code, err.message,err.data);\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/middleware/hidden.ts",
    "content": "import {Inject, Provide} from '@midwayjs/core';\nimport {IMidwayKoaContext, IWebMiddleware, NextFunction} from '@midwayjs/koa';\nimport {hiddenStatus, SafeService} from \"../modules/sys/settings/safe-service.js\";\nimport {SiteOffException} from \"@certd/lib-server\";\n\n\n/**\n * 隐藏环境\n */\n@Provide()\nexport class HiddenMiddleware implements IWebMiddleware {\n  @Inject()\n  hiddenService: SafeService;\n\n  resolve() {\n    return async (ctx: IMidwayKoaContext, next: NextFunction) => {\n\n      async function pass() {\n        hiddenStatus.updateRequestTime()\n        await next();\n      }\n\n      const hiddenSetting = await this.hiddenService.getHiddenSetting();\n      if (!hiddenSetting || !hiddenSetting?.enabled) {\n        //未开启站点隐藏，直接通过\n        return await pass()\n      }\n\n      const req = ctx.request;\n      if (hiddenSetting.hiddenOpenApi === false && req.url.startsWith(`/api/v1/`) ) {\n        //不隐藏开放接口\n        await next();\n        return\n      }\n\n      //判断当前是否是隐藏状态\n      if (!hiddenStatus.isHidden) {\n        return await pass()\n      }\n\n      //判断是否有解锁文件,如果有就返回true并删除文件\n      if (hiddenStatus.hasUnHiddenFile()) {\n        //临时修改为未隐藏\n        hiddenStatus.isHidden = false;\n        return await pass()\n      }\n\n      if (req.url === `/api/unhidden/${hiddenSetting.openPath}`) {\n        return await pass();\n      }\n      throw new SiteOffException('此站点已关闭');\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/middleware/preview.ts",
    "content": "import { Config, Provide } from '@midwayjs/core';\nimport { IMidwayKoaContext, NextFunction, IWebMiddleware } from '@midwayjs/koa';\nimport { PreviewException } from '@certd/lib-server';\n\n/**\n * 预览模式\n */\n@Provide()\nexport class PreviewMiddleware implements IWebMiddleware {\n  @Config('preview.enabled')\n  private preview: boolean;\n\n  resolve() {\n    return async (ctx: IMidwayKoaContext, next: NextFunction) => {\n      if (!this.preview) {\n        await next();\n        return;\n      }\n      // eslint-disable-next-line prefer-const\n      let { url, request } = ctx;\n      const body: any = request.body;\n      let id = body.id || request.query.id;\n      const roleId = body.roleId;\n      if (id == null && roleId != null) {\n        id = roleId;\n      }\n      if (id != null && typeof id === 'string') {\n        id = parseInt(id);\n      }\n      if (url.indexOf('?') !== -1) {\n        url = url.substring(0, url.indexOf('?'));\n      }\n      const isModify = url.endsWith('update') || url.endsWith('delete') || url.endsWith('authz');\n      const isPreviewId = id < 1000;\n      if (this.preview && isModify && isPreviewId) {\n        throw new PreviewException('对不起，预览环境不允许修改此数据，如需体验请添加新数据');\n      }\n      await next();\n      return;\n    };\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/middleware/reset-passwd/middleware.ts",
    "content": "import { Autoload, Config, Init, Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { IMidwayKoaContext, IWebMiddleware, NextFunction } from '@midwayjs/koa';\nimport { CommonException } from '@certd/lib-server';\nimport { UserService } from '../../modules/sys/authority/service/user-service.js';\nimport { logger } from '@certd/basic';\nimport {UserSettingsService} from \"../../modules/mine/service/user-settings-service.js\";\n\n/**\n * 重置密码模式\n */\n@Provide()\n@Autoload()\n@Scope(ScopeEnum.Singleton)\nexport class ResetPasswdMiddleware implements IWebMiddleware {\n  @Inject()\n  userService: UserService;\n\n  @Inject()\n  userSettingsService: UserSettingsService;\n\n  @Config('system.resetAdminPasswd')\n  private resetAdminPasswd: boolean;\n  resolve() {\n    return async (ctx: IMidwayKoaContext, next: NextFunction) => {\n      if (this.resetAdminPasswd === true) {\n        throw new CommonException('1号管理员密码已修改为123456，当前为重置密码模式，无法响应请求，请关闭重置密码模式恢复正常服务');\n      }\n      await next();\n    };\n  }\n\n  @Init()\n  async init() {\n    if (this.resetAdminPasswd === true) {\n      logger.info('开始重置1号管理员用户的密码');\n      const newPasswd = '123456';\n      await this.userService.resetPassword(1, newPasswd);\n      await this.userService.updateStatus(1, 1);\n      await this.userSettingsService.deleteWhere({\n        userId: 1,\n        key:\"user.two.factor\"\n      })\n      const user = await this.userService.info(1);\n      logger.info(`重置1号管理员用户的密码完成，2FA设置已删除，用户名：${user.username},新密码：${newPasswd}，请在登录进去之后尽快修改密码`);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/auto/auto-a-init-site.ts",
    "content": "import { Autoload, Config, Init, Inject, Scope, ScopeEnum } from '@midwayjs/core';\nimport { logger } from '@certd/basic';\nimport { UserService } from '../sys/authority/service/user-service.js';\nimport { PlusService, SysInstallInfo, SysPrivateSettings, SysSettingsService } from '@certd/lib-server';\nimport { nanoid } from 'nanoid';\nimport crypto from 'crypto';\nimport {SafeService} from \"../sys/settings/safe-service.js\";\n\n@Autoload()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class AutoAInitSite {\n  @Inject()\n  userService: UserService;\n\n  @Config('typeorm.dataSource.default.type')\n  dbType: string;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n  @Inject()\n  plusService: PlusService;\n  @Inject()\n  safeService: SafeService;\n\n  @Init()\n  async init() {\n    logger.info('初始化站点开始');\n    await this.startOptimizeDb();\n    //安装信息\n    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);\n    if (!installInfo.siteId) {\n      installInfo.siteId = nanoid();\n      await this.sysSettingsService.saveSetting(installInfo);\n    }\n\n    //private信息\n    const privateInfo = await this.sysSettingsService.getSetting<SysPrivateSettings>(SysPrivateSettings);\n    if (!privateInfo.jwtKey) {\n      privateInfo.jwtKey = nanoid();\n      await this.sysSettingsService.saveSetting(privateInfo);\n    }\n\n    if (!privateInfo.encryptSecret) {\n      const secretKey = crypto.randomBytes(32);\n      privateInfo.encryptSecret = secretKey.toString('base64');\n      await this.sysSettingsService.saveSetting(privateInfo);\n    }\n\n    await this.sysSettingsService.backupSecret();\n\n    //加载一次密钥\n    await this.sysSettingsService.getSecret();\n\n    await this.sysSettingsService.reloadPrivateSettings();\n\n    // 授权许可\n    try {\n      await this.plusService.verify();\n    } catch (e) {\n      logger.error('授权许可验证失败', e);\n    }\n\n    //加载站点隐藏配置\n    await this.safeService.reloadHiddenStatus(true)\n    logger.info('初始化站点完成');\n  }\n\n  async startOptimizeDb() {\n    //优化数据库\n    //检查当前数据库类型为sqlite\n    if (this.dbType === 'better-sqlite3') {\n      const res = await this.userService.repository.query('PRAGMA auto_vacuum;');\n      if (!(res && res.length > 0 && res[0].auto_vacuum > 0)) {\n        //未开启自动优化\n        await this.userService.repository.query('PRAGMA auto_vacuum = INCREMENTAL;');\n        logger.info('sqlite数据库自动优化已开启');\n      }\n\n      const optimizeDb = async () => {\n        logger.info('sqlite数据库空间优化开始');\n        await this.userService.repository.query('VACUUM');\n        logger.info('sqlite数据库空间优化完成');\n      };\n      await optimizeDb();\n      setInterval(optimizeDb, 1000 * 60 * 60 * 24);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/auto/auto-b-load-plugins.ts",
    "content": "import { Autoload, Init, Inject, Scope, ScopeEnum } from \"@midwayjs/core\";\nimport { logger } from \"@certd/basic\";\nimport { PluginService } from \"../plugin/service/plugin-service.js\";\n\n@Autoload()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class AutoBLoadPlugins {\n  @Inject()\n  pluginService: PluginService;\n\n\n  @Init()\n  async init() {\n    logger.info('加载插件开始');\n    // await this.pluginService.registerFromLocal(\"./metadata\")\n    await import(\"../../plugins/index.js\")\n    await this.pluginService.registerFromDb()\n    logger.info('加载插件完成');\n\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/auto/auto-c-register-cron.ts",
    "content": "import {Autoload, Config, Init, Inject, Scope, ScopeEnum} from '@midwayjs/core';\nimport {PipelineService} from '../pipeline/service/pipeline-service.js';\nimport {logger} from '@certd/basic';\nimport {SysSettingsService, SysSiteInfo} from '@certd/lib-server';\nimport {SiteInfoService} from '../monitor/index.js';\nimport {Cron} from '../cron/cron.js';\nimport {UserSettingsService} from \"../mine/service/user-settings-service.js\";\nimport {UserSiteMonitorSetting} from \"../mine/service/models.js\";\nimport {getPlusInfo} from \"@certd/plus-core\";\nimport dayjs from \"dayjs\";\nimport {NotificationService} from \"../pipeline/service/notification-service.js\";\nimport {UserService} from \"../sys/authority/service/user-service.js\";\nimport {Between} from \"typeorm\";\n\n@Autoload()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class AutoCRegisterCron {\n  @Inject()\n  pipelineService: PipelineService;\n\n  @Config('cron.onlyAdminUser')\n  private onlyAdminUser: boolean;\n\n  @Config('cron.immediateTriggerOnce')\n  private immediateTriggerOnce = false;\n\n  @Config('cron.immediateTriggerSiteMonitor')\n  private immediateTriggerSiteMonitor = false;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n  @Inject()\n  userSettingsService: UserSettingsService;\n\n  @Inject()\n  siteInfoService: SiteInfoService;\n\n  @Inject()\n  cron: Cron;\n\n  @Inject()\n  notificationService: NotificationService;\n\n  @Inject()\n  userService: UserService;\n\n\n  @Init()\n  async init() {\n    logger.info('加载定时trigger开始');\n    await this.pipelineService.onStartup(this.immediateTriggerOnce, this.onlyAdminUser);\n    logger.info('加载定时trigger完成');\n    //\n    // const meta = getClassMetadata(CLASS_KEY, this.echoPlugin);\n    // console.log('meta', meta);\n    // const metas = listPropertyDataFromClass(CLASS_KEY, this.echoPlugin);\n    // console.log('metas', metas);\n    await this.registerSiteMonitorCron();\n\n\n    await this.registerPlusExpireCheckCron();\n\n    await this.registerUserExpireCheckCron()\n  }\n\n  async registerSiteMonitorCron() {\n    //先注册公共job\n    await this.siteInfoService.registerSiteMonitorJob()\n\n    //注册用户独立的检查时间\n    const monitorSettingList = await this.userSettingsService.list({\n      query:{\n        key: UserSiteMonitorSetting.__key__,\n      }\n    })\n    for (const item of monitorSettingList) {\n      const setting = item.setting ? JSON.parse(item.setting):{}\n      if(!setting?.cron){\n        continue\n      }\n      await this.siteInfoService.registerSiteMonitorJob(item.userId)\n    }\n\n    if (this.immediateTriggerSiteMonitor) {\n      logger.info(`立即触发一次站点证书检查任务`)\n      await this.siteInfoService.triggerJobOnce()\n    }\n  }\n\n  registerPlusExpireCheckCron(){\n    // 添加plus即将到期检查任务\n    this.cron.register({\n      name: 'plus-expire-check',\n      cron: `0 10 9 * * *`, // 一天只能检查一次，否则会重复发送通知\n      job: async () => {\n        const plusInfo = getPlusInfo()\n        if (!plusInfo.originVipType || plusInfo.originVipType===\"free\" ) {\n          return\n        }\n        let label =\"专业版\"\n        if( plusInfo.originVipType === 'comm'){\n          label = \"商业版\"\n        }\n        const siteInfo = await this.sysSettingsService.getSetting<SysSiteInfo>(SysSiteInfo)\n\n        const appTitle = siteInfo.title || \"certd\"\n        const expiresDate = dayjs(plusInfo.expireTime).format(\"YYYY-MM-DD\")\n        // plusInfo.expireTime= dayjs(\"2025-06-10\").valueOf()\n        let expiresDays =Math.floor((plusInfo.expireTime - new Date().getTime())/ 1000 / 60 / 60 / 24)\n        let title = \"\"\n        let content =\"\"\n        if(expiresDays === 20 ||expiresDays === 10 || expiresDays === 3 || expiresDays === 1 || expiresDays === 0){\n          title = `vip(${label})即将到期`\n          content = `您的${appTitle} vip (${label})剩余${expiresDays}天(${expiresDate})到期，请及时续期，以免影响业务`\n        }else if (expiresDays === -1 || expiresDays === -3 || expiresDays === -7) {\n          title = `vip(${label})已过期`\n          content = `您的${appTitle} vip (${label})已过期${Math.abs(expiresDays)}天(${expiresDate})，请尽快续期，以免影响业务`\n        }\n        if(title){\n          logger.warn(title)\n          logger.warn(content)\n          const url = await this.notificationService.getBindUrl(\"\");\n          const adminUsers = await this.userService.getAdmins()\n          for (const adminUser of adminUsers) {\n            logger.info(`发送vip到期通知给管理员：${adminUser.username}`)\n            await this.notificationService.send({\n              useDefault: true,\n              logger: logger,\n              body:{\n                title,\n                content,\n                errorMessage:title,\n                url\n              }\n            },adminUser.id)\n          }\n\n        }\n\n      }\n    })\n  }\n\n\n  registerUserExpireCheckCron() {\n    // 添加plus即将到期检查任务\n    this.cron.register({\n      name: 'user-expire-check',\n      cron: `0 20 9 * * *`, // 一天只能检查一次，否则会重复发送通知\n      job: async () => {\n\n        const getExpiresDaysUsers = async (days: number) => {\n          const targetDate = dayjs().add(days, 'day')\n          const startTime = targetDate.startOf('day').valueOf()\n          const endTime = targetDate.endOf('day').valueOf()\n          return await this.userService.find({\n            where: {\n              validTime: Between(startTime, endTime),\n              status: 1\n            }\n          })\n        }\n\n        const notifyExpiresDaysUsers = async (days: number) => {\n          const list = await getExpiresDaysUsers(days)\n          if (list.length === 0) {\n            return\n          }\n          let title = `账号即将到期`\n          let content = `您的账号剩余${days}天到期，请及时续期，以免影响业务`\n          if (days <= 0) {\n            title = `账号已过期`\n            content = `您的账号已过期${Math.abs(days)}天，请尽快续期，以免影响业务`\n          }\n          const url = await this.notificationService.getBindUrl(\"\");\n          for (const user of list) {\n            logger.info(`发送到期通知给用户：${user.username}`)\n            await this.notificationService.send({\n              useDefault: true,\n              logger: logger,\n              body: {\n                title,\n                content,\n                errorMessage: title,\n                url\n              }\n            }, user.id)\n          }\n        }\n\n        await notifyExpiresDaysUsers(7)\n        await notifyExpiresDaysUsers(3)\n        await notifyExpiresDaysUsers(1)\n        await notifyExpiresDaysUsers(0)\n        await notifyExpiresDaysUsers(-1)\n        await notifyExpiresDaysUsers(-3)\n      }\n    })\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/auto/auto-d-mitter-register.ts",
    "content": "import { logger, utils } from '@certd/basic';\nimport { UserSuiteService } from '@certd/commercial-core';\nimport { Autoload, Init, Inject, Scope, ScopeEnum } from '@midwayjs/core';\n\n@Autoload()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class AutoDMitterRegister {\n  @Inject()\n  userSuiteService: UserSuiteService;\n\n  @Init()\n  async init() {\n    await this.registerOnNewUser();\n  }\n  async registerOnNewUser() {\n    utils.mitter.on('register', async (req: { userId: number }) => {\n      logger.info('register event', req.userId);\n      await this.userSuiteService.presentGiftSuite(req.userId);\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/auto/auto-e-pipeline-emitter-register.ts",
    "content": "import { Autoload, Init, Inject, Scope, ScopeEnum } from \"@midwayjs/core\";\nimport { CertInfoService } from \"../monitor/index.js\";\nimport { pipelineEmitter } from \"@certd/pipeline\";\nimport { CertInfo, EVENT_CERT_APPLY_SUCCESS } from \"@certd/plugin-cert\";\nimport { PipelineEvent } from \"@certd/pipeline/dist/service/emit.js\";\n\n@Autoload()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class AutoEPipelineEmitterRegister {\n  @Inject()\n  certInfoService: CertInfoService;\n\n  @Init()\n  async init() {\n    await this.onCertApplySuccess();\n  }\n  async onCertApplySuccess() {\n    pipelineEmitter.on(EVENT_CERT_APPLY_SUCCESS, async (event: PipelineEvent<{cert:CertInfo,file:string}>) => {\n      await this.certInfoService.updateCertByPipelineId(event.pipeline.id, event.event.cert, event.event.file);\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/auto/auto-z.ts",
    "content": "import { App, Autoload, Config, Init, Inject, Scope, ScopeEnum } from '@midwayjs/core';\nimport { getPlusInfo, isPlus } from '@certd/plus-core';\nimport { isDev, logger } from '@certd/basic';\n\nimport { SysInstallInfo, SysSettingsService } from '@certd/lib-server';\nimport { getVersion } from '../../utils/version.js';\nimport dayjs from 'dayjs';\nimport { Application } from '@midwayjs/koa';\nimport { httpsServer, HttpsServerOptions } from './https/server.js';\n\n@Autoload()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class AutoZPrint {\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  @App()\n  app: Application;\n\n  @Config('https')\n  httpsConfig: HttpsServerOptions;\n\n  @Init()\n  async init() {\n    //监听https\n    this.startHttpsServer();\n    if (isDev()) {\n      this.startHeapLog();\n    }\n    const installInfo: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);\n    logger.info('=========================================');\n    logger.info('当前站点ID:', installInfo.siteId);\n    const version = await getVersion();\n    logger.info(`当前版本:${version}`);\n    const plusInfo = getPlusInfo();\n    if (isPlus()) {\n      logger.info(`授权信息:${plusInfo.vipType},${dayjs(plusInfo.expireTime).format('YYYY-MM-DD')}`);\n    }\n    logger.info('Certd已启动');\n    logger.info('=========================================');\n  }\n\n  startHeapLog() {\n    function format(bytes: any) {\n      return (bytes / 1024 / 1024).toFixed(2) + ' MB';\n    }\n    setInterval(() => {\n      const mu = process.memoryUsage();\n      logger.info(`rss:${format(mu.rss)},heapUsed: ${format(mu.heapUsed)},heapTotal: ${format(mu.heapTotal)},external: ${format(mu.external)}`);\n    }, 60000);\n  }\n\n  startHttpsServer() {\n    if (!this.httpsConfig.enabled) {\n      logger.info('Https server is not enabled');\n      return;\n    }\n    httpsServer.start({\n      ...this.httpsConfig,\n      app: this.app,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/auto/https/self-certificate.ts",
    "content": "import { logger } from '@certd/basic';\nimport fs from 'fs';\n// @ts-ignore\nimport forge from 'node-forge';\nimport path from 'path';\n\nexport function createSelfCertificate(opts: { crtPath: string; keyPath: string }) {\n  // 生成密钥对\n  const keypair = forge.pki.rsa.generateKeyPair(2048);\n\n  // 创建自签名证书\n  const cert = forge.pki.createCertificate();\n  cert.publicKey = keypair.publicKey;\n  cert.serialNumber = '01';\n  cert.validFrom = new Date(Date.now() - 1000 * 60 * 60 * 24).toISOString(); // 1天前\n  cert.validTo = new Date(Date.now() + 1000 * 60 * 60 * 24 * 365 * 10).toISOString(); // 10年后\n  // 创建主题\n  const attrs = [\n    {\n      name: 'commonName',\n      value: 'self-certificate.certd', // 或者你的域名\n    },\n  ];\n  cert.setSubject(attrs);\n  cert.setIssuer(attrs);\n  cert.sign(keypair.privateKey, forge.md.sha256.create());\n\n  // 导出证书和私钥\n  const pemCert = forge.pki.certificateToPem(cert);\n  const pemKey = forge.pki.privateKeyToPem(keypair.privateKey);\n\n  // 写入文件\n  logger.info('生成自签名证书成功');\n  logger.info(`自签证书保存路径: ${opts.crtPath}`);\n  logger.info(`自签私钥保存路径: ${opts.keyPath}`);\n  const crtDir = path.dirname(opts.crtPath);\n  if (!fs.existsSync(crtDir)) {\n    fs.mkdirSync(crtDir, { recursive: true });\n  }\n  const keyDir = path.dirname(opts.keyPath);\n  if (!fs.existsSync(keyDir)) {\n    fs.mkdirSync(keyDir, { recursive: true });\n  }\n  fs.writeFileSync(opts.crtPath, pemCert);\n  fs.writeFileSync(opts.keyPath, pemKey);\n\n  return {\n    crtPath: opts.crtPath,\n    keyPath: opts.keyPath,\n    crt: pemCert,\n    key: pemKey,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/auto/https/server.ts",
    "content": "import https from 'node:https';\nimport fs from 'fs';\nimport { Application } from '@midwayjs/koa';\nimport { createSelfCertificate } from './self-certificate.js';\nimport {logger, safePromise} from '@certd/basic';\n\nexport type HttpsServerOptions = {\n  enabled: boolean;\n  app?: Application;\n  port: number;\n  key: string;\n  cert: string;\n};\n\nexport class HttpsServer {\n  server: https.Server;\n  opts: HttpsServerOptions;\n  constructor() {}\n\n  async restart() {\n    await this.close();\n    return this.start(this.opts);\n  }\n\n  async close() {\n    return safePromise((resolve, reject) => {\n      this.server.close(() => {\n        resolve(true);\n      });\n    });\n  }\n\n  start(opts: HttpsServerOptions) {\n    if (!opts) {\n      logger.error('https配置不能为空');\n      return;\n    }\n    this.opts = opts;\n    logger.info('=========================================');\n    if (!opts.key || !opts.cert) {\n      logger.error('证书路径未配置，无法启动https服务，请先配置：koa.https.key和koa.https.cert');\n      return;\n    }\n\n    if (!fs.existsSync(opts.key) || !fs.existsSync(opts.cert)) {\n      logger.info('证书文件不存在,将生成自签名证书');\n      createSelfCertificate({\n        crtPath: opts.cert,\n        keyPath: opts.key,\n      });\n    }\n    logger.info('准备启动https服务');\n    const httpServer = https.createServer(\n      {\n        cert: fs.readFileSync(opts.cert),\n        key: fs.readFileSync(opts.key),\n      },\n      opts.app.callback()\n    );\n    this.server = httpServer;\n    const hostname = '::';\n    // A function that runs in the context of the http server\n    // and reports what type of server listens on which port\n    function listeningReporter() {\n      // `this` refers to the http server here\n      logger.info(`Https server is listening on https://${hostname}:${opts.port}`);\n    }\n\n    try {\n      httpServer.listen(opts.port, hostname, listeningReporter);\n      return httpServer;\n    } catch (e) {\n      logger.error('启动https服务失败', e);\n    }\n  }\n}\n\nexport const httpsServer = new HttpsServer();\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/basic/service/code-service.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { cache, isDev, randomNumber } from '@certd/basic';\nimport { SysSettingsService, SysSiteInfo } from '@certd/lib-server';\nimport { SmsServiceFactory } from '../sms/factory.js';\nimport { ISmsService } from '../sms/api.js';\nimport { CodeErrorException } from '@certd/lib-server/dist/basic/exception/code-error-exception.js';\nimport { EmailService } from './email-service.js';\nimport { AccessService } from '@certd/lib-server';\nimport { AccessSysGetter } from '@certd/lib-server';\nimport { isComm } from '@certd/plus-core';\n\n// {data: '<svg.../svg>', text: 'abcd'}\n/**\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class CodeService {\n  @Inject()\n  sysSettingsService: SysSettingsService;\n  @Inject()\n  emailService: EmailService;\n\n  @Inject()\n  accessService: AccessService;\n\n  /**\n   */\n  async generateCaptcha(randomStr) {\n    const svgCaptcha = await import('svg-captcha');\n    const c = svgCaptcha.create();\n    //{data: '<svg.../svg>', text: 'abcd'}\n    const imgCode = c.text; // = RandomUtil.randomStr(4, true);\n    cache.set('imgCode:' + randomStr, imgCode, {\n      ttl: 2 * 60 * 1000, //过期时间 2分钟\n    });\n    return c;\n  }\n\n  async getCaptchaText(randomStr) {\n    return cache.get('imgCode:' + randomStr);\n  }\n\n  async removeCaptcha(randomStr) {\n    cache.delete('imgCode:' + randomStr);\n  }\n\n  async checkCaptcha(randomStr: string, userCaptcha: string) {\n    const code = await this.getCaptchaText(randomStr);\n    if (code == null) {\n      throw new Error('验证码已过期');\n    }\n    if (code.toLowerCase() !== userCaptcha.toLowerCase()) {\n      throw new Error('验证码不正确');\n    }\n    await this.removeCaptcha(randomStr);\n    return true;\n  }\n  /**\n   */\n  async sendSmsCode(phoneCode = '86', mobile: string, randomStr: string) {\n    if (!mobile) {\n      throw new Error('手机号不能为空');\n    }\n    if (!randomStr) {\n      throw new Error('randomStr不能为空');\n    }\n\n    const sysSettings = await this.sysSettingsService.getPrivateSettings();\n    if (!sysSettings.sms?.config?.accessId) {\n      throw new Error('当前站点还未配置短信');\n    }\n    const smsType = sysSettings.sms.type;\n    const smsConfig = sysSettings.sms.config;\n    const sender: ISmsService = SmsServiceFactory.createSmsService(smsType);\n    const accessGetter = new AccessSysGetter(this.accessService);\n    sender.setCtx({\n      accessService: accessGetter,\n      config: smsConfig,\n    });\n    const smsCode = randomNumber(4);\n    await sender.sendSmsCode({\n      mobile,\n      code: smsCode,\n      phoneCode,\n    });\n\n    const key = this.buildSmsCodeKey(phoneCode, mobile, randomStr);\n    cache.set(key, smsCode, {\n      ttl: 5 * 60 * 1000, //5分钟\n    });\n    return smsCode;\n  }\n\n  /**\n   */\n  async sendEmailCode(email: string, randomStr: string) {\n    if (!email) {\n      throw new Error('Email不能为空');\n    }\n    if (!randomStr) {\n      throw new Error('randomStr不能为空');\n    }\n\n    let siteTitle = 'Certd';\n    if (isComm()) {\n      const siteInfo = await this.sysSettingsService.getSetting<SysSiteInfo>(SysSiteInfo);\n      if (siteInfo) {\n        siteTitle = siteInfo.title || siteTitle;\n      }\n    }\n\n    const code = randomNumber(4);\n    await this.emailService.send({\n      subject: `【${siteTitle}】验证码`,\n      content: `您的验证码是${code}，请勿泄露`,\n      receivers: [email],\n    });\n\n    const key = this.buildEmailCodeKey(email, randomStr);\n    cache.set(key, code, {\n      ttl: 5 * 60 * 1000, //5分钟\n    });\n    return code;\n  }\n\n  /**\n   * checkSms\n   */\n  async checkSmsCode(opts: { mobile: string; phoneCode: string; smsCode: string; randomStr: string; throwError: boolean }) {\n    const key = this.buildSmsCodeKey(opts.phoneCode, opts.mobile, opts.randomStr);\n    if (isDev()) {\n      return true;\n    }\n    return this.checkValidateCode(key, opts.smsCode, opts.throwError);\n  }\n\n  buildSmsCodeKey(phoneCode: string, mobile: string, randomStr: string) {\n    return `sms:${phoneCode}${mobile}:${randomStr}`;\n  }\n\n  buildEmailCodeKey(email: string, randomStr: string) {\n    return `email:${email}:${randomStr}`;\n  }\n  checkValidateCode(key: string, userCode: string, throwError = true) {\n    //验证图片验证码\n    const code = cache.get(key);\n    if (code == null || code !== userCode) {\n      if (throwError) {\n        throw new CodeErrorException('验证码错误');\n      }\n      return false;\n    }\n    cache.delete(key);\n    return true;\n  }\n\n  checkEmailCode(opts: { randomStr: string; validateCode: string; email: string; throwError: boolean }) {\n    const key = this.buildEmailCodeKey(opts.email, opts.randomStr);\n    return this.checkValidateCode(key, opts.validateCode, opts.throwError);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/basic/service/email-service.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport type { EmailSend } from '@certd/pipeline';\nimport { IEmailService } from '@certd/pipeline';\n\nimport { logger } from '@certd/basic';\nimport { isComm, isPlus } from '@certd/plus-core';\n\nimport nodemailer from 'nodemailer';\nimport { SendMailOptions } from 'nodemailer';\nimport { UserSettingsService } from '../../mine/service/user-settings-service.js';\nimport { PlusService, SysSettingsService, SysSiteInfo } from '@certd/lib-server';\nimport { getEmailSettings } from '../../sys/settings/fix.js';\nimport { UserEmailSetting } from \"../../mine/service/models.js\";\n\nexport type EmailConfig = {\n  host: string;\n  port: number;\n  auth: {\n    user: string;\n    pass: string;\n  };\n  secure: boolean; // use TLS\n  tls: {\n    // do not fail on invalid certs\n    rejectUnauthorized: boolean;\n  };\n  sender: string;\n  usePlus?: boolean;\n} & SendMailOptions;\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class EmailService implements IEmailService {\n  @Inject()\n  settingsService: UserSettingsService;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n  @Inject()\n  plusService: PlusService;\n\n  async sendByPlus(email: EmailSend) {\n    if (!isPlus()) {\n      throw new Error('plus not enabled');\n    }\n\n    /**\n     *  userId: number;\n     *   subject: string;\n     *   content: string;\n     *   receivers: string[];\n     */\n\n    await this.plusService.sendEmail(email);\n  }\n\n  /**\n   */\n  async send(email: EmailSend) {\n    logger.info('sendEmail', email);\n\n    if (!email.receivers || email.receivers.length === 0) {\n      throw new Error('收件人不能为空');\n    }\n\n    const emailConf = await getEmailSettings(this.sysSettingsService, this.settingsService);\n\n    if (!emailConf.host && emailConf.usePlus == null) {\n      if (isPlus()) {\n        //自动使用plus发邮件\n        return await this.sendByPlus(email);\n      }\n      throw new Error('邮件服务器还未设置');\n    }\n\n    if (emailConf.usePlus && isPlus()) {\n      return await this.sendByPlus(email);\n    }\n    await this.sendByCustom(emailConf, email);\n    logger.info('sendEmail complete: ', email);\n  }\n\n  private async sendByCustom(emailConfig: EmailConfig, email: EmailSend) {\n    const transporter = nodemailer.createTransport(emailConfig);\n\n    let sysTitle = 'Certd';\n    if (isComm()) {\n      const siteInfo = await this.sysSettingsService.getSetting<SysSiteInfo>(SysSiteInfo);\n      if (siteInfo) {\n        sysTitle = siteInfo.title || sysTitle;\n      }\n    }\n    let subject = email.subject;\n    if (!subject.includes(`【${sysTitle}】`)) {\n      subject = `【${sysTitle}】${subject}`;\n    }\n    const mailOptions = {\n      from: `${sysTitle} <${emailConfig.sender}>`,\n      to: email.receivers.join(', '), // list of receivers\n      subject: subject,\n      text: email.content,\n      html: email.html,\n      attachments: email.attachments,\n    };\n    await transporter.sendMail(mailOptions);\n  }\n\n  async test(userId: number, receiver: string) {\n    await this.send({\n      receivers: [receiver],\n      subject: '测试邮件,from certd',\n      content: '测试邮件,from certd',\n    });\n  }\n\n  async list(userId: any) {\n      const userEmailSetting = await  this.settingsService.getSetting<UserEmailSetting>(userId,UserEmailSetting)\n      return userEmailSetting.list;\n  }\n\n  async delete(userId: any, email: string) {\n    const userEmailSetting = await  this.settingsService.getSetting<UserEmailSetting>(userId,UserEmailSetting)\n    userEmailSetting.list = userEmailSetting.list.filter(item=>item !== email);\n    await this.settingsService.saveSetting(userId,userEmailSetting)\n  }\n  async add(userId: any, email: string) {\n    const userEmailSetting = await  this.settingsService.getSetting<UserEmailSetting>(userId,UserEmailSetting)\n    //如果已存在\n    if(userEmailSetting.list.includes(email)){\n      return\n    }\n    userEmailSetting.list.unshift(email)\n    await this.settingsService.saveSetting(userId,userEmailSetting)\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/basic/sms/aliyun-sms.ts",
    "content": "import { logger } from '@certd/basic';\nimport { ISmsService, PluginInputs, SmsPluginCtx } from './api.js';\nimport { AliyunAccess, AliyunClient } from '@certd/plugin-lib';\n\nexport type AliyunSmsConfig = {\n  accessId: string;\n  signName: string;\n  codeTemplateId: string;\n};\n\nexport class AliyunSmsService implements ISmsService {\n  static getDefine() {\n    return {\n      name: 'aliyun',\n      desc: '阿里云短信服务',\n      input: {\n        accessId: {\n          title: '阿里云授权',\n          component: {\n            name: 'access-selector',\n            type: 'aliyun',\n          },\n          required: true,\n        },\n        signName: {\n          title: '签名',\n          component: {\n            name: 'a-input',\n            vModel: 'value',\n          },\n          required: true,\n        },\n        codeTemplateId: {\n          title: '验证码模板Id',\n          component: {\n            name: 'a-input',\n            vModel: 'value',\n          },\n          required: true,\n        },\n      } as PluginInputs<AliyunSmsConfig>,\n    };\n  }\n\n  ctx: SmsPluginCtx<AliyunSmsConfig>;\n\n  setCtx(ctx: any) {\n    this.ctx = ctx;\n  }\n\n  async sendSmsCode(opts: { mobile: string; code: string; phoneCode: string }) {\n    const { mobile, code, phoneCode } = opts;\n    const access = await this.ctx.accessService.getById<AliyunAccess>(this.ctx.config.accessId);\n    const aliyunClinet = new AliyunClient({ logger });\n    await aliyunClinet.init({\n      accessKeyId: access.accessKeyId,\n      accessKeySecret: access.accessKeySecret,\n      endpoint: 'https://dysmsapi.aliyuncs.com',\n      apiVersion: '2017-05-25',\n    });\n    const smsConfig = this.ctx.config;\n    const phoneNumber = phoneCode + mobile;\n    const params = {\n      PhoneNumbers: phoneNumber,\n      SignName: smsConfig.signName,\n      TemplateCode: smsConfig.codeTemplateId,\n      TemplateParam: `{\"code\":\"${code}\"}`,\n    };\n\n    await aliyunClinet.request('SendSms', params);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/basic/sms/api.ts",
    "content": "import { FormItemProps, IAccessService } from '@certd/pipeline';\n\nexport interface ISmsService {\n  sendSmsCode(opts: { mobile: string; code: string; phoneCode: string }): Promise<void>;\n  setCtx(ctx: { accessService: IAccessService; config: { [key: string]: any } }): void;\n}\n\nexport type PluginInputs<T = any> = {\n  [key in keyof T]: FormItemProps;\n};\n\nexport type SmsPluginCtx<T = any> = {\n  accessService: IAccessService;\n  config: T;\n};\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/basic/sms/factory.ts",
    "content": "import { AliyunSmsService } from './aliyun-sms.js';\nimport { YfySmsService } from './yfy-sms.js';\n\nexport class SmsServiceFactory {\n  static createSmsService(type: string) {\n    const cls = this.GetClassByType(type);\n    return new cls();\n  }\n\n  static GetClassByType(type: string) {\n    switch (type) {\n      case 'aliyun':\n        return AliyunSmsService;\n      case 'yfysms':\n        return YfySmsService;\n      default:\n        throw new Error('不支持的短信服务类型');\n    }\n  }\n\n  static getDefine(type: string) {\n    const cls = this.GetClassByType(type);\n    return cls.getDefine();\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/basic/sms/yfy-sms.ts",
    "content": "import { http, utils } from '@certd/basic';\nimport { ISmsService, PluginInputs, SmsPluginCtx } from './api.js';\nimport { YfySmsAccess } from '@certd/plugin-plus';\n\nexport type YfySmsConfig = {\n  accessId: string;\n  signName: string;\n};\n\nexport class YfySmsService implements ISmsService {\n  static getDefine() {\n    return {\n      name: 'yfysms',\n      desc: '易发云短信',\n      input: {\n        accessId: {\n          title: '易发云短信授权',\n          component: {\n            name: 'access-selector',\n            type: 'yfysms',\n          },\n          required: true,\n        },\n        signName: {\n          title: '签名',\n          component: {\n            name: 'a-input',\n            vModel: 'value',\n          },\n          required: true,\n        },\n      } as PluginInputs<YfySmsConfig>,\n    };\n  }\n\n  ctx: SmsPluginCtx<YfySmsConfig>;\n\n  setCtx(ctx: any) {\n    this.ctx = ctx;\n  }\n\n  async sendSmsCode(opts: { mobile: string; code: string; phoneCode: string }) {\n    const { mobile, code } = opts;\n    const access = await this.ctx.accessService.getById<YfySmsAccess>(this.ctx.config.accessId);\n\n    const res = await http.request({\n      url: 'http://sms.yfyidc.cn/sms/',\n      method: 'post',\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n      },\n      data: {\n        /**\n         * u\t是\tKeyID\n         * p\t是\tKeySecret，需要md5\n         * m\t是\t发送手机号码\n         * c\n         */\n        u: access.keyId,\n        p: utils.hash.md5(access.keySecret),\n        m: mobile,\n        c: `【${this.ctx.config.signName}】您的验证码是${code}。如非本人操作，请忽略本短信`,\n      },\n    });\n    if (res !== 0) {\n      /**\n       * 1\t余额不足\n       * 2\t用户不存在\n       * 3\tKEY错误\n       * 4\t发送失败\n       * 5\t签名不存在\n       * 6\t签名审核未通过\n       * 7\t当前发信短信已达到上限\n       * 8\t有违规词\n       * 9\t用户已封禁\n       * 10\t未实名认证\n       */\n      let message = '';\n      switch (res) {\n        case 1:\n          message = '余额不足';\n          break;\n        case 2:\n          message = '用户不存在';\n          break;\n        case 3:\n          message = 'KEY错误';\n          break;\n        case 4:\n          message = '发送失败';\n          break;\n        case 5:\n          message = '签名不存在';\n          break;\n        case 6:\n          message = '签名审核未通过';\n          break;\n        case 7:\n          message = '当前发信短信已达到上限';\n          break;\n        case 8:\n          message = '有违规词';\n          break;\n        case 9:\n          message = '用户已封禁';\n          break;\n        case 10:\n          message = '未实名认证';\n          break;\n        default:\n          message = '未知错误';\n      }\n      throw new Error(`发送短信失败:${message}`);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/cert/entity/domain.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n/**\n * 域名管理\n */\n@Entity('cd_domain')\nexport class DomainEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column({ comment: '用户ID', name: 'user_id' })\n  userId: number;\n\n  @Column({ comment: '主域名', length: 100 })\n  domain: string;\n\n  @Column({ comment: '校验类型', name: 'challenge_type', length: 50 })\n  challengeType : string;\n\n  @Column({ comment: 'DNS提供商', name: 'dns_provider_type', length: 50 })\n  dnsProviderType: string;\n\n  @Column({ comment: 'DNS提供商授权', name: 'dns_provider_access' })\n  dnsProviderAccess: number;\n\n  @Column({ comment: '是否禁用', name: 'disabled' })\n  disabled: boolean;\n\n\n  @Column({ comment: 'http上传类型', name: 'http_uploader_type', length: 50 })\n  httpUploaderType: string;\n\n  @Column({ comment: 'http上传授权', name: 'http_uploader_access' })\n  httpUploaderAccess: number;\n\n  @Column({ comment: 'http上传根目录', name: 'http_upload_root_dir', length: 512 })\n  httpUploadRootDir: string;\n\n  @Column({\n    comment: '创建时间',\n    name: 'create_time',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    comment: '修改时间',\n    name: 'update_time',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/cert/service/domain-service.ts",
    "content": "import {Inject, Provide, Scope, ScopeEnum} from '@midwayjs/core';\nimport {InjectEntityModel} from '@midwayjs/typeorm';\nimport {In, Not, Repository} from 'typeorm';\nimport {AccessService, BaseService} from '@certd/lib-server';\nimport {DomainEntity} from '../entity/domain.js';\nimport {SubDomainService} from \"../../pipeline/service/sub-domain-service.js\";\nimport {DomainParser} from \"@certd/plugin-cert/dist/dns-provider/domain-parser.js\";\nimport {DomainVerifiers} from \"@certd/plugin-cert\";\nimport { SubDomainsGetter } from '../../pipeline/service/getter/sub-domain-getter.js';\nimport { CnameRecordService } from '../../cname/service/cname-record-service.js';\nimport { CnameRecordEntity } from \"../../cname/entity/cname-record.js\";\n\n\n/**\n *\n */\n@Provide()\n@Scope(ScopeEnum.Request, {allowDowngrade: true})\nexport class DomainService extends BaseService<DomainEntity> {\n  @InjectEntityModel(DomainEntity)\n  repository: Repository<DomainEntity>;\n\n  @Inject()\n  accessService: AccessService;\n  @Inject()\n  subDomainService: SubDomainService;\n\n  @Inject()\n  cnameRecordService: CnameRecordService;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async add(param) {\n    if (param.userId == null ){\n      throw new Error('userId 不能为空');\n    }\n    if (!param.domain) {\n      throw new Error('domain 不能为空');\n    }\n    const old = await this.repository.findOne({\n      where: {\n        domain: param.domain,\n        userId: param.userId\n      }\n    });\n    if (old) {\n      throw new Error(`域名（${param.domain}）不能重复`);\n    }\n    return await super.add(param);\n  }\n\n  async update(param) {\n    if (!param.id) {\n      throw new Error('id 不能为空');\n    }\n    const old = await this.info(param.id)\n    if (!old) {\n      throw new Error('domain记录不存在');\n    }\n\n    const same = await this.repository.findOne({\n      where: {\n        domain: param.domain,\n        userId: old.userId,\n        id: Not(param.id)\n      }\n    });\n\n    if (same) {\n      throw new Error(`域名（${param.domain}）不能重复`);\n    }\n    delete param.userId\n    return await super.update(param);\n\n\n  }\n\n  /**\n   *\n   * @param userId\n   * @param domains //去除* 且去重之后的域名列表\n   */\n  async getDomainVerifiers(userId: number, domains: string[]):Promise<DomainVerifiers> {\n\n    const mainDomainMap:Record<string, string> = {}\n    const subDomainGetter = new SubDomainsGetter(userId, this.subDomainService)\n    const domainParser = new DomainParser(subDomainGetter)\n\n    const mainDomains = []\n    for (const domain of domains) {\n      const mainDomain = await domainParser.parse(domain);\n      mainDomainMap[domain] = mainDomain;\n      mainDomains.push(mainDomain)\n    }\n\n    //匹配DNS记录\n    let allDomains = [...domains,...mainDomains]\n    //去重\n    allDomains = [...new Set(allDomains)]\n\n    //从 domain 表中获取配置\n    const domainRecords = await this.find({\n      where: {\n        domain: In(allDomains),\n        userId,\n        disabled:false,\n      }\n    })\n\n    const dnsMap = domainRecords.filter(item=>item.challengeType === 'dns').reduce((pre, item) => {\n      pre[item.domain] = item\n      return pre\n    }, {})\n\n    const httpMap = domainRecords.filter(item=>item.challengeType === 'http').reduce((pre, item) => {\n      pre[item.domain] = item\n      return pre\n    }, {})\n\n\n    //从cname record表中获取配置\n    const cnameRecords = await this.cnameRecordService.find({\n      where: {\n        domain: In(allDomains),\n        userId,\n        status: \"valid\",\n      }\n    })\n\n    const cnameMap = cnameRecords.reduce((pre, item) => {\n      pre[item.domain] = item\n      return pre\n    }, {})\n\n    //构建域名验证计划\n    const domainVerifiers:DomainVerifiers = {}\n\n    for (const domain of domains) {\n      const mainDomain = mainDomainMap[domain]\n\n      const dnsRecord = dnsMap[mainDomain]\n      if (dnsRecord) {\n        domainVerifiers[domain] = {\n          domain,\n          mainDomain,\n          type: 'dns',\n          dns: {\n            dnsProviderType: dnsRecord.dnsProviderType,\n            dnsProviderAccessId: dnsRecord.dnsProviderAccess\n          }\n        }\n        continue\n      }\n      const cnameRecord:CnameRecordEntity = cnameMap[domain]\n      if (cnameRecord) {\n        domainVerifiers[domain] = {\n          domain,\n          mainDomain,\n          type: 'cname',\n          cname: {\n            domain: cnameRecord.domain,\n            hostRecord: cnameRecord.hostRecord,\n            recordValue: cnameRecord.recordValue\n          }\n        }\n        continue\n      }\n      const httpRecord = httpMap[domain]\n      if (httpRecord) {\n        domainVerifiers[domain] = {\n          domain,\n          mainDomain,\n          type: 'http',\n          http: {\n            httpUploaderType: httpRecord.httpUploaderType,\n            httpUploaderAccess: httpRecord.httpUploaderAccess,\n            httpUploadRootDir: httpRecord.httpUploadRootDir\n          }\n        }\n         continue\n      }\n      domainVerifiers[domain] = null\n    }\n\n    return domainVerifiers;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/cname/entity/cname-provider.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n/**\n * cname配置\n */\n@Entity('cd_cname_provider')\nexport class CnameProviderEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n  @Column({ comment: 'userId', name: 'user_id' })\n  userId: number;\n  @Column({ comment: '域名', length: 100 })\n  domain: string;\n  @Column({ comment: 'DNS提供商类型', name: 'dns_provider_type', length: 20 })\n  dnsProviderType: string;\n  @Column({ comment: 'DNS授权Id', name: 'access_id' })\n  accessId: number;\n  @Column({ comment: '是否默认', name: 'is_default' })\n  isDefault: boolean;\n  @Column({ comment: '是否禁用', name: 'disabled' })\n  disabled: boolean;\n  @Column({ comment: '备注', length: 200 })\n  remark: string;\n\n  @Column({\n    comment: '创建时间',\n    name: 'create_time',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    comment: '修改时间',\n    name: 'update_time',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n\n  title: string;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/cname/entity/cname-record.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\nexport type CnameRecordStatusType = 'cname' | 'validating' | 'valid' | 'error' | 'timeout';\n/**\n * cname record配置\n */\n@Entity('cd_cname_record')\nexport class CnameRecordEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column({ comment: '用户ID', name: 'user_id' })\n  userId: number;\n\n  @Column({ comment: '证书申请域名', length: 100 })\n  domain: string;\n\n  @Column({ comment: '主机记录', name: 'host_record', length: 100 })\n  hostRecord: string;\n\n  @Column({ comment: '记录值', name: 'record_value', length: 200 })\n  recordValue: string;\n\n  @Column({ comment: 'CNAME提供者', name: 'cname_provider_id' })\n  cnameProviderId: number;\n\n  @Column({ comment: '验证状态', length: 20 })\n  status: string;\n\n  @Column({ comment: '错误信息' })\n  error: string\n\n  @Column({\n    comment: '创建时间',\n    name: 'create_time',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    comment: '修改时间',\n    name: 'update_time',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/cname/service/cname-provider-service.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { InjectEntityModel } from '@midwayjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { BaseService, ListReq, SysPrivateSettings, SysSettingsService, ValidateException } from '@certd/lib-server';\nimport { CnameProviderEntity } from '../entity/cname-provider.js';\nimport { CommonProviders } from './common-provider.js';\n\n/**\n * 授权\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class CnameProviderService extends BaseService<CnameProviderEntity> {\n  @InjectEntityModel(CnameProviderEntity)\n  repository: Repository<CnameProviderEntity>;\n\n  @Inject()\n  settingsService: SysSettingsService;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async getDefault() {\n    return await this.repository.findOne({ where: { isDefault: true, disabled: false } });\n  }\n  /**\n   * 新增\n   * @param param 数据\n   */\n  async add(param: any) {\n    const def = await this.getDefault();\n    if (!def) {\n      param.isDefault = true;\n    }\n    const res = await super.add(param);\n    if (param.isDefault) {\n      await this.setDefault(res.id);\n    }\n    return res;\n  }\n\n  /**\n   * 修改\n   * @param param 数据\n   */\n  async update(param: any) {\n    await super.update(param);\n    if (param.isDefault) {\n      await this.setDefault(param.id);\n    }\n  }\n\n  //@ts-ignore\n  async delete(ids: any) {\n    if (!ids) {\n      return;\n    }\n    if (!(ids instanceof Array)) {\n      ids = [ids];\n    }\n    for (const id of ids) {\n      const info = await this.info(id);\n      if (info.isDefault) {\n        throw new ValidateException('默认的CNAME服务不能删除，请先修改为非默认值');\n      }\n    }\n    await super.delete(ids);\n  }\n\n  async setDefault(id: number) {\n    await this.transaction(async em => {\n      await em.getRepository(CnameProviderEntity).update({ isDefault: true }, { isDefault: false });\n      await em.getRepository(CnameProviderEntity).update({ id }, { isDefault: true });\n    });\n  }\n\n  async setDisabled(id: number, disabled: boolean) {\n    await this.repository.update({ id }, { disabled });\n  }\n\n  async getByPriority() {\n    const def = await this.getDefault();\n    if (def) {\n      return def;\n    }\n    const founds = await this.repository.find({ take: 1, order: { createTime: 'DESC' }, where: { disabled: false } });\n    if (founds && founds.length > 0) {\n      return founds[0];\n    }\n\n    const sysPrivateSettings = await this.settingsService.getSetting<SysPrivateSettings>(SysPrivateSettings);\n\n    if (sysPrivateSettings.commonCnameEnabled !== false && CommonProviders.length > 0) {\n      return CommonProviders[0] as CnameProviderEntity;\n    }\n    return null;\n  }\n\n  async list(req: ListReq): Promise<any[]> {\n    const list = await super.list(req);\n    const sysPrivateSettings = await this.settingsService.getSetting<SysPrivateSettings>(SysPrivateSettings);\n\n    if (sysPrivateSettings.commonCnameEnabled !== false) {\n      return [...list, ...CommonProviders];\n    }\n    return list;\n  }\n\n  async info(id: any, infoIgnoreProperty?: any): Promise<any | null> {\n    if (id < 0) {\n      //使用公共provider\n      return CommonProviders.find(p => p.id === id);\n    }\n    return await super.info(id, infoIgnoreProperty);\n  }\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/cname/service/cname-record-service.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from \"@midwayjs/core\";\nimport { InjectEntityModel } from \"@midwayjs/typeorm\";\nimport { Repository } from \"typeorm\";\nimport {\n  AccessService,\n  BaseService,\n  PlusService,\n  SysInstallInfo,\n  SysSettingsService,\n  ValidateException\n} from \"@certd/lib-server\";\nimport { CnameRecordEntity, CnameRecordStatusType } from \"../entity/cname-record.js\";\nimport { createDnsProvider, IDnsProvider } from \"@certd/plugin-cert\";\nimport { CnameProvider, CnameRecord } from \"@certd/pipeline\";\nimport { cache, http, isDev, logger, utils } from \"@certd/basic\";\nimport { getAuthoritativeDnsResolver, walkTxtRecord } from \"@certd/acme-client\";\nimport { CnameProviderService } from \"./cname-provider-service.js\";\nimport { CnameProviderEntity } from \"../entity/cname-provider.js\";\nimport { CommonDnsProvider } from \"./common-provider.js\";\nimport { DomainParser } from \"@certd/plugin-cert/dist/dns-provider/domain-parser.js\";\nimport punycode from \"punycode.js\";\nimport { SubDomainService } from \"../../pipeline/service/sub-domain-service.js\";\nimport { SubDomainsGetter } from \"../../pipeline/service/getter/sub-domain-getter.js\";\n\ntype CnameCheckCacheValue = {\n  validating: boolean;\n  pass: boolean;\n  recordReq?: any;\n  recordRes?: any;\n  startTime: number;\n  intervalId?: NodeJS.Timeout;\n  dnsProvider?: IDnsProvider;\n};\n\n/**\n * 授权\n */\n@Provide()\n@Scope(ScopeEnum.Request, {allowDowngrade: true})\nexport class CnameRecordService extends BaseService<CnameRecordEntity> {\n  @InjectEntityModel(CnameRecordEntity)\n  repository: Repository<CnameRecordEntity>;\n\n  @Inject()\n  cnameProviderService: CnameProviderService;\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  @Inject()\n  accessService: AccessService;\n\n  @Inject()\n  plusService: PlusService;\n\n  @Inject()\n  subDomainService: SubDomainService;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  /**\n   * 新增\n   * @param param 数据\n   */\n  async add(param: any): Promise<CnameRecordEntity> {\n    if (!param.domain) {\n      throw new ValidateException('域名不能为空');\n    }\n    if (!param.userId) {\n      throw new ValidateException('userId不能为空');\n    }\n    if (param.domain.startsWith('*.')) {\n      param.domain = param.domain.substring(2);\n    }\n    param.domain = param.domain.trim()\n    const info = await this.getRepository().findOne({where: {domain: param.domain, userId: param.userId}});\n    if (info) {\n      return info;\n    }\n\n    let cnameProvider: CnameProviderEntity = null;\n    if (!param.cnameProviderId) {\n      //获取默认的cnameProviderId\n      cnameProvider = await this.cnameProviderService.getByPriority();\n      if (cnameProvider == null) {\n        throw new ValidateException('找不到CNAME服务，请先前往“系统管理->CNAME服务设置”添加CNAME服务');\n      }\n    } else {\n      cnameProvider = await this.cnameProviderService.info(param.cnameProviderId);\n    }\n    await this.cnameProviderChanged(param.userId, param, cnameProvider);\n\n    param.status = 'cname';\n    const {id} = await super.add(param);\n    return await this.info(id);\n  }\n\n  private async cnameProviderChanged(userId: number, param: any, cnameProvider: CnameProviderEntity) {\n    param.cnameProviderId = cnameProvider.id;\n\n    const subDomainGetter = new SubDomainsGetter(userId, this.subDomainService)\n    const domainParser = new DomainParser(subDomainGetter);\n\n    const realDomain = await domainParser.parse(param.domain);\n    const prefix = param.domain.replace(realDomain, '');\n    let hostRecord = `_acme-challenge.${prefix}`;\n    if (hostRecord.endsWith('.')) {\n      hostRecord = hostRecord.substring(0, hostRecord.length - 1);\n    }\n    param.hostRecord = hostRecord;\n\n    const randomKey = utils.id.simpleNanoId(6).toLowerCase();\n\n    let userIdHash = \"\"\n    if(param.cnameProviderId < 0){\n      //公共cname服务\n      userIdHash = utils.hash.md5(`userId${userId}_${randomKey}`).substring(0, 10)\n    }else{\n      const installInfo = await  this.sysSettingsService.getSetting<SysInstallInfo>(SysInstallInfo)\n      userIdHash = utils.hash.md5(`${installInfo.siteId}_${randomKey}`).substring(0, 10)\n    }\n    const cnameKey = `${userIdHash}-${randomKey}`;\n    const safeDomain = param.domain.replaceAll('.', '-');\n    param.recordValue = `${safeDomain}.${cnameKey}.${cnameProvider.domain}`;\n  }\n\n  async update(param: any) {\n    if (!param.id) {\n      throw new ValidateException('id不能为空');\n    }\n\n    const old = await this.info(param.id);\n    if (!old) {\n      throw new ValidateException('数据不存在');\n    }\n    if (old.domain !== param.domain) {\n      throw new ValidateException('域名不允许修改');\n    }\n    if (old.cnameProviderId !== param.cnameProviderId) {\n      const cnameProvider = await this.cnameProviderService.info(param.cnameProviderId);\n      await this.cnameProviderChanged(old.userId, param, cnameProvider);\n      param.status = 'cname';\n    }\n    return await super.update(param);\n  }\n\n  // async validate(id: number) {\n  //   const info = await this.info(id);\n  //   if (info.status === 'success') {\n  //     return true;\n  //   }\n  //\n  //   //开始校验\n  //   // 1.  dnsProvider\n  //   // 2.  添加txt记录\n  //   // 3.  检查原域名是否有cname记录\n  // }\n\n  async getWithAccessByDomain(domain: string, userId: number) {\n    const record: CnameRecord = await this.getByDomain(domain, userId);\n    if (record.cnameProvider.id > 0) {\n      //自定义cname服务\n      record.cnameProvider.access = await this.accessService.getAccessById(record.cnameProvider.accessId, false);\n    } else {\n      record.commonDnsProvider = new CommonDnsProvider({\n        config: record.cnameProvider,\n        plusService: this.plusService,\n      });\n    }\n\n    return record;\n  }\n\n  async getByDomain(domain: string, userId: number, createOnNotFound = true) {\n    if (!domain) {\n      throw new ValidateException('domain不能为空');\n    }\n    if (userId == null) {\n      throw new ValidateException('userId不能为空');\n    }\n    let record = await this.getRepository().findOne({where: {domain, userId}});\n    if (record == null) {\n      if (createOnNotFound) {\n        record = await this.add({domain, userId});\n      } else {\n        throw new ValidateException(`找不到${domain}的CNAME记录`);\n      }\n    }\n    const provider = await this.cnameProviderService.info(record.cnameProviderId);\n    if (provider == null) {\n      throw new ValidateException(`找不到${domain}的CNAME服务`);\n    }\n\n    return {\n      ...record,\n      cnameProvider: {\n        ...provider,\n      } as CnameProvider,\n    } as CnameRecord;\n  }\n\n  /**\n   * 验证是否配置好cname\n   * @param id\n   */\n  async verify(id: string) {\n    const bean = await this.info(id);\n    if (!bean) {\n      throw new ValidateException(`CnameRecord:${id} 不存在`);\n    }\n    if (bean.status === 'valid') {\n      return true;\n    }\n\n    const subDomainGetter = new SubDomainsGetter(bean.userId, this.subDomainService)\n    const domainParser = new DomainParser(subDomainGetter);\n\n    const cacheKey = `cname.record.verify.${bean.id}`;\n\n    let value: CnameCheckCacheValue = cache.get(cacheKey);\n    if (!value) {\n      value = {\n        validating: false,\n        pass: false,\n        startTime: new Date().getTime(),\n      };\n    }\n    let ttl = 5 * 60 * 1000;\n    if (isDev()) {\n      ttl = 30 * 1000;\n    }\n    const testRecordValue = `certd-cname-verify-${bean.id}`;\n\n    const buildDnsProvider = async () => {\n      const cnameProvider = await this.cnameProviderService.info(bean.cnameProviderId);\n      if (cnameProvider == null) {\n        throw new ValidateException(`CNAME服务:${bean.cnameProviderId} 已被删除，请修改CNAME记录，重新选择CNAME服务`);\n      }\n      if (cnameProvider.disabled === true) {\n        throw new Error(`CNAME服务:${bean.cnameProviderId} 已被禁用`);\n      }\n\n      if (cnameProvider.id < 0) {\n        //公共CNAME\n        return new CommonDnsProvider({\n          config: cnameProvider,\n          plusService: this.plusService,\n        });\n      }\n\n      const access = await this.accessService.getById(cnameProvider.accessId, cnameProvider.userId);\n      const context = {access, logger, http, utils, domainParser};\n      const dnsProvider: IDnsProvider = await createDnsProvider({\n        dnsProviderType: cnameProvider.dnsProviderType,\n        context,\n      });\n      return dnsProvider;\n    };\n\n    const clearVerifyRecord = async () => {\n      cache.delete(cacheKey);\n      try {\n        let dnsProvider = value.dnsProvider\n        if (!dnsProvider) {\n          dnsProvider = await buildDnsProvider();\n        }\n        await dnsProvider.removeRecord({\n          recordReq: value.recordReq,\n          recordRes: value.recordRes,\n        });\n        logger.info('删除CNAME的校验DNS记录成功');\n      } catch (e) {\n        logger.error(`删除CNAME的校验DNS记录失败， ${e.message}，req:${JSON.stringify(value.recordReq)}，recordRes:${JSON.stringify(value.recordRes)}`, e);\n      }\n    };\n\n    const checkRecordValue = async () => {\n      if (value.pass) {\n        return true;\n      }\n      if (value.startTime + ttl < new Date().getTime()) {\n        logger.warn(`cname验证超时,停止检查,${bean.domain} ${testRecordValue}`);\n        clearInterval(value.intervalId);\n        await this.updateStatus(bean.id, 'timeout');\n        await clearVerifyRecord()\n        return false;\n      }\n\n\n      const originDomain = await domainParser.parse(bean.domain);\n      const fullDomain = `${bean.hostRecord}.${originDomain}`;\n\n      logger.info(`检查CNAME配置 ${fullDomain} ${testRecordValue}`);\n\n      //检查是否有重复的acme配置\n      await this.checkRepeatAcmeChallengeRecords(fullDomain,bean.recordValue)\n\n      // const txtRecords = await dns.promises.resolveTxt(fullDomain);\n      // if (txtRecords.length) {\n      //   records = [].concat(...txtRecords);\n      // }\n      let records: string[] = [];\n      try {\n        records = await walkTxtRecord(fullDomain);\n      } catch (e) {\n        logger.error(`获取TXT记录失败，${e.message}`);\n      }\n      logger.info(`检查到TXT记录 ${JSON.stringify(records)}`);\n      const success = records.includes(testRecordValue);\n      if (success) {\n        clearInterval(value.intervalId);\n        logger.info(`检测到CNAME配置,修改状态 ${fullDomain} ${testRecordValue}`);\n        await this.updateStatus(bean.id, 'valid', \"\");\n        value.pass = true;\n        await clearVerifyRecord()\n        return success;\n      }\n    };\n\n    if (value.validating) {\n      // lookup recordValue in dns\n      return await checkRecordValue();\n    }\n\n    cache.set(cacheKey, value, {\n      ttl: ttl,\n    });\n\n    const domain = await domainParser.parse(bean.recordValue);\n    const fullRecord = bean.recordValue;\n    const hostRecord = fullRecord.replace(`.${domain}`, '');\n    const req = {\n      domain: domain,\n      fullRecord: fullRecord,\n      hostRecord: hostRecord,\n      type: 'TXT',\n      value: testRecordValue,\n    };\n\n    const dnsProvider = await buildDnsProvider();\n    if(dnsProvider.usePunyCode()){\n      //是否需要中文转英文\n      req.domain = dnsProvider.punyCodeEncode(req.domain)\n      req.fullRecord = dnsProvider.punyCodeEncode(req.fullRecord)\n      req.hostRecord = dnsProvider.punyCodeEncode(req.hostRecord)\n      req.value = dnsProvider.punyCodeEncode(req.value)\n    }\n    const recordRes = await dnsProvider.createRecord(req);\n    value.dnsProvider = dnsProvider;\n    value.validating = true;\n    value.recordReq = req;\n    value.recordRes = recordRes;\n    await this.updateStatus(bean.id, 'validating', \"\");\n\n    value.intervalId = setInterval(async () => {\n      try {\n        await checkRecordValue();\n      } catch (e) {\n        logger.error('检查cname出错：', e);\n        await this.updateError(bean.id, e.message);\n      }\n    }, 10000);\n  }\n\n  async updateStatus(id: number, status: CnameRecordStatusType, error?: string) {\n    const updated: any = {status}\n    if (error != null) {\n      updated.error = error\n    }\n    await this.getRepository().update(id, updated);\n  }\n\n  async updateError(id: number, error: string) {\n    await this.getRepository().update(id, {error});\n  }\n\n  async checkRepeatAcmeChallengeRecords(acmeRecordDomain: string,targetCnameDomain:string) {\n\n    let dnsResolver = null\n    try{\n      dnsResolver = await getAuthoritativeDnsResolver(acmeRecordDomain)\n    }catch (e) {\n      logger.error(`获取${acmeRecordDomain}的权威DNS服务器失败，${e.message}`)\n      return\n    }\n    let cnameRecords = []\n    try{\n      cnameRecords = await dnsResolver.resolveCname(acmeRecordDomain);\n    }catch (e) {\n      logger.error(`查询CNAME记录失败：${e.message}`)\n      return\n    }\n    targetCnameDomain = targetCnameDomain.toLowerCase()\n    targetCnameDomain = punycode.toASCII(targetCnameDomain)\n    if (cnameRecords.length > 0) {\n      for (const cnameRecord of cnameRecords) {\n        if(cnameRecord.toLowerCase() !== targetCnameDomain){\n          //确保只有一个cname记录\n          throw new Error(`${acmeRecordDomain}存在多个CNAME记录，请删除多余的CNAME记录：${cnameRecord}`)\n        }\n      }\n\n    }\n\n    // 确保权威服务器里面没有纯粹的TXT记录\n    let txtRecords = []\n    try{\n      const txtRecordRes = await dnsResolver.resolveTxt(acmeRecordDomain);\n\n      if (txtRecordRes && txtRecordRes.length > 0) {\n        logger.info(`找到 ${txtRecordRes.length} 条 TXT记录（ ${acmeRecordDomain}）`);\n        logger.info(`TXT records: ${JSON.stringify(txtRecords)}`);\n        txtRecords = txtRecords.concat(...txtRecordRes);\n      }\n    }catch (e) {\n      logger.error(`查询Txt记录失败：${e.message}`)\n    }\n\n    if (txtRecords.length === 0) {\n      //如果权威服务器中查不到txt，无需继续检查\n      return\n    }\n    if (cnameRecords.length > 0) {\n      // 从cname记录中获取txt记录\n      // 对比是否存在，如果不存在于cname中获取的txt中，说明本体有创建多余的txt记录\n      const res = await walkTxtRecord(cnameRecords[0]);\n      if (res.length > 0) {\n        for (const txtRecord of txtRecords) {\n          if (!res.includes(txtRecord)) {\n            throw new Error(`${acmeRecordDomain}存在多个TXT记录，请删除多余的TXT记录:${txtRecord}`)\n          }\n        }\n      }\n    }\n\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/cname/service/common-provider.ts",
    "content": "import {CreateRecordOptions, DnsProviderContext, IDnsProvider, RemoveRecordOptions} from '@certd/plugin-cert';\nimport {PlusService} from '@certd/lib-server';\nimport punycode from 'punycode.js'\nexport type CommonCnameProvider = {\n  id: number;\n  domain: string;\n  title?: string;\n};\nexport const CommonProviders = [\n  {\n    id: -1,\n    domain: 'cname.certd.com.cn',\n    title: '公共CNAME服务',\n  },\n];\n\nexport class CommonDnsProvider implements IDnsProvider {\n  ctx: DnsProviderContext;\n  config: CommonCnameProvider;\n  plusService: PlusService;\n\n  constructor(opts: { config: CommonCnameProvider; plusService: PlusService }) {\n    this.config = opts.config;\n    this.plusService = opts.plusService;\n  }\n\n  /**\n   * 中文转英文\n   * @param domain\n   */\n  punyCodeEncode(domain: string) {\n    return punycode.encode(domain);\n  }\n\n  /**\n   * 转中文域名\n   * @param domain\n   */\n  punyCodeDecode(domain: string) {\n    return punycode.decode(domain);\n  }\n\n\n  usePunyCode(): boolean {\n    return false\n  }\n\n  async onInstance() {\n  }\n\n  async createRecord(options: CreateRecordOptions) {\n    if (!this.config.domain.endsWith(options.domain)) {\n      throw new Error('cname服务域名不匹配');\n    }\n\n    await this.plusService.register();\n\n    const res = await this.plusService.requestWithToken({\n      url: '/activation/certd/cname/recordCreate',\n      method: 'post',\n      data: {\n        subjectId: await this.plusService.getSubjectId(),\n        domain: options.domain,\n        hostRecord: options.hostRecord,\n        recordValue: options.value,\n        providerId: this.config.id,\n      },\n    });\n    return res;\n  }\n\n  async removeRecord(options: RemoveRecordOptions<any>) {\n    const res = await this.plusService.requestWithToken({\n      url: '/activation/certd/cname/recordRemove',\n      method: 'post',\n      data: {\n        subjectId: await this.plusService.getSubjectId(),\n        domain: options.recordReq.domain,\n        hostRecord: options.recordReq.hostRecord,\n        recordValue: options.recordReq.value,\n        recordId: options.recordRes?.recordId,\n        providerId: this.config.id,\n      },\n    });\n    return res;\n  }\n\n  setCtx(ctx: DnsProviderContext): void {\n    this.ctx = ctx;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/cron/configuration.ts",
    "content": "import { Config, Configuration, Logger } from '@midwayjs/core';\nimport { ILogger } from '@midwayjs/logger';\nimport { IMidwayContainer } from '@midwayjs/core';\nimport { Cron } from './cron.js';\n\n// ... (see below) ...\n@Configuration({\n  namespace: 'cron',\n  //importConfigs: [join(__dirname, './config')],\n})\nexport class CronConfiguration {\n  @Config()\n  config;\n  @Logger()\n  logger: ILogger;\n\n  cron: Cron;\n  async onReady(container: IMidwayContainer) {\n    this.logger.info('cron start');\n    this.cron = new Cron({\n      logger: this.logger,\n      ...this.config,\n    });\n    container.registerObject('cron', this.cron);\n    this.cron.start();\n    this.logger.info('cron started');\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/cron/cron.ts",
    "content": "import parser from 'cron-parser';\nimport { ILogger } from '@certd/basic';\n\nexport type CronTaskReq = {\n  /**\n   * 为空则为单次执行\n   */\n  cron: string;\n  job: () => Promise<void>;\n  name: string;\n};\n\nexport class CronTask {\n  logger: ILogger;\n  cron: string;\n  job: () => Promise<void>;\n  name: string;\n  stoped = false;\n\n  nextTime: any;\n\n  constructor(req: CronTaskReq, logger: ILogger) {\n    this.cron = req.cron;\n    this.job = req.job;\n    this.name = req.name;\n    this.logger = logger;\n    this.logger.info(`[cron]  CronTask created [${this.name}], cron:${this.cron}`);\n    this.genNextTime();\n  }\n\n  genNextTime() {\n    if (!this.cron) {\n      return null;\n    }\n    if (this.stoped) {\n      return null;\n    }\n    const interval = parser.parseExpression(this.cron);\n    const next = interval.next().getTime();\n    this.logger.info(`[cron]  [${this.name}], cron:${this.cron}, next run :${new Date(next).toLocaleString()}`);\n    this.nextTime = next;\n    return next;\n  }\n\n  stop() {\n    this.stoped = true;\n  }\n}\nexport class Cron {\n  logger: ILogger;\n  immediateTriggerOnce: boolean;\n\n  queue: CronTask[] = [];\n  constructor(opts: any) {\n    this.logger = opts.logger;\n    this.immediateTriggerOnce = opts.immediateTriggerOnce;\n  }\n\n  start() {\n    this.logger.info('[cron] start');\n    this.queue.forEach(task => {\n      task.genNextTime();\n    });\n\n    setInterval(() => {\n      const now = new Date().getTime();\n      for (const task of this.queue) {\n        if (task.nextTime <= now) {\n          task.job().catch(e => {\n            this.logger.error(`job execute error : [${task.name}]`, e);\n          });\n          task.genNextTime();\n        }\n      }\n    }, 1000 * 60);\n  }\n\n  register(req: CronTaskReq) {\n    if (!req.cron) {\n      this.logger.info(`[cron] register once : [${req.name}]`);\n      req.job().catch(e => {\n        this.logger.error(`job execute error : [${req.name}]`, e);\n      });\n      return;\n    }\n    this.logger.info(`[cron] register cron : [${req.name}] ,${req.cron}`);\n\n    this.remove(req.name)\n\n    const task = new CronTask(req, this.logger);\n    this.queue.push(task);\n    this.logger.info('当前定时任务数量：', this.getTaskSize());\n  }\n\n  remove(taskName: string) {\n    this.logger.info(`[cron] remove : [${taskName}]`);\n    const index = this.queue.findIndex(item => item.name === taskName);\n    if (index !== -1) {\n      this.queue[index].stop();\n      this.queue.splice(index, 1);\n    }\n    this.logger.info('当前定时任务数量：', this.getTaskSize());\n  }\n\n  getTaskSize() {\n    const tasks = Object.keys(this.queue);\n    return tasks.length;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/cron/index.ts",
    "content": "// src/index.ts\nexport { CronConfiguration as Configuration } from './configuration.js';\n// export * from './controller/user';\n// export * from './controller/api';\n// export * from './service/user';\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/db/d.ts",
    "content": "export interface SqlAdapter {\n  date(columnName: string): string;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/db/index.ts",
    "content": "import { SqliteAdapter } from './sqlite.js';\nimport { PostgresqlAdapter } from './postgresql.js';\nimport { Config, Init, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { SqlAdapter } from './d.js';\nimport { MysqlAdapter } from './mysql.js';\n\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class DbAdapter implements SqlAdapter {\n  adapter: SqlAdapter;\n  @Config('typeorm.dataSource.default.type')\n  dbType: string;\n\n  @Init()\n  async init() {\n    if (this.isSqlite()) {\n      this.adapter = new SqliteAdapter();\n    } else if (this.isPostgresql()) {\n      this.adapter = new PostgresqlAdapter();\n    } else if (this.isMysql()) {\n      this.adapter = new MysqlAdapter();\n    } else {\n      throw new Error(`dbType ${this.dbType} not support， 请实现Adapter`);\n    }\n  }\n\n  isSqlite() {\n    return this.dbType === 'better-sqlite3';\n  }\n  isPostgresql() {\n    return this.dbType === 'postgres';\n  }\n  isMysql() {\n    return this.dbType === 'mysql' || this.dbType === 'mariadb';\n  }\n\n  date(columnName: string) {\n    return this.adapter.date(columnName);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/db/mysql.ts",
    "content": "import { SqlAdapter } from './d.js';\n\nexport class MysqlAdapter implements SqlAdapter {\n  date(columnName: string) {\n    return `DATE_FORMAT(${columnName}, '%Y-%m-%d')`;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/db/postgresql.ts",
    "content": "import { SqlAdapter } from './d.js';\n\nexport class PostgresqlAdapter implements SqlAdapter {\n  date(columnName: string) {\n    return `to_char(${columnName}, 'YYYY-MM-DD')`;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/db/sqlite.ts",
    "content": "import { SqlAdapter } from './d.js';\n\nexport class SqliteAdapter implements SqlAdapter {\n  date(columnName: string) {\n    return `date(${columnName}, 'localtime')`;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/login/service/login-service.ts",
    "content": "import {Config, Inject, Provide, Scope, ScopeEnum} from '@midwayjs/core';\nimport {UserService} from '../../sys/authority/service/user-service.js';\nimport jwt from 'jsonwebtoken';\nimport {AuthException, CommonException, Need2FAException} from \"@certd/lib-server\";\nimport {RoleService} from '../../sys/authority/service/role-service.js';\nimport {UserEntity} from '../../sys/authority/entity/user.js';\nimport {SysSettingsService} from '@certd/lib-server';\nimport {SysPrivateSettings} from '@certd/lib-server';\nimport {cache, utils} from '@certd/basic';\nimport {LoginErrorException} from '@certd/lib-server/dist/basic/exception/login-error-exception.js';\nimport {CodeService} from '../../basic/service/code-service.js';\nimport {TwoFactorService} from \"../../mine/service/two-factor-service.js\";\nimport {UserSettingsService} from '../../mine/service/user-settings-service.js';\nimport {isPlus} from \"@certd/plus-core\";\n\n/**\n * 系统用户\n */\n@Provide()\n@Scope(ScopeEnum.Request, {allowDowngrade: true})\nexport class LoginService {\n  @Inject()\n  userService: UserService;\n  @Inject()\n  roleService: RoleService;\n\n  @Inject()\n  codeService: CodeService;\n  @Config('auth.jwt')\n  private jwt: any;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n  @Inject()\n  userSettingsService: UserSettingsService;\n  @Inject()\n  twoFactorService: TwoFactorService;\n\n  checkIsBlocked(username: string) {\n    const blockDurationKey = `login_block_duration:${username}`;\n    const value = cache.get(blockDurationKey);\n    if (value) {\n      const ttl = cache.getRemainingTTL(blockDurationKey)\n      const leftMin = Math.ceil(ttl / 1000 / 60);\n      throw new CommonException(`账号被锁定，请${leftMin}分钟后重试`);\n    }\n  }\n\n  clearCacheOnSuccess(username: string) {\n    cache.delete(`login_error_times:${username}`);\n    cache.delete(`login_block_times:${username}`);\n    cache.delete(`login_block_duration:${username}`);\n  }\n\n  addErrorTimes(username: string, errorMessage: string) {\n    const errorTimesKey = `login_error_times:${username}`;\n    const blockTimesKey = `login_block_times:${username}`;\n    const blockDurationKey = `login_block_duration:${username}`;\n    let blockTimes = cache.get(blockTimesKey);\n    // let maxWaitMin = 2;\n    const maxRetryTimes = blockTimes > 1 ? 3 : 5;\n    if (blockTimes == null) {\n      blockTimes = 0;\n    }\n    // maxWaitMin = maxWaitMin * blockTimes;\n    // let ttl = maxWaitMin * 60 * 1000;\n\n    let errorTimes = cache.get(errorTimesKey);\n\n    if (errorTimes == null) {\n      errorTimes = 0;\n    }\n    errorTimes += 1;\n    const ttl24H = 24 * 60 * 60 * 1000;\n    cache.set(errorTimesKey, errorTimes, {\n      ttl: ttl24H,\n    });\n    if (errorTimes > maxRetryTimes) {\n      blockTimes += 1;\n      cache.set(blockTimesKey, blockTimes, {\n        ttl: ttl24H,\n      });\n      //按照block次数指数递增，最长24小时\n      const ttl = Math.min(blockTimes * blockTimes * 60 * 1000, ttl24H);\n      const leftMin = Math.ceil(ttl / 1000 / 60);\n      cache.set(blockDurationKey, 1, {\n        ttl: ttl,\n      })\n      // 清除error次数\n      cache.delete(errorTimesKey);\n      throw new LoginErrorException(`登录失败次数过多，请${leftMin}分钟后重试`, 0);\n    }\n    const leftTimes = maxRetryTimes - errorTimes;\n    if (leftTimes < 3) {\n      throw new LoginErrorException(`登录失败(${errorMessage})，剩余尝试次数：${leftTimes}`, leftTimes);\n    }\n    throw new LoginErrorException(errorMessage, leftTimes);\n  }\n\n\n  async loginBySmsCode(req: { mobile: string; phoneCode: string; smsCode: string; randomStr: string }) {\n\n    this.checkIsBlocked(req.mobile)\n\n    const smsChecked = await this.codeService.checkSmsCode({\n      mobile: req.mobile,\n      phoneCode: req.phoneCode,\n      smsCode: req.smsCode,\n      randomStr: req.randomStr,\n      throwError: false,\n    });\n\n    const {mobile, phoneCode} = req;\n    if (!smsChecked) {\n      this.addErrorTimes(mobile, '验证码错误');\n    }\n    let info = await this.userService.findOne({phoneCode, mobile: mobile});\n    if (info == null) {\n      //用户不存在，注册\n      info = await this.userService.register('mobile', {\n        phoneCode,\n        mobile,\n        password: '',\n      } as any);\n    }\n    this.clearCacheOnSuccess(mobile);\n    return this.onLoginSuccess(info);\n  }\n\n  async loginByPassword(req: { username: string; password: string; phoneCode: string }) {\n    this.checkIsBlocked(req.username)\n    const {username, password, phoneCode} = req;\n    const info = await this.userService.findOne([{username: username}, {email: username}, {\n      phoneCode,\n      mobile: username\n    }]);\n    if (info == null) {\n      throw new CommonException('用户名或密码错误');\n    }\n    const right = await this.userService.checkPassword(password, info.password, info.passwordVersion);\n    if (!right) {\n      this.addErrorTimes(username, '用户名或密码错误');\n    }\n    this.clearCacheOnSuccess(username);\n    return this.onLoginSuccess(info);\n  }\n\n  async checkTwoFactorEnabled(userId: number) {\n    //检查是否开启多重认证\n    if (!isPlus()) {\n      return true\n    }\n\n    const twoFactorSetting = await this.twoFactorService.getSetting(userId)\n\n    const authenticatorSetting = twoFactorSetting.authenticator\n    if (authenticatorSetting.enabled) {\n      //要检查\n      const randomKey = utils.id.simpleNanoId(12)\n      cache.set(`login_2fa_code:${randomKey}`, userId, {\n        ttl: 60 * 1000 * 2,\n      })\n      throw new Need2FAException('已开启多重认证，请在2分钟内输入OPT验证码',randomKey)\n    }\n\n  }\n\n  async loginByTwoFactor(req: { loginId: string; verifyCode: string }) {\n    //检查是否开启多重认证\n    if (!isPlus()) {\n      throw new Error('本功能需要开通专业版')\n    }\n    const userId = cache.get(`login_2fa_code:${req.loginId}`)\n    if (!userId) {\n      throw new AuthException('已超时，请返回重新登录')\n    }\n    await this.twoFactorService.verifyAuthenticatorCode(userId, req.verifyCode)\n\n    const user = await this.userService.info(userId);\n    if (!user) {\n      throw new AuthException('用户不存在')\n    }\n    return this.generateToken(user)\n  }\n\n  private async onLoginSuccess(info: UserEntity) {\n    if (info.status === 0) {\n      throw new CommonException('用户已被禁用');\n    }\n    await this.checkTwoFactorEnabled(info.id)\n    return this.generateToken(info);\n  }\n\n\n  /**\n   * 生成token\n   * @param user 用户对象\n   * @param roleIds\n   */\n  async generateToken(user: UserEntity) {\n    const roleIds = await this.roleService.getRoleIdsByUserId(user.id);\n    const tokenInfo = {\n      username: user.username,\n      id: user.id,\n      roles: roleIds,\n    };\n    const expire = this.jwt.expire;\n\n    const setting = await this.sysSettingsService.getSetting<SysPrivateSettings>(SysPrivateSettings);\n    const jwtSecret = setting.jwtKey;\n\n    const token = jwt.sign(tokenInfo, jwtSecret, {\n      expiresIn: expire,\n    });\n\n    return {\n      token,\n      expire,\n    };\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/mine/entity/user-settings.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n/**\n */\n@Entity('user_settings')\nexport class UserSettingsEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n  @Column({ name: 'user_id', comment: '用户id' })\n  userId: number;\n  @Column({ comment: 'key', length: 100 })\n  key: string;\n  @Column({ comment: '名称', length: 100 })\n  title: string;\n  @Column({ name: 'setting', comment: '设置', length: 1024, nullable: true })\n  setting: string;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/mine/service/models.ts",
    "content": "import { BaseSettings } from \"@certd/lib-server\";\n\nexport type TwoFactorAuthenticator = {\n  enabled: boolean;\n  secret?: string;\n  type?: string;\n  verified?:boolean;\n}\n\nexport class UserTwoFactorSetting extends BaseSettings {\n  static __title__ = \"用户多重认证设置\";\n  static __key__ = \"user.two.factor\";\n\n  authenticator: TwoFactorAuthenticator = {\n    enabled:false,\n    verified:false,\n  };\n\n}\n\n\n\nexport class UserSiteMonitorSetting extends BaseSettings {\n  static __title__ = \"站点监控设置\";\n  static __key__ = \"user.site.monitor\";\n\n  notificationId?:number= 0;\n  cron?:string = undefined;\n  retryTimes?:number = 3;\n  dnsServer?:string[] = undefined;\n}\n\nexport class UserEmailSetting extends BaseSettings {\n  static __title__ = \"用户邮箱设置\";\n  static __key__ = \"user.email\";\n\n  list:string[] = [];\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/mine/service/two-factor-service.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from \"@midwayjs/core\";\nimport { UserSettingsService } from \"./user-settings-service.js\";\nimport { UserTwoFactorSetting } from \"./models.js\";\nimport { UserService } from \"../../sys/authority/service/user-service.js\";\n\n/**\n * 授权\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class TwoFactorService {\n  @Inject()\n  userSettingsService: UserSettingsService;\n  @Inject()\n  userService: UserService;\n\n\n  async getAuthenticatorQrCode(userId: any) {\n    const setting = await this.getSetting(userId)\n\n    const authenticatorSetting = setting.authenticator;\n    if (!authenticatorSetting.secret) {\n      const { authenticator  } = await import(\"otplib\");\n\n      authenticatorSetting.secret = authenticator.generateSecret()\n      await this.userSettingsService.saveSetting(userId, setting);\n    }\n\n    const user = await this.userService.info(userId);\n    const username = user.username;\n    const secret = authenticatorSetting.secret;\n    const qrcodeContent = `otpauth://totp/Certd:${username}?secret=${secret}&issuer=Certd`;\n\n    //生成qrcode base64\n    const qrcode = await import(\"qrcode\");\n    return await qrcode.toDataURL(qrcodeContent);\n\n  }\n\n  async saveAuthenticator(req: { userId: any; verifyCode: any }) {\n    const userId = req.userId;\n    const { authenticator } = await import(\"otplib\");\n    const setting = await this.getSetting(userId)\n\n    const authenticatorSetting = setting.authenticator;\n    if (!authenticatorSetting.secret) {\n      throw new Error(\"secret is required\");\n    }\n    const secret = authenticatorSetting.secret;\n    const token = req.verifyCode;\n\n    const isValid = authenticator.verify({ token, secret });\n    if (!isValid) {\n      throw new Error(\"authenticator 校验错误\");\n    }\n\n    //校验成功，保存开启状态\n    authenticatorSetting.enabled = true;\n    authenticatorSetting.verified = true;\n\n    await this.userSettingsService.saveSetting(userId, setting);\n  }\n\n  async offAuthenticator(userId:number) {\n    if (!userId) {\n      throw new Error(\"userId is required\");\n    }\n\n    const setting = await this.getSetting(userId)\n    setting.authenticator.enabled = false;\n    setting.authenticator.verified = false;\n    setting.authenticator.secret = '';\n    await this.userSettingsService.saveSetting(userId, setting);\n  }\n\n  async getSetting(userId:number) {\n    return await this.userSettingsService.getSetting<UserTwoFactorSetting>(userId, UserTwoFactorSetting);\n\n  }\n\n  async verifyAuthenticatorCode(userId: any, verifyCode: string) {\n    const { authenticator } = await import(\"otplib\");\n    const setting = await this.getSetting(userId)\n    if (!setting.authenticator.enabled) {\n      throw new Error(\"authenticator 未开启\");\n    }\n    if (!authenticator.verify({ token: verifyCode, secret: setting.authenticator.secret })) {\n      throw new Error(\"验证码错误\");\n    }\n    return true;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/mine/service/user-settings-service.ts",
    "content": "import { Provide, Scope, ScopeEnum } from \"@midwayjs/core\";\nimport { InjectEntityModel } from \"@midwayjs/typeorm\";\nimport { Repository } from \"typeorm\";\nimport { BaseService, BaseSettings } from \"@certd/lib-server\";\nimport { UserSettingsEntity } from \"../entity/user-settings.js\";\nimport { LocalCache, mergeUtils } from \"@certd/basic\";\nconst {merge} = mergeUtils\n\nconst UserSettingCache = new LocalCache({\n  clearInterval: 5 * 60 * 1000,\n});\n\n/**\n * 授权\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class UserSettingsService extends BaseService<UserSettingsEntity> {\n  @InjectEntityModel(UserSettingsEntity)\n  repository: Repository<UserSettingsEntity>;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async getById(id: any): Promise<UserSettingsEntity | null> {\n    const entity = await this.info(id);\n    if (!entity) {\n      return null;\n    }\n    // const access = accessRegistry.get(entity.type);\n    const setting = JSON.parse(entity.setting);\n    return {\n      id: entity.id,\n      ...setting\n    };\n  }\n\n  async getByKey(key: string, userId: number): Promise<UserSettingsEntity | null> {\n    if(!userId){\n      throw new Error('userId is required');\n    }\n    if (!key || !userId) {\n      return null;\n    }\n    return await this.repository.findOne({\n      where: {\n        key,\n        userId\n      }\n    });\n  }\n\n  async getSettingByKey(key: string, userId: number): Promise<any | null> {\n    if(!userId){\n      throw new Error('userId is required');\n    }\n    const entity = await this.getByKey(key, userId);\n    if (!entity) {\n      return null;\n    }\n    return JSON.parse(entity.setting);\n  }\n\n  async save(bean: UserSettingsEntity) {\n    const entity = await this.repository.findOne({\n      where: {\n        key: bean.key,\n        userId: bean.userId\n      }\n    });\n    if (entity) {\n      entity.setting = bean.setting;\n      await this.repository.save(entity);\n    } else {\n      bean.title = bean.key;\n      await this.repository.save(bean);\n    }\n  }\n\n\n  async getSetting<T>( userId: number,type: any, cache:boolean = false): Promise<T> {\n    if(!userId){\n      throw new Error('userId is required');\n    }\n    const key = type.__key__;\n    const cacheKey = key + '_' + userId;\n    if (cache) {\n      const settings: T = UserSettingCache.get(cacheKey);\n      if (settings) {\n        return settings;\n      }\n    }\n\n    let newSetting: T = new type();\n    const savedSettings = await this.getSettingByKey(key, userId);\n    newSetting = merge(newSetting, savedSettings);\n\n    if (cache) {\n      UserSettingCache.set(cacheKey, newSetting);\n    }\n    return newSetting;\n  }\n\n  async saveSetting<T extends BaseSettings>(userId:number,bean: T) {\n    if(!userId){\n      throw new Error('userId is required');\n    }\n    const old = await this.getSetting(userId,bean.constructor)\n    bean = merge(old,bean)\n\n    const type: any = bean.constructor;\n    const key = type.__key__;\n    if(!key){\n      throw new Error(`${type.name} must have __key__`);\n    }\n    const entity = await this.getByKey(key,userId);\n    const newEntity = new UserSettingsEntity();\n    if (entity) {\n      newEntity.id = entity.id;\n    }else{\n      newEntity.key = key;\n      newEntity.title = type.__title__;\n      newEntity.userId = userId;\n    }\n    newEntity.setting = JSON.stringify(bean);\n    await this.repository.save(newEntity);\n  }\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/monitor/entity/cert-info.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\nimport { PipelineEntity } from '../../pipeline/entity/pipeline.js';\n\n@Entity('cd_cert_info')\nexport class CertInfoEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column({ name: 'user_id', comment: '用户id' })\n  userId: number;\n\n  @Column({ name: 'domain', comment: '主域名' })\n  domain: string;\n\n  @Column({ name: 'domains', comment: '域名' })\n  domains: string;\n\n  @Column({ name: 'domain_count', comment: '域名数量' })\n  domainCount: number;\n\n  @Column({ name: 'pipeline_id', comment: '关联流水线id' })\n  pipelineId: number;\n\n  @Column({ name: 'apply_time', comment: '申请时间' })\n  applyTime: number;\n\n  @Column({ name: 'from_type', comment: '来源' })\n  fromType: string;\n\n  @Column({ name: 'cert_provider', comment: '证书颁发机构' })\n  certProvider: string;\n\n  @Column({ name: 'expires_time', comment: '过期时间' })\n  expiresTime: number;\n\n  @Column({ name: 'cert_info', comment: '证书详情' })\n  certInfo: string;\n\n  @Column({ name: 'cert_file', comment: '证书下载' })\n  certFile: string;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n\n  pipeline?: PipelineEntity;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/monitor/entity/site-info.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n/**\n */\n@Entity('cd_site_info')\nexport class SiteInfoEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n  @Column({ name: 'user_id', comment: '用户id' })\n  userId: number;\n  @Column({ name: 'name', comment: '站点名称', length: 100 })\n  name: string;\n  @Column({ name: 'domain', comment: '域名', length: 100 })\n  domain: string;\n\n  @Column({ name: 'https_port', comment: '端口' })\n  httpsPort: number;\n\n  @Column({ name: 'cert_domains', comment: '证书域名', length: 4096 })\n  certDomains: string;\n  @Column({ name: 'cert_info', comment: '证书详情', length: 4096 })\n  certInfo: string;\n  @Column({ name: 'cert_status', comment: '证书状态', length: 100 })\n  certStatus: string;\n\n  @Column({ name: 'cert_provider', comment: '证书颁发机构', length: 100 })\n  certProvider: string;\n\n  @Column({ name: 'cert_expires_time', comment: '证书到期时间' })\n  certExpiresTime: number;\n  @Column({ name: 'last_check_time', comment: '上次检查时间' })\n  lastCheckTime: number;\n  @Column({ name: 'check_status', comment: '检查状态' })\n  checkStatus: string;\n  @Column({ name: 'error', comment: '错误信息' })\n  error: string;\n  @Column({ name: 'pipeline_id', comment: '关联流水线id' })\n  pipelineId: number;\n\n  @Column({ name: 'cert_info_id', comment: '证书id' })\n  certInfoId: number;\n\n\n  @Column({ name: 'ip_check', comment: '是否检查IP' })\n  ipCheck: boolean;\n\n  @Column({ name: 'ip_count', comment: 'ip数量' })\n  ipCount: number\n\n  @Column({ name: 'ip_error_count', comment: 'ip异常数量' })\n  ipErrorCount: number\n\n\n  @Column({ name: 'disabled', comment: '禁用启用' })\n  disabled: boolean;\n\n  @Column({ name: 'create_time', comment: '创建时间', default: () => 'CURRENT_TIMESTAMP' })\n  createTime: Date;\n  @Column({ name: 'update_time', comment: '修改时间', default: () => 'CURRENT_TIMESTAMP' })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/monitor/entity/site-ip.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n/**\n */\n@Entity('cd_site_ip')\nexport class SiteIpEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n  @Column({ name: 'user_id', comment: '用户id' })\n  userId: number;\n  @Column({ name: 'site_id', comment: '站点id' })\n  siteId: number;\n  @Column({ name: 'ip_address', comment: 'IP', length: 100 })\n  ipAddress: string;\n\n  @Column({ name: 'cert_domains', comment: '证书域名', length: 4096 })\n  certDomains: string;\n  @Column({ name: 'cert_status', comment: '证书状态', length: 100 })\n  certStatus: string;\n  @Column({ name: 'cert_provider', comment: '证书颁发机构', length: 100 })\n  certProvider: string;\n  @Column({ name: 'cert_expires_time', comment: '证书到期时间' })\n  certExpiresTime: number;\n  @Column({ name: 'last_check_time', comment: '上次检查时间' })\n  lastCheckTime: number;\n  @Column({ name: 'check_status', comment: '检查状态' })\n  checkStatus: string;\n  @Column({ name: 'error', comment: '错误信息' })\n  error: string;\n  @Column({ name: 'from', comment: '来源' })\n  from: string\n  @Column({ name: 'remark', comment: '备注' })\n  remark: string;\n  @Column({ name: \"disabled\", comment: \"禁用启用\" })\n  disabled: boolean;\n\n  @Column({ name: 'create_time', comment: '创建时间', default: () => 'CURRENT_TIMESTAMP' })\n  createTime: Date;\n  @Column({ name: 'update_time', comment: '修改时间', default: () => 'CURRENT_TIMESTAMP' })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/monitor/facade/cert-info-facade.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from \"@midwayjs/core\";\nimport { CodeException, Constants } from \"@certd/lib-server\";\nimport { CertInfoEntity } from \"../entity/cert-info.js\";\nimport { utils } from \"@certd/basic\";\nimport { PipelineService } from \"../../pipeline/service/pipeline-service.js\";\nimport { UserSettingsService } from \"../../mine/service/user-settings-service.js\";\nimport { UserEmailSetting } from \"../../mine/service/models.js\";\nimport { PipelineEntity } from \"../../pipeline/entity/pipeline.js\";\nimport { CertInfoService } from \"../service/cert-info-service.js\";\nimport { DomainService } from \"../../cert/service/domain-service.js\";\nimport { DomainVerifierGetter } from \"../../pipeline/service/getter/domain-verifier-getter.js\";\n\n\n@Provide(\"CertInfoFacade\")\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class CertInfoFacade  {\n\n  @Inject()\n  pipelineService: PipelineService;\n\n  @Inject()\n  certInfoService: CertInfoService ;\n\n  @Inject()\n  domainService: DomainService\n\n  @Inject()\n  userSettingsService : UserSettingsService\n\n  async getCertInfo(req: { domains?: string; certId?: number; userId: number,autoApply?:boolean }) {\n    const { domains, certId, userId } = req;\n    if (certId) {\n      return await this.certInfoService.getCertInfoById({ id: certId, userId });\n    }\n    if (!domains) {\n      throw new CodeException({\n        ...Constants.res.openParamError,\n        message: \"参数错误，certId和domains必须传一个\",\n      });\n    }\n    const domainArr = domains.split(',');\n\n    const matchedList = await this.certInfoService.getMatchCertList({domains:domainArr,userId})\n    let matched: CertInfoEntity = null\n    if (matchedList.length === 0 ) {\n      if(req.autoApply === true){\n        //自动申请，先创建自动申请流水线\n        const pipeline:PipelineEntity = await this.createAutoPipeline({domains:domainArr,userId})\n        await this.triggerApplyPipeline({pipelineId:pipeline.id})\n      }else{\n        throw new CodeException({\n          ...Constants.res.openCertNotFound,\n          message:\"在证书仓库中没有找到匹配域名的证书，请先创建证书流水线，或传入autoApply参数，自动创建\"\n        });\n      }\n    }\n    matched = null;\n    for (const item of matchedList) {\n      if (item.expiresTime>0 && item.expiresTime > new Date().getTime()) {\n        matched = item;\n        break\n      }\n    }\n    if (!matched) {\n      if(req.autoApply === true){\n        //如果没有找到有效期内的证书，则自动触发一次申请\n        const first = matchedList[0]\n        await this.triggerApplyPipeline({pipelineId:first.pipelineId})\n        return\n      }else{\n        throw new CodeException({\n          ...Constants.res.openCertNotFound,\n          message:\"证书已过期，请触发流水线申请，或者传入autoApply参数，自动触发\"\n        });\n      }\n    }\n\n    return await this.certInfoService.getCertInfoById({ id: matched.id, userId: userId });\n  }\n\n  async createAutoPipeline(req:{domains:string[],userId:number}){\n\n    const verifierGetter = new DomainVerifierGetter(req.userId, this.domainService)\n\n    const allDomains = []\n    for (const item of req.domains) {\n      allDomains.push(item.replaceAll(\"*.\",\"\"))\n    }\n    const verifiers = await verifierGetter.getVerifiers(allDomains)\n    for (const item of allDomains) {\n      if (!verifiers[item]){\n        throw new CodeException({\n          ...Constants.res.openDomainNoVerifier,\n          message:`域名${item}没有配置校验方式，请先在域名管理页面配置`,\n          data:{\n            domain:item\n          }\n        });\n      }\n    }\n\n    const userEmailSetting = await this.userSettingsService.getSetting<UserEmailSetting>(req.userId,UserEmailSetting)\n    if(!userEmailSetting.list){\n      throw new CodeException(Constants.res.openEmailNotFound)\n    }\n    const email = userEmailSetting.list[0]\n\n    return await this.pipelineService.createAutoPipeline({\n      domains: req.domains,\n      email,\n      userId: req.userId,\n      from:\"OpenAPI\"\n    })\n\n  }\n\n  async triggerApplyPipeline(req:{pipelineId:number}){\n    //查询流水线状态\n    const status = await this.pipelineService.getStatus(req.pipelineId)\n    if (status != 'running') {\n      await this.pipelineService.trigger(req.pipelineId)\n      await utils.sleep(1000)\n    }\n    const certInfo = await this.certInfoService.getByPipelineId(req.pipelineId)\n    throw new CodeException({\n      ...Constants.res.openCertApplying,\n      data:{\n        pipelineId:req.pipelineId,\n        certId:certInfo?.id\n      }\n    });\n  }\n\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/monitor/index.ts",
    "content": "export * from './entity/site-info.js';\nexport * from './entity/cert-info.js';\n\nexport * from './service/cert-info-service.js';\nexport * from './service/site-info-service.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/monitor/service/cert-info-service.ts",
    "content": "import { Provide, Scope, ScopeEnum } from \"@midwayjs/core\";\nimport { BaseService, CodeException, Constants, PageReq } from \"@certd/lib-server\";\nimport { InjectEntityModel } from \"@midwayjs/typeorm\";\nimport { Repository } from \"typeorm\";\nimport { CertInfoEntity } from \"../entity/cert-info.js\";\nimport { utils } from \"@certd/basic\";\nimport { CertInfo, CertReader } from \"@certd/plugin-cert\";\n\nexport type UploadCertReq = {\n  id?: number;\n  certReader: CertReader;\n  fromType?: string;\n  userId?: number;\n  file?:any\n};\n\n\n@Provide(\"CertInfoService\")\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class CertInfoService extends BaseService<CertInfoEntity> {\n  @InjectEntityModel(CertInfoEntity)\n  repository: Repository<CertInfoEntity>;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async page(pageReq: PageReq<CertInfoEntity>) {\n    return await super.page(pageReq);\n  }\n\n  async getUserDomainCount(userId: number) {\n    if (!userId) {\n      throw new Error('userId is required');\n    }\n    return await this.repository.sum('domainCount', {\n      userId,\n    });\n  }\n\n  async updateDomains(pipelineId: number, userId: number, domains: string[],fromType?:string) {\n    const found = await this.repository.findOne({\n      where: {\n        pipelineId,\n        userId,\n      },\n    });\n    const bean = new CertInfoEntity();\n    if (found) {\n      //bean\n      bean.id = found.id;\n    } else {\n      //create\n      bean.pipelineId = pipelineId;\n      bean.userId = userId;\n      bean.fromType = fromType\n      if (!domains || domains.length === 0) {\n        return;\n      }\n    }\n\n    if (!domains || domains.length === 0) {\n      bean.domain = '';\n      bean.domains = '';\n      bean.domainCount = 0;\n    } else {\n      bean.domain = domains[0];\n      bean.domains = domains.join(',');\n      bean.domainCount = domains.length;\n    }\n\n    await this.addOrUpdate(bean);\n    return bean.id\n  }\n\n  async deleteByPipelineId(id: number) {\n    if (!id) {\n      return;\n    }\n    await this.repository.delete({\n      pipelineId: id,\n    });\n  }\n\n  async getMatchCertList(params: { domains: string[]; userId: number }) {\n    const { domains, userId } = params;\n    if (!domains) {\n      throw new CodeException({\n        ...Constants.res.openCertNotFound,\n        message:\"域名不能为空\"\n      });\n    }\n\n    const list = await this.find({\n      select: {\n        id: true,\n        domains: true,\n        expiresTime:true,\n        pipelineId:true,\n      },\n      where: {\n        userId,\n      },\n      order: {\n        id: 'DESC',\n      },\n    });\n    //遍历查找\n    return list.filter(item => {\n      const itemDomains = item.domains.split(',');\n      return utils.domain.match(domains, itemDomains);\n    });\n  }\n\n  async getCertInfoById(req: { id: number; userId: number }) {\n    const entity = await this.info(req.id);\n    if (!entity || entity.userId !== req.userId) {\n      throw new CodeException(Constants.res.openCertNotFound);\n    }\n\n    if (!entity.certInfo) {\n      throw new CodeException(Constants.res.openCertNotReady);\n    }\n    const certInfo = JSON.parse(entity.certInfo) as CertInfo;\n    const certReader = new CertReader(certInfo);\n    return certReader.toCertInfo();\n  }\n\n  async updateCertByPipelineId(pipelineId: number, cert: CertInfo,file?:string,fromType = 'pipeline') {\n    const found = await this.repository.findOne({\n      where: {\n        pipelineId,\n      },\n    });\n    const bean = await this.updateCert({\n      id: found?.id,\n      certReader: new CertReader(cert),\n      fromType,\n      file\n    });\n    return bean;\n  }\n\n  private async updateCert(req: UploadCertReq) {\n    const bean = new CertInfoEntity();\n    const { id, fromType,userId, certReader } = req;\n    if (id) {\n      bean.id = id;\n    } else {\n      bean.fromType = fromType;\n    }\n    const certInfo = certReader.toCertInfo();\n    bean.certInfo = JSON.stringify(certInfo);\n    bean.applyTime = new Date().getTime();\n    const domains = certReader.detail.domains.altNames;\n    bean.domains = domains.join(',');\n    bean.domain = domains[0];\n    bean.domainCount = domains.length;\n    bean.expiresTime = certReader.expires;\n    bean.certProvider = certReader.detail.issuer.commonName;\n    bean.userId = userId\n    if(req.file){\n      bean.certFile = req.file\n    }\n    await this.addOrUpdate(bean);\n    return bean;\n  }\n\n  async getByPipelineId(pipelineId: number) {\n    return await this.repository.findOne({\n      where: {\n        pipelineId,\n      },\n    });\n\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/monitor/service/dns-custom.ts",
    "content": "import { LocalCache } from '@certd/basic';\nimport dnsSdk from 'dns'\nconst dns = dnsSdk.promises\n\nexport class DnsCustom{\n  resolver: any;\n\n  constructor(dnsServers:string[]) {\n    const resolver = new dns.Resolver();\n    resolver.setServers(dnsServers);\n    this.resolver = resolver;\n  }\n  async resolve(hostname:string,options:any):Promise<string[]>{\n    // { family: undefined, hints: 0, all: true }\n\n    const cnames = await this.resolver.resolveCname(hostname)\n    let cnameIps = []\n    // deep\n    if (cnames && cnames.length > 0) {\n      for (let cname of cnames) {\n        const cnameIp = await this.resolve(cname,options)\n        if (cnameIp && cnameIp.length > 0) {\n          cnameIps.push(...cnameIp)\n        }\n      }\n    }\n    let v4 = []\n    let v6 = []\n\n    const {family, all} = options\n    if(family === 6 && !all){\n      v6= await this.resolver.resolve6(hostname)\n    }\n    if(family === 4 && !all){\n      v4 = await this.resolver.resolve4(hostname)\n    }\n\n    if(all){\n       v4 = await this.resolver.resolve4(hostname)\n       v6 = await this.resolver.resolve6(hostname)\n    }\n\n    return [...v4,...v6,...cnameIps]\n  }\n\n  async resolve4(hostname:string,options:any):Promise<string[]>{\n    return await this.resolver.resolve4(hostname,options)\n  }\n  async resolve6(hostname:string,options:any):Promise<string[]>{\n    return await this.resolver.resolve6(hostname,options)\n  }\n  async resolveAny(hostname:string,options:any):Promise<string[]>{\n    return await this.resolver.resolveAny(hostname,options)\n  }\n\n  async resolveCname(hostname:string,options:any):Promise<string[]>{\n    return await this.resolver.resolveCname(hostname,options)\n  }\n\n\n}\n\nexport class DnsContainer{\n  bucket: LocalCache<DnsCustom> = new LocalCache()\n\n  constructor() {}\n  getDns(server:string[]){\n    const key = server.join(',')\n    let dns = this.bucket.get(key)\n    if (dns){\n      return dns\n    }\n    dns = new DnsCustom(server)\n    this.bucket.set(key,dns)\n    return dns\n  }\n}\n\nexport const dnsContainer = new DnsContainer()\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/monitor/service/site-info-service.ts",
    "content": "import {Inject, Provide, Scope, ScopeEnum} from \"@midwayjs/core\";\nimport {BaseService, NeedSuiteException, NeedVIPException, SysSettingsService} from \"@certd/lib-server\";\nimport {InjectEntityModel} from \"@midwayjs/typeorm\";\nimport {Repository} from \"typeorm\";\nimport {SiteInfoEntity} from \"../entity/site-info.js\";\nimport {siteTester} from \"./site-tester.js\";\nimport dayjs from \"dayjs\";\nimport {logger, utils} from \"@certd/basic\";\nimport {PeerCertificate} from \"tls\";\nimport {NotificationService} from \"../../pipeline/service/notification-service.js\";\nimport {isComm, isPlus} from \"@certd/plus-core\";\nimport {UserSuiteService} from \"@certd/commercial-core\";\nimport {UserSettingsService} from \"../../mine/service/user-settings-service.js\";\nimport {UserSiteMonitorSetting} from \"../../mine/service/models.js\";\nimport {SiteIpService} from \"./site-ip-service.js\";\nimport {SiteIpEntity} from \"../entity/site-ip.js\";\nimport {Cron} from \"../../cron/cron.js\";\nimport { dnsContainer } from \"./dns-custom.js\";\n\n@Provide()\n@Scope(ScopeEnum.Request, {allowDowngrade: true})\nexport class SiteInfoService extends BaseService<SiteInfoEntity> {\n  @InjectEntityModel(SiteInfoEntity)\n  repository: Repository<SiteInfoEntity>;\n\n  @Inject()\n  notificationService: NotificationService;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  @Inject()\n  userSuiteService: UserSuiteService;\n\n  @Inject()\n  userSettingsService: UserSettingsService;\n\n  @Inject()\n  siteIpService: SiteIpService;\n\n\n  @Inject()\n  cron: Cron;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async add(data: SiteInfoEntity) {\n    if (!data.userId) {\n      throw new Error(\"userId is required\");\n    }\n\n    if (isComm()) {\n      const suiteSetting = await this.userSuiteService.getSuiteSetting();\n      if (suiteSetting.enabled) {\n        const userSuite = await this.userSuiteService.getMySuiteDetail(data.userId);\n        if (userSuite.monitorCount.max != -1 && userSuite.monitorCount.max <= userSuite.monitorCount.used) {\n          throw new NeedSuiteException(\"站点监控数量已达上限，请购买或升级套餐\");\n        }\n      }\n    } else if (!isPlus()) {\n      const count = await this.getUserMonitorCount(data.userId);\n      if (count >= 1) {\n        throw new NeedVIPException(\"站点监控数量已达上限，请升级专业版\");\n      }\n    }\n    data.disabled = false;\n\n    const found = await this.repository.findOne({\n      where: {\n        domain: data.domain,\n        userId: data.userId,\n        httpsPort: data.httpsPort || 443\n      }\n    });\n    if (found) {\n      return {id: found.id};\n    }\n\n    return await super.add(data);\n  }\n\n  async update(data: any) {\n    if (!data.id) {\n      throw new Error(\"id is required\");\n    }\n    delete data.userId;\n    await super.update(data);\n  }\n\n  async getUserMonitorCount(userId: number) {\n    if (!userId) {\n      throw new Error(\"userId is required\");\n    }\n    return await this.repository.count({\n      where: {userId}\n    });\n  }\n\n  /**\n   * 检查站点证书过期时间\n   * @param site\n   * @param notify\n   * @param retryTimes\n   */\n  async doCheck(site: SiteInfoEntity, notify = true, retryTimes = null) {\n    if (!site?.domain) {\n      throw new Error(\"站点域名不能为空\");\n    }\n\n    const setting = await this.userSettingsService.getSetting<UserSiteMonitorSetting>(site.userId, UserSiteMonitorSetting);\n    const dnsServer = setting.dnsServer\n    let resolver = null\n    if (dnsServer && dnsServer.length > 0) {\n      resolver = dnsContainer.getDns(dnsServer) as any\n    }\n\n    try {\n      await this.update({\n        id: site.id,\n        checkStatus: \"checking\",\n        lastCheckTime: dayjs().valueOf()\n      });\n      const res = await siteTester.test({\n        host: site.domain,\n        port: site.httpsPort,\n        retryTimes,\n        resolver\n      });\n\n      const certi: PeerCertificate = res.certificate;\n      if (!certi) {\n        throw new Error(\"没有发现证书\");\n      }\n      const expires = certi.valid_to;\n      const allDomains = certi.subjectaltname?.replaceAll(\"DNS:\", \"\").split(\",\") || [];\n      const mainDomain = certi.subject?.CN;\n      let domains = allDomains;\n      if (!allDomains.includes(mainDomain)) {\n        domains = [mainDomain, ...allDomains];\n      }\n      const issuer = `${certi.issuer.O}<${certi.issuer.CN}>`;\n      const isExpired = dayjs().valueOf() > dayjs(expires).valueOf();\n      const status = isExpired ? \"expired\" : \"ok\";\n      const updateData = {\n        id: site.id,\n        certDomains: domains.join(\",\"),\n        certStatus: status,\n        certProvider: issuer,\n        certExpiresTime: dayjs(expires).valueOf(),\n        lastCheckTime: dayjs().valueOf(),\n        error: null,\n        checkStatus: \"ok\"\n      };\n\n      if (site.ipCheck) {\n        delete updateData.checkStatus\n      }\n      await this.update(updateData);\n\n\n      //检查ip\n      await this.checkAllIp(site,retryTimes);\n\n      if (!notify) {\n        return;\n      }\n      try {\n        await this.sendExpiresNotify(site);\n      } catch (e) {\n        logger.error(\"send notify error\", e);\n      }\n    } catch (e) {\n      logger.error(\"check site error\", e);\n      await this.update({\n        id: site.id,\n        checkStatus: \"error\",\n        lastCheckTime: dayjs().valueOf(),\n        error: e.message\n      });\n      if (!notify) {\n        return;\n      }\n      try {\n        await this.sendCheckErrorNotify(site);\n      } catch (e) {\n        logger.error(\"send notify error\", e);\n      }\n    }\n  }\n\n  async checkAllIp(site: SiteInfoEntity,retryTimes = null) {\n    if (!site.ipCheck) {\n      return;\n    }\n    const certExpiresTime = site.certExpiresTime;\n    const onFinished = async (list: SiteIpEntity[]) => {\n      let errorCount = 0;\n      let errorMessage = \"\";\n      for (const item of list) {\n        if (!item) {\n          continue;\n        }\n        errorCount++;\n        if (item.error) {\n          errorMessage += `${item.ipAddress}：${item.error}； \\n`;\n        } else if (item.certExpiresTime !== certExpiresTime) {\n          errorMessage += `${item.ipAddress}：与主站证书过期时间不一致； \\n`;\n        } else {\n          errorCount--;\n        }\n      }\n      if (errorCount <= 0) {\n        //检查正常\n        await this.update({\n          id: site.id,\n          checkStatus: \"ok\",\n          error: \"\",\n          ipErrorCount: 0\n        });\n        return;\n      }\n      await this.update({\n        id: site.id,\n        checkStatus: \"error\",\n        error: errorMessage,\n        ipErrorCount: errorCount\n      });\n      try {\n        site = await this.info(site.id);\n        await this.sendCheckErrorNotify(site, true);\n      } catch (e) {\n        logger.error(\"send notify error\", e);\n      }\n    };\n    await this.siteIpService.syncAndCheck(site, retryTimes,onFinished);\n  }\n\n  /**\n   * 检查\n   * @param id\n   * @param notify\n   * @param retryTimes\n   */\n  async check(id: number, notify = false, retryTimes = null) {\n    const site = await this.info(id);\n    if (!site) {\n      throw new Error(\"站点不存在\");\n    }\n    return await this.doCheck(site, notify, retryTimes);\n  }\n\n  async sendCheckErrorNotify(site: SiteInfoEntity, fromIpCheck = false) {\n    const url = await this.notificationService.getBindUrl(\"#/certd/monitor/site\");\n    const setting = await this.userSettingsService.getSetting<UserSiteMonitorSetting>(site.userId, UserSiteMonitorSetting)\n    // 发邮件\n    await this.notificationService.send(\n      {\n        id: setting?.notificationId,\n        useDefault: true,\n        logger: logger,\n        body: {\n          url,\n          title: `站点证书${fromIpCheck ? \"(IP)\" : \"\"}检查出错<${site.name}>`,\n          content: `站点名称： ${site.name} \\n站点域名： ${site.domain} \\n错误信息：${site.error}`,\n          errorMessage: site.error\n        }\n      },\n      site.userId\n    );\n  }\n\n  async sendExpiresNotify(site: SiteInfoEntity) {\n\n    const tipDays = 10;\n\n    const expires = site.certExpiresTime;\n    const validDays = dayjs(expires).diff(dayjs(), \"day\");\n    const url = await this.notificationService.getBindUrl(\"#/certd/monitor/site\");\n    const setting = await this.userSettingsService.getSetting<UserSiteMonitorSetting>(site.userId, UserSiteMonitorSetting)\n    const content = `站点名称： ${site.name} \\n站点域名： ${site.domain} \\n证书域名： ${site.certDomains} \\n颁发机构： ${site.certProvider} \\n过期时间： ${dayjs(site.certExpiresTime).format(\"YYYY-MM-DD\")} \\n`;\n    if (validDays >= 0 && validDays < tipDays) {\n      // 发通知\n      await this.notificationService.send(\n        {\n          id: setting?.notificationId,\n          useDefault: true,\n          logger: logger,\n          body: {\n            title: `站点证书即将过期，剩余${validDays}天，<${site.name}>`,\n            content,\n            url,\n            errorMessage: \"站点证书即将过期\"\n          }\n        },\n        site.userId\n      );\n    } else if (validDays < 0) {\n      //发过期通知\n      await this.notificationService.send(\n        {\n          id: setting?.notificationId,\n          useDefault: true,\n          logger: logger,\n          body: {\n            title: `站点证书已过期${-validDays}天<${site.name}>`,\n            content,\n            url,\n            errorMessage: \"站点证书已过期\"\n          }\n        },\n        site.userId\n      );\n    }\n  }\n\n  async checkAllByUsers(userId: any) {\n    if (!userId) {\n      throw new Error(\"userId is required\");\n    }\n    const sites = await this.repository.find({\n      where: {userId}\n    });\n    this.checkList(sites,false);\n  }\n\n  async checkList(sites: SiteInfoEntity[],isCommon: boolean) {\n    const cache = {}\n    const getFromCache = async (userId: number) =>{\n      if (cache[userId]) {\n        return cache[userId];\n      }\n      const setting =  await this.userSettingsService.getSetting<UserSiteMonitorSetting>(userId, UserSiteMonitorSetting)\n      cache[userId] = setting\n      return setting;\n    }\n    for (const site of sites) {\n      const setting = await getFromCache(site.userId)\n      if (isCommon) {\n        //公共的检查，排除有设置cron的用户\n        if  (setting?.cron) {\n          //设置了cron，跳过公共检查\n          continue;\n        }\n      }\n      let retryTimes = setting?.retryTimes\n      this.doCheck(site,true,retryTimes).catch(e => {\n        logger.error(`检查站点证书失败，${site.domain}`, e.message);\n      });\n      await utils.sleep(100);\n    }\n  }\n\n  async getSetting(userId: number) {\n    return await this.userSettingsService.getSetting<UserSiteMonitorSetting>(userId, UserSiteMonitorSetting);\n  }\n\n  async saveSetting(userId: number, bean: UserSiteMonitorSetting) {\n    await this.userSettingsService.saveSetting(userId, bean);\n    if(bean.cron){\n      //注册job\n      await this.registerSiteMonitorJob(userId);\n    }else{\n      this.clearSiteMonitorJob(userId);\n    }\n  }\n\n  async ipCheckChange(req: { id: any; ipCheck: any }) {\n\n    await this.update({\n      id: req.id,\n      ipCheck: req.ipCheck\n    });\n    if (req.ipCheck) {\n      const site = await this.info(req.id);\n      await this.siteIpService.sync(site);\n    }\n  }\n\n  async disabledChange(req: { disabled: any; id: any }) {\n    await this.update({\n      id: req.id,\n      disabled: req.disabled\n    });\n    if (!req.disabled) {\n      const site = await this.info(req.id);\n      await this.doCheck(site);\n    }\n  }\n\n  async doImport(req: { text: string; userId: number }) {\n    if (!req.text) {\n      throw new Error(\"text is required\");\n    }\n    if (!req.userId) {\n      throw new Error(\"userId is required\");\n    }\n\n    const rows = req.text.split(\"\\n\");\n\n    const list = [];\n    for (const item of rows) {\n      if (!item) {\n        continue;\n      }\n      const arr = item.trim().split(\":\");\n      if (arr.length === 0) {\n        continue;\n      }\n      const domain = arr[0];\n      let port = 443;\n      let name = domain;\n      if (arr.length > 1) {\n        try {\n          port = parseInt(arr[1] || \"443\");\n        } catch (e) {\n          throw new Error(`${item}格式错误`);\n        }\n\n      }\n      if (arr.length > 2) {\n        name = arr[2] || domain;\n      }\n\n      list.push({\n        domain,\n        name,\n        httpsPort: port,\n        userId: req.userId\n      });\n    }\n\n    const batchAdd = async (list: any[]) => {\n      for (const item of list) {\n        await this.add(item);\n      }\n\n      // await this.checkAllByUsers(req.userId);\n    };\n    await batchAdd(list);\n  }\n\n  clearSiteMonitorJob(userId: number) {\n    this.cron.remove(`siteMonitor-${userId}`);\n  }\n\n  async registerSiteMonitorJob(userId?: number) {\n\n    if(!userId){\n      //注册公共job\n      logger.info(`注册站点证书检查定时任务`)\n      this.cron.register({\n        name: 'siteMonitor',\n        cron: '0 0 0 * * *',\n        job:async ()=>{\n          await this.triggerJobOnce()\n        },\n      });\n      logger.info(`注册站点证书检查定时任务完成`)\n    }else{\n      const setting = await this.userSettingsService.getSetting<UserSiteMonitorSetting>(userId, UserSiteMonitorSetting);\n      if (!setting.cron) {\n        return;\n      }\n      //注册个人的\n      this.cron.register({\n        name: `siteMonitor-${userId}`,\n        cron: setting.cron,\n        job: () => this.triggerJobOnce(userId),\n      });\n    }\n\n  }\n\n  async triggerJobOnce(userId?:number) {\n    logger.info(`站点证书检查开始执行[${userId??'所有用户'}]`);\n    const query:any = { disabled: false };\n    if(userId){\n      query.userId = userId;\n      //判断是否已关闭\n      const setting = await this.userSettingsService.getSetting<UserSiteMonitorSetting>(userId, UserSiteMonitorSetting);\n      if (!setting.cron) {\n        return;\n      }\n    }\n    let offset = 0;\n    const limit = 50;\n    while (true) {\n      const res = await this.page({\n        query: query,\n        page: { offset, limit },\n      });\n      const { records } = res;\n\n      if (records.length === 0) {\n        break;\n      }\n      offset += records.length;\n      const isCommon = !userId;\n      await this.checkList(records,isCommon);\n    }\n\n    logger.info(`站点证书检查完成[${userId??'所有用户'}]`);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/monitor/service/site-ip-service.ts",
    "content": "import {Inject, Provide, Scope, ScopeEnum} from \"@midwayjs/core\";\nimport {BaseService, SysSettingsService} from \"@certd/lib-server\";\nimport {InjectEntityModel} from \"@midwayjs/typeorm\";\nimport {Repository} from \"typeorm\";\nimport {SiteInfoEntity} from \"../entity/site-info.js\";\nimport {NotificationService} from \"../../pipeline/service/notification-service.js\";\nimport {UserSuiteService} from \"@certd/commercial-core\";\nimport {UserSettingsService} from \"../../mine/service/user-settings-service.js\";\nimport {SiteIpEntity} from \"../entity/site-ip.js\";\nimport dnsSdk from \"dns\";\nimport {logger} from \"@certd/basic\";\nimport dayjs from \"dayjs\";\nimport {siteTester} from \"./site-tester.js\";\nimport {PeerCertificate} from \"tls\";\nimport { UserSiteMonitorSetting } from \"../../mine/service/models.js\";\nimport { dnsContainer } from \"./dns-custom.js\";\n\nconst dns =  dnsSdk.promises;\n\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class SiteIpService extends BaseService<SiteIpEntity> {\n  @InjectEntityModel(SiteIpEntity)\n  repository: Repository<SiteIpEntity>;\n  @InjectEntityModel(SiteInfoEntity)\n  siteInfoRepository: Repository<SiteInfoEntity>;\n\n  @Inject()\n  notificationService: NotificationService;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  @Inject()\n  userSuiteService: UserSuiteService;\n\n  @Inject()\n  userSettingsService: UserSettingsService;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async add(data: SiteIpEntity) {\n    if (!data.userId) {\n      throw new Error(\"userId is required\");\n    }\n    data.disabled = false;\n    const res= await super.add(data);\n    await this.updateIpCount(data.siteId)\n    return res\n  }\n\n\n  async update(data: any) {\n    if (!data.id) {\n      throw new Error(\"id is required\");\n    }\n    delete data.userId;\n    await super.update(data);\n  }\n\n\n\n  async sync(entity: SiteInfoEntity,check:boolean = true) {\n\n    const domain = entity.domain;\n\n    const setting = await this.userSettingsService.getSetting<UserSiteMonitorSetting>(entity.userId, UserSiteMonitorSetting);\n\n    const dnsServer = setting.dnsServer\n    let resolver = dns\n    if (dnsServer && dnsServer.length > 0) {\n      resolver = dnsContainer.getDns(dnsServer) as any\n    }\n\n    //从域名解析中获取所有ip\n    const ips = await this.getAllIpsFromDomain(domain,resolver);\n    if (ips.length === 0 ) {\n      logger.warn(`没有发现${domain}的IP`)\n      return\n    }\n\n    const oldIps = await this.repository.find({\n     where:{\n       siteId: entity.id,\n       from:\"sync\"\n     }\n    })\n\n    let hasChanged = true\n    if (oldIps.length === ips.length ){\n      //检查是否有变化\n        const oldIpList = oldIps.map(ip=>ip.ipAddress).sort().join(\",\")\n        const newIpList = ips.sort().join(\",\")\n        if(oldIpList === newIpList){\n          //无变化\n          hasChanged = false\n        }\n    }\n\n    if(hasChanged){\n      logger.info(`发现${domain}的IP变化，需要更新，旧IP:${oldIps.map(ip=>ip.ipAddress).join(\",\")}，新IP:${ips.join(\",\")}`)\n      //有变化需要更新\n      //删除所有的ip\n      await this.repository.delete({\n        siteId: entity.id,\n        from: \"sync\"\n      });\n\n      //添加新的ip\n      for (const ip of ips) {\n        await this.repository.save({\n          ipAddress: ip,\n          userId: entity.userId,\n          siteId: entity.id,\n          from: \"sync\",\n          disabled:false,\n        });\n        await this.updateIpCount(entity.id)\n      }\n    }\n    if (check){\n      await this.checkAll(entity);\n    }\n  }\n\n  async check(ipId: number, domain: string, port: number,retryTimes = null) {\n    if(!ipId){\n      return\n    }\n    const entity = await this.info(ipId);\n    if (!entity) {\n      return;\n    }\n    try {\n      await this.update({\n        id: entity.id,\n        checkStatus: \"checking\",\n        lastCheckTime: dayjs().valueOf()\n      });\n      const res = await siteTester.test({\n        host: domain,\n        port: port,\n        retryTimes : retryTimes??3,\n        ipAddress: entity.ipAddress\n      });\n\n      const certi: PeerCertificate = res.certificate;\n      if (!certi) {\n        throw new Error(\"没有发现证书\");\n      }\n      const expires = certi.valid_to;\n      const allDomains = certi.subjectaltname?.replaceAll(\"DNS:\", \"\").split(\",\") || [];\n      const mainDomain = certi.subject?.CN;\n      let domains = allDomains;\n      if (!allDomains.includes(mainDomain)) {\n        domains = [mainDomain, ...allDomains];\n      }\n      const issuer = `${certi.issuer.O}<${certi.issuer.CN}>`;\n      const isExpired = dayjs().valueOf() > dayjs(expires).valueOf();\n      const status = isExpired ? \"expired\" : \"ok\";\n      const updateData = {\n        id: entity.id,\n        certDomains: domains.join(\",\"),\n        certStatus: status,\n        certProvider: issuer,\n        certExpiresTime: dayjs(expires).valueOf(),\n        lastCheckTime: dayjs().valueOf(),\n        error: null,\n        checkStatus: \"ok\"\n      };\n\n      await this.update(updateData);\n\n      return updateData\n\n    } catch (e) {\n      logger.error(\"check site ip error\", e);\n      await this.update({\n        id: entity.id,\n        checkStatus: \"error\",\n        lastCheckTime: dayjs().valueOf(),\n        error: e.message\n      });\n      return {\n        id: entity.id,\n        ipAddress: entity.ipAddress,\n        error: e.message\n      }\n    }\n  }\n\n  async checkAll(siteInfo: SiteInfoEntity,retryTimes = null,onFinish?: (e: any) => void) {\n    const siteId = siteInfo.id;\n    const ips = await this.repository.find({\n      where: {\n        siteId: siteId\n      }\n    });\n    const domain = siteInfo.domain;\n    const port = siteInfo.httpsPort;\n    const promiseList = [];\n    for (const item of ips) {\n      const func = async () => {\n        try {\n          return await this.check(item.id, domain, port,retryTimes);\n        } catch (e) {\n          logger.error(\"check site item error\", e);\n          return {\n            ...item,\n            error:e.message\n          }\n        }\n      }\n      promiseList.push(func());\n    }\n    Promise.all(promiseList).then((res)=>{\n      const finished = res.filter(item=>{\n        return item!=null\n      })\n      if (onFinish) {\n        onFinish && onFinish(finished)\n      }\n    })\n  }\n\n  async getAllIpsFromDomain(domain: string,resolver:any = dns):Promise<string[]> {\n    const getFromV4 = async ():Promise<string[]> => {\n      try{\n        return await resolver.resolve4(domain);\n      }catch (err) {\n        logger.error(`[${domain}] resolve4 error`, err)\n        return []\n      }\n    }\n    const getFromV6 = async ():Promise<string[]> => {\n      try{\n        return await resolver.resolve6(domain);\n      }catch (err) {\n        logger.error(`[${domain}] resolve6 error`, err)\n        return []\n      }\n    }\n\n\n    return Promise.all([getFromV4(), getFromV6()]).then(res => {\n      return [...res[0], ...res[1]];\n    });\n  }\n\n\n  async updateIpCount(siteId:number){\n    const count = await this.repository.count({\n      where:{\n        siteId\n      }\n    })\n    await this.siteInfoRepository.update({\n      //where\n        id:siteId,\n    },\n      {\n        //update\n      ipCount:count\n    })\n  }\n\n  async doImport(req: { text: string; userId:number, siteId:number }) {\n    if (!req.text) {\n      throw new Error(\"text is required\");\n    }\n    if (!req.siteId) {\n      throw new Error(\"siteId is required\");\n    }\n\n    const siteEntity = await this.siteInfoRepository.findOne({\n      where: {\n        id: req.siteId,\n        userId:req.userId\n      }\n    });\n    if (!siteEntity) {\n      throw new Error(`站点${req.siteId}不存在`);\n    }\n\n    const userId = siteEntity.userId;\n\n    const rows = req.text.split(\"\\n\");\n\n    const list = [];\n    for (const item of rows) {\n      if (!item) {\n        continue;\n      }\n      list.push({\n        ipAddress:item,\n        userId: userId,\n        siteId: req.siteId,\n        from: \"import\",\n        disabled:false,\n      });\n    }\n\n    const batchAdd = async (list: any[]) => {\n      for (const item of list) {\n        await this.add(item);\n      }\n\n      // await this.checkAllByUsers(req.userId);\n    };\n    await batchAdd(list);\n  }\n\n  async syncAndCheck(siteEntity:SiteInfoEntity,retryTimes = null,onFinish?: (e: any) => void){\n    await this.sync(siteEntity,false);\n    await this.checkAll(siteEntity,retryTimes,onFinish);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/monitor/service/site-tester.ts",
    "content": "import { logger, safePromise, utils } from \"@certd/basic\";\nimport { merge } from \"lodash-es\";\nimport https from \"https\";\nimport { PeerCertificate } from \"tls\";\n\nexport type SiteTestReq = {\n  host: string; // 只用域名部分\n  port?: number;\n  method?: string;\n  retryTimes?: number;\n  ipAddress?: string;\n\n  resolver?: any;\n};\n\nexport type SiteTestRes = {\n  certificate?: PeerCertificate;\n};\n\nexport class SiteTester {\n  async test(req: SiteTestReq): Promise<SiteTestRes> {\n    logger.info(\"测试站点:\", JSON.stringify(req));\n    const maxRetryTimes = req.retryTimes == null ? 3 : req.retryTimes;\n    let tryCount = 0;\n    let result: SiteTestRes = {};\n    while (true) {\n      try {\n        result = await this.doTestOnce(req);\n        return result;\n      } catch (e) {\n        tryCount++;\n        if (tryCount > maxRetryTimes) {\n          logger.error(`测试站点出错，已超过最大重试次数（${maxRetryTimes}）`, e.message);\n          throw e;\n        }\n        //指数退避\n        const time = 2 ** tryCount;\n        logger.error(`测试站点出错，${time}s后重试(${tryCount}/${maxRetryTimes})`, e);\n        await utils.sleep(time * 1000);\n      }\n    }\n  }\n\n  async doTestOnce(req: SiteTestReq): Promise<SiteTestRes> {\n    const options: any = merge(\n      {\n        port: 443,\n        method: \"GET\",\n        rejectUnauthorized: false\n      },\n      req\n    );\n\n    let customLookup = null\n    if (req.ipAddress) {\n      //使用固定的ip\n      const ipAddress = req.ipAddress;\n      options.headers = {\n        host: options.host,\n        //sni\n        servername: options.host\n      };\n      options.host = ipAddress;\n    }else if (req.resolver ) {\n      // 非ip address 请求时\n      const resolver = req.resolver\n      customLookup = async (hostname:string, options:any, callback)=> {\n        console.log(hostname, options);\n\n        // { family: undefined, hints: 0, all: true }\n        const res = await resolver.resolve(hostname, options)\n        console.log(\"custom lookup res:\",res)\n        callback(null, res);\n      }\n    }\n\n    options.agent = new https.Agent({ keepAlive: false, lookup: customLookup });\n\n    // 创建 HTTPS 请求\n    const requestPromise = safePromise((resolve, reject) => {\n      const req = https.request(options, res => {\n        // 获取证书\n        // @ts-ignore\n        const certificate = res.socket.getPeerCertificate();\n        // logger.info('证书信息', certificate);\n        if (certificate.subject == null) {\n          logger.warn(\"证书信息为空\");\n          resolve({\n            certificate: null\n          });\n        }\n        resolve({\n          certificate\n        });\n        res.socket.end();\n        // 关闭响应\n        res.destroy();\n      });\n\n      req.on(\"error\", e => {\n        reject(e);\n      });\n      req.end();\n    });\n\n    return await requestPromise;\n  }\n}\n\nexport const siteTester = new SiteTester();\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/open/entity/open-key.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity('cd_open_key')\nexport class OpenKeyEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column({ name: 'user_id', comment: '用户id' })\n  userId: number;\n\n  @Column({ name: 'key_id', comment: 'keyId' })\n  keyId: string;\n\n  @Column({ name: 'key_secret', comment: 'keySecret' })\n  keySecret: string;\n\n  @Column({ name: 'scope', comment: '权限范围' })\n  scope: string; // open 仅开放接口、 user 用户所有权限\n\n  @Column({ name: 'create_time', comment: '创建时间', default: () => 'CURRENT_TIMESTAMP' })\n  createTime: Date;\n\n  @Column({ name: 'update_time', comment: '修改时间', default: () => 'CURRENT_TIMESTAMP' })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/open/service/open-key-service.ts",
    "content": "import { Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { BaseService, Constants, CodeException, PageReq } from '@certd/lib-server';\nimport { InjectEntityModel } from '@midwayjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { OpenKeyEntity } from '../entity/open-key.js';\nimport { utils } from '@certd/basic';\nimport crypto from 'crypto';\nimport dayjs from 'dayjs';\n\nexport type OpenKey = {\n  userId: number;\n  keyId: string;\n  keySecret: string;\n  encrypt: boolean;\n  scope: string;\n};\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class OpenKeyService extends BaseService<OpenKeyEntity> {\n  @InjectEntityModel(OpenKeyEntity)\n  repository: Repository<OpenKeyEntity>;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async page(pageReq: PageReq<OpenKeyEntity>) {\n    return await super.page(pageReq);\n  }\n\n  async add(bean: OpenKeyEntity) {\n    return await this.generate(bean.userId, bean.scope);\n  }\n\n  async generate(userId: number, scope: string) {\n    const keyId = utils.id.simpleNanoId(18) + '_key';\n    const secretKey = crypto.randomBytes(32);\n    const keySecret = Buffer.from(secretKey).toString('hex');\n    const entity = new OpenKeyEntity();\n    entity.userId = userId;\n    entity.keyId = keyId;\n    entity.keySecret = keySecret;\n    entity.scope = scope ?? 'open';\n    await this.repository.save(entity);\n    return entity;\n  }\n\n  async getByKeyId(keyId: string) {\n    if (!keyId) {\n      throw new Error('keyId不能为空');\n    }\n    return this.repository.findOne({ where: { keyId } });\n  }\n\n  async verifyOpenKey(openKey: string): Promise<OpenKey> {\n    // openkey 组成，content = base64({keyId,t,encrypt,signType}) ,sign = md5({keyId,t,encrypt,signType}secret) , key = content.sign\n    const [content, sign] = openKey.split('.');\n    const contentJson = Buffer.from(content, 'base64').toString();\n    const { keyId, t, encrypt, signType } = JSON.parse(contentJson);\n    // 正负不超过3分钟 ,timestamps单位为秒\n    if (Math.abs(Number(t) - Math.floor(Date.now() / 1000)) > 180) {\n      throw new CodeException(Constants.res.openKeyExpiresError);\n    }\n\n    const entity = await this.getByKeyId(keyId);\n    if (!entity) {\n      throw new Error('openKey不存在');\n    }\n    const secret = entity.keySecret;\n    let computedSign = '';\n    if (signType === 'md5') {\n      computedSign = utils.hash.md5(contentJson + secret);\n    } else if (signType === 'sha256') {\n      computedSign = utils.hash.sha256(contentJson + secret);\n    } else {\n      throw new CodeException(Constants.res.openKeySignTypeError);\n    }\n    if (Buffer.from(computedSign).toString('base64') !== sign) {\n      throw new CodeException(Constants.res.openKeySignError);\n    }\n\n    if (!entity.userId) {\n      throw new CodeException(Constants.res.openKeyError);\n    }\n\n    return {\n      userId: entity.userId,\n      keyId: entity.keyId,\n      keySecret: entity.keySecret,\n      encrypt: encrypt,\n      scope: entity.scope,\n    };\n  }\n\n  async getApiToken(id: number) {\n    if (!id) {\n      throw new Error('id不能为空');\n    }\n    const entity = await this.repository.findOne({ where: { id } });\n    if (!entity) {\n      throw new Error('id不存在');\n    }\n    const { keyId, keySecret } = entity;\n    const openKey = {\n      keyId,\n      t: dayjs().unix(),\n      encrypt: false,\n      signType: 'md5',\n    };\n    const content = JSON.stringify(openKey);\n    const sign = utils.hash.md5(content + keySecret);\n    return Buffer.from(content).toString('base64') + '.' + Buffer.from(sign).toString('base64');\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/entity/history-log.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity('pi_history_log')\nexport class HistoryLogEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column({ name: 'user_id', comment: '用户id' })\n  userId: number;\n\n  @Column({ name: 'pipeline_id', comment: '流水线' })\n  pipelineId: number;\n\n  @Column({ name: 'history_id', comment: '历史id' })\n  historyId: number;\n\n  @Column({\n    name: 'node_id',\n    comment: '任务节点id',\n    length: 100,\n    nullable: true,\n  })\n  nodeId: string;\n\n  @Column({ comment: '日志内容', length: 40960, nullable: true })\n  logs: string;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/entity/history.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity('pi_history')\nexport class HistoryEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column({ name: 'user_id', comment: '用户id' })\n  userId: number;\n\n  @Column({ name: 'pipeline_id', comment: '流水线' })\n  pipelineId: number;\n  @Column({ comment: '运行状态', length: 40960, nullable: true })\n  pipeline: string;\n\n  @Column({ comment: '结果状态', length: 20, nullable: true })\n  status: string;\n\n  @Column({ name: 'trigger_type',comment: '触发类型', length: 20, nullable: true })\n  triggerType: string;\n\n  @Column({\n    name: 'end_time',\n    comment: '结束时间',\n    nullable: true,\n  })\n  endTime: Date;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n\n  pipelineTitle: string;\n\n  fillPipelineTitle() {\n    if (this.pipeline) {\n      const pipeline = JSON.parse(this.pipeline);\n      this.pipelineTitle = pipeline.title;\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/entity/notification.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity('pi_notification')\nexport class NotificationEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column({ name: 'user_id', comment: 'UserId' })\n  userId: number;\n\n  @Column({ name: 'type', comment: '通知类型' })\n  type: string;\n\n  @Column({ name: 'name', comment: '名称' })\n  name: string;\n\n  @Column({ name: 'setting', comment: '通知配置', length: 10240 })\n  setting: string;\n\n  @Column({ name: 'is_default', comment: '是否默认' })\n  isDefault: boolean;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/entity/pipeline-group.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity('pi_pipeline_group')\nexport class PipelineGroupEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column({ name: 'user_id', comment: '用户id' })\n  userId: number;\n\n  @Column({ name: 'name', comment: '分组名称' })\n  name: string;\n\n  @Column({ name: 'icon', comment: '图标' })\n  icon: string;\n\n  @Column({ name: 'favorite', comment: '收藏' })\n  favorite: boolean;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/entity/pipeline.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity('pi_pipeline')\nexport class PipelineEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column({ name: 'user_id', comment: '用户id' })\n  userId: number;\n\n  @Column({ name: 'title', comment: '标题' })\n  title: string;\n\n  @Column({ comment: '配置', length: 40960 })\n  content: string;\n\n  @Column({ name: 'keep_history_count', comment: '历史记录保持数量', nullable: true })\n  keepHistoryCount: number;\n\n  @Column({ name: 'group_id', comment: '分组id', nullable: true })\n  groupId: number;\n\n  @Column({ comment: '备注', length: 100, nullable: true })\n  remark: string;\n\n  @Column({ comment: '状态', length: 100, nullable: true })\n  status: string;\n\n  @Column({ comment: '启用/禁用', nullable: true, default: false })\n  disabled: boolean;\n\n  // cert_apply: 证书申请；cert_upload: 证书上传; backup: 备份; custom:自定义; template: 模板\n  @Column({ comment: '类型', nullable: true, default: 'cert' })\n  type: string;\n\n  // custom: 自定义; monitor: 监控;\n  @Column({ comment: '来源', nullable: true, default: '' })\n  from: string;\n\n  @Column({ name:\"template_id\", comment: '关联模版id', nullable: true, default: 0 })\n  templateId: number;\n\n  @Column({ name:\"is_template\", comment: '是否模版', nullable: true, default: false })\n  isTemplate: boolean;\n\n  @Column({\n    name: 'last_history_time',\n    comment: '最后一次执行时间',\n    nullable: true,\n  })\n  lastHistoryTime: number;\n\n  // 变量\n  lastVars: any;\n\n  @Column({\n    name: 'order',\n    comment: '排序',\n    nullable: true,\n  })\n  order: number;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/entity/storage.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity('pi_storage')\nexport class StorageEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column({ name: 'user_id', comment: '用户id' })\n  userId: number;\n\n  @Column({ name: 'scope', comment: '范围' })\n  scope: string;\n\n  @Column({ name: 'namespace', comment: '命名空间' })\n  namespace: string;\n\n  @Column({ comment: 'version', length: 100, nullable: true })\n  version: string;\n\n  @Column({ comment: 'key', length: 100, nullable: true })\n  key: string;\n\n  @Column({ comment: 'value', length: 40960, nullable: true })\n  value: string;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/entity/sub-domain.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n/**\n * 子域名托管\n */\n@Entity('pi_sub_domain')\nexport class SubDomainEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column({ name: 'user_id', comment: 'UserId' })\n  userId: number;\n\n  @Column({ name: 'domain', comment: '子域名' })\n  domain: string;\n\n  @Column({ name: 'disabled', comment: '禁用' })\n  disabled: boolean;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/entity/template.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n\nexport type PipelineTemplateType = {\n  input: {\n    [key: string]: {\n        value: string;\n    };\n  }\n}\n\n\n@Entity('pi_template')\nexport class TemplateEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column({ name: 'user_id', comment: '用户id' })\n  userId: number;\n\n  @Column({ name: 'pipeline_id', comment: '流水线id' })\n  pipelineId: number;\n\n  @Column({ name: 'title', comment: '标题' })\n  title: string;\n  @Column({ name: 'desc', comment: '说明' })\n  desc: string;\n\n  @Column({ comment: '配置', length: 40960 })\n  content: string;\n\n  @Column({ comment: '启用/禁用', nullable: true, default: false })\n  disabled: boolean;\n\n  @Column({\n    name: 'order',\n    comment: '排序',\n    nullable: true,\n  })\n  order: number;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/entity/vo/history-detail.ts",
    "content": "import { HistoryEntity } from '../history.js';\nimport { HistoryLogEntity } from '../history-log.js';\n\nexport class HistoryDetail {\n  history: HistoryEntity;\n  log: HistoryLogEntity;\n\n  constructor(history: HistoryEntity, log: HistoryLogEntity) {\n    this.history = history;\n    this.log = log;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/entity/vo/pipeline-detail.ts",
    "content": "import { PipelineEntity } from '../pipeline.js';\nimport { HistoryEntity } from '../history.js';\nimport { HistoryLogEntity } from '../history-log.js';\n\nexport class PipelineDetail {\n  pipeline: PipelineEntity;\n  constructor(pipeline: PipelineEntity) {\n    this.pipeline = pipeline;\n  }\n\n  last: HistoryEntity;\n  logs: HistoryLogEntity[];\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/builtin-plugin-service.ts",
    "content": "import { Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { pluginGroups, pluginRegistry } from '@certd/pipeline';\nimport { cloneDeep } from 'lodash-es';\n\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class BuiltInPluginService {\n  getList() {\n    const collection = pluginRegistry.storage;\n    let list = [];\n    for (const key in collection) {\n      const Plugin = collection[key];\n      if (Plugin?.define?.deprecated) {\n        continue;\n      }\n      //@ts-ignore\n      if(Plugin.define?.type && Plugin.define?.type !== 'builtin'){\n        continue;\n      }\n      list.push({ ...Plugin.define, key });\n    }\n    list = list.sort((a, b) => {\n      return (a.order ?? 10 )- (b.order ?? 10);\n    });\n    return list;\n  }\n\n  getGroups() {\n    const groups:any = cloneDeep(pluginGroups);\n    for (const key in groups) {\n      const group = groups[key];\n      group.plugins = group.plugins.sort((a, b) => {\n        return (a.order ?? 10 )- (b.order ?? 10);\n      });\n    }\n    return groups;\n  }\n\n  getByType(type: string) {\n    return pluginRegistry.getDefine(type);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/db-storage.ts",
    "content": "import { IStorage } from '@certd/pipeline';\nimport { StorageService } from './storage-service.js';\n\nexport class DbStorage implements IStorage {\n  /**\n   * 范围： user / pipeline / runtime / task\n   */\n  storageService: StorageService;\n  userId: number;\n  constructor(userId: number, storageService: StorageService) {\n    this.userId = userId;\n    this.storageService = storageService;\n  }\n\n  async remove(scope: string, namespace: string, version: string, key: string): Promise<void> {\n    throw new Error('Method not implemented.');\n  }\n\n  async get(scope: string, namespace: string, version: string, key: string): Promise<string | null> {\n    const storageEntity = await this.storageService.get({\n      userId: this.userId,\n      scope: scope,\n      namespace: namespace,\n      version,\n      key,\n    });\n\n    if (storageEntity != null) {\n      return storageEntity.value;\n    }\n    return null;\n  }\n\n  async set(scope: string, namespace: string, version: string, key: string, value: string): Promise<void> {\n    await this.storageService.set({\n      userId: this.userId,\n      scope: scope,\n      namespace: namespace,\n      version,\n      key,\n      value,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/dns-provider-service.ts",
    "content": "import { Provide } from '@midwayjs/core';\nimport { dnsProviderRegistry } from '@certd/plugin-cert';\n\n@Provide()\nexport class DnsProviderService {\n  getList() {\n    return dnsProviderRegistry.getDefineList();\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/getter/cname-proxy-service.ts",
    "content": "import { CnameRecord, ICnameProxyService } from '@certd/pipeline';\n\nexport class CnameProxyService implements ICnameProxyService {\n  userId: number;\n  getter: <T>(domain: string, userId?: number) => Promise<T>;\n  constructor(userId: number, getter: (domain: string, userId: number) => Promise<any>) {\n    this.userId = userId;\n    this.getter = getter;\n  }\n\n  async getByDomain(domain: string): Promise<CnameRecord> {\n    return await this.getter<CnameRecord>(domain, this.userId);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/getter/domain-verifier-getter.ts",
    "content": "import {DomainVerifiers, IDomainVerifierGetter} from \"@certd/plugin-cert\";\nimport {DomainService} from \"../../../cert/service/domain-service.js\";\n\nexport class DomainVerifierGetter implements IDomainVerifierGetter {\n  private userId: number;\n  private domainService: DomainService;\n\n  constructor(userId: number, domainService: DomainService) {\n    this.userId = userId;\n    this.domainService = domainService;\n  }\n\n  async getVerifiers(domains: string[]): Promise<DomainVerifiers>{\n    return await this.domainService.getDomainVerifiers(this.userId,domains);\n  }\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/getter/notification-getter.ts",
    "content": "import { INotificationService, NotificationSendReq } from '@certd/pipeline';\nimport {NotificationService} from \"../notification-service.js\";\n\nexport class NotificationGetter implements INotificationService {\n  userId: number;\n  notificationService: NotificationService;\n\n  constructor(userId: number, notificationService: NotificationService) {\n    this.userId = userId;\n    this.notificationService = notificationService;\n  }\n\n  async getDefault() {\n    return await this.notificationService.getDefault(this.userId);\n  }\n\n  async getById(id: any) {\n    return await this.notificationService.getById(id, this.userId);\n  }\n\n  async send(req: NotificationSendReq): Promise<void> {\n    return await this.notificationService.send(req, this.userId);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/getter/sub-domain-getter.ts",
    "content": "import {ISubDomainsGetter} from \"@certd/plugin-cert\";\nimport {SubDomainService} from \"../sub-domain-service.js\";\n\nexport class SubDomainsGetter implements ISubDomainsGetter {\n  userId: number;\n  subDomainService: SubDomainService;\n\n  constructor(userId: number, subDomainService: SubDomainService) {\n    this.userId = userId;\n    this.subDomainService = subDomainService;\n  }\n\n  async getSubDomains() {\n    return await this.subDomainService.getListByUserId(this.userId)\n  }\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/getter/task-service-getter.ts",
    "content": "import { IServiceGetter } from \"@certd/pipeline\";\nimport { ApplicationContext, IMidwayContainer, Provide, Scope, ScopeEnum } from \"@midwayjs/core\";\nimport { AccessGetter, AccessService } from \"@certd/lib-server\";\nimport { CnameProxyService } from \"./cname-proxy-service.js\";\nimport { NotificationGetter } from \"./notification-getter.js\";\nimport { NotificationService } from \"../notification-service.js\";\nimport { CnameRecordService } from \"../../../cname/service/cname-record-service.js\";\nimport { SubDomainsGetter } from \"./sub-domain-getter.js\";\nimport { DomainVerifierGetter } from \"./domain-verifier-getter.js\";\nimport { DomainService } from \"../../../cert/service/domain-service.js\";\nimport { SubDomainService } from \"../sub-domain-service.js\";\n\nexport class TaskServiceGetter implements IServiceGetter{\n  private userId: number;\n  private appCtx : IMidwayContainer;\n  constructor(userId:number,appCtx:IMidwayContainer) {\n    this.userId = userId;\n    this.appCtx = appCtx\n  }\n  async get<T>(serviceName: string): Promise<T> {\n\n    if(serviceName === 'subDomainsGetter'){\n      return await this.getSubDomainsGetter() as T\n    } if (serviceName === 'accessService') {\n      return await this.getAccessService() as T\n    } else if (serviceName === 'cnameProxyService') {\n      return await this.getCnameProxyService() as T\n    } else if (serviceName === 'notificationService') {\n      return await this.getNotificationService() as T\n    } else if (serviceName === 'domainVerifierGetter') {\n      return await this.getDomainVerifierGetter() as T\n    }else{\n      throw new Error(`service ${serviceName} not found`)\n    }\n  }\n\n  async getSubDomainsGetter(): Promise<SubDomainsGetter> {\n    const subDomainsService:SubDomainService = await  this.appCtx.getAsync(\"subDomainService\")\n    return new SubDomainsGetter(this.userId, subDomainsService)\n  }\n\n  async getAccessService(): Promise<AccessGetter> {\n    const accessService:AccessService = await  this.appCtx.getAsync(\"accessService\")\n    return new AccessGetter(this.userId, accessService.getById.bind(accessService));\n  }\n\n  async getCnameProxyService(): Promise<CnameProxyService> {\n    const cnameRecordService:CnameRecordService = await  this.appCtx.getAsync(\"cnameRecordService\")\n    return new CnameProxyService(this.userId, cnameRecordService.getWithAccessByDomain.bind(cnameRecordService));\n  }\n\n  async getNotificationService(): Promise<NotificationGetter> {\n    const notificationService:NotificationService = await  this.appCtx.getAsync(\"notificationService\")\n    return new NotificationGetter(this.userId, notificationService);\n  }\n\n  async getDomainVerifierGetter(): Promise<DomainVerifierGetter> {\n    const domainService:DomainService = await  this.appCtx.getAsync(\"domainService\")\n    return new DomainVerifierGetter(this.userId, domainService);\n  }\n}\nexport type TaskServiceCreateReq = {\n  userId: number;\n}\n\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class TaskServiceBuilder  {\n  @ApplicationContext()\n  appCtx: IMidwayContainer;\n\n  create(req:TaskServiceCreateReq){\n    const userId = req.userId;\n    return new TaskServiceGetter(userId,this.appCtx)\n  }\n}\n\n\n\n\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/history-log-service.ts",
    "content": "import { Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { InjectEntityModel } from '@midwayjs/typeorm';\nimport { In, Repository } from 'typeorm';\nimport { BaseService } from '@certd/lib-server';\nimport { HistoryLogEntity } from '../entity/history-log.js';\n\n/**\n * 证书申请\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class HistoryLogService extends BaseService<HistoryLogEntity> {\n  @InjectEntityModel(HistoryLogEntity)\n  repository: Repository<HistoryLogEntity>;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async save(bean: HistoryLogEntity) {\n    if (bean.id > 0) {\n      await this.update(bean);\n    } else {\n      await this.add(bean);\n    }\n  }\n\n  async deleteByHistoryIds(numbers: number[]) {\n    if (numbers.length === 0) {\n      return;\n    }\n    await this.repository.delete({ historyId: In(numbers) });\n  }\n\n  async deleteByPipelineId(id: number) {\n    await this.repository.delete({ pipelineId: id });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/history-service.ts",
    "content": "import { Config, Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { InjectEntityModel } from '@midwayjs/typeorm';\nimport { In, MoreThan, Repository } from 'typeorm';\nimport { BaseService, PageReq } from '@certd/lib-server';\nimport { HistoryEntity } from '../entity/history.js';\nimport { PipelineEntity } from '../entity/pipeline.js';\nimport { HistoryDetail } from '../entity/vo/history-detail.js';\nimport { HistoryLogService } from './history-log-service.js';\nimport { FileItem, FileStore, Pipeline, RunnableCollection } from '@certd/pipeline';\n\nimport dayjs from 'dayjs';\nimport { DbAdapter } from '../../db/index.js';\nimport { logger } from '@certd/basic';\n\n/**\n * 证书申请\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class HistoryService extends BaseService<HistoryEntity> {\n  @InjectEntityModel(HistoryEntity)\n  repository: Repository<HistoryEntity>;\n\n  @InjectEntityModel(PipelineEntity)\n  pipelineRepository: Repository<PipelineEntity>;\n  @Inject()\n  logService: HistoryLogService;\n\n  @Inject()\n  dbAdapter: DbAdapter;\n\n  @Config('certd')\n  private certdConfig: any;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async page(pageReq: PageReq<HistoryEntity>) {\n    const res = await super.page(pageReq);\n    for (const item of res.records) {\n      item.fillPipelineTitle();\n      delete item.pipeline;\n    }\n    return res;\n  }\n\n  async save(bean: HistoryEntity) {\n    if (bean.id > 0) {\n      await this.update(bean);\n    } else {\n      await this.add(bean);\n    }\n  }\n\n  async detail(historyId: number) {\n    const entity = await this.info(historyId);\n    const log = await this.logService.info(historyId);\n    return new HistoryDetail(entity, log);\n  }\n\n  async start(pipeline: PipelineEntity,triggerType:string) {\n    const bean = {\n      userId: pipeline.userId,\n      pipelineId: pipeline.id,\n      title: pipeline.title,\n      status: 'start',\n      triggerType\n    };\n    const { id } = await this.add(bean);\n    //清除大于pipeline.keepHistoryCount的历史记录\n    await this.clear(pipeline.id, pipeline.keepHistoryCount);\n    return id;\n  }\n\n  private async clear(pipelineId: number, keepCount = 20) {\n    if (pipelineId == null) {\n      return;\n    }\n    const count = await this.repository.count({\n      where: {\n        pipelineId,\n      },\n    });\n    if (count <= keepCount) {\n      return;\n    }\n    let shouldDeleteCount = count - keepCount;\n    const maxDeleteCountBatch = 100;\n    // const fileStore = new FileStore({\n    //   rootDir: this.certdConfig.fileRootDir,\n    //   scope: pipelineId + '',\n    //   parent: '0',\n    // });\n    while (shouldDeleteCount > 0) {\n      const deleteCountBatch = maxDeleteCountBatch > shouldDeleteCount ? shouldDeleteCount : maxDeleteCountBatch;\n      const list = await this.repository.find({\n        select: {\n          id: true,\n        },\n        where: {\n          pipelineId,\n        },\n        order: {\n          id: 'ASC',\n        },\n        skip: 0,\n        take: deleteCountBatch,\n      });\n\n      // for (const historyEntity of list) {\n      //   const id = historyEntity.id;\n      //   try {\n      //     fileStore.deleteByParent(pipelineId + '', id + '');\n      //   } catch (e) {\n      //     logger.error('删除文件失败', e);\n      //   }\n      // }\n      const ids = list.map(item => item.id);\n      await this.deleteByIds(ids, null);\n      shouldDeleteCount -= deleteCountBatch;\n    }\n  }\n\n  async getLastHistory(pipelineId: number) {\n    return await this.repository.findOne({\n      where: {\n        pipelineId,\n      },\n      order: {\n        id: 'DESC',\n      },\n    });\n  }\n\n  async getFiles(history: HistoryEntity) {\n    const status: Pipeline = JSON.parse(history.pipeline);\n    const files: FileItem[] = [];\n    RunnableCollection.each([status], runnable => {\n      if (runnable.runnableType !== 'step') {\n        return;\n      }\n      if (runnable.status?.files != null) {\n        files.push(...runnable.status.files);\n      }\n    });\n    return files;\n  }\n\n  async deleteByIds(ids: number[], userId: number) {\n    if (!ids || ids.length === 0) {\n      return;\n    }\n    const condition: any = {\n      id: In(ids),\n    };\n    if (userId != null) {\n      condition.userId = userId;\n    }\n    await this.repository.delete(condition);\n    await this.logService.deleteByHistoryIds(ids);\n  }\n\n  async deleteByPipelineId(id: number) {\n    if (id == null) {\n      return;\n    }\n    await this.repository.delete({\n      pipelineId: id,\n    });\n\n    try {\n      const fileStore = new FileStore({\n        rootDir: this.certdConfig.fileRootDir,\n        scope: id + '',\n        parent: '0',\n      });\n      fileStore.deleteByParent(id + '', '');\n    } catch (e) {\n      logger.error('删除文件失败', e);\n    }\n  }\n\n  async countPerDay(param: { days: number; userId?: any }) {\n    const todayEnd = dayjs().endOf('day');\n    const where: any = {\n      createTime: MoreThan(todayEnd.add(-param.days, 'day').toDate()),\n    };\n    if (param.userId > 0) {\n      where.userId = param.userId;\n    }\n    const result = await this.getRepository()\n      .createQueryBuilder('main')\n      .select(`${this.dbAdapter.date('main.createTime')}  AS date`) // 将UNIX时间戳转换为日期\n      .addSelect('COUNT(1) AS count')\n      .where(where)\n      .groupBy('date')\n      .getRawMany();\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/notification-service.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport {\n  BaseService,\n  NeedVIPException,\n  SysInstallInfo,\n  SysSettingsService,\n  SysSiteInfo,\n  ValidateException\n} from \"@certd/lib-server\";\nimport { InjectEntityModel } from '@midwayjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { NotificationEntity } from '../entity/notification.js';\nimport { NotificationInstanceConfig, notificationRegistry, NotificationSendReq, sendNotification } from '@certd/pipeline';\nimport { http, utils } from '@certd/basic';\nimport { EmailService } from '../../basic/service/email-service.js';\nimport { isComm, isPlus } from '@certd/plus-core';\n\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class NotificationService extends BaseService<NotificationEntity> {\n  @InjectEntityModel(NotificationEntity)\n  repository: Repository<NotificationEntity>;\n\n  @Inject()\n  emailService: EmailService;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async getSimpleInfo(id: number) {\n    const entity = await this.info(id);\n    if (entity == null) {\n      throw new ValidateException('该通知配置不存在,请确认是否已被删除');\n    }\n    return {\n      id: entity.id,\n      name: entity.name,\n      userId: entity.userId,\n    };\n  }\n\n  getDefineList() {\n    return notificationRegistry.getDefineList();\n  }\n\n  getDefineByType(type: string) {\n    return notificationRegistry.getDefine(type);\n  }\n\n  async add(bean: NotificationEntity) {\n    this.checkNeedPlus(bean.type);\n    const res = await super.add(bean);\n    if(bean.isDefault){\n      await this.setDefault(res.id, bean.userId);\n    }\n    return res\n  }\n\n  async update(bean: NotificationEntity) {\n\n    const old = await this.info(bean.id);\n    this.checkNeedPlus(old.type);\n\n    delete bean.userId;\n    delete bean.type\n    const res = await super.update(bean);\n    if(bean.isDefault){\n      await this.setDefault(bean.id, old.userId);\n    }\n\n    return res\n  }\n\n   checkNeedPlus(type: string){\n    const define = this.getDefineByType(type)\n     //@ts-ignore\n    if (define.needPlus && !isPlus()) {\n      throw new NeedVIPException(\"此通知类型为专业版功能，请升级到专业版或以上级别\");\n    }\n  }\n\n  async getById(id: number, userId: number): Promise<NotificationInstanceConfig> {\n    if (!id) {\n      throw new ValidateException('id不能为空');\n    }\n    if (!userId) {\n      throw new ValidateException('userId不能为空');\n    }\n    const res = await this.repository.findOne({\n      where: {\n        id,\n        userId,\n      },\n    });\n    if (!res) {\n      throw new ValidateException(`通知配置不存在<${id}>`);\n    }\n    return this.buildNotificationInstanceConfig(res);\n  }\n\n  private buildNotificationInstanceConfig(res: NotificationEntity) {\n    const setting = JSON.parse(res.setting);\n    return {\n      id: res.id,\n      type: res.type,\n      name: res.name,\n      userId: res.userId,\n      setting,\n    };\n  }\n\n  async getDefault(userId: number): Promise<NotificationInstanceConfig> {\n    const res = await this.repository.findOne({\n      where: {\n        userId,\n      },\n      order: {\n        isDefault: 'DESC',\n      },\n    });\n    if (!res) {\n      return null;\n    }\n    return this.buildNotificationInstanceConfig(res);\n  }\n\n  async setDefault(id: number, userId: number) {\n    if (!id) {\n      throw new ValidateException('id不能为空');\n    }\n    if (!userId) {\n      throw new ValidateException('userId不能为空');\n    }\n    await this.repository.update(\n      {\n        userId,\n      },\n      {\n        isDefault: false,\n      }\n    );\n    await this.repository.update(\n      {\n        id,\n        userId,\n      },\n      {\n        isDefault: true,\n      }\n    );\n  }\n\n  async getOrCreateDefault(email: string, userId: any) {\n    const defaultConfig = await this.getDefault(userId);\n    if (defaultConfig) {\n      return defaultConfig;\n    }\n    const setting = {\n      receivers: [email],\n    };\n    const res = await this.repository.save({\n      userId,\n      type: 'email',\n      name: '邮件通知',\n      setting: JSON.stringify(setting),\n      isDefault: true,\n    });\n    return this.buildNotificationInstanceConfig(res);\n  }\n\n  async send(req: NotificationSendReq, userId?: number) {\n    const logger = req.logger;\n    let notifyConfig: NotificationInstanceConfig = null;\n    if (req.id && req.id > 0) {\n      notifyConfig = await this.getById(req.id, userId);\n      if (!notifyConfig) {\n        logger.warn(`未找到通知配置<${req.id}>`);\n      }\n    }\n    if (!notifyConfig) {\n      if (req.id === 0 || req.useDefault) {\n        notifyConfig = await this.getDefault(userId);\n        if (!notifyConfig) {\n          logger.warn(`未找到默认通知配置`);\n        }\n      }\n    }\n\n    if (notifyConfig) {\n      //发送通知\n      logger.info('发送通知, 使用通知渠道：' + notifyConfig.name);\n\n      if (notifyConfig.type != 'email') {\n        //非邮件通知，需要加上站点名称\n        let siteTitle = 'Certd';\n        if (isComm()) {\n          const siteInfo = await this.sysSettingsService.getSetting<SysSiteInfo>(SysSiteInfo);\n          siteTitle = siteInfo?.title || siteTitle;\n        }\n        req.body.title = `【${siteTitle}】${req.body.title}`;\n      }\n\n      await sendNotification({\n        config: notifyConfig,\n        ctx: {\n          http: http,\n          logger: logger,\n          utils: utils,\n          emailService: this.emailService,\n        },\n        body: req.body,\n      });\n    } else {\n      if (req.useEmail && req.emailAddress) {\n        logger.info('使用邮件通知');\n        await this.emailService.send({\n          receivers: [req.emailAddress],\n          subject: req.body.title,\n          content: req.body.content,\n        });\n      }\n    }\n  }\n\n  async getBindUrl(path: string) {\n    const installInfo = await this.sysSettingsService.getSetting<SysInstallInfo>(SysInstallInfo);\n    const bindUrl = installInfo.bindUrl || 'http://127.0.0.1:7001';\n    return bindUrl + path;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/pipeline-group-service.ts",
    "content": "import { Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { BaseService } from '@certd/lib-server';\nimport { InjectEntityModel } from '@midwayjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { PipelineGroupEntity } from '../entity/pipeline-group.js';\nimport { merge } from 'lodash-es';\n\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class PipelineGroupService extends BaseService<PipelineGroupEntity> {\n  @InjectEntityModel(PipelineGroupEntity)\n  repository: Repository<PipelineGroupEntity>;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async add(bean: any) {\n    bean = merge(\n      {\n        favorite: false,\n      },\n      bean\n    );\n    return await this.repository.save(bean);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts",
    "content": "import { Config, Inject, Provide, Scope, ScopeEnum, sleep } from \"@midwayjs/core\";\nimport { InjectEntityModel } from \"@midwayjs/typeorm\";\nimport { In, MoreThan, Repository } from \"typeorm\";\nimport {\n  AccessService,\n  BaseService,\n  NeedSuiteException,\n  NeedVIPException,\n  PageReq,\n  SysPublicSettings,\n  SysSettingsService,\n  SysSiteInfo\n} from \"@certd/lib-server\";\nimport { PipelineEntity } from \"../entity/pipeline.js\";\nimport { PipelineDetail } from \"../entity/vo/pipeline-detail.js\";\nimport {\n  Executor,\n  IAccessService,\n  ICnameProxyService,\n  INotificationService, Notification,\n  Pipeline,\n  ResultType,\n  RunHistory,\n  RunnableCollection,\n  SysInfo,\n  UserInfo\n} from \"@certd/pipeline\";\nimport { DbStorage } from \"./db-storage.js\";\nimport { StorageService } from \"./storage-service.js\";\nimport { Cron } from \"../../cron/cron.js\";\nimport { HistoryService } from \"./history-service.js\";\nimport { HistoryEntity } from \"../entity/history.js\";\nimport { HistoryLogEntity } from \"../entity/history-log.js\";\nimport { HistoryLogService } from \"./history-log-service.js\";\nimport { EmailService } from \"../../basic/service/email-service.js\";\nimport { UserService } from \"../../sys/authority/service/user-service.js\";\nimport { CnameRecordService } from \"../../cname/service/cname-record-service.js\";\nimport { PluginConfigGetter } from \"../../plugin/service/plugin-config-getter.js\";\nimport dayjs from \"dayjs\";\nimport { DbAdapter } from \"../../db/index.js\";\nimport { isComm, isPlus } from \"@certd/plus-core\";\nimport { logger } from \"@certd/basic\";\nimport { UrlService } from \"./url-service.js\";\nimport { NotificationService } from \"./notification-service.js\";\nimport { UserSuiteEntity, UserSuiteService } from \"@certd/commercial-core\";\nimport { CertInfoService } from \"../../monitor/service/cert-info-service.js\";\nimport { TaskServiceBuilder } from \"./getter/task-service-getter.js\";\nimport { nanoid } from \"nanoid\";\nimport { set } from \"lodash-es\";\n\nconst runningTasks: Map<string | number, Executor> = new Map();\n\n\n/**\n * 证书申请\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class PipelineService extends BaseService<PipelineEntity> {\n  @InjectEntityModel(PipelineEntity)\n  repository: Repository<PipelineEntity>;\n  @Inject()\n  emailService: EmailService;\n  @Inject()\n  accessService: AccessService;\n  @Inject()\n  cnameRecordService: CnameRecordService;\n  @Inject()\n  storageService: StorageService;\n  @Inject()\n  historyService: HistoryService;\n  @Inject()\n  historyLogService: HistoryLogService;\n\n  @Inject()\n  pluginConfigGetter: PluginConfigGetter;\n\n  @Inject()\n  taskServiceBuilder: TaskServiceBuilder;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  @Inject()\n  userService: UserService;\n\n  @Inject()\n  userSuiteService: UserSuiteService;\n\n  @Inject()\n  cron: Cron;\n\n  @Config(\"certd\")\n  private certdConfig: any;\n\n  @Inject()\n  urlService: UrlService;\n\n  @Inject()\n  notificationService: NotificationService;\n\n  @Inject()\n  dbAdapter: DbAdapter;\n\n  @Inject()\n  certInfoService: CertInfoService;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async add(bean: PipelineEntity) {\n    bean.status = ResultType.none;\n    await this.save(bean);\n    return bean;\n  }\n\n  async page(pageReq: PageReq<PipelineEntity>) {\n    //模版流水线不要被查询出来\n    set(pageReq, \"query.isTemplate\", false);\n    const result = await super.page(pageReq);\n    await this.fillLastVars(result.records);\n\n    for (const item of result.records) {\n      if (!item.content) {\n        continue;\n      }\n      const pipeline = JSON.parse(item.content);\n      let stepCount = 0;\n      if(pipeline.stages){\n        RunnableCollection.each(pipeline.stages, (runnable: any) => {\n          stepCount++;\n        });\n      }\n      // @ts-ignore\n      item.stepCount = stepCount;\n      // @ts-ignore\n      item.triggerCount = pipeline.triggers?.length;\n      delete item.content;\n    }\n\n    return result;\n  }\n\n  private async fillLastVars(records: PipelineEntity[]) {\n    const pipelineIds: number[] = [];\n    const recordMap = {};\n    for (const record of records) {\n      pipelineIds.push(record.id);\n      recordMap[record.id] = record;\n      record.title = record.title + \"\";\n    }\n    if (pipelineIds?.length > 0) {\n      const vars = await this.storageService.findPipelineVars(pipelineIds);\n      for (const varEntity of vars) {\n        const record = recordMap[varEntity.namespace];\n        if (record) {\n          const value = JSON.parse(varEntity.value);\n          record.lastVars = value.value;\n        }\n      }\n    }\n  }\n\n  public async registerTriggerById(pipelineId) {\n    if (pipelineId == null) {\n      return;\n    }\n    const info = await this.info(pipelineId);\n    if (info && !info.disabled) {\n      const pipeline = JSON.parse(info.content);\n      this.registerTriggers(pipeline, false);\n    }\n  }\n\n  public async registerTrigger(info: PipelineEntity) {\n    if (info == null) {\n      return;\n    }\n    if (info && !info.disabled) {\n      const pipeline = JSON.parse(info.content);\n      this.registerTriggers(pipeline, false);\n    }\n  }\n\n  /**\n   * 获取详情\n   * @param id\n   */\n  async detail(id) {\n    const pipeline = await this.info(id);\n    return new PipelineDetail(pipeline);\n  }\n\n  async update(bean: Partial<PipelineEntity>) {\n    //更新非trigger部分\n    await super.update(bean);\n  }\n\n  async save(bean: PipelineEntity) {\n    let old = null;\n    if (bean.id > 0) {\n      //修改\n      old = await this.info(bean.id);\n    }\n    const isUpdate = bean.id > 0 && old != null;\n\n\n    const pipeline = JSON.parse(bean.content || \"{}\");\n    RunnableCollection.initPipelineRunnableType(pipeline);\n    let domains = [];\n    if (pipeline.stages) {\n      RunnableCollection.each(pipeline.stages, (runnable: any) => {\n        if (runnable.runnableType === \"step\" && runnable.type.indexOf(\"CertApply\") >= 0) {\n          domains = runnable.input.domains || [];\n        }\n      });\n    }\n\n    if (!isUpdate) {\n      //如果是添加，校验数量\n      await this.checkMaxPipelineCount(bean, pipeline, domains);\n    }\n\n    if (!bean.status) {\n      bean.status = ResultType.none;\n    }\n    if (!isUpdate) {\n      //如果是添加，先保存一下，获取到id，更新pipeline.id\n      await this.addOrUpdate(bean);\n    }\n\n    await this.doUpdatePipelineJson(bean, pipeline);\n\n    //保存域名信息到certInfo表\n    let fromType = \"pipeline\";\n    if (bean.type === \"cert_upload\") {\n      fromType = \"upload\";\n    }else if (bean.type === \"cert_auto\") {\n      fromType = \"auto\";\n    }\n    await this.certInfoService.updateDomains(pipeline.id, pipeline.userId || bean.userId, domains, fromType);\n    return bean;\n  }\n\n  /**\n   * 更新Pipeline， 包括trigger\n   * @param bean\n   * @param pipeline\n   */\n  async doUpdatePipelineJson(bean: PipelineEntity, pipeline: Pipeline) {\n    await this.clearTriggers(bean);\n    if (pipeline.title) {\n      bean.title = pipeline.title;\n    }\n    pipeline.id = bean.id;\n    bean.content = JSON.stringify(pipeline);\n    await this.addOrUpdate(bean);\n    await this.registerTrigger(bean);\n  }\n\n  private async checkMaxPipelineCount(bean: PipelineEntity, pipeline: Pipeline, domains: string[]) {\n    // if (!isPlus()) {\n    //   const count = await this.repository.count();\n    //   if (count >= freeCount) {\n    //     throw new NeedVIPException(`基础版最多只能创建${freeCount}条流水线`);\n    //   }\n    // }\n    if (isComm()) {\n      //校验pipelineCount\n      const suiteSetting = await this.userSuiteService.getSuiteSetting();\n      if (suiteSetting.enabled) {\n        const userSuite = await this.userSuiteService.getMySuiteDetail(bean.userId);\n        if (userSuite?.pipelineCount.max != -1 && userSuite?.pipelineCount.used + 1 > userSuite?.pipelineCount.max) {\n          throw new NeedSuiteException(`对不起，您最多只能创建${userSuite?.pipelineCount.max}条流水线，请购买或升级套餐`);\n        }\n\n        if (userSuite.domainCount.max != -1 && userSuite.domainCount.used + domains.length > userSuite.domainCount.max) {\n          throw new NeedSuiteException(`对不起，您最多只能添加${userSuite.domainCount.max}个域名，请购买或升级套餐`);\n        }\n      }\n    } else {\n      //非商业版校验用户最大流水线数量\n      const userId = bean.userId;\n      const userIsAdmin = await this.userService.isAdmin(userId);\n      if (!userIsAdmin) {\n        //非管理员用户，限制pipeline数量\n        const count = await this.repository.count({ where: { userId } });\n        const sysPublic = await this.sysSettingsService.getSetting<SysPublicSettings>(SysPublicSettings);\n        const limitUserPipelineCount = sysPublic.limitUserPipelineCount;\n        if (limitUserPipelineCount && limitUserPipelineCount > 0 && count >= limitUserPipelineCount) {\n          throw new NeedVIPException(`普通用户最多只能创建${limitUserPipelineCount}条流水线`);\n        }\n      }\n    }\n  }\n\n  async foreachPipeline(callback: (pipeline: PipelineEntity) => void) {\n    const idEntityList = await this.repository.find({\n      select: {\n        id: true\n      },\n      where: {\n        disabled: false,\n        templateId: 0\n      }\n    });\n    const ids = idEntityList.map(item => {\n      return item.id;\n    });\n\n    //id 分段\n    const idsSpan = [];\n    let arr = [];\n    for (let i = 0; i < ids.length; i++) {\n      if (i % 20 === 0) {\n        arr = [];\n        idsSpan.push(arr);\n      }\n      arr.push(ids[i]);\n    }\n\n    //分段加载记录\n    for (const idArr of idsSpan) {\n      const list = await this.repository.findBy({\n        id: In(idArr)\n      });\n\n      for (const entity of list) {\n        await callback(entity);\n      }\n    }\n  }\n\n  async stopOtherUserPipeline(userId: number) {\n    await this.foreachPipeline(async entity => {\n      if (entity.userId !== userId) {\n        await this.clearTriggers(entity.id);\n      }\n    });\n  }\n\n  /**\n   * 应用启动后初始加载记录\n   */\n  async onStartup(immediateTriggerOnce: boolean, onlyAdminUser: boolean) {\n    await this.foreachPipeline(async entity => {\n      if (onlyAdminUser && entity.userId !== 1) {\n        return;\n      }\n      const pipeline = JSON.parse(entity.content ?? \"{}\");\n      try {\n        await this.registerTriggers(pipeline, immediateTriggerOnce);\n      } catch (e) {\n        logger.error(\"加载定时trigger失败：\", e);\n      }\n    });\n    logger.info(\"定时器数量：\", this.cron.getTaskSize());\n  }\n\n  async registerTriggers(pipeline?: Pipeline, immediateTriggerOnce = false) {\n    if (pipeline?.triggers == null) {\n      return;\n    }\n    for (const trigger of pipeline.triggers) {\n      this.registerCron(pipeline.id, trigger);\n    }\n\n    if (immediateTriggerOnce) {\n      await this.trigger(pipeline.id);\n      await sleep(200);\n    }\n  }\n\n  async trigger(id: any, stepId?: string) {\n    const entity: PipelineEntity = await this.info(id);\n    if (isComm()) {\n      await this.checkHasDeployCount(id, entity.userId);\n    }\n    await this.checkUserStatus(entity.userId);\n    this.cron.register({\n      name: `pipeline.${id}.trigger.once`,\n      cron: null,\n      job: async () => {\n        logger.info(\"用户手动启动job\");\n        try {\n          await this.doRun(entity, null, stepId);\n        } catch (e) {\n          logger.error(\"手动job执行失败：\", e);\n        }\n      }\n    });\n  }\n\n  async checkHasDeployCount(pipelineId: number, userId: number) {\n    try {\n      return await this.userSuiteService.checkHasDeployCount(userId);\n    } catch (e) {\n      if (e instanceof NeedSuiteException) {\n        logger.error(e.message);\n        await this.update({\n          id: pipelineId,\n          status: \"no_deploy_count\"\n        });\n      }\n      throw e;\n    }\n  }\n\n  //@ts-ignore\n  async delete(id: any) {\n    await this.clearTriggers(id);\n    //TODO 删除storage\n    // const storage = new DbStorage(pipeline.userId, this.storageService);\n    // await storage.remove(pipeline.id);\n    await super.delete([id]);\n    await this.historyService.deleteByPipelineId(id);\n    await this.historyLogService.deleteByPipelineId(id);\n    await this.certInfoService.deleteByPipelineId(id);\n  }\n\n  async clearTriggers(id: number | PipelineEntity) {\n    if (id == null) {\n      return;\n    }\n    let pipeline: PipelineEntity = null;\n    if (typeof id === \"number\") {\n      pipeline = await this.info(id);\n    } else {\n      pipeline = id;\n    }\n    if (!pipeline) {\n      return;\n    }\n    const pipelineObj = JSON.parse(pipeline.content);\n    if (pipelineObj.triggers) {\n      for (const trigger of pipelineObj.triggers) {\n        this.removeCron(id, trigger);\n      }\n    }\n  }\n\n  removeCron(pipelineId, trigger) {\n    const name = this.buildCronKey(pipelineId, trigger.id);\n    this.cron.remove(name);\n  }\n\n  registerCron(pipelineId, trigger) {\n    if (pipelineId == null) {\n      logger.warn(\"pipelineId为空，无法注册定时任务\");\n      return;\n    }\n\n    let cron = trigger.props?.cron;\n    if (cron == null) {\n      return;\n    }\n    cron = cron.trim();\n    if (cron.startsWith(\"* *\")) {\n      cron = cron.replace(\"* *\", \"0 0\");\n    }\n    if (cron.startsWith(\"*\")) {\n      cron = cron.replace(\"*\", \"0\");\n    }\n    const triggerId = trigger.id;\n    const name = this.buildCronKey(pipelineId, triggerId);\n    this.cron.remove(name);\n    this.cron.register({\n      name,\n      cron,\n      job: async () => {\n        logger.info(\"定时任务触发：\", pipelineId, triggerId);\n        if (pipelineId == null) {\n          logger.warn(\"pipelineId为空,无法执行\");\n          return;\n        }\n        try {\n          await this.run(pipelineId, triggerId);\n        } catch (e) {\n          logger.error(\"定时job执行失败：\", e);\n        }\n      }\n    });\n    logger.info(\"当前定时器数量：\", this.cron.getTaskSize());\n  }\n\n  /**\n   *\n   * @param id\n   * @param triggerId =null手动启动\n   * @param stepId 如果传入ALL，清空所有状态\n   */\n  async run(id: number, triggerId: string, stepId?: string) {\n    const entity: PipelineEntity = await this.info(id);\n    await this.doRun(entity, triggerId, stepId);\n  }\n\n  async doRun(entity: PipelineEntity, triggerId: string, stepId?: string) {\n    const id = entity.id;\n    let suite: UserSuiteEntity = null;\n    if (isComm()) {\n      suite = await this.checkHasDeployCount(id, entity.userId);\n    }\n    try {\n      await this.checkUserStatus(entity.userId);\n    } catch (e) {\n      logger.info(e.message);\n      return;\n    }\n\n\n    const pipeline = JSON.parse(entity.content);\n    if (!pipeline.id) {\n      pipeline.id = id;\n    }\n\n    if (!pipeline.stages || pipeline.stages.length === 0) {\n      return;\n    }\n\n    const triggerType = this.getTriggerType(triggerId, pipeline);\n    if (triggerType == null) {\n      return;\n    }\n\n    if (triggerType === \"timer\") {\n      if (entity.disabled) {\n        return;\n      }\n    }\n\n    const onChanged = async (history: RunHistory) => {\n      //保存执行历史\n      try {\n        logger.info(\"保存执行历史：\", history.id);\n        await this.saveHistory(history);\n      } catch (e) {\n        const pipelineEntity = new PipelineEntity();\n        pipelineEntity.id = id;\n        pipelineEntity.status = \"error\";\n        pipelineEntity.lastHistoryTime = history.pipeline.status.startTime;\n        await this.update(pipelineEntity);\n        logger.error(\"保存执行历史失败：\", e);\n        throw e;\n      }\n    };\n\n    const userId = entity.userId;\n    const historyId = await this.historyService.start(entity, triggerType);\n    const userIsAdmin = await this.userService.isAdmin(userId);\n    const user: UserInfo = {\n      id: userId,\n      role: userIsAdmin ? \"admin\" : \"user\"\n    };\n\n\n    const sysInfo: SysInfo = {};\n    if (isComm()) {\n      const siteInfo = await this.sysSettingsService.getSetting<SysSiteInfo>(SysSiteInfo);\n      sysInfo.title = siteInfo.title;\n    }\n\n    const taskServiceGetter = this.taskServiceBuilder.create({\n      userId\n    });\n    const accessGetter = await taskServiceGetter.get<IAccessService>(\"accessService\");\n    const notificationGetter = await taskServiceGetter.get<INotificationService>(\"notificationService\");\n    const cnameProxyService = await taskServiceGetter.get<ICnameProxyService>(\"cnameProxyService\");\n    const executor = new Executor({\n      user,\n      pipeline,\n      onChanged,\n      accessService: accessGetter,\n      cnameProxyService,\n      pluginConfigService: this.pluginConfigGetter,\n      storage: new DbStorage(userId, this.storageService),\n      emailService: this.emailService,\n      urlService: this.urlService,\n      notificationService: notificationGetter,\n      fileRootDir: this.certdConfig.fileRootDir,\n      sysInfo,\n      serviceGetter: taskServiceGetter\n    });\n    try {\n      runningTasks.set(historyId, executor);\n      await executor.init();\n      if (stepId) {\n        // 清除该step的状态\n        executor.clearLastStatus(stepId);\n      }\n      const result = await executor.run(historyId, triggerType);\n\n      if (result === ResultType.success) {\n        if (isComm()) {\n          // 消耗成功次数\n          await this.userSuiteService.consumeDeployCount(suite, 1);\n        }\n      }\n    } catch (e) {\n      logger.error(\"执行失败：\", e);\n      // throw e;\n    } finally {\n      runningTasks.delete(historyId);\n    }\n  }\n\n  async cancel(historyId: number) {\n    const executor = runningTasks.get(historyId);\n    if (executor) {\n      await executor.cancel();\n    }\n    const entity = await this.historyService.info(historyId);\n    if (entity == null) {\n      return;\n    }\n    const pipeline: Pipeline = JSON.parse(entity.pipeline);\n    pipeline.status.status = ResultType.canceled;\n    pipeline.status.result = ResultType.canceled;\n    const runtime = new RunHistory(historyId, null, pipeline);\n    await this.saveHistory(runtime);\n  }\n\n  private getTriggerType(triggerId, pipeline) {\n    let triggerType = \"user\";\n    if (triggerId != null) {\n      //如果不是手动触发\n      //查找trigger\n      const found = this.findTrigger(pipeline, triggerId);\n      if (!found) {\n        //如果没有找到triggerId，说明被用户删掉了，这里再删除一次\n        this.cron.remove(this.buildCronKey(pipeline.id, triggerId));\n        triggerType = null;\n      } else {\n        logger.info(\"timer trigger:\" + found.id, found.title, found.cron);\n        triggerType = \"timer\";\n      }\n    }\n    return triggerType;\n  }\n\n  private buildCronKey(pipelineId, triggerId) {\n    return `pipeline.${pipelineId}.trigger.${triggerId}`;\n  }\n\n  private findTrigger(pipeline, triggerId) {\n    for (const trigger of pipeline.triggers) {\n      if (trigger.id === triggerId) {\n        return trigger;\n      }\n    }\n    return;\n  }\n\n  private async saveHistory(history: RunHistory) {\n    //修改pipeline状态\n    const pipelineEntity = new PipelineEntity();\n    pipelineEntity.id = parseInt(history.pipeline.id);\n    pipelineEntity.status = history.pipeline.status.result + \"\";\n    pipelineEntity.lastHistoryTime = history.pipeline.status.startTime;\n    await this.update(pipelineEntity);\n\n    const entity: HistoryEntity = new HistoryEntity();\n    entity.id = parseInt(history.id);\n    entity.userId = history.pipeline.userId;\n    entity.status = pipelineEntity.status;\n    entity.pipeline = JSON.stringify(history.pipeline);\n    entity.pipelineId = parseInt(history.pipeline.id);\n    await this.historyService.save(entity);\n\n    const logEntity: HistoryLogEntity = new HistoryLogEntity();\n    logEntity.id = entity.id;\n    logEntity.userId = entity.userId;\n    logEntity.pipelineId = entity.pipelineId;\n    logEntity.historyId = entity.id;\n    logEntity.logs = JSON.stringify(history.logs);\n    await this.historyLogService.addOrUpdate(logEntity);\n  }\n\n  async count(param: { userId?: any }) {\n    const count = await this.repository.count({\n      where: {\n        userId: param.userId\n      }\n    });\n    return count;\n  }\n\n  async statusCount(param: { userId?: any } = {}) {\n    const statusCount = await this.repository\n      .createQueryBuilder()\n      .select(\"status\")\n      .addSelect(\"count(1)\", \"count\")\n      .where({\n        userId: param.userId\n      })\n      .groupBy(\"status\")\n      .getRawMany();\n    return statusCount;\n  }\n\n  async latestExpiringList({ userId }: any) {\n    let list = await this.repository.find({\n      select: {\n        id: true,\n        title: true,\n        status: true\n      },\n      where: {\n        userId\n      }\n    });\n    await this.fillLastVars(list);\n    list = list.filter(item => {\n      return item.lastVars?.certExpiresTime != null;\n    });\n    list = list.sort((a, b) => {\n      return a.lastVars.certExpiresTime - b.lastVars.certExpiresTime;\n    });\n\n    return list.slice(0, 5);\n  }\n\n  async createCountPerDay(param: { days: number } = { days: 7 }) {\n    const todayEnd = dayjs().endOf(\"day\");\n    const result = await this.getRepository()\n      .createQueryBuilder(\"main\")\n      .select(`${this.dbAdapter.date(\"main.createTime\")}  AS date`) // 将UNIX时间戳转换为日期\n      .addSelect(\"COUNT(1) AS count\")\n      .where({\n        // 0点\n        createTime: MoreThan(todayEnd.add(-param.days, \"day\").toDate())\n      })\n      .groupBy(\"date\")\n      .getRawMany();\n\n    return result;\n  }\n\n  async batchDelete(ids: number[], userId: number) {\n    for (const id of ids) {\n      await this.checkUserId(id, userId);\n      await this.delete(id);\n    }\n  }\n\n  async batchUpdateGroup(ids: number[], groupId: number, userId: any) {\n    await this.repository.update(\n      {\n        id: In(ids),\n        userId\n      },\n      { groupId }\n    );\n  }\n\n\n  async batchUpdateTrigger(ids: number[], trigger: any, userId: any) {\n\n    const list = await this.find({\n      where: {\n        id: In(ids),\n        userId\n      }\n    });\n\n    for (const item of list) {\n      const pipeline = JSON.parse(item.content);\n      pipeline.triggers = [{\n        id: nanoid(),\n        title: \"定时触发\",\n        ...trigger\n      }];\n      await this.doUpdatePipelineJson(item, pipeline);\n    }\n\n  }\n\n  async batchUpdateNotifications(ids: number[], notification: Notification, userId: any) {\n\n    const list = await this.find({\n      where: {\n        id: In(ids),\n        userId\n      }\n    });\n\n    for (const item of list) {\n      const pipeline = JSON.parse(item.content);\n      pipeline.notifications = [{\n        id: nanoid(),\n        title: \"通知\",\n        /**\n         * type: NotificationType;\n         *   when: NotificationWhen[];\n         *   options: EmailOptions;\n         *   notificationId: number;\n         *   title: string;\n         *   subType: string;\n         */\n        type: \"other\",\n        ...notification\n      }];\n      await this.doUpdatePipelineJson(item, pipeline);\n    }\n  }\n\n  async batchRerun(ids: number[], userId: any) {\n    if (!isPlus()) {\n      throw new NeedVIPException(\"此功能需要升级专业版\");\n    }\n\n    if (!userId || ids.length === 0) {\n      return;\n    }\n    const list = await this.repository.find({\n      select: {\n        id: true\n      },\n      where: {\n        id: In(ids),\n        userId\n      }\n    });\n\n    ids = list.map(item => item.id);\n\n    //异步执行\n    this.startBatchRerun(ids);\n  }\n\n  async startBatchRerun(ids: number[]) {\n    //20条一批\n    const batchSize = 20;\n    for (let i = 0; i < ids.length; i += batchSize) {\n      const batchIds = ids.slice(i, i + batchSize);\n      const batchPromises = batchIds.map(async (id) => {\n        await this.run(id, null, \"ALL\");\n      });\n      await Promise.all(batchPromises);\n    }\n  }\n\n\n  async getUserPipelineCount(userId) {\n    return await this.repository.count({ where: { userId } });\n  }\n\n  async getSimplePipelines(pipelineIds: number[], userId?: number) {\n    return await this.repository.find({\n      select: {\n        id: true,\n        title: true\n      },\n      where: {\n        id: In(pipelineIds),\n        userId\n      }\n    });\n  }\n\n\n  private async checkUserStatus(userId: number) {\n    const userEntity = await this.userService.info(userId);\n    if (userEntity == null) {\n      throw new Error(\"用户不存在\");\n    }\n    if (userEntity.status === 0) {\n      const message = `账户${userId}已被禁用，禁止运行流水线`;\n      throw new Error(message);\n    }\n    const sysPublic = await this.sysSettingsService.getPublicSettings();\n    if (isPlus() && sysPublic.userValidTimeEnabled === true) {\n      //校验用户有效期是否设置\n      if (userEntity.validTime != null && userEntity.validTime > 0) {\n        if (userEntity.validTime < new Date().getTime()) {\n          //用户已过期\n          const message = `账户${userId}已过有效期，禁止运行流水线`;\n          throw new Error(message);\n        }\n      }\n    }\n  }\n\n  async createAutoPipeline(req: { domains: string[]; email: string; userId: number ,from:string}) {\n\n    const randomHour = Math.floor(Math.random() * 6);\n    const randomMin = Math.floor(Math.random() * 60);\n    const randomCron = `0 ${randomMin} ${randomHour} * * *`;\n\n    let pipeline: any = {\n      title: req.domains[0] + `证书自动申请【${req.from??\"OpenAPI\"}】`,\n      runnableType: \"pipeline\",\n      triggers: [\n        {\n          id: nanoid(),\n          title: \"定时触发\",\n          props:{\n            cron: randomCron,\n          },\n          type: \"timer\"\n        }\n      ],\n      notifications: [\n        {\n          id: nanoid(),\n          type: \"custom\",\n          when: [\"error\", \"turnToSuccess\", \"success\"],\n          notificationId: 0,\n          title: \"默认通知\",\n        }\n      ],\n      stages: [\n        {\n          id: nanoid(),\n          title: \"证书申请阶段\",\n          maxTaskCount: 1,\n          runnableType: \"stage\",\n          tasks: [\n            {\n              id: nanoid(),\n              title: \"证书申请任务\",\n              runnableType: \"task\",\n              steps: [\n                {\n                  id: nanoid(),\n                  title: \"申请证书\",\n                  runnableType: \"step\",\n                  input: {\n                    renewDays: 35,\n                    domains: req.domains,\n                    email: req.email,\n                    \"challengeType\": \"auto\",\n                    \"sslProvider\": \"letsencrypt\",\n                    \"privateKeyType\": \"rsa_2048\",\n                    \"certProfile\": \"classic\",\n                    \"useProxy\": false,\n                    \"skipLocalVerify\": false,\n                    \"maxCheckRetryCount\": 20,\n                    \"waitDnsDiffuseTime\": 30,\n                    \"pfxArgs\": \"-macalg SHA1 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES\",\n                    \"successNotify\": true\n                  },\n                  strategy: {\n                    runStrategy: 0 // 正常执行\n                  },\n                  type: \"CertApply\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    };\n\n    const bean = new PipelineEntity();\n    bean.title = pipeline.title;\n    bean.content = JSON.stringify(pipeline);\n    bean.userId = req.userId;\n    bean.status = \"none\";\n    bean.type = \"cert_auto\";\n    bean.disabled = false\n    bean.keepHistoryCount = 30\n    await this.save(bean)\n\n\n    return bean;\n  }\n\n  async getStatus(pipelineId: number) {\n    const res = await this.repository.findOne({\n      select: {\n        status: true\n      },\n      where: {\n        id: pipelineId\n      }\n    });\n    return res?.status;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/storage-service.ts",
    "content": "import { Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { InjectEntityModel } from '@midwayjs/typeorm';\nimport { In, Repository } from 'typeorm';\nimport { BaseService } from '@certd/lib-server';\nimport { StorageEntity } from '../entity/storage.js';\n\n/**\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class StorageService extends BaseService<StorageEntity> {\n  @InjectEntityModel(StorageEntity)\n  repository: Repository<StorageEntity>;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async get(where: { scope: any; namespace: any; userId: number; version: string; key: string }) {\n    if (where.userId == null) {\n      throw new Error('userId 不能为空');\n    }\n    return await this.repository.findOne({\n      where,\n    });\n  }\n\n  async set(entity: { id?: any; scope: any; namespace: any; userId: number; version: string; value: string; key: string }) {\n    entity.id = null;\n    const query = { ...entity };\n    delete query.value;\n    const ret = await this.get(query);\n    if (ret != null) {\n      entity.id = ret.id;\n      if (ret.userId !== entity.userId) {\n        throw new Error('您没有权限修改此数据');\n      }\n      await this.repository.save(entity);\n    } else {\n      await this.repository.insert(entity);\n    }\n    return;\n  }\n\n  async findPipelineVars(pipelineIds: number[]) {\n    if (pipelineIds == null || pipelineIds.length === 0) {\n      return [];\n    }\n    return await this.repository.find({\n      where: {\n        scope: 'pipeline',\n        namespace: In(pipelineIds),\n        key: 'vars',\n      },\n    });\n  }\n\n  async getPipelinePrivateVars(pipelineId: number) {\n    if (pipelineId == null) {\n      return [];\n    }\n    const res = await this.repository.findOne({\n      where: {\n        scope: 'pipeline',\n        namespace: pipelineId + '',\n        key: 'privateVars',\n      },\n    });\n    if (!res) {\n      return {};\n    }\n    const value = JSON.parse(res.value);\n    return value.value;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/sub-domain-service.ts",
    "content": "import {Inject, Provide, Scope, ScopeEnum} from '@midwayjs/core';\nimport {BaseService, SysSettingsService} from '@certd/lib-server';\nimport {InjectEntityModel} from '@midwayjs/typeorm';\nimport {Repository} from 'typeorm';\nimport {SubDomainEntity} from '../entity/sub-domain.js';\nimport {EmailService} from '../../basic/service/email-service.js';\n\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class SubDomainService extends BaseService<SubDomainEntity> {\n  @InjectEntityModel(SubDomainEntity)\n  repository: Repository<SubDomainEntity>;\n\n  @Inject()\n  emailService: EmailService;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async getListByUserId(userId:number):Promise<string[]>{\n    if (!userId) {\n      return [];\n    }\n    const list = await this.find({\n      where: {\n        userId,\n        disabled: false,\n      },\n    });\n\n    return list.map(item=>item.domain);\n  }\n\n  async add(bean: SubDomainEntity) {\n    const {domain, userId} = bean;\n    if (!domain) {\n      throw new Error('域名不能为空');\n    }\n    if (!userId) {\n      throw new Error('用户ID不能为空');\n    }\n    const exist = await this.repository.findOne({\n      where: {\n        domain,\n        userId,\n      },\n    });\n   if (exist) {\n     throw new Error('域名已存在');\n   }\n   return await super.add(bean)\n\n  }\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/template-service.ts",
    "content": "import {Inject, Provide, Scope, ScopeEnum} from '@midwayjs/core';\nimport {BaseService, SysSettingsService} from '@certd/lib-server';\nimport {InjectEntityModel} from '@midwayjs/typeorm';\nimport {In, Repository} from 'typeorm';\nimport {TemplateEntity} from '../entity/template.js';\nimport {PipelineService} from './pipeline-service.js';\nimport {cloneDeep} from \"lodash-es\";\nimport {PipelineEntity} from \"../entity/pipeline.js\";\nimport {Pipeline} from \"@certd/pipeline\";\n\n@Provide()\n@Scope(ScopeEnum.Request, {allowDowngrade: true})\nexport class TemplateService extends BaseService<TemplateEntity> {\n  @InjectEntityModel(TemplateEntity)\n  repository: Repository<TemplateEntity>;\n\n  @Inject()\n  pipelineService: PipelineService;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async add(param: any) {\n    const pipelineId = param.pipelineId;\n    delete param.pipelineId;\n\n    const pipelineEntity = await this.pipelineService.info(pipelineId);\n    if (!pipelineEntity) {\n      throw new Error('pipeline not found');\n    }\n    if (pipelineEntity.userId !== param.userId) {\n      throw new Error('permission denied');\n    }\n\n\n    let template = null\n    await this.transaction(async (tx: any) => {\n\n      template = await tx.getRepository(TemplateEntity).save(param);\n      let newPipeline = cloneDeep(pipelineEntity)\n      //创建pipeline模版\n      newPipeline.id = undefined;\n      newPipeline.title = template.title + \"模版流水线\"\n      newPipeline.templateId = template.id\n      newPipeline.isTemplate = true\n      newPipeline.userId = template.userId\n\n      const pipelineJson: Pipeline = JSON.parse(newPipeline.content)\n      delete pipelineJson.triggers\n      pipelineJson.userId = template.userId\n      pipelineJson.title = newPipeline.title\n      newPipeline.content = JSON.stringify(pipelineJson)\n      newPipeline = await tx.getRepository(PipelineEntity).save(newPipeline)\n\n      const update: any = {}\n      update.id = template.id\n      update.pipelineId = newPipeline.id\n      await tx.getRepository(TemplateEntity).save(update)\n    })\n\n    return template\n\n  }\n\n  async detail(id: number, userId: number) {\n    const info = await this.info(id)\n    if (!info) {\n      throw new Error('模板不存在');\n    }\n    if (info.userId !== userId) {\n      throw new Error('无权限');\n    }\n    let pipeline = null\n    if (info.pipelineId) {\n      const pipelineEntity = await this.pipelineService.info(info.pipelineId);\n      pipeline = JSON.parse(pipelineEntity.content)\n    }\n\n\n    return {\n      template: info,\n      pipeline,\n    }\n  }\n\n  async batchDelete(ids: number[], userId: number) {\n\n    const where: any = {\n      id: In(ids),\n    }\n    if (userId > 0) {\n      where.userId = userId\n    }\n    const list = await this.getRepository().find({where})\n    ids = list.map(item => item.id)\n    const pipelineIds = list.map(item => item.pipelineId)\n    await this.delete(ids);\n    await this.pipelineService.batchDelete(pipelineIds, userId)\n  }\n\n  async createPipelineByTemplate(body: PipelineEntity) {\n    const templateId = body.templateId;\n    const template = await this.info(templateId);\n\n    if (!template && template.userId !== body.userId) {\n      throw new Error('模板不存在');\n    }\n\n    const tempPipeline = await this.pipelineService.info(template.pipelineId)\n\n    const newPipeline = {\n      type: tempPipeline.type,\n      from : \"template\",\n      keepHistoryCount: tempPipeline.keepHistoryCount,\n      ... body,\n    }\n\n    await this.pipelineService.save(newPipeline)\n\n    return newPipeline\n  }\n}\n\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/pipeline/service/url-service.ts",
    "content": "import { IUrlService } from '@certd/pipeline';\nimport { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { SysInstallInfo, SysSettingsService } from '@certd/lib-server';\n\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class UrlService implements IUrlService {\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  async getPipelineDetailUrl(pipelineId: number, historyId: number): Promise<string> {\n    const installInfo = await this.sysSettingsService.getSetting<SysInstallInfo>(SysInstallInfo);\n    let baseUrl = 'http://127.0.0.1:7001';\n    if (installInfo.bindUrl) {\n      baseUrl = installInfo.bindUrl;\n    }\n    return `${baseUrl}#/certd/pipeline/detail?id=${pipelineId}&historyId=${historyId}`;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/plugin/entity/plugin.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity('pi_plugin')\nexport class PluginEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n\n  @Column({ name: 'name', comment: 'Key' })\n  name: string;\n\n  @Column({ name: 'icon', comment: '图标' })\n  icon: string;\n\n  @Column({ name: 'title', comment: '标题' })\n  title: string;\n\n  @Column({ name: 'group', comment: '分组' })\n  group: string;\n\n  @Column({ name: 'desc', comment: '描述' })\n  desc: string;\n\n  @Column({ comment: '配置', length: 40960 })\n  setting: string;\n\n  @Column({ name: 'sys_setting', comment: '系统配置', length: 40960 })\n  sysSetting: string;\n\n  @Column({ comment: '脚本', length: 40960 })\n  content: string;\n\n  @Column({ comment: '类型', length: 100, nullable: true })\n  type: string; // builtIn | local | download\n\n  @Column({ comment: '启用/禁用', default: false })\n  disabled: boolean;\n\n  @Column({ comment: '版本', length: 100, nullable: true })\n  version: string;\n\n  @Column({ comment: '插件类型', length: 100, nullable: true })\n  pluginType: string;\n\n  @Column({ comment: '元数据', length: 40960, nullable: true })\n  metadata: string;\n\n  @Column({ comment: '额外配置', length: 40960, nullable: true })\n  extra: string;\n\n  @Column({ comment: '作者', length: 100, nullable: true })\n  author: string;\n\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/plugin/service/default-plugin.ts",
    "content": "import { CertApplyPluginNames } from \"@certd/plugin-cert\";\n\n\nexport function getDefaultAccessPlugin() {\n  const metadata = `\ninput:\n  username:  # 授权参数名\n    title: 用户名  # 授权参数标题\n    required: true # 是否必填项\n    encrypt: false # 是否加密\n    component: # 输入组件配置\n      name: a-input  #输入组件名称\n      allowClear: true # 组件的参数，参考 https://www.antdv.com/components/input#api\n  password:\n    title: 密码\n    required: true\n    encrypt: true\n    component:\n      name: a-input\n      allowClear: true\n`\n\n  const script = `\n// 必须使用 await import 来引入模块\nconst { BaseAccess } = await import(\"@certd/pipeline\")\n// 需要返回一个继承BaseAccess的类\nreturn class DemoAccess extends BaseAccess {\n  // 授权的字段，跟左边input一一对应\n  username;\n  password;\n}\n`;\n  return {\n    metadata:metadata,\n    content: script\n  };\n}\n\nexport function getDefaultDeployPlugin() {\n\n  let certApplyNames = ''\n  for (const name of CertApplyPluginNames) {\n    certApplyNames += `\n        - \"${name}\"`\n  }\n  const metadata =`\ninput:   # 插件的输入参数\n  cert:\n    title: 前置任务证书\n    helper: 请选择前置任务产生的证书 # 帮助说明\n    component:\n      name: output-selector     # 输入组件名称\n      vModel: modelValue        # 组件参数\n      from:${certApplyNames}\n    required: true\n  certDomains:\n    title: 当前证书域名\n    component:\n      name: cert-domains-getter\n    mergeScript: |\n      return {\n        component:{\n            inputKey: ctx.compute(({form})=>{\n              return form.cert\n            }),\n        }\n      }\n    required: true\n  accessId:\n    title: Access授权\n    helper: xxxx的授权\n    component:\n      name: access-selector    # 授权选择组件名称\n      type: aliyun             # 授权类型\n    required: true\n  key1:\n    title: 输入示例1\n    required: false\n  key2:\n    title: 可选项\n    component:\n      name: a-select\n      vMode: value\n      options:\n        - value: \"1\"\n          label: 选项1\n        - value: \"2\"\n          label: 选项2\n    required: false\n#output:  # 输出参数，一般插件都不需要配置此项\n#  outputName:\n#\n`\n\n\n  const script = `\n// 要用await来import模块\nconst { AbstractTaskPlugin } = await import(\"@certd/pipeline\")\n// 要返回一个继承AbstractTaskPlugin的class\nreturn class DemoTask extends AbstractTaskPlugin {\n  // 这里是插件的输入参数，对应左边的input配置\n  cert;\n  certDomains;\n  accessId;\n  key1;\n  key2;\n  // 编写执行方法\n  async execute(){\n    // 根据accessId获取授权配置\n    const access = await this.getAccess(this.accessId)\n\n    //必须使用this.logger打印日志\n    // this.logger.info(\"cert:\",this.cert);\n    this.logger.info(\"certDomains:\",this.certDomains);\n    this.logger.info(\"access:\",access);\n    this.logger.info(\"key1:\",this.key1);\n    this.logger.info(\"key2:\",this.key2);\n    // 开始你的部署任务\n    // this.ctx里面有一些常用的方法类，比如utils、http、logger等\n    const res = await this.ctx.http.request({url:\"https://www.baidu.com\"})\n    if(res.error){\n      //抛出异常，终止任务，否则将被判定为执行成功\n      throw new Error(\"部署失败:\"+res.message)\n    }\n    this.logger.info(\"执行成功\")\n    // this.outputName = xxxx //设置输出参数，可以被其他插件选择使用\n  }\n}\n`\n  return {\n    metadata: metadata,\n    content: script\n  };\n}\n\nexport function getDefaultDnsPlugin() {\n  const metadata = `\naccessType: aliyun # 授权类型名称\n#dependPlugins: # 依赖第三方库，安装插件时会安装依赖库，尽量使用certd已安装的库，比如http、lodash-es、utils\n#  @alicloud/openapi-client: ^0.4.12\n#dependLibs: # 依赖的插件，应用商店安装时会先安装依赖插件\n#  aliyun: *\n\n  `\n\n  const script = `\nconst { AbstractDnsProvider } = await import(\"@certd/pipeline\")\nreturn class DemoDnsProvider extends AbstractDnsProvider {\n  // 创建dns解析记录，用于验证域名所有权\n  async createRecord(options) {\n    /**\n     * fullRecord: '_acme-challenge.test.example.com',\n     * value: 一串uuid\n     * type: 'TXT',\n     * domain: 'example.com'\n     */\n    const { fullRecord, value, type, domain } = options;\n    const access = this.ctx.access\n    this.logger.info('添加域名解析：', fullRecord, value, type, domain);\n    // const record = await sdk.createRecord() // 调用对应的接口创建解析记录\n\n    //返回解析记录，用于后面清理\n    return record\n  }\n\n  /**\n   *  删除dns解析记录,清理申请痕迹\n   * @param options\n   */\n  async removeRecord(options) {\n    const { fullRecord, value } = options.recordReq;\n    const record = options.recordRes;  // createRecord接口返回的record\n    const access = this.ctx.access\n    this.logger.info('删除域名解析：', fullRecord, value);\n    if (!record) {\n      this.logger.info('record为空，不执行删除');\n      return;\n    }\n    const recordId = record.id;\n    // 这里调用删除txt dns解析记录接口\n    // sdk.removeRecord(recordId)\n    this.logger.info(\"删除域名解析成功\");\n  }\n}\n\n`\n\n  return {\n    metadata: metadata,\n    content: script\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/plugin/service/plugin-config-getter.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { IPluginConfigService, PluginConfig } from '@certd/pipeline';\nimport { PluginConfigService } from './plugin-config-service.js';\n\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class PluginConfigGetter implements IPluginConfigService {\n  @Inject()\n  pluginConfigService: PluginConfigService;\n\n  async getPluginConfig(pluginName: string): Promise<PluginConfig> {\n    const res = await this.pluginConfigService.getPluginConfig({\n      name: pluginName,\n      type: 'builtIn',\n    });\n    return {\n      name: res.name,\n      disabled: res.disabled,\n      sysSetting: res.sysSetting,\n    };\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/plugin/service/plugin-config-service.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { PluginService } from './plugin-service.js';\n\nexport type PluginConfig = {\n  name: string;\n  disabled: boolean;\n  sysSetting: {\n    input?: Record<string, any>;\n  };\n};\n\nexport type CommPluginConfig = {\n  CertApply?: PluginConfig;\n};\n\nexport type PluginFindReq = {\n  id?: number;\n  name?: string;\n  type: string;\n};\n\n\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class PluginConfigService {\n  @Inject()\n  pluginService: PluginService;\n\n  async getCommPluginConfig() {\n    const configs: CommPluginConfig = {};\n\n    configs.CertApply = await this.getPluginConfig({\n      name: 'CertApply',\n      type: 'builtIn',\n    });\n    return configs;\n  }\n\n  async saveCommPluginConfig(config: CommPluginConfig) {\n    await this.savePluginConfig('CertApply', config.CertApply);\n  }\n\n  async savePluginConfig(name: string, config: PluginConfig) {\n    const sysSetting = config?.sysSetting;\n    if (!sysSetting) {\n      throw new Error(`${name}.sysSetting is required`);\n    }\n    const pluginEntity = await this.pluginService.getRepository().findOne({\n      where: { name },\n    });\n    if (!pluginEntity) {\n      await this.pluginService.add({\n        name,\n        sysSetting: JSON.stringify(sysSetting),\n        type: 'builtIn',\n        disabled: false,\n      });\n    } else {\n      await this.pluginService.getRepository().update({ name }, { sysSetting: JSON.stringify(sysSetting) });\n    }\n  }\n\n  async get(req: PluginFindReq) {\n    if (!req.name && !req.id) {\n      throw new Error('plugin s name or id is required');\n    }\n    return await this.pluginService.getRepository().findOne({\n      where: {\n        id: req.id,\n        name: req.name,\n        type: req.type,\n      },\n    });\n  }\n\n  async getPluginConfig(req: PluginFindReq) {\n    const plugin = await this.get(req);\n    let sysSetting: any = {};\n    if (!plugin) {\n      return {\n        name: req.name,\n        disabled: false,\n        type: req.type,\n        sysSetting,\n      };\n    }\n    if (plugin && plugin.sysSetting) {\n      sysSetting = JSON.parse(plugin.sysSetting);\n    }\n    return {\n      name: plugin.name,\n      disabled: plugin.disabled,\n      sysSetting,\n    };\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from \"@midwayjs/core\";\nimport { BaseService, PageReq } from \"@certd/lib-server\";\nimport { PluginEntity } from \"../entity/plugin.js\";\nimport { InjectEntityModel } from \"@midwayjs/typeorm\";\nimport { Repository } from \"typeorm\";\nimport { isComm } from \"@certd/plus-core\";\nimport { BuiltInPluginService } from \"../../pipeline/service/builtin-plugin-service.js\";\nimport { merge } from \"lodash-es\";\nimport { accessRegistry, notificationRegistry, pluginRegistry } from \"@certd/pipeline\";\nimport { dnsProviderRegistry } from \"@certd/plugin-cert\";\nimport { logger } from \"@certd/basic\";\nimport yaml from \"js-yaml\";\nimport { getDefaultAccessPlugin, getDefaultDeployPlugin, getDefaultDnsPlugin } from \"./default-plugin.js\";\nimport fs from \"fs\";\nimport path from \"path\";\n\nexport type PluginImportReq = {\n  content: string,\n  override?: boolean;\n};\n\n@Provide()\n@Scope(ScopeEnum.Request, {allowDowngrade: true})\nexport class PluginService extends BaseService<PluginEntity> {\n  @InjectEntityModel(PluginEntity)\n  repository: Repository<PluginEntity>;\n\n  @Inject()\n  builtInPluginService: BuiltInPluginService;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  async page(pageReq: PageReq<PluginEntity>) {\n\n    if (pageReq.query.type && pageReq.query.type !== \"builtIn\") {\n      return await super.page(pageReq);\n    }\n    //仅查询内置插件\n    const offset = pageReq.page.offset;\n    const limit = pageReq.page.limit;\n\n\n    const builtInList = await this.getBuiltInEntityList();\n\n    //获取分页数据\n    const data = builtInList.slice(offset, offset + limit);\n\n    return {\n      records: data,\n      total: builtInList.length,\n      offset: offset,\n      limit: limit\n    };\n  }\n\n  async getEnabledBuildInGroup(isSimple = false) {\n    const groups = this.builtInPluginService.getGroups();\n    if (isSimple) {\n      for (const key in groups) {\n        const group = groups[key];\n        group.plugins.forEach(item => {\n          delete item.input;\n        });\n      }\n    }\n\n\n    if (!isComm()) {\n      return groups;\n    }\n    const list = await this.list({\n      query: {\n        type: \"builtIn\",\n        disabled: true\n      }\n    });\n    const disabledNames = list.map(it => it.name);\n    for (const key in groups) {\n      const group = groups[key];\n      if (!group.plugins) {\n        continue;\n      }\n      group.plugins = group.plugins.filter(it => !disabledNames.includes(it.name));\n    }\n    return groups;\n  }\n\n  async getEnabledBuiltInList(): Promise<any> {\n    const builtInList = this.builtInPluginService.getList();\n    if (!isComm()) {\n      return builtInList;\n    }\n\n    const list = await this.list({\n      query: {\n        type: \"builtIn\",\n        disabled: true\n      }\n    });\n    const disabledNames = list.map(it => it.name);\n\n    return builtInList.filter(it => {\n      return !disabledNames.includes(it.name);\n    });\n  }\n\n  async getBuiltInEntityList() {\n    const builtInList = this.builtInPluginService.getList();\n    const list = await this.list({\n      query: {\n        type: \"builtIn\"\n      }\n    });\n\n    const records: PluginEntity[] = [];\n\n    for (const item of builtInList) {\n      let record = list.find(it => it.name === item.name);\n      if (!record) {\n        record = new PluginEntity();\n        record.disabled = false;\n      }\n      merge(record, {\n        name: item.name,\n        title: item.title,\n        type: \"builtIn\",\n        icon: item.icon,\n        desc: item.desc,\n        group: item.group\n      });\n      records.push(record);\n    }\n    return records;\n  }\n\n  async setDisabled(opts: { id?: number; name?: string; type: string; disabled: boolean }) {\n    const {id, name, type, disabled} = opts;\n    if (!type) {\n      throw new Error(\"参数错误: type 不能为空\");\n    }\n    if (id > 0) {\n      //update\n      await this.repository.update({id}, {disabled});\n      return;\n    }\n\n    if (name && type === \"builtIn\") {\n      const pluginEntity = new PluginEntity();\n      pluginEntity.name = name;\n      pluginEntity.type = type;\n      pluginEntity.disabled = disabled;\n      await this.repository.save(pluginEntity);\n      return;\n    }\n    throw new Error(\"参数错误: id 和 name 必须有一个\");\n  }\n\n  async getDefineByType(type: string) {\n    return this.builtInPluginService.getByType(type);\n  }\n\n  /**\n   * 新增\n   * @param param 数据\n   */\n  async add(param: any) {\n\n    const old = await this.repository.findOne({\n      where: {\n        name: param.name,\n        author: param.author\n      }\n    });\n\n    if (old) {\n      throw new Error(`插件${param.author}/${param.name}已存在`);\n    }\n\n    let plugin: any = {};\n    if (param.pluginType === \"access\") {\n      plugin = getDefaultAccessPlugin();\n      delete param.group;\n    } else if (param.pluginType === \"deploy\") {\n      plugin = getDefaultDeployPlugin();\n    } else if (param.pluginType === \"dnsProvider\") {\n      plugin = getDefaultDnsPlugin();\n      delete param.group;\n    } else {\n      throw new Error(`插件类型${param.pluginType}不支持`);\n    }\n\n    const res= await super.add({\n      ...param,\n      ...plugin\n    });\n\n    await this.registerById(res.id);\n    return res\n  }\n\n   async registerById(id: any) {\n    const item = await this.info(id);\n    if (!item) {\n      return;\n    }\n    if(item.type === \"builtIn\"){\n      return;\n    }\n    await this.registerPlugin(item);\n  }\n\n  async unRegisterById(id: any){\n    const item = await this.info(id);\n    if (!item) {\n      return;\n    }\n    if (item.type === \"builtIn\") {\n      return;\n    }\n    let name = item.name;\n    if (item.author){\n       name = `${item.author}/${item.name}`\n    }\n    if (item.pluginType  === \"access\"){\n      accessRegistry.unRegister(name)\n    }else if (item.pluginType === \"deploy\"){\n      pluginRegistry.unRegister(name)\n    }else if (item.pluginType === \"dnsProvider\"){\n      dnsProviderRegistry.unRegister(name)\n    }else if (item.pluginType === \"notification\"){\n      notificationRegistry.unRegister(name)\n    }else{\n     logger.warn(`不支持的插件类型：${item.pluginType}`)\n    }\n  }\n\n  async update(param: any) {\n    const old = await this.repository.findOne({\n      where: {\n        name: param.name,\n        author: param.author\n      }\n    });\n\n    if (old && old.id !== param.id) {\n      throw new Error(`插件${param.author}/${param.name}已存在`);\n    }\n\n\n    const res= await super.update(param);\n\n    await this.registerById(param.id);\n    return res\n  }\n\n  async compile(code: string) {\n    const ts = await import(\"typescript\");\n    return ts.transpileModule(code, {\n      compilerOptions: {module: ts.ModuleKind.ESNext}\n    }).outputText;\n  }\n\n\n  private async getPluginClassFromFile(item: any) {\n    const scriptFilePath = item.scriptFilePath;\n    const res =  await import((`${scriptFilePath}`))\n    const classNames = Object.keys(res)\n    return res[classNames[0]]\n  }\n\n  async getPluginClassFromDb(pluginName: string) {\n    //获取插件类实例对象\n    let author = undefined;\n    let name = \"\";\n    if (pluginName.includes(\"/\")) {\n      const arr = pluginName.split(\"/\");\n      author = arr[0];\n      name = arr[1];\n    } else {\n      name = pluginName;\n    }\n    const info = await this.find({\n      where: {\n        name: name,\n        author: author\n      }\n    });\n    if (info && info.length > 0) {\n      const plugin = info[0];\n\n      try {\n        const AsyncFunction = Object.getPrototypeOf(async () => {\n        }).constructor;\n        // const script = await this.compile(plugin.content);\n        const script = plugin.content;\n        const getPluginClass = new AsyncFunction(script);\n        return await getPluginClass({logger: logger});\n      } catch (e) {\n        logger.error(\"编译插件失败:\", e);\n        throw e;\n      }\n\n    }\n    throw new Error(`插件${pluginName}不存在`);\n  }\n\n  /**\n   * 从数据库加载插件\n   */\n  async registerFromDb() {\n    const res = await this.list({\n      buildQuery: ((bq) => {\n        bq.andWhere(\"type != :type\", {\n          type: \"builtIn\"\n        });\n      })\n    });\n\n    for (const item of res) {\n      await this.registerPlugin(item);\n    }\n  }\n\n  async registerFromLocal(localDir: string) {\n    //scan path\n    const files = fs.readdirSync(localDir);\n    let list = []\n    for (const file of files) {\n      if (!file.endsWith(\".yaml\")) {\n        continue;\n      }\n      const item = yaml.load(fs.readFileSync(path.join(localDir, file), \"utf8\"));\n\n      list.push(item);\n\n    }\n    //排序\n    list = list.sort((a, b) => {\n      return (a.order??10) - (b.order ??10);\n    });\n\n    for (const item of list) {\n      await this.registerPlugin(item);\n    }\n  }\n\n  async registerPlugin(plugin: PluginEntity) {\n    const metadata = plugin.metadata ? yaml.load(plugin.metadata) : {};\n    const extra = plugin.extra ? yaml.load(plugin.extra) : {};\n    const item = {\n      ...plugin,\n      ...metadata,\n      ...extra\n    };\n    delete item.metadata;\n    delete item.content;\n    delete item.extra;\n    if (item.author) {\n      item.name = item.author + \"/\" + item.name;\n    }\n    let registry = null;\n    if (item.pluginType === \"access\") {\n      registry = accessRegistry;\n    } else if (item.pluginType === \"deploy\") {\n      registry = pluginRegistry;\n    } else if (item.pluginType === \"dnsProvider\") {\n      registry = dnsProviderRegistry;\n    } else if (item.pluginType === \"notification\") {\n      registry = notificationRegistry;\n    } else {\n      logger.warn(`插件${item.name}类型错误:${item.pluginType}`);\n      return;\n    }\n\n    registry.register(item.name, {\n      define: item,\n      target: async () => {\n        if (item.type === \"builtIn\") {\n          return await this.getPluginClassFromFile(item);\n        } else {\n          return await this.getPluginClassFromDb(item.name);\n        }\n      }\n    });\n  }\n\n  async exportPlugin(id: number) {\n    const info = await this.info(id);\n    if (!info) {\n      throw new Error(\"插件不存在\");\n    }\n    const metadata = yaml.load(info.metadata || \"\");\n    const extra = yaml.load(info.extra || \"\");\n    const content = info.content;\n    delete info.metadata;\n    delete info.extra;\n    delete info.content;\n    delete info.id;\n    delete info.createTime;\n    delete info.updateTime;\n    const plugin = {\n      ...info,\n      ...metadata,\n      ...extra,\n      content\n    };\n\n    return yaml.dump(plugin) as string;\n  }\n\n  async importPlugin(req: PluginImportReq) {\n\n    const loaded = yaml.load(req.content);\n    if (!loaded) {\n      throw new Error(\"插件内容不能为空\");\n    }\n    delete loaded.id\n\n    const old = await this.repository.findOne({\n      where: {\n        name: loaded.name,\n        author: loaded.author\n      }\n    });\n\n    const metadata = {\n      input: loaded.input,\n      output: loaded.output\n    };\n    const extra = {\n      dependPlugins: loaded.dependPlugins,\n      default: loaded.default,\n      showRunStrategy: loaded.showRunStrategy\n    };\n\n    const pluginEntity = {\n      ...loaded,\n      metadata: yaml.dump(metadata),\n      extra: yaml.dump(extra),\n      content: loaded.content,\n      disabled: false\n    };\n    if (!pluginEntity.pluginType) {\n      throw new Error(`插件类型不能为空`);\n    }\n\n    if (!old) {\n      //add\n      const {id} = await this.add(pluginEntity);\n      pluginEntity.id = id;\n    } else{\n      if (!req.override) {\n        throw new Error(`插件${loaded.author}/${loaded.name}已存在`);\n      }\n      pluginEntity.id = old.id;\n    }\n    //update\n    await this.update(pluginEntity);\n    return {\n      id: pluginEntity.id\n    };\n  }\n\n\n  async deleteByIds(ids:any[]){\n     await super.delete(ids);\n    for (const id of ids) {\n      await this.unRegisterById(id)\n    }\n  }\n\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/suite/service/my-count-service.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { PipelineService } from '../../pipeline/service/pipeline-service.js';\nimport { CertInfoService } from '../../monitor/service/cert-info-service.js';\nimport { IUsedCountService } from '@certd/commercial-core';\nimport { SiteInfoService } from '../../monitor/service/site-info-service.js';\n\n@Provide('myCountService')\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class MyCountService implements IUsedCountService {\n  @Inject()\n  pipelineService: PipelineService;\n\n  @Inject()\n  certInfoService: CertInfoService;\n  @Inject()\n  siteInfoService: SiteInfoService;\n\n  async getUsedCount(userId: number) {\n    if (!userId) {\n      throw new Error('userId is required');\n    }\n    const pipelineCountUsed = await this.pipelineService.getUserPipelineCount(userId);\n    const domainCountUsed = await this.certInfoService.getUserDomainCount(userId);\n    const monitorCountUsed = await this.siteInfoService.getUserMonitorCount(userId);\n    return {\n      pipelineCountUsed,\n      domainCountUsed,\n      monitorCountUsed,\n    };\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/authority/entity/permission.ts",
    "content": "import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\n/**\n * 权限\n */\n@Entity('sys_permission')\nexport class PermissionEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n  @Column({ comment: '标题', length: 100 })\n  title: string;\n  /**\n   * 权限代码\n   * 示例：sys:user:read\n   */\n  @Column({ comment: '权限代码', length: 100, nullable: true })\n  permission: string;\n\n  @Column({ name: 'parent_id', comment: '父节点ID', default: -1 })\n  parentId: number;\n\n  @Column({ comment: '排序号' })\n  sort: number;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n\n  // @ManyToMany(type => RoleEntity, res => res.permissions)\n  // roles: RoleEntity[];\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/authority/entity/role-permission.ts",
    "content": "import { Entity, PrimaryColumn } from 'typeorm';\n\n/**\n * 角色权限多对多\n */\n@Entity('sys_role_permission')\nexport class RolePermissionEntity {\n  @PrimaryColumn({ name: 'role_id' })\n  roleId: number;\n  @PrimaryColumn({ name: 'permission_id' })\n  permissionId: number;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/authority/entity/role.ts",
    "content": "import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm';\n\n/**\n * 角色\n */\n@Entity('sys_role')\nexport class RoleEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n  @Index({ unique: true })\n  @Column({ comment: '角色名称', length: 100 })\n  name: string;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n\n  // @ManyToMany(type => PermissionEntity, res => res.roles)\n  // @JoinTable({\n  //   name: 'sys_role_resources',\n  //   joinColumn: {\n  //     name: 'roleId',\n  //     referencedColumnName: 'id',\n  //   },\n  //   inverseJoinColumn: {\n  //     name: 'resourceId',\n  //     referencedColumnName: 'id',\n  //   },\n  // })\n  // resources: PermissionEntity[];\n\n  // @ManyToMany(type => UserEntity, res => res.roles)\n  // users: UserEntity[];\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/authority/entity/user-role.ts",
    "content": "import { Entity, PrimaryColumn } from 'typeorm';\n\n/**\n * 用户角色多对多\n */\n@Entity('sys_user_role')\nexport class UserRoleEntity {\n  @PrimaryColumn({ name: 'role_id' })\n  roleId: number;\n  @PrimaryColumn({ name: 'user_id' })\n  userId: number;\n\n  static of(userId: number, roleId: number): UserRoleEntity {\n    return Object.assign(new UserRoleEntity(), { userId, roleId });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/authority/entity/user.ts",
    "content": "import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm';\n\n/**\n * 系统用户\n */\n@Entity('sys_user')\nexport class UserEntity {\n  @PrimaryGeneratedColumn()\n  id: number;\n  @Index({ unique: true })\n  @Column({ comment: '用户名', length: 100 })\n  username: string;\n\n  @Column({ comment: '密码', length: 100 })\n  password: string;\n\n  @Column({ name: 'password_version', comment: '密码版本' })\n  passwordVersion: number;\n\n  @Column({ name: 'nick_name', comment: '昵称', length: 100, nullable: true })\n  nickName: string;\n\n  @Column({ comment: '头像', length: 255, nullable: true })\n  avatar: string;\n\n  @Column({ name: 'phone_code', comment: '区号', length: 20, nullable: true })\n  phoneCode: string;\n\n  @Column({ comment: '手机', length: 20, nullable: true })\n  mobile: string;\n\n  @Column({ comment: '邮箱', length: 50, nullable: true })\n  email: string;\n\n  @Column({ comment: '备注', length: 100, nullable: true })\n  remark: string;\n\n  @Column({ comment: '状态 0:禁用 1：启用', default: 1 })\n  status: number;\n\n  @Column({ name: 'valid_time', comment: '有效期', nullable: true })\n  validTime: number;\n\n  @Column({\n    name: 'create_time',\n    comment: '创建时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  createTime: Date;\n  @Column({\n    name: 'update_time',\n    comment: '修改时间',\n    default: () => 'CURRENT_TIMESTAMP',\n  })\n  updateTime: Date;\n\n  // @ManyToMany(type => RoleEntity, res => res.users)\n  // @JoinTable({\n  //   name: 'sys_user_roles',\n  //   joinColumn: {\n  //     name: 'userId',\n  //     referencedColumnName: 'id',\n  //   },\n  //   inverseJoinColumn: {\n  //     name: 'roleId',\n  //     referencedColumnName: 'id',\n  //   },\n  // })\n  // roles: RoleEntity[];\n  static of(user: Partial<UserEntity>) {\n    return Object.assign(new UserEntity(), user);\n  }\n\n  roleIds: number[];\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/authority/enums/ResourceTypeEnum.ts",
    "content": "import { EnumItem } from '@certd/lib-server';\nimport * as _ from 'lodash-es';\nclass ResourceTypes {\n  MENU = new EnumItem('menu', '菜单', 'blue');\n  BTN = new EnumItem('btn', '按钮', 'green');\n  ROUTE = new EnumItem('route', '路由', 'red');\n\n  names() {\n    const list = [];\n    _.forEach(this, (item, key) => {\n      list.push(item);\n    });\n    return list;\n  }\n}\n\nexport const ResourceTypeEnum = new ResourceTypes();\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/authority/service/auth-service.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { RoleService } from './role-service.js';\n\n/**\n * 权限校验\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class AuthService {\n  @Inject()\n  roleService: RoleService;\n\n  async checkPermission(ctx: any, permission: string) {\n    //如果不是仅校验登录，还需要校验是否拥有权限\n    const roleIds: number[] = ctx.user.roles;\n    const permissions = await this.roleService.getCachedPermissionSetByRoleIds(roleIds);\n    if (!permissions.has(permission)) {\n      return false;\n    }\n    return true;\n  }\n\n  async isAdmin(ctx: any) {\n    const roleIds: number[] = ctx.user.roles;\n    if (roleIds.includes(1)) {\n      return true;\n    }\n  }\n\n  //管理员有权限查看其他用户的数据\n  async checkEntityUserId(ctx: any, service: any, id: any = 0, userKey = 'userId') {\n    const isAdmin = await this.isAdmin(ctx);\n    if (isAdmin) {\n      return true;\n    }\n    await service.checkUserId(id, ctx.user.id, userKey);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/authority/service/permission-service.ts",
    "content": "import { Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { InjectEntityModel } from '@midwayjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { BaseService } from '@certd/lib-server';\nimport { PermissionEntity } from '../entity/permission.js';\n\n/**\n * 权限资源\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class PermissionService extends BaseService<PermissionEntity> {\n  @InjectEntityModel(PermissionEntity)\n  repository: Repository<PermissionEntity>;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async tree(options: any = {}) {\n    if (options.order == null) {\n      options.order = {\n        sort: 'ASC',\n      };\n    }\n    const list = await this.find(options);\n    return this.buildTree(list);\n  }\n\n  buildTree(list: any) {\n    const idMap = {};\n    const root = [];\n    for (const item of list) {\n      idMap[item.id] = item;\n      if (item.parentId == null || item.parentId <= 0) {\n        root.push(item);\n      }\n    }\n\n    for (const item of list) {\n      if (item.parentId > 0) {\n        const parent = idMap[item.parentId];\n        if (parent) {\n          if (parent.children == null) {\n            parent.children = [];\n          }\n          parent.children.push(item);\n        }\n      }\n    }\n    return root;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/authority/service/role-permission-service.ts",
    "content": "import { Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { InjectEntityModel } from '@midwayjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { BaseService } from '@certd/lib-server';\nimport { RolePermissionEntity } from '../entity/role-permission.js';\n\n/**\n * 角色->权限\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class RolePermissionService extends BaseService<RolePermissionEntity> {\n  @InjectEntityModel(RolePermissionEntity)\n  repository: Repository<RolePermissionEntity>;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/authority/service/role-service.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { InjectEntityModel } from '@midwayjs/typeorm';\nimport { In, Repository } from 'typeorm';\nimport { BaseService } from '@certd/lib-server';\nimport { RoleEntity } from '../entity/role.js';\nimport { UserRoleService } from './user-role-service.js';\nimport { RolePermissionEntity } from '../entity/role-permission.js';\nimport { PermissionService } from './permission-service.js';\nimport * as _ from 'lodash-es';\nimport { RolePermissionService } from './role-permission-service.js';\nimport { LRUCache } from 'lru-cache';\n/**\n * 角色\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class RoleService extends BaseService<RoleEntity> {\n  @InjectEntityModel(RoleEntity)\n  repository: Repository<RoleEntity>;\n  @Inject()\n  userRoleService: UserRoleService;\n  @Inject()\n  permissionService: PermissionService;\n  @Inject()\n  rolePermissionService: RolePermissionService;\n\n  permissionCache = new LRUCache<string, any>({\n    max: 1000,\n    ttl: 1000 * 60 * 10,\n  });\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  async getRoleIdsByUserId(id: any) {\n    const userRoles = await this.userRoleService.find({\n      where: { userId: id },\n    });\n    return userRoles.map(item => item.roleId);\n  }\n  async getByUserIds(ids: any) {\n    return await this.userRoleService.find({\n      where: {\n        userId: In<number>(ids) as any,\n      },\n    });\n  }\n\n  async getPermissionByRoleIds(roleIds: any) {\n    if (!roleIds || roleIds.length === 0) {\n      return [];\n    }\n    return await this.permissionService.repository\n      .createQueryBuilder('permission')\n      .innerJoinAndSelect(RolePermissionEntity, 'rp', 'rp.permissionId = permission.id and rp.roleId in (:...roleIds)', { roleIds })\n      .getMany();\n  }\n\n  async addRoles(userId: number, roles) {\n    if (roles == null || roles.length === 0) {\n      return;\n    }\n    for (const roleId of roles) {\n      await this.userRoleService.add({\n        userId,\n        roleId,\n      });\n    }\n  }\n\n  async updateRoles(userId, roles) {\n    if (roles == null) {\n      return;\n    }\n    const oldRoleIds = await this.getRoleIdsByUserId(userId);\n    if (_.xor(roles, oldRoleIds).length === 0) {\n      //如果两个数组相等，则不修改\n      return;\n    }\n    //先删除所有\n    await this.userRoleService.deleteWhere({ userId });\n    //再添加\n    await this.addRoles(userId, roles);\n\n    this.permissionCache.clear();\n  }\n\n  async getPermissionTreeByRoleId(id: any) {\n    const list = await this.getPermissionByRoleIds([id]);\n    return this.permissionService.buildTree(list);\n  }\n\n  async getPermissionIdsByRoleId(id: any) {\n    const list = await this.getPermissionByRoleIds([id]);\n    return list.map(item => item.id);\n  }\n\n  async authz(roleId: any, permissionIds: any) {\n    await this.rolePermissionService.deleteWhere({ roleId });\n    for (const permissionId of permissionIds) {\n      await this.rolePermissionService.add({\n        roleId,\n        permissionId,\n      });\n    }\n    this.permissionCache.clear();\n  }\n\n  async getPermissionSetByRoleIds(roleIds: number[]): Promise<Set<string>> {\n    const list = await this.getPermissionByRoleIds(roleIds);\n\n    const permissionSet = new Set<string>();\n    for (const entity of list) {\n      permissionSet.add(entity.permission);\n    }\n    return permissionSet;\n  }\n\n  async getCachedPermissionSetByRoleIds(roleIds: number[]): Promise<Set<string>> {\n    const roleIdsKey = roleIds.join(',');\n    let permissionSet = this.permissionCache.get(roleIdsKey);\n    if (permissionSet) {\n      return permissionSet;\n    }\n    permissionSet = await this.getPermissionSetByRoleIds(roleIds);\n    this.permissionCache.set(roleIdsKey, permissionSet);\n    return permissionSet;\n  }\n\n  //@ts-ignore\n  async delete(id: any) {\n    const idArr = this.resolveIdArr(id);\n    //@ts-ignore\n    const urs = await this.userRoleService.find({ where: { roleId: In(idArr) } });\n    if (urs.length > 0) {\n      throw new Error('该角色已被用户使用，无法删除');\n    }\n    await this.deleteWhere({ id: In(idArr) });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/authority/service/user-role-service.ts",
    "content": "import { Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { InjectEntityModel } from '@midwayjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { BaseService } from '@certd/lib-server';\nimport { UserRoleEntity } from '../entity/user-role.js';\n\n/**\n * 用户->角色\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class UserRoleService extends BaseService<UserRoleEntity> {\n  @InjectEntityModel(UserRoleEntity)\n  repository: Repository<UserRoleEntity>;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/authority/service/user-service.ts",
    "content": "import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';\nimport { InjectEntityModel } from '@midwayjs/typeorm';\nimport {In, MoreThan, Not, Repository} from 'typeorm';\nimport { UserEntity } from '../entity/user.js';\nimport * as _ from 'lodash-es';\nimport { BaseService, CommonException, Constants, FileService, SysInstallInfo, SysSettingsService } from '@certd/lib-server';\nimport { RoleService } from './role-service.js';\nimport { PermissionService } from './permission-service.js';\nimport { UserRoleService } from './user-role-service.js';\nimport { UserRoleEntity } from '../entity/user-role.js';\nimport bcrypt from 'bcryptjs';\nimport { RandomUtil } from '../../../../utils/random.js';\nimport dayjs from 'dayjs';\nimport { DbAdapter } from '../../../db/index.js';\nimport { simpleNanoId, utils } from '@certd/basic';\n\nexport type RegisterType = 'username' | 'mobile' | 'email';\n\nexport const AdminRoleId = 1\n/**\n * 系统用户\n */\n@Provide()\n@Scope(ScopeEnum.Request, { allowDowngrade: true })\nexport class UserService extends BaseService<UserEntity> {\n \n  @InjectEntityModel(UserEntity)\n  repository: Repository<UserEntity>;\n  @Inject()\n  roleService: RoleService;\n  @Inject()\n  permissionService: PermissionService;\n  @Inject()\n  userRoleService: UserRoleService;\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n  @Inject()\n  fileService: FileService;\n  @Inject()\n  dbAdapter: DbAdapter;\n\n  //@ts-ignore\n  getRepository() {\n    return this.repository;\n  }\n\n  /**\n   * 获得个人信息\n   */\n  async mine(userId: number) {\n    const info = await this.repository.findOne({\n      where: {\n        id: userId,\n      },\n    });\n    delete info.password;\n    return info;\n  }\n\n  /**\n   * 新增\n   * @param param\n   */\n  async add(param) {\n    const exists = await this.repository.findOne({\n      where: {\n        username: param.username,\n      },\n    });\n    if (!_.isEmpty(exists)) {\n      throw new CommonException('用户名已经存在');\n    }\n    const plainPassword = param.password ?? RandomUtil.randomStr(6);\n    param.passwordVersion = 2;\n    param.password = await this.genPassword(plainPassword, param.passwordVersion); // 默认密码  建议未改密码不能登陆\n\n    if (param.avatar) {\n      param.avatar = await this.fileService.saveFile(0, param.avatar, 'public');\n    }\n\n    await super.add(param);\n    //添加角色\n    if (param.roles && param.roles.length > 0) {\n      await this.roleService.addRoles(param.id, param.roles);\n    }\n    return param.id;\n  }\n\n  /**\n   * 修改\n   * @param param 数据\n   */\n  async update(param) {\n    if (param.id == null) {\n      throw new CommonException('id不能为空');\n    }\n    const userInfo = await this.repository.findOne({\n      where: { id: param.id },\n    });\n    if (!userInfo) {\n      throw new CommonException('用户不存在');\n    }\n\n    if (param.username) {\n      const username = param.username;\n      const id = param.id;\n      const old = await this.findOne([\n        { username: username, id: Not(id) },\n        { mobile: username, id: Not(id) },\n        { email: username, id: Not(id) },\n      ]);\n      if (old != null) {\n        throw new CommonException('用户名已被占用');\n      }\n    }\n    if (!_.isEmpty(param.password)) {\n      param.passwordVersion = 2;\n      param.password = await this.genPassword(param.password, param.passwordVersion);\n    } else {\n      delete param.password;\n    }\n\n    if (param.avatar) {\n      param.avatar = await this.fileService.saveFile(userInfo.id, param.avatar, 'public');\n    }\n    await super.update(param);\n    await this.roleService.updateRoles(param.id, param.roles);\n  }\n\n  private async genPassword(rawPassword: any, passwordVersion: number) {\n    if (passwordVersion == null || passwordVersion <= 1) {\n      return utils.hash.md5(rawPassword);\n    }\n    const salt = bcrypt.genSaltSync(10);\n    const plainPassword = await this.buildPlainPassword(rawPassword);\n    return bcrypt.hashSync(plainPassword, salt);\n  }\n\n  async findOne(param: Record<string,any>) {\n    return this.repository.findOne({\n      where: param,\n    });\n  }\n\n  async checkPassword(rawPassword: any, hashPassword: any, passwordVersion: number) {\n    if (passwordVersion == null || passwordVersion <= 1) {\n      return (await this.genPassword(rawPassword, passwordVersion)) === hashPassword;\n    }\n    const plainPassword = await this.buildPlainPassword(rawPassword);\n    return bcrypt.compareSync(plainPassword, hashPassword);\n  }\n\n  async buildPlainPassword(rawPassword: string) {\n    const setting: SysInstallInfo = await this.sysSettingsService.getSetting(SysInstallInfo);\n    if (!setting.siteId) {\n      throw new CommonException('站点ID还未初始化');\n    }\n    const prefixSiteId = setting.siteId.substring(1, 5);\n    return rawPassword + prefixSiteId;\n  }\n\n  /**\n   * 获取用户的菜单资源列表\n   * @param id\n   */\n  async getUserPermissions(id: any) {\n    const roleIds = await this.roleService.getRoleIdsByUserId(id);\n    return await this.roleService.getPermissionByRoleIds(roleIds);\n  }\n\n  async register(type: string, user: UserEntity) {\n    if (!user.password) {\n      user.password = simpleNanoId();\n    }\n    if (!user.username) {\n      user.username = 'user_' + simpleNanoId();\n    }\n\n    if (type === 'username') {\n      const username = user.username;\n      const old = await this.findOne([{ username: username }, { mobile: username }, { email: username }]);\n      if (old != null) {\n        throw new CommonException('用户名已被注册');\n      }\n    } else if (type === 'mobile') {\n      const mobile = user.mobile;\n\n      user.nickName = mobile.substring(0, 3) + '****' + mobile.substring(7);\n      const old = await this.findOne([{ username: mobile }, { mobile: mobile }, { email: mobile }]);\n      if (old != null) {\n        throw new CommonException('手机号已被注册');\n      }\n    } else if (type === 'email') {\n      const email = user.email;\n      const old = await this.findOne([{ username: email }, { mobile: email }, { email: email }]);\n      if (old != null) {\n        throw new CommonException('邮箱已被注册');\n      }\n    }\n\n    let newUser: UserEntity = UserEntity.of({\n      username: user.username,\n      password: user.password,\n      email: user.email || '',\n      mobile: user.mobile || '',\n      nickName: user.nickName || user.username,\n      avatar: user.avatar || '',\n      phoneCode: user.phoneCode || '86',\n      status: 1,\n      passwordVersion: 2,\n    });\n    if (!newUser.password) {\n      newUser.password = RandomUtil.randomStr(6);\n    }\n    newUser.password = await this.genPassword(newUser.password, newUser.passwordVersion);\n\n    await this.transaction(async txManager => {\n      newUser = await txManager.save(newUser);\n      const userRole: UserRoleEntity = UserRoleEntity.of(newUser.id, Constants.role.defaultUser);\n      await txManager.save(userRole);\n    });\n\n    delete newUser.password;\n\n    utils.mitter.emit('register', { userId: newUser.id });\n\n    return newUser;\n  }\n\n  async changePassword(userId: any, form: any) {\n    const user = await this.info(userId);\n    const passwordChecked = await this.checkPassword(form.password, user.password, user.passwordVersion);\n    if (!passwordChecked) {\n      throw new CommonException('原密码错误');\n    }\n    const param = {\n      id: userId,\n      password: form.newPassword,\n    };\n\n    await this.update(param);\n  }\n\n  async resetPassword(userId: any, newPasswd: string) {\n    if (!userId) {\n      throw new CommonException('userId不能为空');\n    }\n    const param = {\n      id: userId,\n      password: newPasswd,\n    };\n    await this.update(param);\n  }\n\n  //@ts-ignore\n  async delete(ids: any) {\n    if (typeof ids === 'string') {\n      ids = ids.split(',');\n      ids = ids.map(id => parseInt(id));\n    }\n    if (ids.length === 0) {\n      return;\n    }\n    if (ids.includes(1)) {\n      throw new CommonException('不能删除管理员');\n    }\n    await super.delete(ids);\n  }\n\n  async isAdmin(userId: any) {\n    if (!userId) {\n      throw new CommonException('userId不能为空');\n    }\n    const userRoles = await this.userRoleService.find({\n      where: {\n        userId,\n      },\n    });\n    const roleIds = userRoles.map(item => item.roleId);\n    if (roleIds.includes(AdminRoleId)) {\n      return true;\n    }\n  }\n\n  async updateStatus(id: number, status: number) {\n    if (!id) {\n      throw new CommonException('userId不能为空');\n    }\n    await this.repository.update(id, {\n      status,\n    });\n  }\n\n  async count(param: { userId?: any } = {}) {\n    const count = await this.repository.count({\n      where: {\n        id: param.userId,\n      },\n    });\n    return count;\n  }\n\n  async registerCountPerDay(param: { days: number } = { days: 7 }) {\n    const todayEnd = dayjs().endOf('day');\n    const result = await this.getRepository()\n      .createQueryBuilder('main')\n      .select(`${this.dbAdapter.date('main.createTime')}  AS date`) // 将UNIX时间戳转换为日期\n      .addSelect('COUNT(1) AS count')\n      .where({\n        // 0点\n        createTime: MoreThan(todayEnd.add(-param.days, 'day').toDate()),\n      })\n      .groupBy('date')\n      .getRawMany();\n\n    return result;\n  }\n\n  async getAdmins() {\n      const admins = await this.userRoleService.find({\n        where: {\n          roleId: AdminRoleId,\n        },\n      });\n\n      const userIds = admins.map(item => item.userId);\n      return await this.repository.find({\n        where: {\n          id: In(userIds),\n          status: 1,\n        },\n        order: {\n          updateTime: 'DESC',\n        },\n      })\n  }\n\n  async updateProfile(userId: any, body: any) {\n\n    await this.update({\n      id: userId,\n      ...body,\n    })\n\n\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/settings/fix.ts",
    "content": "import { SysEmailConf, SysSettingsService } from '@certd/lib-server';\nimport * as _ from 'lodash-es';\nimport { UserSettingsService } from '../../mine/service/user-settings-service.js';\n\nexport async function getEmailSettings(sysSettingService: SysSettingsService, userSettingsService: UserSettingsService): Promise<SysEmailConf> {\n  let conf = await sysSettingService.getSetting<SysEmailConf>(SysEmailConf);\n  if (!conf.host || conf.usePlus == null) {\n    //到userSetting里面去找\n    const adminEmailSetting = await userSettingsService.getByKey('email', 1);\n    if (adminEmailSetting) {\n      const setting = JSON.parse(adminEmailSetting.setting);\n      conf = _.merge(conf, setting);\n      await sysSettingService.saveSetting(conf);\n    }\n  }\n  return conf;\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/modules/sys/settings/safe-service.ts",
    "content": "import {Inject, Provide, Scope, ScopeEnum} from '@midwayjs/core';\nimport {SiteHidden, SysSafeSetting, SysSettingsService} from \"@certd/lib-server\";\nimport fs from \"fs\";\nimport {logger, utils} from \"@certd/basic\";\nimport {cloneDeep, merge} from \"lodash-es\";\n\n\nexport class HiddenStatus {\n\n\n  isHidden = false;\n  lastRequestTime = 0;\n  intervalId: any = null;\n\n  hasUnHiddenFile() {\n    if (fs.existsSync(`./data/.unhidden`)) {\n      fs.unlinkSync(`./data/.unhidden`)\n      return true\n    }\n    return false\n  }\n\n  updateRequestTime() {\n    this.lastRequestTime = Date.now();\n  }\n\n  startCheck(autoHiddenTimes = 5) {\n    this.stopCheck()\n    this.intervalId = setInterval(() => {\n      //默认5分钟后自动隐藏\n      if (!this.isHidden && Date.now() - this.lastRequestTime > 1000 * 60 * autoHiddenTimes) {\n        this.isHidden = true;\n      }\n    }, 1000 * 60)\n  }\n\n  stopCheck() {\n    if (this.intervalId) {\n      clearInterval(this.intervalId)\n      this.intervalId = null\n    }\n  }\n\n}\n\nexport const hiddenStatus = new HiddenStatus();\n\n\n@Provide('safeService')\n@Scope(ScopeEnum.Request, {allowDowngrade: true})\nexport class SafeService {\n\n  @Inject()\n  sysSettingsService: SysSettingsService;\n\n\n  async reloadHiddenStatus(immediate = false) {\n    const hidden = await this.getHiddenSetting()\n    if (hidden.enabled) {\n      logger.info(\"启动站点隐藏\");\n      hiddenStatus.isHidden = immediate;\n      const autoHiddenTimes = hidden.autoHiddenTimes || 5;\n      hiddenStatus.startCheck(autoHiddenTimes);\n    } else {\n      logger.info(\"当前站点隐藏已关闭\");\n      hiddenStatus.isHidden = false;\n      hiddenStatus.stopCheck()\n    }\n  }\n\n\n  async getHiddenSetting(): Promise<SiteHidden> {\n    const safeSetting = await this.getSafeSetting()\n    return safeSetting.hidden || {enabled: false}\n  }\n\n  async getSafeSetting() {\n    return await this.sysSettingsService.getSetting<SysSafeSetting>(SysSafeSetting)\n  }\n\n  async hiddenImmediately() {\n    return hiddenStatus.isHidden = true\n  }\n\n  async saveSafeSetting(body: SysSafeSetting) {\n\n    // 更新hidden配置\n    if (body.hidden.openPassword) {\n      body.hidden.openPassword = utils.hash.md5(body.hidden.openPassword);\n    }\n    const blankSetting = new SysSafeSetting()\n    const setting = await this.getSafeSetting()\n    const newSetting = merge(blankSetting, cloneDeep(setting), body);\n    if (newSetting.hidden?.enabled && !newSetting.hidden?.openPassword) {\n      throw new Error(\"首次设置需要填写解锁密码\")\n    }\n\n    if(isNaN(newSetting.hidden.autoHiddenTimes) || newSetting.hidden.autoHiddenTimes < 1){\n      newSetting.hidden.autoHiddenTimes = 1\n    }\n\n    await this.sysSettingsService.saveSetting(newSetting);\n\n    await this.reloadHiddenStatus(false)\n\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/index.ts",
    "content": "export * from '@certd/plugin-cert';\nexport * from '@certd/plugin-plus';\nexport * from './plugin-aliyun/index.js';\nexport * from './plugin-tencent/index.js';\nexport * from './plugin-host/index.js';\nexport * from './plugin-huawei/index.js';\nexport * from './plugin-demo/index.js';\nexport * from './plugin-other/index.js';\nexport * from './plugin-west/index.js';\nexport * from './plugin-doge/index.js';\nexport * from './plugin-qiniu/index.js';\nexport * from './plugin-woai/index.js';\nexport * from './plugin-cachefly/index.js';\nexport * from './plugin-gcore/index.js';\nexport * from './plugin-qnap/index.js';\nexport * from './plugin-aws/index.js';\nexport * from './plugin-aws-cn/index.js';\nexport * from './plugin-dnsla/index.js';\nexport * from './plugin-upyun/index.js';\nexport * from './plugin-volcengine/index.js'\nexport * from './plugin-jdcloud/index.js'\nexport * from './plugin-51dns/index.js'\nexport * from './plugin-notification/index.js'\nexport * from './plugin-flex/index.js'\nexport * from './plugin-farcdn/index.js'\nexport * from './plugin-fnos/index.js'\nexport * from './plugin-rainyun/index.js'\nexport * from './plugin-cloudflare/index.js'\nexport * from './plugin-github/index.js'\nexport * from './plugin-namesilo/index.js'\nexport * from './plugin-proxmox/index.js'\nexport * from './plugin-wangsu/index.js'\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-51dns/access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from '@certd/pipeline';\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: '51dns',\n  title: '51dns授权',\n  icon: 'arcticons:dns-changer-3',\n  desc: '',\n})\nexport class Dns51Access extends BaseAccess {\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    title: '用户名',\n    component: {\n      placeholder: '用户名或手机号',\n    },\n    required: true,\n    encrypt: false,\n  })\n  username = '';\n\n  @AccessInput({\n    title: '登录密码',\n    component: {\n      name:\"a-input-password\",\n      vModel:\"value\",\n      placeholder: '密码',\n    },\n    required: true,\n    encrypt: true,\n  })\n  password = '';\n}\n\nnew Dns51Access();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-51dns/client.ts",
    "content": "import {createAxiosService, HttpClient, ILogger} from \"@certd/basic\";\nimport {Dns51Access} from \"./access.js\";\n\nexport class Dns51Client {\n  logger: ILogger;\n  access: Dns51Access;\n  http: HttpClient;\n  cryptoJs: any;\n  isLogined = false;\n  _token = \"\";\n  _cookie = \"\";\n\n  constructor(options: {\n    logger: ILogger;\n    access: Dns51Access;\n  }) {\n    this.logger = options.logger;\n    this.access = options.access;\n\n    this.http = createAxiosService({\n      logger: this.logger\n    });\n\n  }\n\n\n  aes(val: string) {\n    if (!this.cryptoJs) {\n      throw new Error(\"crypto-js not init\");\n    }\n    const CryptoJS = this.cryptoJs;\n    var k = CryptoJS.enc.Utf8.parse(\"1234567890abcDEF\");\n    var iv = CryptoJS.enc.Utf8.parse(\"1234567890abcDEF\");\n    return CryptoJS.AES.encrypt(val, k, {\n      iv: iv,\n      mode: CryptoJS.mode.CBC,\n      padding: CryptoJS.pad.ZeroPadding\n    }).toString();\n  }\n\n\n  async init() {\n    if (this.cryptoJs) {\n      return;\n    }\n    const CryptoJSModule = await import(\"crypto-js\");\n    this.cryptoJs = CryptoJSModule.default;\n\n  }\n\n  async login() {\n    if (this.isLogined) {\n      return;\n    }\n    await this.init();\n    const res = await this.http.request({\n      url: \"https://www.51dns.com/login.html\",\n      method: \"get\",\n      withCredentials: true,\n      logRes: false,\n      returnOriginRes: true,\n      headers: {\n        // 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36',\n        'Origin': 'https://www.51dns.com',\n        'Referer': 'https://www.51dns.com',\n      },\n    });\n    let setCookie = res.headers['set-cookie']\n    let cookie = setCookie.map((item: any) => {\n      return item.split(';')[0]\n    }).join(';')\n\n\n    //提取 var csrfToken = \"ieOfM21eDd9nWJv3OZtMJF6ogDsnPKQHJ17dlMck\";\n    const _token = res.data.match(/var csrfToken = \"(.*?)\"/)[1];\n    this.logger.info(\"_token:\", _token);\n    this._token = _token;\n    var obj = {\n      \"email_or_phone\": this.aes(this.access.username),\n      \"password\": this.aes(this.access.password),\n      \"type\": this.aes(\"account\"),\n      \"redirectTo\": \"https://www.51dns.com/domain\",\n      \"_token\": _token\n    };\n    const res2 = await this.http.request({\n      url: \"https://www.51dns.com/login\",\n      method: \"post\",\n      data: {\n        ...obj\n      },\n      withCredentials: true,\n      logRes: false,\n      returnOriginRes: true,\n      headers: {\n        'Origin': 'https://www.51dns.com',\n        'Referer': 'https://www.51dns.com',\n        'Content-Type': 'application/x-www-form-urlencoded',\n        'Cookie': cookie,\n        'X-Requested-With': 'XMLHttpRequest'\n      }\n    });\n    this.logger.info(\"return headers:\", JSON.stringify(res2.headers))\n    if (res2.data.code == 0) {\n      setCookie = res2.headers['set-cookie']\n      this._cookie = setCookie.map((item: any) => {\n        return item.split(';')[0]\n      }).join(';')\n      this.logger.info(\"cookie:\", this._cookie)\n      this.logger.info(\"登录成功\")\n    } else {\n      throw new Error(\"登录失败:\", res2.data)\n    }\n\n\n    const res3 = await this.http.request({\n      url: 'https://www.51dns.com/domain',\n      method: 'get',\n      withCredentials: true,\n      logRes: false,\n      returnOriginRes: true,\n      headers: {\n        // 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36',\n        'Origin': 'https://www.51dns.com',\n        'Referer': 'https://www.51dns.com/login.html',\n        'Cookie': this._cookie,\n      }\n    })\n\n    const success2 = res3.data.includes('<span class=\"nav-title\">DNS解析</span>')\n\n    if (!success2) {\n      throw new Error(\"检查登录失败\")\n    }\n    this.logger.info(\"检查登录成功\")\n\n    this.isLogined = true;\n  }\n\n  async getDomainId(domain: string) {\n    await this.login();\n\n    const res = await this.http.request({\n      url: `https://www.51dns.com/domain?domain=${domain}&status=`,\n      method: \"get\",\n      withCredentials: true,\n      logRes: false,\n      returnOriginRes: true,\n      headers: this.getRequestHeaders()\n    });\n\n    // 提取 <a target=\"_blank\" href=\"https://www.51dns.com/domain/record/193341603\"\n    //                                        class=\"color47\">certd.top</a>\n    const regExp = new RegExp(`<a target=\"_blank\" href=\"https://www.51dns.com/domain/record/(\\\\d+)\"[^>]*>${domain}<\\\\/a>`, \"i\");\n    const matched = res.data.match(regExp);\n    if (!matched || matched.length < 1) {\n      throw new Error(`域名${domain}不存在`);\n    }\n    const domainId = matched[1];\n    this.logger.info(`域名${domain}的id为${domainId}`)\n    return parseInt(domainId);\n  }\n\n  private getRequestHeaders() {\n    return {\n      'Origin': 'https://www.51dns.com',\n      'Referer': 'https://www.51dns.com',\n      'Cookie': this._cookie\n    };\n  }\n\n  async createRecord(param: { domain: string, data: any; domainId: number; host: string; ttl: number; type: string }) {\n    const {domain, data, host, type} = param;\n    const domainId = await this.getDomainId(domain);\n    const url = \"https://www.51dns.com/domain/storenNewRecord\";\n    const req = {\n      _token: this._token,\n      domain_id: domainId,\n      record: host,\n      type: type,\n      value: data,\n      ttl: 300,\n      mx:\"\",\n      view_id: 0\n    };\n    this.logger.info(\"req:\", JSON.stringify(req))\n    const res = await this.http.request({\n      url,\n      method: \"post\",\n      data: req,\n      withCredentials: true,\n      headers: {\n        ...this.getRequestHeaders(),\n        'Content-Type': 'application/x-www-form-urlencoded'\n      }\n    });\n\n    if (res.status !== 200) {\n      throw new Error(`创建域名解析失败：${res.msg}`);\n    }\n    const id = res.data.id;\n    return {\n      id,\n      domainId\n    };\n\n  }\n\n  async deleteRecord(param: { domainId: number; id: number }) {\n    const url = \"https://www.51dns.com/domain/operateRecord\"\n    /*\n    type: delete\nids[0]: 601019779\ndomain_id: 193341603\n_token: ieOfM21eDd9nWJv3OZtMJF6ogDsnPKQHJ17dlMck\n     */\n    const body = {\n      type: \"delete\",\n      ids: [param.id],\n      domain_id: param.domainId,\n      _token: this._token\n    }\n    const res = await this.http.request({\n      url,\n      method: \"post\",\n      data: body,\n      withCredentials: true,\n      headers: {\n        ...this.getRequestHeaders(),\n        'Content-Type': 'application/x-www-form-urlencoded'\n      }\n    });\n    if (res.status !== 200) {\n      throw new Error(`删除域名解析失败：${res.msg}`);\n    }\n\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-51dns/dns-provider.ts",
    "content": "import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from \"@certd/plugin-cert\";\n\nimport { Dns51Access } from \"./access.js\";\nimport { Dns51Client } from \"./client.js\";\n\nexport type Dns51Record = {\n  id: number;\n  domainId: number,\n};\n\n// 这里通过IsDnsProvider注册一个dnsProvider\n@IsDnsProvider({\n  name: '51dns',\n  title: '51dns',\n  desc: '51DNS',\n  icon: 'arcticons:dns-changer-3',\n  // 这里是对应的 cloudflare的access类型名称\n  accessType: '51dns',\n  order:999,\n})\nexport class Dns51DnsProvider extends AbstractDnsProvider<Dns51Record> {\n  access!: Dns51Access;\n\n  client!:Dns51Client;\n  async onInstance() {\n    //一些初始化的操作\n    // 也可以通过ctx成员变量传递context\n    this.access = this.ctx.access as Dns51Access;\n    this.client = new Dns51Client({\n      logger: this.logger,\n      access: this.access,\n    });\n  }\n\n  /**\n   * 创建dns解析记录，用于验证域名所有权\n   */\n  async createRecord(options: CreateRecordOptions): Promise<Dns51Record> {\n    /**\n     * fullRecord: '_acme-challenge.test.example.com',\n     * value: 一串uuid\n     * type: 'TXT',\n     * domain: 'example.com'\n     */\n    const { fullRecord,hostRecord, value, type, domain } = options;\n    this.logger.info('添加域名解析：', fullRecord, value, type, domain);\n\n\n\n\n    const domainId = await this.client.getDomainId(domain);\n    this.logger.info('获取domainId成功:', domainId);\n\n    const res = await this.client.createRecord({\n      domain: domain,\n      domainId: domainId,\n      type: 'TXT',\n      host: hostRecord,\n      data: value,\n      ttl: 300,\n    })\n    return {\n      id: res.id,\n      domainId: domainId,\n    };\n  }\n\n\n  /**\n   *  删除dns解析记录,清理申请痕迹\n   * @param options\n   */\n  async removeRecord(options: RemoveRecordOptions<Dns51Record>): Promise<void> {\n    const { fullRecord, value } = options.recordReq;\n    const record = options.recordRes;\n    this.logger.info('删除域名解析：', fullRecord, value);\n    if (!record) {\n      this.logger.info('record为空，不执行删除');\n      return;\n    }\n    //这里调用删除txt dns解析记录接口\n    /**\n     * 请求示例\n     * DELETE /api/record?id=85371689655342080 HTTP/1.1\n     * Authorization: Basic {token}\n     * 请求参数\n     */\n    const {id,domainId} = record\n    await this.client.deleteRecord({\n      id,\n      domainId\n    })\n    this.logger.info(`删除域名解析成功:fullRecord=${fullRecord},id=${id}`);\n  }\n}\n\n//实例化这个provider，将其自动注册到系统中\nnew Dns51DnsProvider();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-51dns/index.ts",
    "content": "export * from './dns-provider.js';\nexport * from './access.js';\nexport * from './client.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/aliyun-dns-provider.ts",
    "content": "import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert';\n\nimport { AliyunAccess, AliyunClient } from '@certd/plugin-lib';\n\n@IsDnsProvider({\n  name: 'aliyun',\n  title: '阿里云',\n  desc: '阿里云DNS解析提供商',\n  accessType: 'aliyun',\n  icon: 'svg:icon-aliyun',\n  order:0,\n})\nexport class AliyunDnsProvider extends AbstractDnsProvider {\n\n  client: any;\n  async onInstance() {\n    const access: AliyunAccess = this.ctx.access as AliyunAccess\n\n    this.client = new AliyunClient({ logger: this.logger });\n    await this.client.init({\n      accessKeyId: access.accessKeyId,\n      accessKeySecret: access.accessKeySecret,\n      endpoint: 'https://alidns.aliyuncs.com',\n      apiVersion: '2015-01-09',\n    });\n  }\n  //\n  // async getDomainList() {\n  //   const params = {\n  //     RegionId: 'cn-hangzhou',\n  //     PageSize: 100,\n  //   };\n  //\n  //   const requestOption = {\n  //     method: 'POST',\n  //   };\n  //\n  //   const ret = await this.client.request(\n  //     'DescribeDomains',\n  //     params,\n  //     requestOption\n  //   );\n  //   return ret.Domains.Domain;\n  // }\n  //\n  // async matchDomain(dnsRecord: string) {\n  //   const list = await this.getDomainList();\n  //   let domain = null;\n  //   const domainList = [];\n  //   for (const item of list) {\n  //     domainList.push(item.DomainName);\n  //     if (_.endsWith(dnsRecord, item.DomainName)) {\n  //       domain = item.DomainName;\n  //       break;\n  //     }\n  //   }\n  //   if (!domain) {\n  //     throw new Error(\n  //       `can not find Domain :${dnsRecord} ,list: ${JSON.stringify(domainList)}`\n  //     );\n  //   }\n  //   return domain;\n  // }\n  //\n  // async getRecords(domain: string, rr: string, value: string) {\n  //   const params: any = {\n  //     RegionId: 'cn-hangzhou',\n  //     DomainName: domain,\n  //     RRKeyWord: rr,\n  //     ValueKeyWord: undefined,\n  //   };\n  //   if (value) {\n  //     params.ValueKeyWord = value;\n  //   }\n  //\n  //   const requestOption = {\n  //     method: 'POST',\n  //   };\n  //\n  //   const ret = await this.client.request(\n  //     'DescribeDomainRecords',\n  //     params,\n  //     requestOption\n  //   );\n  //   return ret.DomainRecords.Record;\n  // }\n\n  async createRecord(options: CreateRecordOptions): Promise<any> {\n    const { fullRecord,hostRecord, value, type, domain } = options;\n    this.logger.info('添加域名解析：', fullRecord, value, domain);\n    // const domain = await this.matchDomain(fullRecord);\n    const params = {\n      RegionId: 'cn-hangzhou',\n      DomainName: domain,\n      RR: hostRecord,\n      Type: type,\n      Value: value,\n      // Line: 'oversea' // 海外\n    };\n\n    const requestOption = {\n      method: 'POST',\n    };\n    try {\n      const ret = await this.client.request('AddDomainRecord', params, requestOption);\n      this.logger.info('添加域名解析成功:', JSON.stringify(options), ret.RecordId);\n      return ret.RecordId;\n    } catch (e: any) {\n      if (e.code === 'DomainRecordDuplicate') {\n        return;\n      }\n      if(e.code === \"LastOperationNotFinished\"){\n        this.logger.info('上一个操作还未完成，5s后重试')\n        await this.ctx.utils.sleep(5000)\n        return this.createRecord(options)\n      }\n      this.logger.info('添加域名解析出错', e);\n      this.resolveError(e, options);\n    }\n  }\n\n  resolveError(e: any, req: CreateRecordOptions) {\n    if (e.message?.indexOf('The specified domain name does not exist') > -1) {\n      throw new Error(`阿里云账号中不存在此域名:${req.domain}`);\n    }\n    throw e;\n  }\n  async removeRecord(options: RemoveRecordOptions<any>): Promise<any> {\n    const { fullRecord, value } = options.recordReq;\n    const record = options.recordRes;\n    const params = {\n      RegionId: 'cn-hangzhou',\n      RecordId: record,\n    };\n\n    const requestOption = {\n      method: 'POST',\n    };\n    try{\n      const ret = await this.client.request('DeleteDomainRecord', params, requestOption);\n      this.logger.info('删除域名解析成功:', fullRecord, value, ret.RecordId);\n      return ret.RecordId;\n    }catch (e) {\n      if(e.code === \"LastOperationNotFinished\"){\n        this.logger.info('上一个操作还未完成，5s后重试')\n        await this.ctx.utils.sleep(5000)\n        return this.removeRecord(options)\n      }\n      throw e\n    }\n  }\n}\n\nnew AliyunDnsProvider();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/index.ts",
    "content": "import './aliyun-dns-provider.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/index.ts",
    "content": "export * from './dns-provider/index.js';\nexport * from './plugin/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-alb/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo, CertReader } from \"@certd/plugin-cert\";\nimport {\n  AliyunAccess,\n  AliyunClient,\n  AliyunClientV2,\n  AliyunSslClient,\n  createCertDomainGetterInputDefine,\n  createRemoteSelectInputDefine\n} from \"@certd/plugin-lib\";\n\n@IsTaskPlugin({\n  name: \"AliyunDeployCertToALB\",\n  title: \"阿里云-部署至ALB（应用负载均衡）\",\n  icon: \"svg:icon-aliyun\",\n  group: pluginGroups.aliyun.key,\n  desc: \"ALB,更新监听器的默认证书\",\n  needPlus: false,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\nexport class AliyunDeployCertToALB extends AbstractTaskPlugin {\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择证书申请任务输出的域名证书\\n或者选择前置任务“上传证书到阿里云”任务的证书ID，可以减少上传到阿里云的证书数量\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames, \"uploadCertToAliyun\"]\n    },\n    required: true\n  })\n  cert!: CertInfo | number;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  @TaskInput({\n    title: \"证书接入点\",\n    helper: \"不会选就保持默认即可\",\n    value: \"cas.aliyuncs.com\",\n    component: {\n      name: \"a-select\",\n      options: [\n        { value: \"cas.aliyuncs.com\", label: \"中国大陆\" },\n        { value: \"cas.ap-southeast-1.aliyuncs.com\", label: \"新加坡\" },\n        { value: \"cas.eu-central-1.aliyuncs.com\", label: \"德国（法兰克福）\" }\n      ]\n    },\n    required: true\n  })\n  casEndpoint!: string;\n\n  @TaskInput({\n    title: \"Access授权\",\n    helper: \"阿里云授权AccessKeyId、AccessKeySecret\",\n    component: {\n      name: \"access-selector\",\n      type: \"aliyun\"\n    },\n    required: true\n  })\n  accessId!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"ALB所在地区\",\n      typeName: \"AliyunDeployCertToALB\",\n      multi: false,\n      action: AliyunDeployCertToALB.prototype.onGetRegionList.name,\n      watches: [\"accessId\"]\n    })\n  )\n  regionId: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"负载均衡列表\",\n      helper: \"要部署证书的负载均衡ID\",\n      typeName: \"AliyunDeployCertToALB\",\n      action: AliyunDeployCertToALB.prototype.onGetLoadBalanceList.name,\n      watches: [\"regionId\"]\n    })\n  )\n  loadBalancers!: string[];\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"监听器列表\",\n      helper: \"要部署证书的监听器列表\",\n      typeName: \"AliyunDeployCertToALB\",\n      action: AliyunDeployCertToALB.prototype.onGetListenerList.name,\n      watches: [\"loadBalancers\"]\n    })\n  )\n  listeners!: string[];\n\n\n  @TaskInput({\n      title: \"部署证书类型\",\n      value: \"default\",\n      component: {\n        name: \"a-select\",\n        vModel: \"value\",\n        options: [\n          {\n            label: \"默认证书\",\n            value: \"default\"\n          },\n          {\n            label: \"扩展证书\",\n            value: \"extension\"\n          }\n        ]\n      },\n      required: true\n    }\n  )\n  deployType: string = \"default\";\n\n\n  async onInstance() {\n  }\n\n  async getLBClient(access: AliyunAccess, region: string) {\n    const client = new AliyunClient({ logger: this.logger });\n\n    const version = \"2020-06-16\";\n    await client.init({\n      accessKeyId: access.accessKeyId,\n      accessKeySecret: access.accessKeySecret,\n      //https://wafopenapi.cn-hangzhou.aliyuncs.com\n      endpoint: `https://alb.${region}.aliyuncs.com`,\n      apiVersion: version\n    });\n    return client;\n  }\n\n  getALBClientV2(access: AliyunAccess) {\n    return access.getClient(`alb.${this.regionId}.aliyuncs.com`);\n  }\n\n  async execute(): Promise<void> {\n    this.logger.info(`开始部署证书到阿里云(alb)`);\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const certId = await this.getAliyunCertId(access);\n\n    //部署扩展证书\n    const albClientV2 = this.getALBClientV2(access);\n    if (this.deployType === \"extension\") {\n      await this.deployExtensionCert(albClientV2, certId);\n    } else {\n      const client = await this.getLBClient(access, this.regionId);\n      await this.deployDefaultCert(certId, client);\n    }\n\n    await this.ctx.utils.sleep(10000)\n    for (const listener of this.listeners) {\n      await this.clearInvalidCert(albClientV2, listener);\n    }\n\n\n    this.logger.info(\"执行完成\");\n  }\n\n  private async deployDefaultCert(certId: any, client: AliyunClient) {\n    for (const listener of this.listeners) {\n      let params: any = {};\n      params = {\n        ListenerId: listener,\n        Certificates: [\n          {\n            CertificateId: certId\n          }\n        ]\n      };\n\n      const res = await client.request(\"UpdateListenerAttribute\", params);\n      this.checkRet(res);\n      this.logger.info(`部署${listener}监听器证书成功`, JSON.stringify(res));\n    }\n  }\n\n  async deployExtensionCert(client: AliyunClientV2, certId: any) {\n    for (const listenerId of this.listeners) {\n      this.logger.info(`开始部署监听器${listenerId}的扩展证书`);\n      await client.doRequest({\n        // 接口名称\n        action: \"AssociateAdditionalCertificatesWithListener\",\n        // 接口版本\n        version: \"2020-06-16\",\n        data: {\n          query: {\n            ListenerId: listenerId,\n            Certificates: [\n              {\n                CertificateId: certId\n              }\n            ]\n          }\n        }\n      });\n\n      this.logger.info(`部署监听器${listenerId}的扩展证书成功`);\n    }\n  }\n\n  async clearInvalidCert(client: AliyunClientV2, listener: string) {\n    this.logger.info(`开始清理监听器${listener}的过期证书`);\n    const req = {\n      // 接口名称\n      action: \"ListListenerCertificates\",\n      // 接口版本\n      version: \"2020-06-16\",\n      data: {\n        query: {\n          ListenerId: listener\n        }\n      }\n    };\n    const res = await client.doRequest(req);\n    const list = res.Certificates;\n    if (list.length === 0) {\n      this.logger.info(`监听器${listener}没有绑定证书`);\n      return\n    }\n\n    const sslClient = new AliyunSslClient({\n      access: client.access,\n      logger: this.logger,\n      endpoint: this.casEndpoint\n    });\n\n\n    const certIds = [];\n    for (const item of list) {\n      if (item.Status !== \"Associated\") {\n        continue;\n      }\n      if (item.IsDefault) {\n        continue;\n      }\n      certIds.push( parseInt(item.CertificateId));\n    }\n    //检查是否过期，过期则删除\n    const invalidCertIds = [];\n    for (const certId of certIds) {\n      const res = await sslClient.getCertInfo(certId);\n      if (res.notAfter < new Date().getTime()) {\n        invalidCertIds.push(certId);\n      }\n    }\n    if (invalidCertIds.length === 0) {\n      this.logger.info(`监听器${listener}没有过期的证书`);\n      return\n    }\n    this.logger.info(`开始解绑过期的证书:${invalidCertIds}`);\n    await client.doRequest({\n      // 接口名称\n      action: \"DissociateAdditionalCertificatesFromListener\",\n      // 接口版本\n      version: \"2020-06-16\",\n      data: {\n        query: {\n          ListenerId: listener,\n          Certificates: invalidCertIds.map((item) => {\n            return {\n              CertificateId: item\n            }\n          })\n        }\n      }\n    });\n    this.logger.info(`解绑过期证书成功`);\n  }\n\n  async getAliyunCertId(access: AliyunAccess) {\n    let certId: any = this.cert;\n    if (typeof this.cert === \"object\") {\n      const sslClient = new AliyunSslClient({\n        access,\n        logger: this.logger,\n        endpoint: this.casEndpoint\n      });\n\n      const certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt));\n      certId = await sslClient.uploadCert({\n        name: certName,\n        cert: this.cert\n      });\n    }\n    return certId;\n  }\n\n  async onGetRegionList(data: any) {\n    if (!this.accessId) {\n      throw new Error(\"请选择Access授权\");\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const client = await this.getLBClient(access, \"cn-shanghai\");\n\n    const res = await client.request(\"DescribeRegions\", {});\n    this.checkRet(res);\n    if (!res?.Regions || res?.Regions.length === 0) {\n      throw new Error(\"没有找到Regions列表\");\n    }\n\n    return res.Regions.map((item: any) => {\n      return {\n        label: item.LocalName,\n        value: item.RegionId,\n        endpoint: item.RegionEndpoint\n      };\n    });\n  }\n\n  async onGetLoadBalanceList(data: any) {\n    if (!this.accessId) {\n      throw new Error(\"请先选择Access授权\");\n    }\n    if (!this.regionId) {\n      throw new Error(\"请先选择地区\");\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const client = await this.getLBClient(access, this.regionId);\n\n    const params = {\n      MaxResults: 100\n    };\n    const res = await client.request(\"ListLoadBalancers\", params);\n    this.checkRet(res);\n    if (!res?.LoadBalancers || res?.LoadBalancers.length === 0) {\n      throw new Error(\"没有找到LoadBalancers\");\n    }\n\n    return res.LoadBalancers.map((item: any) => {\n      const label = `${item.LoadBalancerId}<${item.LoadBalancerName}}>`;\n      return {\n        label: label,\n        value: item.LoadBalancerId\n      };\n    });\n  }\n\n  async onGetListenerList(data: any) {\n    if (!this.accessId) {\n      throw new Error(\"请先选择Access授权\");\n    }\n    if (!this.regionId) {\n      throw new Error(\"请先选择地区\");\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const client = await this.getLBClient(access, this.regionId);\n\n    const params: any = {\n      MaxResults: 100\n    };\n    if (this.loadBalancers && this.loadBalancers.length > 0) {\n      params.LoadBalancerIds = this.loadBalancers;\n    }\n    const res = await client.request(\"ListListeners\", params);\n    this.checkRet(res);\n    if (!res?.Listeners || res?.Listeners.length === 0) {\n      throw new Error(\"没有找到HTTPS监听器\");\n    }\n\n    return res.Listeners.map((item: any) => {\n      const label = `${item.ListenerId}<${item.ListenerDescription}@${item.LoadBalancerId}>`;\n      return {\n        label: label,\n        value: item.ListenerId,\n        lbid: item.LoadBalancerId\n      };\n    });\n  }\n\n\n  checkRet(ret: any) {\n    if (ret.Code != null) {\n      throw new Error(ret.Message);\n    }\n  }\n\n\n}\n\nnew AliyunDeployCertToALB();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { AliyunAccess, AliyunClient, AliyunSslClient, createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from '@certd/plugin-lib';\nimport { optionsUtils } from '@certd/basic/dist/utils/util.options.js';\nimport { CertApplyPluginNames, CertReader } from \"@certd/plugin-cert\";\n@IsTaskPlugin({\n  name: 'DeployCertToAliyunCDN',\n  title: '阿里云-部署证书至CDN',\n  icon: 'svg:icon-aliyun',\n  group: pluginGroups.aliyun.key,\n  desc: '自动部署域名证书至阿里云CDN',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class DeployCertToAliyunCDN extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '证书服务接入点',\n    helper: '不会选就按默认',\n    value: 'cas.aliyuncs.com',\n    component: {\n      name: 'a-select',\n      options: [\n        { value: 'cas.aliyuncs.com', label: '中国大陆' },\n        { value: 'cas.ap-southeast-1.aliyuncs.com', label: '新加坡' },\n        { value: 'cas.eu-central-1.aliyuncs.com', label: '德国（法兰克福）' },\n      ],\n    },\n    required: true,\n  })\n  endpoint!: string;\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames, 'uploadCertToAliyun'],\n    },\n    template:false,\n    required: true,\n  })\n  cert!: string;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '阿里云授权AccessKeyId、AccessKeySecret',\n    component: {\n      name: 'access-selector',\n      type: 'aliyun',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: 'CDN加速域名',\n      helper: '你在阿里云上配置的CDN加速域名，比如:certd.docmirror.cn',\n      typeName: 'DeployCertToAliyunCDN',\n      action: DeployCertToAliyunCDN.prototype.onGetDomainList.name,\n      watches: ['certDomains', 'accessId'],\n      required: true,\n    })\n  )\n  domainName!: string | string[];\n\n  @TaskInput({\n    title: '证书所在地域',\n    helper: 'cn-hangzhou和ap-southeast-1，默认cn-hangzhou。国际站用户建议使用ap-southeast-1。',\n    value:\"cn-hangzhou\",\n    component: {\n      name: 'a-select',\n      options:[\n        {value:'cn-hangzhou',label:'中国大陆'},\n        {value:'ap-southeast-1',label:'新加坡'}\n      ]\n    },\n    required: true,\n  })\n  certRegion:string\n\n  @TaskInput({\n    title: '证书名称',\n    helper: '上传后将以此名称作为前缀备注',\n  })\n  certName!: string;\n\n\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    this.logger.info('开始部署证书到阿里云cdn');\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const sslClient = new AliyunSslClient({\n      access,\n      logger: this.logger,\n      endpoint: this.endpoint || 'cas.aliyuncs.com',\n    });\n\n    if(this.cert == null){\n      throw new Error('域名证书参数为空，请检查前置任务')\n    }\n\n    let certId: any = this.cert;\n\n    let certName =  this.appendTimeSuffix(this.certName);\n\n    if (typeof this.cert === 'object') {\n      // @ts-ignore\n      const certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt))\n      certId = await sslClient.uploadCert({\n        name:certName,\n        cert: this.cert,\n      });\n    }\n\n    const client = await this.getClient(access);\n\n    if (typeof this.domainName === 'string') {\n      this.domainName = [this.domainName];\n    }\n    for (const domain of this.domainName) {\n      await this.SetCdnDomainSSLCertificate(client, {\n        CertId: certId,\n        DomainName: domain,\n        CertName: certName,\n        CertRegion:this.certRegion || 'cn-hangzhou',\n      });\n    }\n\n    this.logger.info('部署完成');\n  }\n\n  async getClient(access: AliyunAccess) {\n    const client = new AliyunClient({ logger: this.logger });\n    await client.init({\n      accessKeyId: access.accessKeyId,\n      accessKeySecret: access.accessKeySecret,\n      endpoint: 'https://cdn.aliyuncs.com',\n      apiVersion: '2018-05-10',\n    });\n    return client;\n  }\n\n  async SetCdnDomainSSLCertificate(client: any, params: { CertId: number; DomainName: string,CertName:string,CertRegion:string }) {\n    const requestOption = {\n      method: 'POST',\n      formatParams: false,\n    };\n\n    const ret: any = await client.request(\n      'SetCdnDomainSSLCertificate',\n      {\n        SSLProtocol: 'on',\n        CertType:\"cas\",\n        ...params,\n      },\n      requestOption\n    );\n    this.checkRet(ret);\n    this.logger.info(`设置CDN: ${params.DomainName} 证书成功:`, ret.RequestId);\n  }\n\n  checkRet(ret: any) {\n    if (ret.Code != null) {\n      throw new Error('执行失败：' + ret.Message);\n    }\n  }\n\n  async onGetDomainList(data: any) {\n    if (!this.accessId) {\n      throw new Error('请选择Access授权');\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n\n    const client = await this.getClient(access);\n\n    const params = {\n      // 'DomainName': 'aaa',\n      PageSize: 500,\n    };\n\n    const requestOption = {\n      method: 'POST',\n      formatParams: false,\n    };\n\n    const res = await client.request('DescribeUserDomains', params, requestOption);\n    this.checkRet(res);\n    const pageData = res?.Domains?.PageData;\n    if (!pageData || pageData.length === 0) {\n      throw new Error('找不到CDN域名，您可以手动输入');\n    }\n    const options = pageData.map((item: any) => {\n      return {\n        value: item.DomainName,\n        label: item.DomainName,\n        domain: item.DomainName,\n      };\n    });\n    return optionsUtils.buildGroupOptions(options, this.certDomains);\n  }\n}\nnew DeployCertToAliyunCDN();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-dcdn/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport dayjs from 'dayjs';\nimport {\n  AliyunAccess,\n  AliyunClient,\n  createCertDomainGetterInputDefine,\n  createRemoteSelectInputDefine\n} from \"@certd/plugin-lib\";\nimport { CertInfo } from '@certd/plugin-cert';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\nimport { optionsUtils } from \"@certd/basic/dist/utils/util.options.js\";\n@IsTaskPlugin({\n  name: 'DeployCertToAliyunDCDN',\n  title: '阿里云-部署证书至DCDN',\n  icon: 'svg:icon-aliyun',\n  group: pluginGroups.aliyun.key,\n  desc: '依赖证书申请前置任务，自动部署域名证书至阿里云DCDN',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class DeployCertToAliyunDCDN extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames, 'uploadCertToAliyun'],\n    },\n    required: true,\n  })\n  cert!: CertInfo | number;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '阿里云授权AccessKeyId、AccessKeySecret',\n    component: {\n      name: 'access-selector',\n      type: 'aliyun',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n\n  @TaskInput({\n    title: '证书名称',\n    helper: '上传后将以此名称作为前缀备注',\n  })\n  certName!: string;\n\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: 'DCDN加速域名',\n      helper: '你在阿里云上配置的DCDN加速域名，比如:certd.docmirror.cn',\n      action: DeployCertToAliyunDCDN.prototype.onGetDomainList.name,\n      watches: ['certDomains', 'accessId'],\n      required: true,\n    })\n  )\n  domainName!: string | string[];\n\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    this.logger.info('开始部署证书到阿里云DCDN');\n    if(!this.domainName){\n      throw new Error('您还未选择DCDN域名');\n    }\n    const access = (await this.getAccess(this.accessId)) as AliyunAccess;\n    const client = await this.getClient(access);\n    if(typeof this.domainName  === 'string'){\n      this.domainName = [this.domainName];\n    }\n    for (const domainName of this.domainName ) {\n      this.logger.info(`[${this.domainName}]开始部署`)\n      const params = await this.buildParams(domainName);\n      await this.doRequest(client, params);\n      this.logger.info(`[${this.domainName}]部署成功`)\n    }\n\n    this.logger.info('部署完成');\n  }\n\n  async getClient(access: AliyunAccess) {\n    const client = new AliyunClient({ logger: this.logger });\n    await client.init({\n      accessKeyId: access.accessKeyId,\n      accessKeySecret: access.accessKeySecret,\n      endpoint: 'https://dcdn.aliyuncs.com',\n      apiVersion: '2018-01-15',\n    });\n    return client;\n  }\n\n  async buildParams(domainName:string) {\n    const CertName = (this.certName ?? 'certd') + '-' + dayjs().format('YYYYMMDDHHmmss');\n\n    if (typeof this.cert !== 'object') {\n      const certId = this.cert;\n      this.logger.info('使用已上传的证书:', certId);\n      return {\n        DomainName: domainName,\n        SSLProtocol: 'on',\n        CertType: 'cas',\n        CertName: CertName,\n        CertId: certId,\n      };\n    }\n\n    this.logger.info('上传证书:', CertName);\n    const cert: any = this.cert;\n    return {\n      DomainName: domainName,\n      SSLProtocol: 'on',\n      CertName: CertName,\n      CertType: 'upload',\n      SSLPub: cert.crt,\n      SSLPri: cert.key,\n    };\n  }\n\n  async doRequest(client: any, params: any) {\n    const requestOption = {\n      method: 'POST',\n      formatParams: false,\n    };\n    const ret: any = await client.request('SetDcdnDomainSSLCertificate', params, requestOption);\n    this.checkRet(ret);\n    this.logger.info('设置Dcdn证书成功:', ret.RequestId);\n  }\n\n  checkRet(ret: any) {\n    if (ret.Code != null) {\n      throw new Error('执行失败：' + ret.Message);\n    }\n  }\n\n\n  async onGetDomainList(data: any) {\n    if (!this.accessId) {\n      throw new Error('请选择Access授权');\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n\n    const client = await this.getClient(access);\n\n    const params = {\n      // 'DomainName': 'aaa',\n      PageSize: 500,\n    };\n\n    const requestOption = {\n      method: 'POST',\n      formatParams: false,\n    };\n\n    const res = await client.request('DescribeDcdnUserDomains', params, requestOption);\n    this.checkRet(res);\n    const pageData = res?.Domains?.PageData;\n    if (!pageData || pageData.length === 0) {\n      throw new Error('找不到CDN域名，您可以手动输入');\n    }\n    const options = pageData.map((item: any) => {\n      return {\n        value: item.DomainName,\n        label: item.DomainName,\n        domain: item.DomainName,\n      };\n    });\n    return optionsUtils.buildGroupOptions(options, this.certDomains);\n  }\n}\nnew DeployCertToAliyunDCDN();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-esa/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo, CertReader } from \"@certd/plugin-cert\";\nimport {\n  AliyunAccess, AliyunClientV2,\n  AliyunSslClient,\n  createCertDomainGetterInputDefine,\n  createRemoteSelectInputDefine\n} from \"@certd/plugin-lib\";\n\n@IsTaskPlugin({\n  name: \"AliyunDeployCertToESA\",\n  title: \"阿里云-部署至ESA\",\n  icon: \"svg:icon-aliyun\",\n  group: pluginGroups.aliyun.key,\n  desc: \"部署证书到阿里云ESA(边缘安全加速)\",\n  needPlus: false,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\nexport class AliyunDeployCertToESA extends AbstractTaskPlugin {\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择证书申请任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames]\n    },\n    required: true\n  })\n  cert!: CertInfo;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  @TaskInput({\n    title: \"大区\",\n    value: \"cn-hangzhou\",\n    component: {\n      name: \"a-auto-complete\",\n      vModel: \"value\",\n      options: [\n        { value: \"cn-hangzhou\", label: \"华东1（杭州）\" },\n        { value: \"ap-southeast-1\", label: \"新加坡\" }\n      ]\n    },\n    required: true\n  })\n  regionId!: string;\n\n  @TaskInput({\n    title: \"证书接入点\",\n    helper: \"不会选就保持默认即可\",\n    value: \"cas.aliyuncs.com\",\n    component: {\n      name: \"a-select\",\n      options: [\n        { value: \"cas.aliyuncs.com\", label: \"中国大陆\" },\n        { value: \"cas.ap-southeast-1.aliyuncs.com\", label: \"新加坡\" },\n        { value: \"cas.eu-central-1.aliyuncs.com\", label: \"德国（法兰克福）\" }\n      ]\n    },\n    required: true\n  })\n  casEndpoint!: string;\n\n\n  @TaskInput({\n    title: \"Access授权\",\n    helper: \"阿里云授权AccessKeyId、AccessKeySecret\",\n    component: {\n      name: \"access-selector\",\n      type: \"aliyun\"\n    },\n    required: true\n  })\n  accessId!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"站点\",\n      helper: \"请选择要部署证书的站点\",\n      action: AliyunDeployCertToESA.prototype.onGetSiteList.name,\n      watches: [\"accessId\", \"regionId\"]\n    })\n  )\n  siteIds!: string[];\n\n\n  async onInstance() {\n  }\n\n  async getAliyunCertId(access: AliyunAccess) {\n    let certId: any = this.cert;\n    let certName: any = this.appendTimeSuffix(\"certd\");\n    if (typeof this.cert === \"object\") {\n      const sslClient = new AliyunSslClient({\n        access,\n        logger: this.logger,\n        endpoint: this.casEndpoint\n      });\n\n      certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt));\n\n      certId = await sslClient.uploadCert({\n        name: certName,\n        cert: this.cert\n      });\n      this.logger.info(\"上传证书成功\", certId, certName);\n    }\n    return {\n      certId,\n      certName\n    };\n  }\n\n  async execute(): Promise<void> {\n    this.logger.info(\"开始部署证书到阿里云\");\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n\n    const client = await this.getClient(access);\n\n    const { certId, certName } = await this.getAliyunCertId(access);\n\n    for (const siteId of this.siteIds) {\n      try {\n        const res = await client.doRequest({\n          // 接口名称\n          action: \"SetCertificate\",\n          // 接口版本\n          version: \"2024-09-10\",\n          data: {\n             body:{\n               SiteId: siteId,\n               CasId: certId,\n               Type: \"cas\",\n               Name: certName\n             }\n          }\n        });\n        this.logger.info(`部署站点[${siteId}]证书成功：${JSON.stringify(res)}`);\n\n      } catch (e) {\n        if (e.message.includes(\"Certificate.Duplicated\")) {\n          this.logger.info(`站点[${siteId}]证书已存在,无需重复部署`);\n        }else{\n          throw e;\n        }\n      }\n\n      try{\n        await this.clearSiteCert(client,siteId);\n      }catch (e) {\n        this.logger.error(\"清理站点[${siteId}]证书失败\",e)\n      }\n\n    }\n  }\n\n  async getClient(access: AliyunAccess) {\n    const endpoint = `esa.${this.regionId}.aliyuncs.com`;\n    return access.getClient(endpoint);\n  }\n\n  async onGetSiteList(data: any) {\n    if (!this.accessId) {\n      throw new Error(\"请选择Access授权\");\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n\n    const client = await this.getClient(access);\n    const res = await client.doRequest({\n      action: \"ListSites\",\n      version: \"2024-09-10\",\n      method: \"GET\",\n      data: {}\n    });\n\n    const list = res?.Sites;\n    if (!list || list.length === 0) {\n      throw new Error(\"没有找到站点，请先创建站点\");\n    }\n\n    const options = list.map((item: any) => {\n      return {\n        label: item.SiteName,\n        value: item.SiteId,\n        domain: item.SiteName\n      };\n    });\n    return this.ctx.utils.options.buildGroupOptions(options, this.certDomains);\n  }\n\n  async clearSiteCert(client: AliyunClientV2, siteId: string) {\n    this.logger.info(`开始清理站点[${siteId}]过期证书`);\n    const certListRes = await client.doRequest({\n      action: \"ListCertificates\",\n      version: \"2024-09-10\",\n      method: \"GET\",\n      data:{\n        query: {\n          SiteId: siteId\n        }\n      }\n    });\n\n    const list = certListRes.Result;\n    for (const item of list) {\n      this.logger.info(`证书${item.Name}状态：${item.Status}`);\n      if (item.Status === \"Expired\") {\n        this.logger.info(`证书${item.Name}已过期，执行删除`);\n        await client.doRequest({\n          action: \"DeleteCertificate\",\n          version: \"2024-09-10\",\n          // 接口 HTTP 方法\n          method: \"GET\",\n           data:{\n             query: {\n               SiteId: siteId,\n               Id: item.id\n             }\n           }\n        });\n        this.logger.info(`证书${item.Name}已删除`);\n      }\n    }\n  }\n}\n\nnew AliyunDeployCertToESA();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-fc/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo, CertReader } from \"@certd/plugin-cert\";\nimport { AliyunAccess, createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\n\n@IsTaskPlugin({\n  name: 'AliyunDeployCertToFC',\n  title: '阿里云-部署至阿里云FC(3.0)',\n  icon: 'svg:icon-aliyun',\n  group: pluginGroups.aliyun.key,\n  desc: '部署证书到阿里云函数计算（FC3.0）,【注意】证书的加密算法必须选择【pkcs1旧版】',\n  needPlus: false,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class AliyunDeployCertToFC extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择证书申请任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  @TaskInput({\n    title: 'FC大区',\n    value: 'cn-hangzhou',\n    component: {\n      name: 'a-auto-complete',\n      vModel: 'value',\n      options: [\n        { value: 'cn-qingdao', label: '华北1（青岛）' },\n        { value: 'cn-beijing', label: '华北2（北京）' },\n        { value: 'cn-zhangjiakou', label: '华北 3（张家口）' },\n        { value: 'cn-huhehaote', label: '华北5（呼和浩特）' },\n        { value: 'cn-hangzhou', label: '华东1（杭州）' },\n        { value: 'cn-shanghai', label: '华东2（上海）' },\n        { value: 'cn-shenzhen', label: '华南1（深圳）' },\n        { value: 'ap-southeast-2', label: '澳大利亚（悉尼）' },\n        { value: 'eu-central-1', label: '德国（法兰克福）' },\n        { value: 'ap-southeast-3', label: '马来西亚（吉隆坡）' },\n        { value: 'us-east-1', label: '美国（弗吉尼亚）' },\n        { value: 'us-west-1', label: '美国（硅谷）' },\n        { value: 'ap-northeast-1', label: '日本（东京）' },\n        { value: 'ap-southeast-7', label: '泰国（曼谷）' },\n        { value: 'cn-chengdu', label: '西南1（成都）' },\n        { value: 'ap-southeast-1', label: '新加坡' },\n        { value: 'ap-south-1', label: '印度（孟买）' },\n        { value: 'ap-southeast-5', label: '印度尼西亚（雅加达）' },\n        { value: 'eu-west-1', label: '英国（伦敦）' },\n        { value: 'cn-hongkong', label: '中国香港' },\n      ],\n    },\n    required: true,\n  })\n  regionId!: string;\n\n\n  @TaskInput({\n    title: '阿里云账号id',\n    helper: '阿里云主账号ID，右上角头像下方获取',\n    component: {\n      name: 'a-input',\n      vModel:\"value\"\n    },\n    required: true,\n  })\n  accountId!: string;\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '阿里云授权AccessKeyId、AccessKeySecret',\n    component: {\n      name: 'access-selector',\n      type: 'aliyun',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: 'FC域名',\n      helper: \"请选择要部署证书的域名\\n【注意】证书的加密算法必须选择【pkcs1旧版】（否则会报'private key' has to be in PEM format错误）\",\n      typeName: 'AliyunDeployCertToFC',\n      action: AliyunDeployCertToFC.prototype.onGetDomainList.name,\n      watches: ['accessId', 'regionId'],\n    })\n  )\n  fcDomains!: string[];\n\n  @TaskInput({\n    title: '域名支持的协议类型',\n    component: {\n      name: 'a-select',\n      value: '',\n      options: [\n        { value: '', label: '保持原样（适用于原来已经开启了HTTPS）' },\n        { value: 'HTTPS', label: '仅HTTPS' },\n        { value: 'HTTP,HTTPS', label: 'HTTP与HTTPS同时支持' },\n      ],\n    },\n  })\n  protocol!: string;\n\n  async onInstance() {}\n\n  async execute(): Promise<void> {\n    this.logger.info('开始部署证书到阿里云');\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n\n    const client = await this.getClient(access);\n\n    const $Util = await import('@alicloud/tea-util');\n    const $OpenApi = await import('@alicloud/openapi-client');\n    for (const domainName of this.fcDomains) {\n      const params = new $OpenApi.Params({\n        // 接口名称\n        action: 'UpdateCustomDomain',\n        // 接口版本\n        version: '2023-03-30',\n        // 接口协议\n        protocol: 'HTTPS',\n        // 接口 HTTP 方法\n        method: 'PUT',\n        authType: 'AK',\n        style: 'FC',\n        // 接口 PATH\n        pathname: `/2023-03-30/custom-domains/${domainName}`,\n        // 接口请求体内容格式\n        reqBodyType: 'json',\n        // 接口响应体内容格式\n        bodyType: 'json',\n      });\n      // body params\n      const certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt))\n\n      const body: { [key: string]: any } = {\n        certConfig: {\n          certName: certName,\n          certificate: this.cert.crt,\n          privateKey: this.cert.key,\n        },\n      };\n      if (this.protocol) {\n        body.protocol = this.protocol;\n      }\n\n      const runtime = new $Util.RuntimeOptions({});\n      const request = new $OpenApi.OpenApiRequest({ body });\n      // 复制代码运行请自行打印 API 的返回值\n      // 返回值实际为 Map 类型，可从 Map 中获得三类数据：响应体 body、响应头 headers、HTTP 返回的状态码 statusCode。\n      await client.callApi(params, request, runtime);\n      this.logger.info(`部署[${domainName}]成功`);\n    }\n  }\n\n  async getClient(access: AliyunAccess) {\n    const $OpenApi = await import('@alicloud/openapi-client');\n    const config = new $OpenApi.Config({\n      accessKeyId: access.accessKeyId,\n      accessKeySecret: access.accessKeySecret,\n    });\n    // Endpoint 请参考 https://api.aliyun.com/product/FC\n    config.endpoint = `${this.accountId}.${this.regionId}.fc.aliyuncs.com`;\n    return new $OpenApi.default.default(config);\n  }\n\n  async onGetDomainList(data: any) {\n    if (!this.accessId) {\n      throw new Error('请选择Access授权');\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const client = await this.getClient(access);\n\n    const $OpenApi = await import('@alicloud/openapi-client');\n    const $Util = await import('@alicloud/tea-util');\n    const params = new $OpenApi.Params({\n      // 接口名称\n      action: 'ListCustomDomains',\n      // 接口版本\n      version: '2023-03-30',\n      // 接口协议\n      protocol: 'HTTPS',\n      // 接口 HTTP 方法\n      method: 'GET',\n      authType: 'AK',\n      style: 'FC',\n      // 接口 PATH\n      pathname: `/2023-03-30/custom-domains`,\n      // 接口请求体内容格式\n      reqBodyType: 'json',\n      // 接口响应体内容格式\n      bodyType: 'json',\n    });\n\n    const runtime = new $Util.RuntimeOptions({});\n    const request = new $OpenApi.OpenApiRequest({});\n    // 复制代码运行请自行打印 API 的返回值\n    // 返回值实际为 Map 类型，可从 Map 中获得三类数据：响应体 body、响应头 headers、HTTP 返回的状态码 statusCode。\n    const res = await client.callApi(params, request, runtime);\n\n    const list = res?.body?.customDomains;\n    if (!list || list.length === 0) {\n      throw new Error('没有找到FC域名，请先创建FC域名');\n    }\n\n    const options = list.map((item: any) => {\n      return {\n        label: item.domainName,\n        value: item.domainName,\n        title: item.domainName,\n        domain: item.domainName,\n      };\n    });\n    return this.ctx.utils.options.buildGroupOptions(options, this.certDomains);\n  }\n}\n\nnew AliyunDeployCertToFC();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-nlb/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { CertInfo, CertReader } from \"@certd/plugin-cert\";\nimport {\n  AliyunAccess,\n  AliyunClient,\n  AliyunClientV2,\n  AliyunSslClient,\n  createCertDomainGetterInputDefine,\n  createRemoteSelectInputDefine\n} from \"@certd/plugin-lib\";\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'AliyunDeployCertToNLB',\n  title: '阿里云-部署至NLB（网络负载均衡）',\n  icon: 'svg:icon-aliyun',\n  group: pluginGroups.aliyun.key,\n  desc: 'NLB,网络负载均衡,更新监听器的默认证书',\n  needPlus: false,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class AliyunDeployCertToNLB extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择证书申请任务输出的域名证书\\n或者选择前置任务“上传证书到阿里云”任务的证书ID，可以减少上传到阿里云的证书数量',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames, 'uploadCertToAliyun'],\n    },\n    required: true,\n  })\n  cert!: CertInfo | number;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n\n  @TaskInput({\n    title: '证书接入点',\n    helper: '不会选就保持默认即可',\n    value: 'cas.aliyuncs.com',\n    component: {\n      name: 'a-select',\n      options: [\n        { value: 'cas.aliyuncs.com', label: '中国大陆' },\n        { value: 'cas.ap-southeast-1.aliyuncs.com', label: '新加坡' },\n        { value: 'cas.eu-central-1.aliyuncs.com', label: '德国（法兰克福）' },\n      ],\n    },\n    required: true,\n  })\n  casEndpoint!: string;\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '阿里云授权AccessKeyId、AccessKeySecret',\n    component: {\n      name: 'access-selector',\n      type: 'aliyun',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: 'NLB所在地区',\n      typeName: 'AliyunDeployCertToNLB',\n      multi: false,\n      action: AliyunDeployCertToNLB.prototype.onGetRegionList.name,\n      watches: ['accessId'],\n    })\n  )\n  regionId: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: '负载均衡列表',\n      helper: '要部署证书的负载均衡ID',\n      typeName: 'AliyunDeployCertToNLB',\n      action: AliyunDeployCertToNLB.prototype.onGetLoadBalanceList.name,\n      watches: ['regionId'],\n    })\n  )\n  loadBalancers!: string[];\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: '监听器列表',\n      helper: '要部署证书的监听器列表',\n      typeName: 'AliyunDeployCertToNLB',\n      action: AliyunDeployCertToNLB.prototype.onGetListenerList.name,\n      watches: ['loadBalancers'],\n    })\n  )\n  listeners!: string[];\n\n\n\n\n  @TaskInput({\n      title: \"部署证书类型\",\n      value: \"default\",\n      component: {\n        name: \"a-select\",\n        vModel: \"value\",\n        options: [\n          {\n            label: \"默认证书\",\n            value: \"default\"\n          },\n          {\n            label: \"扩展证书\",\n            value: \"extension\"\n          }\n        ]\n      },\n      required: true\n    }\n  )\n  deployType: string = \"default\";\n\n  async onInstance() {}\n\n  async getLBClient(access: AliyunAccess, region: string) {\n    const client = new AliyunClient({ logger: this.logger });\n\n    const version = '2022-04-30';\n    await client.init({\n      accessKeyId: access.accessKeyId,\n      accessKeySecret: access.accessKeySecret,\n      //https://wafopenapi.cn-hangzhou.aliyuncs.com\n      endpoint: `https://nlb.${region}.aliyuncs.com`,\n      apiVersion: version,\n    });\n    return client;\n  }\n\n  async execute(): Promise<void> {\n    this.logger.info(`开始部署证书到阿里云(nlb)`);\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const certId = await this.getAliyunCertId(access);\n    const nlbClientV2 = this.getNLBClientV2(access);\n    if (this.deployType === \"extension\") {\n      //部署扩展证书\n      await this.deployExtensionCert(nlbClientV2, certId);\n    } else {\n      const client = await this.getLBClient(access, this.regionId);\n      await this.deployDefaultCert(certId, client);\n    }\n\n    await this.ctx.utils.sleep(10000)\n    for (const listener of this.listeners) {\n      await this.clearInvalidCert(nlbClientV2, listener);\n    }\n\n    this.logger.info('执行完成');\n  }\n\n  async deployExtensionCert(client: AliyunClientV2, certId: any) {\n    for (const listenerId of this.listeners) {\n      this.logger.info(`开始部署监听器${listenerId}的扩展证书`);\n      await client.doRequest({\n        // 接口名称\n        action: \"AssociateAdditionalCertificatesWithListener\",\n        // 接口版本\n        version: \"2022-04-30\",\n        data: {\n          body: {\n            ListenerId: listenerId,\n            RegionId: this.regionId,\n            \"AdditionalCertificateIds.1\":  certId\n          }\n        }\n      });\n\n      this.logger.info(`部署监听器${listenerId}的扩展证书成功`);\n    }\n  }\n\n\n  async deployDefaultCert(certId: any, client: AliyunClient) {\n    for (const listener of this.listeners) {\n      //查询原来的证书\n      const params: any = {\n        RegionId: this.regionId,\n        ListenerId: listener,\n        CertificateIds:[certId], //旧sdk\n      };\n\n      const res = await client.request('UpdateListenerAttribute', params);\n      this.checkRet(res);\n      this.logger.info(`部署${listener}监听器证书成功`, JSON.stringify(res));\n    }\n  }\n\n\n  getNLBClientV2(access: AliyunAccess) {\n    return access.getClient(`nlb.${this.regionId}.aliyuncs.com`);\n  }\n\n  async clearInvalidCert(client: AliyunClientV2, listener: string) {\n    this.logger.info(`开始清理监听器${listener}的过期证书`);\n    const req = {\n      // 接口名称\n      action: \"ListListenerCertificates\",\n      // 接口版本\n      version: \"2022-04-30\",\n      data: {\n        body: {\n          ListenerId: listener,\n          RegionId: this.regionId\n        }\n      }\n    };\n    const res = await client.doRequest(req);\n    const list = res.Certificates;\n    if (list.length === 0) {\n      this.logger.info(`监听器${listener}没有绑定证书`);\n      return\n    }\n\n    const sslClient = new AliyunSslClient({\n      access: client.access,\n      logger: this.logger,\n      endpoint: this.casEndpoint\n    });\n\n\n    const certIds = [];\n    for (const item of list) {\n      if (item.Status !== \"Associated\") {\n        continue;\n      }\n      if (item.IsDefault) {\n        continue;\n      }\n      certIds.push( parseInt(item.CertificateId));\n    }\n    //检查是否过期，过期则删除\n    const invalidCertIds = [];\n    for (const certId of certIds) {\n      const res = await sslClient.getCertInfo(certId);\n      if (res.notAfter < new Date().getTime()) {\n        invalidCertIds.push(certId);\n      }\n    }\n    if (invalidCertIds.length === 0) {\n      this.logger.info(`监听器${listener}没有过期的证书`);\n      return\n    }\n    this.logger.info(`开始解绑过期的证书:${invalidCertIds}`);\n\n    const ids:any = {}\n    let i = 0\n    for (const certId of invalidCertIds) {\n      i++\n      ids[`AdditionalCertificateIds.${i}`] = certId;\n    }\n    await client.doRequest({\n      // 接口名称\n      action: \"DissociateAdditionalCertificatesFromListener\",\n      // 接口版本\n      version: \"2022-04-30\",\n      data: {\n        body: {\n          ListenerId: listener,\n          RegionId: this.regionId,\n          ...ids\n        }\n      }\n    });\n    this.logger.info(`解绑过期证书成功`);\n  }\n\n  async getAliyunCertId(access: AliyunAccess) {\n    let certId: any = this.cert;\n    if (typeof this.cert === 'object') {\n      const sslClient = new AliyunSslClient({\n        access,\n        logger: this.logger,\n        endpoint: this.casEndpoint,\n      });\n\n      const certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt))\n\n      certId = await sslClient.uploadCert({\n        name: certName,\n        cert: this.cert,\n      });\n    }\n    return certId;\n  }\n\n  async onGetRegionList(data: any) {\n    if (!this.accessId) {\n      throw new Error('请选择Access授权');\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const client = await this.getLBClient(access, 'cn-shanghai');\n\n    const res = await client.request('DescribeRegions', {});\n    this.checkRet(res);\n    if (!res?.Regions || res?.Regions.length === 0) {\n      throw new Error('没有找到Regions列表');\n    }\n\n    return res.Regions.map((item: any) => {\n      return {\n        label: item.LocalName,\n        value: item.RegionId,\n        endpoint: item.RegionEndpoint,\n      };\n    });\n  }\n\n  async onGetLoadBalanceList(data: any) {\n    if (!this.accessId) {\n      throw new Error('请先选择Access授权');\n    }\n    if (!this.regionId) {\n      throw new Error('请先选择地区');\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const client = await this.getLBClient(access, this.regionId);\n\n    const params = {\n      MaxResults: 100,\n    };\n    const res = await client.request('ListLoadBalancers', params);\n    this.checkRet(res);\n    if (!res?.LoadBalancers || res?.LoadBalancers.length === 0) {\n      throw new Error('没有找到LoadBalancers');\n    }\n\n    return res.LoadBalancers.map((item: any) => {\n      const label = `${item.LoadBalancerId}<${item.LoadBalancerName}}>`;\n      return {\n        label: label,\n        value: item.LoadBalancerId,\n      };\n    });\n  }\n\n  async onGetListenerList(data: any) {\n    if (!this.accessId) {\n      throw new Error('请先选择Access授权');\n    }\n    if (!this.regionId) {\n      throw new Error('请先选择地区');\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const client = await this.getLBClient(access, this.regionId);\n\n    const params: any = {\n      MaxResults: 100,\n    };\n    if (this.loadBalancers && this.loadBalancers.length > 0) {\n      params.LoadBalancerIds = this.loadBalancers;\n    }\n    const res = await client.request('ListListeners', params);\n    this.checkRet(res);\n    if (!res?.Listeners || res?.Listeners.length === 0) {\n      throw new Error('没有找到TCPSSL监听器');\n    }\n\n    return res.Listeners.map((item: any) => {\n      const label = `${item.ListenerId}<${item.ListenerDescription}@${item.LoadBalancerId}>`;\n      return {\n        label: label,\n        value: item.ListenerId,\n        lbid: item.LoadBalancerId,\n      };\n    });\n  }\n\n  checkRet(ret: any) {\n    if (ret.Code != null) {\n      throw new Error(ret.Message);\n    }\n  }\n}\n\nnew AliyunDeployCertToNLB();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-oss/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport {AliyunAccess, AliyunSslClient} from '@certd/plugin-lib';\nimport {CertInfo, CertReader} from '@certd/plugin-cert';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'DeployCertToAliyunOSS',\n  title: '阿里云-部署证书至OSS',\n  icon: 'svg:icon-aliyun',\n  group: pluginGroups.aliyun.key,\n  desc: '部署域名证书至阿里云OSS自定义域名，不是上传到阿里云oss',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class DeployCertToAliyunOSS extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '大区',\n    component: {\n      name: 'a-auto-complete',\n      vModel: 'value',\n      options: [\n        { value: 'oss-cn-hangzhou', label: '华东1（杭州）' },\n        { value: 'oss-cn-shanghai', label: '华东2（上海）' },\n        { value: 'oss-cn-nanjing', label: '华东5（南京-本地地域）' },\n        { value: 'oss-cn-fuzhou', label: '华东6（福州-本地地域）' },\n        { value: 'oss-cn-wuhan-lr', label: '华中1（武汉-本地地域）' },\n        { value: 'oss-cn-qingdao', label: '华北1（青岛）' },\n        { value: 'oss-cn-beijing', label: '华北2（北京）' },\n        { value: 'oss-cn-zhangjiakou', label: '华北 3（张家口）' },\n        { value: 'oss-cn-huhehaote', label: '华北5（呼和浩特）' },\n        { value: 'oss-cn-wulanchabu', label: '华北6（乌兰察布）' },\n        { value: 'oss-cn-shenzhen', label: '华南1（深圳）' },\n        { value: 'oss-cn-heyuan', label: '华南2（河源）' },\n        { value: 'oss-cn-guangzhou', label: '华南3（广州）' },\n        { value: 'oss-cn-chengdu', label: '西南1（成都）' },\n        { value: 'oss-cn-hongkong', label: '中国香港' },\n        { value: 'oss-us-west-1', label: '美国（硅谷）①' },\n        { value: 'oss-us-east-1', label: '美国（弗吉尼亚）①' },\n        { value: 'oss-ap-northeast-1', label: '日本（东京）①' },\n        { value: 'oss-ap-northeast-2', label: '韩国（首尔）' },\n        { value: 'oss-ap-southeast-1', label: '新加坡①' },\n        { value: 'oss-ap-southeast-2', label: '澳大利亚（悉尼）①' },\n        { value: 'oss-ap-southeast-3', label: '马来西亚（吉隆坡）①' },\n        { value: 'oss-ap-southeast-5', label: '印度尼西亚（雅加达）①' },\n        { value: 'oss-ap-southeast-6', label: '菲律宾（马尼拉）' },\n        { value: 'oss-ap-southeast-7', label: '泰国（曼谷）' },\n        { value: 'oss-eu-central-1', label: '德国（法兰克福）①' },\n        { value: 'oss-eu-west-1', label: '英国（伦敦）' },\n        { value: 'oss-me-east-1', label: '阿联酋（迪拜）①' },\n        { value: 'oss-rg-china-mainland', label: '无地域属性（中国内地）' },\n      ],\n    },\n    required: true,\n  })\n  region!: string;\n\n  @TaskInput({\n    title: 'Bucket',\n    helper: '存储桶名称',\n    required: true,\n  })\n  bucket!: string;\n\n  @TaskInput({\n    title: '绑定的域名',\n    helper: '你在阿里云OSS上绑定的域名，比如:certd.docmirror.cn',\n    required: true,\n  })\n  domainName!: string;\n\n\n  @TaskInput({\n    title: '证书名称',\n    helper: '上传后将以此名称作为前缀备注',\n  })\n  certName!: string;\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames,\"uploadCertToAliyun\"],\n    },\n    required: true,\n  })\n  cert!: CertInfo | string;\n\n  @TaskInput({\n    title: '证书服务接入点',\n    helper: '不会选就按默认',\n    value: 'cas.aliyuncs.com',\n    component: {\n      name: 'a-select',\n      options: [\n        { value: 'cn-hangzhou', label: '中国大陆' },\n        { value: 'southeast-1', label: '新加坡' },\n        { value: 'eu-central-1', label: '德国（法兰克福）' },\n      ],\n    },\n    required: true,\n  })\n  casRegion!: string;\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '阿里云授权AccessKeyId、AccessKeySecret',\n    component: {\n      name: 'access-selector',\n      type: 'aliyun',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    this.logger.info('开始部署证书到阿里云OSS');\n    const access = (await this.getAccess(this.accessId)) as AliyunAccess;\n\n    await this.getAliyunCertId(access)\n    this.logger.info(`bucket: ${this.bucket}, region: ${this.region}, domainName: ${this.domainName}`);\n    const client = await this.getClient(access);\n    await this.doRequest(client, {});\n    this.logger.info('部署完成');\n  }\n\n  async getAliyunCertId(access: AliyunAccess) {\n    let certId: any = this.cert;\n    let certName: any = this.appendTimeSuffix(\"certd\");\n    if (typeof this.cert === \"object\") {\n      let endpoint = `cas.${this.casRegion}.aliyuncs.com`;\n      if (this.casRegion === \"cn-hangzhou\"){\n        endpoint = \"cas.aliyuncs.com\";\n      }\n      const sslClient = new AliyunSslClient({\n        access,\n        logger: this.logger,\n        endpoint: endpoint\n      });\n\n      certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt));\n\n      certId = await sslClient.uploadCert({\n        name: certName,\n        cert: this.cert\n      });\n      this.logger.info(\"上传证书成功\", certId, certName);\n    }\n    return {\n      certId,\n      certName\n    };\n  }\n\n  async getClient(access: AliyunAccess) {\n    // @ts-ignore\n    const OSS = await import('ali-oss');\n    return new OSS.default({\n      accessKeyId: access.accessKeyId,\n      accessKeySecret: access.accessKeySecret,\n      // yourRegion填写Bucket所在地域。以华东1（杭州）为例，Region填写为oss-cn-hangzhou。\n      region: this.region,\n      //@ts-ignore\n      authorizationV4: true,\n      // yourBucketName填写Bucket名称。\n      bucket: this.bucket,\n    });\n  }\n\n  async doRequest(client: any, params: any) {\n    params = client._bucketRequestParams('POST', this.bucket, {\n      cname: '',\n      comp: 'add',\n    });\n\n    let certStr =  \"\"\n    if (typeof this.cert === \"object\" ){\n      certStr = `\n      <PrivateKey>${this.cert.key}</PrivateKey>\n      <Certificate>${this.cert.crt}</Certificate>\n`\n    }else{\n      certStr = `<CertId>${this.cert}-${this.casRegion}</CertId>`\n    }\n\n    const xml = `\n <BucketCnameConfiguration>\n  <Cname>\n    <Domain>${this.domainName}</Domain>\n    <CertificateConfiguration>\n      ${certStr}\n      <Force>true</Force>\n    </CertificateConfiguration>\n  </Cname>\n</BucketCnameConfiguration>`;\n    params.content = xml;\n    params.mime = 'xml';\n    params.successStatuses = [200];\n    const res = await client.request(params);\n    this.checkRet(res);\n    return res;\n  }\n\n  checkRet(ret: any) {\n    if (ret.Code != null) {\n      throw new Error('执行失败：' + ret.Message);\n    }\n  }\n}\nnew DeployCertToAliyunOSS();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-slb/index.ts",
    "content": "import {AbstractTaskPlugin, IsTaskPlugin, PageSearch, pluginGroups, RunStrategy, TaskInput} from '@certd/pipeline';\nimport {CertInfo} from '@certd/plugin-cert';\nimport {\n  AliyunAccess,\n  AliyunClient,\n  AliyunSslClient,\n  CasCertInfo,\n  createCertDomainGetterInputDefine,\n  createRemoteSelectInputDefine\n} from '@certd/plugin-lib';\nimport {CertApplyPluginNames} from '@certd/plugin-cert';\n\n@IsTaskPlugin({\n  name: 'AliyunDeployCertToSLB',\n  title: '阿里云-部署至CLB(传统负载均衡)',\n  icon: 'svg:icon-aliyun',\n  group: pluginGroups.aliyun.key,\n  desc: '部署证书到阿里云CLB(传统负载均衡)',\n  needPlus: false,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class AliyunDeployCertToSLB extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择证书申请任务输出的域名证书\\n或者选择前置任务“上传证书到阿里云”任务的证书ID，可以减少上传到阿里云的证书数量',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames, 'uploadCertToAliyun'],\n    },\n    required: true,\n  })\n  cert!: CertInfo | number;\n\n  @TaskInput(createCertDomainGetterInputDefine({props: {required: false}}))\n  certDomains!: string[];\n\n\n  @TaskInput({\n    title: '证书接入点',\n    helper: '不会选就保持默认即可',\n    value: 'cas.aliyuncs.com',\n    component: {\n      name: 'a-select',\n      options: [\n        {value: 'cas.aliyuncs.com', label: '中国大陆'},\n        {value: 'cas.ap-southeast-1.aliyuncs.com', label: '新加坡'},\n        {value: 'cas.eu-central-1.aliyuncs.com', label: '德国（法兰克福）'},\n      ],\n    },\n    required: true,\n  })\n  casEndpoint!: string;\n\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '阿里云授权AccessKeyId、AccessKeySecret',\n    component: {\n      name: 'access-selector',\n      type: 'aliyun',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: 'LB所在地区',\n      multi: false,\n      action: AliyunDeployCertToSLB.prototype.onGetRegionList.name,\n      watches: ['accessId'],\n    })\n  )\n  regionId: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: '负载均衡列表',\n      helper: '要部署证书的负载均衡ID',\n      action: AliyunDeployCertToSLB.prototype.onGetLoadBalanceList.name,\n      watches: ['regionId'],\n    })\n  )\n  loadBalancers!: string[];\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: '监听器列表',\n      helper: '要部署证书的监听器列表',\n      action: AliyunDeployCertToSLB.prototype.onGetListenerList.name,\n      watches: ['loadBalancers'],\n    })\n  )\n  listeners!: string[];\n\n\n  @TaskInput({\n      title: \"部署默认证书\",\n      value: true,\n      component: {\n        name: \"a-switch\",\n        vModel: \"checked\"\n      }\n    }\n  )\n  deployDefault!: boolean;\n\n  @TaskInput({\n      title: \"部署扩展证书\",\n      value: false,\n      component: {\n        name: \"a-switch\",\n        vModel: \"checked\"\n      }\n    }\n  )\n  deployExtension!: boolean;\n\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: '扩展域名列表',\n      helper: '要部署扩展域名列表',\n      action: AliyunDeployCertToSLB.prototype.onGetExtensionDomainList.name,\n      watches: ['listeners','deployExtension'],\n      mergeScript:`\n        return {\n        show: ctx.compute(({form})=>{\n          return form.deployExtension;\n        })\n      }\n      `\n    })\n  )\n  extensionDomains!: string[];\n\n\n  async onInstance() {\n  }\n\n  async getLBClient(access: AliyunAccess, region: string) {\n    const client = new AliyunClient({logger: this.logger});\n    const version = '2014-05-15';\n    await client.init({\n      accessKeyId: access.accessKeyId,\n      accessKeySecret: access.accessKeySecret,\n      //https://wafopenapi.cn-hangzhou.aliyuncs.com\n      endpoint: `https://slb.${region}.aliyuncs.com`,\n      apiVersion: version,\n    });\n    return client;\n  }\n\n  async execute(): Promise<void> {\n    this.logger.info(`开始部署证书到阿里云(clb)`);\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n\n    const client = await this.getLBClient(access, this.regionId);\n    const aliyunCert = await this.getAliyunCertId(access);\n    const slbServerCertId = await this.uploadServerCert(client, aliyunCert);\n\n    if (this.deployDefault!==false) {\n      this.logger.info(\"部署监听器默认证书\")\n      for (const listener of this.listeners) {\n        const {port, loadBalanceId} = this.resolveListenerKey(listener)\n        const params = {\n          RegionId: this.regionId,\n          LoadBalancerId: loadBalanceId,\n          ListenerPort: port,\n          ServerCertificateId: slbServerCertId,\n        };\n\n        const res = await client.request('SetLoadBalancerHTTPSListenerAttribute', params);\n        this.checkRet(res);\n        this.logger.info(`部署${listener}监听器证书成功`, JSON.stringify(res));\n      }\n    }\n\n    if (this.deployExtension) {\n      this.logger.info(\"部署监听器扩展域名证书\")\n\n      const clientV2 = this.getCLBClientV2(access);\n      for (const domainStr of this.extensionDomains) {\n        const {extensionDomainId} = this.resolveListenerKey(domainStr)\n        const res = await clientV2.doRequest({\n          action: \"SetDomainExtensionAttribute\",\n          // 接口版本\n          version: \"2014-05-15\",\n          data: {\n            query: {\n              RegionId: this.regionId,\n              DomainExtensionId: extensionDomainId,\n              ServerCertificateId: slbServerCertId\n            }\n          }\n        })\n        this.logger.info(`部署扩展域名${extensionDomainId}证书成功`, JSON.stringify(res))\n      }\n    }\n    this.logger.info('执行完成');\n  }\n\n  getCLBClientV2(access: AliyunAccess) {\n    return access.getClient(\"slb.aliyuncs.com\")\n  }\n\n  resolveListenerKey(listener: string) {\n    const arr = listener.split('_');\n    const loadBalanceId = arr[0];\n    const protocol = arr[1];\n    const port = arr[2];\n    let extensionDomainId = undefined;\n    if (arr.length > 3) {\n      extensionDomainId = arr[3];\n    }\n\n    return {\n      loadBalanceId,\n      port: parseInt(port),\n      extensionDomainId: extensionDomainId,\n      protocol: protocol\n    }\n  }\n\n  async uploadServerCert(client: any, aliyunCert: CasCertInfo) {\n    const params = {\n      RegionId: this.regionId,\n      AliCloudCertificateId: aliyunCert.certId,\n      AliCloudCertificateName: aliyunCert.certName,\n      AliCloudCertificateRegionId: aliyunCert.casRegion\n    };\n\n    const res = await client.request('UploadServerCertificate', params);\n    this.checkRet(res);\n    this.logger.info('SLBServerCertificate创建成功', res.ServerCertificateId);\n    return res.ServerCertificateId;\n  }\n\n  async getAliyunCertId(access: AliyunAccess) {\n    let certId: any = this.cert;\n\n    const sslClient = new AliyunSslClient({\n      access,\n      logger: this.logger,\n      endpoint: this.casEndpoint,\n    });\n\n    if (typeof this.cert === 'object') {\n      const name = this.appendTimeSuffix('certd');\n      certId = await sslClient.uploadCert({\n        name: name,\n        cert: this.cert,\n      });\n    }\n\n    return await sslClient.getCertInfo(certId);\n  }\n\n  async onGetRegionList(data: any) {\n    if (!this.accessId) {\n      throw new Error('请选择Access授权');\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const client = await this.getLBClient(access, 'cn-shanghai');\n\n    const res = await client.request('DescribeRegions', {});\n    this.checkRet(res);\n    if (!res?.Regions?.Region || res?.Regions?.Region.length === 0) {\n      throw new Error('没有找到Regions列表');\n    }\n\n    return res.Regions.Region.map((item: any) => {\n      return {\n        label: item.LocalName,\n        value: item.RegionId,\n        endpoint: item.RegionEndpoint,\n      };\n    });\n  }\n\n  async onGetLoadBalanceList(data: any) {\n    if (!this.accessId) {\n      throw new Error('请先选择Access授权');\n    }\n    if (!this.regionId) {\n      throw new Error('请先选择地区');\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const client = await this.getLBClient(access, this.regionId);\n\n    const params = {\n      RegionId: this.regionId,\n      MaxResults: 100,\n    };\n    const res = await client.request('DescribeLoadBalancers', params);\n    this.checkRet(res);\n    if (!res?.LoadBalancers?.LoadBalancer || res?.LoadBalancers.LoadBalancer.length === 0) {\n      throw new Error('没有找到LoadBalancers');\n    }\n\n    return res.LoadBalancers.LoadBalancer.map((item: any) => {\n      const label = `${item.LoadBalancerId}<${item.LoadBalancerName}}>`;\n      return {\n        label: label,\n        value: item.LoadBalancerId,\n      };\n    });\n  }\n\n  async onGetListenerList(data: any) {\n    if (!this.accessId) {\n      throw new Error('请先选择Access授权');\n    }\n    if (!this.regionId) {\n      throw new Error('请先选择地区');\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const client = await this.getLBClient(access, this.regionId);\n\n    const params: any = {\n      MaxResults: 100,\n      RegionId: this.regionId,\n      ListenerProtocol: 'HTTPS',\n    };\n    if (this.loadBalancers && this.loadBalancers.length > 0) {\n      params.LoadBalancerId = this.loadBalancers;\n    }\n    const res = await client.request('DescribeLoadBalancerListeners', params);\n    this.checkRet(res);\n    if (!res?.Listeners || res?.Listeners.length === 0) {\n      throw new Error('没有找到HTTPS监听器');\n    }\n\n    return res.Listeners.map((item: any) => {\n      const value = `${item.LoadBalancerId}_${item.ListenerProtocol}_${item.ListenerPort}`;\n      const label = `${value}<${item.Description}>`;\n      return {\n        label: label,\n        value: value,\n      };\n    });\n  }\n\n  async onGetExtensionDomainList(data: PageSearch) {\n    if (!this.accessId) {\n      throw new Error('请先选择Access授权');\n    }\n    if (!this.regionId) {\n      throw new Error('请先选择地区');\n    }\n    if (!this.listeners && this.listeners.length == 0) {\n      throw new Error('请先选择监听器');\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n\n    const allDomains: any[] = []\n    for (const ls of this.listeners) {\n      const {port, loadBalanceId, protocol} = this.resolveListenerKey(ls)\n      const domains = await this.doGetExtensionDomainList({\n        access,\n        loadBalancerId: loadBalanceId,\n        listenerPort: port,\n        listenerProtocol: protocol,\n      });\n      allDomains.push(...domains)\n    }\n\n    return this.ctx.utils.options.buildGroupOptions(allDomains, this.certDomains)\n\n  }\n\n\n  async doGetExtensionDomainList(data: {\n    loadBalancerId: string,\n    listenerPort: number,\n    listenerProtocol: string,\n    access: AliyunAccess\n  }) {\n    const {loadBalancerId, listenerPort, listenerProtocol, access} = data;\n    const client = access.getClient(\"slb.aliyuncs.com\")\n\n    let queries = {\n      RegionId: this.regionId,\n      LoadBalancerId: loadBalancerId,\n      ListenerPort: listenerPort\n    };\n\n    const res = await client.doRequest({\n      // 接口名称\n      action: \"DescribeDomainExtensions\",\n      // 接口版本\n      version: \"2014-05-15\",\n      data: {\n        query: queries,\n      }\n    })\n\n    this.checkRet(res);\n    const list = res?.DomainExtensions.DomainExtension;\n    if (!list || list.length === 0) {\n      return []\n    }\n\n    return list.map((i: any) => {\n      const value = `${loadBalancerId}_${listenerProtocol ?? \"HTTPS\"}_${listenerPort}_${i.DomainExtensionId}`;\n      const label = `${i.DomainExtensionId}<${i.Domain}>`;\n      return {\n        value: value,\n        label: label,\n        domain:i.Domain\n      };\n    });\n  }\n\n\n  checkRet(ret: any) {\n    if (ret.Code != null) {\n      throw new Error(ret.Message);\n    }\n  }\n}\n\nnew AliyunDeployCertToSLB();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-vod/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, PageSearch, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { AliyunAccess, createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\n\n@IsTaskPlugin({\n  name: \"AliyunDeployCertToVod\",\n  title: \"阿里云-部署至VOD\",\n  icon: \"svg:icon-aliyun\",\n  group: pluginGroups.aliyun.key,\n  desc: \"部署证书到阿里云视频点播（vod）\",\n  needPlus: false,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\nexport class AliyunDeployCertToVod extends AbstractTaskPlugin {\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择证书申请任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames]\n    },\n    required: true\n  })\n  cert!: CertInfo;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  // @TaskInput({\n  //   title: \"大区\",\n  //   value: \"cn-hangzhou\",\n  //   component: {\n  //     name: \"a-auto-complete\",\n  //     vModel: \"value\",\n  //     options: [\n  //       { value: \"cn-hangzhou\", label: \"华东1（杭州）\" },\n  //       { value: \"ap-southeast-1\", label: \"新加坡\" }\n  //     ]\n  //   },\n  //   required: true\n  // })\n  // regionId!: string;\n\n  @TaskInput({\n    title: \"证书接入点\",\n    helper: \"不会选就保持默认即可\",\n    value: \"cas.aliyuncs.com\",\n    component: {\n      name: \"a-select\",\n      options: [\n        { value: \"cas.aliyuncs.com\", label: \"中国大陆\" },\n        { value: \"cas.ap-southeast-1.aliyuncs.com\", label: \"新加坡\" },\n        { value: \"cas.eu-central-1.aliyuncs.com\", label: \"德国（法兰克福）\" }\n      ]\n    },\n    required: true\n  })\n  casEndpoint!: string;\n\n\n  @TaskInput({\n    title: \"Access授权\",\n    helper: \"阿里云授权AccessKeyId、AccessKeySecret\",\n    component: {\n      name: \"access-selector\",\n      type: \"aliyun\"\n    },\n    required: true\n  })\n  accessId!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"加速域名\",\n      helper: \"请选择要部署证书的域名\",\n      action: AliyunDeployCertToVod.prototype.onGetDomainList.name,\n      watches: [\"accessId\"],\n      pager: true,\n      search: true\n    })\n  )\n  domainList!: string[];\n\n\n  async onInstance() {\n  }\n\n\n  async execute(): Promise<void> {\n    this.logger.info(\"开始部署证书到阿里云VOD\");\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n\n    const client = await this.getClient(access);\n\n\n    for (const siteId of this.domainList) {\n      /**\n       * let queries : {[key: string ]: any} = { };\n       *     queries[\"DomainName\"] = \"324234234\";\n       *     queries[\"CertName\"] = \"ccccccc\";\n       *     queries[\"SSLProtocol\"] = \"on\";\n       *     queries[\"SSLPub\"] = \"cert\";\n       *     queries[\"SSLPri\"] = \"key\";\n       *     // runtime options\n       *     let runtime = new $Util.RuntimeOptions({ });\n       *     let request = new $OpenApi.OpenApiRequest({\n       *       query: OpenApiUtil.query(queries),\n       *     });\n       */\n      const res = await client.doRequest({\n        action: \"SetVodDomainCertificate\",\n        version: \"2017-03-21\",\n        protocol: \"HTTPS\",\n        data: {\n          query: {\n            DomainName: siteId,\n            CertName: this.appendTimeSuffix(\"certd\"),\n            SSLProtocol: \"on\",\n            SSLPub: this.cert.crt,\n            SSLPri: this.cert.key\n          }\n        }\n      });\n      this.logger.info(`部署站点[${siteId}]证书成功：${JSON.stringify(res)}`);\n    }\n  }\n\n  async getClient(access: AliyunAccess) {\n    const endpoint = `vod.cn-shanghai.aliyuncs.com`;\n    return access.getClient(endpoint);\n  }\n\n  async onGetDomainList(data: PageSearch) {\n    if (!this.accessId) {\n      throw new Error(\"请选择Access授权\");\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n\n    /**\n     * let queries : {[key: string ]: any} = { };\n     *     queries[\"PageSize\"] = 50;\n     *     queries[\"PageNumber\"] = 1;\n     *     queries[\"DomainName\"] = \"5555\";\n     *     // runtime options\n     *     let runtime = new $Util.RuntimeOptions({ });\n     *     let request = new $OpenApi.OpenApiRequest({\n     *       query: OpenApiUtil.query(queries),\n     *     });\n     */\n    const client = await this.getClient(access);\n    const res = await client.doRequest({\n      action: \"DescribeVodUserDomains\",\n      version: \"2017-03-21\",\n      protocol: \"HTTPS\",\n      data: {\n        query: {\n          DomainName: data.searchKey,\n          PageNumber: data.pageNo,\n          PageSize: data.pageSize\n        }\n      }\n    });\n\n    const list = res?.Domains.PageData;\n    if (!list || list.length === 0) {\n      throw new Error(\"没有找到加速域名，请先在阿里云添加点播加速域名\");\n    }\n\n    const options = list.map((item: any) => {\n      return {\n        label: item.DomainName,\n        value: item.DomainName,\n        domain: item.DomainName\n      };\n    });\n    return this.ctx.utils.options.buildGroupOptions(options, this.certDomains);\n  }\n\n}\n\nnew AliyunDeployCertToVod();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-waf/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, Pager,PageSearch, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo, CertReader } from \"@certd/plugin-cert\";\nimport {\n  AliyunAccess,\n  AliyunClient,\n  AliyunSslClient,\n  createCertDomainGetterInputDefine,\n  createRemoteSelectInputDefine\n} from \"@certd/plugin-lib\";\n\n@IsTaskPlugin({\n  name: 'AliyunDeployCertToWaf',\n  title: '阿里云-部署至阿里云WAF',\n  icon: 'svg:icon-aliyun',\n  group: pluginGroups.aliyun.key,\n  desc: '部署证书到阿里云WAF',\n  needPlus: false,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class AliyunDeployCertToWaf extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择证书申请任务输出的域名证书\\n或者选择前置任务“上传证书到阿里云”任务的证书ID，可以减少上传到阿里云的证书数量',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames, 'uploadCertToAliyun'],\n    },\n    required: true,\n  })\n  cert!: CertInfo | number;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  @TaskInput({\n    title: 'WAF接入点',\n    helper: '不会选就按默认',\n    value: 'cn-hangzhou',\n    component: {\n      name: 'a-select',\n      options: [\n        { value: 'cn-hangzhou', label: '中国大陆-华东1(杭州)' },\n        { value: 'ap-southeast-1', label: '新加坡' },\n      ],\n    },\n    required: true,\n  })\n  regionId!: string;\n\n  @TaskInput({\n    title: '证书接入点',\n    helper: '跟上面保持一致即可',\n    value: 'cas.aliyuncs.com',\n    component: {\n      name: 'a-select',\n      options: [\n        { value: 'cas.aliyuncs.com', label: '中国大陆' },\n        { value: 'cas.ap-southeast-1.aliyuncs.com', label: '新加坡' },\n        { value: 'cas.eu-central-1.aliyuncs.com', label: '德国（法兰克福）' },\n      ],\n    },\n    required: true,\n  })\n  casEndpoint!: string;\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '阿里云授权AccessKeyId、AccessKeySecret',\n    component: {\n      name: 'access-selector',\n      type: 'aliyun',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: 'CNAME站点',\n      helper: '请选择要部署证书的CNAME站点',\n      action: AliyunDeployCertToWaf.prototype.onGetCnameList.name,\n      watches: ['accessId', 'regionId'],\n      pager:true,\n      search:true,\n    })\n  )\n  cnameDomains!: string[];\n\n  async onInstance() {}\n\n  async getWafClient(access: AliyunAccess) {\n    const client = new AliyunClient({ logger: this.logger });\n    await client.init({\n      accessKeyId: access.accessKeyId,\n      accessKeySecret: access.accessKeySecret,\n      //https://wafopenapi.cn-hangzhou.aliyuncs.com\n      endpoint: `https://wafopenapi.${this.regionId}.aliyuncs.com`,\n      apiVersion: '2021-10-01',\n    });\n    return client;\n  }\n\n  async getInstanceId(client: AliyunClient) {\n    const params = {\n      RegionId: 'cn-hangzhou',\n    };\n    const res = await client.request('DescribeInstance', params);\n    this.logger.info('获取实例ID', res.InstanceId);\n    return res.InstanceId;\n  }\n\n  async execute(): Promise<void> {\n    this.logger.info('开始部署证书到阿里云');\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    let certId: any = this.cert;\n    if (typeof this.cert === 'object') {\n      const sslClient = new AliyunSslClient({\n        access,\n        logger: this.logger,\n        endpoint: this.casEndpoint,\n      });\n\n      certId = await sslClient.uploadCert({\n        name: this.buildCertName(CertReader.getMainDomain(this.cert.crt)),\n        cert: this.cert,\n      });\n    }\n\n    const client = await this.getWafClient(access);\n    const instanceId = await this.getInstanceId(client);\n    for (const siteDomain of this.cnameDomains) {\n      this.logger.info('开始部署', siteDomain);\n      const params = {\n        RegionId: this.regionId,\n        InstanceId: instanceId,\n        Domain: siteDomain,\n      };\n      const siteDetail = await client.request('DescribeDomainDetail', params);\n      this.logger.info('站点详情', JSON.stringify(siteDetail));\n      const listen = siteDetail.Listen;\n      if (!listen) {\n        throw new Error(`没有找到${siteDomain}的监听器`);\n      }\n      /**\n       * \"HttpsPorts\": [\n       *       443\n       *     ],\n       *      \"CertId\": \"14738336-cn-hangzhou\",\n       */\n      const redirect = siteDetail.Redirect;\n      redirect.Backends = redirect.AllBackends;\n      listen.CertId = certId + '-' + this.regionId;\n      if (!listen.HttpsPorts || listen.HttpsPorts.length === 0) {\n        listen.HttpsPorts = [443];\n      }\n      const updateParams = {\n        InstanceId: instanceId,\n        RegionId: this.regionId,\n        Redirect: JSON.stringify(redirect),\n        Listen: JSON.stringify(listen),\n        Domain: siteDomain,\n      };\n      const res = await client.request('ModifyDomain', updateParams);\n      this.logger.info('部署成功', JSON.stringify(res));\n    }\n  }\n\n  async onGetCnameList(data: PageSearch) {\n    if (!this.accessId) {\n      throw new Error('请选择Access授权');\n    }\n    const access = await this.getAccess<AliyunAccess>(this.accessId);\n    const client = await this.getWafClient(access);\n\n\n    const pager = new Pager(data)\n\n    const instanceId = await this.getInstanceId(client);\n    const params:any = {\n      RegionId: this.regionId,\n      InstanceId: instanceId,\n      PageSize: pager.pageSize,\n      PageNumber: pager.pageNo,\n    };\n    if (data.searchKey){\n      params.Domain = data.searchKey\n    }\n\n    const res = await client.request('DescribeDomains', params);\n    if (!res?.Domains || res?.Domains.length === 0) {\n      throw new Error('没有找到CNAME接入的域名站点');\n    }\n    const total = res.TotalCount;\n\n    const options = res.Domains.map((item: any) => {\n      return {\n        label: item.Domain,\n        value: item.Domain,\n        title: item.Domain,\n        domain: item.Domain,\n      };\n    });\n    const list= this.ctx.utils.options.buildGroupOptions(options, this.certDomains);\n\n    // const list = [{value:\"1\",label:\"1\"},{value:\"2\",label:\"2\"}]\n    // const total = 120\n    return {\n      list,\n      total: total,\n      pageNo: pager.pageNo,\n      pageSize: pager.pageSize\n    };\n  }\n}\n\nnew AliyunDeployCertToWaf();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/index.ts",
    "content": "export * from './deploy-to-cdn/index.js';\nexport * from './deploy-to-dcdn/index.js';\nexport * from './deploy-to-oss/index.js';\nexport * from './upload-to-aliyun/index.js';\nexport * from './deploy-to-waf/index.js';\nexport * from './deploy-to-alb/index.js';\nexport * from './deploy-to-nlb/index.js';\nexport * from './deploy-to-slb/index.js';\nexport * from './deploy-to-fc/index.js';\nexport * from './deploy-to-esa/index.js';\nexport * from './deploy-to-vod/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/upload-to-aliyun/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from '@certd/pipeline';\nimport { AliyunAccess } from '@certd/plugin-lib';\nimport { AliyunSslClient } from '@certd/plugin-lib';\nimport { CertApplyPluginNames, CertReader } from \"@certd/plugin-cert\";\n/**\n * 华东1（杭州）\tcn-hangzhou\tcas.aliyuncs.com\tcas-vpc.cn-hangzhou.aliyuncs.com\n * 马来西亚（吉隆坡）\tap-southeast-3\tcas.ap-southeast-3.aliyuncs.com\tcas-vpc.ap-southeast-3.aliyuncs.com\n * 新加坡\tap-southeast-1\tcas.ap-southeast-1.aliyuncs.com\tcas-vpc.ap-southeast-1.aliyuncs.com\n * 印度尼西亚（雅加达）\tap-southeast-5\tcas.ap-southeast-5.aliyuncs.com\tcas-vpc.ap-southeast-5.aliyuncs.com\n * 中国香港\tcn-hongkong\tcas.cn-hongkong.aliyuncs.com\tcas-vpc.cn-hongkong.aliyuncs.com\n *  欧洲与美洲\n * 名称\t区域 ID\t服务地址\tVPC 地址\n * 德国（法兰克福）\teu-central-1\tcas.eu-central-1.aliyuncs.com\n */\nconst regionDict = [\n  { value: 'cn-hangzhou', endpoint: 'cas.aliyuncs.com', label: 'cn-hangzhou-中国大陆' },\n  { value: 'eu-central-1', endpoint: 'cas.eu-central-1.aliyuncs.com', label: 'eu-central-1-德国（法兰克福）' },\n  { value: 'ap-southeast-1', endpoint: 'cas.ap-southeast-1.aliyuncs.com', label: 'ap-southeast-1-新加坡' },\n  { value: 'ap-southeast-3', endpoint: 'cas.ap-southeast-3.aliyuncs.com', label: 'ap-southeast-3-马来西亚（吉隆坡）' },\n  { value: 'ap-southeast-5', endpoint: 'cas.ap-southeast-5.aliyuncs.com', label: 'ap-southeast-5-印度尼西亚（雅加达）' },\n  { value: 'cn-hongkong', endpoint: 'cas.cn-hongkong.aliyuncs.com', label: 'cn-hongkong-中国香港' },\n];\n\n@IsTaskPlugin({\n  name: 'uploadCertToAliyun',\n  title: '阿里云-上传证书到阿里云CAS',\n  icon: 'svg:icon-aliyun',\n  group: pluginGroups.aliyun.key,\n  desc: '上传证书到阿里云数字证书管理服务（CAS），注意：不会部署到任何应用上；如果不想在阿里云上同一份证书上传多次，可以把此任务作为前置任务，其他阿里云任务证书那一项选择此任务的输出',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class UploadCertToAliyun extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '证书名称',\n    helper: '证书上传后将以此参数作为名称前缀',\n  })\n  name!: string;\n\n  @TaskInput({\n    title: '大区',\n    value: 'cn-hangzhou',\n    component: {\n      name: 'a-auto-complete',\n      vModel: 'value',\n      options: regionDict,\n    },\n    required: true,\n  })\n  regionId!: string;\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: any;\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '阿里云授权AccessKeyId、AccessKeySecret',\n    component: {\n      name: 'access-selector',\n      type: 'aliyun',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskOutput({\n    title: '上传成功后的阿里云CertId',\n  })\n  aliyunCertId!: string;\n\n  async onInstance() {}\n\n  async execute(): Promise<void> {\n    this.logger.info('开始部署证书到阿里云cdn');\n    const access: AliyunAccess = await this.getAccess(this.accessId);\n\n    let endpoint = '';\n    for (const region of regionDict) {\n      if (region.value === this.regionId) {\n        endpoint = region.endpoint;\n        break;\n      }\n    }\n    const client = new AliyunSslClient({\n      access,\n      logger: this.logger,\n      endpoint,\n    });\n    const certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt))\n    this.aliyunCertId = await client.uploadCert({\n      name: certName,\n      cert: this.cert,\n    });\n  }\n}\n//注册插件\nnew UploadCertToAliyun();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aliyun/utils/index.ts",
    "content": "import dayjs from \"dayjs\";\nimport { AliyunSslClient } from \"@certd/plugin-lib\";\nimport { CertInfo, CertReader } from \"@certd/plugin-cert\";\n\nexport const ZoneOptions = [{ value: 'cn-hangzhou' }];\nexport function appendTimeSuffix(name: string) {\n  if (name == null) {\n    name = 'certd';\n  }\n  return name + '-' + dayjs().format('YYYYMMDD-HHmmss');\n}\n\nexport function checkRet(ret: any) {\n  if (ret.Code != null) {\n    throw new Error('执行失败：' + ret.Message);\n  }\n}\n\n\nexport async function  getAliyunCertId(opts:{\n  cert: string | CertInfo,\n  sslClient: AliyunSslClient,\n}) {\n  const { cert, sslClient } = opts;\n  let certId: any = cert;\n  let certName: any = CertReader.appendTimeSuffix(\"certd\");\n  if (typeof cert === \"object\") {\n    const certReader = new CertReader(cert)\n    certName = certReader.buildCertName()\n\n    certId = await sslClient.uploadCert({\n      name: certName,\n      cert: cert,\n    });\n    sslClient.logger.info(\"上传证书成功\", certId, certName);\n  }\n  return {\n    certId,\n    certName,\n  };\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aws/access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from '@certd/pipeline';\n\nexport const AwsRegions = [\n  { label: 'us-east-1', value: 'us-east-1' },\n  { label: 'us-east-2', value: 'us-east-2' },\n  { label: 'us-west-1', value: 'us-west-1' },\n  { label: 'us-west-2', value: 'us-west-2' },\n  { label: 'af-south-1', value: 'af-south-1' },\n  { label: 'ap-east-1', value: 'ap-east-1' },\n  { label: 'ap-northeast-1', value: 'ap-northeast-1' },\n  { label: 'ap-northeast-2', value: 'ap-northeast-2' },\n  { label: 'ap-northeast-3', value: 'ap-northeast-3' },\n  { label: 'ap-south-1', value: 'ap-south-1' },\n  { label: 'ap-south-2', value: 'ap-south-2' },\n  { label: 'ap-southeast-1', value: 'ap-southeast-1' },\n  { label: 'ap-southeast-2', value: 'ap-southeast-2' },\n  { label: 'ap-southeast-3', value: 'ap-southeast-3' },\n  { label: 'ap-southeast-4', value: 'ap-southeast-4' },\n  { label: 'ap-southeast-5', value: 'ap-southeast-5' },\n  { label: 'ca-central-1', value: 'ca-central-1' },\n  { label: 'ca-west-1', value: 'ca-west-1' },\n  { label: 'eu-central-1', value: 'eu-central-1' },\n  { label: 'eu-central-2', value: 'eu-central-2' },\n  { label: 'eu-north-1', value: 'eu-north-1' },\n  { label: 'eu-south-1', value: 'eu-south-1' },\n  { label: 'eu-south-2', value: 'eu-south-2' },\n  { label: 'eu-west-1', value: 'eu-west-1' },\n  { label: 'eu-west-2', value: 'eu-west-2' },\n  { label: 'eu-west-3', value: 'eu-west-3' },\n  { label: 'il-central-1', value: 'il-central-1' },\n  { label: 'me-central-1', value: 'me-central-1' },\n  { label: 'me-south-1', value: 'me-south-1' },\n  { label: 'sa-east-1', value: 'sa-east-1' },\n];\n\n@IsAccess({\n  name: 'aws',\n  title: '亚马逊云aws授权',\n  desc: '',\n  icon: 'svg:icon-aws',\n})\nexport class AwsAccess extends BaseAccess {\n  @AccessInput({\n    title: 'accessKeyId',\n    component: {\n      placeholder: 'accessKeyId',\n    },\n    helper:\n      '右上角->安全凭证->访问密钥，[点击前往](https://us-east-1.console.aws.amazon.com/iam/home?region=ap-east-1#/security_credentials/access-key-wizard)',\n    required: true,\n  })\n  accessKeyId = '';\n\n  @AccessInput({\n    title: 'secretAccessKey',\n    component: {\n      placeholder: 'secretAccessKey',\n    },\n    required: true,\n    encrypt: true,\n    helper: '请妥善保管您的安全访问密钥。您可以在AWS管理控制台的IAM中创建新的访问密钥。',\n  })\n  secretAccessKey = '';\n}\n\nnew AwsAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aws/index.ts",
    "content": "export * from './plugins/index.js';\nexport * from './access.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aws/libs/aws-acm-client.ts",
    "content": "// 导入所需的 SDK 模块\nimport { AwsAccess } from '../access.js';\nimport { CertInfo } from '@certd/plugin-cert';\n\ntype AwsAcmClientOptions = { access: AwsAccess; region: string };\n\nexport class AwsAcmClient {\n  options: AwsAcmClientOptions;\n  access: AwsAccess;\n  region: string;\n  constructor(options: AwsAcmClientOptions) {\n    this.options = options;\n    this.access = options.access;\n    this.region = options.region;\n  }\n  async importCertificate(certInfo: CertInfo) {\n    // 创建 ACM 客户端\n    const { ACMClient, ImportCertificateCommand } = await import('@aws-sdk/client-acm');\n    const acmClient = new ACMClient({\n      region: this.region, // 替换为您的 AWS 区域\n      credentials: {\n        accessKeyId: this.access.accessKeyId, // 从环境变量中读取\n        secretAccessKey: this.access.secretAccessKey,\n      },\n    });\n\n    const cert = certInfo.crt.split('-----END CERTIFICATE-----')[0] + '-----END CERTIFICATE-----';\n    // 构建上传参数\n    const data = await acmClient.send(\n      new ImportCertificateCommand({\n        Certificate: Buffer.from(cert),\n        PrivateKey: Buffer.from(certInfo.key),\n        // CertificateChain: certificateChain, // 可选\n      })\n    );\n    console.log('Upload successful:', data);\n    // 返回证书 ARN（Amazon Resource Name）\n    return data.CertificateArn;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aws/plugins/index.ts",
    "content": "export * from './plugin-deploy-to-cloudfront.js';\nexport * from './plugin-upload-to-acm.js'\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aws/plugins/plugin-deploy-to-cloudfront.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { AwsAccess, AwsRegions } from \"../access.js\";\nimport { AwsAcmClient } from \"../libs/aws-acm-client.js\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { optionsUtils } from \"@certd/basic/dist/utils/util.options.js\";\n\n@IsTaskPlugin({\n  name: 'AwsDeployToCloudFront',\n  title: 'AWS-部署证书到CloudFront',\n  desc: '部署证书到 AWS CloudFront',\n  icon: 'svg:icon-aws',\n  group: pluginGroups.aws.key,\n  needPlus: false,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class AwsDeployToCloudFront extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames, 'AwsUploadToACM'],\n    },\n    required: true,\n  })\n  cert!: CertInfo | string;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  @TaskInput({\n    title: '区域',\n    helper: '证书上传区域',\n    component: {\n      name: 'a-auto-complete',\n      vModel: 'value',\n      options: AwsRegions,\n    },\n    required: true,\n  })\n  region!: string;\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: 'aws的授权',\n    component: {\n      name: 'access-selector',\n      type: 'aws',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: '分配ID',\n      helper: '请选择distributions id',\n      action: AwsDeployToCloudFront.prototype.onGetDistributions.name,\n      required: true,\n    })\n  )\n  distributionIds!: string[];\n\n  async onInstance() {}\n\n  async execute(): Promise<void> {\n    const access = await this.getAccess<AwsAccess>(this.accessId);\n\n    let certId = this.cert as string;\n    if (typeof this.cert !== 'string') {\n      //先上传\n      certId = await this.uploadToACM(access, this.cert);\n    }\n    //部署到CloudFront\n\n    const { CloudFrontClient, UpdateDistributionCommand, GetDistributionConfigCommand } = await import('@aws-sdk/client-cloudfront');\n    const cloudFrontClient = new CloudFrontClient({\n      region: this.region,\n      credentials: {\n        accessKeyId: access.accessKeyId,\n        secretAccessKey: access.secretAccessKey,\n      },\n    });\n\n    // update-distribution\n    for (const distributionId of this.distributionIds) {\n      // get-distribution-config\n      const getDistributionConfigCommand = new GetDistributionConfigCommand({\n        Id: distributionId,\n      });\n\n      const configData = await cloudFrontClient.send(getDistributionConfigCommand);\n\n      const updateDistributionCommand = new UpdateDistributionCommand({\n        DistributionConfig: {\n          ...configData.DistributionConfig,\n          ViewerCertificate: {\n            ...configData.DistributionConfig.ViewerCertificate,\n            CloudFrontDefaultCertificate: false,\n            ACMCertificateArn: certId,\n          },\n        },\n        Id: distributionId,\n        IfMatch: configData.ETag,\n      });\n      await cloudFrontClient.send(updateDistributionCommand);\n      this.logger.info(`部署${distributionId}完成:`);\n    }\n    this.logger.info('部署完成');\n  }\n\n  private async uploadToACM(access: AwsAccess, cert: CertInfo) {\n    const acmClient = new AwsAcmClient({\n      access,\n      region: this.region,\n    });\n    const awsCertARN = await acmClient.importCertificate(cert);\n    this.logger.info('证书上传成功,id=', awsCertARN);\n    return awsCertARN;\n  }\n\n  //查找分配ID列表选项\n  async onGetDistributions() {\n    if (!this.accessId) {\n      throw new Error('请选择Access授权');\n    }\n\n    const access = await this.getAccess<AwsAccess>(this.accessId);\n    const { CloudFrontClient, ListDistributionsCommand } = await import('@aws-sdk/client-cloudfront');\n    const cloudFrontClient = new CloudFrontClient({\n      region: this.region,\n      credentials: {\n        accessKeyId: access.accessKeyId,\n        secretAccessKey: access.secretAccessKey,\n      },\n    });\n    // list-distributions\n    const listDistributionsCommand = new ListDistributionsCommand({});\n    const data = await cloudFrontClient.send(listDistributionsCommand);\n    const distributions = data.DistributionList?.Items;\n    if (!distributions || distributions.length === 0) {\n      throw new Error('找不到CloudFront分配ID，您可以手动输入');\n    }\n\n    const options = distributions.map((item: any) => {\n      return {\n        value: item.Id,\n        label: `${item.DomainName}<${item.Id}>`,\n        domain: item.DomainName,\n      };\n    });\n    return optionsUtils.buildGroupOptions(options, this.certDomains);\n  }\n}\n\nnew AwsDeployToCloudFront();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aws/plugins/plugin-upload-to-acm.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from '@certd/pipeline';\nimport { CertInfo } from '@certd/plugin-cert';\nimport { AwsAccess, AwsRegions } from '../access.js';\nimport { AwsAcmClient } from '../libs/aws-acm-client.js';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'AwsUploadToACM',\n  title: 'AWS-上传证书到ACM',\n  desc: '上传证书 AWS ACM',\n  icon: 'svg:icon-aws',\n  group: pluginGroups.aws.key,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class AwsUploadToACM extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: 'aws的授权',\n    component: {\n      name: 'access-selector',\n      type: 'aws',\n    },\n    required: true,\n  })\n  accessId!: string;\n  @TaskInput({\n    title: '区域',\n    helper: '证书上传区域',\n    component: {\n      name: 'a-auto-complete',\n      vModel: 'value',\n      options: AwsRegions,\n    },\n    required: true,\n  })\n  region!: string;\n\n  @TaskOutput({\n    title: '证书ARN',\n  })\n  awsCertARN = '';\n\n  async onInstance() {}\n\n  async execute(): Promise<void> {\n    const { cert, accessId, region } = this;\n    const access = await this.getAccess<AwsAccess>(accessId);\n    const acmClient = new AwsAcmClient({\n      access,\n      region,\n    });\n    this.awsCertARN = await acmClient.importCertificate(cert);\n    this.logger.info('证书上传成功,id=', this.awsCertARN);\n  }\n}\n\nnew AwsUploadToACM();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aws-cn/access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from '@certd/pipeline';\n\nexport const AwsCNRegions = [\n  { label: 'cn-north-1', value: 'cn-north-1' },\n  { label: 'cn-northwest-1', value: 'cn-northwest-1' },\n];\n\n@IsAccess({\n  name: 'aws-cn',\n  title: '亚马逊云科技（国区）授权',\n  desc: '',\n  icon: 'svg:icon-aws',\n})\nexport class AwsCNAccess extends BaseAccess {\n  @AccessInput({\n    title: 'accessKeyId',\n    component: {\n      placeholder: 'accessKeyId',\n    },\n    helper:\n      '右上角->安全凭证->访问密钥，[点击前往](https://cn-north-1.console.amazonaws.cn/iam/home?region=cn-north-1#/security_credentials/access-key-wizard#)',\n    required: true,\n  })\n  accessKeyId = '';\n\n  @AccessInput({\n    title: 'secretAccessKey',\n    component: {\n      placeholder: 'secretAccessKey',\n    },\n    required: true,\n    encrypt: true,\n    helper: '请妥善保管您的安全访问密钥。您可以在AWS管理控制台的IAM中创建新的访问密钥。',\n  })\n  secretAccessKey = '';\n}\n\nnew AwsCNAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aws-cn/index.ts",
    "content": "export * from './plugins/index.js';\nexport * from './access.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aws-cn/libs/aws-iam-client.ts",
    "content": "// 导入所需的 SDK 模块\nimport { AwsCNAccess } from '../access.js';\nimport { CertInfo } from '@certd/plugin-cert';\n\ntype AwsIAMClientOptions = { access: AwsCNAccess; region: string };\n\nexport class AwsIAMClient {\n  options: AwsIAMClientOptions;\n  access: AwsCNAccess;\n  region: string;\n  constructor(options: AwsIAMClientOptions) {\n    this.options = options;\n    this.access = options.access;\n    this.region = options.region;\n  }\n  async importCertificate(certInfo: CertInfo, certName: string) {\n    // 创建 IAM 客户端\n    const { IAMClient, UploadServerCertificateCommand } = await import('@aws-sdk/client-iam');\n    const iamClient = new IAMClient({\n      region: this.region, // 替换为您的 AWS 区域\n      credentials: {\n        accessKeyId: this.access.accessKeyId, // 从环境变量中读取\n        secretAccessKey: this.access.secretAccessKey,\n      },\n    });\n\n    const cert = certInfo.crt.split('-----END CERTIFICATE-----')[0] + '-----END CERTIFICATE-----';\n    const chain = certInfo.crt.split('-----END CERTIFICATE-----\\n')[1];\n    // 构建上传参数\n    const command = new UploadServerCertificateCommand({\n      Path: '/cloudfront/',\n      ServerCertificateName: certName,\n      CertificateBody: cert,\n      PrivateKey: certInfo.key,\n      CertificateChain: chain\n    })\n    const data = await iamClient.send(command);\n    console.log('Upload successful:', data);\n    // 返回证书 ID\n    return data.ServerCertificateMetadata.ServerCertificateId;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aws-cn/plugins/index.ts",
    "content": "export * from './plugin-deploy-to-cloudfront.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-aws-cn/plugins/plugin-deploy-to-cloudfront.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { AwsCNAccess, AwsCNRegions } from \"../access.js\";\nimport { AwsIAMClient } from \"../libs/aws-iam-client.js\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\n\n@IsTaskPlugin({\n  name: 'AwsCNDeployToCloudFront',\n  title: 'AWS(国区)-部署证书到CloudFront',\n  desc: '部署证书到 AWS CloudFront',\n  icon: 'svg:icon-aws',\n  group: pluginGroups.aws.key,\n  needPlus: false,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class AwsCNDeployToCloudFront extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames, 'AwsUploadToACM'],\n    },\n    required: true,\n  })\n  cert!: CertInfo | string;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  @TaskInput({\n    title: '区域',\n    helper: '证书上传区域',\n    component: {\n      name: 'a-auto-complete',\n      vModel: 'value',\n      options: AwsCNRegions,\n    },\n    required: true,\n  })\n  region!: string;\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: 'aws的授权',\n    component: {\n      name: 'access-selector',\n      type: 'aws-cn',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: '证书名称',\n    helper: '上传后将以此名称作为前缀备注',\n  })\n  certName!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: '分配ID',\n      helper: '请选择distributions id',\n      action: AwsCNDeployToCloudFront.prototype.onGetDistributions.name,\n      required: true,\n    })\n  )\n  distributionIds!: string[];\n\n  async onInstance() {}\n\n  async execute(): Promise<void> {\n    const access = await this.getAccess<AwsCNAccess>(this.accessId);\n\n    let certId = this.cert as string;\n    if (typeof this.cert !== 'string') {\n      //先上传\n      certId = await this.uploadToIAM(access, this.cert);\n    }\n    //部署到CloudFront\n\n    const { CloudFrontClient, UpdateDistributionCommand, GetDistributionConfigCommand } = await import('@aws-sdk/client-cloudfront');\n    const cloudFrontClient = new CloudFrontClient({\n      region: this.region,\n      credentials: {\n        accessKeyId: access.accessKeyId,\n        secretAccessKey: access.secretAccessKey,\n      },\n    });\n\n    // update-distribution\n    for (const distributionId of this.distributionIds) {\n      // get-distribution-config\n      const getDistributionConfigCommand = new GetDistributionConfigCommand({\n        Id: distributionId,\n      });\n\n      const configData = await cloudFrontClient.send(getDistributionConfigCommand);\n      const updateDistributionCommand = new UpdateDistributionCommand({\n        DistributionConfig: {\n          ...configData.DistributionConfig,\n          ViewerCertificate: {\n            ...configData.DistributionConfig.ViewerCertificate,\n            IAMCertificateId: certId,\n          },\n        },\n        Id: distributionId,\n        IfMatch: configData.ETag,\n      });\n      await cloudFrontClient.send(updateDistributionCommand);\n      this.logger.info(`部署${distributionId}完成:`);\n    }\n    this.logger.info('部署完成');\n  }\n\n  private async uploadToIAM(access: AwsCNAccess, cert: CertInfo) {\n    const acmClient = new AwsIAMClient({\n      access,\n      region: this.region,\n    });\n    const awsCertID = await acmClient.importCertificate(cert, this.appendTimeSuffix(this.certName));\n    this.logger.info('证书上传成功,id=', awsCertID);\n    return awsCertID;\n  }\n\n  //查找分配ID列表选项\n  async onGetDistributions() {\n    if (!this.accessId) {\n      throw new Error('请选择Access授权');\n    }\n\n    const access = await this.getAccess<AwsCNAccess>(this.accessId);\n    const { CloudFrontClient, ListDistributionsCommand } = await import('@aws-sdk/client-cloudfront');\n    const cloudFrontClient = new CloudFrontClient({\n      region: this.region,\n      credentials: {\n        accessKeyId: access.accessKeyId,\n        secretAccessKey: access.secretAccessKey,\n      },\n    });\n    // list-distributions\n    const listDistributionsCommand = new ListDistributionsCommand({});\n    const data = await cloudFrontClient.send(listDistributionsCommand);\n    const distributions = data.DistributionList?.Items;\n    if (!distributions || distributions.length === 0) {\n      throw new Error('找不到CloudFront分配ID，您可以手动输入');\n    }\n\n    const options = distributions.map((item: any) => {\n      return {\n        value: item.Id,\n        label: `${item.DomainName}<${item.Id}>`,\n        domain: item.DomainName,\n      };\n    });\n    return this.ctx.utils.options.buildGroupOptions(options, this.certDomains);\n  }\n}\n\nnew AwsCNDeployToCloudFront();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-cachefly/access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from '@certd/pipeline';\n\n@IsAccess({\n  name: 'CacheFly',\n  title: 'CacheFly',\n  desc: 'CacheFly',\n  icon: 'clarity:plugin-line',\n})\nexport class CacheflyAccess extends BaseAccess {\n  @AccessInput({\n    title: 'username',\n    component: {\n      placeholder: 'username',\n    },\n    required: true,\n  })\n  username = '';\n  @AccessInput({\n    title: 'password',\n    component: {\n      placeholder: 'password',\n    },\n    required: true,\n    encrypt: true,\n  })\n  password = '';\n  @AccessInput({\n    title: 'totp key',\n    component: {\n      placeholder: 'totp key',\n    },\n    encrypt: true,\n  })\n  otpkey = '';\n}\n\nnew CacheflyAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-cachefly/index.ts",
    "content": "export * from './plugins/index.js';\nexport * from './access.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-cachefly/plugins/index.ts",
    "content": "export * from './plugin-deploy-to-cdn.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-cachefly/plugins/plugin-deploy-to-cdn.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { CertInfo } from '@certd/plugin-cert';\nimport { CacheflyAccess } from '../access.js';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'CacheFly',\n  title: 'CacheFly-部署证书到CacheFly',\n  desc: '部署证书到 CacheFly',\n  icon: 'clarity:plugin-line',\n  group: pluginGroups.cdn.key,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class CacheFlyPlugin extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n  @TaskInput({\n    title: 'Access授权',\n    helper: 'CacheFly 的授权',\n    component: {\n      name: 'access-selector',\n      type: 'CacheFly',\n    },\n    required: true,\n  })\n  accessId!: string;\n  private readonly baseApi = 'https://api.cachefly.com';\n\n  async onInstance() {}\n\n  private async doRequestApi(url: string, data: any = null, method = 'post', token: string | null = null) {\n    const headers = {\n      'Content-Type': 'application/json',\n      ...(token ? { 'x-cf-authorization': `Bearer ${token}` } : {}),\n    };\n    const res = await this.http.request<any, any>({\n      url,\n      method,\n      data,\n      headers,\n    });\n\n    return res;\n  }\n\n  async execute(): Promise<void> {\n    const { cert, accessId } = this;\n    const access = (await this.getAccess(accessId)) as CacheflyAccess;\n    let otp = null;\n    if (access.otpkey) {\n      const response = await this.http.request<any, any>({\n        url: `https://cn-api.my-api.cn/api/totp/?key=${access.otpkey}`,\n        method: 'get',\n      });\n      otp = response;\n      this.logger.info('获取到otp:', otp);\n    }\n    const loginResponse = await this.doRequestApi(`${this.baseApi}/api/2.6/auth/login`, {\n      username: access.username,\n      password: access.password,\n      ...(otp && { otp }),\n    });\n    const token = loginResponse.token;\n    this.logger.info('Token 获取成功');\n    // 更新证书\n    await this.doRequestApi(\n      `${this.baseApi}/api/2.6/certificates`,\n      {\n        certificate: cert.crt,\n        certificateKey: cert.key,\n      },\n      'post',\n      token\n    );\n    this.logger.info('证书更新成功');\n  }\n}\n\nnew CacheFlyPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-cloudflare/access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from '@certd/pipeline';\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: 'cloudflare',\n  title: 'cloudflare授权',\n  icon: 'simple-icons:cloudflare',\n  desc: '',\n})\nexport class CloudflareAccess extends BaseAccess {\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    title: 'API Token',\n    component: {\n      placeholder: 'api token，用户 API 令牌',\n    },\n    helper:\n      '前往 [获取API令牌](https://dash.cloudflare.com/profile/api-tokens)，注意是令牌，不是密钥。\\n token权限必须包含：[Zone区域-Zone区域-Edit编辑], [Zone区域-DNS-Edit编辑]',\n    required: true,\n    encrypt: true,\n  })\n  apiToken = '';\n\n  @AccessInput({\n    title: 'HTTP代理',\n    component: {\n      placeholder: 'http://xxxx.xxx.xx:10811',\n    },\n    helper:\n      '是否使用http代理',\n    required: false,\n    encrypt: false,\n  })\n  proxy = '';\n}\n\nnew CloudflareAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-cloudflare/dns-provider.ts",
    "content": "import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert';\n\nimport { CloudflareAccess } from './access.js';\n\nexport type CloudflareRecord = {\n  id: string;\n  type: string;\n  name: string;\n  content: string;\n  ttl: number;\n  proxied: boolean;\n  zone_id: string;\n  zone_name: string;\n  created_on: string;\n  modified_on: string;\n};\n\n// 这里通过IsDnsProvider注册一个dnsProvider\n@IsDnsProvider({\n  name: 'cloudflare',\n  title: 'cloudflare',\n  desc: 'cloudflare dns provider',\n  icon: 'simple-icons:cloudflare',\n  // 这里是对应的 cloudflare的access类型名称\n  accessType: 'cloudflare',\n})\nexport class CloudflareDnsProvider extends AbstractDnsProvider<CloudflareRecord> {\n  access!: CloudflareAccess;\n  usePunyCode(): boolean {\n    //是否使用punycode来添加解析记录\n    //默认都使用原始中文域名来添加\n    return true;\n  }\n  async onInstance() {\n    //一些初始化的操作\n    // 也可以通过ctx成员变量传递context\n    this.access = this.ctx.access as CloudflareAccess;\n  }\n\n  async getZoneId(domain: string) {\n    this.logger.info('获取zoneId:', domain);\n    const url = `https://api.cloudflare.com/client/v4/zones?name=${domain}`;\n    const res = await this.doRequestApi(url, null, 'get');\n    if (res.result.length === 0) {\n      throw new Error(`未找到域名${domain}的zoneId`);\n    }\n    return res.result[0].id;\n  }\n\n  private async doRequestApi(url: string, data: any = null, method = 'post') {\n    try {\n      const res = await this.http.request<any, any>({\n        url,\n        method,\n        headers: {\n          'Content-Type': 'application/json',\n          Authorization: `Bearer ${this.access.apiToken}`,\n        },\n        data,\n        httpProxy: this.access.proxy,\n      });\n\n      if (!res.success) {\n        throw new Error(`${JSON.stringify(res.errors)}`);\n      }\n      return res;\n    } catch (e: any) {\n      const data = e.response?.data;\n      if (data && data.success === false && data.errors && data.errors.length > 0) {\n        if (data.errors[0].code === 81058) {\n          this.logger.info('dns解析记录重复');\n          return null;\n        }\n      }\n      throw e;\n    }\n  }\n\n  /**\n   * 创建dns解析记录，用于验证域名所有权\n   */\n  async createRecord(options: CreateRecordOptions): Promise<CloudflareRecord> {\n    /**\n     * fullRecord: '_acme-challenge.test.example.com',\n     * value: 一串uuid\n     * type: 'TXT',\n     * domain: 'example.com'\n     */\n    const { fullRecord, value, type, domain } = options;\n    this.logger.info('添加域名解析：', fullRecord, value, type, domain);\n\n    const zoneId = await this.getZoneId(domain);\n    this.logger.info('获取zoneId成功:', zoneId);\n\n    // 给domain下创建txt类型的dns解析记录，fullRecord\n    const url = `https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`;\n    const res = await this.doRequestApi(url, {\n      content: value,\n      name: fullRecord,\n      type: type,\n      ttl: 60,\n    });\n    let record: any = null;\n    if (res == null) {\n      //重复的记录\n      this.logger.info(`dns解析记录重复，无需重复添加`);\n      record = await this.findRecord(zoneId, options);\n    } else {\n      record = res.result as CloudflareRecord;\n      this.logger.info(`添加域名解析成功:fullRecord=${fullRecord},value=${value}`);\n      this.logger.info(`dns解析记录:${JSON.stringify(record)}`);\n    }\n    //本接口需要返回本次创建的dns解析记录，这个记录会在删除的时候用到\n    record.zone_id = zoneId;\n    return record;\n  }\n\n  async findRecord(zoneId: string, options: CreateRecordOptions): Promise<CloudflareRecord | null> {\n    const { fullRecord, value } = options;\n    const url = `https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records?type=TXT&name=${fullRecord}&content=${value}`;\n    const res = await this.doRequestApi(url, null, 'get');\n    if (res.result.length === 0) {\n      return null;\n    }\n    return res.result[0] as CloudflareRecord;\n  }\n\n  /**\n   *  删除dns解析记录,清理申请痕迹\n   * @param options\n   */\n  async removeRecord(options: RemoveRecordOptions<CloudflareRecord>): Promise<void> {\n    const { fullRecord, value } = options.recordReq;\n    const record = options.recordRes;\n    this.logger.info('删除域名解析：', fullRecord, value);\n    if (!record) {\n      this.logger.info('record为空，不执行删除');\n      return;\n    }\n    //这里调用删除txt dns解析记录接口\n    const zoneId = record.zone_id;\n    const recordId = record.id;\n    const url = `https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records/${recordId}`;\n    await this.doRequestApi(url, null, 'delete');\n    this.logger.info(`删除域名解析成功:fullRecord=${fullRecord},value=${value}`);\n  }\n}\n\n//实例化这个provider，将其自动注册到系统中\nnew CloudflareDnsProvider();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-cloudflare/index.ts",
    "content": "export * from './dns-provider.js';\nexport * from './access.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-demo/access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from '@certd/pipeline';\nimport { isDev } from '../../utils/env.js';\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: 'demo',\n  title: '授权插件示例',\n  icon: 'clarity:plugin-line',\n  desc: '',\n})\nexport class DemoAccess extends BaseAccess {\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    title: '密钥Id',\n    component: {\n      placeholder: 'demoKeyId',\n    },\n    required: true,\n  })\n  demoKeyId = '';\n\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    //标题\n    title: '密钥串',\n    component: {\n      //input组件的placeholder\n      placeholder: 'demoKeySecret',\n    },\n    //是否必填\n    required: true,\n    //改属性是否需要加密\n    encrypt: true,\n  })\n  //属性名称\n  demoKeySecret = '';\n}\n\nif (isDev()) {\n  //你的实现 要去掉这个if，不然生产环境将不会显示\n  new DemoAccess();\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-demo/dns-provider.ts",
    "content": "import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert';\n\nimport { DemoAccess } from './access.js';\nimport { isDev } from '../../utils/env.js';\n\ntype DemoRecord = {\n  // 这里定义Record记录的数据结构，跟对应云平台接口返回值一样即可，一般是拿到id就行，用于删除txt解析记录，清理申请痕迹\n  // id:string\n};\n\n// 这里通过IsDnsProvider注册一个dnsProvider\n@IsDnsProvider({\n  name: 'demo',\n  title: 'Dns提供商Demo',\n  desc: 'dns provider示例',\n  icon: 'clarity:plugin-line',\n  // 这里是对应的云平台的access类型名称\n  accessType: 'demo',\n})\nexport class DemoDnsProvider extends AbstractDnsProvider<DemoRecord> {\n  access!: DemoAccess;\n\n  async onInstance() {\n    this.access = this.ctx.access as DemoAccess\n    // 也可以通过ctx成员变量传递context\n    this.logger.debug('access', this.access);\n    //初始化的操作\n    //...\n  }\n\n  /**\n   * 创建dns解析记录，用于验证域名所有权\n   */\n  async createRecord(options: CreateRecordOptions): Promise<any> {\n    /**\n     * options 参数说明\n     * fullRecord: '_acme-challenge.example.com',\n     * value: 一串uuid\n     * type: 'TXT',\n     * domain: 'example.com'\n     */\n    const { fullRecord, value, type, domain } = options;\n    this.logger.info('添加域名解析：', fullRecord, value, type, domain);\n\n    // 调用创建dns解析记录的对应的云端接口，创建txt类型的dns解析记录\n    // 请根据实际接口情况调用，例如：\n    // const createDnsRecordUrl = \"xxx\"\n    // const record = this.http.post(createDnsRecordUrl,{\n    //   // 授权参数\n    //   // 创建dns解析记录的参数\n    // })\n    // //返回本次创建的dns解析记录，这个记录会在删除的时候用到\n    // return record\n  }\n\n  /**\n   *  删除dns解析记录,清理申请痕迹\n   * @param options\n   */\n  async removeRecord(options: RemoveRecordOptions<DemoRecord>): Promise<void> {\n    const { fullRecord, value, domain } = options.recordReq;\n    const record = options.recordRes;\n    this.logger.info('删除域名解析：', domain, fullRecord, value, record);\n    //这里调用删除txt dns解析记录接口\n    //请根据实际接口情况调用，例如：\n\n    // const deleteDnsRecordUrl = \"xxx\"\n    // const res = this.http.delete(deleteDnsRecordUrl,{\n    //   // 授权参数\n    //   // 删除dns解析记录的参数\n    // })\n    //\n\n    this.logger.info('删除域名解析成功:', fullRecord, value);\n  }\n}\n\n//TODO 实例化这个provider，将其自动注册到系统中\nif (isDev()) {\n  //你的实现 要去掉这个if，不然生产环境将不会显示\n  new DemoDnsProvider();\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-demo/index.ts",
    "content": "export * from './dns-provider.js';\nexport * from './plugins/index.js';\nexport * from './access.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-demo/plugins/index.ts",
    "content": "export * from './plugin-test.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-demo/plugins/plugin-test.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { CertInfo, CertReader } from '@certd/plugin-cert';\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from '@certd/plugin-lib';\nimport { optionsUtils } from '@certd/basic/dist/utils/util.options.js';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  //命名规范，插件类型+功能（就是目录plugin-demo中的demo），大写字母开头，驼峰命名\n  name: 'DemoTest',\n  title: 'Demo-测试插件',\n  icon: 'clarity:plugin-line',\n  //插件分组\n  group: pluginGroups.other.key,\n  default: {\n    //默认值配置照抄即可\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\n//类名规范，跟上面插件名称（name）一致\nexport class DemoTest extends AbstractTaskPlugin {\n  //测试参数\n  @TaskInput({\n    title: '属性示例',\n    value: '默认值',\n    component: {\n      //前端组件配置，具体配置见组件文档 https://www.antdv.com/components/input-cn\n      name: 'a-input',\n      vModel: 'value', //双向绑定组件的props名称\n    },\n    helper: '帮助说明,[链接](https://certd.docmirror.cn)',\n    required: false, //是否必填\n  })\n  text!: string;\n\n  //测试参数\n  @TaskInput({\n    title: '选择框',\n    component: {\n      //前端组件配置，具体配置见组件文档 https://www.antdv.com/components/select-cn\n      name: 'a-auto-complete',\n      vModel: 'value',\n      options: [\n        //选项列表\n        { value: 'show', label: '动态显' },\n        { value: 'hide', label: '动态隐' },\n      ],\n    },\n  })\n  select!: string;\n\n  @TaskInput({\n    title: '动态显隐',\n    helper: '我会根据选择框的值进行显隐',\n    show: true, //动态计算的值会覆盖它\n    //动态计算脚本， mergeScript返回的对象会合并当前配置，此处演示 show的值会被动态计算结果覆盖，show的值根据用户选择的select的值决定\n    mergeScript: `\n    return {\n      show: ctx.compute(({form})=>{\n        return form.select === 'show';\n      })\n    }\n    `,\n  })\n  showText!: string;\n\n  //测试参数\n  @TaskInput({\n    title: '多选框',\n    component: {\n      //前端组件配置，具体配置见组件文档 https://www.antdv.com/components/select-cn\n      name: 'a-select',\n      vModel: 'value',\n      mode: 'tags',\n      multiple: true,\n      options: [\n        { value: '1', label: '选项1' },\n        { value: '2', label: '选项2' },\n      ],\n    },\n  })\n  multiSelect!: string;\n\n  //测试参数\n  @TaskInput({\n    title: 'switch',\n    component: {\n      //前端组件配置，具体配置见组件文档 https://www.antdv.com/components/switch-cn\n      name: 'a-switch',\n      vModel: 'checked',\n    },\n  })\n  switch!: boolean;\n  //证书选择，此项必须要有\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    // required: true, // 必填\n  })\n  cert!: CertInfo;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  //前端可以展示，当前申请的证书域名列表\n  certDomains!: string[];\n\n  //授权选择框\n  @TaskInput({\n    title: 'demo授权',\n    helper: 'demoAccess授权',\n    component: {\n      name: 'access-selector',\n      type: 'demo', //固定授权类型\n    },\n    // rules: [{ required: true, message: '此项必填' }],\n    // required: true, //必填\n  })\n  accessId!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: '从后端获取选项',\n      helper: '选择时可以从后端获取选项',\n      action: DemoTest.prototype.onGetSiteList.name,\n      //当以下参数变化时，触发获取选项\n      watches: ['certDomains', 'accessId'],\n      required: true,\n    })\n  )\n  siteName!: string | string[];\n\n  //插件实例化时执行的方法\n  async onInstance() {}\n\n  //插件执行方法\n  async execute(): Promise<void> {\n    const { select, text, cert, accessId } = this;\n\n    try {\n      const access = await this.getAccess(accessId);\n      this.logger.debug('access', access);\n    } catch (e) {\n      this.logger.error('获取授权失败', e);\n    }\n\n    try {\n      const certReader = new CertReader(cert);\n      this.logger.debug('certReader', certReader);\n    } catch (e) {\n      this.logger.error('读取crt失败', e);\n    }\n\n    this.logger.info('DemoTestPlugin execute');\n    this.logger.info('text:', text);\n    this.logger.info('select:', select);\n    this.logger.info('switch:', this.switch);\n    this.logger.info('授权id:', accessId);\n\n    // const res = await this.http.request({\n    //   url: 'https://api.demo.com',\n    //   method: 'GET',\n    // });\n    // if (res.code !== 0) {\n    //   //检查res是否报错,你需要抛异常，来结束插件执行，否则会判定为执行成功，下次执行时会跳过本任务\n    //   throw new Error(res.message);\n    // }\n    // this.logger.info('部署成功:', res);\n  }\n\n  //此方法演示，如何让前端在添加插件时可以从后端获取选项，这里是后端返回选项的方法\n  async onGetSiteList() {\n    if (!this.accessId) {\n      throw new Error('请选择Access授权');\n    }\n\n    // @ts-ignore\n    const access = await this.getAccess(this.accessId);\n\n    // const siteRes = await this.ctx.http.request({\n    //   url: '你的服务端获取选项的请求地址',\n    //   method: 'GET',\n    //   data: {\n    //    token:access.xxxx\n    //   }, //请求参数\n    // });\n    //以下是模拟数据\n    const siteRes = [\n      { id: 1, siteName: 'site1.com' },\n      { id: 2, siteName: 'site2.com' },\n      { id: 3, siteName: 'site2.com' },\n    ];\n    //转换为前端所需要的格式\n    const options = siteRes.map((item: any) => {\n      return {\n        value: item.siteName,\n        label: item.siteName,\n        domain: item.siteName,\n      };\n    });\n    //将站点域名名称根据证书域名进行匹配分组，分成匹配的和不匹配的两组选项，返回给前端，供用户选择\n    return optionsUtils.buildGroupOptions(options, this.certDomains);\n  }\n}\n//实例化一下，注册插件\nnew DemoTest();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-dnsla/access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from '@certd/pipeline';\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: 'dnsla',\n  title: 'dns.la授权',\n  icon: 'arcticons:dns-changer-3',\n  desc: '',\n})\nexport class DnslaAccess extends BaseAccess {\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    title: 'APIID',\n    component: {\n      placeholder: 'APIID',\n    },\n    helper:\"从我的账户->API密钥中获取 APIID APISecret\",\n    required: true,\n    encrypt: false,\n  })\n  apiId = '';\n\n  @AccessInput({\n    title: 'APISecret',\n    component: {\n      placeholder: '',\n    },\n    helper:\n      '',\n    required: false,\n    encrypt: true,\n  })\n  apiSecret = '';\n}\n\nnew DnslaAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-dnsla/dns-provider.ts",
    "content": "import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from \"@certd/plugin-cert\";\n\nimport { DnslaAccess } from \"./access.js\";\n\nexport type DnslaRecord = {\n  id: string;\n};\n\n// 这里通过IsDnsProvider注册一个dnsProvider\n@IsDnsProvider({\n  name: 'dnsla',\n  title: 'dns.la',\n  desc: 'dns.la',\n  icon: 'arcticons:dns-changer-3',\n  // 这里是对应的 cloudflare的access类型名称\n  accessType: 'dnsla',\n})\nexport class DnslaDnsProvider extends AbstractDnsProvider<DnslaRecord> {\n  access!: DnslaAccess;\n  async onInstance() {\n    //一些初始化的操作\n    // 通过ctx成员变量传递context\n    this.access = this.ctx.access as DnslaAccess;\n  }\n\n\n  private async doRequestApi(url: string, data: any = null, method = 'post') {\n    /**\n     * Basic 认证\n     * 我的账户 API 密钥 中获取 APIID APISecret\n     * APIID=myApiId\n     * APISecret=mySecret\n     * 生成 Basic 令牌\n     * # 用冒号连接 APIID APISecret\n     * str = \"myApiId:mySecret\"\n     * token = base64Encode(str)\n     * 在请求头中添加 Basic 认证令牌\n     * Authorization: Basic {token}\n     * 响应示例\n     * application/json\n     * {\n     *  \"code\":200,\n     *  \"msg\":\"\",\n     *  \"data\":{}\n     * }\n     */\n      const token = Buffer.from(`${this.access.apiId}:${this.access.apiSecret}`).toString('base64');\n      const res = await this.http.request<any, any>({\n        url:\"https://api.dns.la\"+url,\n        method,\n        headers: {\n          'Content-Type': 'application/json',\n          Authorization: `Basic ${token}`,\n        },\n        data,\n      });\n\n      if (res.code !== 200) {\n        throw new Error(res.msg);\n      }\n      return res;\n\n  }\n\n  async getDomainDetail(domain:string){\n    /**\n     * 请求示例\n     * GET /api/domain?id=85371689655342080&domain=test.com HTTP/1.1\n     * Authorization: Basic {token}\n     * 请求参数\n     * 参数\t名称\t类型\t必选\n     * id\t域名id\tstring\tid、domain 二选一\n     * domain\t域名\tstring\tid、domain 二选一\n     * Response\n     * 响应示例\n     * {\n     *     \"code\": 200,\n     *     \"msg\": \"\",\n     *     \"data\": {\n     *         \"id\": \"85371689655342080\",\n     *         \"createdAt\": 1692856597,\n     *         \"updatedAt\": 1692856598,\n     *         \"userId\": \"85068081529119744\",\n     *         \"userAccount\": \"foo@foo.com\",\n     *         \"assetId\": \"\",\n     *         \"groupId\": \"\",\n     */\n\n    const url = `/api/domain?domain=${domain}`;\n    const res = await this.doRequestApi(url, null, 'get');\n    return res.data\n  }\n\n  /**\n   * 创建dns解析记录，用于验证域名所有权\n   */\n  async createRecord(options: CreateRecordOptions): Promise<DnslaRecord> {\n    /**\n     * fullRecord: '_acme-challenge.test.example.com',\n     * value: 一串uuid\n     * type: 'TXT',\n     * domain: 'example.com'\n     */\n    const { fullRecord, value, type, domain } = options;\n    this.logger.info('添加域名解析：', fullRecord, value, type, domain);\n\n    const domainDetail = await this.getDomainDetail(domain);\n    const domainId = domainDetail.id;\n    this.logger.info('获取domainId成功:', domainId);\n\n\n    // 给domain下创建txt类型的dns解析记录，fullRecord\n    /**\n     * POST /api/record HTTP/1.1\n     * Authorization: Basic {token}\n     * Content-Type: application/json; charset=utf-8\n     *\n     * {\n     *     \"domainId\": \"85369994254488576\",\n     *     \"type\": 1,\n     *     \"host\": \"www\",\n     *     \"data\": \"1.1.1.1\",\n     *     \"ttl\": 600,\n     *     \"groupId\": \"\",\n     *     \"lineId\": \"\",\n     *     \"preference\": 10,\n     *     \"weight\": 1,\n     *     \"dominant\": false\n     * }\n     */\n    const url = `/api/record`;\n    /**\n     * A\t1\n     * NS\t2\n     * CNAME\t5\n     * MX\t15\n     * TXT\t16\n     * AAAA\t28\n     * SRV\t33\n     * CAA\t257\n     * URL转发\t256\n     */\n    const res = await this.doRequestApi(url, {\n      domainId: domainId,\n      type: 16,\n      host: fullRecord.replace(`.${domain}`, ''),\n      data: value,\n      ttl: 60,\n    });\n\n    return res.data;\n  }\n\n\n  /**\n   *  删除dns解析记录,清理申请痕迹\n   * @param options\n   */\n  async removeRecord(options: RemoveRecordOptions<DnslaRecord>): Promise<void> {\n    const { fullRecord, value } = options.recordReq;\n    const record = options.recordRes;\n    this.logger.info('删除域名解析：', fullRecord, value);\n    if (!record) {\n      this.logger.info('record为空，不执行删除');\n      return;\n    }\n    //这里调用删除txt dns解析记录接口\n    /**\n     * 请求示例\n     * DELETE /api/record?id=85371689655342080 HTTP/1.1\n     * Authorization: Basic {token}\n     * 请求参数\n     */\n    const recordId = record.id;\n    const url = `/api/record?id=${recordId}`;\n    await this.doRequestApi(url, null, 'delete');\n    this.logger.info(`删除域名解析成功:fullRecord=${fullRecord},value=${value}`);\n  }\n}\n\n//实例化这个provider，将其自动注册到系统中\nnew DnslaDnsProvider();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-dnsla/index.ts",
    "content": "export * from './dns-provider.js';\nexport * from './access.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-doge/access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from '@certd/pipeline';\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: 'dogecloud',\n  title: '多吉云',\n  desc: '',\n  icon: 'svg:icon-dogecloud',\n})\nexport class DogeCloudAccess extends BaseAccess {\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    title: 'AccessKey',\n    component: {\n      placeholder: 'AccessKey',\n    },\n    helper: '请前往[多吉云-密钥管理](https://console.dogecloud.com/user/keys)获取',\n    required: true,\n    encrypt: false,\n  })\n  accessKey = '';\n\n  @AccessInput({\n    title: 'SecretKey',\n    component: {\n      placeholder: 'SecretKey',\n    },\n    helper: '请前往[多吉云-密钥管理](https://console.dogecloud.com/user/keys)获取',\n    required: true,\n    encrypt: true,\n  })\n  secretKey = '';\n}\n\nnew DogeCloudAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-doge/index.ts",
    "content": "export * from './access.js';\nexport * from './lib/index.js';\nexport * from './plugins/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-doge/lib/index.ts",
    "content": "import crypto from 'crypto';\nimport querystring from 'querystring';\nimport { DogeCloudAccess } from '../access.js';\nimport { HttpClient } from '@certd/basic';\n\nexport class DogeClient {\n  accessKey: string;\n  secretKey: string;\n  http: HttpClient;\n  constructor(access: DogeCloudAccess, http: HttpClient) {\n    this.accessKey = access.accessKey;\n    this.secretKey = access.secretKey;\n    this.http = http;\n  }\n\n  async request(apiPath: string, data: any = {}, jsonMode = false, ignoreResNullCode = false) {\n    // 这里替换为你的多吉云永久 AccessKey 和 SecretKey，可在用户中心 - 密钥管理中查看\n    // 请勿在客户端暴露 AccessKey 和 SecretKey，那样恶意用户将获得账号完全控制权\n\n    const body = jsonMode ? JSON.stringify(data) : querystring.encode(data);\n    const sign = crypto\n      .createHmac('sha1', this.secretKey)\n      .update(Buffer.from(apiPath + '\\n' + body, 'utf8'))\n      .digest('hex');\n    const authorization = 'TOKEN ' + this.accessKey + ':' + sign;\n    const res: any = await this.http.request({\n      url: 'https://api.dogecloud.com' + apiPath,\n      method: 'POST',\n      data: body,\n      responseType: 'json',\n      headers: {\n        'Content-Type': jsonMode ? 'application/json' : 'application/x-www-form-urlencoded',\n        Authorization: authorization,\n      },\n    });\n\n    if (res.code == null && ignoreResNullCode) {\n      //ignore\n    } else if (res.code !== 200) {\n      throw new Error('API Error: ' + res.msg);\n    }\n    return res.data;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-doge/plugins/deploy-to-cdn/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { CertInfo } from '@certd/plugin-cert';\nimport { DogeClient } from '../../lib/index.js';\nimport dayjs from 'dayjs';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'DogeCloudDeployToCDN',\n  title: '多吉云-部署到多吉云CDN',\n  icon: 'svg:icon-dogecloud',\n  group: pluginGroups.cdn.key,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class DogeCloudDeployToCDNPlugin extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名',\n    helper: 'CDN域名',\n    required: true,\n  })\n  domain!: string;\n  //证书选择，此项必须要有\n  @TaskInput({\n    title: '证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n\n  //授权选择框\n  @TaskInput({\n    title: '多吉云授权',\n    helper: '多吉云AccessKey',\n    component: {\n      name: 'access-selector',\n      type: 'dogecloud',\n    },\n    rules: [{ required: true, message: '此项必填' }],\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: '忽略部署接口报错',\n    helper: '当该域名部署后报错，但是实际上已经部署成功时，可以勾选',\n    value: false,\n    component: {\n      name: 'a-switch',\n      type: 'checked',\n    },\n  })\n  ignoreDeployNullCode = false;\n\n  dogeClient!: DogeClient;\n\n  async onInstance() {\n    const access = await this.getAccess(this.accessId);\n    this.dogeClient = new DogeClient(access, this.ctx.http);\n  }\n  async execute(): Promise<void> {\n    const certId: number = await this.updateCert();\n    await this.bindCert(certId);\n  }\n\n  async updateCert() {\n    const data = await this.dogeClient.request('/cdn/cert/upload.json', {\n      note: 'certd-' + dayjs().format('YYYYMMDDHHmmss'),\n      cert: this.cert.crt,\n      private: this.cert.key,\n    });\n    return data.id;\n  }\n\n  async bindCert(certId: number) {\n    await this.dogeClient.request(\n      '/cdn/cert/bind.json',\n      {\n        id: certId,\n        domain: this.domain,\n      },\n      this.ignoreDeployNullCode\n    );\n  }\n}\nnew DogeCloudDeployToCDNPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-doge/plugins/index.ts",
    "content": "export * from './deploy-to-cdn/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-farcdn/access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from \"@certd/pipeline\";\nimport { HttpRequestConfig } from \"@certd/basic\";\nimport { CertInfo, CertReader } from \"@certd/plugin-cert\";\n\n\n/**\n */\n@IsAccess({\n  name: \"farcdn\",\n  title: \"farcdn授权\",\n  desc: \"\",\n  icon: \"svg:icon-lucky\"\n})\nexport class FarcdnAccess extends BaseAccess {\n  @AccessInput({\n    title: \"接口地址\",\n    value:\"https://open.farcdn.net/api/source\",\n    component: {\n      placeholder: \"https://open.farcdn.net/api/source\",\n      name: \"a-input\",\n      vModel: \"value\"\n    },\n    required: true\n  })\n  endpoint!: string;\n\n\n  @AccessInput({\n    title: \"accessKeyId\",\n    component: {\n      placeholder: \"accessKeyId\",\n      component: {\n        name: \"a-input\",\n        vModel: \"value\"\n      }\n    },\n    encrypt: false,\n    required: true\n  })\n  accessKeyId!: string;\n\n  @AccessInput({\n    title: \"accessKey\",\n    component: {\n      placeholder: \"accessKey\",\n      component: {\n        name: \"a-input\",\n        vModel: \"value\"\n      }\n    },\n    encrypt: true,\n    required: true\n  })\n  accessKey!: string;\n\n\n  @AccessInput({\n    title: \"HttpProxy\",\n    component: {\n      placeholder: \"http://192.168.x.x:10811\",\n      component: {\n        name: \"a-input\",\n        vModel: \"value\"\n      }\n    },\n    encrypt: false,\n    required: false\n  })\n  httpProxy!: string;\n\n\n  @AccessInput({\n    title: \"测试\",\n    component: {\n      name: \"api-test\",\n      action: \"TestRequest\"\n    },\n    helper: \"点击测试接口是否正常\"\n  })\n  testRequest = true;\n\n  async onTestRequest() {\n      await this.getSSLCertList({size:1});\n      return \"ok\"\n  }\n\n  async getSSLCertList(req:{offset?:number,size?:number}){\n    return await this.doRequest({\n      url: \"/getSSLCertList\",\n      data: req\n    });\n  }\n\n  async findSSLCertConfig(sslCertId: number) {\n    /**\n     * 接口地址\n     * POST /findSSLCertConfig\n     * 🎯 功能说明\n     * 根据证书ID和认证信息查询SSL证书的详细配置信息，包括证书状态、域名绑定、有效期等关键信息。\n     *\n     * 📥 请求参数\n     * 参数名\t类型\t必填\t说明\t示例值\n     * sslCertId\tint\t✅\t证书唯一标识ID\t2106\n     * accessKeyId\tstring\t✅\t访问密钥ID\tu2ZF6k63dFCOS7It\n     * accessKey\tstring\t✅\t访问密钥\tmTGaNRGUFHj3r3YxMrrg5XSGIXd6rBWG',\n     * 响应结构：\n     *\n     * {\n     *   \"code\": 200,\n     *   \"data\": {...},\n     *   \"message\": \"获取成功\"\n     * }\n     */\n\n    const params = {\n      sslCertId,\n    };\n    const res= await this.doRequest({\n      url: \"/findSSLCertConfig\",\n      data: params\n    });\n    this.ctx.logger.info(`找到证书${sslCertId}: name=${res.name},domain=${res.commonNames},dnsNames=${res.dnsNames}`);\n    return res\n  }\n\n  async updateSSLCert(req:{\n    sslCertId: number,\n    cert:CertInfo,\n  }){\n    /**\n     * isOn\tboolean\t✅\t是否启用证书\ttrue\n     * name\tstring\t✅\t证书显示名称\t\"example.com\"\n     * description\tstring\t✅\t证书描述信息\t\"主域名SSL证书\"\n     * serverName\tstring\t✅\t关联的服务器名称\t\"web-server-01\"\n     * isCA\tboolean\t✅\t是否为CA根证书\tfalse\n     * certData\tstring\t✅\t证书内容（PEM格式）\t\"-----BEGIN CERTIFICATE-----...\"\n     * keyData\tstring\t✅\t私钥内容（PEM格式）\t\"-----BEGIN PRIVATE KEY-----...\"\n     * timeBeginAt\tint/long\t✅\t证书生效时间（毫秒时间戳）\t1719830400000\n     * timeEndAt\tint/long\t✅\t证书过期时间（毫秒时间戳）\t1751366400000\n     * dnsNames\tstring[]\t✅\t证书绑定的域名列表\t[\"example.com\", \"*.example.com\"]\n     * commonNames\tstring[]\t✅\t证书的通用名称列表\t[\"example.com\"]\n     */\n\n    const oldCert = await this.findSSLCertConfig(req.sslCertId)\n    const certReader = new CertReader(req.cert)\n    const {detail} = certReader.getCrtDetail();\n    const params = {\n      sslCertId: req.sslCertId,\n      certData: req.cert.crt,\n      keyData: req.cert.key,\n      isOn: true,\n      isCA: false,\n      serverName: oldCert.serverName || certReader.getMainDomain(),\n      commonNames: [certReader.getMainDomain()],\n      dnsNames: certReader.getAltNames(),\n      timeBeginAt: detail.notBefore.getTime(),\n      timeEndAt: detail.notAfter.getTime(),\n      name: oldCert.name|| certReader.buildCertName(),\n      description:oldCert.description||\"\"\n    }\n\n    return await this.doRequest({\n      url: \"/updateSSLCert\",\n      data: params\n    });\n  }\n\n  async doRequest(req:HttpRequestConfig){\n    const params = {\n      ...req.data,\n      accessKeyId: this.accessKeyId,\n      accessKey: this.accessKey\n    };\n    const res =  await this.ctx.http.request({\n      url: req.url,\n      baseURL:this.endpoint,\n      method: \"POST\",\n      data: params,\n      httpProxy: this.httpProxy||undefined,\n    });\n\n    if (res.code === 200) {\n      return res.data;\n    }\n    throw new Error(res.message || res);\n  }\n}\n\n\n\nnew FarcdnAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-farcdn/index.ts",
    "content": "export * from \"./plugins/index.js\";\nexport * from \"./access.js\";\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-farcdn/plugins/index.ts",
    "content": "export * from \"./plugin-refresh-cert.js\";\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-farcdn/plugins/plugin-refresh-cert.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, Pager, PageSearch, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { FarcdnAccess } from \"../access.js\";\n\n@IsTaskPlugin({\n  //命名规范，插件类型+功能（就是目录plugin-demo中的demo），大写字母开头，驼峰命名\n  name: \"FarcdnRefreshCert\",\n  title: \"farcdn-更新证书\",\n  desc:\"www.farcdn.net\",\n  icon: \"svg:icon-lucky\",\n  //插件分组\n  group: pluginGroups.cdn.key,\n  needPlus: false,\n  default: {\n    //默认值配置照抄即可\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\n//类名规范，跟上面插件名称（name）一致\nexport class FarcdnRefreshCert extends AbstractTaskPlugin {\n  //证书选择，此项必须要有\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames]\n    }\n    // required: true, // 必填\n  })\n  cert!: CertInfo;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  //授权选择框\n  @TaskInput({\n    title: \"Farcdn授权\",\n    component: {\n      name: \"access-selector\",\n      type: \"farcdn\" //固定授权类型\n    },\n    required: true //必填\n  })\n  accessId!: string;\n  //\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"证书Id\",\n      helper: \"要更新的Farcdn证书id\",\n\n      action: FarcdnRefreshCert.prototype.onGetCertList.name\n    })\n  )\n  certList!: number[];\n\n  //插件实例化时执行的方法\n  async onInstance() {\n  }\n\n  //插件执行方法\n  async execute(): Promise<void> {\n    const access = await this.getAccess<FarcdnAccess>(this.accessId);\n\n    for (const item of this.certList) {\n      this.logger.info(`----------- 开始更新证书：${item}`);\n      await access.updateSSLCert({\n        sslCertId:item,\n        cert: this.cert,\n      })\n      this.logger.info(`----------- 更新证书${item}成功`);\n    }\n\n    this.logger.info(\"部署完成\");\n  }\n\n  async onGetCertList(data:PageSearch = {}) {\n    const access = await this.getAccess<FarcdnAccess>(this.accessId);\n\n    const pager = new Pager(data);\n    const res = await access.getSSLCertList({\n      offset: pager.getOffset(),\n      size: pager.pageSize,\n    });\n    const list = res.list\n    if (!list || list.length === 0) {\n      throw new Error(\"没有找到证书，请先在控制台上传一次证书且关联网站\");\n    }\n\n    const options = list.map((item: any) => {\n      return {\n        label: `${item.name}<${item.id}>`,\n        value: item.id,\n        domain: item.dnsNames\n      };\n    });\n    return {\n      list:this.ctx.utils.options.buildGroupOptions(options, this.certDomains),\n      total:res.total,\n      pageNo: pager.pageNo,\n      pageSize: pager.pageSize\n    }\n  }\n}\n\n//实例化一下，注册插件\nnew FarcdnRefreshCert();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-flex/access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from \"@certd/pipeline\";\nimport { HttpClient } from \"@certd/basic\";\nimport { FlexCDNClient } from \"./client.js\";\n\n/**\n */\n@IsAccess({\n  name: \"flexcdn\",\n  title: \"FlexCDN授权\",\n  desc: \"\",\n  icon: \"svg:icon-lucky\"\n})\nexport class FlexCDNAccess extends BaseAccess {\n  @AccessInput({\n    title: \"接口地址\",\n    component: {\n      placeholder: \"http://xxxxxxx:8080\",\n      name: \"a-input\",\n      vModel: \"value\"\n    },\n    required: true\n  })\n  endpoint!: string;\n\n  @AccessInput({\n    title: \"用户类型\",\n    component: {\n      placeholder: \"请选择\",\n      name: \"a-select\",\n      vModel: \"value\",\n      options: [\n        {\n          value: \"user\",\n          label: \"普通用户\"\n        },\n        {\n          value: \"admin\",\n          label: \"管理员\"\n        }\n      ]\n    },\n    required: true\n  })\n  type!: string;\n\n  @AccessInput({\n    title: \"accessKeyId\",\n    component: {\n      placeholder: \"accessKeyId\",\n      component: {\n        name: \"a-input\",\n        vModel: \"value\"\n      }\n    },\n    encrypt: false,\n    required: true\n  })\n  accessKeyId!: string;\n\n  @AccessInput({\n    title: \"accessKey\",\n    component: {\n      placeholder: \"accessKey\",\n      component: {\n        name: \"a-input\",\n        vModel: \"value\"\n      }\n    },\n    encrypt: true,\n    required: true\n  })\n  accessKey!: string;\n\n  @AccessInput({\n    title: \"忽略证书校验\",\n    component: {\n      name: \"a-switch\",\n      vModel: \"checked\"\n    },\n    encrypt: false,\n    required: true,\n    value: false,\n  })\n  skipSslVerify!: boolean;\n\n  @AccessInput({\n    title: \"测试\",\n    component: {\n      name: \"api-test\",\n      action: \"TestRequest\"\n    },\n    helper: \"点击测试接口看是否正常\"\n  })\n  testRequest = true;\n\n  async onTestRequest() {\n    const http: HttpClient = this.ctx.http;\n    const client = new FlexCDNClient({\n      logger: this.ctx.logger,\n      http,\n      access: this\n    });\n    const token = await client.getToken();\n    if (token) {\n      return \"ok\";\n    }\n    throw \"测试失败，未知错误\";\n  }\n}\n\nnew FlexCDNAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-flex/client.ts",
    "content": "import { HttpClient, HttpRequestConfig, ILogger } from \"@certd/basic\";\nimport { FlexCDNAccess } from \"./access.js\";\n\nexport class FlexCDNClient {\n  http: HttpClient;\n  logger: ILogger;\n  access: FlexCDNAccess;\n  token: string;\n\n  constructor(opts: { logger: ILogger; http: HttpClient; access: FlexCDNAccess }) {\n    this.logger = opts.logger;\n    this.http = opts.http;\n    this.access = opts.access;\n  }\n\n  async getToken() {\n\n    /*\n    步骤2：调用API获取AccessToken\n接口地址\n/APIAccessTokenService/getAPIAccessToken\n请求方法\nPOST。\n\n请求参数\n{\n    \"type\": \"admin\",\n    \"accessKeyId\": \"zr9cmR42AEZxRyIV\",\n    \"accessKey\": \"2w5p5NSZZuplUPsfPMzM7dFmTrI7xyja\"\n}\n其中\ntype - 如果是用户（即平台用户）AccessKey，则值为 user；如果是管理员（即系统用户）AccessKey，则值为 admin；\naccessKeyId 和 accessKey 换成你在步骤1中创建的AccessKey对应的数据。\n响应结果\n{\n   \"code\": 200,\n   \"data\": {\n      \"token\": \"IKNSMufZ1vDiXp5rSd9QR01m1174Oum5sah4amWFgbRb7lOKjuk62Spl7hgcazctzGhGG7jPgfmYUPojulC0FK5cLbrj8n7kxW7BtSawH9gWW14IWOzBY6UcpyXQndFu\",\n      \"expiresAt\": 1609686945\n   },\n   \"message\": \"ok\"\n}\n     */\n\n    const res = await this.doRequest({\n      url: \"/APIAccessTokenService/getAPIAccessToken\",\n      method: \"POST\",\n      data: {\n        type: this.access.type,\n        accessKeyId: this.access.accessKeyId,\n        accessKey: this.access.accessKey,\n      },\n    });\n    this.token = res.token\n    return this.token\n  }\n\n  async doRequest(req: HttpRequestConfig) {\n\n    const headers = {\n      ...req.headers,\n    }\n    if(this.token){\n      headers[ \"X-Cloud-Access-Token\"] = this.token\n    }\n    const res = await this.http.request({\n      ...req,\n      headers,\n      baseURL: this.access.endpoint,\n      logRes:false,\n      logParams:false,\n      skipSslVerify: true,\n    });\n    if (res.code === 200) {\n      return res.data;\n    } else {\n      throw new Error(res.message);\n    }\n  }\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-flex/index.ts",
    "content": "export * from \"./plugins/index.js\";\nexport * from \"./access.js\";\nexport * from \"./client.js\";\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-flex/plugins/index.ts",
    "content": "export * from \"./plugin-refresh-cert.js\";\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-flex/plugins/plugin-refresh-cert.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo,CertReader } from \"@certd/plugin-cert\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { FlexCDNAccess } from \"../access.js\";\nimport { FlexCDNClient } from \"../client.js\";\n\n@IsTaskPlugin({\n  //命名规范，插件类型+功能（就是目录plugin-demo中的demo），大写字母开头，驼峰命名\n  name: \"FlexCDNRefreshCert\",\n  title: \"FlexCDN-更新证书\",\n  icon: \"svg:icon-lucky\",\n  //插件分组\n  group: pluginGroups.cdn.key,\n  needPlus: false,\n  default: {\n    //默认值配置照抄即可\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\n//类名规范，跟上面插件名称（name）一致\nexport class FlexCDNRefreshCert extends AbstractTaskPlugin {\n  //证书选择，此项必须要有\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames]\n    }\n    // required: true, // 必填\n  })\n  cert!: CertInfo;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  //授权选择框\n  @TaskInput({\n    title: \"FlexCDN授权\",\n    component: {\n      name: \"access-selector\",\n      type: \"flexcdn\" //固定授权类型\n    },\n    required: true //必填\n  })\n  accessId!: string;\n  //\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"证书Id\",\n      helper: \"要更新的Flex证书id\",\n      action: FlexCDNRefreshCert.prototype.onGetCertList.name\n    })\n  )\n  certList!: number[];\n\n  //插件实例化时执行的方法\n  async onInstance() {\n  }\n\n  //插件执行方法\n  async execute(): Promise<void> {\n    const access: FlexCDNAccess = await this.getAccess<FlexCDNAccess>(this.accessId);\n\n    const client = new FlexCDNClient({\n      http: this.ctx.http,\n      logger: this.logger,\n      access\n    });\n    await client.getToken();\n    for (const item of this.certList) {\n      this.logger.info(`----------- 开始更新证书：${item}`);\n\n      const res = await client.doRequest({\n        url: `/SSLCertService/findEnabledSSLCertConfig`,\n        data: {\n          sslCertId: item\n        }\n      });\n\n      const sslCert = JSON.parse(this.ctx.utils.hash.base64Decode(res.sslCertJSON))\n      this.logger.info(`证书信息：${sslCert.name}，${sslCert.dnsNames}`);\n      const certReader = new CertReader(this.cert)\n      /**\n       *   commonNames: commonNames,\n       *       dnsNames: dnsNames,\n       *       timeBeginAt: Math.floor((new Date(currentInfo.validFrom)).getTime() / 1000),\n       *       timeEndAt: Math.floor((new Date(currentInfo.validTo)).getTime() / 1000),\n       *\n       */\n      const topCrt =  CertReader.readCertDetail(certReader.cert.ic)\n      const commonNames =[ topCrt.detail.issuer.commonName]\n      const dnsNames = certReader.getAllDomains()\n      const timeBeginAt = Math.floor(certReader.detail.notBefore.getTime()  / 1000);\n      const timeEndAt = Math.floor(certReader.detail.notAfter.getTime()  / 1000);\n      const body = {\n        ...sslCert, // inherit old cert info like name and description\n        commonNames,\n        dnsNames,\n        timeBeginAt,\n        timeEndAt,\n        name: sslCert.name,\n        sslCertId: item,\n        certData: this.ctx.utils.hash.base64(this.cert.crt),\n        keyData: this.ctx.utils.hash.base64(this.cert.key)\n      };\n      await client.doRequest({\n        url: `/SSLCertService/updateSSLCert`,\n        data: {\n          ...body\n        }\n      });\n\n      this.logger.info(`----------- 更新证书${item}成功`);\n    }\n\n    this.logger.info(\"部署完成\");\n  }\n\n  async onGetCertList() {\n    const access: FlexCDNAccess = await this.getAccess<FlexCDNAccess>(this.accessId);\n    const client = new FlexCDNClient({\n      http: this.ctx.http,\n      logger: this.logger,\n      access\n    });\n    await client.getToken();\n    const res = await client.doRequest({\n      url: \"/SSLCertService/listSSLCerts\",\n      data: { size: 1000 },\n      method: \"POST\"\n    });\n    const list = JSON.parse(this.ctx.utils.hash.base64Decode(res.sslCertsJSON));\n    if (!list || list.length === 0) {\n      throw new Error(\"没有找到证书，请先在控制台上传一次证书且关联网站\");\n    }\n\n    const options = list.map((item: any) => {\n      return {\n        label: `${item.name}<${item.id}-${item.dnsNames?.[0]}>`,\n        value: item.id,\n        domain: item.dnsNames\n      };\n    });\n    return this.ctx.utils.options.buildGroupOptions(options, this.certDomains);\n  }\n}\n\n//实例化一下，注册插件\nnew FlexCDNRefreshCert();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-fnos/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo, CertReader } from \"@certd/plugin-cert\";\nimport {\n  createCertDomainGetterInputDefine,\n  createRemoteSelectInputDefine,\n  SshAccess,\n  SshClient\n} from \"@certd/plugin-lib\";\nimport path from \"node:path\";\n\n@IsTaskPlugin({\n  //命名规范，插件类型+功能（就是目录plugin-demo中的demo），大写字母开头，驼峰命名\n  name: \"FnOSDeployToNAS\",\n  title: \"飞牛NAS-部署证书\",\n  icon: \"svg:icon-lucky\",\n  //插件分组\n  group: pluginGroups.panel.key,\n  needPlus: false,\n  default: {\n    //默认值配置照抄即可\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\n//类名规范，跟上面插件名称（name）一致\nexport class FnOSDeployToNAS extends AbstractTaskPlugin {\n  //证书选择，此项必须要有\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames]\n    }\n    // required: true, // 必填\n  })\n  cert!: CertInfo;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  //授权选择框\n  @TaskInput({\n    title: \"飞牛SSH授权\",\n    component: {\n      name: \"access-selector\",\n      type: \"ssh\" //固定授权类型\n    },\n    helper:\"请先配置sudo免密：\\nsudo visudo\\n#在文件最后一行增加以下内容，需要将username替换成自己的用户名\\nusername ALL=(ALL) NOPASSWD: NOPASSWD: ALL\\nctrl+x 保存退出\",\n    required: true //必填\n  })\n  accessId!: string;\n\n\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"证书Id\",\n      helper: \"要更新的证书id\",\n      action: FnOSDeployToNAS.prototype.onGetCertList.name\n    })\n  )\n  certList!: number[];\n\n  //插件实例化时执行的方法\n  async onInstance() {\n  }\n\n  //插件执行方法\n  async execute(): Promise<void> {\n    const access: SshAccess = await this.getAccess<SshAccess>(this.accessId);\n\n    const client = new SshClient(this.logger);\n\n    //复制证书\n    const list = await this.doGetCertList()\n\n    const certReader = new CertReader(this.cert);\n    const expiresAt = certReader.expires;\n    const validFrom = certReader.detail.notBefore.getTime()\n    for (const target of this.certList) {\n      this.logger.info(`----------- 准备部署：${target}`);\n      let found = false\n      for (const item of list) {\n        if (item.sum === target) {\n          this.logger.info(`----------- 找到证书,开始部署：${item.sum},${item.domain}`)\n          const certPath = item.certificate;\n          const keyPath = item.privateKey;\n          const certDir = path.dirname(keyPath)\n          const cmd = `\nsudo tee ${certPath} > /dev/null <<'EOF'\n${this.cert.crt}\nEOF\nsudo tee ${keyPath} > /dev/null <<'EOF'\n${this.cert.key}\nEOF\n\nsudo chmod 0755 \"${certDir}/\" -R\n\nsudo -u postgres psql -d trim_connect -c \"UPDATE cert SET  valid_to=${expiresAt},valid_from=${validFrom} WHERE private_key='${item.privateKey}'\"\n\n`\n          const res = await client.exec({\n          connectConf: access,\n          script: cmd\n        });\n          if (res.indexOf(\"Permission denied\") > -1){\n              this.logger.error(\"权限不足，请先配置 sudo 免密\")\n          }\n          found = true\n          break\n        }\n      }\n      if (!found) {\n        throw new Error(`没有找到证书：${target}，请修改任务重新选择证书id`);\n      }\n    }\n\n\n    this.logger.info(\"证书已上传，准备重启...\");\n\n\n    const restartCmd= `\necho \"正在重启相关服务...\"\nsudo systemctl restart webdav.service\nsudo systemctl restart smbftpd.service\nsudo systemctl restart trim_nginx.service\necho \"服务重启完成！\"\n`\n    await client.exec({\n      connectConf: access,\n      script: restartCmd\n    });\n\n    this.logger.info(\"部署完成\");\n  }\n\n  async doGetCertList(){\n    const access: SshAccess = await this.getAccess<SshAccess>(this.accessId);\n    const client = new SshClient(this.logger);\n\n    /**\n     * :/usr/trim/etc$ cat network_cert_all.conf | jq .\n     */\n    const sslListCmd = \"cat /usr/trim/etc/network_cert_all.conf | jq .\"\n\n    const res:string = await client.exec({\n      connectConf: access,\n      script: sslListCmd\n    });\n    let list = []\n    try{\n      list = JSON.parse(res.trim())\n    }catch (e){\n      throw new Error(`证书列表解析失败：${res}`)\n    }\n\n    if (!list || list.length === 0) {\n      throw new Error(\"没有找到证书，请先在证书管理也没上传一次证书\");\n    }\n    return list\n  }\n\n  async onGetCertList() {\n\n    const list = await this.doGetCertList()\n\n    const options = list.map((item: any) => {\n      return {\n        label: `${item.domain}<${item.used?'已使用':\"未使用\"}-${item.sum}>`,\n        value: item.sum,\n        domain: item.san\n      };\n    });\n    return this.ctx.utils.options.buildGroupOptions(options, this.certDomains);\n  }\n}\n\nnew FnOSDeployToNAS();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-gcore/access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from '@certd/pipeline';\n\n@IsAccess({\n  name: 'Gcore',\n  title: 'Gcore',\n  desc: 'Gcore',\n  icon: 'clarity:plugin-line',\n})\nexport class GcoreAccess extends BaseAccess {\n  @AccessInput({\n    title: 'username',\n    component: {\n      placeholder: 'username',\n    },\n    required: true,\n  })\n  username = '';\n  @AccessInput({\n    title: 'password',\n    component: {\n      placeholder: 'password',\n    },\n    required: true,\n    encrypt: true,\n  })\n  password = '';\n  @AccessInput({\n    title: 'totp key',\n    component: {\n      placeholder: 'totp key',\n    },\n    encrypt: true,\n  })\n  otpkey = '';\n}\n\nnew GcoreAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-gcore/index.ts",
    "content": "export * from './plugins/index.js';\nexport * from './access.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-gcore/plugins/index.ts",
    "content": "export * from './plugin-upload.js';\nexport * from './plugin-flush.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-gcore/plugins/plugin-flush.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { CertInfo } from '@certd/plugin-cert';\nimport { GcoreAccess } from '../access.js';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'Gcoreflush',\n  title: 'Gcore-刷新Gcore证书',\n  desc: '刷新现有的证书',\n  icon: 'clarity:plugin-line',\n  group: pluginGroups.cdn.key,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class GcoreflushPlugin extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '证书名称',\n    helper: '可以修改也可以和现在的保留一致',\n  })\n  certName!: string;\n  @TaskInput({\n    title: '证书ID',\n  })\n  ssl_id!: string;\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n  @TaskInput({\n    title: 'Access授权',\n    helper: 'Gcore',\n    component: {\n      name: 'access-selector',\n      type: 'Gcore',\n    },\n    required: true,\n  })\n  accessId!: string;\n  private readonly baseApi = 'https://api.gcore.com';\n\n  async onInstance() {}\n\n  private async doRequestApi(url: string, data: any = null, method = 'post', token: string | null = null) {\n    const headers = {\n      'Content-Type': 'application/json',\n      ...(token ? { authorization: `Bearer ${token}` } : {}),\n    };\n    const res = await this.http.request<any, any>({\n      url,\n      method,\n      data,\n      headers,\n    });\n\n    return res;\n  }\n\n  async execute(): Promise<void> {\n    const { cert, accessId } = this;\n    const access = (await this.getAccess(accessId)) as GcoreAccess;\n    let otp = null;\n    if (access.otpkey) {\n      const response = await this.http.request<any, any>({\n        url: `https://cn-api.my-api.cn/api/totp/?key=${access.otpkey}`,\n        method: 'get',\n      });\n      otp = response;\n      this.logger.info('获取到otp:', otp);\n    }\n    const loginResponse = await this.doRequestApi(`${this.baseApi}/iam/auth/jwt/login`, {\n      username: access.username,\n      password: access.password,\n      ...(otp && { otp }),\n    });\n    const token = loginResponse.access;\n    this.logger.info('Token 获取成功');\n    this.logger.info('开始上传证书');\n    await this.doRequestApi(\n      `${this.baseApi}/cdn/sslData/${this.ssl_id}`,\n      {\n        name: this.certName,\n        sslCertificate: cert.crt,\n        sslPrivateKey: cert.key,\n        validate_root_ca: true,\n      },\n      'put',\n      token\n    );\n    this.logger.info('证书部署成功');\n  }\n}\n\nnew GcoreflushPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-gcore/plugins/plugin-upload.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { CertInfo } from '@certd/plugin-cert';\nimport { GcoreAccess } from '../access.js';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'Gcoreupload',\n  title: 'Gcore-部署证书到Gcore',\n  desc: '仅上传 并不会部署到cdn',\n  icon: 'clarity:plugin-line',\n  group: pluginGroups.cdn.key,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class GcoreuploadPlugin extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '证书名称',\n    helper: '作为备注',\n  })\n  certName!: string;\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n  @TaskInput({\n    title: 'Access授权',\n    helper: 'Gcore',\n    component: {\n      name: 'access-selector',\n      type: 'Gcore',\n    },\n    required: true,\n  })\n  accessId!: string;\n  private readonly baseApi = 'https://api.gcore.com';\n\n  async onInstance() {}\n\n  private async doRequestApi(url: string, data: any = null, method = 'post', token: string | null = null) {\n    const headers = {\n      'Content-Type': 'application/json',\n      ...(token ? { authorization: `Bearer ${token}` } : {}),\n    };\n    const res = await this.http.request<any, any>({\n      url,\n      method,\n      data,\n      headers,\n    });\n\n    return res;\n  }\n\n  async execute(): Promise<void> {\n    const { cert, accessId } = this;\n    const access = (await this.getAccess(accessId)) as GcoreAccess;\n    let otp = null;\n    if (access.otpkey) {\n      const response = await this.http.request<any, any>({\n        url: `https://cn-api.my-api.cn/api/totp/?key=${access.otpkey}`,\n        method: 'get',\n      });\n      otp = response;\n      this.logger.info('获取到otp:', otp);\n    }\n    const loginResponse = await this.doRequestApi(`${this.baseApi}/iam/auth/jwt/login`, {\n      username: access.username,\n      password: access.password,\n      ...(otp && { otp }),\n    });\n    const token = loginResponse.access;\n    this.logger.info('Token 获取成功');\n    this.logger.info('开始上传证书');\n    await this.doRequestApi(\n      `${this.baseApi}/cdn/sslData`,\n      {\n        name: this.certName,\n        sslCertificate: cert.crt,\n        sslPrivateKey: cert.key,\n        validate_root_ca: true,\n      },\n      'post',\n      token\n    );\n    this.logger.info('证书上传成功');\n  }\n}\n\nnew GcoreuploadPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-github/access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from \"@certd/pipeline\";\nimport { HttpRequestConfig } from \"@certd/basic\";\n\n\n/**\n */\n@IsAccess({\n  name: \"github\",\n  title: \"Github授权\",\n  desc: \"\",\n  icon: \"ion:logo-github\"\n})\nexport class GithubAccess extends BaseAccess {\n\n  @AccessInput({\n    title: \"接口地址\",\n    component: {\n      placeholder: \"可以使用反向代理地址\",\n      component: {\n        name: \"a-input\",\n        vModel: \"value\"\n      }\n    },\n    helper:\"默认值：https://api.github.com\",\n    encrypt: false,\n    required: false\n  })\n  endpoint!: string;\n\n  @AccessInput({\n    title: \"GithubToken\",\n    component: {\n      placeholder: \"GithubToken\",\n      component: {\n        name: \"a-input\",\n        vModel: \"value\"\n      }\n    },\n    helper:\"支持匿名访问的接口可以不填\",\n    encrypt: true,\n    required: false\n  })\n  githubToken!: string;\n\n  @AccessInput({\n    title: \"HttpProxy\",\n    component: {\n      placeholder: \"http://192.168.x.x:10811\",\n      component: {\n        name: \"a-input\",\n        vModel: \"value\"\n      }\n    },\n    encrypt: false,\n    required: false\n  })\n  httpProxy!: string;\n\n\n  @AccessInput({\n    title: \"测试\",\n    component: {\n      name: \"api-test\",\n      action: \"TestRequest\"\n    },\n    helper: \"点击测试接口是否正常\"\n  })\n  testRequest = true;\n\n  async onTestRequest() {\n      await this.getRelease({repoName:\"certd/certd\"})\n      return \"ok\"\n  }\n\n  async getRelease(req:{repoName:string}){\n        const url = `/repos/${req.repoName}/releases/latest`;\n        return await this.doRequest({\n          url,\n          method: \"GET\",\n          data:{}\n        });\n  }\n\n\n  async doRequest(req:HttpRequestConfig){\n    /**\n     * async function getLatestRelease() {\n     *   const { REPO_OWNER, REPO_NAME, API_URL, TOKEN } = CONFIG.GITHUB;\n     *   const url = `${API_URL}/${REPO_OWNER}/${REPO_NAME}/releases/latest`;\n     *\n     *   try {\n     *     const response = await axios.get(url, {\n     *       headers: TOKEN ? { Authorization: `token ${TOKEN}` } : {}\n     *     });\n     *\n     *     return {\n     *         tag_name: response.data.tag_name,\n     *         name: response.data.name || '无标题',\n     *         body: response.data.body || '无描述内容',\n     *         html_url: response.data.html_url,\n     *         published_at: new Date(response.data.published_at).toLocaleString(),\n     *         assets: response.data.assets.map(a => ({\n     *           name: a.name,\n     *           download_url: a.browser_download_url\n     *         }))\n     *     };\n     *   } catch (error) {\n     *     if (error.response?.status === 404) {\n     *       return { success: false, error: '仓库未找到或没有Release' };\n     *     }\n     *     return { success: false, error: `请求失败: ${error.message}` };\n     *   }\n     * }\n     */\n\n    const headers:any = {}\n    if(this.githubToken){\n      headers.Authorization = `token ${this.githubToken}`\n    }\n    const baseURL= this.endpoint || \"https://api.github.com\";\n    const res =  await this.ctx.http.request({\n      url: req.url,\n      baseURL,\n      method: req.method || \"POST\",\n      data: req.data,\n      headers,\n      httpProxy: this.httpProxy||undefined,\n    });\n\n    if (res) {\n      return res;\n    }\n    throw new Error(res.message || res);\n  }\n}\n\n\n\nnew GithubAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-github/index.ts",
    "content": "export * from \"./plugins/index.js\";\nexport * from \"./access.js\";\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-github/plugins/index.ts",
    "content": "export * from \"./plugin-check-release.js\";\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-github/plugins/plugin-check-release.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from \"@certd/pipeline\";\nimport { GithubAccess } from \"../access.js\";\nimport {SshClient} from \"@certd/plugin-lib\";\n\n@IsTaskPlugin({\n  //命名规范，插件类型+功能（就是目录plugin-demo中的demo），大写字母开头，驼峰命名\n  name: \"GithubCheckRelease\",\n  title: \"Github-检查Release版本\",\n  desc:\"检查最新Release版本并推送消息\",\n  icon: \"ion:logo-github\",\n  //插件分组\n  group: pluginGroups.other.key,\n  needPlus: false,\n  default: {\n    //默认值配置照抄即可\n    strategy: {\n      runStrategy: RunStrategy.AlwaysRun\n    }\n  }\n})\n//类名规范，跟上面插件名称（name）一致\nexport class GithubCheckRelease extends AbstractTaskPlugin {\n  //授权选择框\n  @TaskInput({\n    title: \"Github授权\",\n    component: {\n      name: \"access-selector\",\n      type: \"github\" //固定授权类型\n    },\n    required: true //必填\n  })\n  accessId!: string;\n\n\n  @TaskInput({\n    title: \"仓库名称\",\n    helper:\"owner/name，比如 certd/certd\",\n    required:true,\n  })\n  repoName!: string;\n\n  @TaskInput({\n    title: \"通知渠道\",\n    component:{\n        name:\"notification-selector\",\n        select:{\n          mode:\"tags\"\n        }\n    },\n    required:false,\n  })\n  notificationIds!: number[];\n\n  @TaskOutput({\n    title: \"最后版本\",\n  })\n  lastVersion?: string;\n\n\n  @TaskInput({\n    title: '主机登录配置',\n    helper: '登录',\n    component: {\n      name: 'access-selector',\n      type: 'ssh',\n    },\n    required: false,\n  })\n  sshAccessId!: string;\n\n  @TaskInput({\n    title: 'shell脚本命令',\n    component: {\n      name: 'a-textarea',\n      vModel: 'value',\n      rows: 6,\n      placeholder: `\n# 拉取最新镜像\ndocker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest\n# 升级容器命令， 替换成你自己的实际部署位置及更新命令\nexport RESTART_CERT='sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d'\n# 构造一个脚本10s后在后台执行，避免容器销毁时执行太快，导致流水线任务无法结束\nnohup sh -c '$RESTART_CERT' >/dev/null  2>&1 & echo '10秒后重启' && exit`,\n    },\n    helper: `有新版本后执行命令，比如：拉取最新版镜像，然后重建容器\n注意：自己升级自己需要使用nohup配合sleep\n自动升级命令示例：\ndocker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest\nexport RESTART_CERT='sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d'\nnohup sh -c '$RESTART_CERT' >/dev/null  2>&1 & echo '10秒后重启' && exit\n`,\n    required: false,\n  })\n  script!: string;\n\n\n  //插件实例化时执行的方法\n  async onInstance() {\n  }\n\n  //插件执行方法\n  async execute(): Promise<string> {\n    const access = await this.getAccess<GithubAccess>(this.accessId);\n    const res = await access.getRelease({repoName:this.repoName})\n    if(res == null){\n      throw new Error(`获取${this.repoName}最新版本失败`)\n    }\n    const lastVersion = this.ctx.lastStatus?.status?.output?.lastVersion;\n\n    if(res.tag_name == null || res.tag_name ==lastVersion){\n      this.logger.info(`暂无更新，${res.tag_name}`);\n      this.lastVersion = res.tag_name || lastVersion;\n      return \"skip\"\n    }\n    //有更新\n    this.logger.info(`有更新,${lastVersion??\"0\"}->${res.tag_name}`)\n    this.lastVersion = res.tag_name;\n\n    // const body = res.body.replaceAll(\"* \",\"- \")\n    //仅每行开头的* 替换成 -， *号前面可以有空格\n    const body = res.body.replace(/^(\\s*)\\* /gm, \"$1- \")\n\n    if (this.notificationIds && this.notificationIds.length > 0){\n      //发送通知\n      for (const notificationId of this.notificationIds) {\n        await this.ctx.notificationService.send({\n          id: notificationId,\n          useDefault: false,\n          useEmail:false,\n          logger: this.logger,\n          body: {\n            title: `${this.repoName} 新版本 ${this.lastVersion} 发布`,\n            content: `${body}\\n\\n > [Certd](https://certd.docmirror.cn)，不止证书自动化，插件解锁无限可能！\\n\\n`,\n            url: `https://github.com/${this.repoName}/releases/tag/${this.lastVersion}`,\n          }\n        })\n      }\n    }\n\n\n    if (this.script != null && this.script.trim() != \"\") {\n      const connectConf = await this.getAccess(this.sshAccessId);\n      const sshClient = new SshClient(this.logger);\n      const scripts = this.script.split('\\n');\n      await sshClient.exec({\n        connectConf,\n        script: scripts,\n        env: {\n          REPO: this.repoName,\n          LAST_VERSION: this.lastVersion,\n        }\n      });\n    }\n\n  }\n\n}\n\nnew GithubCheckRelease();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-host/index.ts",
    "content": "export * from './plugin/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-host/plugin/copy-to-local/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from '@certd/pipeline';\nimport { CertInfo, CertReader } from '@certd/plugin-cert';\nimport * as fs from 'fs';\nimport path from 'path';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\nconst dataDir = \"./data\"\n@IsTaskPlugin({\n  name: 'CopyToLocal',\n  title: '主机-复制到本机',\n  icon: 'solar:copy-bold-duotone',\n  desc: '【仅管理员使用】实际上是复制证书到docker容器内的某个路径，需要做目录映射到宿主机',\n  group: pluginGroups.host.key,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class CopyCertToLocalPlugin extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n\n  @TaskInput({\n    title: '证书类型',\n    helper: '要部署的证书格式，支持pem、pfx、der、jks格式',\n    component: {\n      name: 'a-select',\n      options: [\n        { value: 'pem', label: 'pem(crt)，用于Nginx等大部分应用' },\n        { value: 'pfx', label: 'pfx，一般用于IIS' },\n        { value: 'der', label: 'der，一般用于Apache' },\n        { value: 'jks', label: 'jks，一般用于JAVA应用' },\n      ],\n    },\n    required: true,\n  })\n  certType!: string;\n\n  @TaskInput({\n    title: '证书保存路径',\n    helper: '全链证书，路径要包含文件名' + '\\n推荐使用相对路径，将写入与数据库同级目录，无需映射，例如：tmp/cert.pem',\n    component: {\n      placeholder: 'tmp/full_chain.pem',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'pem';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  crtPath!: string;\n  @TaskInput({\n    title: '私钥保存路径',\n    helper: '路径要包含文件名\\n推荐使用相对路径，将写入与数据库同级目录，无需映射，例如：tmp/cert.key',\n    component: {\n      placeholder: 'tmp/cert.key',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'pem';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  keyPath!: string;\n\n  @TaskInput({\n    title: '中间证书保存路径',\n    helper: '路径要包含文件名，一般情况传上面两个文件就行了，极少数情况需要这个中间证书',\n    component: {\n      placeholder: '/root/deploy/nginx/intermediate.pem',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'pem';\n        })\n      }\n    `,\n    rules: [{ type: 'filepath' }],\n  })\n  icPath!: string;\n\n  @TaskInput({\n    title: 'PFX证书保存路径',\n    helper: '用于IIS证书部署，路径要包含文件名\\n推荐使用相对路径，将写入与数据库同级目录，无需映射，例如：tmp/cert.pfx',\n    component: {\n      placeholder: 'tmp/cert.pfx',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'pfx';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  pfxPath!: string;\n\n  @TaskInput({\n    title: 'DER证书保存路径',\n    helper:\n      '用于Apache证书部署，路径要包含文件名\\n推荐使用相对路径，将写入与数据库同级目录，无需映射，例如：tmp/cert.der\\n.der和.cer是相同的东西，改个后缀名即可',\n    component: {\n      placeholder: 'tmp/cert.der 或 tmp/cert.cer',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'der';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  derPath!: string;\n\n  @TaskInput({\n    title: 'jks证书保存路径',\n    helper: '用于java，路径要包含文件名，例如：tmp/cert.jks',\n    component: {\n      placeholder: 'tmp/cert.jks',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'jks';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  jksPath!: string;\n\n  @TaskOutput({\n    title: '证书保存路径',\n    type: 'HostCrtPath',\n  })\n  hostCrtPath!: string;\n\n  @TaskOutput({\n    title: '私钥保存路径',\n    type: 'HostKeyPath',\n  })\n  hostKeyPath!: string;\n\n  @TaskOutput({\n    title: '中间证书保存路径',\n    type: 'HostKeyPath',\n  })\n  hostIcPath!: string;\n\n  @TaskOutput({\n    title: 'PFX保存路径',\n    type: 'HostPfxPath',\n  })\n  hostPfxPath!: string;\n\n  @TaskOutput({\n    title: 'DER保存路径',\n    type: 'HostDerPath',\n  })\n  hostDerPath!: string;\n\n  @TaskOutput({\n    title: 'jks保存路径',\n    type: 'HostJksPath',\n  })\n  hostJksPath!: string;\n\n  async onInstance() {}\n\n  copyFile(srcFile: string, destFile: string) {\n    this.logger.info(`复制文件：${srcFile} => ${destFile}`);\n    const dir = path.dirname(destFile);\n    if (!fs.existsSync(dir)) {\n      fs.mkdirSync(dir, { recursive: true });\n    }\n    fs.copyFileSync(srcFile, destFile);\n  }\n  async execute(): Promise<void> {\n    if (!this.isAdmin()) {\n      throw new Error('只有管理员才能运行此任务');\n    }\n\n    let { crtPath, keyPath, icPath, pfxPath, derPath, jksPath } = this;\n    const certReader = new CertReader(this.cert);\n\n    const handle = async ({ reader, tmpCrtPath, tmpKeyPath, tmpDerPath, tmpPfxPath, tmpIcPath, tmpJksPath }) => {\n      this.logger.info('复制到目标路径');\n      if (crtPath) {\n        crtPath = crtPath.trim();\n        crtPath = crtPath.startsWith('/') ? crtPath : path.join(dataDir, crtPath);\n        this.copyFile(tmpCrtPath, crtPath);\n        this.hostCrtPath = crtPath;\n      }\n      if (keyPath) {\n        keyPath = keyPath.trim();\n        keyPath = keyPath.startsWith('/') ? keyPath : path.join(dataDir, keyPath);\n        this.copyFile(tmpKeyPath, keyPath);\n        this.hostKeyPath = keyPath;\n      }\n      if (icPath) {\n        icPath = icPath.trim();\n        icPath = icPath.startsWith('/') ? icPath : path.join(dataDir, icPath);\n        this.copyFile(tmpIcPath, icPath);\n        this.hostIcPath = icPath;\n      }\n      if (pfxPath) {\n        pfxPath = pfxPath.trim();\n        pfxPath = pfxPath.startsWith('/') ? pfxPath : path.join(dataDir, pfxPath);\n        this.copyFile(tmpPfxPath, pfxPath);\n        this.hostPfxPath = pfxPath;\n      }\n      if (derPath) {\n        derPath = derPath.trim();\n        derPath = derPath.startsWith('/') ? derPath : path.join(dataDir, derPath);\n        this.copyFile(tmpDerPath, derPath);\n        this.hostDerPath = derPath;\n      }\n      if (jksPath) {\n        jksPath = jksPath.trim();\n        jksPath = jksPath.startsWith('/') ? jksPath : path.join(dataDir, jksPath);\n        this.copyFile(tmpJksPath, jksPath);\n        this.hostJksPath = jksPath;\n      }\n      this.logger.info('请注意，如果使用的是相对路径，那么文件就在你的数据库同级目录下，默认是/data/certd/下面');\n      this.logger.info(\n        '请注意，如果使用的是绝对路径，文件在容器内的目录下，你需要给容器做目录映射才能复制到宿主机，需要在docker-compose.yaml中配置主机目录映射： volumes: /你宿主机的路径:/任务配置的证书路径'\n      );\n    };\n\n    await certReader.readCertFile({ logger: this.logger, handle });\n\n    this.logger.info('执行完成');\n  }\n}\n\nnew CopyCertToLocalPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-host/plugin/host-shell-execute/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { SshClient } from '@certd/plugin-lib';\n@IsTaskPlugin({\n  name: 'hostShellExecute',\n  title: '主机-执行远程主机脚本命令',\n  icon: 'tabler:brand-powershell',\n  group: pluginGroups.host.key,\n  desc: '可以执行重启nginx等操作让证书生效',\n  input: {},\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n  output: {},\n})\nexport class HostShellExecutePlugin extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '主机登录配置',\n    helper: '登录',\n    component: {\n      name: 'access-selector',\n      type: 'ssh',\n    },\n    required: true,\n  })\n  accessId!: string;\n  @TaskInput({\n    title: 'shell脚本命令',\n    component: {\n      name: 'a-textarea',\n      vModel: 'value',\n      rows: 6,\n      placeholder: 'systemctl restart nginx',\n    },\n    helper: '注意：如果目标主机是windows，且终端是cmd，系统会自动将多行命令通过“&&”连接成一行',\n    required: true,\n  })\n  script!: string;\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    const { script, accessId } = this;\n    const connectConf = await this.getAccess(accessId);\n    const sshClient = new SshClient(this.logger);\n\n    const scripts = script.split('\\n');\n    await sshClient.exec({\n      connectConf,\n      script: scripts,\n    });\n    // this.logger.info('exec res:', ret);\n  }\n}\n\nnew HostShellExecutePlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-host/plugin/index.ts",
    "content": "export * from './host-shell-execute/index.js';\nexport * from './upload-to-host/index.js';\nexport * from './copy-to-local/index.js'\nexport * from './plugin-upload-to-oss.js'\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-host/plugin/plugin-upload-to-oss.ts",
    "content": "import {AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput} from '@certd/pipeline';\nimport {CertInfo} from \"@certd/plugin-cert\";\nimport {ossClientFactory} from \"@certd/plugin-lib\";\nimport {utils} from \"@certd/basic\";\n\n@IsTaskPlugin({\n  name: 'UploadCertToOss',\n  title: '上传证书到对象存储OSS',\n  icon: 'ion:cloud-upload-outline',\n  desc: '支持阿里云OSS、腾讯云COS、七牛云KODO、S3、MinIO、FTP、SFTP',\n  group: pluginGroups.host.key,\n  showRunStrategy:false,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class UploadCertToOssPlugin extends AbstractTaskPlugin {\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [\":cert:\"],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n\n\n  @TaskInput({\n    title: 'OSS类型',\n    component: {\n      name: 'a-select',\n      vModel:\"value\",\n      options: [\n        { label: \"阿里云OSS\", value: \"alioss\" },\n        { label: \"腾讯云COS\", value: \"tencentcos\" },\n        { label: \"七牛OSS\", value: \"qiniuoss\" },\n        { label: \"S3/Minio\", value: \"s3\" },\n        { label: \"SFTP\", value: \"sftp\" },\n        { label: \"FTP\", value: \"ftp\" },\n      ]\n    },\n    required: true,\n  })\n  uploaderType!: string;\n\n\n  @TaskInput({\n    title: 'OSS授权',\n    component: {\n      name: 'access-selector',\n    },\n    required: true,\n    mergeScript: `\n      return {\n        component: {\n        type: ctx.compute(({form})=>{\n            return form.uploaderType;\n          })\n        }\n      }\n    `,\n  })\n  accessId!: string;\n\n\n  @TaskInput({\n    title: '证书格式',\n    helper: '要部署的证书格式，支持pem、pfx、der、jks',\n    component: {\n      name: 'a-select',\n      options: [\n        { value: 'pem', label: 'pem（crt），Nginx等大部分应用' },\n        { value: 'pfx', label: 'pfx，一般用于IIS' },\n        { value: 'der', label: 'der，一般用于Apache' },\n        { value: 'jks', label: 'jks，一般用于JAVA应用' },\n        { value: 'one', label: '证书私钥一体，crt+key简单合并为一个pem文件' },\n      ],\n    },\n    required: true,\n  })\n  certType!: string;\n\n  @TaskInput({\n    title: '证书保存路径',\n    helper: '路径要包含证书文件名，例如：/tmp/cert.pem',\n    component: {\n      placeholder: '/root/deploy/nginx/full_chain.pem',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'pem';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  crtPath!: string;\n  @TaskInput({\n    title: '私钥保存路径',\n    helper: '路径要包含私钥文件名，例如：/tmp/cert.key',\n    component: {\n      placeholder: '/root/deploy/nginx/cert.key',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'pem';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  keyPath!: string;\n\n  @TaskInput({\n    title: '中间证书保存路径',\n    helper: '路径要包含文件名，一般情况传上面两个文件即可，极少数情况需要这个中间证书',\n    component: {\n      placeholder: '/root/deploy/nginx/intermediate.pem',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'pem';\n        })\n      }\n    `,\n    rules: [{ type: 'filepath' }],\n  })\n  icPath!: string;\n\n  @TaskInput({\n    title: 'PFX证书保存路径',\n    helper: '路径要包含证书文件名，例如：D:\\\\iis\\\\cert.pfx',\n    component: {\n      placeholder: 'D:\\\\iis\\\\cert.pfx',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'pfx';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  pfxPath!: string;\n\n  @TaskInput({\n    title: 'DER证书保存路径',\n    helper: '路径要包含证书文件名，例如：/tmp/cert.der',\n    component: {\n      placeholder: '/root/deploy/apache/cert.der',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'der';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  derPath!: string;\n\n  @TaskInput({\n    title: 'jks证书保存路径',\n    helper: '路径要包含证书文件名，例如：/tmp/cert.jks',\n    component: {\n      placeholder: '/root/deploy/java_app/cert.jks',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'jks';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  jksPath!: string;\n\n  @TaskInput({\n    title: '一体证书保存路径',\n    helper: '路径要包含证书文件名，例如：/tmp/crt_key.pem',\n    component: {\n      placeholder: '/app/crt_key.pem',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'one';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  onePath!: string;\n\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    const { accessId } = this;\n    let { crtPath, keyPath, icPath, pfxPath, derPath, jksPath, onePath } = this;\n    if (!accessId) {\n      throw new Error('OSS授权配置不能为空');\n    }\n\n    const uploaderType = this.uploaderType\n    const uploaderAccess = this.accessId\n\n    const httpUploaderContext = {\n      accessService: this.ctx.accessService,\n      logger: this.logger,\n      utils,\n    };\n\n    const access = await this.getAccess(uploaderAccess);\n    this.logger.info(\"上传方式\", uploaderType);\n    const httpUploader = await ossClientFactory.createOssClientByType(uploaderType, {\n      access,\n      rootDir: \"\",\n      ctx: httpUploaderContext,\n    });\n\n\n    this.logger.info('准备上传文件到OSS');\n\n    if (crtPath) {\n      await httpUploader.upload(crtPath, Buffer.from(this.cert.crt))\n      this.logger.info(`上传证书：${crtPath}`);\n    }\n    if (keyPath) {\n      await httpUploader.upload(keyPath, Buffer.from(this.cert.key))\n      this.logger.info(`上传私钥：${keyPath}`);\n    }\n    if (icPath) {\n      await httpUploader.upload(icPath, Buffer.from(this.cert.ic))\n      this.logger.info(`上传中间证书：${icPath}`);\n    }\n    if (pfxPath) {\n      await httpUploader.upload(pfxPath, Buffer.from(this.cert.pfx, \"base64\"))\n      this.logger.info(`上传PFX证书：${pfxPath}`);\n    }\n    if (derPath) {\n      await httpUploader.upload(derPath, Buffer.from(this.cert.der, \"base64\"))\n      this.logger.info(`上传DER证书：${derPath}`);\n    }\n    if (this.jksPath) {\n      await httpUploader.upload(jksPath,Buffer.from(this.cert.jks, \"base64\"))\n      this.logger.info(`上传jks证书：${jksPath}`);\n    }\n\n    if (onePath) {\n      await httpUploader.upload(onePath, Buffer.from(this.cert.one))\n      this.logger.info(`上传一体证书：${onePath}`);\n    }\n\n    this.logger.info('上传文件成功');\n  }\n}\nnew UploadCertToOssPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-host/plugin/upload-to-host/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from '@certd/pipeline';\nimport { CertInfo, CertReader, CertReaderHandleContext } from '@certd/plugin-cert';\nimport dayjs from 'dayjs';\nimport { SshAccess, SshClient } from '@certd/plugin-lib';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'uploadCertToHost',\n  title: '主机-部署证书到SSH主机',\n  icon: 'line-md:uploading-loop',\n  group: pluginGroups.host.key,\n  desc: 'SFTP上传证书到主机，然后SSH执行部署脚本命令',\n  order: 1,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class UploadCertToHostPlugin extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n\n  @TaskInput({\n    title: '证书格式',\n    helper: '要部署的证书格式，支持pem、pfx、der、jks',\n    component: {\n      name: 'a-select',\n      options: [\n        { value: 'pem', label: 'pem（crt），Nginx等大部分应用' },\n        { value: 'pfx', label: 'pfx，一般用于IIS' },\n        { value: 'der', label: 'der，一般用于Apache' },\n        { value: 'jks', label: 'jks，一般用于JAVA应用' },\n        { value: 'one', label: '证书私钥一体，crt+key简单合并为一个pem文件' },\n      ],\n    },\n    required: true,\n  })\n  certType!: string;\n\n  @TaskInput({\n    title: '证书保存路径',\n    helper: '填写应用原本的证书保存路径，路径要包含证书文件名，例如：/tmp/cert.pem',\n    component: {\n      placeholder: '/root/deploy/nginx/full_chain.pem',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'pem';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  crtPath!: string;\n  @TaskInput({\n    title: '私钥保存路径',\n    helper: '原本的私钥保存路径，需要有写入权限，路径要包含私钥文件名，例如：/tmp/cert.key',\n    component: {\n      placeholder: '/root/deploy/nginx/cert.key',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'pem';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  keyPath!: string;\n\n  @TaskInput({\n    title: '中间证书保存路径',\n    helper: '路径要包含文件名，一般情况传上面两个文件即可，极少数情况需要这个中间证书',\n    component: {\n      placeholder: '/root/deploy/nginx/intermediate.pem',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'pem';\n        })\n      }\n    `,\n    rules: [{ type: 'filepath' }],\n  })\n  icPath!: string;\n\n  @TaskInput({\n    title: 'PFX证书保存路径',\n    helper: '填写应用原本的证书保存路径，路径要包含证书文件名，例如：D:\\\\iis\\\\cert.pfx',\n    component: {\n      placeholder: 'D:\\\\iis\\\\cert.pfx',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'pfx';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  pfxPath!: string;\n\n  @TaskInput({\n    title: 'DER证书保存路径',\n    helper: '填写应用原本的证书保存路径，路径要包含证书文件名，例如：/tmp/cert.der',\n    component: {\n      placeholder: '/root/deploy/apache/cert.der',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'der';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  derPath!: string;\n\n  @TaskInput({\n    title: 'jks证书保存路径',\n    helper: '填写应用原本的证书保存路径，路径要包含证书文件名，例如：/tmp/cert.jks',\n    component: {\n      placeholder: '/root/deploy/java_app/cert.jks',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'jks';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  jksPath!: string;\n\n  @TaskInput({\n    title: '一体证书保存路径',\n    helper: '填写应用原本的证书保存路径，路径要包含证书文件名，例如：/tmp/crt_key.pem',\n    component: {\n      placeholder: '/root/deploy/app/crt_key.pem',\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.certType === 'one';\n        })\n      }\n    `,\n    required: true,\n    rules: [{ type: 'filepath' }],\n  })\n  onePath!: string;\n\n  @TaskInput({\n    title: '主机登录配置',\n    helper: 'access授权',\n    component: {\n      name: 'access-selector',\n      type: 'ssh',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: '上传方式',\n    helper: '支持sftp或者scp\\n需要有写入权限，如果没有，须先将证书上传到有权限的目录，再通过后置命令复制到目标路径',\n    value:\"sftp\",\n    component: {\n      name: 'a-select',\n      options: [\n        { value: 'sftp', label: 'sftp' },\n        { value: 'scp', label: 'scp' },\n      ],\n    },\n    required: true,\n  })\n  uploadType: string = 'sftp';\n\n  @TaskInput({\n    title: '自动创建远程目录',\n    helper: '是否自动创建远程目录,如果关闭则你需要自己确保远程目录存在',\n    value: true,\n    component: {\n      name: 'a-switch',\n      vModel: 'checked',\n    },\n  })\n  mkdirs = true;\n\n  @TaskInput({\n    title: '前置命令',\n    component: {\n      name: 'a-textarea',\n      vModel: 'value',\n      rows: 3,\n      placeholder: 'mkdir /app/ssl',\n    },\n    helper: '上传前执行脚本命令，做上传前的准备工作',\n    required: false,\n  })\n  scriptPre!: string;\n\n  @TaskInput({\n    title: '后置命令',\n    component: {\n      name: 'a-textarea',\n      vModel: 'value',\n      rows: 5,\n      placeholder: 'systemctl restart nginx ',\n    },\n    helper: '上传后执行脚本命令，让证书生效（比如重启nginx），不填则不执行\\n注意：sudo需要配置免密\\n注意：如果目标主机是windows，且终端是cmd，系统会自动将多行命令通过“&&”连接成一行',\n    required: false,\n  })\n  script!: string;\n\n  @TaskInput({\n    title: '注入环境变量',\n    value: false,\n    component: {\n      name: 'a-switch',\n      vModel: 'checked',\n    },\n    helper: '是否将证书域名、路径等信息注入脚本执行环境变量中，具体的变量名称，可以运行后从日志中查看',\n    required: false,\n  })\n  injectEnv!: string;\n\n  @TaskOutput({\n    title: '证书保存路径',\n  })\n  hostCrtPath!: string;\n\n  @TaskOutput({\n    title: '私钥保存路径',\n  })\n  hostKeyPath!: string;\n\n  @TaskOutput({\n    title: '中间证书保存路径',\n  })\n  hostIcPath!: string;\n  @TaskOutput({\n    title: 'PFX保存路径',\n  })\n  hostPfxPath!: string;\n\n  @TaskOutput({\n    title: 'DER保存路径',\n  })\n  hostDerPath!: string;\n  @TaskOutput({\n    title: 'jks保存路径',\n  })\n  hostJksPath!: string;\n\n  @TaskOutput({\n    title: '一体证书保存路径',\n  })\n  hostOnePath!: string;\n\n  async onInstance() {}\n\n\n  async execute(): Promise<void> {\n    const { cert, accessId } = this;\n    let { crtPath, keyPath, icPath, pfxPath, derPath, jksPath, onePath } = this;\n    const certReader = new CertReader(cert);\n\n    const executeCmd = async ( script:string)=> {\n      if (script && script?.trim()) {\n        const connectConf: SshAccess = await this.getAccess(accessId);\n        const sshClient = new SshClient(this.logger);\n        this.logger.info('执行脚本命令');\n\n        //环境变量\n        const env = {};\n        if (this.injectEnv) {\n          const domains = certReader.getAllDomains();\n          for (let i = 0; i < domains.length; i++) {\n            env[`CERT_DOMAIN_${i}`] = domains[i];\n          }\n          //环境变量必须是string\n          env['CERT_EXPIRES'] = \"\" + dayjs(certReader.getCrtDetail().expires).unix();\n\n          env['HOST_CRT_PATH'] = this.hostCrtPath || '';\n          env['HOST_KEY_PATH'] = this.hostKeyPath || '';\n          env['HOST_IC_PATH'] = this.hostIcPath || '';\n          env['HOST_PFX_PATH'] = this.hostPfxPath || '';\n          env['HOST_DER_PATH'] = this.hostDerPath || '';\n          env['HOST_JKS_PATH'] = this.hostJksPath || '';\n          env['HOST_ONE_PATH'] = this.hostOnePath || '';\n        }\n\n        const scripts = script.split('\\n');\n        await sshClient.exec({\n          connectConf,\n          script: scripts,\n          env,\n        });\n      }\n    }\n\n    const handle = async (opts: CertReaderHandleContext) => {\n      const { tmpCrtPath, tmpKeyPath, tmpDerPath, tmpJksPath, tmpPfxPath, tmpIcPath, tmpOnePath } = opts;\n\n      if (accessId == null) {\n        this.logger.error('复制到当前主机功能已迁移到 “复制到本机”插件，请换成复制到本机插件');\n        return;\n      }\n      const connectConf: SshAccess = await this.getAccess(accessId);\n      const sshClient = new SshClient(this.logger);\n\n      if (!accessId) {\n        throw new Error('主机登录授权配置不能为空');\n      }\n      this.logger.info('准备上传文件到服务器');\n\n      const transports: any = [];\n      if (crtPath) {\n        crtPath = crtPath.trim();\n        transports.push({\n          localPath: tmpCrtPath,\n          remotePath: crtPath,\n        });\n        this.logger.info(`上传证书到主机：${crtPath}`);\n      }\n      if (keyPath) {\n        keyPath = keyPath.trim();\n        transports.push({\n          localPath: tmpKeyPath,\n          remotePath: keyPath,\n        });\n        this.logger.info(`上传私钥到主机：${keyPath}`);\n      }\n      if (icPath) {\n        icPath = icPath.trim();\n        transports.push({\n          localPath: tmpIcPath,\n          remotePath: icPath,\n        });\n        this.logger.info(`上传中间证书到主机：${icPath}`);\n      }\n      if (pfxPath) {\n        pfxPath = pfxPath.trim();\n        transports.push({\n          localPath: tmpPfxPath,\n          remotePath: pfxPath,\n        });\n        this.logger.info(`上传PFX证书到主机：${pfxPath}`);\n      }\n      if (derPath) {\n        derPath = derPath.trim();\n        transports.push({\n          localPath: tmpDerPath,\n          remotePath: derPath,\n        });\n        this.logger.info(`上传DER证书到主机：${derPath}`);\n      }\n      if (this.jksPath) {\n        jksPath = jksPath.trim();\n        transports.push({\n          localPath: tmpJksPath,\n          remotePath: jksPath,\n        });\n        this.logger.info(`上传jks证书到主机：${jksPath}`);\n      }\n\n      if (this.onePath) {\n        this.logger.info(`上传一体证书到主机：${this.onePath}`);\n        onePath = this.onePath.trim();\n        transports.push({\n          localPath: tmpOnePath,\n          remotePath: this.onePath,\n        });\n      }\n\n      this.logger.info('开始上传文件到服务器');\n      await sshClient.uploadFiles({\n        connectConf,\n        transports,\n        mkdirs: this.mkdirs,\n        uploadType: this.uploadType,\n      });\n\n      this.logger.info('上传文件到服务器成功');\n      //输出\n      this.hostCrtPath = crtPath;\n      this.hostKeyPath = keyPath;\n      this.hostIcPath = icPath;\n      this.hostPfxPath = pfxPath;\n      this.hostDerPath = derPath;\n      this.hostJksPath = jksPath;\n      this.hostOnePath = onePath;\n    };\n\n    //执行前置命令\n    await executeCmd(this.scriptPre);\n\n    //上传文件\n    await certReader.readCertFile({\n      logger: this.logger,\n      handle,\n    });\n\n    //执行后置命令\n    await executeCmd(this.script);\n  }\n}\n\nnew UploadCertToHostPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-huawei/access/huawei-access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from '@certd/pipeline';\n\n@IsAccess({\n  name: 'huawei',\n  title: '华为云授权',\n  desc: '',\n  icon: 'svg:icon-huawei',\n})\nexport class HuaweiAccess extends BaseAccess {\n  @AccessInput({\n    title: 'accessKeyId',\n    component: {\n      placeholder: 'accessKeyId',\n    },\n    helper: '证书申请需要有dns解析权限，前往[我的凭证-访问密钥](https://console.huaweicloud.com/iam/?region=cn-east-3#/mine/accessKey)获取',\n    required: true,\n  })\n  accessKeyId = '';\n  @AccessInput({\n    title: 'accessKeySecret',\n    component: {\n      placeholder: 'accessKeySecret',\n    },\n    required: true,\n    encrypt: true,\n  })\n  accessKeySecret = '';\n}\n\nnew HuaweiAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-huawei/access/index.ts",
    "content": "export * from './huawei-access.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-huawei/dns-provider/huawei-dns-provider.ts",
    "content": "import * as _ from \"lodash-es\";\nimport { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from \"@certd/plugin-cert\";\n\nimport { HuaweiAccess } from \"../access/index.js\";\nimport { ApiRequestOptions, HuaweiYunClient } from \"@certd/lib-huawei\";\n\nexport type SearchRecordOptions = {\n  zoneId: string;\n} & CreateRecordOptions;\n\n@IsDnsProvider({\n  name: \"huawei\",\n  title: \"华为云\",\n  desc: \"华为云DNS解析提供商\",\n  accessType: \"huawei\",\n  icon: \"svg:icon-huawei\"\n})\nexport class HuaweiDnsProvider extends AbstractDnsProvider {\n  client!: HuaweiYunClient;\n  access!: HuaweiAccess;\n  domainEndpoint = \"https://domains-external.myhuaweicloud.com\";\n  dnsEndpoint = \"https://dns.cn-south-1.myhuaweicloud.com\";\n\n  async onInstance() {\n    this.access = this.ctx.access as HuaweiAccess\n    const access: any = this.access;\n    this.client = new HuaweiYunClient(access, this.logger);\n  }\n\n  async getDomainList() {\n    const url = `${this.dnsEndpoint}/v2/zones`;\n    const ret = await this.client.request({\n      url,\n      method: \"GET\"\n    });\n    return ret.zones;\n  }\n\n  async matchDomain(dnsRecord: string) {\n    const zoneList = await this.getDomainList();\n    let zoneRecord = null;\n    for (const item of zoneList) {\n      if (_.endsWith(dnsRecord + \".\", item.name)) {\n        zoneRecord = item;\n        break;\n      }\n    }\n    if (!zoneRecord) {\n      throw new Error(\"can not find Domain ,\" + dnsRecord);\n    }\n    return zoneRecord;\n  }\n\n  async searchRecord(options: SearchRecordOptions): Promise<any> {\n    const req: ApiRequestOptions = {\n      url: `${this.dnsEndpoint}/v2/zones/${options.zoneId}/recordsets?search_mode=equal&name=${options.fullRecord}.&type=${options.type}`,\n      method: \"GET\"\n    };\n    const ret = await this.client.request(req);\n    return ret.recordsets;\n  }\n\n  async createRecord(options: CreateRecordOptions): Promise<any> {\n    const { fullRecord, value, type } = options;\n    this.logger.info(\"添加域名解析：\", fullRecord, value);\n    this.logger.info(\"查询是否有重复记录\");\n    const zoneRecord = await this.matchDomain(fullRecord);\n    const zoneId = zoneRecord.id;\n\n    const records: any = await this.searchRecord({\n      zoneId,\n      ...options\n    });\n    this.logger.info(`查询${options.type}数量:${records.length}`);\n    let found = null;\n    const hwRecordValue = `\"${value}\"`;\n    if (records && records.length > 0) {\n      found = records[0];\n      this.logger.info(`记录:${found.id},${found.records}`);\n      if (found.records.includes(hwRecordValue)) {\n        // this.logger.info(`删除重复记录:${record.id}`)\n        // await this.removeRecord({\n        //   recordRes: record,\n        //   recordReq: options,\n        // });\n        this.logger.info(`无需重复添加:${found.records}`);\n        return found;\n      }\n    }\n\n    if (found) {\n      //修改\n      const req: ApiRequestOptions = {\n        url: `${this.dnsEndpoint}/v2/zones/${zoneId}/recordsets/${found.id}`,\n        method: \"PUT\",\n        data: {\n          name: fullRecord + \".\",\n          type,\n          records: [hwRecordValue, ...found.records]\n        }\n      };\n      const ret = await this.client.request(req);\n      this.logger.info(\"添加域名解析成功:\", value, ret);\n      return ret;\n    } else {\n      //创建\n      try {\n        const req: ApiRequestOptions = {\n          url: `${this.dnsEndpoint}/v2/zones/${zoneId}/recordsets`,\n          method: \"POST\",\n          data: {\n            name: fullRecord + \".\",\n            type,\n            records: [hwRecordValue]\n          }\n        };\n        const ret = await this.client.request(req);\n        this.logger.info(\"添加域名解析成功:\", value, ret);\n        return ret;\n      } catch (e: any) {\n        if (e.code === \"DNS.0312\") {\n          return;\n        }\n        this.logger.info(\"添加域名解析出错\", e);\n        throw e;\n      }\n    }\n  }\n\n  async removeRecord(options: RemoveRecordOptions<any>): Promise<any> {\n    const { fullRecord, value } = options.recordReq;\n    const record = options.recordRes;\n    if (!record) {\n      this.logger.info(\"解析记录recordId为空，不执行删除\", fullRecord, value);\n      return;\n    }\n    const zoneId = record.zone_id;\n\n    //查询原来的记录\n    const records: any = await this.searchRecord({\n      zoneId,\n      ...options.recordReq\n    });\n    const hwRecordValue = `\"${value}\"`;\n\n    if (records && records.length > 0) {\n      //找到记录\n      const found = records[0];\n      if (found.records.includes(hwRecordValue)) {\n        if (found.records.length > 1) {\n          //修改\n\n          const req: ApiRequestOptions = {\n            url: `${this.dnsEndpoint}/v2/zones/${zoneId}/recordsets/${found.id}`,\n            method: \"PUT\",\n            data: {\n              name: fullRecord + \".\",\n              type: found.type,\n              records: found.records.filter((item: string) => item !== hwRecordValue)\n            }\n          };\n          const ret = await this.client.request(req);\n          this.logger.info(\"修改域名解析成功[put]:\", value, ret);\n        } else {\n          //删除\n          const req: ApiRequestOptions = {\n            url: `${this.dnsEndpoint}/v2/zones/${zoneId}/recordsets/${found.id}`,\n            method: \"DELETE\"\n          };\n          const ret = await this.client.request(req);\n          this.logger.info(\"删除域名解析成功[delete]:\", fullRecord, value, ret.RecordId);\n        }\n      }else{\n        this.logger.info(\"没有找到records无需删除\", fullRecord, value,found);\n      }\n    }else{\n      this.logger.info(\"删除域名解析失败，没有找到解析记录\", fullRecord, value);\n    }\n  }\n}\n\nnew HuaweiDnsProvider();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-huawei/dns-provider/index.ts",
    "content": "import './huawei-dns-provider.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-huawei/index.ts",
    "content": "export * from './access/index.js';\nexport * from './dns-provider/index.js';\nexport * from './plugins/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-huawei/plugins/deploy-to-cdn/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { HuaweiAccess } from '../../access/index.js';\nimport { CertInfo } from '@certd/plugin-cert';\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from '@certd/plugin-lib';\nimport { resetLogConfigure } from '@certd/basic';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'HauweiDeployCertToCDN',\n  title: '华为云-部署证书至CDN',\n  icon: 'svg:icon-huawei',\n  group: pluginGroups.huawei.key,\n  desc: '',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class HauweiDeployCertToCDN extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书\\n如果你选择使用ccm证书ID，则需要在[域名管理页面右上角开启SCM授权](https://console.huaweicloud.com/cdn/#/cdn/domain)',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames,'HauweiUploadToCCM'],\n    },\n    required: true,\n  })\n  cert!: CertInfo | string;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  @TaskInput({\n    title: '企业项目ID',\n    helper: '华为云子账号必填，\"all\"表示查询所有项目',\n    required: false,\n    value:\"all\"\n  })\n  enterpriseProjectId!: string;\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '华为云授权AccessKeyId、AccessKeySecret',\n    component: {\n      name: 'access-selector',\n      type: 'huawei',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: 'CDN域名',\n      helper: '请选择域名或输入域名',\n      typeName: 'HauweiDeployCertToCDN',\n      action: HauweiDeployCertToCDN.prototype.onGetDomainList.name,\n    })\n  )\n  domains!: string[];\n\n\n\n  async execute(): Promise<void> {\n    if (!this.cert) {\n      throw new Error('域名证书不能为空');\n    }\n    this.logger.info('开始部署证书到华为云cdn');\n    const { cdn, client } = await this.getCdnClient();\n    let httpsConfig = new cdn.HttpPutBody()\n      .withHttpsStatus('on')\n      .withCertificateType('server')\n\n    if(typeof this.cert  === 'object'){\n      httpsConfig=  httpsConfig.withCertificateSource(0)\n        .withCertificateName(this.appendTimeSuffix('certd'))\n        .withCertificateValue(this.cert.crt)\n        .withPrivateKey(this.cert.key);\n    }else{\n      this.logger.info('使用已有域名证书：', this.cert);\n      httpsConfig=  httpsConfig.withCertificateSource(2)//scm证书\n        .withCertificateName(this.appendTimeSuffix('certd'))\n        .withScmCertificateId(this.cert)\n    }\n\n    const config = new cdn.Configs().withHttps(httpsConfig);\n    const body = new cdn.ModifyDomainConfigRequestBody().withConfigs(config);\n    if (!this.domains || this.domains.length === 0) {\n      throw new Error('您还未配置CDN域名');\n    }\n    this.logger.info('部署域名：', JSON.stringify(this.domains));\n    for (const domain of this.domains) {\n      this.logger.info('部署到域名:', domain);\n\n      const queryReq =  new cdn.ShowDomainDetailByNameRequest(domain);\n      if(this.enterpriseProjectId){\n        queryReq.withEnterpriseProjectId(this.enterpriseProjectId)\n      }\n      const domainDetail = await client.showDomainDetailByName(queryReq);\n      //@ts-ignore\n      const status = domainDetail.domain.domainStatus || domainDetail.domain.domain_status\n      this.logger.info(`当前域名状态:`, status);\n      let ignoreError = false\n      if (status === 'offline') {\n        ignoreError = true\n      }\n      try{\n        const req = new cdn.UpdateDomainFullConfigRequest().withDomainName(domain).withBody(body);\n        if(this.enterpriseProjectId){\n          req.withEnterpriseProjectId(this.enterpriseProjectId)\n        }\n        await client.updateDomainFullConfig(req);\n        this.logger.info(`部署到域名${domain}完成:`);\n      }catch (e) {\n        if (ignoreError){\n          this.logger.warn(`部署到域名${domain}失败，由于其处于offline状态，忽略部署错误，继续执行:`, e);\n        }else{\n          throw e\n        }\n      }\n\n    }\n\n    this.logger.info('部署证书到华为云cdn完成');\n  }\n\n  async getCdnClient() {\n    const access = await this.getAccess<HuaweiAccess>(this.accessId);\n    const { BasicCredentials } = await import('@huaweicloud/huaweicloud-sdk-core');\n    const cdn = await import('@huaweicloud/huaweicloud-sdk-cdn/v2/public-api.js');\n    //恢复华为云把log4j的config改了的问题\n    resetLogConfigure();\n    const credentials = new BasicCredentials().withAk(access.accessKeyId).withSk(access.accessKeySecret);\n    const client = cdn.CdnClient.newBuilder().withCredential(credentials).withEndpoint('https://cdn.myhuaweicloud.com').build();\n    return {\n      client,\n      cdn,\n    };\n  }\n\n  async onGetDomainList(data: any) {\n    const { client, cdn } = await this.getCdnClient();\n\n    const request = new cdn.ListDomainsRequest();\n    request.pageNumber = 1;\n    request.pageSize = 1000;\n    request.enterpriseProjectId = this.enterpriseProjectId || undefined;\n    const result: any = await client.listDomains(request);\n    if (!result || !result.domains || result.domains.length === 0) {\n      throw new Error('未找到CDN域名，您可以手动输入');\n    }\n\n    const domains = result.domains.map(domain => {\n      return {\n        value: domain.domain_name,\n        label: domain.domain_name,\n        domain: domain.domain_name,\n      };\n    });\n\n    return this.ctx.utils.options.buildGroupOptions(domains, this.certDomains);\n  }\n}\nnew HauweiDeployCertToCDN();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-huawei/plugins/index.ts",
    "content": "export * from './deploy-to-cdn/index.js'\nexport * from './upload-to-ccm/index.js'\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-huawei/plugins/upload-to-ccm/ccm-client.ts",
    "content": "//@ts-ignore\nimport { HcClient } from \"@huaweicloud/huaweicloud-sdk-core/HcClient\";\n\nexport class HuaweiCcmClient {\n  //@ts-ignore\n  hcClient: HcClient;\n\n  //@ts-ignore\n  constructor(client: HcClient) {\n    this.hcClient = client;\n  }\n\n  /**\n   */\n  importCertificate(req: {\n    name: string,\n    certificate: string,\n    private_key: string,\n    duplicate_check: boolean,\n  }) {\n    const options: any = {\n      method: \"POST\",\n      url: \"/v3/scm/certificates/import\",\n      pathParams: {},\n      queryParams: {},\n      contentType: \"application/json\",\n      headers: {\n        \"Content-Type\": \"application/json\"\n      },\n      /**\n       * name\n       * string\t是\n       * 证书名称。字符长度为3~63位, 请输入英文字符,数字,下划线,中划线,英文句点。\n       *\n       * certificate\n       * string\t是\n       * 证书内容,可包含中间证书及根证书。若certificate_chain字段传入证书链,则该字段只取证书本身。回车换行需要使用转义字符\\n或者\\r\\n替换。\n       *\n       * certificate_chain\n       * string\t否\n       * 证书链,非必填,可通过certificate字段传入。回车换行需要使用转义字符\\n或者\\r\\n替换。\n       *\n       * private_key\n       * string\t是\n       * 证书私钥。\n       * 不能上传带有口令保护的私钥,回车换行需要使用转义字符\\n或者\\r\\n替换。\n       *\n       * duplicate_check\n       */\n      data: {\n        ...req\n      }\n\n    };\n    // @ts-ignore\n    options[\"responseHeaders\"] = [\"X-Request-Id\"];\n    return this.hcClient.sendRequest(options);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-huawei/plugins/upload-to-ccm/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from \"@certd/pipeline\";\nimport { HuaweiAccess } from \"../../access/index.js\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { createCertDomainGetterInputDefine } from \"@certd/plugin-lib\";\nimport { resetLogConfigure } from \"@certd/basic\";\n\n\n@IsTaskPlugin({\n  name: 'HauweiUploadToCCM',\n  title: '华为云-上传证书至CCM',\n  icon: 'svg:icon-huawei',\n  group: pluginGroups.huawei.key,\n  desc: '上传证书到华为云CCM',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class HauweiUploadToCCM extends AbstractTaskPlugin {\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames]\n    },\n    required: true\n  })\n  cert!: CertInfo;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  @TaskInput({\n    title: \"Access授权\",\n    helper: \"华为云授权AccessKeyId、AccessKeySecret\",\n    component: {\n      name: \"access-selector\",\n      type: \"huawei\"\n    },\n    required: true\n  })\n  accessId!: string;\n  @TaskOutput({\n    title: '华为云CertId',\n  })\n  huaweiCertId!: string;\n\n  async execute(): Promise<void> {\n    this.logger.info(\"开始部署证书到华为云CCM\");\n    const { client } = await this.getCcmClient();\n\n    const res = await client.importCertificate({\n      name: this.appendTimeSuffix(\"certd\"),\n      certificate: this.cert.crt,\n      private_key: this.cert.key,\n      duplicate_check: false\n    });\n    this.huaweiCertId = res.certificate_id;\n    this.logger.info(`上传证书到华为云ccm完成,certificate_id:${this.huaweiCertId}`);\n  }\n\n  async getCcmClient() {\n    const access = await this.getAccess<HuaweiAccess>(this.accessId);\n    const { BasicCredentials } = await import(\"@huaweicloud/huaweicloud-sdk-core\");\n    const { ClientBuilder } = await import(\"@huaweicloud/huaweicloud-sdk-core/ClientBuilder.js\");\n    //@ts-ignore\n    const {HuaweiCcmClient}  = await import(\"./ccm-client.js\")\n\n    //恢复华为云把log4j的config改了的问题\n    resetLogConfigure();\n\n    const credentials = new BasicCredentials().withAk(access.accessKeyId).withSk(access.accessKeySecret);\n    const client = new ClientBuilder((hcClient) => {\n      return new HuaweiCcmClient(hcClient);\n    }).withCredential(credentials).withEndpoint(\"https://scm.cn-north-4.myhuaweicloud.com\").build();\n    return {\n      client\n    };\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-jdcloud/access.ts",
    "content": "import {AccessInput, BaseAccess, IsAccess} from '@certd/pipeline';\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: 'jdcloud',\n  title: '京东云',\n  desc: '',\n  icon: 'svg:icon-jdcloud',\n})\nexport class JDCloudAccess extends BaseAccess {\n\n  @AccessInput({\n    title: 'AccessKeyID',\n    component: {\n      placeholder: 'AccessKeyID',\n    },\n    helper:\"[获取密钥](https://uc.jdcloud.com/account/accesskey)\",\n    required: true,\n  })\n  accessKeyId = '';\n  @AccessInput({\n    title: 'SecretAccessKey',\n    component: {\n      placeholder: 'SecretAccessKey',\n    },\n    required: true,\n    encrypt: true,\n  })\n  secretAccessKey = '';\n\n}\n\nnew JDCloudAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts",
    "content": "import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from \"@certd/plugin-cert\";\nimport { JDCloudAccess } from \"./access.js\";\n\n@IsDnsProvider({\n  name: \"jdcloud\",\n  title: \"京东云\",\n  desc: \"京东云DNS解析提供商\",\n  accessType: \"jdcloud\",\n  icon: \"svg:icon-jdcloud\"\n})\nexport class JDCloudDnsProvider extends AbstractDnsProvider {\n  access!: JDCloudAccess;\n\n\n  async onInstance() {\n    this.access = this.ctx.access as JDCloudAccess\n  }\n\n\n\n  async createRecord(options: CreateRecordOptions): Promise<any> {\n    const { fullRecord, hostRecord, value, type, domain } = options;\n    this.logger.info(\"添加域名解析：\", fullRecord, value, domain);\n\n    const service = await this.getJDDomainService();\n\n    const domainRes = await service.describeDomains({\n      domainName: domain,\n      pageNumber: 1,\n      pageSize: 10\n    })\n    if (!domainRes.result?.dataList?.length) {\n      throw new Error(`域名${domain}在此京东云账号中不存在`)\n    }\n\n    const domainId = domainRes.result.dataList[0].id\n    this.logger.info(\"域名ID：\", domainId)\n    /**\n     * hostRecord\tString\tTrue\t\t主机记录\n     * hostValue\tString\tTrue\t\t解析记录的值\n     * jcloudRes\tBoolean\tFalse\t\t是否是京东云资源\n     * mxPriority\tInteger\tFalse\t\t优先级，只存在于MX, SRV解析记录类型\n     * port\tInteger\tFalse\t\t端口，只存在于SRV解析记录类型\n     * ttl\tInteger\tTrue\t\t解析记录的生存时间，单位：秒\n     * type\tString\tTrue\t\t解析的类型，请参考解析记录类型详解\n     * weight\tInteger\tFalse\t\t解析记录的权重，目前支持权重的有：A/AAAA/CNAME/JNAME，A/AAAA权重范围：0-100、CNAME/JNAME权重范围：1-100。\n     * viewValue\tInteger\tTrue\t\t解析线路的ID，请调用describeViewTree接口获取基础解\n     */\n    try{\n      const res = await service.createResourceRecord({\n        domainId: domainId,\n        req:{\n          hostRecord: hostRecord,\n          hostValue: value,\n          type: type,\n          ttl: 100,\n        }\n      })\n      return {\n        recordId: res.result.dataList[0].id,\n        domainId: domainId\n      };\n    }catch (e) {\n      this.logger.error(e)\n      throw e\n    }\n\n\n\n  }\n\n  async removeRecord(options: RemoveRecordOptions<any>): Promise<any> {\n    const record = options.recordRes;\n\n    const service = await this.getJDDomainService();\n    await service.deleteResourceRecord({\n      domainId: record.domainId,\n      resourceRecordId: record.recordId\n    })\n  }\n\n  private async  getJDDomainService() {\n    const {JDDomainService} = await import(\"@certd/jdcloud\")\n    const service = new JDDomainService({\n      credentials: {\n        accessKeyId: this.access.accessKeyId,\n        secretAccessKey: this.access.secretAccessKey\n      },\n      regionId: \"cn-north-1\" //地域信息，某个api调用可以单独传参regionId，如果不传则会使用此配置中的regionId\n    });\n    return service;\n  }\n\n}\n\nnew JDCloudDnsProvider();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-jdcloud/index.ts",
    "content": "export * from './access.js';\nexport * from './dns-provider.js';\nexport * from './plugins/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-jdcloud/plugins/index.ts",
    "content": "export * from './plugin-deploy-to-cdn.js'\nexport * from './plugin-update-cert.js'\nexport * from './plugin-upload-cert.js'\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-jdcloud/plugins/plugin-deploy-to-cdn.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { optionsUtils } from \"@certd/basic/dist/utils/util.options.js\";\nimport { JDCloudAccess } from \"../access.js\";\n\n@IsTaskPlugin({\n  name: \"JDCloudDeployToCDN\",\n  title: \"京东云-部署证书至CDN\",\n  icon: \"svg:icon-jdcloud\",\n  group: pluginGroups.jdcloud.key,\n  desc: \"京东云内容分发网络\",\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\nexport class JDCloudDeployToCDN extends AbstractTaskPlugin {\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames, \"JDCloudUploadCert\"]\n    },\n    required: true\n  })\n  cert!: CertInfo | number;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n\n  @TaskInput({\n    title: \"Access授权\",\n    helper: \"京东云AccessKeyId、AccessKeySecret\",\n    component: {\n      name: \"access-selector\",\n      type: \"jdcloud\"\n    },\n    required: true\n  })\n  accessId!: string;\n\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"CDN加速域名\",\n      helper: \"你在京东云上配置的CDN加速域名，比如:certd.docmirror.cn\",\n      action: JDCloudDeployToCDN.prototype.onGetDomainList.name,\n      watches: [\"certDomains\", \"accessId\"],\n      required: true\n    })\n  )\n  domainName!: string | string[];\n\n\n  async onInstance() {\n  }\n\n  async execute(): Promise<void> {\n    this.logger.info(\"开始部署证书到京东云CDN\");\n    const access = await this.getAccess<JDCloudAccess>(this.accessId);\n\n    const service = await this.getClient(access);\n    let certId = this.cert;\n    const certName = this.appendTimeSuffix(\"certd\");\n    if (typeof certId === \"object\") {\n      const certInfo = this.cert as CertInfo;\n      this.logger.info(`开始上传证书`);\n\n      const sslService = await this.getSslClient(access);\n      const res = await sslService.uploadCert({\n        // certName\tString\tTrue\t\t证书名称\n        // keyFile\tString\tTrue\t\t私钥\n        // certFile\tString\tTrue\t\t证书\n        // aliasName\tString\tFalse\t\t证书别名\n        certName: certName,\n        keyFile: certInfo.key,\n        certFile: certInfo.crt,\n        aliasName: certName\n      });\n      certId = res.result.certId;\n    }\n\n    // const certInfo = this.cert as CertInfo;\n    for (const domain of this.domainName) {\n      this.logger.info(`开始部署域名${domain}证书`);\n      const res = await service.setHttpType({\n        /**\n         * @param {string} opts.domain - 用户域名\n         * @param {} [opts.httpType] - http类型,只能为http或者https,默认为http.当设为https时,需要调用“设置通讯协议”接口上传证书和私钥  optional\n         * @param {} [opts.certificate] - 用户证书,当Type为https时必须设置  optional\n         * @param {} [opts.rsaKey] - 证书私钥  optional\n         * @param {} [opts.jumpType] - 有三种类型：default、http、https  optional\n         * @param {} [opts.certFrom] - 证书来源有两种类型：default,ssl  optional\n         * @param {} [opts.sslCertId] - ssl证书id  optional\n         * @param {} [opts.syncToSsl] - 是否同步到ssl,boolean值，取值true或者false  optional\n         * @param {} [opts.certName] - syncToSsl是true时，certName是必填项  optional\n         */\n        domain,\n        httpType: \"https\",\n        // certificate: certInfo.crt,\n        // rsaKey: certInfo.key,\n        jumpType: \"default\",\n        certFrom: \"ssl\",\n        sslCertId: certId, // 不用certId 方式，会报证书已存在错误，目前还没找到怎么查询重复证书\n        syncToSsl: false,\n        certName: certName\n      });\n      this.logger.info(`部署域名${domain}证书成功:${JSON.stringify(res)}`);\n      await this.ctx.utils.sleep(2000);\n    }\n\n    this.logger.info(\"部署完成\");\n  }\n\n\n  async getClient(access: JDCloudAccess) {\n    const { JDCdnService } = await import(\"@certd/jdcloud\");\n    const service = new JDCdnService({\n      credentials: {\n        accessKeyId: access.accessKeyId,\n        secretAccessKey: access.secretAccessKey\n      },\n      regionId: \"cn-north-1\" //地域信息，某个api调用可以单独传参regionId，如果不传则会使用此配置中的regionId\n    });\n    return service;\n  }\n\n  async getSslClient(access: JDCloudAccess) {\n    const { JDSslService } = await import(\"@certd/jdcloud\");\n    const service = new JDSslService({\n      credentials: {\n        accessKeyId: access.accessKeyId,\n        secretAccessKey: access.secretAccessKey\n      },\n      regionId: \"cn-north-1\" //地域信息，某个api调用可以单独传参regionId，如果不传则会使用此配置中的regionId\n    });\n    return service;\n  }\n\n  async onGetDomainList(data: any) {\n    if (!this.accessId) {\n      throw new Error(\"请选择Access授权\");\n    }\n    const access = await this.getAccess<JDCloudAccess>(this.accessId);\n\n    const service = await this.getClient(access);\n    /**\n     * pageNumber\tInteger\tFalse\t1\tpageNumber,默认值1\n     * pageSize\n     */\n    const res = await service.getDomainList({\n      pageNumber: 1,\n      pageSize: 50\n    });\n    // @ts-ignore\n    const list = res?.result?.domains;\n    if (!list || list.length === 0) {\n      throw new Error(\"找不到加速域名，您可以手动输入\");\n    }\n    const options = list.map((item: any) => {\n      return {\n        value: item.domain,\n        label: item.domain,\n        domain: item.domain\n      };\n    });\n    return optionsUtils.buildGroupOptions(options, this.certDomains);\n  }\n}\n\nnew JDCloudDeployToCDN();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-jdcloud/plugins/plugin-update-cert.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { optionsUtils } from \"@certd/basic/dist/utils/util.options.js\";\nimport { JDCloudAccess } from \"../access.js\";\n\n@IsTaskPlugin({\n  name: 'JDCloudUpdateCert',\n  title: '京东云-更新已有证书',\n  icon: 'svg:icon-jdcloud',\n  group: pluginGroups.jdcloud.key,\n  desc: '更新SSL数字证书中的证书',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class JDCloudUpdateCert extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames, 'JDCloudUploadCert'],\n    },\n    required: true,\n  })\n  cert!: CertInfo | string;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '京东云AccessKeyId、AccessKeySecret',\n    component: {\n      name: 'access-selector',\n      type: 'jdcloud',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: '要更新的证书id',\n      helper: '您在京东云上已有的证书Id',\n      action: JDCloudUpdateCert.prototype.onGetCertList.name,\n      watches: ['certDomains', 'accessId'],\n      required: true,\n    })\n  )\n  certIds!: string[];\n\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    this.logger.info('开始部署证书到京东云CDN');\n    const access = await this.getAccess<JDCloudAccess>(this.accessId);\n\n    const service = await this.getClient(access)\n    // let certId = this.cert\n    // const certName = this.appendTimeSuffix(\"certd\");\n    // if (typeof certId !== 'string') {\n    //   const certInfo = this.cert as CertInfo\n    //   this.logger.info(`开始上传证书`)\n    //\n    //   const res  = await service.uploadCert({\n    //     // certName\tString\tTrue\t\t证书名称\n    //     // keyFile\tString\tTrue\t\t私钥\n    //     // certFile\tString\tTrue\t\t证书\n    //     // aliasName\tString\tFalse\t\t证书别名\n    //     certName: certName,\n    //     keyFile: certInfo.key,\n    //     certFile: certInfo.crt,\n    //     aliasName: certName\n    //   })\n    //   certId = res.result.certId\n    // }\n\n    const certInfo = this.cert as CertInfo\n    for (const certId of this.certIds) {\n      this.logger.info(`开始更新证书：${certId}`)\n      const res = await service.updateCert({\n      /*\n      @param {string} opts.certId - 证书Id\n@param {string} opts.certId - 证书ID\n@param {string} opts.keyFile - 私钥\n@param {string} opts.certFile - 证书\n@param {string} callback - callback\n       */\n        certId,\n        certFile: certInfo.crt,\n        keyFile:certInfo.key,\n      })\n      this.logger.info(`更新证书${certId}成功:${JSON.stringify(res)}`);\n      await this.ctx.utils.sleep(2000)\n    }\n  }\n\n\n  async getClient(access: JDCloudAccess) {\n    const {JDSslService} = await import(\"@certd/jdcloud\")\n    const service = new JDSslService({\n      credentials: {\n        accessKeyId: access.accessKeyId,\n        secretAccessKey: access.secretAccessKey\n      },\n      regionId: \"cn-north-1\" //地域信息，某个api调用可以单独传参regionId，如果不传则会使用此配置中的regionId\n    });\n    return service;\n  }\n\n  async onGetCertList(data: any) {\n    if (!this.accessId) {\n      throw new Error('请选择Access授权');\n    }\n    const access = await this.getAccess<JDCloudAccess>(this.accessId);\n\n    const service = await this.getClient(access);\n    /**\n     * pageNumber\tInteger\tFalse\t1\tpageNumber,默认值1\n     * pageSize\n     */\n    const res = await service.describeCerts({\n      pageNumber: 1,\n      pageSize: 100,\n    })\n    // @ts-ignore\n    const list = res?.result?.certListDetails\n    if (!list || list.length === 0) {\n      throw new Error('找不到证书，您可以手动输入证书id');\n    }\n    const options = list.map((item: any) => {\n      return {\n        value: item.certId,\n        label: `${item.certName}<${item.certId}_${item.commonName}>`,\n        domain: item.commonName, // or item.dnsNames 证书所有域名\n      };\n    });\n    return optionsUtils.buildGroupOptions(options, this.certDomains);\n  }\n}\nnew JDCloudUpdateCert();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-jdcloud/plugins/plugin-upload-cert.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { JDCloudAccess } from \"../access.js\";\n\n@IsTaskPlugin({\n  name: \"JDCloudUploadCert\",\n  title: \"京东云-上传新证书\",\n  icon: \"svg:icon-jdcloud\",\n  group: pluginGroups.jdcloud.key,\n  desc: \"上传证书到SSL数字证书中心\",\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\nexport class JDCloudUploadCert extends AbstractTaskPlugin {\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames, \"JDCloudUploadCert\"]\n    },\n    required: true\n  })\n  cert!: CertInfo | string;\n\n\n  @TaskInput({\n    title: \"Access授权\",\n    helper: \"京东云AccessKeyId、AccessKeySecret\",\n    component: {\n      name: \"access-selector\",\n      type: \"jdcloud\"\n    },\n    required: true\n  })\n  accessId!: string;\n\n\n  @TaskInput({\n    title: \"证书名称前缀\",\n    helper: \"证书形成，默认为certd\",\n    required: false\n  })\n  certName!: string;\n\n  @TaskOutput({\n    title: \"上传成功后的京东云CertId\"\n  })\n  jdcloudCertId!: number;\n\n  async onInstance() {\n  }\n\n  async execute(): Promise<void> {\n    this.logger.info(\"开始上传证书到京东云数字证书中心\");\n    const access = await this.getAccess<JDCloudAccess>(this.accessId);\n\n    const service = await this.getClient(access);\n\n    const certInfo = this.cert as CertInfo;\n    const res = await service.uploadCert({\n      /*\n    @param {string} opts.certName - 证书名称\n@param {string} opts.keyFile - 私钥\n@param {string} opts.certFile - 证书\n@param {string} [opts.aliasName] - 证书别名  optional\n       */\n      certName: this.appendTimeSuffix(this.certName || \"certd\"),\n      certFile: certInfo.crt,\n      keyFile: certInfo.key\n    });\n    this.jdcloudCertId = res.result.certId;\n    this.logger.info(`上传证书成功:${JSON.stringify(res)}`);\n  }\n\n  async getClient(access: JDCloudAccess) {\n    const { JDSslService } = await import(\"@certd/jdcloud\");\n    const service = new JDSslService({\n      credentials: {\n        accessKeyId: access.accessKeyId,\n        secretAccessKey: access.secretAccessKey\n      },\n      regionId: \"cn-north-1\" //地域信息，某个api调用可以单独传参regionId，如果不传则会使用此配置中的regionId\n    });\n    return service;\n  }\n}\n\nnew JDCloudUploadCert();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-namesilo/access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from '@certd/pipeline';\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: 'namesilo',\n  title: 'namesilo授权',\n  desc: '',\n  icon: 'simple-icons:namesilo',\n})\nexport class NamesiloAccess extends BaseAccess {\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    title: 'API Key',\n    component: {\n      placeholder: 'api key',\n    },\n    helper:\n      '前往 [获取API Key](https://www.namesilo.com/account/api-manager)\\n不要勾选第一项（Generate key for read-only access）\\n勾选第二项（Submitting this form...）\\n然后点击Generate按钮',\n    required: true,\n    encrypt: true,\n  })\n  apiKey = '';\n}\n\nnew NamesiloAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-namesilo/dns-provider.ts",
    "content": "import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert';\nimport qs from 'qs';\nimport { NamesiloAccess } from './access.js';\nimport { merge } from 'lodash-es';\n\nexport type NamesiloRecord = {\n  record_id: string;\n};\n\n// 这里通过IsDnsProvider注册一个dnsProvider\n@IsDnsProvider({\n  name: 'namesilo',\n  title: 'namesilo',\n  desc: 'namesilo dns provider',\n  icon: 'simple-icons:namesilo',\n  // 这里是对应的 cloudflare的access类型名称\n  accessType: 'namesilo',\n})\nexport class NamesiloDnsProvider extends AbstractDnsProvider<NamesiloRecord> {\n  access!: NamesiloAccess;\n  async onInstance() {\n    //一些初始化的操作\n    // 也可以通过ctx成员变量传递context\n    this.access = this.ctx.access as NamesiloAccess;\n  }\n  usePunyCode(): boolean {\n    //是否使用punycode来添加解析记录\n    //默认都使用原始中文域名来添加\n    return true;\n  }\n\n  private async doRequest(url: string, params: any = null) {\n    params = merge(\n      {\n        version: 1,\n        type: 'json',\n        key: this.access.apiKey,\n      },\n      params\n    );\n    const qsString = qs.stringify(params);\n    url = `${url}?${qsString}`;\n    const res = await this.http.request<any, any>({\n      url,\n      baseURL: 'https://www.namesilo.com',\n      method: 'get',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n    });\n\n    if (res.reply?.code !== '300' && res.reply?.code !== 300 && res.reply?.detail!==\"success\") {\n      throw new Error(`${JSON.stringify(res.reply.detail)}`);\n    }\n    return res.reply;\n  }\n\n  /**\n   * 创建dns解析记录，用于验证域名所有权\n   */\n  async createRecord(options: CreateRecordOptions): Promise<NamesiloRecord> {\n    /**\n     * fullRecord: '_acme-challenge.test.example.com',\n     * value: 一串uuid\n     * type: 'TXT',\n     * domain: 'example.com'\n     */\n    const { fullRecord, hostRecord, value, type, domain } = options;\n    this.logger.info('添加域名解析：', fullRecord, value, type, domain);\n\n    //domain=namesilo.com&rrtype=A&rrhost=test&rrvalue=55.55.55.55&rrttl=7207\n    const record: any = await this.doRequest('/api/dnsAddRecord', {\n      domain,\n      rrtype: type,\n      rrhost: hostRecord,\n      rrvalue: value,\n      rrttl: 3600,\n    });\n\n    //本接口需要返回本次创建的dns解析记录，这个记录会在删除的时候用到\n    return record;\n  }\n\n  /**\n   *  删除dns解析记录,清理申请痕迹\n   * @param options\n   */\n  async removeRecord(options: RemoveRecordOptions<NamesiloRecord>): Promise<void> {\n    const { fullRecord, value } = options.recordReq;\n    const record = options.recordRes;\n    this.logger.info('删除域名解析：', fullRecord, value);\n    if (!record && !record.record_id) {\n      this.logger.info('record为空，不执行删除');\n      return;\n    }\n    //这里调用删除txt dns解析记录接口\n\n    const recordId = record.record_id;\n    await this.doRequest('/api/dnsDeleteRecord', {\n      domain: options.recordReq.domain,\n      rrid: recordId,\n    });\n    this.logger.info(`删除域名解析成功:fullRecord=${fullRecord},value=${value}`);\n  }\n}\n\n//实例化这个provider，将其自动注册到系统中\nnew NamesiloDnsProvider();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-namesilo/index.ts",
    "content": "export * from './dns-provider.js';\nexport * from './access.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/anpush/index.ts",
    "content": "import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from '@certd/pipeline';\n\n@IsNotification({\n  name: 'anpush',\n  title: 'AnPush',\n  desc: 'https://anpush.com',\n  needPlus: true,\n})\nexport class AnPushNotification extends BaseNotification {\n  @NotificationInput({\n    title: 'API密钥',\n    component: {\n      placeholder: '',\n    },\n    helper: '[获取API密钥](https://anpush.com/push/tool) ',\n    required: true,\n  })\n  token = '';\n\n  @NotificationInput({\n    title: '通道ID',\n    component: {\n      placeholder: '',\n    },\n    helper: '[获取通道ID](https://anpush.com/push/setting)创建通道，复制通道id，填入此处',\n    required: true,\n  })\n  channel = '';\n\n  async send(body: NotificationBody) {\n    if (!this.token) {\n      throw new Error('token不能为空');\n    }\n    const config = {\n      url: `https://api.anpush.com/push/${this.token}`,\n      method: 'POST',\n      timeout: 0,\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n      },\n      data: {\n        title: body.title,\n        content: body.content + '\\n\\n[查看详情](' + body.url + ')',\n        channel: this.channel,\n      },\n    };\n    const res = await this.http.request(config);\n    if (res.code != 200) {\n      throw new Error('发送失败:' + res.msg);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/bark/index.ts",
    "content": "/**\n * curl -X \"POST\" \"https://api.day.app/your_key\" \\\n *      -H 'Content-Type: application/json; charset=utf-8' \\\n *      -d $'{\n *   \"body\": \"Test Bark Server\",\n *   \"title\": \"Test Title\",\n *   \"badge\": 1,\n *   \"category\": \"myNotificationCategory\",\n *   \"sound\": \"minuet.caf\",\n *   \"icon\": \"https://day.app/assets/images/avatar.jpg\",\n *   \"group\": \"test\",\n *   \"url\": \"https://mritd.com\"\n * }'\n */\n\nimport { BaseNotification, IsNotification, NotificationBody, NotificationInput } from '@certd/pipeline';\n\n@IsNotification({\n  name: 'bark',\n  title: 'Bark 通知',\n  desc: 'Bark 推送通知插件',\n  needPlus: true,\n})\nexport class BarkNotification extends BaseNotification {\n  @NotificationInput({\n    title: '服务地址',\n    component: {\n      placeholder: 'https://api.day.app/your_key',\n    },\n    required: true,\n    helper: '你的bark服务地址+key',\n  })\n  webhook = '';\n\n  @NotificationInput({\n    title: '忽略证书校验',\n    value: false,\n    component: {\n      name: 'a-switch',\n      vModel: 'checked',\n    },\n    required: false,\n  })\n  skipSslVerify: boolean;\n\n  async send(body: NotificationBody) {\n    if (!this.webhook) {\n      throw new Error('服务器地址不能为空');\n    }\n\n    const payload = {\n      body: `${body.content}\\n\\n[查看详情](${body.url})`, // 使用传入的内容或默认内容\n      title: body.title, // 使用传入的标题或默认标题\n    };\n\n    await this.http.request({\n      url: `${this.webhook}`,\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json; charset=utf-8',\n      },\n      data: payload,\n      skipSslVerify: this.skipSslVerify,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/dingtalk/index.ts",
    "content": "import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from \"@certd/pipeline\";\n\n@IsNotification({\n  name: 'dingtalk',\n  title: '钉钉通知',\n  desc: '钉钉群聊通知',\n  needPlus: true,\n})\n// https://open.dingtalk.com/document/orgapp/the-creation-and-installation-of-the-application-robot-in-the?spm=ding_open_doc.document.0.0.242d1563cDgZz3\nexport class DingTalkNotification extends BaseNotification {\n  @NotificationInput({\n    title: 'webhook地址',\n    component: {\n      placeholder: 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxx',\n    },\n    helper: '钉钉APP->群聊->设置->机器人->添加机器人->自定义->[创建机器人->复制webhook地址](https://open.dingtalk.com/document/robots/custom-robot-access)',\n    required: true,\n  })\n  webhook = '';\n\n  @NotificationInput({\n    title: '加签密钥',\n    component: {\n      placeholder: 'SECxxxxxxxxxxxxxxxxxxxxx',\n    },\n    helper: '必须选择一种安全设置，请选择加密密钥',\n    required: false,\n  })\n  secret = '';\n\n\n  @NotificationInput({\n    title: '@用户ID',\n    component: {\n      placeholder: '非必填，填写完一个按回车',\n      name: 'a-select',\n      vModel: 'value',\n      mode: 'tags',\n      multiple: true,\n      open: false,\n    },\n    helper: '填写要@的用户ID',\n    required: false,\n  })\n  atUserIds:string[];\n\n  @NotificationInput({\n    title: '@用户手机号',\n    component: {\n      placeholder: '非必填，填写一个按回车',\n      name: 'a-select',\n      vModel: 'value',\n      mode: 'tags',\n      multiple: true,\n      open: false,\n    },\n    helper: '填写要@的用户的手机号',\n    required: false,\n  })\n  atMobiles:string[];\n\n\n  @NotificationInput({\n    title: '@all',\n    component: {\n      placeholder: '非必填',\n      name: 'a-switch',\n      vModel:\"checked\"\n    },\n    helper: '是否@所有人',\n    required: false,\n  })\n  isAtAll:boolean;\n\n\n  async sign(){\n    const timestamp = Date.now();\n    const secret = this.secret;\n    const stringToSign = `${timestamp}\\n${secret}`;\n    /**\n     * string_to_sign = '{}\\n{}'.format(timestamp, secret)\n     * string_to_sign_enc = string_to_sign.encode('utf-8')\n     * hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()\n     * sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))\n     */\n    const crypto = await import('crypto');\n    const hmac = crypto.createHmac('sha256', secret);\n    hmac.update(stringToSign);\n    const sign = encodeURIComponent(Buffer.from(hmac.digest()).toString('base64'));\n\n    return {\n      timestamp,\n      sign,\n    };\n\n  }\n\n  async send(body: NotificationBody) {\n    if (!this.webhook) {\n      throw new Error('webhook地址不能为空');\n    }\n    /**\n     *\n     *      \"msgtype\": \"text\",\n     *      \"text\": {\n     *          \"content\": \"hello world\"\n     *      }\n     *    }\n     */\n\n    let webhook = this.webhook;\n    if(this.secret){\n      const signRet = await this.sign();\n      webhook = `${webhook}&timestamp=${signRet.timestamp}&sign=${signRet.sign}`;\n    }\n\n    const at :any= {}\n    if(this.atUserIds && this.atUserIds.length>0){\n        at.atUserIds = this.atUserIds;\n    }\n    if(this.atMobiles && this.atMobiles.length>0){\n        at.atMobiles = this.atMobiles;\n    }\n    if(this.isAtAll){\n        at.isAtAll = true;\n    }\n\n    const color = body.errorMessage?'red':'green';\n    const res = await this.http.request({\n      url: webhook,\n      method: 'POST',\n      data: {\n        at: at,\n        markdown: {\n          title: body.title,\n          text: `<font color='${color}'>${body.title}</font>\\n\\n\\n ${body.content}\\n\\n\\n[查看详情](${body.url})`,\n        },\n        msgtype:\"markdown\"\n      },\n    });\n    if(res.errcode>100){\n      throw new Error(`发送失败：${res.errmsg}`);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/discord/index.ts",
    "content": "import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from '@certd/pipeline';\n\n@IsNotification({\n  name: 'discord',\n  title: 'Discord 通知',\n  desc: 'Discord 机器人通知',\n  needPlus: true,\n})\nexport class DiscordNotification extends BaseNotification {\n  @NotificationInput({\n    title: 'Webhook URL',\n    component: {\n      placeholder: 'https://discord.com/api/webhooks/xxxxx/xxxx',\n    },\n    helper: '[Discord Webhook 说明](https://discord.com/developers/docs/resources/webhook#execute-webhook)',\n    required: true,\n  })\n  webhook = '';\n\n  @NotificationInput({\n    title: '提醒指定成员',\n    component: {\n      name: 'a-select',\n      vModel: 'value',\n      mode: 'tags',\n      open: false,\n    },\n    required: false,\n    helper: '填写成员的Id，或者角色Id（&id），或者everyone',\n  })\n  mentionedList!: string[];\n\n  @NotificationInput({\n    title: '代理',\n    component: {\n      placeholder: 'http://xxxxx:xx',\n    },\n    helper: '使用https_proxy',\n    required: false,\n  })\n  httpsProxy = '';\n\n  @NotificationInput({\n    title: '忽略证书校验',\n    value: false,\n    component: {\n      name: 'a-switch',\n      vModel: 'checked',\n    },\n    required: false,\n  })\n  skipSslVerify: boolean;\n\n  async send(body: NotificationBody) {\n    if (!this.webhook) {\n      throw new Error('Webhook URL 不能为空');\n    }\n\n    // 创建 Discord 消息体\n    let content = `${body.title}\\n${body.content}\\n\\n[查看详情](${body.url})`;\n    if (this.mentionedList && this.mentionedList.length > 0) {\n      content += `\\n${this.mentionedList.map(item => `<@${item}>  `).join('')}`;\n    }\n\n    const json = {\n      content: content,\n    };\n\n    await this.http.request({\n      url: this.webhook,\n      method: 'POST',\n      data: json,\n      httpProxy: this.httpsProxy,\n      skipSslVerify: this.skipSslVerify,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/email/index.ts",
    "content": "import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from '@certd/pipeline';\n\n@IsNotification({\n  name: 'email',\n  title: '电子邮件',\n  desc: '电子邮件通知',\n})\nexport class EmailNotification extends BaseNotification {\n  @NotificationInput({\n    title: '收件人邮箱',\n    component: {\n      name: 'email-selector',\n      vModel: 'value',\n      mode: 'tags',\n      // open: false,\n    },\n    required: true,\n    helper: '可以填写多个，填写一个按回车键再填写下一个\\n需要先[配置邮件服务器](#/sys/settings/email)',\n  })\n  receivers!: string[];\n\n  async send(body: NotificationBody) {\n    await this.ctx.emailService.send({\n      subject: body.title,\n      content: body.content + '\\n\\n[查看详情](' + body.url + ')',\n      receivers: this.receivers,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/feishu/index.ts",
    "content": "import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from \"@certd/pipeline\";\n\n@IsNotification({\n  name: 'feishu',\n  title: '飞书通知',\n  desc: '飞书群聊webhook通知',\n  needPlus: true,\n})\n// https://open.dingtalk.com/document/orgapp/the-creation-and-installation-of-the-application-robot-in-the?spm=ding_open_doc.document.0.0.242d1563cDgZz3\nexport class FeishuNotification extends BaseNotification {\n  @NotificationInput({\n    title: 'webhook地址',\n    component: {\n      placeholder: 'https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxx',\n    },\n    helper: '飞书APP->群聊->设置->机器人->添加机器人->自定义webhook->[创建机器人->复制webhook地址](https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot?lang=zh-CN)',\n    required: true,\n  })\n  webhook = '';\n\n  @NotificationInput({\n    title: '加签密钥',\n    component: {\n      placeholder: 'SECxxxxxxxxxxxxxxxxxxxxx',\n    },\n    helper: '必须选择一种安全设置，建议选择加密密钥',\n    required: false,\n  })\n  secret = '';\n\n\n  @NotificationInput({\n    title: '@用户',\n    component: {\n      placeholder: '非必填，支持多个，填写完一个按回车',\n      name: 'a-select',\n      vModel: 'value',\n      mode: 'tags',\n      multiple: true,\n      open: false,\n    },\n    helper: '填写要@的用户ID：【ou_xxxxxxxxx】\\n用户ID获取方法,[查看OpenId获取方法](https://open.feishu.cn/document/home/user-identity-introduction/open-id)',\n    required: false,\n  })\n  atUserIds:string[];\n\n\n  @NotificationInput({\n    title: '@all',\n    component: {\n      placeholder: '非必填',\n      name: 'a-switch',\n      vModel:\"checked\"\n    },\n    helper: '是否@所有人',\n    required: false,\n  })\n  isAtAll:boolean;\n\n\n  async sign(){\n    const crypto = await import('crypto');\n    const secret = this.secret;\n    const timestamp = Math.floor(Date.now() / 1000);\n    const str = Buffer.from(`${timestamp}\\n${secret}`, 'utf8');\n    const sign = crypto.createHmac('SHA256', str);\n    sign.update(Buffer.alloc(0));\n    return { timestamp, sign: sign.digest('base64') };\n  }\n\n  async send(body: NotificationBody) {\n    if (!this.webhook) {\n      throw new Error('webhook地址不能为空');\n    }\n    /**\n     *\n     *      \"msgtype\": \"text\",\n     *      \"text\": {\n     *          \"content\": \"hello world\"\n     *      }\n     *    }\n     */\n\n    let webhook = this.webhook;\n\n\n    /*\n    // @ 单个用户\n<at user_id=\"ou_xxx\">名字</at>\n// @ 所有人\n<at user_id=\"all\">所有人</at>\n     */\n    let atText = \"\"\n    if(this.atUserIds && this.atUserIds.length>0){\n      atText = this.atUserIds.map((id:string)=>{\n        const nameIndex = id.indexOf(\".\");\n        let name = id\n        if(nameIndex>0){\n          name = id.substring(nameIndex+1)\n        }\n        return `<at id=${id}>${name}</at>`\n      }).join(\"\");\n    }\n    if(this.isAtAll){\n      atText = `<at id=all>所有人</at>`\n    }\n\n    if (atText){\n      atText = `\\n${atText}`\n    }\n\n    let sign:any = {}\n    if(this.secret){\n      const signRet = await this.sign();\n      sign = {\n        timestamp: signRet.timestamp,\n        sign: signRet.sign\n      }\n    }\n\n    const cardBody = {\n      \"msg_type\": \"interactive\",\n      \"card\": {\n        \"schema\": \"2.0\",\n        \"config\": {\n          \"update_multi\": true,\n          \"style\": {\n            \"text_size\": {\n              \"normal_v2\": {\n                \"default\": \"normal\",\n                \"pc\": \"normal\",\n                \"mobile\": \"heading\"\n              }\n            }\n          }\n        },\n        \"header\": {\n          \"title\": {\n            \"tag\": \"plain_text\",\n            \"content\": body.title\n          },\n          \"subtitle\": {\n            \"tag\": \"plain_text\",\n            \"content\": \"\"\n          },\n          \"template\": body.errorMessage?\"red\":\"green\",\n          \"padding\": \"12px 12px 12px 12px\"\n        },\n        \"body\": {\n          \"direction\": \"vertical\",\n          \"padding\": \"12px 12px 12px 12px\",\n          \"elements\": [\n            {\n              \"tag\": \"markdown\",\n              \"content\": body.content+atText,\n              \"text_align\": \"left\",\n              \"text_size\": \"normal_v2\",\n              \"margin\": \"0px 0px 0px 0px\"\n            },\n            {\n              \"tag\": \"button\",\n              \"text\": {\n                \"tag\": \"plain_text\",\n                \"content\": \"查看详情\"\n              },\n              \"type\": \"default\",\n              \"width\": \"default\",\n              \"size\": \"medium\",\n              \"behaviors\": [\n                {\n                  \"type\": \"open_url\",\n                  \"default_url\": body.url,\n                  \"pc_url\": \"\",\n                  \"ios_url\": \"\",\n                  \"android_url\": \"\"\n                }\n              ],\n              \"margin\": \"0px 0px 0px 0px\"\n            }\n          ]\n        },\n\n      }\n    }\n\n\n    const res = await this.http.request({\n      url: webhook,\n      method: 'POST',\n      data: {\n        ...sign,\n        ...cardBody\n      },\n    });\n    if(res.code>100){\n      throw new Error(`发送失败：${res.msg}`);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/index.ts",
    "content": "export * from './qywx/index.js';\nexport * from './email/index.js';\nexport * from './iyuu/index.js';\nexport * from './webhook/index.js';\nexport * from './serverchan/index.js';\nexport * from './serverchan3/index.js';\nexport * from './anpush/index.js';\nexport * from './telegram/index.js';\nexport * from './discord/index.js';\nexport * from './slack/index.js';\nexport * from './bark/index.js';\nexport * from './feishu/index.js';\nexport * from './dingtalk/index.js';\nexport * from './vocechat/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/iyuu/index.ts",
    "content": "import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from '@certd/pipeline';\n\n@IsNotification({\n  name: 'iyuu',\n  title: '爱语飞飞微信通知(iyuu)',\n  desc: 'https://iyuu.cn/',\n  needPlus: true,\n})\nexport class IyuuNotification extends BaseNotification {\n  @NotificationInput({\n    title: 'Token令牌',\n    component: {\n      placeholder: '',\n    },\n    helper: 'https://iyuu.cn/ 微信扫码获取',\n    required: true,\n  })\n  token = '';\n\n  async send(body: NotificationBody) {\n    if (!this.token) {\n      throw new Error('token不能为空');\n    }\n    const res = await this.http.request({\n      url: `https://iyuu.cn/${this.token}.send`,\n      method: 'POST',\n      data: {\n        text: body.title,\n        desp: body.content + '\\n\\n[查看详情](' + body.url + ')',\n      },\n    });\n\n    if (res.errcode !== 0) {\n      throw new Error(res.errmsg);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/qywx/index.ts",
    "content": "import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from '@certd/pipeline';\n\n@IsNotification({\n  name: 'qywx',\n  title: '企业微信通知',\n  desc: '企业微信群聊机器人通知',\n  needPlus: true,\n})\nexport class QywxNotification extends BaseNotification {\n  @NotificationInput({\n    title: 'webhook地址',\n    component: {\n      placeholder: 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx',\n    },\n    helper: '[企微群聊机器人配置说明](https://developer.work.weixin.qq.com/document/path/91770)',\n    required: true,\n  })\n  webhook = '';\n\n  @NotificationInput({\n    title: '提醒指定成员',\n    component: {\n      name: 'a-select',\n      vModel: 'value',\n      mode: 'tags',\n      open: false,\n    },\n    required: false,\n    helper: '填写成员名字，@all 为提醒所有人',\n  })\n  mentionedList!: string[];\n\n  @NotificationInput({\n    title: '提醒指定手机号成员',\n    component: {\n      name: 'a-select',\n      vModel: 'value',\n      mode: 'tags',\n      open: false,\n    },\n    required: false,\n    helper: '填写成员手机号，@all 为提醒所有人',\n  })\n  mentionedMobileList!: string[];\n\n  async send(body: NotificationBody) {\n    if (!this.webhook) {\n      throw new Error('webhook地址不能为空');\n    }\n\n    await this.http.request({\n      url: this.webhook,\n      method: 'POST',\n      data: {\n        msgtype: 'text',\n        text: {\n          content: `${body.title}\\n${body.content}\\n查看详情: ${body.url}`,\n          mentioned_list: this.mentionedList,\n          mentioned_mobile_list: this.mentionedMobileList,\n        },\n      },\n    });\n\n\n    //Markdown 模式不支持@\n\n    // const color = body.errorMessage?'red':'green';\n    // await this.http.request({\n    //   url: this.webhook,\n    //   method: 'POST',\n    //   data: {\n    //     msgtype: 'markdown',\n    //     markdown: {\n    //       content: `<font color='${color}'>${body.title}</font>\\n\\n\\n${body.content}\\n\\n[查看详情](${body.url})`,\n    //       mentioned_list: this.mentionedList,\n    //       mentioned_mobile_list: this.mentionedMobileList,\n    //     },\n    //   },\n    // });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/serverchan/index.ts",
    "content": "import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from '@certd/pipeline';\n\n@IsNotification({\n  name: 'serverchan',\n  title: 'Server酱ᵀ',\n  desc: 'https://sct.ftqq.com/',\n  needPlus: true,\n})\nexport class ServerChanNotification extends BaseNotification {\n  @NotificationInput({\n    title: '服务地址',\n    value: 'https://sctapi.ftqq.com',\n    required: true,\n  })\n  endpoint = 'https://sctapi.ftqq.com';\n\n  @NotificationInput({\n    title: 'SendKey',\n    component: {\n      placeholder: 'https://sctapi.ftqq.com/<SENDKEY>.send',\n    },\n    helper: 'https://sct.ftqq.com/ 微信扫码获取',\n    required: true,\n  })\n  sendKey = '';\n\n  @NotificationInput({\n    title: '消息通道号',\n    component: {\n      placeholder: '9|66',\n    },\n    helper: '可以不填，最多两个通道，[通道配置说明](https://sct.ftqq.com/sendkey)',\n    required: false,\n  })\n  channel: string;\n\n  @NotificationInput({\n    title: '是否隐藏IP',\n    component: {\n      name: 'a-switch',\n      vModel: 'checked',\n    },\n    required: false,\n  })\n  noip: boolean;\n\n  @NotificationInput({\n    title: '忽略证书校验',\n    value: false,\n    component: {\n      name: 'a-switch',\n      vModel: 'checked',\n    },\n    required: false,\n  })\n  skipSslVerify: boolean;\n\n  async send(body: NotificationBody) {\n    if (!this.sendKey) {\n      throw new Error('sendKey不能为空');\n    }\n    await this.http.request({\n      url: `${this.endpoint}/${this.sendKey}.send`,\n      method: 'POST',\n      data: {\n        text: body.title,\n        desp: body.content + '\\n\\n[查看详情](' + body.url + ')',\n      },\n      skipSslVerify: this.skipSslVerify,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/serverchan3/index.ts",
    "content": "import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from '@certd/pipeline';\n\n@IsNotification({\n  name: 'serverchan3',\n  title: 'Server酱³',\n  desc: 'https://doc.sc3.ft07.com/serverchan3',\n  needPlus: true,\n})\nexport class ServerChan3Notification extends BaseNotification {\n  @NotificationInput({\n    title: 'ApiURL',\n    component: {\n      placeholder: 'https://uid.push.ft07.com/send/sendKey.send',\n    },\n    required: true,\n  })\n  apiURL = '';\n\n  @NotificationInput({\n    title: '标签Tags',\n    component: {\n      name: 'a-select',\n      vModel: 'value',\n      mode: 'tags',\n      open: false,\n    },\n    helper: '支持多个，回车后填写下一个',\n    required: false,\n  })\n  tags: string[];\n\n  @NotificationInput({\n    title: 'short',\n    required: false,\n  })\n  short: string;\n\n  @NotificationInput({\n    title: '忽略证书校验',\n    value: false,\n    component: {\n      name: 'a-switch',\n      vModel: 'checked',\n    },\n    required: false,\n  })\n  skipSslVerify: boolean;\n\n  async send(body: NotificationBody) {\n    if (!this.apiURL) {\n      throw new Error('sendKey不能为空');\n    }\n    await this.http.request({\n      url: `${this.apiURL}`,\n      method: 'POST',\n      data: {\n        text: body.title,\n        desp: body.content + '\\n\\n[查看详情](' + body.url + ')',\n        tags: this.tags.join('|'),\n        short: this.short,\n      },\n      skipSslVerify: this.skipSslVerify,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/slack/index.ts",
    "content": "import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from '@certd/pipeline';\n\n@IsNotification({\n  name: 'slack',\n  title: 'Slack通知',\n  desc: 'Slack消息推送通知',\n  needPlus: true,\n})\nexport class SlackNotification extends BaseNotification {\n  @NotificationInput({\n    title: 'webhook地址',\n    component: {\n      placeholder: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX',\n    },\n    helper: '[APPS](https://api.slack.com/apps/)->进入APP->incoming-webhooks->Add New Webhook to Workspace',\n    required: true,\n  })\n  webhook = '';\n\n  @NotificationInput({\n    title: '代理',\n    component: {\n      placeholder: 'http://xxxxx:xx',\n    },\n    helper: '使用https_proxy',\n    required: false,\n  })\n  httpsProxy = '';\n\n  @NotificationInput({\n    title: '忽略证书校验',\n    value: false,\n    component: {\n      name: 'a-switch',\n      vModel: 'checked',\n    },\n    required: false,\n  })\n  skipSslVerify: boolean;\n\n  async send(body: NotificationBody) {\n    if (!this.webhook) {\n      throw new Error('token不能为空');\n    }\n\n    await this.http.request({\n      url: this.webhook,\n      method: 'POST',\n      data: {\n        text: `${body.title}\\n${body.content}\\n\\n[查看详情](${body.url})`,\n      },\n      httpProxy: this.httpsProxy,\n      skipSslVerify: this.skipSslVerify,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/telegram/index.ts",
    "content": "import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from '@certd/pipeline';\n\n@IsNotification({\n  name: 'telegram',\n  title: 'Telegram通知',\n  desc: 'Telegram Bot推送通知',\n  needPlus: true,\n})\nexport class TelegramNotification extends BaseNotification {\n  @NotificationInput({\n    title: 'URL',\n    value: 'https://api.telegram.org',\n    component: {\n      placeholder: 'https://api.telegram.org',\n    },\n    required: true,\n  })\n  endpoint = 'https://api.telegram.org';\n\n  @NotificationInput({\n    title: 'Bot Token',\n    component: {\n      placeholder: '123456789:ABCdefGhijklmnopqrstUVWXyz',\n    },\n    helper: '[token获取](https://core.telegram.org/bots/features#botfather)',\n    required: true,\n  })\n  botToken = '';\n\n  @NotificationInput({\n    title: '聊天ID',\n    component: {\n      placeholder: '聊天ID，例如 123456789 或 @channelusername',\n    },\n    helper: '用户ID(纯数字)或频道名称(@xxxx)',\n    required: true,\n  })\n  chatId = '';\n\n  @NotificationInput({\n    title: '代理',\n    component: {\n      placeholder: 'http://xxxxx:xx',\n    },\n    helper: '使用https_proxy',\n    required: false,\n  })\n  httpsProxy = '';\n\n  @NotificationInput({\n    title: '忽略证书校验',\n    value: false,\n    component: {\n      name: 'a-switch',\n      vModel: 'checked',\n    },\n    required: false,\n  })\n  skipSslVerify: boolean;\n\n  replaceText(text: string) {\n    // .*()<> 等都需要用\\\\进行替换\n    return text.replace(/[\\\\.*()<>]/g, '\\\\$&');\n  }\n  async send(body: NotificationBody) {\n    if (!this.botToken || !this.chatId) {\n      throw new Error('Bot Token 和聊天ID不能为空');\n    }\n\n    // 构建消息内容\n    const messageContent = `${this.replaceText(body.title)}\\n\\n${this.replaceText(body.content)}\\n\\n[查看详情](${body.url})`;\n\n    // Telegram API URL\n    const url = `https://api.telegram.org/bot${this.botToken}/sendMessage`;\n\n    // 发送 HTTP 请求\n    await this.http.request({\n      url: url,\n      method: 'POST',\n      data: {\n        chat_id: this.chatId,\n        text: messageContent,\n        parse_mode: 'MarkdownV2', // 或使用 'HTML' 取决于需要的格式\n      },\n      httpProxy: this.httpsProxy,\n      skipSslVerify: this.skipSslVerify,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/vocechat/index.ts",
    "content": "import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from '@certd/pipeline';\n\n@IsNotification({\n  name: 'vocechat',\n  title: 'VoceChat通知',\n  desc: 'https://voce.chat',\n  needPlus: true,\n})\nexport class VoceChatNotification extends BaseNotification {\n  @NotificationInput({\n    title: '服务地址',\n    component: {\n      placeholder: 'https://replace.your.domain',\n    },\n    required: true,\n  })\n  endpoint = '';\n\n  @NotificationInput({\n    title: 'apiKey',\n    component: {\n      placeholder: '',\n    },\n    helper: '[获取APIKEY](https://doc.voce.chat/bot/bot-and-webhook)',\n    required: true,\n  })\n  apiKey = '';\n\n  @NotificationInput({\n    title: '目标类型',\n    component: {\n      name: 'a-select',\n      options: [\n        { value: 'user', label: '用户' },\n        { value: 'channel', label: '频道' },\n      ],\n    },\n    required: true,\n    helper: '发送消息的目标类型',\n  })\n  targetType = '';\n\n  @NotificationInput({\n    title: '目标ID',\n    component: {\n      placeholder: '发送消息的目标ID',\n    },\n    required: true,\n    helper: '目标ID可以是用户ID或频道ID',\n  })\n  targetId = '';\n\n  @NotificationInput({\n    title: '忽略证书校验',\n    value: false,\n    component: {\n      name: 'a-switch',\n      vModel: 'checked',\n    },\n    required: false,\n  })\n  skipSslVerify: boolean;\n\n  async send(body: NotificationBody) {\n    if (!this.apiKey) {\n      throw new Error('API Key不能为空');\n    }\n\n    if (!this.targetId) {\n      throw new Error('目标ID不能为空');\n    }\n\n    const url = this.targetType === 'user' ? '/api/bot/send_to_user/' : '/api/bot/send_to_group/';\n    await this.http.request({\n      url: url + this.targetId, // 这是示例API URL，请根据实际API文档调整\n      baseURL: this.endpoint,\n      method: 'POST',\n      headers: {\n        'x-api-key': this.apiKey,\n        'Content-Type': 'text/markdown',\n      },\n      data: `# ${body.title}\\n\\n${body.content}\\n\\n[查看详情](${body.url})`,\n      skipSslVerify: this.skipSslVerify,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-notification/webhook/index.ts",
    "content": "import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from '@certd/pipeline';\nimport qs from 'qs';\n\n@IsNotification({\n  name: 'webhook',\n  title: '自定义webhook',\n  desc: '根据模版自定义http请求',\n})\nexport class WebhookNotification extends BaseNotification {\n  @NotificationInput({\n    title: 'webhook地址',\n    component: {\n      placeholder: 'https://xxxxx.com/xxxx',\n    },\n    col: {\n      span: 24,\n    },\n    required: true,\n  })\n  webhook = '';\n\n  @NotificationInput({\n    title: '请求方式',\n    value: 'POST',\n    component: {\n      name: 'a-select',\n      placeholder: 'post/put/get',\n      options: [\n        { value: 'POST', label: 'POST' },\n        { value: 'PUT', label: 'PUT' },\n        { value: 'GET', label: 'GET' },\n      ],\n    },\n    required: true,\n  })\n  method = '';\n\n  @NotificationInput({\n    title: 'ContentType',\n    value: 'application/json',\n    component: {\n      name: 'a-auto-complete',\n      options: [\n        { value: 'application/json', label: 'application/json' },\n        { value: 'application/x-www-form-urlencoded', label: 'application/x-www-form-urlencoded' },\n      ],\n    },\n    helper: '也可以自定义填写',\n    required: true,\n  })\n  contentType = '';\n\n  @NotificationInput({\n    title: 'Headers',\n    component: {\n      name: 'a-textarea',\n      vModel: 'value',\n      rows: 2,\n    },\n    col: {\n      span: 24,\n    },\n    helper: '一行一个，格式为key=value',\n    required: false,\n  })\n  headers = '';\n\n  @NotificationInput({\n    title: '消息body模版',\n    value: `{\n    \"title\":\"{title}\",\n    \"content\":\"{content}\\\\n[查看详情]({url})\"\n}`,\n    component: {\n      name: 'a-textarea',\n      rows: 4,\n    },\n    col: {\n      span: 24,\n    },\n    helper: `根据对应的webhook接口文档，构建一个json对象作为参数（默认值只是一个示例，一般不是正确的参数）\\n支持变量：{title}、{content}、{url}，变量用{}包裹\\n字符串需要双引号，使用\\\\n换行\\n如果是get方式，将作为query参数拼接到url上`,\n    required: true,\n  })\n  template = '';\n\n  @NotificationInput({\n    title: '忽略证书校验',\n    value: false,\n    component: {\n      name: 'a-switch',\n      vModel: 'checked',\n    },\n    required: false,\n  })\n  skipSslVerify: boolean;\n\n  replaceTemplate(target: string, body: any, urlEncode = false) {\n    let bodyStr = target;\n    const keys = Object.keys(body);\n    for (const key of keys) {\n      let value = urlEncode ? encodeURIComponent(body[key]) : body[key];\n      value = value.replaceAll(`\\n`, \"\\\\n\");\n      bodyStr = bodyStr.replaceAll(`{${key}}`, value);\n\n    }\n    return bodyStr;\n  }\n\n  async send(body: NotificationBody) {\n    if (!this.template) {\n      throw new Error('模版不能为空');\n    }\n    if (!this.webhook) {\n      throw new Error('webhook不能为空');\n    }\n\n    const replaceBody = {\n      title: body.title,\n      content: body.content,\n      url: body.url,\n    };\n    const bodyStr = this.replaceTemplate(this.template, replaceBody);\n    let data = JSON.parse(bodyStr);\n\n    let url = this.webhook;\n    if (this.method.toLowerCase() === 'get') {\n      const query = qs.stringify(data);\n      if (url.includes('?')) {\n        url = `${url}&${query}`;\n      } else {\n        url = `${url}?${query}`;\n      }\n      data = null;\n    }\n\n    const headers: any = {};\n    if (this.headers && this.headers.trim()) {\n      this.headers.split('\\n').forEach(item => {\n        item = item.trim();\n        if (item) {\n          const eqIndex = item.indexOf('=');\n          if (eqIndex <= 0) {\n            this.logger.warn('header格式错误,请使用=号分割', item);\n            return;\n          }\n          const key = item.substring(0, eqIndex);\n          headers[key] = item.substring(eqIndex + 1);\n        }\n      });\n    }\n\n    try {\n      const res = await this.http.request({\n        url: url,\n        method: this.method,\n        headers: {\n          'Content-Type': `${this.contentType}; charset=UTF-8`,\n          ...headers,\n        },\n        data: data,\n        skipSslVerify: this.skipSslVerify,\n      });\n      return res\n    } catch (e) {\n      if (e.response?.data) {\n        throw new Error(e.message + ',' + JSON.stringify(e.response.data));\n      }\n      throw e;\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-other/index.ts",
    "content": "export * from './plugins/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-other/plugins/index.ts",
    "content": "export * from './plugin-restart.js';\nexport * from './plugin-script.js';\nexport * from './plugin-wait.js';\nexport * from './plugin-db-backup.js';\nexport * from './plugin-deploy-to-mail.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-db-backup.ts",
    "content": "import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport dayjs from \"dayjs\";\nimport { AbstractPlusTaskPlugin } from \"@certd/plugin-plus\";\nimport JSZip from \"jszip\";\nimport * as os from \"node:os\";\nimport { OssClientContext, ossClientFactory, OssClientRemoveByOpts, SshAccess, SshClient } from \"@certd/plugin-lib\";\n\nconst defaultBackupDir = 'certd_backup';\nconst defaultFilePrefix = 'db_backup';\n\n@IsTaskPlugin({\n  name: 'DBBackupPlugin',\n  title: '数据库备份',\n  icon: 'lucide:database-backup',\n  desc: '仅支持备份SQLite数据库',\n  group: pluginGroups.other.key,\n  showRunStrategy: true,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.AlwaysRun,\n    },\n  },\n  needPlus: true,\n})\nexport class DBBackupPlugin extends AbstractPlusTaskPlugin {\n  @TaskInput({\n    title: '备份方式',\n    value: 'local',\n    component: {\n      name: 'a-select',\n      options: [\n        {label: '本地复制', value: 'local'},\n        {label: 'ssh上传', value: 'ssh'},\n        {label: 'oss上传', value: 'oss'},\n      ],\n      placeholder: '',\n    },\n    helper: '支持本地复制、ssh上传',\n    required: true,\n  })\n  backupMode = 'local';\n\n  @TaskInput({\n    title: '主机登录授权',\n    component: {\n      name: 'access-selector',\n      type: 'ssh',\n    },\n    mergeScript: `\n      return {\n         show:ctx.compute(({form})=>{\n          return form.backupMode === 'ssh';\n        })\n      }\n    `,\n    required: true,\n  })\n  sshAccessId!: number;\n\n\n  @TaskInput({\n    title: 'OSS类型',\n    component: {\n      name: 'a-select',\n      options: [\n        {value: \"alioss\", label: \"阿里云OSS\"},\n        {value: \"s3\", label: \"MinIO/S3\"},\n        {value: \"qiniuoss\", label: \"七牛云\"},\n        {value: \"tencentcos\", label: \"腾讯云COS\"},\n        {value: \"ftp\", label: \"Ftp\"},\n        {value: \"sftp\", label: \"Sftp\"},\n      ]\n    },\n    mergeScript: `\n      return {\n         show:ctx.compute(({form})=>{\n          return form.backupMode === 'oss';\n        })\n      }\n    `,\n    required: true,\n  })\n  ossType!: string;\n\n  @TaskInput({\n    title: 'OSS授权',\n    component: {\n      name: 'access-selector',\n    },\n    mergeScript: `\n      return {\n        show:ctx.compute(({form})=>{\n          return form.backupMode === 'oss';\n        }),\n        component:{\n          type: ctx.compute(({form})=>{\n            return form.ossType;\n          }),\n        }\n      }\n    `,\n    required: true,\n  })\n  ossAccessId!: number;\n\n\n  @TaskInput({\n    title: '备份保存目录',\n    component: {\n      name: 'a-input',\n      type: 'value',\n      placeholder: `默认${defaultBackupDir}`,\n    },\n    helper: `ssh方式默认保存在当前用户的${defaultBackupDir}目录下，本地方式默认保存在data/${defaultBackupDir}目录下，也可以填写绝对路径`,\n    required: false,\n  })\n  backupDir: string = defaultBackupDir;\n\n  @TaskInput({\n    title: '备份文件前缀',\n    component: {\n      name: 'a-input',\n      vModel: 'value',\n      placeholder: `默认${defaultFilePrefix}`,\n    },\n    required: false,\n  })\n  filePrefix: string = defaultFilePrefix;\n\n  @TaskInput({\n    title: '附加上传文件',\n    value: true,\n    component: {\n      name: 'a-switch',\n      vModel: 'checked',\n      placeholder: `是否备份上传的头像等文件`,\n    },\n    required: false,\n  })\n  withUpload = true;\n\n  @TaskInput({\n    title: '删除过期备份',\n    component: {\n      name: 'a-input-number',\n      vModel: 'value',\n      placeholder: '20',\n    },\n    helper: '删除多少天前的备份,不填则不删除，windows暂不支持',\n    required: false,\n  })\n  retainDays!: number;\n\n  async onInstance() {\n  }\n\n  async execute(): Promise<void> {\n    this.logger.info('开始备份数据库');\n\n    let dbPath = process.env.certd_typeorm_dataSource_default_database;\n    dbPath = dbPath || './data/db.sqlite';\n    if (!fs.existsSync(dbPath)) {\n      this.logger.error('数据库文件不存在：', dbPath);\n      return;\n    }\n    const dbTmpFilename = `${this.filePrefix}_${dayjs().format('YYYYMMDD_HHmmss')}_sqlite`;\n    const dbZipFilename = `${dbTmpFilename}.zip`;\n    const tempDir = path.resolve(os.tmpdir(), 'certd_backup');\n    if (!fs.existsSync(tempDir)) {\n      await fs.promises.mkdir(tempDir, {recursive: true});\n    }\n    const dbTmpPath = path.resolve(tempDir, dbTmpFilename);\n    const dbZipPath = path.resolve(tempDir, dbZipFilename);\n\n    //复制到临时目录\n    await fs.promises.copyFile(dbPath, dbTmpPath);\n    //本地压缩\n    const zip = new JSZip();\n    const stream = fs.createReadStream(dbTmpPath);\n    // 使用流的方式添加文件内容\n    zip.file(dbTmpFilename, stream, {binary: true, compression: 'DEFLATE'});\n\n    const uploadDir = path.resolve('data', 'upload');\n    if (this.withUpload && fs.existsSync(uploadDir)) {\n      zip.folder(uploadDir);\n    }\n\n    const content = await zip.generateAsync({type: 'nodebuffer'});\n\n    await fs.promises.writeFile(dbZipPath, content);\n    this.logger.info(`数据库文件压缩完成:${dbZipPath}`);\n\n    this.logger.info('开始备份，当前备份方式：', this.backupMode);\n    const backupDir = this.backupDir || defaultBackupDir;\n    const backupFilePath = `${backupDir}/${dbZipFilename}`;\n\n    if (this.backupMode === 'local') {\n      await this.localBackup(dbZipPath, backupDir, backupFilePath);\n    } else if (this.backupMode === 'ssh') {\n      await this.sshBackup(dbZipPath, backupDir, backupFilePath);\n    } else if (this.backupMode === 'oss') {\n      await this.ossBackup(dbZipPath, backupDir, backupFilePath);\n    } else {\n      throw new Error(`不支持的备份方式:${this.backupMode}`);\n    }\n\n    this.logger.info('数据库备份完成');\n  }\n\n  private async localBackup(dbPath: string, backupDir: string, backupPath: string) {\n    if (!backupPath.startsWith('/')) {\n      backupPath = path.join('./data/', backupPath);\n    }\n    const dir = path.dirname(backupPath);\n    if (!fs.existsSync(dir)) {\n      await fs.promises.mkdir(dir, {recursive: true});\n    }\n    backupPath = path.resolve(backupPath);\n    await fs.promises.copyFile(dbPath, backupPath);\n    this.logger.info('备份文件路径：', backupPath);\n\n    if (this.retainDays > 0) {\n      // 删除过期备份\n      this.logger.info('开始删除过期备份文件');\n      const files = fs.readdirSync(dir);\n      const now = Date.now();\n      let count = 0;\n      files.forEach(file => {\n        const filePath = path.join(dir, file);\n        const stat = fs.statSync(filePath);\n        if (now - stat.mtimeMs > this.retainDays * 24 * 60 * 60 * 1000) {\n          fs.unlinkSync(filePath as fs.PathLike);\n          count++;\n          this.logger.info('删除过期备份文件：', filePath);\n        }\n      });\n      this.logger.info('删除过期备份文件数:', count);\n    }\n  }\n\n  private async sshBackup(dbPath: string, backupDir: string, backupPath: string) {\n    const access: SshAccess = await this.getAccess(this.sshAccessId);\n    const sshClient = new SshClient(this.logger);\n    this.logger.info('备份目录：', backupPath);\n    await sshClient.uploadFiles({\n      connectConf: access,\n      transports: [{localPath: dbPath, remotePath: backupPath}],\n      mkdirs: true,\n    });\n    this.logger.info('备份文件上传完成');\n\n    if (this.retainDays > 0) {\n      // 删除过期备份\n      this.logger.info('开始删除过期备份文件');\n      const isWin = access.windows;\n      let script: string[] = [];\n      if (isWin) {\n        throw new Error('删除过期文件暂不支持windows系统');\n        // script = `forfiles /p ${backupDir} /s /d -${this.retainDays} /c \"cmd /c del @path\"`;\n      } else {\n        script = [`cd ${backupDir}`, 'echo 备份目录', 'pwd', `find . -type f -mtime +${this.retainDays} -name '${this.filePrefix}*' -exec rm -f {} \\\\;`];\n      }\n\n      await sshClient.exec({\n        connectConf: access,\n        script,\n      });\n      this.logger.info('删除过期备份文件完成');\n    }\n  }\n\n  private async ossBackup(dbPath: string, backupDir: string, backupPath: string) {\n    if (!this.ossAccessId) {\n        throw new Error('未配置ossAccessId');\n    }\n    const access = await this.getAccess(this.ossAccessId);\n    const ossType = this.ossType\n\n    const ctx: OssClientContext = {\n      logger: this.logger,\n      utils: this.ctx.utils,\n      accessService:this.accessService\n    }\n\n    this.logger.info(`开始备份文件到:${ossType}`);\n    const client = await  ossClientFactory.createOssClientByType(ossType, {\n      access,\n      ctx,\n    })\n\n    await client.upload(backupPath, dbPath);\n\n    if (this.retainDays > 0) {\n      // 删除过期备份\n      this.logger.info('开始删除过期备份文件');\n      const removeByOpts: OssClientRemoveByOpts = {\n        dir: backupDir,\n        beforeDays: this.retainDays,\n      };\n      await client.removeBy(removeByOpts);\n      this.logger.info('删除过期备份文件完成');\n    }else{\n      this.logger.info('已禁止删除过期文件');\n    }\n  }\n}\n\nnew DBBackupPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-deploy-to-mail.ts",
    "content": "import {AbstractTaskPlugin, FileItem, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput} from '@certd/pipeline';\nimport {CertInfo, CertReader} from \"@certd/plugin-cert\";\nimport dayjs from \"dayjs\";\n\n@IsTaskPlugin({\n  name: 'DeployCertToMailPlugin',\n  title: '邮件发送证书',\n  icon: 'ion:mail-outline',\n  desc: '通过邮件发送证书',\n  group: pluginGroups.other.key,\n  showRunStrategy:false,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class DeployCertToMailPlugin extends AbstractTaskPlugin {\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [\":cert:\"],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n\n  @TaskInput({\n    title: '证书压缩文件',\n    helper: '请选择前置任务输出的域名证书压缩文件',\n    component: {\n      name: 'output-selector',\n      from: [\":certZip:\"],\n    },\n    required: true,\n  })\n  certZip!: FileItem;\n\n  @TaskInput({\n    title: '接收邮箱',\n    component: {\n      name: 'EmailSelector',\n      vModel: 'value',\n      mode:\"tags\",\n    },\n    required: true,\n  })\n  email!: string[];\n\n\n  /**\n   *   title:\n   *     title: 邮件标题\n   *     helper: |-\n   *       请输入邮件标题否则将使用默认标题\n   *       域名:${certDomains}\n   *     component:\n   *       name: a-input\n   *     required: false\n   *   template:\n   *     title: 邮件模版\n   *     helper: |-\n   *       请输入模版内容否则将使用默认模版\n   *       域名:${certDomains}\n   *     value: |-\n   *       尊敬的用户你好:\n   *         以下是域名(${certDomains})证书文件\n   *     component:\n   *       name: a-textarea\n   *       autosize:\n   *         minRows: 6\n   *         maxRows: 10\n   *     required: false\n   */\n\n\n  @TaskInput({\n    title: '邮件标题',\n    component: {\n      name: 'a-input',\n      vModel: 'value',\n      placeholder:`证书申请成功【$\\{mainDomain}】`,\n    },\n    helper: '请输入邮件标题否则将使用默认标题\\n模板变量：主域名=$\\{mainDomain}、全部域名=$\\{domains}、过期时间=$\\{expiresTime}、备注=$\\{remark}、证书PEM=$\\{crt}、证书私钥=$\\{key}、中间证书/CA证书=$\\{ic}',\n    required: false,\n  })\n  title!: string;\n\n  @TaskInput({\n    title: '邮件模版',\n    component: {\n      name: 'a-textarea',\n      vModel: 'value',\n      autosize: {\n        minRows: 6,\n        maxRows: 10,\n      },\n      placeholder: `\n<div>\n  <p>证书申请成功</p>\n  <p>域名：$\\{domains}</p>\n  <p>证书有效期：$\\{expiresTime}</p>\n  <p>备注：$\\{remark}</p>\n</div>\n`,\n    },\n    helper: `请输入模版内容否则将使用默认模版，模板变量同上`,\n    required: false,\n  })\n  template!: string;\n\n  @TaskInput({\n    title: '备注',\n    component: {\n      name: 'a-input',\n      vModel: 'value',\n    },\n    required: false,\n  })\n  remark!: string;\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n\n    this.logger.info(`开始发送邮件`);\n    const certReader = new CertReader(this.cert)\n    const mainDomain = certReader.getMainDomain();\n    const domains = certReader.getAllDomains().join(',');\n\n\n    const data = {\n      mainDomain,\n      domains,\n      expiresTime: dayjs(certReader.expires).format(\"YYYY-MM-DD HH:mm:ss\"),\n      remark:this.remark ||\"\",\n      crt: this.cert.crt,\n      key: this.cert.key,\n      ic: this.cert.ic\n    }\n\n    let title = `证书申请成功【${mainDomain}】`;\n    let html = `\n        <div>\n          <p>证书申请成功</p>\n          <p>域名：${domains}</p>\n          <p>证书有效期：${data.expiresTime}</p>\n          <p>备注：${this.remark||\"\"}</p>\n        </div>\n      `;\n\n    if (this.title) {\n      const compile = this.compile(this.title);\n      title = compile(data);\n    }\n    if (this.template) {\n      const compile = this.compile(this.template);\n      html = compile(data);\n    }\n    const file = this.certZip\n    if (!file) {\n      throw new Error('证书压缩文件还未生成，重新运行证书任务');\n    }\n    await this.ctx.emailService.send({\n      subject:title,\n      html: html,\n      receivers: this.email,\n      attachments: [\n        {\n          filename: file.filename,\n          path: file.path,\n        },\n      ],\n    })\n  }\n\n  compile(templateString:string) {\n    return new Function('data', `    with(data || {}) {\n        return \\`${templateString}\\`;\n      }\n    `);\n  }\n}\nnew DeployCertToMailPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-restart.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy } from '@certd/pipeline';\nimport { httpsServer } from '../../../modules/auto/https/server.js';\n\n@IsTaskPlugin({\n  name: 'RestartCertd',\n  title: '重启 Certd',\n  icon: 'mdi:restart',\n  desc: '【仅管理员可用】 重启 certd的https服务，用于更新 Certd 的 ssl 证书',\n  group: pluginGroups.other.key,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class RestartCertdPlugin extends AbstractTaskPlugin {\n  async onInstance() {}\n  async execute(): Promise<void> {\n    if (!this.isAdmin()) {\n      throw new Error('只有管理员才能运行此任务');\n    }\n    this.logger.info('Certd https server 将在 3 秒后重启');\n    await this.ctx.utils.sleep(3000);\n    await httpsServer.restart();\n  }\n}\nnew RestartCertdPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-script.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskInstanceContext } from '@certd/pipeline';\nimport { CertInfo, CertReader } from '@certd/plugin-cert';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\nexport type CustomScriptContext = {\n  CertReader: typeof CertReader;\n  self: CustomScriptPlugin;\n} & TaskInstanceContext;\n\n@IsTaskPlugin({\n  name: 'CustomScript',\n  title: '自定义js脚本',\n  icon: 'ri:javascript-line',\n  desc: '【仅管理员】运行自定义js脚本执行',\n  group: pluginGroups.other.key,\n  showRunStrategy: true,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class CustomScriptPlugin extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '脚本',\n    helper: '自定义js脚本，[脚本编写帮助文档](https://certd.docmirror.cn/guide/use/custom-script/)',\n    component: {\n      name: 'a-textarea',\n      vModel: 'value',\n      rows: 10,\n      style: 'background-color: #000c17;color: #fafafa;',\n    },\n    required: true,\n  })\n  script!: string;\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: false,\n  })\n  cert!: CertInfo;\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    if (!this.isAdmin()) {\n      throw new Error('只有管理员才能运行此任务');\n    }\n    this.logger.info('执行自定义脚本:\\n', this.script);\n    const ctx: CustomScriptContext = {\n      CertReader,\n      self: this,\n      ...this.ctx,\n    };\n    const AsyncFunction = Object.getPrototypeOf(async () => {}).constructor;\n    const func = new AsyncFunction('ctx', this.script);\n    return await func(ctx);\n  }\n}\nnew CustomScriptPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-wait.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\n\n@IsTaskPlugin({\n  name: 'WaitPlugin',\n  title: '等待',\n  icon: 'ri:rest-time-line',\n  desc: '等待一段时间',\n  group: pluginGroups.other.key,\n  showRunStrategy:true,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class WaitPlugin extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '等待时长',\n    value: 30,\n    component: {\n      name: 'a-input-number',\n      vModel: 'value',\n    },\n    helper: '单位：秒',\n    required: true,\n  })\n  waitTime!: number;\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    this.logger.info(`等待${this.waitTime}s`);\n    await this.ctx.utils.sleep(this.waitTime * 1000);\n    this.logger.info('等待结束');\n  }\n}\nnew WaitPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-proxmox/access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from '@certd/pipeline';\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: 'proxmox',\n  title: 'proxmox',\n  desc: '',\n  icon: 'svg:icon-proxmox',\n})\nexport class ProxmoxAccess extends BaseAccess {\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    title: 'host',\n    component: {\n      placeholder: 'IP或域名',\n    },\n    required: true,\n    encrypt: false,\n  })\n  host = '';\n\n  @AccessInput({\n    title: '端口',\n    component: {\n      placeholder: '端口',\n      component: {\n        name: 'a-input-number',\n      },\n    },\n    required: true,\n    encrypt: false,\n  })\n  port: number;\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    title: '用户名',\n    component: {\n      placeholder: 'username',\n    },\n    required: true,\n    encrypt: false,\n  })\n  username = '';\n\n  @AccessInput({\n    title: '密码',\n    component: {\n      placeholder: 'password',\n    },\n    required: true,\n    encrypt: true,\n  })\n  password = '';\n\n  @AccessInput({\n    title: '领域',\n    component: {\n      placeholder: 'realm',\n    },\n    required: true,\n    encrypt: false,\n  })\n  realm = '';\n}\n\nnew ProxmoxAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-proxmox/index.ts",
    "content": "export * from './plugins/index.js';\nexport * from './access.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-proxmox/plugins/index.ts",
    "content": "export * from './plugin-upload.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-proxmox/plugins/plugin-upload.ts",
    "content": "import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { CertInfo } from '@certd/plugin-cert';\nimport { AbstractPlusTaskPlugin } from '@certd/plugin-plus';\nimport { ProxmoxAccess } from '../access.js';\nimport { createRemoteSelectInputDefine } from '@certd/plugin-lib';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  //命名规范，插件名称+功能（就是目录plugin-demo中的demo），大写字母开头，驼峰命名\n  name: 'ProxmoxUploadCert',\n  title: 'Proxmox-上传证书到Proxmox',\n  icon: 'svg:icon-proxmox',\n  //插件分组\n  group: pluginGroups.panel.key,\n  needPlus: true,\n  default: {\n    //默认值配置照抄即可\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\n//类名规范，跟上面插件名称（name）一致\nexport class ProxmoxUploadCert extends AbstractPlusTaskPlugin {\n  //证书选择，此项必须要有\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    // required: true, // 必填\n  })\n  cert!: CertInfo;\n\n  // @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  // //前端可以展示，当前申请的证书域名列表\n  // certDomains!: string[];\n\n  //授权选择框\n  @TaskInput({\n    title: 'Proxmox授权',\n    component: {\n      name: 'access-selector',\n      type: 'proxmox', //固定授权类型\n    },\n    required: true, //必填\n  })\n  accessId!: string;\n  //\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: '节点',\n      helper: '要部署证书的节点',\n      typeName: 'ProxmoxUploadCert',\n      action: ProxmoxUploadCert.prototype.onGetNodeList.name,\n      watches: ['accessId'],\n    })\n  )\n  nodes!: string[];\n\n  //插件实例化时执行的方法\n  async onInstance() {}\n\n  //插件执行方法\n  async execute(): Promise<void> {\n    const { cert } = this;\n\n    const client = await this.getClient();\n\n    for (const node of this.nodes) {\n      this.logger.info(`开始上传证书到节点：${node}`);\n      const res = await client.nodes.get(node).certificates.custom.uploadCustomCert(cert.crt, true, cert.key, true);\n      this.logger.info(`上传结果：${JSON.stringify(res.response)}`);\n    }\n\n    this.logger.info('部署成功');\n  }\n\n  async onGetNodeList() {\n    const client = await this.getClient();\n\n    const nodesRes = await client.nodes.index();\n    // this.logger.info('nodes:', nodesRes.response);\n    return nodesRes.response.data.map((node: any) => {\n      return {\n        value: node.node,\n        label: node.node,\n      };\n    });\n  }\n\n  async getClient() {\n    const access: ProxmoxAccess = await this.getAccess<ProxmoxAccess>(this.accessId);\n    const pve = await import('@certd/cv4pve-api-javascript');\n    const client = new pve.PveClient(access.host, access.port);\n    const login = await client.login(access.username, access.password, access.realm || 'pam');\n    if (!login) {\n      throw new Error(`Login failed:${JSON.stringify(login)}`);\n    }\n    const versionRes = await client.version.version();\n    this.logger.info('Proxmox version:', versionRes.response);\n    return client;\n  }\n}\n//实例化一下，注册插件\nnew ProxmoxUploadCert();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-qiniu/index.ts",
    "content": "export * from './plugin/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-qiniu/plugin/deploy-to-cdn/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine, QiniuAccess, QiniuClient } from '@certd/plugin-lib';\nimport { CertInfo } from '@certd/plugin-cert';\nimport { optionsUtils } from '@certd/basic/dist/utils/util.options.js';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'QiniuDeployCertToCDN',\n  title: '七牛云-部署证书至CDN/DCDN',\n  icon: 'svg:icon-qiniuyun',\n  group: pluginGroups.qiniu.key,\n  desc: '自动部署域名证书至七牛云CDN、DCDN',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class QiniuDeployCertToCDN extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书，或者上传到七牛云的证书id',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames, 'QiniuCertUpload'],\n    },\n    required: true,\n  })\n  cert!: CertInfo | string;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '七牛云授权',\n    component: {\n      name: 'access-selector',\n      type: 'qiniu',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: 'CDN加速域名',\n      helper: '你在七牛云上配置的CDN加速域名，比如:certd.handsfree.work',\n      rules: [{ type: 'domains', allowDotStart: true }],\n      action: QiniuDeployCertToCDN.prototype.onGetDomainList.name,\n      required: true,\n    })\n  )\n  domainName!: string | string[];\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    this.logger.info('开始部署证书到七牛云cdn');\n    const access = await this.getAccess<QiniuAccess>(this.accessId);\n    const qiniuClient = new QiniuClient({\n      http: this.ctx.http,\n      access,\n      logger: this.logger,\n    });\n\n    let certId = null;\n    if (typeof this.cert !== 'string') {\n      // 是证书id，直接上传即可\n      this.logger.info('先上传证书');\n      certId = await qiniuClient.uploadCert(this.cert, this.appendTimeSuffix('certd'));\n    } else {\n      certId = this.cert;\n    }\n\n    const domains: string[] = typeof this.domainName === 'string' ? [this.domainName] : this.domainName;\n    for (const domain of domains) {\n      //获取域名详情\n      const getUrl = `https://api.qiniu.com/domain/${domain}`;\n      const res = await qiniuClient.doRequest(getUrl, 'get');\n      this.logger.info(`域名https详情:${JSON.stringify(res.https)}`);\n      if (!res.https.certId) {\n        this.logger.info('未开启https，即将开启https，并设置证书');\n        //未开启https\n        const body = {\n          certId: certId,\n        };\n        const url = `https://api.qiniu.com/domain/${domain}/sslize`;\n        await qiniuClient.doRequest(url, 'put', body);\n        this.logger.info(`开启https并设置证书成功,certId:${certId},domain:${domain}`);\n      } else {\n        //开始修改证书\n        this.logger.info(`开始修改证书,certId:${certId},domain:${domain}`);\n        const body = {\n          certID: certId,\n          forceHttps: res.https.forceHttps,\n          http2Enable: res.https.http2Enable,\n        };\n        const url = `https://api.qiniu.com/domain/${domain}/httpsconf`;\n        await qiniuClient.doRequest(url, 'put', body);\n        this.logger.info(`修改证书成功,certId:${certId},domain:${domain}`);\n      }\n    }\n\n    this.logger.info('部署完成');\n  }\n\n  async onGetDomainList() {\n    const access = await this.getAccess<QiniuAccess>(this.accessId);\n    const qiniuClient = new QiniuClient({\n      http: this.ctx.http,\n      access,\n      logger: this.logger,\n    });\n    const url = `https://api.qiniu.com/domain?limit=1000`;\n    const res = await qiniuClient.doRequest(url, 'get');\n\n    const options = res.domains.map((item: any) => {\n      return {\n        value: item.name,\n        label: item.name,\n        domain: item.name,\n      };\n    });\n\n    return optionsUtils.buildGroupOptions(options, this.certDomains);\n  }\n}\nnew QiniuDeployCertToCDN();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-qiniu/plugin/index.ts",
    "content": "export * from './deploy-to-cdn/index.js';\nexport * from './upload-cert/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-qiniu/plugin/upload-cert/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from '@certd/pipeline';\nimport { CertInfo } from '@certd/plugin-cert';\nimport { QiniuAccess, QiniuClient } from '@certd/plugin-lib';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'QiniuCertUpload',\n  title: '七牛云-上传证书到七牛云',\n  icon: 'svg:icon-qiniuyun',\n  group: pluginGroups.qiniu.key,\n  desc: '上传到七牛云',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class QiniuCertUpload extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '证书名称',\n    helper: '上传后将以此名称作为前缀备注',\n  })\n  certName!: string;\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '七牛云授权',\n    component: {\n      name: 'access-selector',\n      type: 'qiniu',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskOutput({\n    title: '上传成功后的七牛云CertId',\n  })\n  qiniuCertId!: string;\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    this.logger.info('开始上传证书到七牛云');\n    const access = await this.getAccess<QiniuAccess>(this.accessId);\n    const qiniuClient = new QiniuClient({\n      http: this.ctx.http,\n      access,\n      logger: this.logger,\n    });\n    this.qiniuCertId = await qiniuClient.uploadCert(this.cert, this.appendTimeSuffix(this.certName));\n    this.logger.info('上传完成,id:', this.qiniuCertId);\n  }\n}\nnew QiniuCertUpload();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-qnap/index.ts",
    "content": "export * from './plugins/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-qnap/plugins/index.ts",
    "content": "export * from './plugin-qnap.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-qnap/plugins/plugin-qnap.ts",
    "content": "import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { CertInfo } from '@certd/plugin-cert';\nimport { AbstractPlusTaskPlugin } from '@certd/plugin-plus';\nimport { tmpdir } from 'node:os';\nimport fs from 'fs';\nimport { SshAccess, SshClient } from '@certd/plugin-lib';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'QnapDeploy',\n  title: '威联通-部署证书到威联通',\n  icon: 'svg:icon-qnap',\n  group: pluginGroups.panel.key,\n  desc: '部署证书到qnap',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n  needPlus: true,\n})\nexport class QnapDeploy extends AbstractPlusTaskPlugin {\n  //证书选择，此项必须要有\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n\n  //授权选择框\n  @TaskInput({\n    title: 'ssh登录授权',\n    helper: 'ssh登录授权',\n    component: {\n      name: 'access-selector',\n      type: 'ssh',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    const { cert, accessId } = this;\n\n    if (!accessId) {\n      throw new Error('主机登录授权配置不能为空');\n    }\n\n    const connectConf = await this.getAccess<SshAccess>(accessId);\n    const sshClient = new SshClient(this.logger);\n    //合并证书\n    const newCert = cert.key + '\\n' + cert.crt;\n    const tmpCertPath = tmpdir() + '/certd/cert.pem';\n    fs.writeFileSync(tmpCertPath, newCert);\n    const targetPath = '/etc/stunnel/stunnel.pem';\n    this.logger.info(`准备上传证书到服务器:${targetPath}`);\n\n    const transports: any = [];\n    transports.push({\n      localPath: tmpCertPath,\n      remotePath: targetPath,\n    });\n    this.logger.info('开始上传文件到服务器');\n    await sshClient.uploadFiles({\n      connectConf,\n      transports,\n      mkdirs: true,\n    });\n    this.logger.info('上传文件到服务器成功');\n    //重启服务\n    const restartCmd = '/bin/bash /etc/init.d/stunnel.sh restart';\n    this.logger.info('重启stunnel服务');\n    await sshClient.exec({\n      connectConf,\n      script: [restartCmd],\n    });\n    this.logger.info('执行成功');\n  }\n}\nnew QnapDeploy();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-rainyun/access.ts",
    "content": "import {AccessInput, BaseAccess, IsAccess} from \"@certd/pipeline\";\nimport {HttpRequestConfig} from \"@certd/basic\";\nimport { CertInfo } from \"@certd/plugin-cert\";\n\n\n/**\n */\n@IsAccess({\n  name: \"rainyun\",\n  title: \"雨云授权\",\n  desc: \"https://app.rainyun.com/\",\n  icon: \"svg:icon-lucky\"\n})\nexport class RainyunAccess extends BaseAccess {\n\n\n  @AccessInput({\n    title: \"ApiKey\",\n    component: {\n      placeholder: \"api-key\",\n      component: {\n        name: \"a-input\",\n        vModel: \"value\"\n      }\n    },\n    helper:\"https://app.rainyun.com/account/settings/api-key\",\n    encrypt: true,\n    required: true\n  })\n  apiKey!: string;\n\n\n\n  @AccessInput({\n    title: \"测试\",\n    component: {\n      name: \"api-test\",\n      action: \"TestRequest\"\n    },\n    helper: \"点击测试接口是否正常\"\n  })\n  testRequest = true;\n\n  async onTestRequest() {\n      await this.getDomainList({limit:1});\n      return \"ok\"\n  }\n\n  // {\"columnFilters\":{\"domains.Domain\":\"domain\"},\"sort\":[],\"page\":1,\"perPage\":20}\n  async getDomainList(req:{offset?:number,limit?:number,query?:string}){\n    const size = req.limit ?? 20;\n    const offset = req.offset ?? 0;\n    let page = Math.floor(offset / size);\n    if(offset % size === 0 ){\n      page++\n    }\n    const options ={\n      page: page,\n      perPage: size,\n      columnFilters: {\n        \"domains.Domain\": req.query??\"\"\n      },\n    }\n    const res = await this.doRequest({\n      url: `/product/domain/?options=${encodeURIComponent(JSON.stringify(options))}`,\n      method: \"GET\",\n    });\n\n    return {\n      total: res.TotalRecords,\n      list: res.Records || [],\n      limit: size,\n      offset: offset\n    }\n  }\n\n\n  async getCertList(req:{pageNo?:number,pageSize?:number,query?:string}){\n    const pageNo = req.pageNo ?? 1;\n    const pageSize = req.pageSize ?? 20;\n    const options ={\n      columnFilters: {\n        Domain: req.query??\"\"\n      },\n      sort:[],\n      page: pageNo,\n      perPage: pageSize,\n\n    }\n    const res = await this.doRequest({\n      url: `product/sslcenter/?options=${encodeURIComponent(JSON.stringify(options))}`,\n      method: \"GET\",\n    });\n\n    return {\n      total: res.TotalRecords,\n      list: res.Records || [],\n      pageNo: pageNo,\n      pageSize: pageSize\n    }\n  }\n\n  async doCertReplace(req:{certId:number,cert:CertInfo}){\n\n    // /product/sslcenter/{id}\n    return await this.doRequest({\n      url: `product/sslcenter/${req.certId}`,\n      method: \"PUT\",\n      data: {\n        cert: req.cert.crt,\n        key: req.cert.key,\n      }\n    });\n\n  }\n\n\n  async getDomainId(domain:string){\n    const res = await this.getDomainList({query: domain,limit:1});\n    if (res.list.length === 0) {\n      throw new Error(`域名${domain}不存在`  );\n    }\n    return res.list[0].id;\n  }\n\n  async doRequest(req:HttpRequestConfig){\n    const res =  await this.ctx.http.request({\n      url: req.url,\n      baseURL:\"https://api.v2.rainyun.com\",\n      method: req.method|| \"POST\",\n      data: req.data,\n      params:  req.params,\n      headers:{\n        \"X-Api-Key\": this.apiKey\n      },\n      // httpProxy: this.httpProxy||undefined,\n    });\n\n    if (res.code === 200) {\n      return res.data;\n    }\n    throw new Error(res.message || res);\n  }\n}\n\n\n\nnew RainyunAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-rainyun/dns-provider.ts",
    "content": "import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from \"@certd/plugin-cert\";\nimport { RainyunAccess } from \"./access.js\";\n\n@IsDnsProvider({\n  name: \"rainyun\",\n  title: \"雨云\",\n  desc: \"雨云DNS解析提供商\",\n  accessType: \"rainyun\",\n  icon: \"svg:icon-lucky\",\n  order: 0\n})\nexport class RainyunDnsProvider extends AbstractDnsProvider {\n\n  client: any;\n\n  async onInstance() {\n\n  }\n\n  async createRecord(options: CreateRecordOptions): Promise<any> {\n\n    const access: RainyunAccess = this.ctx.access as RainyunAccess;\n\n    const domainId = await access.getDomainId(options.domain);\n    if (!domainId) {\n      throw new Error(`域名${options.domain}未找到`);\n    }\n\n    const { fullRecord, hostRecord, value, type, domain } = options;\n    this.logger.info(\"添加域名解析：\", fullRecord, value, domain);\n\n    const ret = await access.doRequest({\n      url: `/product/domain/${domainId}/dns`,\n      method: \"POST\",\n      data: {\n        host: hostRecord,\n        value: value,\n        level: 1,\n        type: type,\n        line: \"DEFAULT\",\n        ttl: 60\n      }\n    });\n    this.logger.info(\"添加域名解析成功:\", JSON.stringify(options), ret);\n    return {\n      recordId: ret,\n      domainId: domainId\n    };\n\n  }\n\n\n  async removeRecord(options: RemoveRecordOptions<any>): Promise<any> {\n    const { fullRecord, value } = options.recordReq;\n    const access: RainyunAccess = this.ctx.access as RainyunAccess;\n    const record = options.recordRes;\n    const ret = await access.doRequest({\n      url: `/product/domain/${record.domainId}/dns?record_id=${record.recordId}`,\n      method: \"DELETE\",\n    });\n    this.logger.info(\"删除域名解析成功:\", fullRecord, value, ret);\n    return ret;\n  }\n}\n\nnew RainyunDnsProvider();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-rainyun/index.ts",
    "content": "export * from \"./plugins/index.js\";\nexport * from \"./access.js\";\nexport * from \"./dns-provider.js\";\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-rainyun/plugins/index.ts",
    "content": "export * from './plugin-refresh-cert.js'\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-rainyun/plugins/plugin-refresh-cert.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, PageSearch, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { RainyunAccess } from \"../access.js\";\n\n@IsTaskPlugin({\n  //命名规范，插件类型+功能（就是目录plugin-demo中的demo），大写字母开头，驼峰命名\n  name: \"RainyunRefreshCert\",\n  title: \"雨云-更新证书\",\n  desc: \"app.rainyun.com\",\n  icon: \"svg:icon-lucky\",\n  //插件分组\n  group: pluginGroups.cdn.key,\n  needPlus: false,\n  default: {\n    //默认值配置照抄即可\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\n//类名规范，跟上面插件名称（name）一致\nexport class RainyunRefreshCert extends AbstractTaskPlugin {\n  //证书选择，此项必须要有\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames]\n    }\n    // required: true, // 必填\n  })\n  cert!: CertInfo;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  //授权选择框\n  @TaskInput({\n    title: \"雨云授权\",\n    component: {\n      name: \"access-selector\",\n      type: \"rainyun\" //固定授权类型\n    },\n    required: true //必填\n  })\n  accessId!: string;\n  //\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"证书Id\",\n      helper: \"要更新的rainyun证书id\",\n\n      action: RainyunRefreshCert.prototype.onGetCertList.name\n    })\n  )\n  certList!: number[];\n\n  //插件实例化时执行的方法\n  async onInstance() {\n  }\n\n  //插件执行方法\n  async execute(): Promise<void> {\n    const access = await this.getAccess<RainyunAccess>(this.accessId);\n\n    for (const item of this.certList) {\n      this.logger.info(`----------- 开始更新证书：${item}`);\n      await access.doCertReplace({\n        certId: item,\n        cert: this.cert\n      });\n      this.logger.info(`----------- 更新证书${item}成功`);\n    }\n\n    this.logger.info(\"部署完成\");\n  }\n\n  async onGetCertList(req: PageSearch = {}) {\n    const access = await this.getAccess<RainyunAccess>(this.accessId);\n\n    const pageNo = req.pageNo ?? 1;\n    const pageSize = req.pageSize ?? 100;\n    const res = await access.getCertList({\n      pageNo,\n      pageSize\n    });\n    const total = res.total;\n    const list = res.list;\n    if (!list || list.length === 0) {\n      throw new Error(\"没有找到证书，请先在控制台上传一次证书且关联站点\");\n    }\n\n    const options = list.map((item: any) => {\n      return {\n        label: `${item.Domain}<${item.ID}>`,\n        value: item.ID,\n        domain: item.Domain.split(\",\").map(item => item.trim())\n      };\n    });\n    return {\n      list: this.ctx.utils.options.buildGroupOptions(options, this.certDomains),\n      total: total,\n      pageNo: pageNo,\n      pageSize: pageSize\n    };\n  }\n}\n\n//实例化一下，注册插件\nnew RainyunRefreshCert();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/access/dnspod-access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from '@certd/pipeline';\n\n@IsAccess({\n  name: 'dnspod',\n  title: 'dnspod(已废弃)',\n  desc: '腾讯云的域名解析接口已迁移到dnspod',\n  deprecated: 'dnspod已废弃，请换成腾讯云',\n  icon: 'svg:icon-tencentcloud',\n})\nexport class DnspodAccess extends BaseAccess {\n  @AccessInput({\n    title: '端点',\n    component: {\n      placeholder: 'endpoint',\n      name: 'a-auto-complete',\n      vModel: 'value',\n      options: [\n        { value: 'https://dnsapi.cn', label: '中国站' },\n        { value: 'https://api.dnspod.com', label: '国际站' },\n      ],\n    },\n    rules: [{ required: true, message: '该项必填' }],\n  })\n  endpoint = '';\n\n  @AccessInput({\n    title: 'ID',\n    component: {\n      placeholder: 'dnspod token 的 id',\n    },\n    rules: [{ required: true, message: '该项必填' }],\n  })\n  id = '';\n\n  @AccessInput({\n    title: 'token',\n    component: {\n      placeholder: '开放接口token',\n    },\n    encrypt: true,\n    rules: [{ required: true, message: '该项必填' }],\n  })\n  token = '';\n}\n\nnew DnspodAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/access/index.ts",
    "content": "export * from './dnspod-access.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/dns-provider/dnspod-dns-provider.ts",
    "content": "import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert';\nimport * as _ from 'lodash-es';\nimport { DnspodAccess } from '../access/index.js';\n\n@IsDnsProvider({\n  name: 'dnspod',\n  title: 'dnspod(已过时,请尽快换成腾讯云)',\n  desc: '已废弃，请尽快换成腾讯云类型',\n  accessType: 'dnspod',\n  deprecated: 'dnspod已废弃，请换成腾讯云',\n  icon: 'svg:icon-tencentcloud',\n})\nexport class DnspodDnsProvider extends AbstractDnsProvider {\n  access!: DnspodAccess;\n\n  loginToken: any;\n\n  endpoint = '';\n  async onInstance() {\n    this.access = this.ctx.access as DnspodAccess\n    const access: DnspodAccess = this.access as DnspodAccess;\n    this.loginToken = access.id + ',' + access.token;\n    this.endpoint = access.endpoint || 'https://dnsapi.cn';\n  }\n\n  async doRequest(options: any, successCodes: string[] = []) {\n    const config: any = {\n      // @ts-ignore\n      method: 'post',\n      formData: {\n        login_token: this.loginToken,\n        format: 'json',\n        lang: 'cn',\n        error_on_empty: 'no',\n      },\n      timeout: 10000,\n    };\n    _.merge(config, options);\n\n    const ret: any = await this.http.request(config);\n    if (!ret || !ret.status) {\n      const code = ret.status.code;\n      if (code !== '1' || !successCodes.includes(code)) {\n        throw new Error('请求失败：' + ret.status.message + ',api=' + config.url);\n      }\n    }\n    return ret;\n  }\n\n  async getDomainList() {\n    const ret = await this.doRequest({\n      url: this.access.endpoint + '/Domain.List',\n    });\n    this.logger.info('dnspod 域名列表：', ret.domains);\n    return ret.domains;\n  }\n\n  async createRecord(options: CreateRecordOptions): Promise<any> {\n    const { fullRecord, value, type } = options;\n    this.logger.info('添加域名解析：', fullRecord, value);\n    const domainItem = await this.matchDomain(fullRecord);\n    const domain = domainItem.name;\n    const rr = fullRecord.replace('.' + domain, '');\n\n    const ret = await this.doRequest(\n      {\n        url: this.access.endpoint + '/Record.Create',\n        formData: {\n          domain,\n          sub_domain: rr,\n          record_type: type,\n          record_line: '默认',\n          value: value,\n          mx: 1,\n        },\n      },\n      ['104']\n    ); // 104错误码为记录已存在，无需再次添加\n    this.logger.info('添加域名解析成功:', fullRecord, value, JSON.stringify(ret.record));\n    return ret.record;\n  }\n\n  async removeRecord(options: RemoveRecordOptions<any>) {\n    const { fullRecord, value } = options.recordReq;\n    const record = options.recordRes;\n    const domain = await this.matchDomain(fullRecord);\n\n    const ret = await this.doRequest({\n      url: this.access.endpoint + '/Record.Remove',\n      formData: {\n        domain,\n        record_id: record.id,\n      },\n    });\n    this.logger.info('删除域名解析成功:', fullRecord, value);\n    return ret.RecordId;\n  }\n\n  async matchDomain(dnsRecord: any) {\n    const list = await this.getDomainList();\n    if (list == null) {\n      throw new Error('域名列表不能为空');\n    }\n    let domain = null;\n    for (const item of list) {\n      if (_.endsWith(dnsRecord, '.' + item.name)) {\n        domain = item;\n        break;\n      }\n    }\n    if (!domain) {\n      throw new Error('找不到域名,请检查域名是否正确：' + dnsRecord);\n    }\n    return domain;\n  }\n}\nnew DnspodDnsProvider();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/dns-provider/index.ts",
    "content": "import './dnspod-dns-provider.js';\nimport './tencent-dns-provider.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/dns-provider/tencent-dns-provider.ts",
    "content": "import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert';\nimport { TencentAccess } from '@certd/plugin-lib';\n\n@IsDnsProvider({\n  name: 'tencent',\n  title: '腾讯云',\n  desc: '腾讯云域名DNS解析提供者',\n  accessType: 'tencent',\n  icon: 'svg:icon-tencentcloud',\n})\nexport class TencentDnsProvider extends AbstractDnsProvider {\n  access!: TencentAccess;\n\n  client!: any;\n\n  endpoint = 'dnspod.tencentcloudapi.com';\n\n  async onInstance() {\n    this.access = this.ctx.access as TencentAccess\n    const clientConfig = {\n      credential: this.access,\n      region: '',\n      profile: {\n        httpProfile: {\n          endpoint: this.endpoint,\n        },\n      },\n    };\n    const dnspodSdk = await import('tencentcloud-sdk-nodejs/tencentcloud/services/dnspod/v20210323/index.js');\n    const DnspodClient = dnspodSdk.v20210323.Client;\n    // 实例化要请求产品的client对象,clientProfile是可选的\n    this.client = new DnspodClient(clientConfig);\n  }\n\n  async createRecord(options: CreateRecordOptions): Promise<any> {\n    const { fullRecord, value, type, domain } = options;\n    this.logger.info('添加域名解析：', fullRecord, value);\n    const rr = fullRecord.replace('.' + domain, '');\n\n    const params = {\n      Domain: domain,\n      RecordType: type,\n      RecordLine: '默认',\n      Value: value,\n      SubDomain: rr,\n    };\n\n    try {\n      const ret = await this.client.CreateRecord(params);\n      this.logger.info('添加域名解析成功:', fullRecord, value, JSON.stringify(ret));\n      /*\n        {\n        \"RecordId\": 162,\n        \"RequestId\": \"ab4f1426-ea15-42ea-8183-dc1b44151166\"\n      }\n   */\n      return ret;\n    } catch (e: any) {\n      if (e?.code === 'InvalidParameter.DomainRecordExist') {\n        this.logger.info('域名解析已存在,无需重复添加:', fullRecord, value);\n        return await this.findRecord(options);\n      }\n      throw e;\n    }\n  }\n\n  async findRecord(options: CreateRecordOptions): Promise<any> {\n    const params = {\n      Domain: options.domain,\n      RecordType: [options.type],\n      Keyword: options.hostRecord,\n      RecordValue: options.value,\n    };\n    const ret = await this.client.DescribeRecordFilterList(params);\n    if (ret.RecordList && ret.RecordList.length > 0) {\n      this.logger.info('已存在解析记录:', ret.RecordList);\n      return ret.RecordList[0];\n    }\n    return {};\n  }\n\n  async removeRecord(options: RemoveRecordOptions<any>) {\n    const { fullRecord, value, domain } = options.recordReq;\n    const record = options.recordRes;\n    if (!record) {\n      this.logger.info('解析记录recordId为空，不执行删除', fullRecord, value);\n    }\n    const params = {\n      Domain: domain,\n      RecordId: record.RecordId,\n    };\n    const ret = await this.client.DeleteRecord(params);\n    this.logger.info('删除域名解析成功:', fullRecord, value);\n    return ret;\n  }\n}\nnew TencentDnsProvider();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/index.ts",
    "content": "export * from './access/index.js';\nexport * from './plugin/index.js';\nexport * from './dns-provider/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/plugin/delete-expiring-cert/index.ts",
    "content": "import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { AbstractPlusTaskPlugin } from '@certd/plugin-plus';\nimport dayjs from 'dayjs';\nimport { remove } from 'lodash-es';\nimport { TencentAccess, TencentSslClient } from '@certd/plugin-lib';\n\n@IsTaskPlugin({\n  name: 'TencentDeleteExpiringCert',\n  title: '腾讯云-删除即将过期证书',\n  icon: 'svg:icon-tencentcloud',\n  group: pluginGroups.tencent.key,\n  desc: '仅删除未使用的证书',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.AlwaysRun,\n    },\n  },\n  needPlus: true,\n})\nexport class TencentDeleteExpiringCert extends AbstractPlusTaskPlugin {\n  @TaskInput({\n    title: 'Access提供者',\n    helper: 'access 授权',\n    component: {\n      name: 'access-selector',\n      type: 'tencent',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: '关键字筛选',\n    helper: '仅匹配ID、备注名称、域名包含关键字的证书，可以不填',\n    required: false,\n    component: {\n      name: 'a-input',\n    },\n  })\n  searchKey!: string;\n\n  @TaskInput({\n    title: '最大删除数量',\n    helper: '单次运行最大删除数量',\n    value: 100,\n    component: {\n      name: 'a-input-number',\n      vModel: 'value',\n    },\n    required: true,\n  })\n  maxCount!: number;\n\n  @TaskInput({\n    title: '即将过期天数',\n    helper:\n      '仅删除有效期小于此天数的证书,\\n<span class=\"color-red\">注意：`1.26.14`版本之前Certd创建的证书流水线默认是到期前20天才更新证书，需要将之前创建的证书申请任务的更新天数改为35天，保证删除之前就已经替换掉即将过期证书</span>',\n    value: 30,\n    component: {\n      name: 'a-input-number',\n      vModel: 'value',\n    },\n    required: true,\n  })\n  expiringDays!: number;\n\n  @TaskInput({\n    title: '检查超时时间',\n    helper: '检查删除任务结果超时时间,单位分钟',\n    value: 10,\n    component: {\n      name: 'a-input-number',\n      vModel: 'value',\n    },\n    required: true,\n  })\n  checkTimeout!: number;\n\n  async onInstance() {}\n\n  async execute(): Promise<void> {\n    const access = await this.getAccess<TencentAccess>(this.accessId);\n    const sslClient = new TencentSslClient({\n      access,\n      logger: this.logger,\n    });\n\n    const params = {\n      Limit: this.maxCount ?? 100,\n      SearchKey: this.searchKey,\n      ExpirationSort: 'ASC',\n      FilterSource: 'upload',\n      // FilterExpiring: 1,\n    };\n    const res = await sslClient.DescribeCertificates(params);\n    let certificates = res?.Certificates;\n    if (!certificates && certificates.length === 0) {\n      this.logger.info('没有找到证书');\n      return;\n    }\n\n    const lastDay = dayjs().add(this.expiringDays, 'day');\n    certificates = certificates.filter((item: any) => {\n      const endTime = item.CertEndTime;\n      return dayjs(endTime).isBefore(lastDay);\n    });\n    for (const certificate of certificates) {\n      this.logger.info(`证书ID:${certificate.CertificateId}, 过期时间:${certificate.CertEndTime}，Alias:${certificate.Alias}，证书域名:${certificate.Domain}`);\n    }\n    this.logger.info(`即将过期的证书数量:${certificates.length}`);\n    if (certificates.length === 0) {\n      this.logger.info('没有即将过期的证书, 无需删除');\n      return;\n    }\n    const certIds = certificates.map((cert: any) => cert.CertificateId);\n\n    const deleteRes = await sslClient.doRequest('DeleteCertificates', {\n      CertificateIds: certIds,\n      IsSync: true,\n    });\n    this.logger.info('删除任务已提交: ', JSON.stringify(deleteRes));\n    const ids = deleteRes?.CertTaskIds;\n    if (!ids && !ids.length) {\n      this.logger.error('没有找到任务ID');\n      return;\n    }\n    const taskIds = ids.map((id: any) => id.TaskId);\n    const startTime = Date.now();\n    const results = {};\n\n    const statusCount = {\n      success: 0,\n      failed: 0,\n      unauthorized: 0,\n      unbind: 0,\n      timeout: 0,\n    };\n    const total = taskIds.length;\n\n    while (Date.now() < startTime + this.checkTimeout * 60 * 1000) {\n      this.checkSignal();\n      const taskResultRes = await sslClient.doRequest('DescribeDeleteCertificatesTaskResult', {\n        TaskIds: taskIds,\n      });\n      const result = taskResultRes.DeleteTaskResult;\n      if (!result || result.length === 0) {\n        this.logger.info('暂未获取到有效的任务结果');\n        continue;\n      }\n      for (const item of result) {\n        //遍历结果\n        const status = item.Status;\n        if (status !== 0) {\n          remove(taskIds, id => id === item.TaskId);\n        }\n        // Status : 0表示任务进行中、 1表示任务成功、 2表示任务失败、3表示未授权服务角色导致任务失败、4表示有未解绑的云资源导致任务失败、5表示查询关联云资源超时导致任务失败\n        if (status === 0) {\n          this.logger.info(`任务${item.TaskId}<${item.CertId}>: 进行中`);\n        } else if (status === 1) {\n          this.logger.info(`任务${item.TaskId}<${item.CertId}>: 成功`);\n          results[item.TaskId] = '成功';\n          statusCount.success++;\n        } else if (status === 2) {\n          this.logger.error(`任务${item.TaskId}<${item.CertId}>: 失败`);\n          results[item.TaskId] = '失败';\n          statusCount.failed++;\n        } else if (status === 3) {\n          this.logger.error(`任务${item.TaskId}<${item.CertId}>: 未授权服务角色导致任务失败`);\n          results[item.TaskId] = '未授权服务角色导致任务失败';\n          statusCount.unauthorized++;\n        } else if (status === 4) {\n          this.logger.error(`任务${item.TaskId}<${item.CertId}>: 有未解绑的云资源导致任务失败`);\n          results[item.TaskId] = '有未解绑的云资源导致任务失败';\n          statusCount.unbind++;\n        } else if (status === 5) {\n          this.logger.error(`任务${item.TaskId}<${item.CertId}>: 查询关联云资源超时导致任务失败`);\n          results[item.TaskId] = '查询关联云资源超时导致任务失败';\n          statusCount.timeout++;\n        } else {\n          this.logger.info(`任务${item.TaskId}<${item.CertId}>: 未知状态:${status}`);\n          statusCount.failed++;\n        }\n      }\n      this.logger.info(\n        // eslint-disable-next-line max-len\n        `任务总数:${total}, 进行中：${taskIds.length}， 成功:${statusCount.success}, 未授权服务角色导致失败:${statusCount.unauthorized}, 未解绑关联资源失败:${statusCount.unbind}, 查询关联资源超时:${statusCount.timeout}，未知原因失败:${statusCount.failed}`\n      );\n      if (taskIds.length === 0) {\n        this.logger.info('任务已全部完成');\n\n        if (statusCount.unauthorized > 0) {\n          throw new Error('有未授权服务角色导致任务失败，需给Access授权服务角色SSL_QCSLinkedRoleInReplaceLoadCertificate');\n        }\n\n        return;\n      }\n      await this.ctx.utils.sleep(10000);\n    }\n    this.logger.error('检查任务结果超时', JSON.stringify(results));\n  }\n}\n\nnew TencentDeleteExpiringCert();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-all/index.ts",
    "content": "import {AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput} from '@certd/pipeline';\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { TencentSslClient } from \"@certd/plugin-lib\";\n\n@IsTaskPlugin({\n  name: 'DeployCertToTencentAll',\n  title: '腾讯云-部署证书到任意云资源',\n  needPlus: false,\n  icon: 'svg:icon-tencentcloud',\n  group: pluginGroups.tencent.key,\n  desc: '支持负载均衡、CDN、DDoS、直播、点播、Web应用防火墙、API网关、TEO、容器服务、对象存储、轻应用服务器、云原生微服务、云开发',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class DeployCertToTencentAll extends AbstractTaskPlugin {\n  /**\n   * AccessProvider的key,或者一个包含access的具体的对象\n   */\n  @TaskInput({\n    title: 'Access授权',\n    helper: 'access授权',\n    component: {\n      name: 'access-selector',\n      type: 'tencent',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: '证书',\n    helper: '请选择\"证书申请任务\"或“上传证书到腾讯云”前置任务的输出',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames,'UploadCertToTencent'],\n    },\n    required: true,\n  })\n  tencentCertId!: string | CertInfo;\n\n\n\n\n  @TaskInput({\n    title: '资源类型',\n    component: {\n      name: 'a-select',\n      vModel: 'value',\n      allowClear: true,\n      //- clb\n      // - cdn\n      // - ddos\n      // - live\n      // - vod\n      // - waf\n      // - apigateway\n      // - teo\n      // - tke\n      // - cos\n      // - lighthouse\n      // - tse\n      // - tcb\n      options: [\n        { value: 'clb',label: '负载均衡'},\n        { value: 'cdn',label: 'CDN'},\n        { value: 'ddos',label: 'DDoS'},\n        { value: 'live',label: '直播'},\n        { value: 'vod',label: '点播'},\n        { value: 'waf',label: 'Web应用防火墙'},\n        { value: 'apigateway',label: 'API网关'},\n        { value: 'teo',label: 'TEO'},\n        { value: 'tke',label: '容器服务'},\n        { value: 'cos',label: '对象存储'},\n        { value: 'lighthouse',label: '轻应用服务器'},\n        { value: 'tse',label: '云原生微服务'},\n        { value: 'tcb',label: '云开发'},\n      ]\n    },\n    helper: '',\n    required: true,\n  })\n  resourceType!: string;\n\n  @TaskInput({\n    title: 'Region',\n    component: {\n      name: 'a-input',\n      vModel: 'value',\n      allowClear: true,\n    },\n    helper: '当云资源类型传入clb、waf、apigateway、cos、lighthouse、tke、tse、tcb 时，公共参数Region必传。[参考文档](https://cloud.tencent.com/document/product/400/91667)',\n  })\n  region!: string;\n\n\n  @TaskInput({\n    title: '云资源实例Id列表',\n    component: {\n      name: 'a-select',\n      vModel: 'value',\n      open: false,\n      mode: 'tags',\n    },\n    helper: '[参考文档](https://cloud.tencent.com/document/product/400/91667)',\n  })\n  instanceIdList!: string[];\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    const access = await this.getAccess(this.accessId);\n\n    const sdk = await import('tencentcloud-sdk-nodejs/tencentcloud/services/ssl/v20191205/index.js');\n    const Client = sdk.v20191205.Client;\n    const client = new Client({\n      credential: {\n        secretId: access.secretId,\n        secretKey: access.secretKey,\n      },\n      region: this.region,\n      profile: {\n        httpProfile: {\n          endpoint: 'ssl.tencentcloudapi.com',\n        },\n      },\n    });\n\n    let certId:string = null\n    if (typeof this.tencentCertId === 'string') {\n      certId = this.tencentCertId as string;\n    } else if (this.tencentCertId && typeof this.tencentCertId === 'object') {\n      certId = await this.uploadToTencent(access, this.tencentCertId as CertInfo);\n    } else {\n      throw new Error('无效的证书输入类型');\n    }\n\n    const params = {\n      CertificateId: certId,\n      ResourceType: this.resourceType,\n      InstanceIdList: this.instanceIdList,\n      IsCache:0,\n    };\n\n    const res = await client.DeployCertificateInstance(params);\n    this.checkRet(res);\n    this.logger.info('部署成功,等待5s:',JSON.stringify(res));\n    await this.ctx.utils.sleep(5000);\n  }\n\n  checkRet(ret: any) {\n    if (!ret || ret.Error) {\n      throw new Error('执行失败：' + ret.Error.Code + ',' + ret.Error.Message);\n    }\n  }\n\n  private async uploadToTencent(access: any, cert: CertInfo) {\n    const sslClient = new TencentSslClient({\n      access,\n      logger: this.logger,\n    });\n\n    return  await sslClient.uploadToTencent({\n      certName: this.appendTimeSuffix('certd'),\n      cert: cert,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-cdn/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { CertInfo } from '@certd/plugin-cert';\nimport { TencentAccess } from '@certd/plugin-lib';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'DeployCertToTencentCDN',\n  title: '腾讯云-部署到CDN（废弃）',\n  icon: 'svg:icon-tencentcloud',\n  group: pluginGroups.tencent.key,\n  desc: '已废弃，请使用v2版',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class DeployToCdnPlugin extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n\n  @TaskInput({\n    title: 'Access提供者',\n    helper: 'access 授权',\n    component: {\n      name: 'access-selector',\n      type: 'tencent',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: '证书名称',\n    helper: '证书上传后将以此参数作为名称前缀',\n  })\n  certName!: string;\n\n  @TaskInput({\n    title: 'cdn加速域名',\n    rules: [{ required: true, message: '该项必填' }],\n  })\n  domainName!: string;\n\n  // @TaskInput({\n  //   title: \"CDN接口\",\n  //   helper: \"CDN接口端点\",\n  //   component: {\n  //     name: \"a-select\",\n  //     type: \"tencent\",\n  //   },\n  //   required: true,\n  // })\n  // endpoint!: string;\n\n  Client: any;\n\n  async onInstance() {\n    const sdk = await import('tencentcloud-sdk-nodejs/tencentcloud/services/cdn/v20180606/index.js');\n    this.Client = sdk.v20180606.Client;\n  }\n\n  async getClient() {\n    const accessProvider: TencentAccess = (await this.getAccess(this.accessId)) as TencentAccess;\n\n    const CdnClient = this.Client;\n\n    const clientConfig = {\n      credential: {\n        secretId: accessProvider.secretId,\n        secretKey: accessProvider.secretKey,\n      },\n      region: '',\n      profile: {\n        httpProfile: {\n          endpoint: 'cdn.tencentcloudapi.com',\n        },\n      },\n    };\n\n    return new CdnClient(clientConfig);\n  }\n\n  async execute(): Promise<void> {\n    const params = this.buildParams();\n    await this.doRequest(params);\n  }\n\n  buildParams() {\n    return {\n      Domain: this.domainName,\n      Route: 'Https.CertInfo',\n      Value: JSON.stringify({\n        update: {\n          Certificate: this.cert.crt,\n          PrivateKey: this.cert.key,\n        },\n      }),\n    };\n  }\n\n  async doRequest(params: any) {\n    const client = await this.getClient();\n    const ret = await client.ModifyDomainConfig(params);\n    this.checkRet(ret);\n    this.logger.info('设置腾讯云CDN证书成功:', ret.RequestId);\n    return ret.RequestId;\n  }\n\n  checkRet(ret: any) {\n    if (!ret || ret.Error) {\n      throw new Error('执行失败：' + ret.Error.Code + ',' + ret.Error.Message);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-cdn-v2/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { CertInfo ,CertReader} from '@certd/plugin-cert';\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { TencentAccess, TencentSslClient } from '@certd/plugin-lib';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'TencentDeployCertToCDNv2',\n  title: '腾讯云-部署到CDN-v2',\n  icon: 'svg:icon-tencentcloud',\n  group: pluginGroups.tencent.key,\n  desc: '推荐使用',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class TencentDeployCertToCDNv2 extends AbstractTaskPlugin {\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书，或者选择前置任务“上传证书到腾讯云”任务的证书ID',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames, 'UploadCertToTencent'],\n    },\n    required: true,\n  })\n  cert!: CertInfo | string;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  @TaskInput({\n    title: 'Access提供者',\n    helper: 'access 授权',\n    component: {\n      name: 'access-selector',\n      type: 'tencent',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: 'CDN域名',\n      helper: '请选择域名或输入域名',\n      typeName: 'TencentDeployCertToCDNv2',\n      action: TencentDeployCertToCDNv2.prototype.onGetDomainList.name,\n    })\n  )\n  domains!: string | string[];\n\n\n  async onInstance() {}\n\n\n  async execute(): Promise<void> {\n    const access = await this.getAccess<TencentAccess>(this.accessId);\n    const sslClient = new TencentSslClient({\n      access,\n      logger: this.logger,\n    });\n\n    let tencentCertId = this.cert as string;\n    if (typeof this.cert !== 'string') {\n      const certReader = new CertReader(this.cert);\n      tencentCertId = await sslClient.uploadToTencent({\n        certName: certReader.buildCertName(),\n        cert: this.cert,\n      });\n    }\n\n    const res = await sslClient.deployCertificateInstance({\n      CertificateId: tencentCertId,\n      ResourceType: 'cdn',\n      Status: 1,\n      InstanceIdList: this.domains,\n    });\n\n    this.logger.info('部署成功', res);\n  }\n\n  checkRet(ret: any) {\n    if (!ret || ret.Error) {\n      throw new Error('执行失败：' + ret.Error.Code + ',' + ret.Error.Message);\n    }\n  }\n\n  async getCdnClient() {\n    const accessProvider = await this.getAccess<TencentAccess>(this.accessId);\n    const sdk = await import('tencentcloud-sdk-nodejs/tencentcloud/services/cdn/v20180606/index.js');\n    const CdnClient = sdk.v20180606.Client;\n\n    const clientConfig = {\n      credential: {\n        secretId: accessProvider.secretId,\n        secretKey: accessProvider.secretKey,\n      },\n      region: '',\n      profile: {\n        httpProfile: {\n          endpoint: 'cdn.tencentcloudapi.com',\n        },\n      },\n    };\n\n    return new CdnClient(clientConfig);\n  }\n\n  async onGetDomainList(data: any) {\n    const cdnClient = await this.getCdnClient();\n    const res = await cdnClient.DescribeDomains({\n      Limit: 1000,\n    });\n    this.checkRet(res);\n    const options = res.Domains.map((item: any) => {\n      return {\n        label: item.Domain,\n        value: item.Domain,\n        domain: item.Domain\n      };\n    });\n    return  this.ctx.utils.options.buildGroupOptions(options, this.certDomains);\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-clb/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport dayjs from 'dayjs';\nimport { TencentAccess } from '@certd/plugin-lib';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'DeployCertToTencentCLB',\n  title: '腾讯云-部署到CLB',\n  icon: 'svg:icon-tencentcloud',\n  group: pluginGroups.tencent.key,\n  desc: '暂时只支持单向认证证书，暂时只支持通用负载均衡',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class DeployCertToTencentCLB extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '大区',\n    component: {\n      name: 'a-auto-complete',\n      vModel: 'value',\n      options: [\n        { value: 'ap-guangzhou' },\n        { value: 'ap-beijing' },\n        { value: 'ap-chengdu' },\n        { value: 'ap-chongqing' },\n        { value: 'ap-hongkong' },\n        { value: 'ap-jakarta' },\n        { value: 'ap-mumbai' },\n        { value: 'ap-nanjing' },\n        { value: 'ap-seoul' },\n        { value: 'ap-shanghai' },\n        { value: 'ap-shanghai-fsi' },\n        { value: 'ap-shenzhen-fsi' },\n        { value: 'ap-singapore' },\n        { value: 'ap-tokyo' },\n        { value: 'eu-frankfurt' },\n        { value: 'na-ashburn' },\n        { value: 'na-siliconvalley' },\n        { value: 'na-toronto' },\n        { value: 'sa-saopaulo' },\n      ],\n    },\n    required: true,\n  })\n  region!: string;\n\n  @TaskInput({\n    title: '证书名称前缀',\n  })\n  certName!: string;\n\n  @TaskInput({\n    title: '负载均衡ID',\n    helper: '如果没有配置，则根据域名匹配负载均衡下的监听器（根据域名匹配时暂时只支持前100个）',\n    required: true,\n  })\n  loadBalancerId!: string;\n\n  @TaskInput({\n    title: '监听器ID',\n    required: true,\n  })\n  listenerId!: string;\n\n  @TaskInput({\n    title: '域名',\n    required: false,\n    component: {\n      name: 'a-select',\n      vModel: 'value',\n      open: false,\n      mode: 'tags',\n    },\n    helper: '如果开启了sni，则此项必须填写，未开启，则不要填写',\n  })\n  domain!: string | string[];\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: any;\n\n  @TaskInput({\n    title: 'Access提供者',\n    helper: 'access授权',\n    component: {\n      name: 'access-selector',\n      type: 'tencent',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  client: any;\n  async onInstance() {\n    this.client = await this.getClient();\n  }\n\n  async getClient() {\n    const sdk = await import('tencentcloud-sdk-nodejs/tencentcloud/services/clb/v20180317/index.js');\n    const ClbClient = sdk.v20180317.Client;\n\n    const accessProvider = (await this.getAccess(this.accessId)) as TencentAccess;\n\n    const region = this.region;\n    const clientConfig = {\n      credential: {\n        secretId: accessProvider.secretId,\n        secretKey: accessProvider.secretKey,\n      },\n      region: region,\n      profile: {\n        httpProfile: {\n          endpoint: 'clb.tencentcloudapi.com',\n        },\n      },\n    };\n\n    return new ClbClient(clientConfig);\n  }\n\n  async execute(): Promise<void> {\n    const client = this.client;\n\n    if (!this.domain || this.domain.length === 0) {\n      await this.updateListener(client);\n    } else {\n      const domains = Array.isArray(this.domain) ? this.domain : [this.domain];\n      for (const domain of domains) {\n        this.logger.info(`开始更新域名证书:${domain},请确保已经开启了sni`);\n        // const lastCertId = await this.getCertIdFromProps(client, domain);\n\n        await this.updateByDomainAttr(client, domain);\n\n        // 不要做检查，相同的证书，不会生成新的证书id\n        // const checkDeployed = async (wait = 5) => {\n        //   await this.ctx.utils.sleep(wait * 1000);\n        //   this.logger.info(`等待${wait}秒`);\n        //   const newCertId = await this.getCertIdFromProps(client, domain);\n        //   this.logger.info(`oldCertId:${lastCertId} , newCertId:${newCertId}`);\n        //   if ((lastCertId && newCertId === lastCertId) || (!lastCertId && !newCertId)) {\n        //     return false;\n        //   }\n        //   this.logger.info('腾讯云证书ID:', newCertId);\n        //   return true;\n        // };\n        // let count = 0;\n        // while (true) {\n        //   count++;\n        //   const res = await checkDeployed(5);\n        //   if (res) {\n        //     break;\n        //   }\n        //   if (count > 6) {\n        //     this.logger.warn('等待超时，可能证书未部署成功');\n        //   }\n        // }\n      }\n    }\n\n    return;\n  }\n\n  async getCertIdFromProps(client: any, domain: string) {\n    const listenerRet = await this.getListenerList(client, this.loadBalancerId, this.listenerId ? [this.listenerId] : null);\n    return this.getCertIdFromListener(listenerRet[0], domain);\n  }\n\n  getCertIdFromListener(listener: any, domain: string) {\n    let certId;\n    if (!domain) {\n      certId = listener.Certificate.CertId;\n    } else {\n      if (listener.Rules && listener.Rules.length > 0) {\n        for (const rule of listener.Rules) {\n          if (rule.Domain === domain) {\n            if (rule.Certificate != null) {\n              certId = rule.Certificate.CertId;\n            }\n            break;\n          }\n        }\n      }\n    }\n    return certId;\n  }\n\n  async updateListener(client: any) {\n    const params = this.buildProps();\n    const ret = await client.ModifyListener(params);\n    this.checkRet(ret);\n    this.logger.info('设置腾讯云CLB证书成功:', ret.RequestId, '->loadBalancerId:', this.loadBalancerId, 'listenerId', this.listenerId);\n    return ret;\n  }\n\n  async updateByDomainAttr(client: any, domain) {\n    const params: any = this.buildProps();\n\n    params.Domain = domain;\n    const ret = await client.ModifyDomainAttributes(params);\n    this.checkRet(ret);\n    this.logger.info(\n      `[${domain}] 设置腾讯云CLB证书(sni)任务已提交:taskId：${ret.RequestId}，loadBalancerId:${this.loadBalancerId}，listenerId:${this.listenerId}`\n    );\n\n    const requestId = ret.RequestId;\n    while (true) {\n      const statusRes = await client.DescribeTaskStatus({ TaskId: requestId });\n\n      if (statusRes.Status === 0) {\n        this.logger.info(`[${domain}] 腾讯云CLB证书(sni)设置成功`);\n        break;\n      } else if (statusRes.Status === 2) {\n        this.logger.info(`[${domain}] 腾讯云CLB证书(sni)设置进行中，请耐心等待`);\n      } else if (statusRes.Status === 1) {\n        throw new Error(`[${domain}] 腾讯云CLB证书(sni)设置失败:` + statusRes.Message);\n      }\n      await this.ctx.utils.sleep(5000);\n    }\n    return ret;\n  }\n  appendTimeSuffix(name: string) {\n    if (name == null) {\n      name = 'certd';\n    }\n    return name + '-' + dayjs().format('YYYYMMDD-HHmmss');\n  }\n  buildProps() {\n    return {\n      Certificate: {\n        SSLMode: 'UNIDIRECTIONAL', // 单向认证\n        CertName: this.appendTimeSuffix(this.certName || this.cert.domain),\n        CertKey: this.cert.key,\n        CertContent: this.cert.crt,\n      },\n      LoadBalancerId: this.loadBalancerId,\n      ListenerId: this.listenerId,\n    };\n  }\n\n  async getCLBList(client: any) {\n    const params = {\n      Limit: 100, // 最大暂时只支持100个，暂时没做翻页\n      OrderBy: 'CreateTime',\n      OrderType: 0,\n      // ...this.DescribeLoadBalancers,\n    };\n    const ret = await client.DescribeLoadBalancers(params);\n    this.checkRet(ret);\n    return ret.LoadBalancerSet;\n  }\n\n  async getListenerList(client: any, balancerId: any, listenerIds: any) {\n    // HTTPS\n    const params = {\n      LoadBalancerId: balancerId,\n      Protocol: 'HTTPS',\n      ListenerIds: listenerIds,\n    };\n    const ret = await client.DescribeListeners(params);\n    this.checkRet(ret);\n    return ret.Listeners;\n  }\n\n  checkRet(ret: any) {\n    if (!ret || ret.Error) {\n      throw new Error('执行失败：' + ret.Error.Code + ',' + ret.Error.Message);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-cos/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { CertInfo } from '@certd/plugin-cert';\nimport { createRemoteSelectInputDefine, TencentSslClient } from '@certd/plugin-lib';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'DeployCertToTencentCosPlugin',\n  title: '腾讯云-部署证书到COS',\n  needPlus: false,\n  icon: 'svg:icon-tencentcloud',\n  group: pluginGroups.tencent.key,\n  desc: '部署到腾讯云COS源站域名证书【注意：很不稳定，需要重试很多次偶尔才能成功一次】',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class DeployCertToTencentCosPlugin extends AbstractTaskPlugin {\n  /**\n   * AccessProvider的id\n   */\n  @TaskInput({\n    title: 'Access授权',\n    helper: 'access授权',\n    component: {\n      name: 'access-selector',\n      type: 'tencent',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: '存储桶名称',\n    helper: '请输入存储桶名称',\n  })\n  bucket!: string;\n\n  @TaskInput({\n    title: '所在地域',\n    helper: '存储桶所在地域',\n    component: {\n      name: 'a-auto-complete',\n      vModel: 'value',\n      options: [\n        { value: '', label: '--------中国大陆地区-------', disabled: true },\n        { value: 'ap-beijing-1', label: '北京1区' },\n        { value: 'ap-beijing', label: '北京' },\n        { value: 'ap-nanjing', label: '南京' },\n        { value: 'ap-shanghai', label: '上海' },\n        { value: 'ap-guangzhou', label: '广州' },\n        { value: 'ap-chengdu', label: '成都' },\n        { value: 'ap-chongqing', label: '重庆' },\n        { value: 'ap-shenzhen-fsi', label: '深圳金融' },\n        { value: 'ap-shanghai-fsi', label: '上海金融' },\n        { value: 'ap-beijing-fsi', label: '北京金融' },\n        { value: '', label: '--------中国香港及境外-------', disabled: true },\n        { value: 'ap-hongkong', label: '中国香港' },\n        { value: 'ap-singapore', label: '新加坡' },\n        { value: 'ap-mumbai', label: '孟买' },\n        { value: 'ap-jakarta', label: '雅加达' },\n        { value: 'ap-seoul', label: '首尔' },\n        { value: 'ap-bangkok', label: '曼谷' },\n        { value: 'ap-tokyo', label: '东京' },\n        { value: 'na-siliconvalley', label: '硅谷' },\n        { value: 'na-ashburn', label: '弗吉尼亚' },\n        { value: 'sa-saopaulo', label: '圣保罗' },\n        { value: 'eu-frankfurt', label: '法兰克福' },\n      ],\n    },\n  })\n  region!: string;\n\n  // @TaskInput(createCertDomainGetterInputDefine())\n  // certDomains!: string[];\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: 'COS域名',\n      helper: '请选择域名',\n      typeName: 'DeployCertToTencentCosPlugin',\n      action: DeployCertToTencentCosPlugin.prototype.onGetDomainList.name,\n      watches: ['bucket', 'region'],\n    })\n  )\n  domains!: string | string[];\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书，或者选择前置任务“上传证书到腾讯云”任务的证书ID',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames, 'UploadCertToTencent'],\n    },\n    required: true,\n  })\n  cert!: CertInfo | string;\n\n  async onInstance() {}\n\n  async execute(): Promise<void> {\n    const access = await this.getAccess(this.accessId);\n\n    const client = new TencentSslClient({\n      access,\n      logger: this.logger,\n      region: this.region,\n    });\n\n    let tencentCertId: string = this.cert as string;\n    if (typeof this.cert !== 'string') {\n      tencentCertId = await client.uploadToTencent({\n        certName: this.appendTimeSuffix('certd'),\n        cert: this.cert,\n      });\n    }\n\n    for (const domain of this.domains) {\n      const params = {\n        CertificateId: tencentCertId,\n        ResourceType: 'cos',\n        Status: 1,\n        InstanceIdList: [`${this.region}#${this.bucket}#${domain}`],\n      };\n\n      const res = await client.deployCertificateInstance(params);\n      this.logger.info(`域名${domain}部署成功:`, res);\n    }\n    this.logger.info('部署完成');\n  }\n\n  async onGetDomainList(data: any) {\n    const access = await this.getAccess(this.accessId);\n\n    const cosv5 = await import('cos-nodejs-sdk-v5');\n    const cos = new cosv5.default({\n      SecretId: access.secretId,\n      SecretKey: access.secretKey,\n    });\n    if (!this.bucket) {\n      throw new Error('存储桶名称不能为空');\n    }\n    if (!this.region) {\n      throw new Error('所在地域不能为空');\n    }\n\n    const res = await cos.getBucketDomain({\n      Bucket: this.bucket,\n      /** 存储桶所在地域 @see https://cloud.tencent.com/document/product/436/6224 */\n      Region: this.region,\n    });\n\n    this.ctx.logger.info('获取域名列表:', res);\n\n    return res.DomainRule.map((item: any) => {\n      return {\n        label: item.Name,\n        value: item.Name,\n      };\n    });\n  }\n}\n\nnew DeployCertToTencentCosPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-eo/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { TencentAccess } from \"@certd/plugin-lib\";\n\n@IsTaskPlugin({\n  name: 'DeployCertToTencentEO',\n  title: '腾讯云-部署到腾讯云EO',\n  icon: 'svg:icon-tencentcloud',\n  desc: '腾讯云边缘安全加速平台EdgeOne(EO)，必须配置上传证书到腾讯云任务',\n  group: pluginGroups.tencent.key,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class DeployCertToTencentEO extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '已上传证书ID',\n    helper: '请选择前置任务上传到腾讯云的证书',\n    component: {\n      name: 'output-selector',\n      from: 'UploadCertToTencent',\n    },\n    required: true,\n  })\n  certId!: string;\n\n  @TaskInput({\n    title: 'Access提供者',\n    helper: 'access 授权',\n    component: {\n      name: 'access-selector',\n      type: 'tencent',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: '站点ID',\n    helper: '类似于zone-xxxx的字符串，在站点概览页面左上角，或者，站点列表页面站点名称下方',\n    required: true,\n  })\n  zoneId!: string;\n\n  @TaskInput({\n    title: '证书名称',\n    helper: '证书上传后将以此参数作为名称前缀',\n  })\n  certName!: string;\n\n  @TaskInput({\n    title: 'cdn加速域名',\n    component: {\n      name: 'a-select',\n      vModel: 'value',\n      mode: 'tags',\n      open: false,\n    },\n    helper: '支持多个域名',\n    rules: [{ required: true, message: '该项必填' }],\n  })\n  domainNames!: string[];\n\n  // @TaskInput({\n  //   title: \"CDN接口\",\n  //   helper: \"CDN接口端点\",\n  //   component: {\n  //     name: \"a-select\",\n  //     type: \"tencent\",\n  //   },\n  //   required: true,\n  // })\n  // endpoint!: string;\n  Client: any;\n\n  async onInstance() {\n    const sdk = await import('tencentcloud-sdk-nodejs/tencentcloud/services/teo/v20220901/index.js');\n    this.Client = sdk.v20220901.Client;\n  }\n\n  async execute(): Promise<void> {\n    const accessProvider: TencentAccess = (await this.getAccess(this.accessId)) as TencentAccess;\n    const client = this.getClient(accessProvider);\n    const params = this.buildParams();\n    await this.doRequest(client, params);\n  }\n\n  getClient(accessProvider: TencentAccess) {\n    const TeoClient = this.Client;\n\n    const endpoint = accessProvider.isIntl()?\"teo.intl.tencentcloudapi.com\": \"teo.tencentcloudapi.com\";\n    const clientConfig = {\n      credential: {\n        secretId: accessProvider.secretId,\n        secretKey: accessProvider.secretKey,\n      },\n      region: '',\n      profile: {\n        httpProfile: {\n          endpoint,\n        },\n      },\n    };\n\n    return new TeoClient(clientConfig);\n  }\n\n  buildParams() {\n    return {\n      ZoneId: this.zoneId,\n      Hosts: this.domainNames,\n      Mode: 'sslcert',\n      ServerCertInfo: [\n        {\n          CertId: this.certId,\n        },\n      ],\n    };\n  }\n\n  async doRequest(client: any, params: any) {\n    const ret = await client.ModifyHostsCertificate(params);\n    this.checkRet(ret);\n    this.logger.info('设置腾讯云EO证书成功:', ret.RequestId);\n    return ret.RequestId;\n  }\n\n  checkRet(ret: any) {\n    if (!ret || ret.Error) {\n      throw new Error('执行失败：' + ret.Error.Code + ',' + ret.Error.Message);\n    }\n  }\n}\n\nnew DeployCertToTencentEO();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-live/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { createRemoteSelectInputDefine, TencentAccess, TencentSslClient } from \"@certd/plugin-lib\";\n\n@IsTaskPlugin({\n  name: 'TencentDeployCertToLive',\n  title: '腾讯云-部署到腾讯云直播',\n  icon: 'svg:icon-tencentcloud',\n  desc: 'https://console.cloud.tencent.com/live/',\n  group: pluginGroups.tencent.key,\n  needPlus: false,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class TencentDeployCertToLive extends AbstractTaskPlugin {\n  @TaskInput({\n    title: 'Access提供者',\n    helper: 'access 授权',\n    component: {\n      name: 'access-selector',\n      type: 'tencent',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: '直播域名',\n      helper: '请选择域名或输入域名',\n      typeName: 'TencentDeployCertToLive',\n      action: TencentDeployCertToLive.prototype.onGetDomainList.name,\n    })\n  )\n  domains!: string[];\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书，或者选择前置任务“上传证书到腾讯云”任务的证书ID',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames, 'UploadCertToTencent'],\n    },\n    required: true,\n  })\n  cert!: CertInfo | string;\n\n  async onInstance() {}\n\n  async execute(): Promise<void> {\n    const access = await this.getAccess<TencentAccess>(this.accessId);\n\n    let tencentCertId = this.cert as string;\n    if (typeof this.cert !== 'string') {\n      const sslClient = new TencentSslClient({\n        access,\n        logger: this.logger,\n      });\n      tencentCertId = await sslClient.uploadToTencent({\n        certName: this.appendTimeSuffix('certd'),\n        cert: this.cert,\n      });\n    }\n\n    const client = await this.getLiveClient();\n    const domainNames = this.domains.map((item: any) => {\n      return {\n        DomainName: item,\n        Status: -1,\n      };\n    });\n    const params = {\n      DomainInfos: domainNames,\n      CloudCertId: tencentCertId,\n    };\n    const res = await client.ModifyLiveDomainCertBindings(params);\n    this.checkRet(res);\n\n    this.logger.info('部署完成', JSON.stringify(res));\n  }\n\n  checkRet(ret: any) {\n    if (!ret || ret.Error) {\n      throw new Error('执行失败：' + ret.Error.Code + ',' + ret.Error.Message);\n    }\n  }\n\n  async getLiveClient() {\n    const accessProvider = await this.getAccess<TencentAccess>(this.accessId);\n    const sdk = await import('tencentcloud-sdk-nodejs/tencentcloud/services/live/v20180801/index.js');\n    const CssClient = sdk.v20180801.Client;\n\n    const clientConfig = {\n      credential: {\n        secretId: accessProvider.secretId,\n        secretKey: accessProvider.secretKey,\n      },\n      region: '',\n      profile: {\n        httpProfile: {\n          endpoint: 'live.tencentcloudapi.com',\n        },\n      },\n    };\n\n    return new CssClient(clientConfig);\n  }\n\n  async onGetDomainList(data: any) {\n    const client = await this.getLiveClient();\n    const res = await client.DescribeLiveDomains({\n      PageSize: 100,\n    });\n    this.checkRet(res);\n    return res.DomainList.map((item: any) => {\n      return {\n        label: item.Name,\n        value: item.Name,\n      };\n    });\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/plugin/deploy-to-tke-ingress/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { utils } from \"@certd/basic\";\n\nimport { CertApplyPluginNames } from \"@certd/plugin-cert\";\nimport yaml from \"js-yaml\";\n\n@IsTaskPlugin({\n  name: \"DeployCertToTencentTKEIngress\",\n  title: \"腾讯云-部署到TKE\",\n  needPlus: false,\n  icon: \"svg:icon-tencentcloud\",\n  group: pluginGroups.tencent.key,\n  desc: \"修改TKE集群密钥配置，支持Opaque和TLS证书类型。注意：\\n1. serverless集群请使用K8S部署插件；\\n2. Opaque类型需要【上传到腾讯云】作为前置任务；\\n3. ApiServer需要开通公网访问（或者certd可访问），实际上底层仍然是通过KubeClient进行部署\",\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\nexport class DeployCertToTencentTKEIngressPlugin extends AbstractTaskPlugin {\n\n  @TaskInput({\n    title: \"ingress证书类型\",\n    component: {\n      name: \"a-select\",\n      vModel: \"value\",\n      options: [{ value: \"nginx\", label: \"TLS证书格式（Nginx可用）\" }, {\n        value: \"qcloud\",\n        label: \"Opaque格式（CLB可用，原qcloud）\"\n      }]\n    },\n    helper: \"clb将部署Opaque类型的证书，nginx类型将部署TLS证书格式\",\n    required: true\n  })\n  ingressClass!: string;\n\n  /**\n   * AccessProvider的key,或者一个包含access的具体的对象\n   */\n  @TaskInput({\n    title: \"Access授权\",\n    helper: \"access授权\",\n    component: {\n      name: \"access-selector\",\n      type: \"tencent\"\n    },\n    required: true\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: \"腾讯云证书id\",\n    helper: \"请选择“上传证书到腾讯云”前置任务的输出\",\n    component: {\n      name: \"output-selector\",\n      from: \"UploadCertToTencent\"\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.ingressClass === \"qcloud\"|| form.ingressClass === \"clb\"\n        })\n      }\n    `,\n    required: true\n  })\n  tencentCertId!: string;\n\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames]\n    },\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.ingressClass === \"nginx\"\n        })\n      }\n    `,\n    required: true\n  })\n  cert!: any;\n\n\n  @TaskInput({ title: \"大区\", value: \"ap-guangzhou\", required: true })\n  region!: string;\n\n  @TaskInput({\n    title: \"集群ID\",\n    required: true,\n    desc: \"例如：cls-6lbj1vee\",\n    request: true\n  })\n  clusterId!: string;\n\n  @TaskInput({ title: \"集群namespace\", value: \"default\", required: true })\n  namespace!: string;\n\n  @TaskInput({\n    title: \"证书的secret名称\",\n    helper: \"集群->配置管理->Secret,复制名称\",\n    required: true,\n    component: {\n      name: \"a-select\",\n      vModel: \"value\",\n      mode: \"tags\",\n      open: false\n    }\n  })\n  secretName!: string | string[];\n\n  @TaskInput({\n    title: \"集群域名\",\n    helper: \"ApiServer需要开通公网访问，填写`ApiServer公网IP:443`\\n默认为:[clusterId].ccs.tencent-cloud.com，可能访问不通\",\n    component: {\n      placeholder: \"xx.xxx.xx.xx:443\"\n    }\n  })\n  clusterDomain!: string;\n\n\n  @TaskInput({\n    title: \"ingress名称\",\n    required: false,\n    helper: \"填写之后会自动重启ingress\",\n    component: {\n      name: \"a-select\",\n      vModel: \"value\",\n      mode: \"tags\",\n      open: false\n    }\n  })\n  ingressName!: string | string[];\n\n\n  // @TaskInput({ title: \"集群内网ip\", helper: \"如果开启了外网的话，无需设置\" })\n  // clusterIp!: string;\n\n\n  K8sClient: any;\n\n  async onInstance() {\n    //  const TkeClient = this.tencentcloud.tke.v20180525.Client;\n    const k8sSdk = await import(\"@certd/lib-k8s\");\n    this.K8sClient = k8sSdk.K8sClient;\n  }\n\n  async execute(): Promise<void> {\n    const accessProvider = await this.getAccess(this.accessId);\n    const tkeClient = await this.getTkeClient(accessProvider, this.region);\n    let kubeConfigStr = await this.getTkeKubeConfig(tkeClient, this.clusterId);\n\n\n    if (this.clusterDomain) {\n      const kubeConfig = yaml.load(kubeConfigStr);\n      kubeConfig.clusters[0].cluster.server = `https://${this.clusterDomain}`;\n      kubeConfigStr = yaml.dump(kubeConfig);\n    }\n\n    this.logger.info(\"kubeconfig已成功获取\");\n    const k8sClient = new this.K8sClient({\n      kubeConfigStr,\n      logger: this.logger\n    });\n    // if (this.clusterIp != null) {\n    //   if (!this.clusterDomain) {\n    //     this.clusterDomain = `${this.clusterId}.ccs.tencent-cloud.com`;\n    //   }\n    //   // 修改内网解析ip地址\n    //   k8sClient.setLookup({ [this.clusterDomain]: { ip: this.clusterIp } });\n    // }\n    const ingressType = this.ingressClass || \"qcloud\";\n    if (ingressType === \"qcloud\" || ingressType === \"clb\") {\n      await this.patchQcloudCertSecret({ k8sClient });\n    } else {\n      await this.patchNginxCertSecret({ k8sClient });\n    }\n    await utils.sleep(5000); // 停留2秒，等待secret部署完成\n    if (this.ingressName) {\n      this.logger.info(\"正在重启ingress:\", this.ingressName);\n      await this.restartIngress({ k8sClient });\n    }\n\n  }\n\n  async getTkeClient(accessProvider: any, region = \"ap-guangzhou\") {\n    const sdk = await import(\"tencentcloud-sdk-nodejs/tencentcloud/services/tke/v20180525/index.js\");\n    const TkeClient = sdk.v20180525.Client;\n    const clientConfig = {\n      credential: {\n        secretId: accessProvider.secretId,\n        secretKey: accessProvider.secretKey\n      },\n      region,\n      profile: {\n        httpProfile: {\n          endpoint: \"tke.tencentcloudapi.com\"\n        }\n      }\n    };\n\n    return new TkeClient(clientConfig);\n  }\n\n  async getTkeKubeConfig(client: any, clusterId: string) {\n    // Depends on tencentcloud-sdk-nodejs version 4.0.3 or higher\n    const params = {\n      ClusterId: clusterId\n    };\n    const ret = await client.DescribeClusterKubeconfig(params);\n    this.checkRet(ret);\n    this.logger.info(\"注意：后续操作需要在【集群->基本信息】中开启外网或内网访问,https://console.cloud.tencent.com/tke2/cluster\");\n    return ret.Kubeconfig;\n  }\n\n  async patchQcloudCertSecret(options: { k8sClient: any }) {\n    if (this.tencentCertId == null) {\n      throw new Error(\"请先将【上传证书到腾讯云】作为前置任务\");\n    }\n    this.logger.info(\"腾讯云证书ID:\", this.tencentCertId);\n    const certIdBase64 = Buffer.from(this.tencentCertId).toString(\"base64\");\n\n    const { namespace, secretName } = this;\n\n    const body = {\n      data: {\n        qcloud_cert_id: certIdBase64\n      },\n      metadata: {\n        labels: {\n          certd: this.appendTimeSuffix(\"certd\")\n        }\n      }\n    };\n    let secretNames: any = secretName;\n    if (typeof secretName === \"string\") {\n      secretNames = [secretName];\n    }\n    for (const secret of secretNames) {\n      await options.k8sClient.patchSecret({\n        namespace,\n        secretName: secret,\n        body\n      });\n      this.logger.info(`CertSecret已更新:${secret}`);\n    }\n  }\n\n  async patchNginxCertSecret(options: { k8sClient: any }) {\n    const { k8sClient } = options;\n    const { cert } = this;\n    const crt = cert.crt;\n    const key = cert.key;\n    const crtBase64 = Buffer.from(crt).toString(\"base64\");\n    const keyBase64 = Buffer.from(key).toString(\"base64\");\n\n    const { namespace, secretName } = this;\n\n    const body = {\n      data: {\n        \"tls.crt\": crtBase64,\n        \"tls.key\": keyBase64\n      },\n      metadata: {\n        labels: {\n          certd: this.appendTimeSuffix(\"certd\")\n        }\n      }\n    };\n    let secretNames = secretName;\n    if (typeof secretName === \"string\") {\n      secretNames = [secretName];\n    }\n    for (const secret of secretNames) {\n      await k8sClient.patchSecret({ namespace, secretName: secret, body });\n      this.logger.info(`CertSecret已更新:${secret}`);\n    }\n  }\n\n  async restartIngress(options: { k8sClient: any }) {\n    const { k8sClient } = options;\n    const { namespace, ingressName } = this;\n\n    const body = {\n      metadata: {\n        labels: {\n          certd: this.appendTimeSuffix(\"certd\")\n        }\n      }\n    };\n    let ingressNames = this.ingressName || [];\n    if (typeof ingressName === \"string\") {\n      ingressNames = [ingressName];\n    }\n    for (const ingress of ingressNames) {\n      await k8sClient.patchIngress({ namespace, ingressName: ingress, body });\n      this.logger.info(`ingress已重启:${ingress}`);\n    }\n  }\n\n  checkRet(ret: any) {\n    if (!ret || ret.Error) {\n      throw new Error(\"执行失败：\" + ret.Error.Code + \",\" + ret.Error.Message);\n    }\n  }\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/plugin/index.ts",
    "content": "export * from './deploy-to-all/index.js';\nexport * from './deploy-to-clb/index.js';\nexport * from './deploy-to-cdn/index.js';\nexport * from './deploy-to-cdn-v2/index.js';\nexport * from './upload-to-tencent/index.js';\nexport * from './deploy-to-cos/index.js';\nexport * from './deploy-to-eo/index.js';\nexport * from './delete-expiring-cert/index.js';\nexport * from './deploy-to-tke-ingress/index.js';\nexport * from './deploy-to-live/index.js';\nexport * from './start-instances/index.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/plugin/start-instances/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { createRemoteSelectInputDefine, TencentAccess } from \"@certd/plugin-lib\";\n\n@IsTaskPlugin({\n  name: 'TencentActionInstancesPlugin',\n  title: '腾讯云-实例开关机',\n  icon: 'svg:icon-tencentcloud',\n  group: pluginGroups.tencent.key,\n  desc: '腾讯云实例开关机',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.AlwaysRun,\n    },\n  },\n  needPlus: false,\n})\nexport class TencentActionInstancesPlugin extends AbstractTaskPlugin {\n  @TaskInput({\n    title: 'Access提供者',\n    helper: 'access 授权',\n    component: {\n      name: 'access-selector',\n      type: 'tencent',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: '所在地域',\n    helper: '实例所在地域',\n    component: {\n      name: 'a-auto-complete',\n      vModel: 'value',\n      options: [\n        { value: '', label: '--------中国大陆地区-------', disabled: true },\n        { value: 'ap-beijing-1', label: '北京1区' },\n        { value: 'ap-beijing', label: '北京' },\n        { value: 'ap-nanjing', label: '南京' },\n        { value: 'ap-shanghai', label: '上海' },\n        { value: 'ap-guangzhou', label: '广州' },\n        { value: 'ap-chengdu', label: '成都' },\n        { value: 'ap-chongqing', label: '重庆' },\n        { value: 'ap-shenzhen-fsi', label: '深圳金融' },\n        { value: 'ap-shanghai-fsi', label: '上海金融' },\n        { value: 'ap-beijing-fsi', label: '北京金融' },\n        { value: '', label: '--------中国香港及境外-------', disabled: true },\n        { value: 'ap-hongkong', label: '中国香港' },\n        { value: 'ap-singapore', label: '新加坡' },\n        { value: 'ap-mumbai', label: '孟买' },\n        { value: 'ap-jakarta', label: '雅加达' },\n        { value: 'ap-seoul', label: '首尔' },\n        { value: 'ap-bangkok', label: '曼谷' },\n        { value: 'ap-tokyo', label: '东京' },\n        { value: 'na-siliconvalley', label: '硅谷' },\n        { value: 'na-ashburn', label: '弗吉尼亚' },\n        { value: 'sa-saopaulo', label: '圣保罗' },\n        { value: 'eu-frankfurt', label: '法兰克福' },\n      ],\n    },\n    required: true,\n  })\n  region!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: '实列ID',\n      helper: '请选择实列',\n      typeName: 'TencentStartInstancesPlugin',\n      action: TencentActionInstancesPlugin.prototype.onGetInstanceList.name,\n      watches: ['region'],\n    })\n  )\n  instanceId!: string[];\n\n  @TaskInput({\n    title: '操作',\n    component: {\n      name: 'a-radio-group',\n      vModel: 'value',\n      options: [\n        { value: 'start', label: '开机' },\n        { value: 'stop', label: '关机' },\n      ],\n    },\n    required: true,\n  })\n  action!: string;\n\n  @TaskInput({\n    title: '实例关机不收费',\n    value: true,\n    component: {\n      name: 'a-switch',\n      vModel: 'checked',\n      placeholder: `按量计费实例关机不收费`,\n    },\n    required: false,\n    mergeScript: `\n      return {\n        show: ctx.compute(({form})=>{\n          return form.action === 'stop';\n        })\n      }\n  `,\n  })\n  charging = true;\n\n  async onInstance() {}\n\n  async execute(): Promise<void> {\n    const cvmClient = await this.getCvmClient();\n    const params = {\n      InstanceIds: this.instanceId,\n    };\n    let res: any;\n    if (this.action === 'start') {\n      res = await cvmClient.StartInstances(params);\n    } else {\n      res = await cvmClient.StopInstances(\n        Object.assign(params, {\n          StopType: 'SOFT_FIRST',\n          StoppedMode: this.charging ? 'STOP_CHARGING' : 'KEEP_CHARGING',\n        })\n      );\n    }\n\n    this.checkRet(res);\n  }\n\n  checkRet(ret: any) {\n    if (!ret || ret.Error) {\n      throw new Error('执行失败：' + ret.Error.Code + ',' + ret.Error.Message);\n    }\n  }\n\n  async getCvmClient() {\n    const accessProvider = await this.getAccess<TencentAccess>(this.accessId);\n    const sdk = await import('tencentcloud-sdk-nodejs/tencentcloud/services/cvm/v20170312/index.js');\n    const CvmClient = sdk.v20170312.Client;\n\n    if (!this.region) {\n      throw new Error('所在地域不能为空');\n    }\n\n    const clientConfig = {\n      credential: {\n        secretId: accessProvider.secretId,\n        secretKey: accessProvider.secretKey,\n      },\n      region: this.region,\n      profile: {\n        httpProfile: {\n          endpoint: 'cvm.tencentcloudapi.com',\n        },\n      },\n    };\n\n    return new CvmClient(clientConfig);\n  }\n\n  async onGetInstanceList(data: any) {\n    const cvmClient = await this.getCvmClient();\n    const res = await cvmClient.DescribeInstances({\n      Limit: 100,\n    });\n    this.checkRet(res);\n\n    this.ctx.logger.info('获取实列列表:', res);\n    return res.InstanceSet.map((item: any) => {\n      return {\n        label: item.InstanceName,\n        value: item.InstanceId,\n      };\n    });\n  }\n}\n\nnew TencentActionInstancesPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-tencent/plugin/upload-to-tencent/index.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertReader } from \"@certd/plugin-cert\";\nimport { TencentAccess, TencentSslClient } from \"@certd/plugin-lib\";\n\n@IsTaskPlugin({\n  name: 'UploadCertToTencent',\n  title: '腾讯云-上传证书到腾讯云',\n  icon: 'svg:icon-tencentcloud',\n  desc: '上传成功后输出：tencentCertId',\n  group: pluginGroups.tencent.key,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class UploadCertToTencent extends AbstractTaskPlugin {\n  // @TaskInput({ title: '证书名称' })\n  // name!: string;\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: 'access授权',\n    component: {\n      name: 'access-selector',\n      type: 'tencent',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: any;\n\n  @TaskOutput({\n    title: '上传成功后的腾讯云CertId',\n  })\n  tencentCertId?: string;\n\n  Client: any;\n  async onInstance() {\n    const sdk = await import('tencentcloud-sdk-nodejs/tencentcloud/services/ssl/v20191205/index.js');\n    this.Client = sdk.v20191205.Client;\n  }\n\n  async execute(): Promise<void> {\n    const access = await this.getAccess<TencentAccess>(this.accessId);\n    const sslClient = new TencentSslClient({\n      access,\n      logger: this.logger,\n    });\n\n    const certReader = new CertReader(this.cert);\n    const tencentCertId = await sslClient.uploadToTencent({\n      certName: certReader.buildCertName(),\n      cert: this.cert,\n    });\n\n    this.tencentCertId = tencentCertId;\n  }\n\n\n\n  checkRet(ret: any) {\n    if (!ret || ret.Error) {\n      throw new Error('执行失败：' + ret.Error.Code + ',' + ret.Error.Message);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-upyun/access.ts",
    "content": "import {AccessInput, BaseAccess, IsAccess} from '@certd/pipeline';\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: 'upyun',\n  title: '又拍云',\n  desc: '',\n  icon: 'svg:icon-upyun',\n})\nexport class UpyunAccess extends BaseAccess {\n\n  @AccessInput({\n    title: '账号',\n    component: {\n      placeholder: '又拍云账号',\n    },\n    required: true,\n  })\n  username = '';\n  @AccessInput({\n    title: '密码',\n    component: {\n      placeholder: '又拍云密码',\n    },\n    required: true,\n    encrypt: true,\n  })\n  password = '';\n\n}\n\nnew UpyunAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-upyun/client.ts",
    "content": "import { UpyunAccess } from \"./access.js\";\nimport { HttpClient, ILogger } from \"@certd/basic\";\nimport { CertInfo } from \"@certd/plugin-cert\";\n\nexport type UpyunClientOptions = {\n  access: UpyunAccess\n  logger: ILogger;\n  http: HttpClient\n}\n\nexport class UpyunClient {\n  opts: UpyunClientOptions;\n\n  constructor(opts: UpyunClientOptions) {\n    this.opts = opts;\n  }\n\n  async uploadCert(cookie: string,cert:CertInfo) {\n    // https://console.upyun.com/api/https/certificate/\n    const res = await this.doRequest({\n      cookie: cookie,\n      url: \"https://console.upyun.com/api/https/certificate/\",\n      method: \"POST\",\n      data: {\n        certificate: cert.crt,\n        private_key: cert.key\n      }\n    });\n\n    return res.data.result.certificate_id;\n  }\n\n  async getLoginToken() {\n    const access = this.opts.access\n    const http = this.opts.http;\n    const res = await http.request({\n      url: \"https://console.upyun.com/accounts/signin/\",\n      method: \"POST\",\n      data: {\n        username: access.username,\n        password: access.password\n      },\n      logRes: false,\n      returnOriginRes: true\n    });\n    if (res.data?.errors?.length > 0) {\n      throw new Error(JSON.stringify(res.data.msg));\n    }\n    const cookie = res.headers[\"set-cookie\"];\n    return cookie;\n  }\n\n  async doRequest(req: {\n    cookie: string,\n    url: string,\n    method: string,\n    data: any\n  }) {\n\n    const res = await this.opts.http.request({\n      url: req.url,\n      method: req.method,\n      data: req.data,\n      headers: {\n        Cookie: req.cookie\n      }\n    });\n    if (res.msg.errors.length > 0) {\n      throw new Error(JSON.stringify(res.msg));\n    }\n    if(res.data?.error_code){\n      throw new Error(res.data?.message);\n    }\n    return res;\n  }\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-upyun/index.ts",
    "content": "export * from './plugins/index.js';\nexport * from './access.js';\nexport * from './client.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-upyun/plugins/index.ts",
    "content": "export * from './plugin-depoy-to-cdn.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-upyun/plugins/plugin-depoy-to-cdn.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { UpyunAccess } from \"../access.js\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { optionsUtils } from \"@certd/basic/dist/utils/util.options.js\";\nimport { UpyunClient } from \"../client.js\";\n\n@IsTaskPlugin({\n  //命名规范，插件名称+功能（就是目录plugin-demo中的demo），大写字母开头，驼峰命名\n  name: \"UpyunDeployToCdn\",\n  title: \"又拍云-部署证书到CDN/USS\",\n  icon: \"svg:icon-upyun\",\n  desc:\"支持又拍云CDN，又拍云云存储USS\",\n  //插件分组\n  group: pluginGroups.cdn.key,\n  needPlus: false,\n  default: {\n    //默认值配置照抄即可\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\n//类名规范，跟上面插件名称（name）一致\nexport class UpyunDeployToCdn extends AbstractTaskPlugin {\n  //证书选择，此项必须要有\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames]\n    }\n    // required: true, // 必填\n  })\n  cert!: CertInfo;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n  //授权选择框\n  @TaskInput({\n    title: \"Upyun授权\",\n    component: {\n      name: \"access-selector\",\n      type: \"upyun\" //固定授权类型\n    },\n    required: true //必填\n  })\n  accessId!: string;\n  //\n\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"加速域名\",\n      helper: \"选择加速域名，可以手动输入\",\n      typeName: \"UpyunDeployToCdn\",\n      action: UpyunDeployToCdn.prototype.onGetCdnList.name,\n      watches: [\"accessId\"]\n    })\n  )\n  cdnList!: string[];\n\n  @TaskInput({\n    title: \"强制HTTPS\",\n    value:\"keep\",\n    component: {\n      name: \"a-select\",\n      vModel:\"value\",\n      options:[\n        {value:\"true\",\"label\":\"强制HTTPS\"},\n        {value:\"false\",\"label\":\"不强制HTTPS\"},\n        {value:\"keep\",\"label\":\"保持原样\"}\n      ]\n    },\n    required: true //必填\n  })\n  forceHttps!: string;\n\n  @TaskInput({\n    title: \"开启HTTPS\",\n    value:\"true\",\n    component: {\n      name: \"a-select\",\n      vModel:\"value\",\n      options:[\n        {value:\"true\",\"label\":\"开启HTTPS\"},\n        {value:\"false\",\"label\":\"关闭HTTPS\"},\n        {value:\"keep\",\"label\":\"保持原样\"}\n      ]\n    },\n    required: true //必填\n  })\n  https!: string;\n\n  //插件实例化时执行的方法\n  async onInstance() {\n  }\n\n  //插件执行方法\n  async execute(): Promise<void> {\n    const access = await this.getAccess<UpyunAccess>(this.accessId);\n\n    const upyunClient = new UpyunClient({\n      access,\n      logger: this.logger,\n      http: this.ctx.http\n    });\n    const cookie = await upyunClient.getLoginToken();\n    this.logger.info(`登录成功`);\n    const certId = await upyunClient.uploadCert(cookie, this.cert);\n    this.logger.info(`上传证书成功：${certId}`);\n    for (const item of this.cdnList) {\n\n      this.logger.info(`开始部署证书：${item}`);\n\n      const data1 :any= {\n        crt_id: certId,\n        domain_name: item,\n      }\n\n      const res1=await upyunClient.doRequest({\n        cookie: cookie,\n        url: \"https://console.upyun.com/api/https/migrate/domain\",\n        method: \"POST\",\n        data: data1\n      });\n\n      this.logger.info(`设置证书成功：${JSON.stringify(res1)}`);\n\n      const data2 :any= {\n        certificate_id: certId,\n        domain: item,\n      }\n\n      if (this.forceHttps !== 'keep') {\n        data2.force_https = Boolean(this.forceHttps);\n      }\n      if (this.https !=='keep') {\n        data2.https = Boolean(this.https);\n      }\n\n      this.logger.info(`设置证书参数：${JSON.stringify(data2)}`);\n      const res2 = await upyunClient.doRequest({\n        cookie: cookie,\n        url: \"https://console.upyun.com/api/https/certificate/manager\",\n        method: \"POST\",\n        data: data2\n      });\n      this.logger.info(`设置证书参数成功：${JSON.stringify(res2)}`);\n    }\n\n    this.logger.info(\"部署成功\");\n  }\n\n\n  async onGetCdnList() {\n    if (!this.accessId) {\n      throw new Error(\"accessId不能为空\");\n    }\n    const access = await this.getAccess<UpyunAccess>(this.accessId);\n\n    const upyunClient = new UpyunClient({\n      access,\n      logger: this.logger,\n      http: this.ctx.http\n    });\n    const cookie = await upyunClient.getLoginToken();\n    const req = {\n      cookie,\n      url: \"https://console.upyun.com/api/account/domains/?limit=15&business_type=file&security_cdn=false&websocket=false&key=&domain=\",\n      method: \"GET\",\n      data: {}\n    };\n    const res = await upyunClient.doRequest(req);\n\n    const domains = res.data?.domains;\n    if (!domains || domains.length === 0) {\n      throw new Error(\"没有找到加速域名\");\n    }\n    const list = [];\n    for (const domain of domains) {\n      list.push({\n        domain: domain.domain,\n        bucket: domain.bucket_name\n      });\n    }\n\n    const options = list.map((item: any) => {\n      return {\n        value: item.domain,\n        label: `${item.domain}<${item.bucket}>`,\n        domain: item.domain\n      };\n    });\n    return optionsUtils.buildGroupOptions(options, this.certDomains);\n\n\n  }\n}\n\n//实例化一下，注册插件\nnew UpyunDeployToCdn();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/access.ts",
    "content": "import {AccessInput, BaseAccess, IsAccess} from '@certd/pipeline';\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: 'volcengine',\n  title: '火山引擎',\n  desc: '',\n  icon: 'svg:icon-volcengine',\n})\nexport class VolcengineAccess extends BaseAccess {\n\n  @AccessInput({\n    title: 'AccessKeyID',\n    component: {\n      placeholder: 'AccessKeyID',\n    },\n    helper:\"[获取密钥](https://console.volcengine.com/iam/keymanage/)\",\n    required: true,\n  })\n  accessKeyId = '';\n  @AccessInput({\n    title: 'SecretAccessKey',\n    component: {\n      placeholder: 'SecretAccessKey',\n    },\n    required: true,\n    encrypt: true,\n  })\n  secretAccessKey = '';\n\n}\n\nnew VolcengineAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/cdn-client.ts",
    "content": "import { VolcengineOpts } from \"./ve-client.js\";\nimport { CertInfo } from \"@certd/plugin-cert\";\n\nexport class VolcengineCdnClient {\n  opts: VolcengineOpts;\n\n  service: any;\n\n  constructor(opts: VolcengineOpts) {\n    this.opts = opts;\n  }\n\n\n  async getCdnClient() {\n    if (this.service) {\n      return this.service;\n    }\n    const { cdn } = await import(\"@volcengine/openapi\");\n    const service = new cdn.CdnService();\n    // 设置ak、sk\n    service.setAccessKeyId(this.opts.access.accessKeyId);\n    service.setSecretKey(this.opts.access.secretAccessKey);\n\n    this.service = service;\n    return service;\n  }\n\n  async uploadCert(cert: CertInfo, certName: string) {\n    const service = await this.getCdnClient();\n    const res = await service.Generic(\"AddCertificate\", {\n      Source: \"volc_cert_center\",\n      CertType: \"server_cert\",\n      Certificate: cert.crt,\n      PrivateKey: cert.key,\n      EncryType: \"inter_cert\",\n      Repeatable: false,\n      Desc: certName\n    });\n\n    if (res.ResponseMetadata?.Error) {\n      if (res.ResponseMetadata?.Error?.Code?.includes(\"Duplicated\")) {\n        // 证书已存在，ID为 cert-16293a8524844a3e8e30ed62f8e5bc94。\n        const message = res.ResponseMetadata?.Error?.Message\n        const reg = /ID为 (\\S+)。/;\n        const certId =  message.match(reg)?.[1]\n        if (certId) {\n          this.opts.logger.info(`证书已存在，ID为 ${certId}`);\n          return certId;\n        }\n      }\n      throw new Error(JSON.stringify(res.ResponseMetadata?.Error));\n    }\n\n    const certId = res.Result.CertId\n    this.opts.logger.info(`上传证书成功:${certId}`)\n    return certId;\n\n\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/dns-client.ts",
    "content": "import {http} from \"@certd/basic\";\nimport querystring from \"querystring\";\nimport {VolcengineOpts} from \"./ve-client.js\";\n\n\nexport type VolcengineReq = {\n  method?: string;\n  path?: string;\n  headers?: any;\n  body?: any;\n  query?: any;\n  service?: string, // 替换为实际服务名称\n  region?: string,   // 替换为实际区域名称\n}\n\nexport class VolcengineDnsClient {\n  opts: VolcengineOpts;\n\n  constructor(opts: VolcengineOpts) {\n    this.opts = opts;\n  }\n\n\n  async doRequest(req: VolcengineReq) {\n    const {Signer} =await import('@volcengine/openapi') ;\n\n// http request data\n    const openApiRequestData: any = {\n      region: req.region,\n      method: req.method,\n      // [optional] http request url query\n      params: {\n        ...req.query,\n      },\n      // http request headers\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      // [optional] http request body\n      body: req.body,\n    }\n\n    const signer = new Signer(openApiRequestData, req.service);\n\n// sign\n    signer.addAuthorization({accessKeyId:this.opts.access.accessKeyId, secretKey:this.opts.access.secretAccessKey});\n\n// Print signed headers\n    console.log(openApiRequestData.headers);\n\n\n    const url = `https://open.volcengineapi.com/?${querystring.stringify(req.query)}`\n\n    try{\n      const res = await http.request({\n        url: url,\n        method: req.method,\n        headers: openApiRequestData.headers,\n        data:req.body\n      });\n      if (res?.ResponseMetadata?.Error) {\n        const err = new Error(JSON.stringify(res.ResponseMetadata.Error));\n        // @ts-ignore\n        err.detail = res.ResponseMetadata.Error;\n        throw err\n      }\n      return res\n    }catch (e) {\n      if(e.response){\n        const err = new Error(JSON.stringify(e.response.data.ResponseMetadata.Error));\n        // @ts-ignore\n        err.detail = e.response.data.ResponseMetadata.Error;\n        throw err\n      }\n    }\n\n\n\n  }\n\n\n  // 列出域名解析记录\n  async findDomain(domain: string) {\n    const req: VolcengineReq = {\n      method: \"POST\",\n      region: \"cn-beijing\",\n      service: \"dns\",\n      query: {\n        Action: \"ListZones\",\n        Version: \"2018-08-01\",\n      },\n      body:{\n        Key: domain,\n        SearchMode: \"exact\"\n      }\n    };\n\n    return this.doRequest(req);\n  }\n}\n\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/index.ts",
    "content": "export * from './plugins/index.js';\nexport * from './access.js';\nexport * from './volcengine-dns-provider.js';\nexport * from './ve-client.js';\nexport * from './dns-client.js';\nexport * from './cdn-client.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/plugins/index.ts",
    "content": "export * from './plugin-deploy-to-cdn.js'\nexport * from './plugin-deploy-to-clb.js'\nexport * from './plugin-upload-to-cert-center.js'\nexport * from './plugin-deploy-to-alb.js'\nexport * from './plugin-deploy-to-live.js'\nexport * from './plugin-deploy-to-dcdn.js'\nexport * from './plugin-deploy-to-vod.js'\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/plugins/plugin-deploy-to-alb.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { VolcengineAccess } from \"../access.js\";\nimport { VolcengineClient } from \"../ve-client.js\";\n\n@IsTaskPlugin({\n  name: \"VolcengineDeployToALB\",\n  title: \"火山引擎-部署证书至ALB\",\n  icon: \"svg:icon-volcengine\",\n  group: pluginGroups.volcengine.key,\n  desc: \"部署至火山引擎应用负载均衡\",\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\nexport class VolcengineDeployToALB extends AbstractTaskPlugin {\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames, \"VolcengineUploadToCertCenter\"]\n    },\n    required: true\n  })\n  cert!: CertInfo | string;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n\n  @TaskInput({\n    title: \"Access授权\",\n    helper: \"火山引擎AccessKeyId、AccessKeySecret\",\n    component: {\n      name: \"access-selector\",\n      type: \"volcengine\"\n    },\n    required: true\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: \"Region\",\n    helper: \"地区选择\",\n    component: {\n      name: \"a-select\",\n      options: [\n        /**\n         * 中国地区\n         * 华北2\n         * 北京\n         * cn-beijing\n         * 4\n         * 可用区A：cn-beijing-a\n         * 可用区B：cn-beijing-b\n         * 可用区C：cn-beijing-c\n         * 可用区D：cn-beijing-d\n         * 商用\n         * 华东2\n         * 上海\n         * cn-shanghai\n         * 4\n         * 可用区A：cn-shanghai-a\n         * 可用区B：cn-shanghai-b\n         * 可用区C：cn-shanghai-c\n         * 可用区E：cn-shanghai-e\n         * 商用\n         * 华南1\n         * 广州\n         * cn-guangzhou\n         * 3\n         * 可用区A：cn-guangzhou-a\n         * 可用区B：cn-guangzhou-b\n         * 可用区C：cn-guangzhou-c\n         * 商用\n         * 中国香港\n         * 香港\n         * cn-hongkong\n         * 2\n         * 可用区A：cn-hongkong-a\n         * 可用区B：cn-hongkong-b\n         * 商用\n         * 其他国家和地区\n         * 亚太东南\n         * 柔佛\n         * ap-southeast-1\n         * 2\n         * 可用区A：ap-southeast-1a\n         * 可用区B：ap-southeast-1b\n         * 商用\n         * 雅加达\n         * ap-southeast-3\n         * 2\n         * 可用区A：ap-southeast-3a\n         * 可用区B：ap-southeast-3b\n         * 商用\n         */\n        { label: \"北京\", value: \"cn-beijing\" },\n        { label: \"上海\", value: \"cn-shanghai\" },\n        { label: \"广州\", value: \"cn-guangzhou\" },\n        { label: \"香港\", value: \"cn-hongkong\" },\n        { label: \"柔佛\", value: \"ap-southeast-1\" },\n        { label: \"雅加达\", value: \"ap-southeast-3\" }\n\n      ]\n    },\n    value: \"cn-beijing\",\n    required: true\n  })\n  regionId!: string;\n\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"监听器列表\",\n      helper: \"选择要部署证书的监听器\\n需要在监听器中选择证书中心，进行跨服务访问授权\",\n      action: VolcengineDeployToALB.prototype.onGetListenerList.name,\n      watches: [\"certDomains\", \"accessId\", \"regionId\"],\n      required: true\n    })\n  )\n  listenerList!: string | string[];\n\n\n  async onInstance() {\n  }\n\n  async execute(): Promise<void> {\n    this.logger.info(\"开始部署证书到火山引擎ALB\");\n    const access = await this.getAccess<VolcengineAccess>(this.accessId);\n    const certService = await this.getCertService(access);\n    let certId = this.cert;\n    if (typeof certId !== \"string\") {\n      const certInfo = this.cert as CertInfo;\n      this.logger.info(`开始上传证书`);\n      certId = await certService.ImportCertificate({\n        certName:this.appendTimeSuffix(\"certd\"),\n        cert:certInfo\n      });\n      this.logger.info(`上传证书成功:${certId}`);\n    } else {\n      this.logger.info(`使用已有证书ID:${certId}`);\n    }\n\n    const service = await this.getAlbService();\n    for (const listener of this.listenerList) {\n      this.logger.info(`开始部署监听器${listener}证书`);\n      await service.request({\n        action: \"ModifyListenerAttributes\",\n        query: {\n          ListenerId: listener,\n          CertificateSource: \"cert_center\",\n          CertCenterCertificateId: certId\n        }\n      });\n      this.logger.info(`部署监听器${listener}证书成功`);\n    }\n\n    this.logger.info(\"部署完成\");\n  }\n\n\n  private async getCertService(access: VolcengineAccess) {\n    const client = new VolcengineClient({\n      logger: this.logger,\n      access,\n      http: this.http\n    });\n\n    return await client.getCertCenterService();\n  }\n\n  private async getAlbService() {\n    const access = await this.getAccess<VolcengineAccess>(this.accessId);\n\n    const client = new VolcengineClient({\n      logger: this.logger,\n      access,\n      http: this.http\n    });\n\n    const service = await client.getAlbService({\n      region: this.regionId\n    });\n    return service;\n  }\n\n  async onGetListenerList(data: any) {\n    if (!this.accessId) {\n      throw new Error(\"请选择Access授权\");\n    }\n    const service = await this.getAlbService();\n\n    const res = await service.request({\n      action: \"DescribeListeners\",\n      method: \"GET\",\n      query: {\n        PageSize: 100,\n        Protocol: \"HTTPS\"\n      },\n    });\n\n    const list = res.Result.Listeners;\n    if (!list || list.length === 0) {\n      throw new Error(\"找不到HTTPS类型的负载均衡监听器，您也可以手动输入监听器ID\");\n    }\n    return list.map((item: any) => {\n      return {\n        value: item.ListenerId,\n        label: `${item.ListenerName}<${item.Description}:${item.ListenerId}>`\n      };\n    });\n  }\n}\n\nnew VolcengineDeployToALB();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/plugins/plugin-deploy-to-cdn.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { optionsUtils } from \"@certd/basic/dist/utils/util.options.js\";\nimport { VolcengineAccess } from \"../access.js\";\nimport { VolcengineCdnClient } from \"../cdn-client.js\";\n\n@IsTaskPlugin({\n  name: 'VolcengineDeployToCDN',\n  title: '火山引擎-部署证书至CDN',\n  icon: 'svg:icon-volcengine',\n  group: pluginGroups.volcengine.key,\n  desc: '支持网页，文件下载，音视频点播',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class VolcengineDeployToCDN extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames, 'VolcengineUploadToCertCenter'],\n    },\n    required: true,\n  })\n  cert!: CertInfo | string;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '火山引擎AccessKeyId、AccessKeySecret',\n    component: {\n      name: 'access-selector',\n      type: 'volcengine',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: '服务类型',\n    helper: '网页，文件下载，音视频点播',\n    component: {\n      name: 'a-select',\n      options:[\n        { label: \"网页\", value: \"web\" },\n        { label: \"文件下载\", value: \"download\" },\n        { label: \"音视频点播\", value: 'video'},\n      ]\n    },\n    value: 'web',\n    required: true,\n  })\n  serviceType:string = \"web\"\n\n\n\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: 'CDN加速域名',\n      helper: '你在火山引擎上配置的CDN加速域名，比如:certd.docmirror.cn',\n      action: VolcengineDeployToCDN.prototype.onGetDomainList.name,\n      watches: ['certDomains', 'accessId', 'serviceType'],\n      required: true,\n    })\n  )\n  domainName!: string | string[];\n\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    this.logger.info('开始部署证书到火山引擎CDN');\n    const access = await this.getAccess<VolcengineAccess>(this.accessId);\n\n    const client = await this.getClient(access)\n    const service = await client.getCdnClient()\n    if (!this.cert) {\n      throw new Error('你还未选择证书');\n    }\n    let certId = this.cert\n    if (typeof certId !== 'string') {\n      const certInfo = this.cert as CertInfo\n      this.logger.info(`开始上传证书`)\n      certId = await client.uploadCert(certInfo, this.appendTimeSuffix('certd'))\n      this.logger.info(`上传证书成功：${certId}`);\n    }else{\n      this.logger.info(`使用已有证书ID：${certId}`);\n    }\n\n    for (const domain of this.domainName) {\n      this.logger.info(`开始部署域名${domain}证书`)\n      await service.UpdateCdnConfig({\n        Domain: domain,\n        HTTPS: {\n          CertInfo: { CertId: certId },\n        }\n      })\n      this.logger.info(`部署域名${domain}证书成功`);\n      await this.ctx.utils.sleep(1000)\n    }\n\n    this.logger.info('部署完成');\n  }\n\n\n  async getClient(access: VolcengineAccess) {\n    return   new VolcengineCdnClient({\n      logger: this.logger,\n      access,\n      http:this.http\n    })\n  }\n\n  async onGetDomainList(data: any) {\n    if (!this.accessId) {\n      throw new Error('请选择Access授权');\n    }\n    const access = await this.getAccess<VolcengineAccess>(this.accessId);\n\n    const client = await this.getClient(access);\n    const service = await client.getCdnClient()\n    const res = await service.ListCdnDomains({\n      ServiceType: this.serviceType,\n      PageNum: 1,\n      PageSize: 100,\n    })\n    // @ts-ignore\n    const list = res?.Result?.Data\n    if (!list || list.length === 0) {\n      throw new Error('找不到加速域名，您可以手动输入');\n    }\n    const options = list.map((item: any) => {\n      return {\n        value: item.Domain,\n        label: item.Domain,\n        domain: item.Domain,\n      };\n    });\n    return optionsUtils.buildGroupOptions(options, this.certDomains);\n  }\n}\nnew VolcengineDeployToCDN();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/plugins/plugin-deploy-to-clb.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { VolcengineAccess } from \"../access.js\";\nimport { VolcengineClient } from \"../ve-client.js\";\n\n@IsTaskPlugin({\n  name: \"VolcengineDeployToCLB\",\n  title: \"火山引擎-部署证书至CLB\",\n  icon: \"svg:icon-volcengine\",\n  group: pluginGroups.volcengine.key,\n  desc: \"部署至火山引擎负载均衡\",\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\nexport class VolcengineDeployToCLB extends AbstractTaskPlugin {\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames, \"VolcengineUploadToCertCenter\"]\n    },\n    required: true\n  })\n  cert!: CertInfo | string;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n\n  @TaskInput({\n    title: \"Access授权\",\n    helper: \"火山引擎AccessKeyId、AccessKeySecret\",\n    component: {\n      name: \"access-selector\",\n      type: \"volcengine\"\n    },\n    required: true\n  })\n  accessId!: string;\n\n  @TaskInput({\n    title: \"Region\",\n    helper: \"地区选择\",\n    component: {\n      name: \"a-select\",\n      options: [\n        /**\n         * 中国地区\n         * 华北2\n         * 北京\n         * cn-beijing\n         * 4\n         * 可用区A：cn-beijing-a\n         * 可用区B：cn-beijing-b\n         * 可用区C：cn-beijing-c\n         * 可用区D：cn-beijing-d\n         * 商用\n         * 华东2\n         * 上海\n         * cn-shanghai\n         * 4\n         * 可用区A：cn-shanghai-a\n         * 可用区B：cn-shanghai-b\n         * 可用区C：cn-shanghai-c\n         * 可用区E：cn-shanghai-e\n         * 商用\n         * 华南1\n         * 广州\n         * cn-guangzhou\n         * 3\n         * 可用区A：cn-guangzhou-a\n         * 可用区B：cn-guangzhou-b\n         * 可用区C：cn-guangzhou-c\n         * 商用\n         * 中国香港\n         * 香港\n         * cn-hongkong\n         * 2\n         * 可用区A：cn-hongkong-a\n         * 可用区B：cn-hongkong-b\n         * 商用\n         * 其他国家和地区\n         * 亚太东南\n         * 柔佛\n         * ap-southeast-1\n         * 2\n         * 可用区A：ap-southeast-1a\n         * 可用区B：ap-southeast-1b\n         * 商用\n         * 雅加达\n         * ap-southeast-3\n         * 2\n         * 可用区A：ap-southeast-3a\n         * 可用区B：ap-southeast-3b\n         * 商用\n         */\n        { label: \"北京\", value: \"cn-beijing\" },\n        { label: \"上海\", value: \"cn-shanghai\" },\n        { label: \"广州\", value: \"cn-guangzhou\" },\n        { label: \"深圳\", value: \"cn-shenzhen\" },\n        { label: \"杭州\", value: \"cn-hangzhou\" },\n        { label: \"南京\", value: \"cn-north-1\" },\n        { label: \"青岛\", value: \"cn-qingdao\" },\n        { label: \"重庆\", value: \"cn-chengdu\" },\n        { label: \"香港\", value: \"cn-hongkong\" },\n        { label: \"柔佛\", value: \"ap-southeast-1\" },\n        { label: \"雅加达\", value: \"ap-southeast-3\" }\n\n      ]\n    },\n    value: \"cn-beijing\",\n    required: true\n  })\n  regionId!: string;\n\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"监听器列表\",\n      helper: \"选择要部署证书的监听器\\n需要在监听器中选择证书中心，进行跨服务访问授权\",\n      action: VolcengineDeployToCLB.prototype.onGetListenerList.name,\n      watches: [\"certDomains\", \"accessId\", \"regionId\"],\n      required: true\n    })\n  )\n  listenerList!: string | string[];\n\n\n  async onInstance() {\n  }\n\n  async execute(): Promise<void> {\n    this.logger.info(\"开始部署证书到火山引擎CLB\");\n    const access = await this.getAccess<VolcengineAccess>(this.accessId);\n    const certService = await this.getCertService(access);\n    let certId = this.cert;\n    if (typeof certId !== \"string\") {\n      const certInfo = this.cert as CertInfo;\n      this.logger.info(`开始上传证书`);\n      certId = await certService.ImportCertificate({\n        certName:this.appendTimeSuffix(\"certd\"),\n        cert:certInfo\n      });\n      this.logger.info(`上传证书成功:${certId}`);\n    } else {\n      this.logger.info(`使用已有证书ID:${certId}`);\n    }\n\n    const service = await this.getClbService();\n    for (const listener of this.listenerList) {\n      this.logger.info(`开始部署监听器${listener}证书`);\n      await service.request({\n        action: \"ModifyListenerAttributes\",\n        query: {\n          ListenerId: listener,\n          CertificateSource: \"cert_center\",\n          CertCenterCertificateId: certId\n        }\n      });\n      this.logger.info(`部署监听器${listener}证书成功`);\n    }\n\n    this.logger.info(\"部署完成\");\n  }\n\n\n  private async getCertService(access: VolcengineAccess) {\n    const client = new VolcengineClient({\n      logger: this.logger,\n      access,\n      http: this.http\n    });\n\n    return await client.getCertCenterService();\n  }\n\n  async onGetClbList(data: any) {\n    if (!this.accessId) {\n      throw new Error(\"请选择Access授权\");\n    }\n    const service = await this.getClbService();\n    const res = await service.request({\n      action: \"DescribeLoadBalancers\",\n      method: \"GET\",\n      query: {\n        PageSize: 100\n      },\n    });\n\n    const list = res.Result.LoadBalancers;\n\n    return list.map((item: any) => {\n      return {\n        value: item.LoadBalancerId,\n        label: `${item.LoadBalancerName}<${item.Description}>`\n      };\n    });\n  }\n\n  private async getClbService() {\n    const access = await this.getAccess<VolcengineAccess>(this.accessId);\n\n    const client = new VolcengineClient({\n      logger: this.logger,\n      access,\n      http: this.http\n    });\n\n    const service = await client.getClbService({\n      region: this.regionId\n    });\n    return service;\n  }\n\n  async onGetListenerList(data: any) {\n    if (!this.accessId) {\n      throw new Error(\"请选择Access授权\");\n    }\n    const service = await this.getClbService();\n\n    const res = await service.request({\n      action: \"DescribeListeners\",\n      method: \"GET\",\n      query: {\n        PageSize: 100,\n        Protocol: \"HTTPS\"\n      },\n    });\n\n    const list = res.Result.Listeners;\n    if (!list || list.length === 0) {\n      throw new Error(\"找不到HTTPS类型的负载均衡监听器，您也可以手动输入监听器ID\");\n    }\n    return list.map((item: any) => {\n      return {\n        value: item.ListenerId,\n        label: `${item.ListenerName}<${item.Description}:${item.ListenerId}>`\n      };\n    });\n  }\n}\n\nnew VolcengineDeployToCLB();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/plugins/plugin-deploy-to-dcdn.ts",
    "content": "import {AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput} from \"@certd/pipeline\";\nimport {createCertDomainGetterInputDefine, createRemoteSelectInputDefine} from \"@certd/plugin-lib\";\nimport {CertApplyPluginNames, CertInfo, CertReader} from \"@certd/plugin-cert\";\nimport {VolcengineAccess} from \"../access.js\";\nimport {VolcengineClient} from \"../ve-client.js\";\n\n@IsTaskPlugin({\n    name: \"VolcengineDeployToDCDN\",\n    title: \"火山引擎-部署证书至DCDN\",\n    icon: \"svg:icon-volcengine\",\n    group: pluginGroups.volcengine.key,\n    desc: \"部署至火山引擎全站加速\",\n    // showRunStrategy: true,\n    default: {\n        strategy: {\n            runStrategy: RunStrategy.SkipWhenSucceed\n        }\n    }\n})\nexport class VolcengineDeployToDCDN extends AbstractTaskPlugin {\n    @TaskInput({\n        title: \"域名证书\",\n        helper: \"请选择前置任务输出的域名证书\",\n        component: {\n            name: \"output-selector\",\n            from: [...CertApplyPluginNames]\n        },\n        required: true\n    })\n    cert!: CertInfo;\n\n    @TaskInput(createCertDomainGetterInputDefine({props: {required: false}}))\n    certDomains!: string[];\n\n    @TaskInput({\n        title: \"自动匹配\",\n        helper: \"是否根据证书自动匹配合适的DCDN域名进行部署\",\n        value: false,\n        component: {\n            name: \"a-switch\",\n            type: \"checked\"\n        },\n        required: true\n    })\n    autoMatch!: boolean;\n\n    @TaskInput({\n        title: \"Access授权\",\n        helper: \"火山引擎AccessKeyId、AccessKeySecret\",\n        component: {\n            name: \"access-selector\",\n            type: \"volcengine\"\n        },\n        required: true\n    })\n    accessId!: string;\n\n\n    @TaskInput(\n        createRemoteSelectInputDefine({\n            title: \"DCDN域名\",\n            helper: \"选择要部署证书的DCDN域名\",\n            action: VolcengineDeployToDCDN.prototype.onGetDomainList.name,\n            watches: [\"certDomains\", \"accessId\"],\n            required: true,\n            mergeScript: `\n             return {\n                show: ctx.compute(({form})=>{\n                  return !form.autoMatch\n                })\n             }\n            `\n        })\n    )\n    domainList!: string | string[];\n\n\n    async onInstance() {\n    }\n\n    async uploadCert(client: VolcengineClient) {\n        const certService = await client.getCertCenterService();\n        let certId = this.cert;\n        if (typeof certId !== \"string\") {\n            const certInfo = this.cert as CertInfo;\n            this.logger.info(`开始上传证书`);\n            certId = await certService.ImportCertificate({\n                certName: this.appendTimeSuffix(\"certd\"),\n                cert: certInfo\n            });\n            this.logger.info(`上传证书成功:${certId}`);\n        } else {\n            this.logger.info(`使用已有证书ID:${certId}`);\n        }\n        return certId\n    }\n\n\n    async execute(): Promise<void> {\n        this.logger.info(\"开始部署证书到火山引擎DCDN\");\n\n        const client = await this.getClient();\n        let certId = await this.uploadCert(client);\n\n        const service = await client.getDCDNService();\n\n        this.certDomains = new CertReader(this.cert).getAllDomains()\n\n\n        let domainList = this.domainList\n        if (!this.autoMatch) {\n            //手动根据域名部署\n            if (!this.domainList || this.domainList.length === 0) {\n                throw new Error(\"域名列表不能为空\");\n            }\n        } else {\n            //自动匹配\n            const options = await this.getDomainOptions(service);\n            const grouped = this.ctx.utils.options.groupByDomain(options, this.certDomains);\n\n            const matched = grouped.matched\n\n            domainList = matched.map(item => item.domain)\n\n            if (domainList.length === 0) {\n                this.logger.warn(\"没有匹配到域名，跳过部署\")\n                this.logger.info(\"当前证书域名：\", this.certDomains)\n                this.logger.info(\"当前DCDN域名：\", grouped.notMatched.map(item => item.domain))\n                return\n            }\n        }\n\n\n        //域名十个十个的分割\n        for (let i = 0; i < domainList.length; i += 10) {\n            const batch = domainList.slice(i, i + 10);\n            this.logger.info(`开始部署证书到域名:${batch}`);\n            const res = await service.request({\n                action: \"CreateCertBind\",\n                method: \"POST\",\n                body: {\n                    \"DomainNames\": batch,\n                    \"CertSource\": \"volc\",\n                    \"CertId\": certId\n                },\n                version: \"2021-04-01\"\n            });\n            this.logger.info(`部署证书到域名成功：`,JSON.stringify(res));\n        }\n\n        this.logger.info(\"部署完成\");\n\n    }\n\n\n    async getClient() {\n        const access = await this.getAccess<VolcengineAccess>(this.accessId);\n\n        return new VolcengineClient({\n            logger: this.logger,\n            access,\n            http: this.http\n        })\n    }\n\n    async onGetDomainList(data: any) {\n        if (!this.accessId) {\n            throw new Error(\"请选择Access授权\");\n        }\n\n        const client = await this.getClient();\n        const service = await client.getDCDNService();\n        const options = await this.getDomainOptions(service);\n        return this.ctx.utils.options.buildGroupOptions(options, this.certDomains);\n    }\n\n    private async getDomainOptions(service: any) {\n        const res = await service.request({\n            method: \"POST\",\n            action: \"DescribeUserDomains\",\n            body: {\n                \"PageSize\": 1000\n            }\n        })\n\n\n        const list = res.Result?.Domains;\n        if (!list || list.length === 0) {\n            throw new Error(\"找不到DCDN域名，您也可以手动输入域名\");\n        }\n        const options = list.map((item: any) => {\n            return {\n                value: item.Domain,\n                label: `${item.Domain}<${item.Scope}>`,\n                domain: item.Domain\n            };\n        });\n        return options;\n    }\n\n\n}\n\nnew VolcengineDeployToDCDN();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/plugins/plugin-deploy-to-live.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { VolcengineAccess } from \"../access.js\";\nimport { VolcengineClient } from \"../ve-client.js\";\n\n@IsTaskPlugin({\n  name: \"VolcengineDeployToLive\",\n  title: \"火山引擎-部署证书至Live\",\n  icon: \"svg:icon-volcengine\",\n  group: pluginGroups.volcengine.key,\n  desc: \"部署至火山引擎视频直播\",\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\nexport class VolcengineDeployToLive extends AbstractTaskPlugin {\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames]\n    },\n    required: true\n  })\n  cert!: CertInfo;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n\n  @TaskInput({\n    title: \"Access授权\",\n    helper: \"火山引擎AccessKeyId、AccessKeySecret\",\n    component: {\n      name: \"access-selector\",\n      type: \"volcengine\"\n    },\n    required: true\n  })\n  accessId!: string;\n\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"直播域名\",\n      helper: \"选择要部署证书的直播域名\",\n      action: VolcengineDeployToLive.prototype.onGetDomainList.name,\n      watches: [\"certDomains\", \"accessId\"],\n      required: true\n    })\n  )\n  domainList!: string | string[];\n\n\n  async onInstance() {\n  }\n\n  async execute(): Promise<void> {\n    this.logger.info(\"开始部署证书到火山引擎视频直播\");\n    const service = await this.getLiveService();\n    let certId = await this.uploadCert(service);\n\n\n    for (const item of this.domainList) {\n      this.logger.info(`开始部署直播域名${item}证书`);\n      await service.request({\n        action: \"BindCert\",\n        body: {\n          Domain: item,\n          HTTPS: true,\n          ChainID: certId\n        }\n      });\n      this.logger.info(`部署直播域名${item}证书成功`);\n    }\n\n    this.logger.info(\"部署完成\");\n  }\n\n\n  private async uploadCert(liveService: any) {\n    const res = await liveService.request({\n      action: \"CreateCert\",\n      body: {\n        Rsa: {\n          Pubkey: this.cert.crt,\n          Prikey: this.cert.key\n        },\n        UseWay: \"https\"\n      }\n    });\n\n    const certId = res.Result.ChainID;\n    this.logger.info(\"证书上传成功\", certId);\n    return certId;\n  }\n\n\n  private async getLiveService() {\n    const access = await this.getAccess<VolcengineAccess>(this.accessId);\n\n    const client = new VolcengineClient({\n      logger: this.logger,\n      access,\n      http: this.http\n    });\n\n    return await client.getLiveService();\n  }\n\n  async onGetDomainList(data: any) {\n    if (!this.accessId) {\n      throw new Error(\"请选择Access授权\");\n    }\n    const service = await this.getLiveService();\n\n    const res = await service.request({\n      action: \"ListDomainDetail\",\n      body: {\n        \"PageNum\": 1,\n        \"PageSize\": 100\n      }\n    });\n\n    const list = res.Result?.DomainList;\n    if (!list || list.length === 0) {\n      throw new Error(\"找不到直播域名，您也可以手动输入域名\");\n    }\n    const options = list.map((item: any) => {\n      return {\n        value: item.Domain,\n        label: `${item.Domain}<${item.Type}>`,\n        domain: item.Domain\n      };\n    });\n    return this.ctx.utils.options.buildGroupOptions(options, this.certDomains);\n  }\n}\n\nnew VolcengineDeployToLive();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/plugins/plugin-deploy-to-vod.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from \"@certd/pipeline\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { VolcengineAccess } from \"../access.js\";\nimport { VolcengineClient } from \"../ve-client.js\";\n\n@IsTaskPlugin({\n  name: \"VolcengineDeployToVOD\",\n  title: \"火山引擎-部署证书至VOD\",\n  icon: \"svg:icon-volcengine\",\n  group: pluginGroups.volcengine.key,\n  desc: \"部署至火山引擎视频点播(暂不可用)\",\n  deprecated:\"暂时缺少部署ssl接口\",\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\nexport class VolcengineDeployToVOD extends AbstractTaskPlugin {\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames, \"VolcengineUploadToCertCenter\"]\n    },\n    required: true\n  })\n  cert!: CertInfo | string;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n\n  @TaskInput({\n    title: \"Access授权\",\n    helper: \"火山引擎AccessKeyId、AccessKeySecret\",\n    component: {\n      name: \"access-selector\",\n      type: \"volcengine\"\n    },\n    required: true\n  })\n  accessId!: string;\n\n\n  @TaskInput(\n    // createRemoteSelectInputDefine({\n    //   title: \"空间名称\",\n    //   helper: \"选择要部署证书的监听器\\n需要在监听器中选择证书中心，进行跨服务访问授权\",\n    //   action: VolcengineDeployToVOD.prototype.onGetSpaceList.name,\n    //   watches: [\"certDomains\", \"accessId\", \"regionId\"],\n    //   required: true\n    // })\n    {\n      title: \"空间名称\",\n      required: true\n    }\n  )\n  spaceName!: string;\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"点播域名\",\n      helper: \"选择要部署证书的点播域名\\n需要先在域名管理页面进行证书中心访问授权（即点击去配置SSL证书）\",\n      action: VolcengineDeployToVOD.prototype.onGetDomainList.name,\n      watches: [\"certDomains\", \"accessId\", \"spaceName\"],\n      required: true\n    })\n  )\n  domainList!: string | string[];\n\n\n  async onInstance() {\n  }\n\n  async execute(): Promise<void> {\n    this.logger.info(\"开始部署证书到火山引擎VOD\");\n    const access = await this.getAccess<VolcengineAccess>(this.accessId);\n    let certId = await this.uploadOrGetCertId(access);\n\n    const service = await this.getVodService();\n    for (const item of this.domainList) {\n      this.logger.info(`开始部署点播域名${item}证书`);\n      await service.request({\n        action: \"ModifyListenerAttributes\",\n        query: {\n          ListenerId: item,\n          CertificateSource: \"cert_center\",\n          CertCenterCertificateId: certId\n        }\n      });\n      this.logger.info(`部署点播域名${item}证书成功`);\n    }\n\n    this.logger.info(\"部署完成\");\n  }\n\n\n  private async uploadOrGetCertId(access: VolcengineAccess) {\n    const certService = await this.getCertService(access);\n    let certId = this.cert;\n    if (typeof certId !== \"string\") {\n      const certInfo = this.cert as CertInfo;\n      this.logger.info(`开始上传证书`);\n      certId = await certService.ImportCertificate({\n        certName: this.appendTimeSuffix(\"certd\"),\n        cert: certInfo\n      });\n      this.logger.info(`上传证书成功:${certId}`);\n    } else {\n      this.logger.info(`使用已有证书ID:${certId}`);\n    }\n    return certId;\n  }\n\n  private async getCertService(access: VolcengineAccess) {\n    const client = new VolcengineClient({\n      logger: this.logger,\n      access,\n      http: this.http\n    });\n\n    return await client.getCertCenterService();\n  }\n\n\n  private async getVodService(req?: { version?: string }) {\n    const access = await this.getAccess<VolcengineAccess>(this.accessId);\n\n    const client = new VolcengineClient({\n      logger: this.logger,\n      access,\n      http: this.http\n    });\n\n    return await client.getVodService(req);\n  }\n\n  // async onGetSpaceList(data: any) {\n  //   if (!this.accessId) {\n  //     throw new Error(\"请选择Access授权\");\n  //   }\n  //   const service = await this.getVodService();\n  //\n  //   const res = await service.request({\n  //     action: \"ListSpace\",\n  //     method: \"GET\",\n  //     query: {\n  //       PageSize: 100,\n  //     },\n  //   });\n  //\n  //   const list = res.Result;\n  //   if (!list || list.length === 0) {\n  //     throw new Error(\"找不到空间，您可以手动填写\");\n  //   }\n  //   return list.map((item: any) => {\n  //     return {\n  //       value: item.SpaceName,\n  //       label: `${item.SpaceName}`\n  //     };\n  //   });\n  // }\n\n  async onGetDomainList(data: any) {\n    if (!this.accessId) {\n      throw new Error(\"请选择Access授权\");\n    }\n    const service = await this.getVodService();\n\n    const res = await service.request({\n      action: \"ListDomain\",\n      body: {\n        SpaceName: this.spaceName,\n        Offset: 100\n      }\n    });\n\n    const instances = res.Result?.PlayInstanceInfo?.ByteInstances;\n    if (!instances || instances.length === 0) {\n      throw new Error(\"找不到点播域名，您也可以手动输入点播域名\");\n    }\n    const list = []\n    for (const item of instances) {\n      for (const domain of item.Domains) {\n        list.push({\n          value: item.Domain,\n          label: item.Domain,\n          domain: domain.Domain\n        });\n      }\n    }\n    return this.ctx.utils.options.buildGroupOptions(list, this.certDomains);\n  }\n}\n\nnew VolcengineDeployToVOD();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/plugins/plugin-upload-to-cert-center.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from \"@certd/pipeline\";\nimport { createCertDomainGetterInputDefine } from \"@certd/plugin-lib\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { VolcengineAccess } from \"../access.js\";\nimport { VolcengineClient } from \"../ve-client.js\";\n\n@IsTaskPlugin({\n  name: 'VolcengineUploadToCertCenter',\n  title: '火山引擎-上传证书至证书中心',\n  icon: 'svg:icon-volcengine',\n  group: pluginGroups.volcengine.key,\n  desc: '上传证书至火山引擎证书中心',\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class VolcengineUploadToCertCenter extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n\n  @TaskInput({\n    title: 'Access授权',\n    helper: '火山引擎AccessKeyId、AccessKeySecret',\n    component: {\n      name: 'access-selector',\n      type: 'volcengine',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n\n  @TaskOutput({\n    title: '上传成功后的火山引擎证书Id',\n  })\n  volcengineCertId?: string;\n\n  async onInstance() {}\n  async execute(): Promise<void> {\n    this.logger.info('开始上传证书到证书中心');\n    const access = await this.getAccess<VolcengineAccess>(this.accessId);\n\n    const client = await this.getClient(access)\n    const service = await client.getCertCenterService()\n    const certInfo = this.cert\n    this.logger.info(`开始上传证书`)\n    this.volcengineCertId = await service.ImportCertificate({\n      certName: this.appendTimeSuffix('certd'),\n      cert: certInfo\n    })\n    this.logger.info(`上传完成：${this.volcengineCertId}`);\n  }\n\n\n  async getClient(access: VolcengineAccess) {\n    return   new VolcengineClient({\n      logger: this.logger,\n      access,\n      http:this.http\n    })\n  }\n}\nnew VolcengineUploadToCertCenter();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/ve-client.ts",
    "content": "import { VolcengineAccess } from \"./access.js\";\nimport { HttpClient, ILogger } from \"@certd/basic\";\n\nexport type VolcengineOpts = {\n  access: VolcengineAccess\n  logger: ILogger\n  http: HttpClient\n}\n\nexport class VolcengineClient {\n  opts: VolcengineOpts;\n  CommonService: any;\n\n  constructor(opts: VolcengineOpts) {\n    this.opts = opts;\n  }\n\n  async getCertCenterService() {\n    const CommonService = await this.getServiceCls();\n\n    const service = new CommonService({\n      serviceName: \"certificate_service\",\n      defaultVersion: \"2024-10-01\"\n    });\n    service.setAccessKeyId(this.opts.access.accessKeyId);\n    service.setSecretKey(this.opts.access.secretAccessKey);\n    service.setRegion(\"cn-beijing\");\n\n    service.ImportCertificate = async (body: { certName: string, cert: any }) => {\n      const { certName, cert } = body;\n      const res = await service.request({\n        action: \"ImportCertificate\",\n        method: \"POST\",\n        body: {\n          Tag: certName,\n          Repeatable: false,\n          CertificateInfo: {\n            CertificateChain: cert.crt,\n            PrivateKey: cert.key\n          }\n        }\n      });\n      return res.Result.InstanceId || res.Result.RepeatId;\n    };\n    return service;\n  }\n\n  async getClbService(opts: { region?: string }) {\n    const CommonService = await this.getServiceCls();\n\n    const service = new CommonService({\n      serviceName: \"clb\",\n      defaultVersion: \"2020-04-01\"\n    });\n    service.setAccessKeyId(this.opts.access.accessKeyId);\n    service.setSecretKey(this.opts.access.secretAccessKey);\n    service.setRegion(opts.region);\n\n    return service;\n  }\n\n  async getLiveService() {\n    const CommonService = await this.getServiceCls();\n\n    const service = new CommonService({\n      serviceName: \"live\",\n      defaultVersion: \"2023-01-01\"\n    });\n    service.setAccessKeyId(this.opts.access.accessKeyId);\n    service.setSecretKey(this.opts.access.secretAccessKey);\n    service.setRegion(\"cn-north-1\");\n\n    return service;\n  }\n\n  async getVodService(opts?: { version?: string }) {\n    const CommonService = await this.getServiceCls();\n\n    const service = new CommonService({\n      serviceName: \"vod\",\n      defaultVersion: opts?.version || \"2021-01-01\"\n    });\n    service.setAccessKeyId(this.opts.access.accessKeyId);\n    service.setSecretKey(this.opts.access.secretAccessKey);\n\n    return service;\n  }\n\n  async getAlbService(opts: { region?: string }) {\n    const CommonService = await this.getServiceCls();\n\n    const service = new CommonService({\n      serviceName: \"alb\",\n      defaultVersion: \"2020-04-01\"\n    });\n    service.setAccessKeyId(this.opts.access.accessKeyId);\n    service.setSecretKey(this.opts.access.secretAccessKey);\n    service.setRegion(opts.region);\n\n    return service;\n  }\n\n  async getDCDNService( opts?: {  }) {\n    const CommonService = await this.getServiceCls();\n\n    const service = new CommonService({\n      serviceName: \"dcdn\",\n      defaultVersion: \"2023-01-01\"\n    });\n    service.setAccessKeyId(this.opts.access.accessKeyId);\n    service.setSecretKey(this.opts.access.secretAccessKey);\n    service.setRegion(\"cn-north-1\");\n    return service;\n  }\n\n  async getServiceCls() {\n    if (this.CommonService) {\n      return this.CommonService;\n    }\n    const { Service } = await import(\"@volcengine/openapi\");\n\n    class CommonService extends Service {\n      Generic: any;\n\n      constructor(options: {\n        serviceName: string;\n        defaultVersion: string;\n      }) {\n        super(Object.assign({ host: \"open.volcengineapi.com\" }, options));\n        this.Generic = async (req: { action: string, body?: any, method?: string, query?: any ,version?:string}) => {\n          const { action, method, body, query,version } = req;\n          return await this.fetchOpenAPI({\n            Action: action,\n            Version: version||options.defaultVersion,\n            method: method as any,\n            headers: {\n              \"content-type\": \"application/json\"\n            },\n            query: query || {},\n            data: body\n          });\n        };\n      }\n\n      async request(req: { action: string, body?: any, method?: string, query?: any,version?:string }) {\n        const res = await this.Generic(req);\n        if (res ===\"Not Found\"){\n          throw new Error(`${res} (检查method)`);\n        }\n        if (res.errorcode) {\n          throw new Error(`${res.errorcode}:${res.message}`);\n        }\n        if (res.ResponseMetadata?.Error) {\n          throw new Error(res.ResponseMetadata?.Error?.Message);\n        }\n        return res;\n      }\n    }\n\n    this.CommonService = CommonService;\n    return CommonService;\n  }\n\n\n\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-volcengine/volcengine-dns-provider.ts",
    "content": "import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from \"@certd/plugin-cert\";\n\nimport { VolcengineDnsClient } from \"./dns-client.js\";\nimport { VolcengineAccess } from \"./access.js\";\n\n@IsDnsProvider({\n  name: \"volcengine\",\n  title: \"火山引擎\",\n  desc: \"火山引擎DNS解析提供商\",\n  accessType: \"volcengine\",\n  icon: \"svg:icon-volcengine\"\n})\nexport class VolcengineDnsProvider extends AbstractDnsProvider {\n  client: VolcengineDnsClient;\n  access!: VolcengineAccess;\n\n\n  async onInstance() {\n    this.access = this.ctx.access as VolcengineAccess\n    this.client = new VolcengineDnsClient({\n      access: this.access,\n      logger: this.logger,\n      http: this.http\n    });\n  }\n\n  /**\n   * @param domain\n   */\n  async getDomain(domain: string) {\n    const res = await this.client.findDomain(domain)\n\n    if (res.Result.Zones && res.Result.Zones.length > 0) {\n      return res.Result.Zones[0];\n    }\n    throw new Error(`域名${domain}不存在`);\n  }\n\n\n  async createRecord(options: CreateRecordOptions): Promise<any> {\n    const { fullRecord, hostRecord, value, type, domain } = options;\n    this.logger.info(\"添加域名解析：\", fullRecord, value, domain);\n\n    const domainInfo = await this.getDomain(domain);\n    const ZID = domainInfo.ZID;\n\n    const body = {\n      ZID,\n      \"Host\": hostRecord,\n      \"Type\": type,\n      \"Value\": value\n    };\n\n    const res = await this.client.doRequest({\n      method: \"POST\",\n      service: \"dns\",\n      region: \"cn-beijing\",\n      query: {\n        Action: \"CreateRecord\",\n        Version: \"2018-08-01\"\n      },\n      body\n    });\n\n    return {\n      RecordID: res.Result.RecordID,\n      ZID: ZID\n    };\n  }\n\n\n  async removeRecord(options: RemoveRecordOptions<any>): Promise<any> {\n    const record = options.recordRes;\n\n    const body = {\n      RecordID: record.RecordID\n    };\n\n    await this.client.doRequest({\n      method: \"POST\",\n      service: \"dns\",\n      region: \"cn-beijing\",\n      query: {\n        Action: \"DeleteRecord\",\n        Version: \"2018-08-01\"\n      },\n      body\n    });\n  }\n}\n\nnew VolcengineDnsProvider();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-wangsu/access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from \"@certd/pipeline\";\nimport { HttpRequestConfig } from \"@certd/basic\";\nimport { CertInfo } from \"@certd/plugin-cert\";\n\n\n\n/**\n */\n@IsAccess({\n  name: \"wangsu\",\n  title: \"网宿授权\",\n  desc: \"\",\n  icon: \"svg:icon-lucky\"\n})\nexport class WangsuAccess extends BaseAccess {\n\n  @AccessInput({\n    title: \"accessKeyId\",\n    component: {\n      placeholder: \"accessKeyId\",\n      component: {\n        name: \"a-input\",\n        vModel: \"value\"\n      }\n    },\n    helper: \"[点击前往获取AccessKey](https://console.wangsu.com/account/accessKey?rsr=ws)\",\n    encrypt: false,\n    required: true\n  })\n  accessKeyId!: string;\n\n  @AccessInput({\n    title: \"accessKeySecret\",\n    component: {\n      placeholder: \"accessKeySecret\",\n      component: {\n        name: \"a-input\",\n        vModel: \"value\"\n      }\n    },\n    encrypt: true,\n    required: true\n  })\n  accessKeySecret!: string;\n\n\n  @AccessInput({\n    title: \"测试\",\n    component: {\n      name: \"api-test\",\n      action: \"TestRequest\"\n    },\n    helper: \"点击测试接口是否正常\"\n  })\n  testRequest = true;\n\n  async onTestRequest() {\n    await this.getCertList({  });\n    return \"ok\";\n  }\n\n  async getCertList(req: { }) {\n    /**\n     * certificate-id\n     * name\n     * dns-names\n     */\n    const res = await this.doRequest({\n      url: \"/api/ssl/certificate\",\n      method: \"GET\",\n    });\n\n    return res[\"ssl-certificate\"]\n  }\n\n  async getCertInfo(req:{certId:string}){\n    return await this.doRequest({\n      url: `/api/certificate/${req.certId}`,\n      method:\"GET\",\n    });\n  }\n\n  async updateCert(req: {\n    certId: string,\n    cert: CertInfo,\n  }) {\n\n    const certInfo=  await this.getCertInfo({certId:req.certId});\n\n    const name = certInfo.name;\n    const {cert,certId} = req;\n    return await this.doRequest({\n      url: `/api/certificate/${certId}`,\n      method:\"PUT\",\n      data: {\n        /**\n         * name: string;\n         *   certificate?: string;\n         *   privateKey?: string;\n         *   autoRenew?: string;\n         *   isNeedAlarm?: string;\n         *   csrId?: number;\n         *   comment?: string;\n         */\n        name:name,\n        certificate: cert.crt,\n        privateKey: cert.key,\n        autoRenew:\"false\",\n        isNeedAlarm:\"false\",\n        comment: \"certd\"\n      }\n    });\n  }\n\n\n\n\n  async doRequest(req: HttpRequestConfig) {\n\n    const data: any = req.data;\n\n    const {AkSkConfig,AkSkAuth} = await import(\"./lib/index.js\");\n\n    const akskConfig = new AkSkConfig();\n    akskConfig.accessKey = this.accessKeyId;\n    akskConfig.secretKey = this.accessKeySecret;\n    akskConfig.endPoint = \"open.chinanetcenter.com\";\n    akskConfig.uri = req.url;\n    akskConfig.method = req.method;\n\n    const requestMsg = AkSkAuth.transferHttpRequestMsg(akskConfig,data?JSON.stringify(data):\"\");\n    AkSkAuth.getAuthAndSetHeaders(requestMsg, akskConfig.accessKey, akskConfig.secretKey);\n\n    let response = undefined\n    try{\n       response = await this.ctx.http.request({\n        method: requestMsg.method,\n        url: requestMsg.url,\n        headers: requestMsg.headers,\n        data: requestMsg.body\n      });\n    }catch (e) {\n      if (e.response?.data?.result) {\n        throw new Error(e.response?.data?.result);\n      }\n      throw e;\n    }\n\n    if (response.code != null && response.code != 0){\n      throw new Error(response.message);\n    }\n    if (response.data != null && response.code!==null){\n      return response.data;\n    }\n    return response;\n\n  }\n}\n\n\nnew WangsuAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-wangsu/index.ts",
    "content": "export * from \"./plugins/index.js\";\nexport * from \"./access.js\";\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-wangsu/lib/auth/AkSkAuth.ts",
    "content": "import { HttpRequestMsg } from \"../model/HttpRequestMsg.js\";\nimport { AkSkConfig } from \"../model/AkSkConfig.js\";\nimport { CryptoUtils } from \"../util/CryptoUtils.js\";\nimport { HttpUtils } from \"../util/HttpUtils.js\";\nimport { Constant } from \"../common/Constant.js\";\n\nexport class AkSkAuth {\n\n    public static invoke(akSkConfig: AkSkConfig, jsonBody: string): Promise<string | null> {\n        const requestMsg = AkSkAuth.transferHttpRequestMsg(akSkConfig, jsonBody);\n        AkSkAuth.getAuthAndSetHeaders(requestMsg, akSkConfig.accessKey, akSkConfig.secretKey);\n        return HttpUtils.call(requestMsg);\n    }\n\n    static transferHttpRequestMsg(akSkConfig: AkSkConfig, jsonBody: string): HttpRequestMsg {\n        const requestMsg = new HttpRequestMsg();\n        requestMsg.uri = akSkConfig.uri;\n        if (akSkConfig.endPoint && akSkConfig.endPoint !== Constant.END_POINT) {\n            requestMsg.host = akSkConfig.endPoint;\n            requestMsg.url = `${Constant.HTTPS_REQUEST_PREFIX}${akSkConfig.endPoint}${requestMsg.uri}`;\n        } else {\n            requestMsg.host = Constant.HTTP_DOMAIN;\n            requestMsg.url = `${Constant.HTTP_REQUEST_PREFIX}${requestMsg.uri}`;\n        }\n        requestMsg.method = akSkConfig.method;\n        requestMsg.signedHeaders = AkSkAuth.getSignedHeaders(akSkConfig.signedHeaders);\n        if (['POST', 'PUT', 'PATCH', 'DELETE'].indexOf(akSkConfig.method) !== -1) {\n            requestMsg.body = jsonBody;\n        }\n        return requestMsg;\n    }\n\n    static getAuthAndSetHeaders(requestMsg: HttpRequestMsg, accessKey: string, secretKey: string): void {\n        const timeStamp = (Date.now() / 1000 | 0).toString();\n        requestMsg.headers['Host'] = requestMsg.host;\n        requestMsg.headers[Constant.HEAD_SIGN_ACCESS_KEY] = accessKey;\n        requestMsg.headers[Constant.HEAD_SIGN_TIMESTAMP] = timeStamp;\n\t\trequestMsg.headers[\"Accept\"] = Constant.APPLICATION_JSON;\n        const signature = AkSkAuth.getSignature(requestMsg, secretKey, timeStamp);\n        requestMsg.headers['Authorization'] = AkSkAuth.genAuthorization(accessKey, AkSkAuth.getSignedHeaders(requestMsg.signedHeaders), signature);\n    }\n\n    private static genAuthorization(accessKey: string, signedHeaders: string, signature: string): string {\n        return `${Constant.HEAD_SIGN_ALGORITHM} Credential=${accessKey}, SignedHeaders=${signedHeaders}, Signature=${signature}`;\n    }\n\n    private static getSignature(requestMsg: HttpRequestMsg, secretKey: string, timestamp: string): string {\n        let bodyStr = requestMsg.body || \"\";\n        const hashedRequestPayload = CryptoUtils.sha256Hex(bodyStr);\n        const canonicalRequest = `${requestMsg.method}\\n${requestMsg.uri.split(\"?\")[0]}\\n${decodeURIComponent(requestMsg.getQueryString())}\\n${AkSkAuth.getCanonicalHeaders(requestMsg.headers, AkSkAuth.getSignedHeaders(requestMsg.signedHeaders))}\\n${AkSkAuth.getSignedHeaders(requestMsg.signedHeaders)}\\n${hashedRequestPayload}`;\n        const stringToSign = `${Constant.HEAD_SIGN_ALGORITHM}\\n${timestamp}\\n${CryptoUtils.sha256Hex(canonicalRequest)}`;\n        return CryptoUtils.hmac256(secretKey, stringToSign).toLowerCase();\n    }\n\n    private static getCanonicalHeaders(headers: Record<string, string>, signedHeaders: string): string {\n        const headerNames = signedHeaders.split(\";\");\n        let canonicalHeaders = \"\";\n        for (const headerName of headerNames) {\n            const headerValue = AkSkAuth.getValueByHeader(headerName, headers);\n            if (headerValue !== null) {\n                canonicalHeaders += `${headerName}:${headerValue.toLowerCase()}\\n`;\n            } else {\n                // Handle missing headers if necessary, e.g., log a warning or skip\n                console.warn(`Header ${headerName} not found in provided headers.`);\n            }\n        }\n        return canonicalHeaders;\n    }\n\n\n    private static getSignedHeaders(signedHeaders: string): string {\n        if (!signedHeaders) {\n            return \"content-type;host\";\n        }\n        const headers = signedHeaders.split(\";\");\n        return headers.map(header => header.toLowerCase()).sort().join(\";\");\n    }\n\n    private static getValueByHeader(name: string, customHeaderMap: { [key: string]: string }): string | null {\n        for (const key in customHeaderMap) {\n            if (key.toLowerCase() === name.toLowerCase()) {\n                return customHeaderMap[key];\n            }\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-wangsu/lib/common/Constant.ts",
    "content": "export class Constant {\n    private constructor() {}\n\n    public static readonly HTTP_REQUEST_PREFIX: string = \"https://open.chinanetcenter.com\";\n    public static readonly HTTPS_REQUEST_PREFIX: string = \"https://\";\n    public static readonly HTTP_DOMAIN: string = \"open.chinanetcenter.com\";\n\n    public static readonly APPLICATION_JSON: string = \"application/json\";\n\n    public static readonly HEAD_SIGN_ACCESS_KEY: string = \"x-cnc-accessKey\";\n    public static readonly HEAD_SIGN_TIMESTAMP: string = \"x-cnc-timestamp\";\n    public static readonly HEAD_SIGN_ALGORITHM: string = \"CNC-HMAC-SHA256\";\n\n    public static readonly X_CNC_AUTH_METHOD: string = \"x-cnc-auth-method\";\n\n    public static readonly AUTH_METHOD: string = \"AKSK\";\n\n    public static readonly END_POINT: string = \"{endPoint}\";\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-wangsu/lib/exception/ApiAuthException.ts",
    "content": "export class ApiAuthException extends Error {\n    public cause?: any;\n\n    constructor(message: string, cause?: any) {\n        super(message);\n        this.cause = cause;\n        this.name = 'ApiAuthException';\n    }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-wangsu/lib/index.ts",
    "content": "import { AkSkConfig } from \"./model/AkSkConfig.js\";\nimport { AkSkAuth } from \"./auth/AkSkAuth.js\";\n\nexport { AkSkAuth, AkSkConfig}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-wangsu/lib/model/AkSkConfig.ts",
    "content": "export class AkSkConfig {\n    private _accessKey: string | undefined;\n    private _secretKey: string | undefined;\n    private _uri: string | undefined;\n    private _endPoint: string | undefined;\n    private _method: string | undefined;\n    private _signedHeaders: string | undefined;\n\n    public get accessKey(): string {\n        return this._accessKey;\n    }\n\n    public set accessKey(value: string) {\n        this._accessKey = value;\n    }\n\n    public get secretKey(): string {\n        return this._secretKey;\n    }\n\n    public set secretKey(value: string) {\n        this._secretKey = value;\n    }\n\n    public get uri(): string {\n        return this._uri;\n    }\n\n    public set uri(value: string) {\n        this._uri = value;\n    }\n\n    public get endPoint(): string {\n        return this._endPoint;\n    }\n\n    public set endPoint(value: string) {\n        this._endPoint = value;\n    }\n\n    public get method(): string {\n        return this._method;\n    }\n\n    public set method(value: string) {\n        this._method = value;\n    }\n\n    public get signedHeaders(): string {\n        return this._signedHeaders;\n    }\n\n    public set signedHeaders(value: string) {\n        this._signedHeaders = value;\n    }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-wangsu/lib/model/HttpRequestMsg.ts",
    "content": "import { Constant } from '../common/Constant.js'; // Assuming you have a TypeScript version of this\n\nexport class HttpRequestMsg {\n    uri: string ;\n    url: string;\n    host: string;\n    method: string;\n    protocol: string;\n    params: Record<string, string>;\n    headers: Record<string, string>;\n    body: string;\n    signedHeaders: string;\n    msg: any;\n\n    constructor() {\n        this.params = {};\n        this.headers = {};\n        this.putHeader('Content-Type', Constant.APPLICATION_JSON);\n        this.putHeader(Constant.X_CNC_AUTH_METHOD, Constant.AUTH_METHOD);\n    }\n\n    putParam(name: string, value: string): void {\n        this.params[name] = value;\n    }\n\n    getParam(name: string): string | null {\n        const value = this.params[name];\n        return value && value.trim() !== '' ? value : null;\n    }\n\n    getQueryString(): string {\n        if(this.uri == undefined)\n         return \"\";\n        const index = this.uri.indexOf(\"?\");\n        if (this.method === 'POST' || index === -1) {\n            return \"\";\n        }\n        return this.uri.substring(index + 1);\n    }\n\n    putHeader(name: string, value: string): void {\n        this.headers[name] = value;\n    }\n\n    getHeader(name: string): string | null {\n        for (const key in this.headers) {\n            if (key.toLowerCase() === name.toLowerCase()) {\n                return this.headers[key];\n            }\n        }\n        return null;\n    }\n\n    getHeaderByNames(...names: string[]): string | null {\n        for (const name of names) {\n            const value = this.getHeader(name);\n            if (value) {\n                return value;\n            }\n        }\n        return null;\n    }\n\n    removeHeader(name: string): void {\n        for (const key in this.headers) {\n            if (key.toLowerCase() === name.toLowerCase()) {\n                delete this.headers[key];\n            }\n        }\n    }\n\n    setJsonBody(object: any): void {\n        this.body = JSON.stringify(object);\n    }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-wangsu/lib/util/CryptoUtils.ts",
    "content": "import CryptoJS from 'crypto-js';\n\nexport class CryptoUtils {\n    private constructor() {}\n\n    /**\n     * hmac+sha256+hex\n     */\n    public static sha256Hex(s: string): string {\n        const hash = CryptoJS.SHA256(s);\n        return hash.toString(CryptoJS.enc.Hex).toLowerCase();\n    }\n\n    /**\n     * hmac+sha256\n     */\n    public static hmac256(secretKey: string, message: string): string {\n        const keyWordArray = CryptoJS.enc.Utf8.parse(secretKey);\n        const messageWordArray = CryptoJS.enc.Utf8.parse(message);\n        const hash = CryptoJS.HmacSHA256(messageWordArray, keyWordArray);\n        return hash.toString(CryptoJS.enc.Hex).toLowerCase();\n    }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-wangsu/lib/util/HttpUtils.ts",
    "content": "import { HttpRequestMsg } from '../model/HttpRequestMsg.js'; // Assuming you have a TypeScript version of this\nimport { ApiAuthException } from '../exception/ApiAuthException.js'; // Assuming you have a TypeScript version of this\nimport axios, { AxiosError } from 'axios';\n\nexport class HttpUtils {\n    private constructor() { }\n    public static async call(requestMsg: HttpRequestMsg): Promise<string | null> {\n        var response;\n        try {\n            response = await axios({\n                method: requestMsg.method,\n                url: requestMsg.url,\n                headers: requestMsg.headers,\n                data: requestMsg.body\n            });\n            console.info(\"API invoke success. Response:\", response.data);\n            return response.data;\n        } catch (error) {\n            if (error instanceof AxiosError) {\n                // Handle AxiosError specifically\n                console.error('API invoke failed. Response:', error.response.data);\n                return error.response.data;\n            } else {\n                // Handle other types of errors\n                console.error('API invoke failed.', error);\n            }\n            throw new ApiAuthException('API invoke failed.');\n        }\n    }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-wangsu/plugins/index.ts",
    "content": "export * from \"./plugin-refresh-cert.js\";\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-wangsu/plugins/plugin-refresh-cert.ts",
    "content": "import {\n  AbstractTaskPlugin,\n  IsTaskPlugin,\n  PageSearch,\n  pluginGroups,\n  RunStrategy,\n  TaskInput\n} from \"@certd/pipeline\";\nimport { CertApplyPluginNames, CertInfo } from \"@certd/plugin-cert\";\nimport { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from \"@certd/plugin-lib\";\nimport { WangsuAccess } from \"../access.js\";\n\n@IsTaskPlugin({\n  //命名规范，插件类型+功能（就是目录plugin-demo中的demo），大写字母开头，驼峰命名\n  name: \"WangsuRefreshCert\",\n  title: \"网宿-更新证书\",\n  desc: \"网宿证书自动更新\",\n  icon: \"svg:icon-lucky\",\n  //插件分组\n  group: pluginGroups.cdn.key,\n  needPlus: false,\n  default: {\n    //默认值配置照抄即可\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed\n    }\n  }\n})\n//类名规范，跟上面插件名称（name）一致\nexport class WangsuRefreshCert extends AbstractTaskPlugin {\n  //证书选择，此项必须要有\n  @TaskInput({\n    title: \"域名证书\",\n    helper: \"请选择前置任务输出的域名证书\",\n    component: {\n      name: \"output-selector\",\n      from: [...CertApplyPluginNames]\n    }\n    // required: true, // 必填\n  })\n  cert!: CertInfo;\n\n  @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))\n  certDomains!: string[];\n\n  //授权选择框\n  @TaskInput({\n    title: \"网宿授权\",\n    component: {\n      name: \"access-selector\",\n      type: \"wangsu\" //固定授权类型\n    },\n    required: true //必填\n  })\n  accessId!: string;\n  //\n\n  @TaskInput(\n    createRemoteSelectInputDefine({\n      title: \"证书Id\",\n      helper: \"要更新的网宿证书id\",\n      action: WangsuRefreshCert.prototype.onGetCertList.name,\n      pager: false,\n      search: false\n    })\n  )\n  certList!: string[];\n\n  //插件实例化时执行的方法\n  async onInstance() {\n  }\n\n  //插件执行方法\n  async execute(): Promise<void> {\n    const access = await this.getAccess<WangsuAccess>(this.accessId);\n\n    for (const item of this.certList) {\n      this.logger.info(`----------- 开始更新证书：${item}`);\n      await access.updateCert({\n        certId: item,\n        cert: this.cert\n      });\n      this.logger.info(`----------- 更新证书${item}成功`);\n    }\n\n    this.logger.info(\"部署完成\");\n  }\n\n  async onGetCertList(data: PageSearch = {}) {\n    const access = await this.getAccess<WangsuAccess>(this.accessId);\n\n    const list = await access.getCertList({});\n    if (!list || list.length === 0) {\n      throw new Error(\"没有找到证书，请先在控制台上传一次证书且关联域名\");\n    }\n\n    /**\n     * certificate-id\n     * name\n     * dns-names\n     */\n    const options = list.map((item: any) => {\n      const domains = item[\"dns-names\"]\n      const certId = item[\"certificate-id\"];\n      return {\n        label: `${item.name}<${certId}-${domains[0]}>`,\n        value: certId,\n        domain: item[\"dns-names\"]\n      };\n    });\n    return {\n      list: this.ctx.utils.options.buildGroupOptions(options, this.certDomains),\n      total: list.length,\n      pageNo: 1,\n      pageSize: list.length\n    };\n  }\n}\n\n//实例化一下，注册插件\nnew WangsuRefreshCert();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-west/access.ts",
    "content": "import { IsAccess, AccessInput, BaseAccess } from '@certd/pipeline';\n\n/**\n * 这个注解将注册一个授权配置\n * 在certd的后台管理系统中，用户可以选择添加此类型的授权\n */\n@IsAccess({\n  name: 'west',\n  title: '西部数码授权',\n  desc: '',\n  icon: 'tabler:map-west',\n})\nexport class WestAccess extends BaseAccess {\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    title: '权限范围',\n    component: {\n      name: 'a-select',\n      vModel: 'value',\n      options: [\n        { value: 'account', label: '账户级别，对所有域名都有权限管理' },\n        { value: 'domain', label: '域名级别，仅能管理单个域名' },\n      ],\n    },\n    helper: '选择权限范围',\n    required: true,\n  })\n  scope = '';\n\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    title: '账号',\n    helper: '你的登录账号',\n    encrypt: false,\n    required: false,\n    mergeScript: `\n    return {\n      show:ctx.compute(({form})=>{\n        return form.access.scope === 'account'\n      })\n    }\n    `,\n  })\n  username = '';\n\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    title: 'ApiKey',\n    component: {\n      placeholder: '账户级别的key，对整个账户都有管理权限',\n    },\n    helper: '账户级别的key，对整个账户都有管理权限\\n前往https://www.west.cn/manager/API/APIconfig.asp，手动设置“api连接密码”',\n    encrypt: true,\n    required: false,\n    mergeScript: `\n    return {\n      show:ctx.compute(({form})=>{\n        return form.access.scope === 'account'\n      })\n    }\n    `,\n  })\n  apikey = '';\n\n  /**\n   * 授权属性配置\n   */\n  @AccessInput({\n    title: 'apidomainkey',\n    component: {\n      placeholder: '域名级别的key，仅对单个域名有权限',\n    },\n    helper: '域名级别的key，仅对单个域名有权限。 \\n前往[西部数据域名管理](https://www.west.cn/manager/domain/)，点击域名，右上方点击ApiKey获取密钥',\n    encrypt: true,\n    required: false,\n    mergeScript: `\n    return {\n      show:ctx.compute(({form})=>{\n        return form.access.scope === 'domain'\n      })\n    }\n    `,\n  })\n  apidomainkey = '';\n}\n\nnew WestAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-west/dns-provider.ts",
    "content": "import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert';\n\nimport { WestAccess } from './access.js';\n\ntype westRecord = {\n  // 这里定义Record记录的数据结构，跟对应云平台接口返回值一样即可，一般是拿到id就行，用于删除txt解析记录，清理申请痕迹\n  code: number;\n  msg: string;\n  body: {\n    record_id: number;\n  };\n};\n\n// 这里通过IsDnsProvider注册一个dnsProvider\n@IsDnsProvider({\n  name: 'west',\n  title: '西部数码',\n  desc: 'west dns provider',\n  icon: 'svg:icon-xibushuma',\n  // 这里是对应的云平台的access类型名称\n  accessType: 'west',\n})\nexport class WestDnsProvider extends AbstractDnsProvider<westRecord> {\n  access!: WestAccess;\n\n  async onInstance() {\n    this.access = this.ctx.access as WestAccess\n    // 也可以通过ctx成员变量传递context\n    this.logger.debug('access:', this.access);\n    //初始化的操作\n    //...\n  }\n\n  private async doRequestApi(url: string, data: any = null, method = 'post') {\n    if (this.access.scope === 'account') {\n      data.apikey = this.ctx.utils.hash.md5(this.access.apikey);\n      data.username = this.access.username;\n    } else {\n      data.apidomainkey = this.access.apidomainkey;\n    }\n    const res = await this.ctx.http.request<any, any>({\n      url,\n      method,\n      data,\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n      },\n    });\n    if (res.msg !== 'success') {\n      throw new Error(`${JSON.stringify(res.msg)}`);\n    }\n    return res;\n  }\n\n  /**\n   * 创建dns解析记录，用于验证域名所有权\n   */\n  async createRecord(options: CreateRecordOptions): Promise<any> {\n    /**\n     * options 参数说明\n     * fullRecord: '_acme-challenge.example.com',\n     * value: 一串uuid\n     * type: 'TXT',\n     * domain: 'example.com'\n     */\n    const { fullRecord, value, type, domain } = options;\n    this.logger.info('添加域名解析：', fullRecord, value, type, domain);\n\n    // 准备要发送到API的请求体\n    const requestBody = {\n      act: 'dnsrec.add', // API动作类型\n      domain: domain, // 域名\n      record_type: 'TXT', // DNS记录类型\n      hostname: fullRecord, // 完整的记录名\n      record_value: value, // 记录的值\n      record_line: '', // 记录线路\n      record_ttl: 60, // TTL (生存时间)，设置为60秒\n    };\n\n    const url = 'https://api.west.cn/API/v2/domain/dns/';\n    const res = await this.doRequestApi(url, requestBody);\n    const record = res as westRecord;\n    this.logger.info(`添加域名解析成功:fullRecord=${fullRecord},value=${value}`);\n    this.logger.info(`dns解析记录:${JSON.stringify(record)}`);\n    // 西部数码生效较慢 增加90秒等待 提高成功率\n    this.logger.info('等待解析生效:wait 90s');\n    await new Promise(resolve => setTimeout(resolve, 90000));\n    return record;\n  }\n\n  /**\n   *  删除dns解析记录,清理申请痕迹\n   * @param options\n   */\n  async removeRecord(options: RemoveRecordOptions<westRecord>): Promise<void> {\n    const { fullRecord, value, domain } = options.recordReq;\n    const record = options.recordRes;\n    this.logger.info('删除域名解析：', fullRecord, value, record);\n    if (!record) {\n      this.logger.info('record不存在');\n      return;\n    }\n    //这里调用删除txt dns解析记录接口\n\n    // 准备要发送到API的请求体\n    const requestBody = {\n      act: 'dnsrec.remove', // API动作类型\n      domain: domain, // 域名\n      record_id: record.body.record_id,\n      hostname: fullRecord, // 完整的记录名\n      record_type: 'TXT', // DNS记录类型\n      record_line: '', // 记录线路\n    };\n\n    const url = 'https://api.west.cn/API/v2/domain/dns/';\n    const res = await this.doRequestApi(url, requestBody);\n    const result = res.result;\n    this.logger.info('删除域名解析成功:', fullRecord, value, JSON.stringify(result));\n  }\n}\n\n//TODO 实例化这个provider，将其自动注册到系统中\nnew WestDnsProvider();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-west/index.ts",
    "content": "export * from './dns-provider.js';\nexport * from './access.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-woai/access.ts",
    "content": "import { AccessInput, BaseAccess, IsAccess } from '@certd/pipeline';\n\n@IsAccess({\n  name: 'woai',\n  title: '我爱云授权',\n  desc: '我爱云CDN',\n  icon: 'clarity:plugin-line',\n})\nexport class WoaiAccess extends BaseAccess {\n  @AccessInput({\n    title: '账号',\n    component: {\n      placeholder: '我爱云的账号',\n    },\n    required: true,\n  })\n  username = '';\n  @AccessInput({\n    title: '密码',\n    component: {\n      placeholder: '我爱云的密码',\n    },\n    required: true,\n    encrypt: true,\n  })\n  password = '';\n}\n\nnew WoaiAccess();\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-woai/index.ts",
    "content": "export * from './plugins/index.js';\nexport * from './access.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-woai/plugins/index.ts",
    "content": "export * from './plugin-deploy-to-cdn.js';\n"
  },
  {
    "path": "packages/ui/certd-server/src/plugins/plugin-woai/plugins/plugin-deploy-to-cdn.ts",
    "content": "import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';\nimport { CertInfo } from '@certd/plugin-cert';\nimport { WoaiAccess } from '../access.js';\nimport { CertApplyPluginNames} from '@certd/plugin-cert';\n@IsTaskPlugin({\n  name: 'WoaiCDN',\n  title: '我爱云-部署证书到我爱云CDN',\n  desc: '部署证书到我爱云CDN',\n  icon: 'clarity:plugin-line',\n  group: pluginGroups.cdn.key,\n  default: {\n    strategy: {\n      runStrategy: RunStrategy.SkipWhenSucceed,\n    },\n  },\n})\nexport class WoaiCdnPlugin extends AbstractTaskPlugin {\n  @TaskInput({\n    title: '接口地址(可留空)',\n    helper: '请填写我爱云的地址, 默认为 [API](https://console.edeg.sxhjgy.cn) 末尾请不要携带`/`',\n    component: { name: 'a-input' },\n    required: false,\n  })\n  baseApi?: string;\n  @TaskInput({\n    title: '证书ID',\n    helper: '请填写 [证书列表](https://console.edge.sxhjgy.cn/site/certificate) 中的证书的ID',\n    component: { name: 'a-input' },\n    required: true,\n  })\n  certId!: string;\n  @TaskInput({\n    title: '域名证书',\n    helper: '请选择前置任务输出的域名证书',\n    component: {\n      name: 'output-selector',\n      from: [...CertApplyPluginNames],\n    },\n    required: true,\n  })\n  cert!: CertInfo;\n  @TaskInput({\n    title: 'Access授权',\n    helper: '我爱云的用户、密码授权',\n    component: {\n      name: 'access-selector',\n      type: 'woai',\n    },\n    required: true,\n  })\n  accessId!: string;\n\n  async onInstance() {}\n\n  private async doRequestApi(url: string, data: any = null, method = 'post', token: string | null = null) {\n    const headers = {\n      'Content-Type': 'application/json',\n      ...(token ? { Token: token } : {}),\n    };\n    const res = await this.http.request<any, any>({\n      url,\n      method,\n      data,\n      headers,\n    });\n    if (res.code !== 200) {\n      throw new Error(`${JSON.stringify(res.message)}`);\n    }\n    return res;\n  }\n\n  async execute(): Promise<void> {\n    const { baseApi, certId, cert, accessId } = this;\n    const access = (await this.getAccess(accessId)) as WoaiAccess;\n    // 使用默认值或用户输入的值\n    const apiBase = baseApi || 'https://console.edeg.sxhjgy.cn';\n    // 登录获取token\n    const loginResponse = await this.doRequestApi(`${apiBase}/account/login`, {\n      username: access.username,\n      password: access.password,\n    });\n    const token = loginResponse.data.token;\n    this.logger.info('登录成功,获取到Token:', token);\n    // 更新证书\n    const editCertResponse = await this.doRequestApi(\n      `${apiBase}/certificate/edit`,\n      {\n        id: certId,\n        cert: cert.crt,\n        key: cert.key,\n      },\n      'post',\n      token\n    );\n    this.logger.info('证书更新成功:', editCertResponse.message);\n  }\n}\n\nnew WoaiCdnPlugin();\n"
  },
  {
    "path": "packages/ui/certd-server/src/utils/env.ts",
    "content": "export { isDev } from '@certd/basic';\n"
  },
  {
    "path": "packages/ui/certd-server/src/utils/http.ts",
    "content": "import { utils } from '@certd/basic';\n\nexport async function request(config: any): Promise<any> {\n  try {\n    return await utils.http.request(config);\n  } catch (e) {\n    const data = e.data || e.response?.data;\n    if (data) {\n      throw new Error(data.message || data.msg || data.error || data);\n    }\n    if (e.statusText) {\n      throw new Error(`请求失败:${e.request?.url}  ${e.status}  ${e.statusText}`);\n    }\n    throw e;\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/src/utils/random.ts",
    "content": "const numbers = \"0123456789\";\nconst letters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nconst specials = \"~!@#$%^*()_+-=[]{}|;:,./<>?\";\n\n/**\n * Generate random string\n * @param {Number} length\n * @param {Object} options\n */\nfunction randomStr(length, options?) {\n  length || (length = 8);\n  options || (options = {});\n\n  let chars = \"\";\n  let result = \"\";\n\n  if (options === true) {\n    chars = numbers + letters;\n  } else if (typeof options === \"string\") {\n    chars = options;\n  } else {\n    if (options.numbers !== false) {\n      chars += typeof options.numbers === \"string\" ? options.numbers : numbers;\n    }\n\n    if (options.letters !== false) {\n      chars += typeof options.letters === \"string\" ? options.letters : letters;\n    }\n\n    if (options.specials) {\n      chars += typeof options.specials === \"string\" ? options.specials : specials;\n    }\n  }\n\n  while (length > 0) {\n    length--;\n    result += chars[Math.floor(Math.random() * chars.length)];\n  }\n  return result;\n}\n\nexport const RandomUtil = { randomStr };\n"
  },
  {
    "path": "packages/ui/certd-server/src/utils/version.ts",
    "content": "import { logger } from '@certd/basic';\nimport fs from 'fs';\n\nexport async function getVersion() {\n  try {\n    const pkg = await fs.promises.readFile('./package.json');\n    const pkgJson = JSON.parse(pkg.toString());\n    return pkgJson.version;\n  } catch (e) {\n    logger.error(e);\n    return 'unknown';\n  }\n}\n"
  },
  {
    "path": "packages/ui/certd-server/test/controller/api.test.ts",
    "content": "import { createHttpRequest } from '@midwayjs/mock';\nimport { Application } from '@midwayjs/koa';\nimport assert from 'assert';\nimport { getApp } from '../setup.js';\n\ndescribe('test/controller/home.test.ts', () => {\n  it('should POST /api/get_user', async function (this: any) {\n    const app: Application = getApp();\n    // make request\n    const result = await createHttpRequest(app).get('/api/get_user').query({ uid: 123 });\n\n    // use expect by jest\n    assert(result.status === 200);\n    assert(result.body.message === 'OK');\n  });\n});\n"
  },
  {
    "path": "packages/ui/certd-server/test/controller/home.test.ts",
    "content": "import { createHttpRequest } from '@midwayjs/mock';\nimport { Application } from '@midwayjs/koa';\nimport assert from 'assert';\nimport { getApp } from '../setup.js';\n\ndescribe('test/controller/home.test.ts', () => {\n\n  it('should GET /', async () => {\n    const app: Application = getApp();\n    // make request\n    const result = await createHttpRequest(app).get('/');\n\n    // use expect by jest\n    assert(result.status === 200);\n    assert(result.text === 'Hello Midwayjs!');\n  });\n\n});\n"
  },
  {
    "path": "packages/ui/certd-server/test/plugins/51dns.test.mjs",
    "content": "import CryptoJS from 'crypto-js'\n\nfunction aes(val) {\n  var k = CryptoJS.enc.Utf8.parse('1234567890abcDEF');\n  var iv = CryptoJS.enc.Utf8.parse('1234567890abcDEF');\n  const enc = CryptoJS.AES.encrypt(val, k, {\n    iv: iv,\n    mode: CryptoJS.mode.CBC,\n    padding: CryptoJS.pad.ZeroPadding\n  }).toString();\n  return enc;\n}\n\n\nimport axios from 'axios'\n\nconst instance = axios.create({\n  baseURL: 'https://www.51dns.com',\n  timeout: 5000,\n  withCredentials: true,\n  headers: {\n    'Content-Type': 'application/x-www-form-urlencoded'\n  }\n})\n\nasync function login() {\n\n  const res = await instance.request({\n    url: 'https://www.51dns.com/login.html',\n    method: 'get',\n    headers: {\n      // 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36',\n      'Origin': 'https://www.51dns.com',\n      'Referer': 'https://www.51dns.com',\n    }\n  })\n\n  //提取 var csrfToken = \"ieOfM21eDd9nWJv3OZtMJF6ogDsnPKQHJ17dlMck\";\n  const _token = res.data.match(/var csrfToken = \"(.*?)\"/)[1]\n  console.log(_token)\n  console.log(res.headers)\n\n\n  const setCookie = res.headers['set-cookie']\n  const cookie = setCookie.map(item => {\n    return item.split(';')[0]\n  }).join(';')\n\n\n  var obj = {\n    'email_or_phone': aes(\"\"),\n    'password': aes(\"\"),\n    'type': aes('account'),\n    'redirectTo': 'https://www.51dns.com/domain',\n    '_token': _token\n  }\n  console.log(JSON.stringify(obj, null, 2))\n  const res2 = await instance.request({\n    url: 'https://www.51dns.com/login',\n    method: 'post',\n    data: {\n      ...obj\n    },\n    headers: {\n      /**\n       * Origin:\n       * https://www.51dns.com\n       * Referer:\n       * https://www.51dns.com/login.html\n       * User-Agent:\n       * Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36\n       // __root_domain_v=.51dns.com;\n       */\n\n      // 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36',\n      'Origin': 'https://www.51dns.com',\n      'Referer': 'https://www.51dns.com/login.html',\n      'Content-Type': 'application/x-www-form-urlencoded',\n      'Cookie': cookie,\n      //X-Requested-With:\n      // XMLHttpRequest\n      'X-Requested-With': 'XMLHttpRequest'\n    }\n  })\n\n  console.log(res2.headers)\n  if (res2.data.code == 0) {\n    console.log(\"登录成功\")\n  }\n\n  const setCookie2 = res2.headers['set-cookie']\n  const cookie2 = setCookie2.map(item => {\n    return item.split(';')[0]\n  }).join(';')\n\n  //\n  // // console.log(res2.data)\n  // // 提取 <span class=\"user_email\">182****43522</span><br>\n  // console.log(res2.data.match(/<span class=\"user_email\">(.*?)<\\/span>/)[1])\n  // const success1 = res2.data.includes('<span class=\"nav-title\">DNS解析</span>')\n  // console.log(\"success\", success1)\n\n\n  const res3 = await instance.request({\n    url: 'https://www.51dns.com/domain',\n    method: 'get',\n    withCredentials: true,\n    headers: {\n      // 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36',\n      'Origin': 'https://www.51dns.com',\n      'Referer': 'https://www.51dns.com/login.html',\n      'Cookie': cookie2,\n    }\n  })\n\n  console.log(res3.statusText)\n  console.log(res3.headers)\n  const success2 = res3.data.includes('<span class=\"nav-title\">DNS解析</span>')\n  console.log(\"success\", success2)\n\n\n  /**\n   * <a target=\"_blank\" href=\"https://www.51dns.com/domain/record/193341603\"\n   *                                        class=\"color47\">certd.top</a>\n\n   */\n    //上面文本中间有换行，需要提取 193341603 部分,必须有certd.top,使用 new Regexp, .号要能匹配换行符，非贪婪模式\n  const regExp = new RegExp('<a target=\"_blank\" href=\"https://www.51dns.com/domain/record/(\\\\d+)\"[^>]*>certd\\\\.top<\\\\/a>',\"i\");\n\n  const domainId = res3.data.match(regExp)[1]\n\n\n  console.log(\"domainId\", domainId)\n}\n\nlogin()\n"
  },
  {
    "path": "packages/ui/certd-server/tools/lego/readme.md",
    "content": "lego workspace\n"
  },
  {
    "path": "packages/ui/certd-server/tsconfig.json",
    "content": "{\n  \"compileOnSave\": true,\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"module\": \"NodeNext\",\n    \"moduleResolution\": \"NodeNext\",\n    \"esModuleInterop\": true,\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n    \"inlineSourceMap\":true,\n    \"noImplicitThis\": true,\n    \"noUnusedLocals\": true,\n    \"stripInternal\": true,\n    \"skipLibCheck\": true,\n    \"pretty\": true,\n    \"declaration\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"typeRoots\": [ \"./typings\", \"./node_modules/@types\"],\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"preserveWatchOutput\": true\n  },\n  \"exclude\": [\n    \"*.js\",\n    \"*.ts\",\n    \"dist\",\n    \"node_modules\",\n    \"test\"\n  ]\n}\n"
  },
  {
    "path": "packages/ui/docker-compose.yaml",
    "content": "version: '3.3' # 指定docker-compose 版本\nservices: # 要拉起的服务们\n  certd:\n    build:\n      context: ./\n      dockerfile: Dockerfile\n    image: registry.cn-shenzhen.aliyuncs.com/handsfree/certd:${TAG}\n    container_name: certd # 容器名\n    restart: unless-stopped # 重启\n    ports: # 端口映射\n      - \"7001:7001\"\n    environment:\n      - TZ=Asia/Shanghai\n\n"
  },
  {
    "path": "pnpm-workspace.yaml",
    "content": "packages:\n  - 'packages/**'  # <--------------开发插件请注释掉这一行，PR时本修改不要提交\n  - 'packages/ui/**'\n  - '!**/test/**'\n\n"
  },
  {
    "path": "publish-check.js",
    "content": "\nimport fs from 'fs'\nimport childProcess from 'child_process';\nfunction check(){\n    const gitAdd =  fs.readFileSync(\"./node_modules/@lerna-lite/version/dist/lib/git-add.js\",\"utf-8\")\n    if(gitAdd.indexOf(\"('git', ['add', '.']\") > -1){\n        console.log(\"git-add 已经修改过了\")\n    }else{\n        console.error(\"git-add 没有修改过\")\n        throw new Error(\"git-add 还没修改过\")\n    }\n\n    //GH_TOKEN\n    console.log(\"检查 GH_TOKEN\")\n    if(!process.env.GH_TOKEN){\n        // setx  /M GH_TOKEN xxxxx\n        console.error(\"GH_TOKEN 未设置\")\n        throw new Error(\"GH_TOKEN 未设置\")\n    }\n}\n\ncheck()\n"
  },
  {
    "path": "start.sh",
    "content": "#\nset -e\n\necho \"即将删除packages下除ui之外的其他目录，按y确认（如果您没有修改过源码，按y即可）\"\nread -p \"y/n: \" confirm\nif [ $confirm != \"y\" ]; then\n  echo \"取消操作\"\n  exit 1\nfi\n\nfind ./packages -mindepth 1 -maxdepth 1 -type d ! -name 'ui' -exec rm -rf {} +\necho \"删除成功\"\n\n# 检查输入是否正确 循环输入\nwhile true; do\n  echo \"是否后台运行(第一次运行建议选择n，调试没有问题之后，重新运行，选择y)\"\n  read -p \"y/n: \" confirmNohup\n  # 校验输入是否正确\n  if [ $confirmNohup != \"y\" ] && [ $confirmNohup != \"n\" ]; then\n    echo \"输入错误\"\n  else\n    break\n  fi\ndone\n\n\necho \"安装pnpm, 前提是已经安装了nodejs\"\nnpm install -g pnpm --registry https://registry.npmmirror.com\necho \"安装依赖\"\npnpm install --registry https://registry.npmmirror.com\n\necho \"开始构建\"\necho \"构建certd-client\"\nexport NODE_OPTIONS=--max-old-space-size=32768\ncd packages/ui/certd-client\nnpm run build\ncp -r dist/* ../certd-server/public\n\necho \"构建certd-server\"\ncd ../certd-server\nnpm run build\necho \"构建完成\"\necho \"启动服务\"\n\n# 前台运行\nif [ $confirmNohup != \"y\" ]; then\n  echo \"当前运行模式为前台运行，ctrl+c或者关闭ssh将会停止运行\"\n  npm run start\nelse\n  echo \"当前运行模式为后台运行，可以通过tail -f ./certd.log 命令查看日志\"\n  nohup npm run start > certd.log &\nfi\n\n\n"
  },
  {
    "path": "step.md",
    "content": "# Certd演示示例\n\n本示例演示从创建证书申请任务到自动部署证书全流程\n\n> 申请证书->部署证书->设置定时执行->设置邮件通知\n\n## 准备工作\n1. 已部署CertD服务（可官方Demo自助注册体验 https://certd.handfree.work/ ）\n2. 注册一个域名（支持阿里云万网、腾讯云DnsPod、华为云）\n3. 准备好以上DNS解析服务商的AccessKey 和 AccessSecret\n4. 证书要部署的目标（可选，单纯当成证书申请工具用也不错）\n \n\n## 自动化流水线创建\n\n### 1. 创建证书申请部署流水线\n![创建证书申请任务](packages/ui/certd-client/public/static/doc/images/1-add.png)\n\n需要添加域名的DNS解析服务商的授权\n![添加域名的DNS解析服务商的授权](packages/ui/certd-client/public/static/doc/images/2-access-provider.png)\n\n流水线创建成功\n\n### 2. 流水线详情界面\n\n![](packages/ui/certd-client/public/static/doc/images/5-view.png)\n\n到这一步申请证书就已经配置完成了。 \n点击手动触发，就可以申请证书了。\n\n接下来演示如何添加部署任务\n\n### 3. 添加部署到阿里云CDN任务\n点击添加任务\n![](packages/ui/certd-client/public/static/doc/images/6-1-add-task.png)\n\n选择任务类型\n![](packages/ui/certd-client/public/static/doc/images/6-2-add-task.png)\n\n填写任务参数\n![](packages/ui/certd-client/public/static/doc/images/6-3-add-task.png)\n\n点击确定，部署到CDN任务配置成功\n\n### 4. 添加部署到服务器主机任务\n点击新任务，弹出添加任务界面\n![](packages/ui/certd-client/public/static/doc/images/7-1-add-host-task.png)\n先选择上传到主机任务\n\n填写任务参数，比如证书保存路径\n![](packages/ui/certd-client/public/static/doc/images/7-2-add-host-task.png)\n\n需要添加主机ip、用户名、密码，只需添加一次，后续其他任务可以复用\n![](packages/ui/certd-client/public/static/doc/images/7-3-add-host-task.png)\n\n然后添加第二个任务，执行主机命令，部署证书\n![](packages/ui/certd-client/public/static/doc/images/8-1-add-host-task.png)\n\n选择执行脚本命令任务\n![](packages/ui/certd-client/public/static/doc/images/8-2-add-host-task.png)\n\n编写脚本，选择之前添加的主机\n![](packages/ui/certd-client/public/static/doc/images/8-4-add-host-task.png)\n\n点击确定，部署到主机任务配置成功\n![](packages/ui/certd-client/public/static/doc/images/8-5-add-host-task.png)\n\n### 5. 手动触发执行任务，测试一下\n![](packages/ui/certd-client/public/static/doc/images/9-start.png)\n\n点击任务可以查看状态和日志\n![](packages/ui/certd-client/public/static/doc/images/10-1-log.png)\n\n这里执行失败，可以查看错误日志\n![](packages/ui/certd-client/public/static/doc/images/11-1-error.png)\n![](packages/ui/certd-client/public/static/doc/images/11-2-error.png)\n\n修改正确后，重新执行\n![](packages/ui/certd-client/public/static/doc/images/12-1-log-success.png)\n可以看到前面执行过的就会跳过，不会重复执行\n![](packages/ui/certd-client/public/static/doc/images/12-2-skip-log.png)\n\n### 6. 查看证书部署效果\n可以看到证书已经部署到CDN成功\n![](packages/ui/certd-client/public/static/doc/images/13-1-result.png)\n![](packages/ui/certd-client/public/static/doc/images/13-2-result.png)\n也可以手动下载证书\n![](packages/ui/certd-client/public/static/doc/images/13-3-download.png)\n\n### 7. 定时触发\n配置定时触发，以后每天定时执行    \ncron格式，例如： `0 0 3 * * *` 表示每天凌晨3点执行     \n到期前35天会自动申请新证书并部署，没到期前不会重复申请    \n![](packages/ui/certd-client/public/static/doc/images/14-timer.png)\n\n### 8. 邮件通知\n可以接收邮件通知（支持时机：开始、成功、失败、失败转成功）\n![](packages/ui/certd-client/public/static/doc/images/15-1-email.png)\n需要配置邮件服务器\n![](packages/ui/certd-client/public/static/doc/images/15-2-email.png)\n\n\n\n\n以上，演示了从创建证书申请任务到自动部署证书全流程。   \n\n如有任何疑问，[欢迎联系我们](https://certd.docmirror.cn/guide/contact/)\n\n"
  },
  {
    "path": "test/docker/Dockerfile",
    "content": "FROM node:20-alpine\nRUN apk add --no-cache openssl\nWORKDIR /app/\n"
  },
  {
    "path": "test/docker/docker-compose.yaml",
    "content": "version: '3.3' # 指定docker-compose 版本\nservices: # 要拉起的服务们\n  certdtest:\n    build:\n      context: ./\n      dockerfile: Dockerfile\n    image: certd-test:1\n    container_name: certdtest # 容器名\n    volumes:\n      - ./data:/app/data\n    command: [\"tail\", \"-f\", \"/dev/null\"]\n    environment:\n      - TZ=Asia/Shanghai\n\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compileOnSave\": true,\n  \"compilerOptions\": {\n    // 这样就可以对 `this` 上的数据属性进行更严格的推断`\n    \"noImplicitAny\": true,\n    \"allowJs\": true,\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"strict\": true,\n    \"importHelpers\": true,\n    \"moduleResolution\": \"node\",\n    \"experimentalDecorators\": true,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strictNullChecks\" :false,\n    \"inlineSourceMap\": true,\n    \"baseUrl\": \".\",\n    \"outDir\": \"dist\",\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"src/**/*.tsx\",\n    \"src/**/*.vue\",\n    \"tests/**/*.ts\",\n    \"tests/**/*.tsx\"\n  ],\n  \"exclude\": [\n    \"node_modules\",\n    \"vite.config.ts\"\n  ]\n}\n"
  }
]